[PATCH xserver 06/10] dri2: refine dri2_probe_driver_name

Qiang Yu Qiang.Yu at amd.com
Fri Jan 6 14:25:28 UTC 2017


Get PCI information from info->fd with drmGetDevice instead of
assuming the info->fd is the first entity of scrn which is not
true for multi entities scrn.

Signed-off-by: Qiang Yu <Qiang.Yu at amd.com>
---
 hw/xfree86/dri2/dri2.c | 35 ++++++++++++++++++-----------------
 1 file changed, 18 insertions(+), 17 deletions(-)

diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 2165603..adc59a6 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -1440,21 +1440,16 @@ get_prime_id(void)
 static char *
 dri2_probe_driver_name(ScreenPtr pScreen, DRI2InfoPtr info)
 {
-    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
-    EntityInfoPtr pEnt = xf86GetEntityInfo(pScrn->entityList[0]);
-    struct pci_device *pdev = NULL;
     int i, j;
-
-    if (pEnt)
-        pdev = xf86GetPciInfoForEntity(pEnt->index);
+    char *driver = NULL;
+    drmDevicePtr dev;
 
     /* For non-PCI devices, just assume that the 3D driver is named
      * the same as the kernel driver.  This is currently true for vc4
      * and msm (freedreno).
      */
-    if (!pdev) {
+    if (drmGetDevice(info->fd, &dev)) {
         drmVersionPtr version = drmGetVersion(info->fd);
-        char *kernel_driver;
 
         if (!version) {
             xf86DrvMsg(pScreen->myNum, X_ERROR,
@@ -1463,29 +1458,35 @@ dri2_probe_driver_name(ScreenPtr pScreen, DRI2InfoPtr info)
             return NULL;
         }
 
-        kernel_driver = strndup(version->name, version->name_len);
+        driver = strndup(version->name, version->name_len);
         drmFreeVersion(version);
-        return kernel_driver;
+        return driver;
     }
 
     for (i = 0; driver_map[i].driver; i++) {
-        if (pdev->vendor_id != driver_map[i].vendor_id)
+        if (dev->deviceinfo.pci->vendor_id != driver_map[i].vendor_id)
             continue;
 
-        if (driver_map[i].num_chips_ids == -1)
-            return strdup(driver_map[i].driver);
+        if (driver_map[i].num_chips_ids == -1) {
+             driver = strdup(driver_map[i].driver);
+             goto out;
+        }
 
         for (j = 0; j < driver_map[i].num_chips_ids; j++) {
-            if (driver_map[i].chip_ids[j] == pdev->device_id)
-                return strdup(driver_map[i].driver);
+            if (driver_map[i].chip_ids[j] == dev->deviceinfo.pci->device_id) {
+                driver = strdup(driver_map[i].driver);
+                goto out;
+            }
         }
     }
 
     xf86DrvMsg(pScreen->myNum, X_ERROR,
                "[DRI2] No driver mapping found for PCI device "
                "0x%04x / 0x%04x\n",
-               pdev->vendor_id, pdev->device_id);
-    return NULL;
+               dev->deviceinfo.pci->vendor_id, dev->deviceinfo.pci->device_id);
+out:
+    drmFreeDevice(&dev);
+    return driver;
 }
 
 Bool
-- 
2.7.4



More information about the xorg-devel mailing list