ANDROID: xf86drm: fix subsystem type lookup for virtio mmio-based devices
Currently the code assumes that a virtio based device is always located
on the PCI bus.
Modify the parser to make it check the device's parent directory to
determine on which bus it is located.
Output for virtio-pci is the PCI bus.
Output for virtio-mmio is the Platform bus.
Bug: 148313094
Signed-off-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com>
Signed-off-by: Mikhail Golubev <Mikhail.Golubev@opensynergy.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
Link: https://patchwork.kernel.org/patch/11357593/
Change-Id: I1bd5ae4b72bef6beef562b70c99f3588477dec64
Merged-In: I1bd5ae4b72bef6beef562b70c99f3588477dec64
diff --git a/xf86drm.c b/xf86drm.c
index 670a5b9..155c5a8 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -3039,10 +3039,20 @@
{
#ifdef __linux__
char path[PATH_MAX + 1] = "";
+ char real_path[PATH_MAX + 1] = "";
+ int subsystem_type;
- snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device", maj, min);
+ snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min);
+ if (!realpath(path, real_path))
+ return -errno;
+ snprintf(path, sizeof(path), "%s", real_path);
- return get_subsystem_type(path);
+ subsystem_type = get_subsystem_type(path);
+ if (subsystem_type == DRM_BUS_VIRTIO) {
+ strncat(path, "/..", PATH_MAX);
+ subsystem_type = get_subsystem_type(path);
+ }
+ return subsystem_type;
#elif defined(__OpenBSD__) || defined(__DragonFly__)
return DRM_BUS_PCI;
#else
@@ -3744,7 +3754,6 @@
switch (subsystem_type) {
case DRM_BUS_PCI:
- case DRM_BUS_VIRTIO:
return drmProcessPciDevice(device, node, node_type, maj, min,
fetch_deviceinfo, flags);
case DRM_BUS_USB: