[PATCH] platform: support non-pci platform devices

Hans de Goede hdegoede at redhat.com
Sun Jun 15 23:49:00 PDT 2014


Hi,

On 06/14/2014 09:58 PM, Rob Clark wrote:
> This makes things not completely fail if DDX implements platformProbe()
> but the device is not actually a PCI device.  Also, the platform device
> name does not always match the DDX name, so deal with that.  I'm sure
> there are more cases that find_non_pci_driver() needs to handle for
> that, but this is a start.
> 
> Signed-off-by: Rob Clark <robdclark at gmail.com>

Looks good, one small remark below.

> ---
> NOTE: I still need to figure out a sane way to workaround the existing
> bug with non-pci platform devices.  Currently, if DDX implements the
> platformProbe() hook, then in xf86platformProbeDev() it will get claimed
> in the autoAddGPU loop, resulting that the old-school Probe() fallback
> (if you have .conf file) fails too because the device is already claimed.
> We kind of need a way that the DDX can detect that the xserver does not
> have this fix, so that it can work around the bug by failing
> platformProbe().
> 
>  hw/xfree86/common/xf86platformBus.c | 65 ++++++++++++++++++++++++++++++++++---
>  1 file changed, 61 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
> index dd118a2..eca0f8c 100644
> --- a/hw/xfree86/common/xf86platformBus.c
> +++ b/hw/xfree86/common/xf86platformBus.c
> @@ -199,6 +199,41 @@ xf86_check_platform_slot(const struct xf86_platform_device *pd)
>      return TRUE;
>  }
>  
> +static int
> +find_non_pci_driver(const char *busid, char *returnList[], int returnListMax)
> +{
> +    /* Add more entries here if we ever return more than 4 drivers for
> +       any device */
> +    const char *driverList[5] = { NULL, NULL, NULL, NULL, NULL };
> +    int i = 0;
> +    char *p, *s;
> +
> +    s = xstrdup(busid);
> +    p = strtok(s, ":");
> +
> +    if (strcmp(p, "platform"))
> +        goto out;
> +
> +    /* extract device name: */
> +    p = strtok(NULL, ":");
> +
> +    /* check for special cases where DDX driver name does not match busid: */
> +    if (!strcmp(p, "mdp")) {
> +        driverList[i++] = "freedreno";
> +    }
> +
> +    /* add name derived from busid last: */
> +    driverList[i++] = p;
> +
> +    for (i = 0; (i < returnListMax) && (driverList[i] != NULL); i++) {
> +        returnList[i] = xnfstrdup(driverList[i]);
> +    }
> +
> +out:
> +    free(s);
> +    return i;                   /* Number of entries added */
> +}
> +
>  /**
>   *  @return The numbers of found devices that match with the current system
>   *  drivers.
> @@ -230,6 +265,9 @@ xf86PlatformMatchDriver(char *matches[], int nmatches)
>  
>              if ((info != NULL) && (j < nmatches)) {
>                  j += xf86VideoPtrToDriverList(info, &(matches[j]), nmatches - j);
> +            } else if (j < nmatches) {
> +                char *busid = xf86_get_platform_attrib(i, ODEV_ATTRIB_BUSID);
> +                j += find_non_pci_driver(busid, &(matches[j]), nmatches - j);
>              }
>          }
>      }
> @@ -248,6 +286,9 @@ xf86platformProbe(void)
>          pci = FALSE;
>      }
>  
> +    /* First pass, look for PCI devices.  If we find a suitable
> +     * PCI device that takes priority.
> +     */
>      for (i = 0; i < xf86_num_platform_devices; i++) {
>          char *busid = xf86_get_platform_attrib(i, ODEV_ATTRIB_BUSID);
>  
> @@ -255,6 +296,24 @@ xf86platformProbe(void)
>              platform_find_pci_info(&xf86_platform_devices[i], busid);
>          }
>      }
> +
> +    /* if we found something, we are done: */
> +    if (primaryBus.type != BUS_NONE)
> +        return 0;
> +
> +    /* Second pass, look for real platform devices (ie. in the linux-
> +     * kernel sense of platform device.. something that is not pci)
> +     */
> +    for (i = 0; i < xf86_num_platform_devices; i++) {
> +        char *busid = xf86_get_platform_attrib(i, ODEV_ATTRIB_BUSID);
> +
> +        if (strncmp(busid, "platform:", 9) == 0) {
> +            primaryBus.type = BUS_PLATFORM;
> +            primaryBus.id.plat = &xf86_platform_devices[i];
> +            break;
> +        }
> +    }
> +
>      return 0;
>  }
>  
> @@ -401,10 +460,8 @@ xf86platformProbeDev(DriverPtr drvp)
>                  /* for non-seat0 servers assume first device is the master */
>                  if (ServerIsNotSeat0())
>                      break;
> -                if (xf86_platform_devices[j].pdev) {
> -                    if (xf86IsPrimaryPlatform(&xf86_platform_devices[j]))
> -                        break;
> -                }
> +                if (xf86IsPrimaryPlatform(&xf86_platform_devices[j]))
> +                    break;
>              }
>          }

This seems like an unrelated cleanup which should be in its own patch,
with a commit message explaining why it is safe to remove the
"if (xf86_platform_devices[j].pdev)" check.

With this hunk removed, this patch is:

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

Regards,

Hans


More information about the xorg-devel mailing list