[PATCH v2 RESEND 1/5] xfree86: Make driver matching consistent
Rob Clark
robdclark at gmail.com
Fri Jul 4 10:49:42 PDT 2014
On Wed, Jun 25, 2014 at 9:54 AM, Thierry Reding
<thierry.reding at gmail.com> wrote:
> From: Thierry Reding <treding at nvidia.com>
>
> 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 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> (on arm / platform device)
> ---
> hw/xfree86/common/xf86AutoConfig.c | 2 +-
> hw/xfree86/common/xf86pciBus.c | 24 ++++++++++--------------
> hw/xfree86/common/xf86pciBus.h | 5 +++--
> hw/xfree86/common/xf86platformBus.c | 7 ++-----
> 4 files changed, 16 insertions(+), 22 deletions(-)
>
> diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c
> index 4eb86de22f8d..2b53b908a591 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 0f76a03ee7e7..c06b04033238 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 b497a7f2df9d..45b5a0feefcc 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 dd118a28565b..672e2e5199ac 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);
> }
> --
> 2.0.0
>
More information about the xorg-devel
mailing list