@@ -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__);
@@ -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");
@@ -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;
+}
@@ -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_ */
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(+)