[v1,09/13] bus/pci: pre-process declarative PCI devargs

Message ID f5ff987f415710bbc11032f34686a5ec0119da2a.1535633784.git.gaetan.rivet@6wind.com
State Superseded, archived
Delegated to: Thomas Monjalon
Headers show
Series
  • Implement new devargs framework
Related show

Checks

Context Check Description
ci/Intel-compilation success Compilation OK
ci/checkpatch success coding style OK

Commit Message

Gaëtan Rivet Aug. 30, 2018, 1:42 p.m.
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@6wind.com>
---
 drivers/bus/pci/bsd/pci.c    |  5 ++++
 drivers/bus/pci/linux/pci.c  |  5 ++++
 drivers/bus/pci/pci_params.c | 51 ++++++++++++++++++++++++++++++++++++
 drivers/bus/pci/private.h    | 16 +++++++++++
 4 files changed, 77 insertions(+)

Patch

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 04648ac93..12f246089 100644
--- a/drivers/bus/pci/linux/pci.c
+++ b/drivers/bus/pci/linux/pci.c
@@ -429,6 +429,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];
@@ -438,6 +439,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..a09af3b1c 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,51 @@  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 *_devargs)
+{
+	struct rte_devargs *devargs = _devargs;
+	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, devargs->name, sizeof(devargs->name));
+	return 0;
+}
+
+int
+rte_pci_devargs_prepare(struct rte_devargs *devargs)
+{
+	struct rte_kvargs *kvargs = NULL;
+	char *args;
+	int ret;
+
+	if (devargs->bus_str == NULL)
+		return 0;
+
+	args = strchr(devargs->bus_str, ',');
+	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",
+			devargs->bus_str);
+		rte_errno = EINVAL;
+		return -1;
+	}
+
+	ret = rte_kvargs_process(kvargs, "id",
+				 &pci_addr_kv_parse, devargs);
+
+	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_ */