[PATCH] [RFC] xf86: add glamor preferred probing

Hans de Goede hdegoede at redhat.com
Wed Sep 2 01:37:54 PDT 2015


Hi Dave,

On 02-09-15 06:57, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> This patch adds an interface to query and ask DDX if
> they would prefer to use modesetting/glamor for a particular
> hw configuration, and if so to fail probing on that hw,
> so that modesetting gets picked up.
>
> It adds a new driverFunc query to see if the driver supports
> glamor/modesetting preference, then passes a new flag to the
> platform probe asking for it, if the X server is configured
> to ask. It adds a new serverflag that can be disabled in xorg.conf.
>
> The only ugly bit is if we do platform probing and fail and the
> driver supports glamor preferences we don't do pci or old school
> probing as they have no nice flags parameter, and really we should
> be using platform probing anywhere this matters.
>
> I've written -intel support for this, but -ati and -nouveau support
> should be fairly easy. I'll send the intel patch just for reference.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>

Overall the code looks good to me, but I wonder do we really need
to ask the driver if it supports the new PLATFORM_PROBE_PREFER_GLAMOR
flag? I would expect drivers which do not support it to simple ignore
the (to them unknown) flag, and then we can avoid this whole
ask the driver go-around routine.

Regards,

Hans


> ---
>   hw/xfree86/common/xf86Bus.c         |  7 +++++++
>   hw/xfree86/common/xf86Config.c      | 14 ++++++++++++++
>   hw/xfree86/common/xf86Globals.c     |  1 +
>   hw/xfree86/common/xf86Privstr.h     |  1 +
>   hw/xfree86/common/xf86platformBus.c | 10 ++++++++--
>   hw/xfree86/common/xf86str.h         |  2 ++
>   6 files changed, 33 insertions(+), 2 deletions(-)
>
> diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
> index bd36fc5..6b80715 100644
> --- a/hw/xfree86/common/xf86Bus.c
> +++ b/hw/xfree86/common/xf86Bus.c
> @@ -83,6 +83,13 @@ xf86CallDriverProbe(DriverPtr drv, Bool detect_only)
>       }
>       if (ServerIsNotSeat0() && foundScreen)
>           return foundScreen;
> +
> +    /* if the driver supports glamor probing, then it shouldn't need to
> +       fallback to pci/default probing so don't bother */
> +    if (drv->driverFunc) {
> +        if (drv->driverFunc(NULL, SUPPORTS_GLAMOR_PREFERRED, NULL) && xf86Info.preferGlamor)
> +            return foundScreen;
> +    }
>   #endif
>
>   #ifdef XSERVER_LIBPCIACCESS
> diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
> index d2c3225..95d7571 100644
> --- a/hw/xfree86/common/xf86Config.c
> +++ b/hw/xfree86/common/xf86Config.c
> @@ -703,6 +703,7 @@ typedef enum {
>       FLAG_DRI2,
>       FLAG_USE_SIGIO,
>       FLAG_AUTO_ADD_GPU,
> +    FLAG_PREFER_GLAMOR,
>       FLAG_MAX_CLIENTS,
>   } FlagValues;
>
> @@ -765,6 +766,8 @@ static OptionInfoRec FlagOptions[] = {
>        {0}, FALSE},
>       {FLAG_MAX_CLIENTS, "MaxClients", OPTV_INTEGER,
>        {0}, FALSE },
> +    {FLAG_PREFER_GLAMOR, "PreferGlamor", OPTV_BOOLEAN,
> +     {0}, FALSE},
>       {-1, NULL, OPTV_NONE,
>        {0}, FALSE},
>   };
> @@ -861,6 +864,17 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts)
>       }
>       xf86Msg(from, "%sutomatically adding GPU devices\n",
>               xf86Info.autoAddGPU ? "A" : "Not a");
> +
> +    if (xf86IsOptionSet(FlagOptions, FLAG_PREFER_GLAMOR)) {
> +        xf86GetOptValBool(FlagOptions, FLAG_PREFER_GLAMOR,
> +                          &xf86Info.preferGlamor);
> +        from = X_CONFIG;
> +    }
> +    else {
> +        from = X_DEFAULT;
> +    }
> +    xf86Msg(from, "preferring to%sask driver to use glamor\n",
> +            xf86Info.preferGlamor ? "" : " not ");
>       /*
>        * Set things up based on the config file information.  Some of these
>        * settings may be overridden later when the command line options are
> diff --git a/hw/xfree86/common/xf86Globals.c b/hw/xfree86/common/xf86Globals.c
> index 93a35b8..47f660b 100644
> --- a/hw/xfree86/common/xf86Globals.c
> +++ b/hw/xfree86/common/xf86Globals.c
> @@ -136,6 +136,7 @@ xf86InfoRec xf86Info = {
>   #else
>       .autoAddGPU = FALSE,
>   #endif
> +    .preferGlamor = TRUE,
>   };
>
>   const char *xf86ConfigFile = NULL;
> diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h
> index cffa14d..c6c5bf6 100644
> --- a/hw/xfree86/common/xf86Privstr.h
> +++ b/hw/xfree86/common/xf86Privstr.h
> @@ -104,6 +104,7 @@ typedef struct {
>       MessageType dri2From;
>
>       Bool autoAddGPU;
> +    Bool preferGlamor;
>   } xf86InfoRec, *xf86InfoPtr;
>
>   #ifdef DPMSExtension
> diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
> index f1e9423..682c545 100644
> --- a/hw/xfree86/common/xf86platformBus.c
> +++ b/hw/xfree86/common/xf86platformBus.c
> @@ -374,8 +374,14 @@ static Bool doPlatformProbe(struct xf86_platform_device *dev, DriverPtr drvp,
>           }
>       }
>       if (entity != -1) {
> -        if ((dev->flags & XF86_PDEV_SERVER_FD) && (!drvp->driverFunc ||
> -                !drvp->driverFunc(NULL, SUPPORTS_SERVER_FDS, NULL))) {
> +        Bool server_fds = FALSE;
> +        if (drvp->driverFunc) {
> +            if (drvp->driverFunc(NULL, SUPPORTS_SERVER_FDS, NULL))
> +                server_fds = TRUE;
> +            if (drvp->driverFunc(NULL, SUPPORTS_GLAMOR_PREFERRED, NULL) && xf86Info.preferGlamor)
> +                flags |= PLATFORM_PROBE_PREFER_GLAMOR;
> +        }
> +        if ((dev->flags & XF86_PDEV_SERVER_FD) && !server_fds) {
>               systemd_logind_release_fd(dev->attribs->major, dev->attribs->minor, dev->attribs->fd);
>               dev->attribs->fd = -1;
>               dev->flags &= ~XF86_PDEV_SERVER_FD;
> diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
> index a58fafe..f620101 100644
> --- a/hw/xfree86/common/xf86str.h
> +++ b/hw/xfree86/common/xf86str.h
> @@ -258,6 +258,7 @@ typedef enum {
>       RR_GET_MODE_MM,
>       GET_REQUIRED_HW_INTERFACES = 10,
>       SUPPORTS_SERVER_FDS = 11,
> +    SUPPORTS_GLAMOR_PREFERRED = 12,
>   } xorgDriverFuncOp;
>
>   typedef Bool xorgDriverFuncProc(ScrnInfoPtr, xorgDriverFuncOp, void *);
> @@ -335,6 +336,7 @@ typedef struct _DriverRec {
>    * platform probe flags
>    */
>   #define PLATFORM_PROBE_GPU_SCREEN 1
> +#define PLATFORM_PROBE_PREFER_GLAMOR 2
>
>   /*
>    *  AddDriver flags
>


More information about the xorg-devel mailing list