Message ID | 20190123104518.7332-2-emil.l.velikov@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [libdrm,1/2] xf86drm: fallback to MODALIAS for OF less platform devices | expand |
On Wednesday, 2019-01-23 10:45:18 +0000, Emil Velikov wrote: > From: Emil Velikov <emil.velikov@collabora.com> > > The functions are virtually identical, fold them up. > > Signed-off-by: Emil Velikov <emil.velikov@collabora.com> Assuming patch 1 is OK, and `foo` gets renamed to something better: Reviewed-by: Eric Engestrom <eric.engestrom@intel.com> I don't know enough to review patch 1 though. > --- > xf86drm.c | 98 +++++++++---------------------------------------------- > 1 file changed, 15 insertions(+), 83 deletions(-) > > diff --git a/xf86drm.c b/xf86drm.c > index 374734eb..18c9693a 100644 > --- a/xf86drm.c > +++ b/xf86drm.c > @@ -3508,7 +3508,7 @@ free_device: > return ret; > } > > -static int drmParsePlatformBusInfo(int maj, int min, drmPlatformBusInfoPtr info) > +static int drmParseOFBusInfo(int maj, int min, char *fullname) > { > #ifdef __linux__ > char path[PATH_MAX + 1], *name, *foo; > @@ -3532,19 +3532,18 @@ static int drmParsePlatformBusInfo(int maj, int min, drmPlatformBusInfoPtr info) > foo++; > } > > - strncpy(info->fullname, foo, DRM_PLATFORM_DEVICE_NAME_LEN); > - info->fullname[DRM_PLATFORM_DEVICE_NAME_LEN - 1] = '\0'; > + strncpy(fullname, foo, DRM_PLATFORM_DEVICE_NAME_LEN); > + fullname[DRM_PLATFORM_DEVICE_NAME_LEN - 1] = '\0'; > free(name); > > return 0; > #else > -#warning "Missing implementation of drmParsePlatformBusInfo" > +#warning "Missing implementation of drmParseOFBusInfo" > return -EINVAL; > #endif > } > > -static int drmParsePlatformDeviceInfo(int maj, int min, > - drmPlatformDeviceInfoPtr info) > +static int drmParseOFDeviceInfo(int maj, int min, char ***compatible) > { > #ifdef __linux__ > char path[PATH_MAX + 1], *value, *foo; > @@ -3562,8 +3561,8 @@ static int drmParsePlatformDeviceInfo(int maj, int min, > count = 1; > } > > - info->compatible = calloc(count + 1, sizeof(*info->compatible)); > - if (!info->compatible) > + *compatible = calloc(count + 1, sizeof(char *)); > + if (!*compatible) > return -ENOMEM; > > for (i = 0; i < count; i++) { > @@ -3587,19 +3586,19 @@ static int drmParsePlatformDeviceInfo(int maj, int min, > free(value); > } > > - info->compatible[i] = foo; > + *compatible[i] = foo; > } > > return 0; > > free: > while (i--) > - free(info->compatible[i]); > + free(*compatible[i]); > > - free(info->compatible); > + free(*compatible); > return err; > #else > -#warning "Missing implementation of drmParsePlatformDeviceInfo" > +#warning "Missing implementation of drmParseOFDeviceInfo" > return -EINVAL; > #endif > } > @@ -3622,7 +3621,7 @@ static int drmProcessPlatformDevice(drmDevicePtr *device, > > dev->businfo.platform = (drmPlatformBusInfoPtr)ptr; > > - ret = drmParsePlatformBusInfo(maj, min, dev->businfo.platform); > + ret = drmParseOFBusInfo(maj, min, dev->businfo.platform->fullname); > if (ret < 0) > goto free_device; > > @@ -3630,7 +3629,7 @@ static int drmProcessPlatformDevice(drmDevicePtr *device, > ptr += sizeof(drmPlatformBusInfo); > dev->deviceinfo.platform = (drmPlatformDeviceInfoPtr)ptr; > > - ret = drmParsePlatformDeviceInfo(maj, min, dev->deviceinfo.platform); > + ret = drmParseOFDeviceInfo(maj, min, &dev->deviceinfo.platform->compatible); > if (ret < 0) > goto free_device; > } > @@ -3644,73 +3643,6 @@ free_device: > return ret; > } > > -static int drmParseHost1xBusInfo(int maj, int min, drmHost1xBusInfoPtr info) > -{ > -#ifdef __linux__ > - char path[PATH_MAX + 1], *name; > - > - snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min); > - > - name = sysfs_uevent_get(path, "OF_FULLNAME"); > - if (!name) > - return -ENOENT; > - > - strncpy(info->fullname, name, DRM_HOST1X_DEVICE_NAME_LEN); > - info->fullname[DRM_HOST1X_DEVICE_NAME_LEN - 1] = '\0'; > - free(name); > - > - return 0; > -#else > -#warning "Missing implementation of drmParseHost1xBusInfo" > - return -EINVAL; > -#endif > -} > - > -static int drmParseHost1xDeviceInfo(int maj, int min, > - drmHost1xDeviceInfoPtr info) > -{ > -#ifdef __linux__ > - char path[PATH_MAX + 1], *value; > - unsigned int count, i; > - int err; > - > - snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min); > - > - value = sysfs_uevent_get(path, "OF_COMPATIBLE_N"); > - if (!value) > - return -ENOENT; > - > - sscanf(value, "%u", &count); > - free(value); > - > - info->compatible = calloc(count + 1, sizeof(*info->compatible)); > - if (!info->compatible) > - return -ENOMEM; > - > - for (i = 0; i < count; i++) { > - value = sysfs_uevent_get(path, "OF_COMPATIBLE_%u", i); > - if (!value) { > - err = -ENOENT; > - goto free; > - } > - > - info->compatible[i] = value; > - } > - > - return 0; > - > -free: > - while (i--) > - free(info->compatible[i]); > - > - free(info->compatible); > - return err; > -#else > -#warning "Missing implementation of drmParseHost1xDeviceInfo" > - return -EINVAL; > -#endif > -} > - > static int drmProcessHost1xDevice(drmDevicePtr *device, > const char *node, int node_type, > int maj, int min, bool fetch_deviceinfo, > @@ -3729,7 +3661,7 @@ static int drmProcessHost1xDevice(drmDevicePtr *device, > > dev->businfo.host1x = (drmHost1xBusInfoPtr)ptr; > > - ret = drmParseHost1xBusInfo(maj, min, dev->businfo.host1x); > + ret = drmParseOFBusInfo(maj, min, dev->businfo.host1x->fullname); > if (ret < 0) > goto free_device; > > @@ -3737,7 +3669,7 @@ static int drmProcessHost1xDevice(drmDevicePtr *device, > ptr += sizeof(drmHost1xBusInfo); > dev->deviceinfo.host1x = (drmHost1xDeviceInfoPtr)ptr; > > - ret = drmParseHost1xDeviceInfo(maj, min, dev->deviceinfo.host1x); > + ret = drmParseOFDeviceInfo(maj, min, &dev->deviceinfo.host1x->compatible); > if (ret < 0) > goto free_device; > } > -- > 2.20.1 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff --git a/xf86drm.c b/xf86drm.c index 374734eb..18c9693a 100644 --- a/xf86drm.c +++ b/xf86drm.c @@ -3508,7 +3508,7 @@ free_device: return ret; } -static int drmParsePlatformBusInfo(int maj, int min, drmPlatformBusInfoPtr info) +static int drmParseOFBusInfo(int maj, int min, char *fullname) { #ifdef __linux__ char path[PATH_MAX + 1], *name, *foo; @@ -3532,19 +3532,18 @@ static int drmParsePlatformBusInfo(int maj, int min, drmPlatformBusInfoPtr info) foo++; } - strncpy(info->fullname, foo, DRM_PLATFORM_DEVICE_NAME_LEN); - info->fullname[DRM_PLATFORM_DEVICE_NAME_LEN - 1] = '\0'; + strncpy(fullname, foo, DRM_PLATFORM_DEVICE_NAME_LEN); + fullname[DRM_PLATFORM_DEVICE_NAME_LEN - 1] = '\0'; free(name); return 0; #else -#warning "Missing implementation of drmParsePlatformBusInfo" +#warning "Missing implementation of drmParseOFBusInfo" return -EINVAL; #endif } -static int drmParsePlatformDeviceInfo(int maj, int min, - drmPlatformDeviceInfoPtr info) +static int drmParseOFDeviceInfo(int maj, int min, char ***compatible) { #ifdef __linux__ char path[PATH_MAX + 1], *value, *foo; @@ -3562,8 +3561,8 @@ static int drmParsePlatformDeviceInfo(int maj, int min, count = 1; } - info->compatible = calloc(count + 1, sizeof(*info->compatible)); - if (!info->compatible) + *compatible = calloc(count + 1, sizeof(char *)); + if (!*compatible) return -ENOMEM; for (i = 0; i < count; i++) { @@ -3587,19 +3586,19 @@ static int drmParsePlatformDeviceInfo(int maj, int min, free(value); } - info->compatible[i] = foo; + *compatible[i] = foo; } return 0; free: while (i--) - free(info->compatible[i]); + free(*compatible[i]); - free(info->compatible); + free(*compatible); return err; #else -#warning "Missing implementation of drmParsePlatformDeviceInfo" +#warning "Missing implementation of drmParseOFDeviceInfo" return -EINVAL; #endif } @@ -3622,7 +3621,7 @@ static int drmProcessPlatformDevice(drmDevicePtr *device, dev->businfo.platform = (drmPlatformBusInfoPtr)ptr; - ret = drmParsePlatformBusInfo(maj, min, dev->businfo.platform); + ret = drmParseOFBusInfo(maj, min, dev->businfo.platform->fullname); if (ret < 0) goto free_device; @@ -3630,7 +3629,7 @@ static int drmProcessPlatformDevice(drmDevicePtr *device, ptr += sizeof(drmPlatformBusInfo); dev->deviceinfo.platform = (drmPlatformDeviceInfoPtr)ptr; - ret = drmParsePlatformDeviceInfo(maj, min, dev->deviceinfo.platform); + ret = drmParseOFDeviceInfo(maj, min, &dev->deviceinfo.platform->compatible); if (ret < 0) goto free_device; } @@ -3644,73 +3643,6 @@ free_device: return ret; } -static int drmParseHost1xBusInfo(int maj, int min, drmHost1xBusInfoPtr info) -{ -#ifdef __linux__ - char path[PATH_MAX + 1], *name; - - snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min); - - name = sysfs_uevent_get(path, "OF_FULLNAME"); - if (!name) - return -ENOENT; - - strncpy(info->fullname, name, DRM_HOST1X_DEVICE_NAME_LEN); - info->fullname[DRM_HOST1X_DEVICE_NAME_LEN - 1] = '\0'; - free(name); - - return 0; -#else -#warning "Missing implementation of drmParseHost1xBusInfo" - return -EINVAL; -#endif -} - -static int drmParseHost1xDeviceInfo(int maj, int min, - drmHost1xDeviceInfoPtr info) -{ -#ifdef __linux__ - char path[PATH_MAX + 1], *value; - unsigned int count, i; - int err; - - snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min); - - value = sysfs_uevent_get(path, "OF_COMPATIBLE_N"); - if (!value) - return -ENOENT; - - sscanf(value, "%u", &count); - free(value); - - info->compatible = calloc(count + 1, sizeof(*info->compatible)); - if (!info->compatible) - return -ENOMEM; - - for (i = 0; i < count; i++) { - value = sysfs_uevent_get(path, "OF_COMPATIBLE_%u", i); - if (!value) { - err = -ENOENT; - goto free; - } - - info->compatible[i] = value; - } - - return 0; - -free: - while (i--) - free(info->compatible[i]); - - free(info->compatible); - return err; -#else -#warning "Missing implementation of drmParseHost1xDeviceInfo" - return -EINVAL; -#endif -} - static int drmProcessHost1xDevice(drmDevicePtr *device, const char *node, int node_type, int maj, int min, bool fetch_deviceinfo, @@ -3729,7 +3661,7 @@ static int drmProcessHost1xDevice(drmDevicePtr *device, dev->businfo.host1x = (drmHost1xBusInfoPtr)ptr; - ret = drmParseHost1xBusInfo(maj, min, dev->businfo.host1x); + ret = drmParseOFBusInfo(maj, min, dev->businfo.host1x->fullname); if (ret < 0) goto free_device; @@ -3737,7 +3669,7 @@ static int drmProcessHost1xDevice(drmDevicePtr *device, ptr += sizeof(drmHost1xBusInfo); dev->deviceinfo.host1x = (drmHost1xDeviceInfoPtr)ptr; - ret = drmParseHost1xDeviceInfo(maj, min, dev->deviceinfo.host1x); + ret = drmParseOFDeviceInfo(maj, min, &dev->deviceinfo.host1x->compatible); if (ret < 0) goto free_device; }