diff options
author | Qiang Yu <Qiang.Yu@amd.com> | 2017-01-11 13:59:22 +0800 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2017-01-25 15:13:33 -0500 |
commit | 7617a0a180a2cd3427a8ffa9534152df6a8fecbf (patch) | |
tree | 5d80cc1323df3460627938f5313c983894e9e6f0 /hw | |
parent | b1a6986395f85b0194646a34b49367086dc9239d (diff) |
dri2: refine dri2_probe_driver_name (v2)
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@amd.com>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/xfree86/dri2/dri2.c | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c index 2165603d9..f9f9859e1 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 |