[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