All buses (thankfully) implement the same logic when it comes to
selecting the devices to probe based on -a/-b options.
As we want to adjust how devices are selected, provide a common helper
in EAL and use it in the buses.

Signed-off-by: David Marchand <[email protected]>
---
Changes since RFC v2:
- changed API to query about a device name and hide the devargs meaning
  in the common code,

---
 drivers/bus/auxiliary/auxiliary_common.c | 19 ----------------
 drivers/bus/auxiliary/linux/auxiliary.c  |  2 +-
 drivers/bus/auxiliary/private.h          |  6 -----
 drivers/bus/cdx/cdx.c                    | 21 +-----------------
 drivers/bus/dpaa/dpaa_bus.c              | 24 ++++++--------------
 drivers/bus/fslmc/fslmc_bus.c            | 22 ++++++-------------
 drivers/bus/pci/bsd/pci.c                |  5 ++++-
 drivers/bus/pci/linux/pci.c              |  2 +-
 drivers/bus/pci/pci_common.c             | 23 -------------------
 drivers/bus/pci/private.h                | 11 ----------
 drivers/bus/pci/windows/pci.c            |  4 +++-
 drivers/bus/platform/platform.c          | 28 ++----------------------
 drivers/bus/uacce/uacce.c                | 22 +------------------
 drivers/bus/vmbus/vmbus_common.c         | 25 +--------------------
 drivers/dma/idxd/idxd_bus.c              |  8 ++-----
 lib/eal/common/eal_common_bus.c          | 19 ++++++++++++++++
 lib/eal/include/bus_driver.h             |  6 +++++
 17 files changed, 55 insertions(+), 192 deletions(-)

diff --git a/drivers/bus/auxiliary/auxiliary_common.c 
b/drivers/bus/auxiliary/auxiliary_common.c
index e5b4f4460d..8f3e90eaf0 100644
--- a/drivers/bus/auxiliary/auxiliary_common.c
+++ b/drivers/bus/auxiliary/auxiliary_common.c
@@ -384,25 +384,6 @@ auxiliary_dma_unmap(struct rte_device *dev, void *addr, 
uint64_t iova,
        return aux_dev->driver->dma_unmap(aux_dev, addr, iova, len);
 }
 
