summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2014-02-14 15:45:33 +0100
committerKeith Packard <keithp@keithp.com>2014-07-07 16:11:00 -0700
commit5a4e15c3f6fb8d674879e54458328e9f595d9451 (patch)
tree139f442474fcfccb0115ef34439fdecc19aacf5b
parenta61ca6f006d70343c88fe45206fae0669d1e8971 (diff)
xfree86: Make driver matching consistent
Most of the driver enumeration functions take an array and a maximum number of entries that they are allowed to fill in. Upon success, they return the number of entries filled in. This allows them to be easily used to consecutively. One exception is the xf86MatchDriverFromFiles() function, which doesn't return a value, so callers have to manually search the array for the first empty entry. This commit modifies the xf86MatchDriverFromFiles() to behave the same way as others, which makes it easier to deal with. Reviewed-by: Aaron Plattner <aplattner@nvidia.com> Tested-By: Aaron Plattner <aplattner@nvidia.com> Tested-by: Rob Clark <robdclark@gmail.com> (on arm / platform device) Signed-off-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--hw/xfree86/common/xf86AutoConfig.c2
-rw-r--r--hw/xfree86/common/xf86pciBus.c24
-rw-r--r--hw/xfree86/common/xf86pciBus.h5
-rw-r--r--hw/xfree86/common/xf86platformBus.c7
4 files changed, 16 insertions, 22 deletions
diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c
index 4eb86de22..2b53b908a 100644
--- a/hw/xfree86/common/xf86AutoConfig.c
+++ b/hw/xfree86/common/xf86AutoConfig.c
@@ -265,7 +265,7 @@ listPossibleVideoDrivers(char *matches[], int nmatches)
#endif
#ifdef XSERVER_LIBPCIACCESS
if (i < (nmatches - 1))
- i = xf86PciMatchDriver(matches, nmatches);
+ i += xf86PciMatchDriver(&matches[i], nmatches - i);
#endif
#if defined(__linux__)
diff --git a/hw/xfree86/common/xf86pciBus.c b/hw/xfree86/common/xf86pciBus.c
index 0f76a03ee..c06b04033 100644
--- a/hw/xfree86/common/xf86pciBus.c
+++ b/hw/xfree86/common/xf86pciBus.c
@@ -1320,8 +1320,9 @@ xchomp(char *line)
* don't export their PCI ID's properly. If distros don't end up using this
* feature it can and should be removed because the symbol-based resolution
* scheme should be the primary one */
-void
-xf86MatchDriverFromFiles(char **matches, uint16_t match_vendor, uint16_t match_chip)
+int
+xf86MatchDriverFromFiles(uint16_t match_vendor, uint16_t match_chip,
+ char *matches[], int nmatches)
{
DIR *idsdir;
FILE *fp;
@@ -1331,11 +1332,11 @@ xf86MatchDriverFromFiles(char **matches, uint16_t match_vendor, uint16_t match_c
ssize_t read;
char path_name[256], vendor_str[5], chip_str[5];
uint16_t vendor, chip;
- int i, j;
+ int i = 0, j;
idsdir = opendir(PCI_TXT_IDS_PATH);
if (!idsdir)
- return;
+ return 0;
xf86Msg(X_INFO,
"Scanning %s directory for additional PCI ID's supported by the drivers\n",
@@ -1386,10 +1387,6 @@ xf86MatchDriverFromFiles(char **matches, uint16_t match_vendor, uint16_t match_c
}
}
if (vendor == match_vendor && chip == match_chip) {
- i = 0;
- while (matches[i]) {
- i++;
- }
matches[i] =
(char *) malloc(sizeof(char) *
strlen(direntry->d_name) - 3);
@@ -1412,6 +1409,7 @@ xf86MatchDriverFromFiles(char **matches, uint16_t match_vendor, uint16_t match_c
}
xf86Msg(X_INFO, "Matched %s from file name %s\n",
matches[i], direntry->d_name);
+ i++;
}
}
else {
@@ -1425,6 +1423,7 @@ xf86MatchDriverFromFiles(char **matches, uint16_t match_vendor, uint16_t match_c
end:
free(line);
closedir(idsdir);
+ return i;
}
#endif /* __linux__ */
@@ -1435,7 +1434,7 @@ xf86MatchDriverFromFiles(char **matches, uint16_t match_vendor, uint16_t match_c
int
xf86PciMatchDriver(char *matches[], int nmatches)
{
- int i;
+ int i = 0;
struct pci_device *info = NULL;
struct pci_device_iterator *iter;
@@ -1450,13 +1449,10 @@ xf86PciMatchDriver(char *matches[], int nmatches)
pci_iterator_destroy(iter);
#ifdef __linux__
if (info)
- xf86MatchDriverFromFiles(matches, info->vendor_id, info->device_id);
+ i += xf86MatchDriverFromFiles(info->vendor_id, info->device_id,
+ matches, nmatches);
#endif
- for (i = 0; (i < nmatches) && (matches[i]); i++) {
- /* find end of matches list */
- }
-
if ((info != NULL) && (i < nmatches)) {
i += xf86VideoPtrToDriverList(info, &(matches[i]), nmatches - i);
}
diff --git a/hw/xfree86/common/xf86pciBus.h b/hw/xfree86/common/xf86pciBus.h
index b497a7f2d..45b5a0fee 100644
--- a/hw/xfree86/common/xf86pciBus.h
+++ b/hw/xfree86/common/xf86pciBus.h
@@ -47,8 +47,9 @@ void xf86PciConfigureNewDev(void *busData, struct pci_device *pVideo,
((x)->func == (y)->func) && \
((x)->dev == (y)->dev))
-void
-xf86MatchDriverFromFiles(char **matches, uint16_t match_vendor, uint16_t match_chip);
+int
+xf86MatchDriverFromFiles(uint16_t match_vendor, uint16_t match_chip,
+ char *matches[], int nmatches);
int
xf86VideoPtrToDriverList(struct pci_device *dev,
char *returnList[], int returnListMax);
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
index dd118a285..672e2e519 100644
--- a/hw/xfree86/common/xf86platformBus.c
+++ b/hw/xfree86/common/xf86platformBus.c
@@ -221,13 +221,10 @@ xf86PlatformMatchDriver(char *matches[], int nmatches)
info = xf86_platform_devices[i].pdev;
#ifdef __linux__
if (info)
- xf86MatchDriverFromFiles(matches, info->vendor_id, info->device_id);
+ j += xf86MatchDriverFromFiles(info->vendor_id, info->device_id,
+ &matches[j], nmatches - j);
#endif
- for (j = 0; (j < nmatches) && (matches[j]); j++) {
- /* find end of matches list */
- }
-
if ((info != NULL) && (j < nmatches)) {
j += xf86VideoPtrToDriverList(info, &(matches[j]), nmatches - j);
}