[RFC 3/3] xfree86: Support driver loading via OutputClass

Aaron Plattner aplattner at nvidia.com
Thu Feb 13 13:36:17 PST 2014


On 02/13/2014 05:22 AM, Thierry Reding wrote:
> Use the OutputClass configuration to determine what drivers to autoload
> for a given device.
>
> Signed-off-by: Thierry Reding <treding at nvidia.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 5875a91363cc..d4f12a910795 100644
> --- a/hw/xfree86/common/xf86platformBus.c
> +++ b/hw/xfree86/common/xf86platformBus.c
> @@ -46,6 +46,7 @@
>   #include "xf86Bus.h"
>   #include "Pci.h"
>   #include "xf86platformBus.h"
> +#include "xf86Config.h"
>
>   #include "randrstr.h"
>   int platformSlotClaimed;
> @@ -176,6 +177,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;
> +}

It's a little unfortunate to have to copy this from xf86input.c, but I 
don't have a good suggestion for where would be a better place to move it.

> +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.
> @@ -208,6 +284,8 @@ xf86PlatformMatchDriver(char *matches[], int nmatches)
>               if ((info != NULL) && (j < nmatches)) {
>                   j += xf86VideoPtrToDriverList(info, &(matches[j]), nmatches - j);
>               }
> +
> +            j += xf86OutputClassDriverList(i, &matches[j], nmatches - j);

This works, but it sorts the server built-in drivers ahead of the Output 
class ones.  Do you think it would be reasonable to move this line 
earlier so drivers configured this way take precedence over the ones 
from xf86VideoPtrToDriverList?

>           }
>       }
>       return j;
>

-- 
Aaron


More information about the xorg-devel mailing list