[PATCH 2/4] dri2: Automatically fill in the driver name if the DDX doesn't provide it.
Mark Marshall
markmarshall14 at gmail.com
Fri Oct 10 03:54:09 PDT 2014
Just a minor thing
On 10 October 2014 11:09, Eric Anholt <eric at anholt.net> wrote:
> This will be used by the modesetting driver to support DRI2 across all
> hardware that can support glamor, and could potentially be used by
> other drivers that have to support DRI2 on sets of hardware with
> multiple Mesa drivers.
>
> This logic is the same as what's present in the Mesa driver loader,
> except for the lack of nouveau_vieux support (which requires a
> predicate on the device).
>
> Signed-off-by: Eric Anholt <eric at anholt.net>
> ---
> hw/xfree86/dri2/dri2.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 61 insertions(+)
>
> diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
> index 6459f11..5780b90 100644
> --- a/hw/xfree86/dri2/dri2.c
> +++ b/hw/xfree86/dri2/dri2.c
> @@ -1410,6 +1410,59 @@ get_prime_id(void)
> return -1;
> }
>
> +#include "pci_ids/pci_id_driver_map.h"
> +
> +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);
> +
> + /* 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) {
> + drmVersionPtr version = drmGetVersion(info->fd);
> + char *kernel_driver;
> +
> + if (!version) {
> + xf86DrvMsg(pScreen->myNum, X_ERROR,
> + "[DRI2] Couldn't drmGetVersion() on non-PCI device, "
> + "no driver name found.\n");
> + return NULL;
> + }
> +
> + kernel_driver = strndup(version->name, version->name_len);
> + drmFreeVersion(version);
> + return kernel_driver;
> + }
> +
> + for (i = 0; driver_map[i].driver; i++) {
> + if (pdev->vendor_id != driver_map[i].vendor_id)
> + continue;
> +
> + if (driver_map[i].num_chips_ids == -1)
> + return strdup(driver_map[i].driver);
> +
> + 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);
> + }
> + }
> +
> + 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;
> +}
> +
> Bool
> DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
> {
> @@ -1525,6 +1578,14 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
> if (!ds->driverNames)
> goto err_out;
> ds->driverNames[0] = info->driverName;
I assume that you'd want to drop the line above, as it done again in
the added lines below?
> +
> + if (info->driverName) {
> + ds->driverNames[0] = info->driverName;
> + } else {
> + ds->driverNames[0] = dri2_probe_driver_name(pScreen, info);
> + if (!ds->driverNames[0])
> + return FALSE;
> + }
> }
> else {
> ds->numDrivers = info->numDrivers;
> --
> 2.1.1
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
Regards,
Mark Marshall
More information about the xorg-devel
mailing list