summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@gmail.com>2016-02-09 23:09:18 +1000
committerDave Airlie <airlied@gmail.com>2016-02-09 23:09:18 +1000
commited5c06f30eacc236b3e563e536bd4f440cc170d8 (patch)
tree2d17aa3fca3a6799c367b2e08aea2cd9dd39261a
parent72fef0c10e975659aa0b38a5e1361819bc51acd5 (diff)
xfree86: add pci id matching to OutputClass
This will be used by drivers to denote PCI ids in the future instead of hardcoding them in the server. Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--hw/xfree86/common/xf86platformBus.c14
-rw-r--r--hw/xfree86/parser/OutputClass.c21
-rw-r--r--hw/xfree86/parser/xf86Parser.h1
-rw-r--r--hw/xfree86/parser/xf86tokens.h1
4 files changed, 37 insertions, 0 deletions
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
index 96895a6e1..70064aea9 100644
--- a/hw/xfree86/common/xf86platformBus.c
+++ b/hw/xfree86/common/xf86platformBus.c
@@ -164,6 +164,12 @@ xf86_check_platform_slot(const struct xf86_platform_device *pd)
return TRUE;
}
+static int
+match_substring(const char *attr, const char *pattern)
+{
+ return (strstr(attr, pattern)) ? 0 : -1;
+}
+
static Bool
MatchToken(const char *value, struct xorg_list *patterns,
int (*compare)(const char *, const char *))
@@ -205,10 +211,18 @@ static Bool
OutputClassMatches(const XF86ConfOutputClassPtr oclass, int index)
{
char *driver = xf86_platform_odev_attributes(index)->driver;
+ struct pci_device *pdev = xf86_platform_devices[index].pdev;
+ char pciid_str[64];
if (!MatchToken(driver, &oclass->match_driver, strcmp))
return FALSE;
+ if (pdev) {
+ snprintf(pciid_str, 64, "%04x:%04x", pdev->vendor_id, pdev->device_id);
+ if (!MatchToken(pciid_str, &oclass->match_pciid, match_substring))
+ return FALSE;
+ }
+
return TRUE;
}
diff --git a/hw/xfree86/parser/OutputClass.c b/hw/xfree86/parser/OutputClass.c
index 3f2082ecb..2dad412cd 100644
--- a/hw/xfree86/parser/OutputClass.c
+++ b/hw/xfree86/parser/OutputClass.c
@@ -38,6 +38,7 @@ xf86ConfigSymTabRec OutputClassTab[] = {
{IDENTIFIER, "identifier"},
{DRIVER, "driver"},
{MATCH_DRIVER, "matchdriver"},
+ {MATCH_PCIID, "matchpciid"},
{-1, ""},
};
@@ -61,6 +62,13 @@ xf86freeOutputClassList(XF86ConfOutputClassPtr ptr)
free(group);
}
+ xorg_list_for_each_entry_safe(group, next, &ptr->match_pciid, entry) {
+ xorg_list_del(&group->entry);
+ for (list = group->values; *list; list++)
+ free(*list);
+ free(group);
+ }
+
prev = ptr;
ptr = ptr->list.next;
free(prev);
@@ -93,6 +101,7 @@ xf86parseOutputClassSection(void)
/* Initialize MatchGroup lists */
xorg_list_init(&ptr->match_driver);
+ xorg_list_init(&ptr->match_pciid);
while ((token = xf86getToken(OutputClassTab)) != ENDSECTION) {
switch (token) {
@@ -120,6 +129,13 @@ xf86parseOutputClassSection(void)
xstrtokenize(xf86_lex_val.str, TOKEN_SEP));
free(xf86_lex_val.str);
break;
+ case MATCH_PCIID:
+ if (xf86getSubToken(&(ptr->comment)) != STRING)
+ Error(QUOTE_MSG, "MatchPCIID");
+ add_group_entry(&ptr->match_pciid,
+ xstrtokenize(xf86_lex_val.str, TOKEN_SEP));
+ free(xf86_lex_val.str);
+ break;
case EOF_TOKEN:
Error(UNEXPECTED_EOF_MSG);
break;
@@ -158,6 +174,11 @@ xf86printOutputClassSection(FILE * cf, XF86ConfOutputClassPtr ptr)
for (cur = group->values; *cur; cur++)
fprintf(cf, "%s%s", cur == group->values ? "" : TOKEN_SEP,
*cur);
+ fprintf(cf, "\"\n");
+ fprintf(cf, "\tMatchPCIID \"");
+ for (cur = group->values; *cur; cur++)
+ fprintf(cf, "%s%s", cur == group->values ? "" : TOKEN_SEP,
+ *cur);
fprintf(cf, "\"\n");
}
diff --git a/hw/xfree86/parser/xf86Parser.h b/hw/xfree86/parser/xf86Parser.h
index a038f9eca..26a7fbc16 100644
--- a/hw/xfree86/parser/xf86Parser.h
+++ b/hw/xfree86/parser/xf86Parser.h
@@ -337,6 +337,7 @@ typedef struct {
char *identifier;
char *driver;
struct xorg_list match_driver;
+ struct xorg_list match_pciid;
char *comment;
} XF86ConfOutputClassRec, *XF86ConfOutputClassPtr;
diff --git a/hw/xfree86/parser/xf86tokens.h b/hw/xfree86/parser/xf86tokens.h
index f955af0d5..dfb8b7aca 100644
--- a/hw/xfree86/parser/xf86tokens.h
+++ b/hw/xfree86/parser/xf86tokens.h
@@ -278,6 +278,7 @@ typedef enum {
MATCH_OS,
MATCH_PNPID,
MATCH_USBID,
+ MATCH_PCIID,
MATCH_DRIVER,
MATCH_TAG,
MATCH_LAYOUT,