-bool
-auxiliary_is_ignored_device(const char *name)
-{
-       struct rte_devargs *devargs = rte_bus_find_devargs(&auxiliary_bus.bus, 
name);
-
-       switch (auxiliary_bus.bus.conf.scan_mode) {
-       case RTE_BUS_SCAN_ALLOWLIST:
-               if (devargs && devargs->policy == RTE_DEV_ALLOWED)
-                       return false;
-               break;
-       case RTE_BUS_SCAN_UNDEFINED:
-       case RTE_BUS_SCAN_BLOCKLIST:
-               if (devargs == NULL || devargs->policy != RTE_DEV_BLOCKED)
-                       return false;
-               break;
-       }
-       return true;
-}
-
 static enum rte_iova_mode
 auxiliary_get_iommu_class(void)
 {
diff --git a/drivers/bus/auxiliary/linux/auxiliary.c 
b/drivers/bus/auxiliary/linux/auxiliary.c
index 02fc9285dc..ac9bf55efa 100644
--- a/drivers/bus/auxiliary/linux/auxiliary.c
+++ b/drivers/bus/auxiliary/linux/auxiliary.c
@@ -110,7 +110,7 @@ auxiliary_scan(void)
                if (e->d_name[0] == '.')
                        continue;
 
-               if (auxiliary_is_ignored_device(e->d_name))
+               if (rte_bus_is_ignored_device(&auxiliary_bus.bus, e->d_name))
                        continue;
 
                snprintf(dirname, sizeof(dirname), "%s/%s",
diff --git a/drivers/bus/auxiliary/private.h b/drivers/bus/auxiliary/private.h
index 4604f6f4a7..6e61a5f494 100644
--- a/drivers/bus/auxiliary/private.h
+++ b/drivers/bus/auxiliary/private.h
@@ -53,12 +53,6 @@ int auxiliary_scan(void);
  */
 void auxiliary_on_scan(struct rte_auxiliary_device *aux_dev);
 
-/*
- * Validate whether a device with given auxiliary device should be ignored
- * or not.
- */
-bool auxiliary_is_ignored_device(const char *name);
-
 /*
  * Add an auxiliary device to the auxiliary bus (append to auxiliary device
  * list). This function also updates the bus references of the auxiliary
diff --git a/drivers/bus/cdx/cdx.c b/drivers/bus/cdx/cdx.c
index 0801825ef5..58d8c8b4da 100644
--- a/drivers/bus/cdx/cdx.c
+++ b/drivers/bus/cdx/cdx.c
@@ -151,25 +151,6 @@ void rte_cdx_unmap_device(struct rte_cdx_device *dev)
        cdx_vfio_unmap_resource(dev);
 }
 
-static bool
-cdx_ignore_device(const char *dev_name)
-{
-       struct rte_devargs *devargs = rte_bus_find_devargs(&rte_cdx_bus.bus, 
dev_name);
-
-       switch (rte_cdx_bus.bus.conf.scan_mode) {
-       case RTE_BUS_SCAN_ALLOWLIST:
-               if (devargs && devargs->policy == RTE_DEV_ALLOWED)
-                       return false;
-               break;
-       case RTE_BUS_SCAN_UNDEFINED:
-       case RTE_BUS_SCAN_BLOCKLIST:
-               if (devargs == NULL || devargs->policy != RTE_DEV_BLOCKED)
-                       return false;
-               break;
-       }
-       return true;
-}
-
 /*
  * Scan one cdx sysfs entry, and fill the devices list from it.
  * It checks if the CDX device is bound to vfio-cdx driver. In case
@@ -269,7 +250,7 @@ cdx_scan(void)
                if (e->d_name[0] == '.')
                        continue;
 
-               if (cdx_ignore_device(e->d_name))
+               if (rte_bus_is_ignored_device(&rte_cdx_bus.bus, e->d_name))
                        continue;
 
                snprintf(dirname, sizeof(dirname), "%s/%s",
diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c
index 356c56d989..9ff58af0c4 100644
--- a/drivers/bus/dpaa/dpaa_bus.c
+++ b/drivers/bus/dpaa/dpaa_bus.c
@@ -717,7 +717,6 @@ rte_dpaa_bus_probe(void)
        struct rte_dpaa_driver *drv;
        FILE *svr_file = NULL;
        uint32_t svr_ver;
-       int probe_all = rte_dpaa_bus.bus.conf.scan_mode != 
RTE_BUS_SCAN_ALLOWLIST;
        static int process_once;
        char *penv;
 
@@ -725,9 +724,6 @@ rte_dpaa_bus_probe(void)
        if (!rte_dpaa_bus.detected)
                return 0;
 
-       if (rte_dpaa_bus.bus.conf.scan_mode != RTE_BUS_SCAN_ALLOWLIST)
-               probe_all = true;
-
        svr_file = fopen(DPAA_SOC_ID_FILE, "r");
        if (svr_file) {
                if (fscanf(svr_file, "svr:%x", &svr_ver) > 0)
@@ -809,21 +805,15 @@ rte_dpaa_bus_probe(void)
                        if (rte_dev_is_probed(&dev->device))
                                continue;
 
-                       if (dev->device.devargs &&
-                           dev->device.devargs->policy == RTE_DEV_BLOCKED)
+                       if (rte_bus_is_ignored_device(&rte_dpaa_bus.bus, 
dev->name))
                                continue;
 
-                       if (probe_all ||
-                           (dev->device.devargs &&
-                            dev->device.devargs->policy == RTE_DEV_ALLOWED)) {
-                               ret = drv->probe(drv, dev);
-                               if (ret) {
-                                       DPAA_BUS_ERR("unable to probe:%s",
-                                                    dev->name);
-                               } else {
-                                       dev->driver = drv;
-                                       dev->device.driver = &drv->driver;
-                               }
+                       ret = drv->probe(drv, dev);
+                       if (ret) {
+                               DPAA_BUS_ERR("unable to probe: %s", dev->name);
+                       } else {
+                               dev->driver = drv;
+                               dev->device.driver = &drv->driver;
                        }
                        break;
                }
diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c
index f72b512b1a..b5d839b6b0 100644
--- a/drivers/bus/fslmc/fslmc_bus.c
+++ b/drivers/bus/fslmc/fslmc_bus.c
@@ -407,7 +407,6 @@ static int
 rte_fslmc_probe(void)
 {
        int ret = 0;
-       int probe_all;
 
        struct rte_dpaa2_device *dev;
        struct rte_dpaa2_driver *drv;
@@ -454,8 +453,6 @@ rte_fslmc_probe(void)
                return 0;
        }
 
-       probe_all = rte_fslmc_bus.bus.conf.scan_mode != RTE_BUS_SCAN_ALLOWLIST;
-
        TAILQ_FOREACH(dev, &rte_fslmc_bus.device_list, next) {
                TAILQ_FOREACH(drv, &rte_fslmc_bus.driver_list, next) {
                        ret = rte_fslmc_match(drv, dev);
@@ -465,23 +462,18 @@ rte_fslmc_probe(void)
                        if (rte_dev_is_probed(&dev->device))
                                continue;
 
-                       if (dev->device.devargs &&
-                           dev->device.devargs->policy == RTE_DEV_BLOCKED) {
+                       if (rte_bus_is_ignored_device(&rte_fslmc_bus.bus, 
dev->device.name)) {
                                DPAA2_BUS_LOG(DEBUG, "%s Blocked, skipping",
                                              dev->device.name);
                                continue;
                        }
 
-                       if (probe_all ||
-                          (dev->device.devargs &&
-                           dev->device.devargs->policy == RTE_DEV_ALLOWED)) {
-                               ret = drv->probe(drv, dev);
-                               if (ret) {
-                                       DPAA2_BUS_ERR("Unable to probe");
-                               } else {
-                                       dev->driver = drv;
-                                       dev->device.driver = &drv->driver;
-                               }
+                       ret = drv->probe(drv, dev);
+                       if (ret) {
+                               DPAA2_BUS_ERR("Unable to probe");
+                       } else {
+                               dev->driver = drv;
+                               dev->device.driver = &drv->driver;
                        }
                        break;
                }
diff --git a/drivers/bus/pci/bsd/pci.c b/drivers/bus/pci/bsd/pci.c
index 3f13e1d6ac..ffd84ee5f0 100644
--- a/drivers/bus/pci/bsd/pci.c
+++ b/drivers/bus/pci/bsd/pci.c
@@ -370,12 +370,15 @@ rte_pci_scan(void)
                }
 
                for (i = 0; i < conf_io.num_matches; i++) {
+                       char name[RTE_DEV_NAME_MAX_LEN];
+
                        pci_addr.domain = matches[i].pc_sel.pc_domain;
                        pci_addr.bus = matches[i].pc_sel.pc_bus;
                        pci_addr.devid = matches[i].pc_sel.pc_dev;
                        pci_addr.function = matches[i].pc_sel.pc_func;
+                       rte_pci_device_name(&pci_addr, name, sizeof(name));
 
-                       if (rte_pci_ignore_device(&pci_addr))
+                       if (rte_bus_is_ignored_device(&rte_pci_bus.bus, name))
                                continue;
 
                        if (pci_scan_one(fd, &matches[i]) < 0)
diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c
index 2ffac82e94..03a3c37dea 100644
--- a/drivers/bus/pci/linux/pci.c
+++ b/drivers/bus/pci/linux/pci.c
@@ -458,7 +458,7 @@ rte_pci_scan(void)
                if (parse_pci_addr_format(e->d_name, sizeof(e->d_name), &addr) 
!= 0)
                        continue;
 
-               if (rte_pci_ignore_device(&addr))
+               if (rte_bus_is_ignored_device(&rte_pci_bus.bus, e->d_name))
                        continue;
 
                snprintf(dirname, sizeof(dirname), "%s/%s",
diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c
index 8782dc342a..5ef9e80e3e 100644
--- a/drivers/bus/pci/pci_common.c
+++ b/drivers/bus/pci/pci_common.c
@@ -713,29 +713,6 @@ pci_dma_unmap(struct rte_device *dev, void *addr, uint64_t 
iova, size_t len)
        return -1;
 }
 
-bool
-rte_pci_ignore_device(const struct rte_pci_addr *pci_addr)
-{
-       char name[RTE_DEV_NAME_MAX_LEN];
-       struct rte_devargs *devargs;
-
-       rte_pci_device_name(pci_addr, name, sizeof(name));
-       devargs = rte_bus_find_devargs(&rte_pci_bus.bus, name);
-
-       switch (rte_pci_bus.bus.conf.scan_mode) {
-       case RTE_BUS_SCAN_ALLOWLIST:
-               if (devargs && devargs->policy == RTE_DEV_ALLOWED)
-                       return false;
-               break;
-       case RTE_BUS_SCAN_UNDEFINED:
-       case RTE_BUS_SCAN_BLOCKLIST:
-               if (devargs == NULL || devargs->policy != RTE_DEV_BLOCKED)
-                       return false;
-               break;
-       }
-       return true;
-}
-
 enum rte_iova_mode
 rte_pci_get_iommu_class(void)
 {
diff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h
index 38109844b9..8591c4a0a7 100644
--- a/drivers/bus/pci/private.h
+++ b/drivers/bus/pci/private.h
@@ -82,17 +82,6 @@ pci_common_set(struct rte_pci_device *dev);
 void
 pci_free(struct rte_pci_device_internal *pdev);
 
-/**
- * Validate whether a device with given PCI address should be ignored or not.
- *
- * @param pci_addr
- *     PCI address of device to be validated
- * @return
- *     true: if device is to be ignored,
- *     false: if device is to be scanned,
- */
-bool rte_pci_ignore_device(const struct rte_pci_addr *pci_addr);
-
 /**
  * Add a PCI device to the PCI Bus (append to PCI Device list). This function
  * also updates the bus references of the PCI Device (and the generic device
diff --git a/drivers/bus/pci/windows/pci.c b/drivers/bus/pci/windows/pci.c
index a5ce3b51f7..91c8e567d1 100644
--- a/drivers/bus/pci/windows/pci.c
+++ b/drivers/bus/pci/windows/pci.c
@@ -373,6 +373,7 @@ pci_scan_one(HDEVINFO dev_info, PSP_DEVINFO_DATA 
device_info_data)
        struct rte_pci_device *dev = NULL;
        int ret = -1;
        char  pci_device_info[REGSTR_VAL_MAX_HCID_LEN];
+       char name[RTE_DEV_NAME_MAX_LEN];
        struct rte_pci_addr addr;
        struct rte_pci_id pci_id;
 
@@ -380,7 +381,8 @@ pci_scan_one(HDEVINFO dev_info, PSP_DEVINFO_DATA 
device_info_data)
        if (ret != 0)
                goto end;
 
-       if (rte_pci_ignore_device(&addr)) {
+       rte_pci_device_name(&addr, name, sizeof(name));
+       if (rte_bus_is_ignored_device(&rte_pci_bus.bus, name)) {
                /*
                 * We won't add this device, but we want to continue
                 * looking for supported devices
diff --git a/drivers/bus/platform/platform.c b/drivers/bus/platform/platform.c
index 23c39aada6..ad7898f011 100644
--- a/drivers/bus/platform/platform.c
+++ b/drivers/bus/platform/platform.c
@@ -43,30 +43,6 @@ rte_platform_unregister(struct rte_platform_driver *pdrv)
        TAILQ_REMOVE(&platform_bus.driver_list, pdrv, next);
 }
 
-static bool
-dev_allowed(const char *dev_name)
-{
-       struct rte_devargs *devargs;
-
-       devargs = rte_bus_find_devargs(&platform_bus.bus, dev_name);
-       if (devargs == NULL)
-               return true;
-
-       switch (platform_bus.bus.conf.scan_mode) {
-       case RTE_BUS_SCAN_UNDEFINED:
-       case RTE_BUS_SCAN_ALLOWLIST:
-               if (devargs->policy == RTE_DEV_ALLOWED)
-                       return true;
-               break;
-       case RTE_BUS_SCAN_BLOCKLIST:
-               if (devargs->policy == RTE_DEV_BLOCKED)
-                       return false;
-               break;
-       }
-
-       return true;
-}
-
 static int
 dev_add(const char *dev_name)
 {
@@ -160,7 +136,7 @@ platform_bus_scan(void)
                if (dev_name[0] == '.')
                        continue;
 
-               if (!dev_allowed(dev_name))
+               if (rte_bus_is_ignored_device(&platform_bus.bus, dev_name))
                        continue;
 
                if (!dev_is_bound_vfio_platform(dev_name))
@@ -484,7 +460,7 @@ platform_bus_plug(struct rte_device *dev)
 {
        struct rte_platform_device *pdev;
 
-       if (!dev_allowed(dev->name))
+       if (rte_bus_is_ignored_device(&platform_bus.bus, dev->name))
                return -EPERM;
 
        if (!dev_is_bound_vfio_platform(dev->name))
diff --git a/drivers/bus/uacce/uacce.c b/drivers/bus/uacce/uacce.c
index 1a3deea31a..c99fdae28b 100644
--- a/drivers/bus/uacce/uacce.c
+++ b/drivers/bus/uacce/uacce.c
@@ -69,26 +69,6 @@ extern int uacce_bus_logtype;
 #define UACCE_BUS_DEBUG(fmt, ...) UACCE_BUS_LOG(DEBUG, fmt, ##__VA_ARGS__)
 
 
-static bool
-uacce_ignore_device(const char *dev_name)
-{
-       struct rte_devargs *devargs = rte_bus_find_devargs(&uacce_bus.bus, 
dev_name);
-
-       switch (uacce_bus.bus.conf.scan_mode) {
-       case RTE_BUS_SCAN_ALLOWLIST:
-               if (devargs && devargs->policy == RTE_DEV_ALLOWED)
-                       return false;
-               break;
-       case RTE_BUS_SCAN_UNDEFINED:
-       case RTE_BUS_SCAN_BLOCKLIST:
-               if (devargs == NULL || devargs->policy != RTE_DEV_BLOCKED)
-                       return false;
-               break;
-       }
-
-       return true;
-}
-
 /*
  * Returns the number of bytes read (removed last newline) on success.
  * Otherwise negative value is returned.
@@ -295,7 +275,7 @@ uacce_scan(void)
                        continue;
                }
 
-               if (uacce_ignore_device(e->d_name))
+               if (rte_bus_is_ignored_device(&uacce_bus.bus, e->d_name))
                        continue;
 
                if (uacce_scan_one(e->d_name) < 0)
diff --git a/drivers/bus/vmbus/vmbus_common.c b/drivers/bus/vmbus/vmbus_common.c
index 96d16ff545..a9eb7cf933 100644
--- a/drivers/bus/vmbus/vmbus_common.c
+++ b/drivers/bus/vmbus/vmbus_common.c
@@ -168,29 +168,6 @@ vmbus_probe_all_drivers(struct rte_vmbus_device *dev)
        return 1;
 }
 
-static bool
-vmbus_ignore_device(struct rte_vmbus_device *dev)
-{
-       char name[RTE_DEV_NAME_MAX_LEN];
-       struct rte_devargs *devargs;
-
-       rte_uuid_unparse(dev->device_id, name, sizeof(name));
-       devargs = rte_bus_find_devargs(&rte_vmbus_bus.bus, name);
-
-       switch (rte_vmbus_bus.bus.conf.scan_mode) {
-       case RTE_BUS_SCAN_ALLOWLIST:
-               if (devargs && devargs->policy == RTE_DEV_ALLOWED)
-                       return false;
-               break;
-       case RTE_BUS_SCAN_UNDEFINED:
-       case RTE_BUS_SCAN_BLOCKLIST:
-               if (devargs == NULL || devargs->policy != RTE_DEV_BLOCKED)
-                       return false;
-               break;
-       }
-       return true;
-}
-
 /*
  * Scan the vmbus, and call the devinit() function for
  * all registered drivers that have a matching entry in its id_table
@@ -209,7 +186,7 @@ rte_vmbus_probe(void)
 
                rte_uuid_unparse(dev->device_id, ubuf, sizeof(ubuf));
 
-               if (vmbus_ignore_device(dev))
+               if (rte_bus_is_ignored_device(&rte_vmbus_bus.bus, ubuf))
                        continue;
 
                if (vmbus_probe_all_drivers(dev) < 0) {
diff --git a/drivers/dma/idxd/idxd_bus.c b/drivers/dma/idxd/idxd_bus.c
index 136ac511ef..00e7e7315c 100644
--- a/drivers/dma/idxd/idxd_bus.c
+++ b/drivers/dma/idxd/idxd_bus.c
@@ -263,12 +263,8 @@ is_for_this_process_use(struct rte_dsa_device *dev, const 
char *name)
        if (strncmp(name, prefix, prefixlen) == 0 && name[prefixlen] == '_')
                retval = 1;
 
-       if (retval && dsa_bus.bus.conf.scan_mode != RTE_BUS_SCAN_UNDEFINED) {
-               if (dsa_bus.bus.conf.scan_mode == RTE_BUS_SCAN_ALLOWLIST)
-                       retval = rte_bus_find_devargs(&dsa_bus.bus, 
dev->device.name) != NULL;
-               else
-                       retval = rte_bus_find_devargs(&dsa_bus.bus, 
dev->device.name) == NULL;
-       }
+       if (retval && !rte_bus_is_ignored_device(&dsa_bus.bus, 
dev->device.name))
+               retval = 1;
 
        return retval;
 }
diff --git a/lib/eal/common/eal_common_bus.c b/lib/eal/common/eal_common_bus.c
index 863c7418bb..2ca0af7914 100644
--- a/lib/eal/common/eal_common_bus.c
+++ b/lib/eal/common/eal_common_bus.c
@@ -246,6 +246,25 @@ rte_bus_find_by_device_name(const char *str)
        return rte_bus_find(NULL, bus_can_parse, name);
 }
 
+RTE_EXPORT_INTERNAL_SYMBOL(rte_bus_is_ignored_device)
+bool
+rte_bus_is_ignored_device(const struct rte_bus *bus, const char *dev_name)
+{
+       struct rte_devargs *devargs = rte_bus_find_devargs(bus, dev_name);
+
+       switch (bus->conf.scan_mode) {
+       case RTE_BUS_SCAN_ALLOWLIST:
+               if (devargs && devargs->policy == RTE_DEV_ALLOWED)
+                       return false;
+               break;
+       case RTE_BUS_SCAN_UNDEFINED:
+       case RTE_BUS_SCAN_BLOCKLIST:
+               if (devargs == NULL || devargs->policy != RTE_DEV_BLOCKED)
+                       return false;
+               break;
+       }
+       return true;
+}
 
 /*
  * Get iommu class of devices on the bus.
diff --git a/lib/eal/include/bus_driver.h b/lib/eal/include/bus_driver.h
index 430906772d..dc30e06843 100644
--- a/lib/eal/include/bus_driver.h
+++ b/lib/eal/include/bus_driver.h
@@ -312,6 +312,12 @@ void rte_bus_register(struct rte_bus *bus);
 __rte_internal
 struct rte_devargs *rte_bus_find_devargs(const struct rte_bus *bus, const char 
*name);
 
+/**
+ * Indicate if a device should be skipped during probing of a bus.
+ */
+__rte_internal
+bool rte_bus_is_ignored_device(const struct rte_bus *bus, const char 
*dev_name);
+
 /**
  * Helper for Bus registration.
  * The constructor has higher priority than PMD constructors.
-- 
2.53.0

Reply via email to