Patchwork Refine version check of libpci function pci_get_dev.

login
register
about
Submitter Stefan Tauner
Date 2015-01-26 01:20:18
Message ID <1422235218-28260-1-git-send-email-stefan.tauner@alumni.tuwien.ac.at>
Download mbox | patch
Permalink /patch/4282/
State Accepted
Headers show

Comments

Stefan Tauner - 2015-01-26 01:20:18
The way more elegant check for the header fails unfortunately on CentOS 4.9
because PCI_LIB_VERSION is not defined at all although the domain parameter
is present. This patch jumps through the hoops via an additional check in the
Makefile to determine if the function accepts 5 parameters (new version) or
not (old version).

Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
---
 Makefile       | 28 ++++++++++++++++++++++++++++
 board_enable.c |  2 +-
 2 files changed, 29 insertions(+), 1 deletion(-)
Stefan Tauner - 2015-03-01 00:41:02
On Mon, 26 Jan 2015 02:20:18 +0100
Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> wrote:

> The way more elegant check for the header fails unfortunately on CentOS 4.9
> because PCI_LIB_VERSION is not defined at all although the domain parameter
> is present. This patch jumps through the hoops via an additional check in the
> Makefile to determine if the function accepts 5 parameters (new version) or
> not (old version).
> 
> Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>

Self-acked and committed in r1880.

Patch

diff --git a/Makefile b/Makefile
index 1f39f41..d5438cf 100644
--- a/Makefile
+++ b/Makefile
@@ -711,6 +711,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.
@@ -840,6 +842,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 <pci/pci.h>
+#else
+#include <pciutils/pci.h>
+#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 <usb.h>
 int main(int argc, char **argv)
@@ -862,6 +885,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 456e206..ac361b6 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