[PATCH v2 xserver 06/11] dri2: refine dri2_probe_driver_name
Qiang Yu
Qiang.Yu at amd.com
Sat Jan 7 08:01:27 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