[dpdk-dev] [PATCH v4 13/20] bus/pci: implement device iteration and comparison

Gaetan Rivet gaetan.rivet at 6wind.com
Thu Mar 29 23:23:37 CEST 2018


Signed-off-by: Gaetan Rivet <gaetan.rivet at 6wind.com>
---
 drivers/bus/pci/Makefile     |  2 +-
 drivers/bus/pci/pci_common.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/drivers/bus/pci/Makefile b/drivers/bus/pci/Makefile
index f3df1c4ce..73498dc77 100644
--- a/drivers/bus/pci/Makefile
+++ b/drivers/bus/pci/Makefile
@@ -50,7 +50,7 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common
 CFLAGS += -I$(RTE_SDK)/lib/librte_eal/$(SYSTEM)app/eal
 
 LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring
-LDLIBS += -lrte_ethdev -lrte_pci
+LDLIBS += -lrte_ethdev -lrte_pci -lrte_kvargs
 
 include $(RTE_SDK)/drivers/bus/pci/$(SYSTEM)/Makefile
 SRCS-$(CONFIG_RTE_LIBRTE_PCI_BUS) := $(addprefix $(SYSTEM)/,$(SRCS))
diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c
index 2c45f8151..5ce2e5733 100644
--- a/drivers/bus/pci/pci_common.c
+++ b/drivers/bus/pci/pci_common.c
@@ -13,6 +13,7 @@
 
 #include <rte_errno.h>
 #include <rte_interrupts.h>
+#include <rte_kvargs.h>
 #include <rte_log.h>
 #include <rte_bus.h>
 #include <rte_pci.h>
@@ -497,6 +498,46 @@ pci_unplug(struct rte_device *dev)
 	return ret;
 }
 
+enum pci_params {
+	RTE_PCI_PARAMS_MAX,
+};
+
+static const char *pci_params_keys[] = {
+	[RTE_PCI_PARAMS_MAX] = NULL,
+};
+
+static int
+pci_dev_match(const struct rte_device *dev,
+	      const void *_kvlist)
+{
+	const struct rte_kvargs *kvlist = _kvlist;
+
+	(void) dev;
+	(void) kvlist;
+	return 0;
+}
+
+static void *
+pci_dev_iterate(const void *start,
+		const char *str,
+		const struct rte_dev_iterator *it __rte_unused)
+{
+	struct rte_device *dev;
+	struct rte_kvargs *kvargs = NULL;
+
+	if (str != NULL) {
+		kvargs = rte_kvargs_parse(str, pci_params_keys);
+		if (kvargs == NULL) {
+			RTE_LOG(ERR, EAL, "cannot parse argument list\n");
+			rte_errno = EINVAL;
+			return NULL;
+		}
+	}
+	dev = pci_find_device(start, pci_dev_match, kvargs);
+	rte_kvargs_free(kvargs);
+	return dev;
+}
+
 struct rte_pci_bus rte_pci_bus = {
 	.bus = {
 		.scan = rte_pci_scan,
@@ -506,6 +547,7 @@ struct rte_pci_bus rte_pci_bus = {
 		.unplug = pci_unplug,
 		.parse = pci_parse,
 		.get_iommu_class = rte_pci_get_iommu_class,
+		.dev_iterate = pci_dev_iterate,
 	},
 	.device_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.device_list),
 	.driver_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.driver_list),
-- 
2.11.0



More information about the dev mailing list