[PATCH v2 RESEND 4/5] xfree86: Support driver loading via OutputClass

Rob Clark robdclark at gmail.com
Fri Jul 4 10:52:26 PDT 2014


On Wed, Jun 25, 2014 at 9:55 AM, Thierry Reding
<thierry.reding at gmail.com> wrote:
> From: Thierry Reding <treding at nvidia.com>
>
> Use the OutputClass configuration to determine what drivers to autoload
> for a given device.
>
> Reviewed-by: Aaron Plattner <aplattner at nvidia.com>
> Tested-By: Aaron Plattner <aplattner at nvidia.com>
> Signed-off-by: Thierry Reding <treding at nvidia.com>

Tested-by: Rob Clark <robdclark at gmail.com>

> ---
>  hw/xfree86/common/xf86platformBus.c | 78 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 78 insertions(+)
>
> diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
> index 672e2e5199ac..eb1a3fb5d15b 100644
> --- a/hw/xfree86/common/xf86platformBus.c
> +++ b/hw/xfree86/common/xf86platformBus.c
> @@ -47,6 +47,7 @@
>  #include "xf86Bus.h"
>  #include "Pci.h"
>  #include "xf86platformBus.h"
> +#include "xf86Config.h"
>
>  #include "randrstr.h"
>  int platformSlotClaimed;
> @@ -199,6 +200,81 @@ xf86_check_platform_slot(const struct xf86_platform_device *pd)
>      return TRUE;
>  }
>
> +static Bool
> +MatchToken(const char *value, struct xorg_list *patterns,
> +           int (*compare)(const char *, const char *))
> +{
> +    const xf86MatchGroup *group;
> +
> +    /* If there are no patterns, accept the match */
> +    if (xorg_list_is_empty(patterns))
> +        return TRUE;
> +
> +    /* If there are patterns but no attribute, reject the match */
> +    if (!value)
> +        return FALSE;
> +
> +    /*
> +     * Otherwise, iterate the list of patterns ensuring each entry has a
> +     * match. Each list entry is a separate Match line of the same type.
> +     */
> +    xorg_list_for_each_entry(group, patterns, entry) {
> +        Bool match = FALSE;
> +        char *const *cur;
> +
> +        for (cur = group->values; *cur; cur++) {
> +            if ((*compare)(value, *cur) == 0) {
> +                match = TRUE;
> +                break;
> +            }
> +        }
> +
> +        if (!match)
> +            return FALSE;
> +    }
> +
> +    /* All the entries in the list matched the attribute */
> +    return TRUE;
> +}
> +
> +static Bool
> +OutputClassMatches(const XF86ConfOutputClassPtr oclass, int index)
> +{
> +    char *driver = xf86_get_platform_attrib(index, ODEV_ATTRIB_DRIVER);
> +
> +    if (!MatchToken(driver, &oclass->match_driver, strcmp))
> +        return FALSE;
> +
> +    return TRUE;
> +}
> +
> +static int
> +xf86OutputClassDriverList(int index, char *matches[], int nmatches)
> +{
> +    XF86ConfOutputClassPtr cl;
> +    int i = 0;
> +
> +    if (nmatches == 0)
> +        return 0;
> +
> +    for (cl = xf86configptr->conf_outputclass_lst; cl; cl = cl->list.next) {
> +        if (OutputClassMatches(cl, index)) {
> +            char *path = xf86_get_platform_attrib(index, ODEV_ATTRIB_PATH);
> +
> +            xf86Msg(X_INFO, "Applying OutputClass \"%s\" to %s\n",
> +                    cl->identifier, path);
> +            xf86Msg(X_NONE, "\tloading driver: %s\n", cl->driver);
> +
> +            matches[i++] = xstrdup(cl->driver);
> +        }
> +
> +        if (i >= nmatches)
> +            break;
> +    }
> +
> +    return i;
> +}
> +
>  /**
>   *  @return The numbers of found devices that match with the current system
>   *  drivers.
> @@ -218,6 +294,8 @@ xf86PlatformMatchDriver(char *matches[], int nmatches)
>              else if (!xf86IsPrimaryPlatform(&xf86_platform_devices[i]) && (pass == 0))
>                  continue;
>
> +            j += xf86OutputClassDriverList(i, &matches[j], nmatches - j);
> +
>              info = xf86_platform_devices[i].pdev;
>  #ifdef __linux__
>              if (info)
> --
> 2.0.0
>


More information about the xorg-devel mailing list