[PATCH v2 xserver 3/4] dri2: refine dri2_probe_driver_name (v2)

Qiang Yu Qiang.Yu at amd.com
Wed Jan 11 05:59:22 UTC 2017


V2:
1. update comment
2. check bustype if PCI
3. configure add libdrm version check for drmGetDevice

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>
---
 configure.ac           |  7 ++++++-
 hw/xfree86/dri2/dri2.c | 43 ++++++++++++++++++++++++-------------------
 2 files changed, 30 insertions(+), 20 deletions(-)

diff --git a/configure.ac b/configure.ac
index 93c81a6..a2de471 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1340,7 +1340,12 @@ AM_CONDITIONAL(DRI3, test "x$DRI3" = xyes)
 if test "x$DRI" = xyes || test "x$DRI2" = xyes || test "x$DRI3" = xyes || test "x$CONFIG_UDEV_KMS" = xyes; then
 	if test "x$DRM" = xyes; then
 		AC_DEFINE(WITH_LIBDRM, 1, [Building with libdrm support])
-		PKG_CHECK_MODULES([LIBDRM], $LIBDRM)
+		if test "x$DRI2" = xyes; then
+			dnl 2.4.65 is required for drmGetDevice
+			PKG_CHECK_MODULES([LIBDRM], libdrm >= 2.4.65)
+		else
+			PKG_CHECK_MODULES([LIBDRM], $LIBDRM)
+		fi
 	fi
 fi
 
diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 2165603..f9f9859 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -1440,21 +1440,17 @@ 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;
+#ifdef WITH_LIBDRM
     int i, j;
+    char *driver = NULL;
+    drmDevicePtr dev;
 
-    if (pEnt)
-        pdev = xf86GetPciInfoForEntity(pEnt->index);
-
-    /* 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).
+    /* For non-PCI devices and drmGetDevice fail, 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) || dev->bustype != DRM_BUS_PCI) {
         drmVersionPtr version = drmGetVersion(info->fd);
-        char *kernel_driver;
 
         if (!version) {
             xf86DrvMsg(pScreen->myNum, X_ERROR,
@@ -1463,29 +1459,38 @@ 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);
+               dev->deviceinfo.pci->vendor_id, dev->deviceinfo.pci->device_id);
+out:
+    drmFreeDevice(&dev);
+    return driver;
+#else
     return NULL;
+#endif
 }
 
 Bool
-- 
2.7.4



More information about the xorg-devel mailing list