With new global device syntax, this patch tries to get PCI BDF firstly from bus "addr" argument, fallback to name if not found. Example:
-w bus=pci,addr=82:00.0/class=eth/driver=mlx5,dv_flow_en=1 Signed-off-by: Xueming Li <xuemi...@nvidia.com> --- drivers/bus/pci/pci_common.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 9b8d769287..f6fc80abe8 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -23,6 +23,7 @@ #include <rte_string_fns.h> #include <rte_common.h> #include <rte_devargs.h> +#include <rte_kvargs.h> #include <rte_vfio.h> #include "private.h" @@ -48,9 +49,20 @@ pci_devargs_lookup(const struct rte_pci_addr *pci_addr) { struct rte_devargs *devargs; struct rte_pci_addr addr; + struct rte_kvargs *kvlist = NULL; + const char *name; RTE_EAL_DEVARGS_FOREACH("pci", devargs) { - devargs->bus->parse(devargs->name, &addr); + name = NULL; + if (devargs->bus_str) { + kvlist = rte_kvargs_parse(devargs->bus_str, NULL); + name = rte_kvargs_get(kvlist, "id"); + } + if (!name) + name = devargs->name; + devargs->bus->parse(name, &addr); + if (kvlist) + rte_kvargs_free(kvlist); if (!rte_pci_addr_cmp(pci_addr, &addr)) return devargs; } @@ -71,11 +83,11 @@ pci_name_set(struct rte_pci_device *dev) /* When using a blocklist, only blocked devices will have * an rte_devargs. Allowed devices won't have one. */ - if (devargs != NULL) + if (devargs != NULL && strlen(devargs->name)) /* If an rte_devargs exists, the generic rte_device uses the * given name as its name. */ - dev->device.name = dev->device.devargs->name; + dev->device.name = devargs->name; else /* Otherwise, it uses the internal, canonical form. */ dev->device.name = dev->name; -- 2.25.1