On Wednesday, 2019-01-23 10:45:17 +0000, Emil Velikov wrote: > From: Emil Velikov <emil.velikov@xxxxxxxxxxxxx> > > Some devices can lack OF data or it may not be available in the uevent > file. Fallback to the MODALIAS data in those cases. > > We strip any leading "MODALIAS=.*:" thus the resulting information is > compatible with existing code in Mesa. > > Signed-off-by: Emil Velikov <emil.velikov@xxxxxxxxxxxxx> > --- > xf86drm.c | 55 ++++++++++++++++++++++++++++++++++++++++++------------- > 1 file changed, 42 insertions(+), 13 deletions(-) > > diff --git a/xf86drm.c b/xf86drm.c > index 10df682b..374734eb 100644 > --- a/xf86drm.c > +++ b/xf86drm.c > @@ -3511,15 +3511,28 @@ free_device: > static int drmParsePlatformBusInfo(int maj, int min, drmPlatformBusInfoPtr info) > { > #ifdef __linux__ > - char path[PATH_MAX + 1], *name; > + char path[PATH_MAX + 1], *name, *foo; I assume you didn't mean to send this patch yet? :P > > snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min); > > name = sysfs_uevent_get(path, "OF_FULLNAME"); > - if (!name) > - return -ENOENT; > + foo = name; > + if (!name) { > + /* If the device lacks OF data, pick the MODALIAS info */ > + name = sysfs_uevent_get(path, "MODALIAS"); > + if (!name) > + return -ENOENT; > + > + /* .. and strip the MODALIAS=[platform,usb...]: part. */ > + foo = strrchr(name, ':'); > + if (!foo) { > + free(name); > + return -ENOENT; > + } > + foo++; > + } > > - strncpy(info->fullname, name, DRM_PLATFORM_DEVICE_NAME_LEN); > + strncpy(info->fullname, foo, DRM_PLATFORM_DEVICE_NAME_LEN); > info->fullname[DRM_PLATFORM_DEVICE_NAME_LEN - 1] = '\0'; > free(name); > > @@ -3534,18 +3547,20 @@ static int drmParsePlatformDeviceInfo(int maj, int min, > drmPlatformDeviceInfoPtr info) > { > #ifdef __linux__ > - char path[PATH_MAX + 1], *value; > + char path[PATH_MAX + 1], *value, *foo; > 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); > + if (value) { > + sscanf(value, "%u", &count); > + free(value); > + } else { > + /* Assume one entry if the device lack OF data */ > + count = 1; > + } > > info->compatible = calloc(count + 1, sizeof(*info->compatible)); > if (!info->compatible) > @@ -3553,12 +3568,26 @@ static int drmParsePlatformDeviceInfo(int maj, int min, > > for (i = 0; i < count; i++) { > value = sysfs_uevent_get(path, "OF_COMPATIBLE_%u", i); > + foo = value; > if (!value) { > - err = -ENOENT; > - goto free; > + /* If the device lacks OF data, pick the MODALIAS info */ > + value = sysfs_uevent_get(path, "MODALIAS"); > + if (!value) { > + err = -ENOENT; > + goto free; > + } > + > + /* .. and strip the MODALIAS=[platform,usb...]: part. */ > + foo = strrchr(value, ':'); > + if (!foo) { > + free(value); > + return -ENOENT; > + } > + foo = strdup(foo + 1); > + free(value); > } > > - info->compatible[i] = value; > + info->compatible[i] = foo; > } > > return 0; > -- > 2.20.1 > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel