[dpdk-dev] [PATCH v9 23/27] bus/pci: pre-process declarative PCI devargs

Gaetan Rivet gaetan.rivet at 6wind.com
Wed Jul 4 00:15:06 CEST 2018


The new devargs format does not recognize a particular device name.
Each bus uses its specific format.

Instead of introducing a new bus API, process those devargs privately
for the moment. Prepare them for matching during scan against the
bus devices.

Signed-off-by: Gaetan Rivet <gaetan.rivet at 6wind.com>
---
 drivers/bus/pci/bsd/pci.c    |  5 ++++
 drivers/bus/pci/linux/pci.c  |  5 ++++
 drivers/bus/pci/pci_params.c | 55 ++++++++++++++++++++++++++++++++++++++++++++
 drivers/bus/pci/private.h    | 16 +++++++++++++
 4 files changed, 81 insertions(+)

diff --git a/drivers/bus/pci/bsd/pci.c b/drivers/bus/pci/bsd/pci.c
index 655b34b7e..046cd11d5 100644
--- a/drivers/bus/pci/bsd/pci.c
+++ b/drivers/bus/pci/bsd/pci.c
@@ -327,6 +327,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
 int
 rte_pci_scan(void)
 {
+	struct rte_devargs *devargs;
 	int fd;
 	unsigned dev_count = 0;
 	struct pci_conf matches[16];
@@ -342,6 +343,10 @@ rte_pci_scan(void)
 	if (!rte_eal_has_pci())
 		return 0;
 
+	RTE_EAL_DEVARGS_FOREACH("pci", devargs)
+		if (rte_pci_devargs_prepare(devargs))
+			continue;
+
 	fd = open("/dev/pci", O_RDONLY);
 	if (fd < 0) {
 		RTE_LOG(ERR, EAL, "%s(): error opening /dev/pci\n", __func__);
diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c
index 004600f1c..0c20a4337 100644
--- a/drivers/bus/pci/linux/pci.c
+++ b/drivers/bus/pci/linux/pci.c
@@ -430,6 +430,7 @@ parse_pci_addr_format(const char *buf, int bufsize, struct rte_pci_addr *addr)
 int
 rte_pci_scan(void)
 {
+	struct rte_devargs *devargs;
 	struct dirent *e;
 	DIR *dir;
 	char dirname[PATH_MAX];
@@ -439,6 +440,10 @@ rte_pci_scan(void)
 	if (!rte_eal_has_pci())
 		return 0;
 
+	RTE_EAL_DEVARGS_FOREACH("pci", devargs)
+		if (rte_pci_devargs_prepare(devargs))
+			continue;
+
 #ifdef VFIO_PRESENT
 	if (!pci_vfio_is_enabled())
 		RTE_LOG(DEBUG, EAL, "VFIO PCI modules not loaded\n");
diff --git a/drivers/bus/pci/pci_params.c b/drivers/bus/pci/pci_params.c
index 7630d4845..bb62bcb80 100644
--- a/drivers/bus/pci/pci_params.c
+++ b/drivers/bus/pci/pci_params.c
@@ -2,9 +2,12 @@
  * Copyright 2018 Gaëtan Rivet
  */
 
+#include <string.h>
+
 #include <rte_bus.h>
 #include <rte_bus_pci.h>
 #include <rte_dev.h>
+#include <rte_devargs.h>
 #include <rte_errno.h>
 #include <rte_kvargs.h>
 #include <rte_pci.h>
@@ -76,3 +79,55 @@ rte_pci_dev_iterate(const void *start,
 	rte_kvargs_free(kvargs);
 	return dev;
 }
+
+static int
+pci_addr_kv_parse(const char *key __rte_unused,
+		  const char *value,
+		  void *_da)
+{
+	struct rte_devargs *da = _da;
+	struct rte_pci_addr addr;
+
+	/* Verify address is valid. */
+	if (rte_pci_addr_parse(value, &addr)) {
+		rte_errno = ENODEV;
+		return -1;
+	}
+	/* Write down the address as the devargs name. */
+	rte_pci_device_name(&addr, da->name, sizeof(da->name));
+	return 0;
+}
+
+int
+rte_pci_devargs_prepare(struct rte_devargs *da)
+{
+	struct rte_kvargs *kvargs = NULL;
+	char *args;
+	int ret;
+
+	if (da->busstr == NULL)
+		return 0;
+
+	args = strchr(da->busstr, ',');
+	if (args == NULL)
+		return 0;
+	args++;
+
+	kvargs = rte_kvargs_parse(args, pci_params_keys);
+	if (kvargs == NULL) {
+		RTE_LOG(ERR, EAL, "unable to parse parameter list: %s\n",
+			da->busstr);
+		rte_errno = EINVAL;
+		return -1;
+	}
+
+	if (rte_kvargs_process(kvargs, "id",
+			       &pci_addr_kv_parse, da)) {
+		ret = -1;
+		goto free_kvargs;
+	}
+
+free_kvargs:
+	rte_kvargs_free(kvargs);
+	return ret;
+}
diff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h
index 0e689fa74..9beb24c6a 100644
--- a/drivers/bus/pci/private.h
+++ b/drivers/bus/pci/private.h
@@ -191,4 +191,20 @@ rte_pci_dev_iterate(const void *start,
 		    const char *str,
 		    const struct rte_dev_iterator *it);
 
+/*
+ * Prepare a devargs meant for this bus.
+ * This function is only used for a transitory period,
+ * to translate the new devargs format in one
+ * compatible with the old form.
+ *
+ * @param da
+ *   Devargs to process.
+ *
+ * @return
+ *   0 on success.
+ *   <0 on error.
+ */
+int
+rte_pci_devargs_prepare(struct rte_devargs *da);
+
 #endif /* _PCI_PRIVATE_H_ */
-- 
2.11.0



More information about the dev mailing list