[PATCH libdrm 1/2] xf86drm: fallback to MODALIAS for OF less platform devices
Emil Velikov
emil.l.velikov at gmail.com
Wed Jan 23 10:45:17 UTC 2019
From: Emil Velikov <emil.velikov at collabora.com>
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 at collabora.com>
---
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;
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
More information about the dri-devel
mailing list