diff --git a/Makefile b/Makefile index 81a4b110f..93759c3a3 100644 --- a/Makefile +++ b/Makefile @@ -713,6 +713,8 @@ endif ifeq ($(NEED_PCI), yes) CHECK_LIBPCI = yes FEATURE_CFLAGS += -D'NEED_PCI=1' +FEATURE_CFLAGS += $(shell LC_ALL=C grep -q "OLD_PCI_GET_DEV := yes" .libdeps && printf "%s" "-D'OLD_PCI_GET_DEV=1'") + PROGRAMMER_OBJS += pcidev.o physmap.o hwaccess.o ifeq ($(TARGET_OS), NetBSD) # The libpci we want is called libpciutils on NetBSD and needs NetBSD libpci. @@ -842,6 +844,27 @@ int main(int argc, char **argv) endef export LIBPCI_TEST +define PCI_GET_DEV_TEST +/* Avoid a failing test due to libpci header symbol shadowing breakage */ +#define index shadow_workaround_index +#if !defined __NetBSD__ +#include +#else +#include +#endif +struct pci_access *pacc; +struct pci_dev *dev = {0}; +int main(int argc, char **argv) +{ + (void) argc; + (void) argv; + pacc = pci_alloc(); + dev = pci_get_dev(pacc, dev->domain, dev->bus, dev->dev, 1); + return 0; +} +endef +export PCI_GET_DEV_TEST + define LIBUSB0_TEST #include "platform.h" #if IS_WINDOWS @@ -869,6 +892,11 @@ ifeq ($(CHECK_LIBPCI), yes) echo "Please install libpci headers (package pciutils-devel)."; \ echo "See README for more information."; echo; \ rm -f .test.c .test.o; exit 1) + @printf "Checking version of pci_get_dev... " + @echo "$$PCI_GET_DEV_TEST" > .test.c + @$(CC) -c $(CPPFLAGS) $(CFLAGS) .test.c -o .test.o >/dev/null 2>&1 && \ + ( echo "new version (including PCI domain parameter)."; echo "OLD_PCI_GET_DEV := no" >> .libdeps ) || \ + ( echo "old version (without PCI domain parameter)."; echo "OLD_PCI_GET_DEV := yes" >> .libdeps ) @printf "Checking if libpci is present and sufficient... " @$(CC) $(LDFLAGS) .test.o -o .test$(EXEC_SUFFIX) $(LIBS) $(PCILIBS) >/dev/null && \ echo "yes." || ( echo "no."; \ diff --git a/board_enable.c b/board_enable.c index 66c587e2c..81dcfec88 100644 --- a/board_enable.c +++ b/board_enable.c @@ -1047,7 +1047,7 @@ static int nvidia_mcp_gpio_set(int gpio, int raise) return -1; } -#if PCI_LIB_VERSION >= 0x020200 +#if !defined(OLD_PCI_GET_DEV) dev = pci_get_dev(pacc, dev->domain, dev->bus, dev->dev, 1); #else /* pciutils/libpci before version 2.2 is too old to support