[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