[RFC] modesetting: Add workaround for platform devices and buggy xserver

Hans de Goede hdegoede at redhat.com
Mon Jun 16 08:10:20 PDT 2014


Hi,

On 06/16/2014 05:05 PM, Rob Clark wrote:
> If the xserver does not have a bug fix for a problem with auto-loading
> true platform devices, then work around the issue by failing the
> platformProbe().  This way the user can at least still load the driver
> with a custom .conf file.

Not pretty, but this seems like it is the best we can do:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans


> 
> ---
>  src/driver.c | 37 ++++++++++++++++++++++++++++++++++---
>  1 file changed, 34 insertions(+), 3 deletions(-)
> 
> diff --git a/src/driver.c b/src/driver.c
> index cc526f6..3e2d2c2 100644
> --- a/src/driver.c
> +++ b/src/driver.c
> @@ -136,6 +136,8 @@ static const OptionInfoRec Options[] = {
>  
>  int modesettingEntityIndex = -1;
>  
> +static Bool supports_non_pci_platform_devs = FALSE;
> +
>  static MODULESETUPPROTO(Setup);
>  
>  static XF86ModuleVersionInfo VersRec = {
> @@ -213,11 +215,33 @@ static int check_outputs(int fd)
>      return ret;
>  }
>  
> -static Bool probe_hw(char *dev)
> +static Bool probe_hw(const char *dev, struct xf86_platform_device *platform_dev)
>  {
>      int fd = open_hw(dev);
>      if (fd != -1) {
>          int ret = check_outputs(fd);
> +        /* if called in platformProbe path, and server does not
> +         * supports_non_pci_platform_devs then we need to reject
> +         * and fallback to old probe.   Otherwise things won't
> +         * even work if user has a .conf file, thanks to autoAddGPU
> +         * loop.
> +         */
> +        if (platform_dev && !supports_non_pci_platform_devs) {
> +            drmSetVersion sv;
> +            char *busid;
> +
> +            sv.drm_di_major = 1;
> +            sv.drm_di_minor = 4;
> +            sv.drm_dd_major = -1;       /* Don't care */
> +            sv.drm_dd_minor = -1;       /* Don't care */
> +
> +            drmSetInterfaceVersion(fd, &sv);
> +
> +            busid = drmGetBusid(fd);
> +            if (busid && !strncmp(busid, "platform:", 9))
> +                ret = FALSE;
> +            drmFreeBusid(busid);
> +        }
>          close(fd);
>          return ret;
>      }
> @@ -273,6 +297,10 @@ AvailableOptions(int chipid, int busid)
>      return Options;
>  }
>  
> +#if 1 /* XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(???) */
> +#  define SERVER_SUPPORTS_NON_PCI_PLATFORM_DEVS 12
> +#endif
> +
>  static Bool
>  ms_driver_func(ScrnInfoPtr scrn, xorgDriverFuncOp op, void *data)
>  {
> @@ -283,6 +311,9 @@ ms_driver_func(ScrnInfoPtr scrn, xorgDriverFuncOp op, void *data)
>  	    flag = (CARD32 *)data;
>  	    (*flag) = 0;
>  	    return TRUE;
> +        case SERVER_SUPPORTS_NON_PCI_PLATFORM_DEVS:
> +            supports_non_pci_platform_devs = TRUE;
> +            return TRUE;
>  	default:
>  	    return FALSE;
>      }
> @@ -341,7 +372,7 @@ ms_platform_probe(DriverPtr driver,
>      if (flags & PLATFORM_PROBE_GPU_SCREEN)
>              scr_flags = XF86_ALLOCATE_GPU_SCREEN;
>  
> -    if (probe_hw(path)) {
> +    if (probe_hw(path, dev)) {
>          scrn = xf86AllocateScreen(driver, scr_flags);
>          xf86AddEntityToScreen(scrn, entity_num);
>  
> @@ -387,7 +418,7 @@ Probe(DriverPtr drv, int flags)
>      for (i = 0; i < numDevSections; i++) {
>  
>  	dev = xf86FindOptionValue(devSections[i]->options,"kmsdev");
> -	if (probe_hw(dev)) {
> +	if (probe_hw(dev, NULL)) {
>  	    int entity;
>  	    entity = xf86ClaimFbSlot(drv, 0, devSections[i], TRUE);
>  	    scrn = xf86ConfigFbEntity(scrn, 0, entity,
> 


More information about the xorg-devel mailing list