From: Shreyansh Jain <shreyansh.j...@nxp.com>

Remove EAL initiated direct PCI scan/probe and enable PCI Bus linkage.

Signed-off-by: Shreyansh Jain <shreyansh.j...@nxp.com>
Reviewed-by: Ferruh Yigit <ferruh.yi...@intel.com>
Signed-off-by: Thomas Monjalon <thomas.monja...@6wind.com>
---
 lib/librte_eal/bsdapp/eal/eal.c                 |  7 -----
 lib/librte_eal/bsdapp/eal/eal_pci.c             | 32 ++++++++-------------
 lib/librte_eal/bsdapp/eal/rte_eal_version.map   |  2 --
 lib/librte_eal/common/eal_common_pci.c          | 26 +++++++----------
 lib/librte_eal/common/eal_private.h             | 10 -------
 lib/librte_eal/common/include/rte_pci.h         | 19 +++----------
 lib/librte_eal/linuxapp/eal/eal.c               |  7 -----
 lib/librte_eal/linuxapp/eal/eal_pci.c           | 38 +++++++++----------------
 lib/librte_eal/linuxapp/eal/rte_eal_version.map |  2 --
 9 files changed, 41 insertions(+), 102 deletions(-)

diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
index ee7c9de..a7f2671 100644
--- a/lib/librte_eal/bsdapp/eal/eal.c
+++ b/lib/librte_eal/bsdapp/eal/eal.c
@@ -562,9 +562,6 @@ rte_eal_init(int argc, char **argv)
        if (rte_eal_timer_init() < 0)
                rte_panic("Cannot init HPET or TSC timers\n");
 
-       if (rte_eal_pci_init() < 0)
-               rte_panic("Cannot init PCI\n");
-
        eal_check_mem_on_local_socket();
 
        if (eal_plugins_init() < 0)
@@ -617,10 +614,6 @@ rte_eal_init(int argc, char **argv)
        if (rte_bus_probe())
                rte_panic("Cannot probe devices\n");
 
-       /* Probe & Initialize PCI devices */
-       if (rte_eal_pci_probe())
-               rte_panic("Cannot probe PCI\n");
-
        if (rte_eal_dev_init() < 0)
                rte_panic("Cannot init pmd devices\n");
 
diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c 
b/lib/librte_eal/bsdapp/eal/eal_pci.c
index 48bfe24..103ad70 100644
--- a/lib/librte_eal/bsdapp/eal/eal_pci.c
+++ b/lib/librte_eal/bsdapp/eal/eal_pci.c
@@ -87,6 +87,9 @@
  * enabling bus master.
  */
 
+/* Forward declaration of PCI bus */
+struct rte_pci_bus rte_pci_bus;
+
 /* Map pci device */
 int
 rte_eal_pci_map_device(struct rte_pci_device *dev)
@@ -313,19 +316,19 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
        }
 
        /* device is valid, add in list (sorted) */
-       if (TAILQ_EMPTY(&pci_device_list)) {
-               TAILQ_INSERT_TAIL(&pci_device_list, dev, next);
+       if (TAILQ_EMPTY(&rte_pci_bus.device_list)) {
+               rte_eal_pci_add_device(dev);
        }
        else {
                struct rte_pci_device *dev2 = NULL;
                int ret;
 
-               TAILQ_FOREACH(dev2, &pci_device_list, next) {
+               TAILQ_FOREACH(dev2, &rte_pci_bus.device_list, next) {
                        ret = rte_eal_compare_pci_addr(&dev->addr, &dev2->addr);
                        if (ret > 0)
                                continue;
                        else if (ret < 0) {
-                               TAILQ_INSERT_BEFORE(dev2, dev, next);
+                               rte_eal_pci_insert_device(dev2, dev);
                                return 0;
                        } else { /* already registered */
                                dev2->kdrv = dev->kdrv;
@@ -337,7 +340,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
                                return 0;
                        }
                }
-               TAILQ_INSERT_TAIL(&pci_device_list, dev, next);
+               rte_eal_pci_add_device(dev);
        }
 
        return 0;
@@ -365,6 +368,10 @@ rte_eal_pci_scan(void)
                        .matches = &matches[0],
        };
 
+       /* for debug purposes, PCI can be disabled */
+       if (internal_config.no_pci)
+               return 0;
+
        fd = open("/dev/pci", O_RDONLY);
        if (fd < 0) {
                RTE_LOG(ERR, EAL, "%s(): error opening /dev/pci\n", __func__);
@@ -659,21 +666,6 @@ rte_eal_pci_ioport_unmap(struct rte_pci_ioport *p)
        return ret;
 }
 
-/* Init the PCI EAL subsystem */
-int
-rte_eal_pci_init(void)
-{
-       /* for debug purposes, PCI can be disabled */
-       if (internal_config.no_pci)
-               return 0;
-
-       if (rte_eal_pci_scan() < 0) {
-               RTE_LOG(ERR, EAL, "%s(): Cannot scan PCI bus\n", __func__);
-               return -1;
-       }
-       return 0;
-}
-
 struct rte_pci_bus rte_pci_bus = {
        .bus = {
                .scan = rte_eal_pci_scan,
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map 
b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
index afa1643..c7c2a05 100644
--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -6,8 +6,6 @@ DPDK_2.0 {
        eal_parse_sysfs_value;
        eal_timer_source;
        lcore_config;
-       pci_device_list;
-       pci_driver_list;
        per_lcore__lcore_id;
        per_lcore__rte_errno;
        rte_calloc;
diff --git a/lib/librte_eal/common/eal_common_pci.c 
b/lib/librte_eal/common/eal_common_pci.c
index c53e2bd..5149e6e 100644
--- a/lib/librte_eal/common/eal_common_pci.c
+++ b/lib/librte_eal/common/eal_common_pci.c
@@ -83,11 +83,6 @@
 
 #include "eal_private.h"
 
-struct pci_driver_list pci_driver_list =
-       TAILQ_HEAD_INITIALIZER(pci_driver_list);
-struct pci_device_list pci_device_list =
-       TAILQ_HEAD_INITIALIZER(pci_device_list);
-
 extern struct rte_pci_bus rte_pci_bus;
 
 #define SYSFS_PCI_DEVICES "/sys/bus/pci/devices"
@@ -311,7 +306,7 @@ pci_probe_all_drivers(struct rte_pci_device *dev)
        if (dev->driver != NULL)
                return 0;
 
-       TAILQ_FOREACH(dr, &pci_driver_list, next) {
+       FOREACH_DRIVER_ON_PCIBUS(dr) {
                rc = rte_eal_pci_probe_one_driver(dr, dev);
                if (rc < 0)
                        /* negative value is an error */
@@ -332,6 +327,7 @@ int
 rte_eal_pci_probe_one(const struct rte_pci_addr *addr)
 {
        struct rte_pci_device *dev = NULL;
+
        int ret = 0;
 
        if (addr == NULL)
@@ -343,7 +339,7 @@ rte_eal_pci_probe_one(const struct rte_pci_addr *addr)
        if (pci_update_device(addr) < 0)
                goto err_return;
 
-       TAILQ_FOREACH(dev, &pci_device_list, next) {
+       FOREACH_DEVICE_ON_PCIBUS(dev) {
                if (rte_eal_compare_pci_addr(&dev->addr, addr))
                        continue;
 
@@ -373,7 +369,7 @@ rte_eal_pci_detach(const struct rte_pci_addr *addr)
        if (addr == NULL)
                return -1;
 
-       TAILQ_FOREACH(dev, &pci_device_list, next) {
+       FOREACH_DEVICE_ON_PCIBUS(dev) {
                if (rte_eal_compare_pci_addr(&dev->addr, addr))
                        continue;
 
@@ -385,7 +381,7 @@ rte_eal_pci_detach(const struct rte_pci_addr *addr)
                        /* positive value means driver doesn't support it */
                        continue;
 
-               TAILQ_REMOVE(&pci_device_list, dev, next);
+               rte_eal_pci_remove_device(dev);
                free(dev);
                return 0;
        }
@@ -414,7 +410,7 @@ rte_eal_pci_probe(void)
        if (rte_eal_devargs_type_count(RTE_DEVTYPE_WHITELISTED_PCI) == 0)
                probe_all = 1;
 
-       TAILQ_FOREACH(dev, &pci_device_list, next) {
+       FOREACH_DEVICE_ON_PCIBUS(dev) {
 
                /* set devargs in PCI structure */
                devargs = pci_devargs_lookup(dev);
@@ -462,7 +458,7 @@ rte_eal_pci_dump(FILE *f)
 {
        struct rte_pci_device *dev = NULL;
 
-       TAILQ_FOREACH(dev, &pci_device_list, next) {
+       FOREACH_DEVICE_ON_PCIBUS(dev) {
                pci_dump_one_device(f, dev);
        }
 }
@@ -471,16 +467,16 @@ rte_eal_pci_dump(FILE *f)
 void
 rte_eal_pci_register(struct rte_pci_driver *driver)
 {
-       TAILQ_INSERT_TAIL(&pci_driver_list, driver, next);
-       rte_eal_driver_register(&driver->driver);
+       TAILQ_INSERT_TAIL(&rte_pci_bus.driver_list, driver, next);
+       driver->bus = &rte_pci_bus;
 }
 
 /* unregister a driver */
 void
 rte_eal_pci_unregister(struct rte_pci_driver *driver)
 {
-       rte_eal_driver_unregister(&driver->driver);
-       TAILQ_REMOVE(&pci_driver_list, driver, next);
+       TAILQ_REMOVE(&rte_pci_bus.driver_list, driver, next);
+       driver->bus = NULL;
 }
 
 /* Add a device to PCI bus */
diff --git a/lib/librte_eal/common/eal_private.h 
b/lib/librte_eal/common/eal_private.h
index 9e7d8f6..68386e8 100644
--- a/lib/librte_eal/common/eal_private.h
+++ b/lib/librte_eal/common/eal_private.h
@@ -108,16 +108,6 @@ int rte_eal_timer_init(void);
  */
 int rte_eal_log_init(const char *id, int facility);
 
-/**
- * Init the PCI infrastructure
- *
- * This function is private to EAL.
- *
- * @return
- *   0 on success, negative on error
- */
-int rte_eal_pci_init(void);
-
 struct rte_pci_driver;
 struct rte_pci_device;
 
diff --git a/lib/librte_eal/common/include/rte_pci.h 
b/lib/librte_eal/common/include/rte_pci.h
index 957cddb..bab8df4 100644
--- a/lib/librte_eal/common/include/rte_pci.h
+++ b/lib/librte_eal/common/include/rte_pci.h
@@ -87,12 +87,6 @@ extern "C" {
 #include <rte_dev.h>
 #include <rte_bus.h>
 
-TAILQ_HEAD(pci_device_list, rte_pci_device); /**< PCI devices in D-linked Q. */
-TAILQ_HEAD(pci_driver_list, rte_pci_driver); /**< PCI drivers in D-linked Q. */
-
-extern struct pci_driver_list pci_driver_list; /**< Global list of PCI 
drivers. */
-extern struct pci_device_list pci_device_list; /**< Global list of PCI 
devices. */
-
 /** Pathname of PCI devices directory. */
 const char *pci_get_sysfs_path(void);
 
@@ -208,8 +202,6 @@ struct rte_pci_device {
        .subsystem_device_id = PCI_ANY_ID
 #endif
 
-struct rte_pci_driver;
-
 /**
  * Initialisation function for the driver called during PCI probing.
  */
@@ -416,17 +408,14 @@ rte_pci_match(const struct rte_pci_driver *pci_drv,
              const struct rte_pci_device *pci_dev);
 
 /**
- * Probe the PCI bus for registered drivers.
- *
- * Scan the content of the PCI bus, and call the probe() function for
- * all registered drivers that have a matching entry in its id_table
- * for discovered devices.
+ * Probe the PCI bus
  *
  * @return
  *   - 0 on success.
- *   - Negative on error.
+ *   - !0 on error.
  */
-int rte_eal_pci_probe(void);
+int
+rte_eal_pci_probe(void);
 
 /**
  * Map the PCI device resources in user space virtual memory address
diff --git a/lib/librte_eal/linuxapp/eal/eal.c 
b/lib/librte_eal/linuxapp/eal/eal.c
index bf6b818..6bb7fc9 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -803,9 +803,6 @@ rte_eal_init(int argc, char **argv)
        if (rte_eal_log_init(logid, internal_config.syslog_facility) < 0)
                rte_panic("Cannot init logs\n");
 
-       if (rte_eal_pci_init() < 0)
-               rte_panic("Cannot init PCI\n");
-
 #ifdef VFIO_PRESENT
        if (rte_eal_vfio_setup() < 0)
                rte_panic("Cannot init VFIO\n");
@@ -888,10 +885,6 @@ rte_eal_init(int argc, char **argv)
        if (rte_bus_probe())
                rte_panic("Cannot probe devices\n");
 
-       /* Probe & Initialize PCI devices */
-       if (rte_eal_pci_probe())
-               rte_panic("Cannot probe PCI\n");
-
        if (rte_eal_dev_init() < 0)
                rte_panic("Cannot init pmd devices\n");
 
diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c 
b/lib/librte_eal/linuxapp/eal/eal_pci.c
index c40814d..d6f9855 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
@@ -55,6 +55,9 @@
  * IGB_UIO driver (or doesn't initialize, if the device wasn't bound to it).
  */
 
+/* Forward declaration of PCI bus */
+struct rte_pci_bus rte_pci_bus;
+
 static int
 pci_get_kernel_driver_by_path(const char *filename, char *dri_name)
 {
@@ -347,21 +350,19 @@ pci_scan_one(const char *dirname, const struct 
rte_pci_addr *addr)
                dev->kdrv = RTE_KDRV_NONE;
 
        /* device is valid, add in list (sorted) */
-       if (TAILQ_EMPTY(&pci_device_list)) {
-               rte_eal_device_insert(&dev->device);
-               TAILQ_INSERT_TAIL(&pci_device_list, dev, next);
+       if (TAILQ_EMPTY(&rte_pci_bus.device_list)) {
+               rte_eal_pci_add_device(dev);
        } else {
                struct rte_pci_device *dev2;
                int ret;
 
-               TAILQ_FOREACH(dev2, &pci_device_list, next) {
+               TAILQ_FOREACH(dev2, &rte_pci_bus.device_list, next) {
                        ret = rte_eal_compare_pci_addr(&dev->addr, &dev2->addr);
                        if (ret > 0)
                                continue;
 
                        if (ret < 0) {
-                               TAILQ_INSERT_BEFORE(dev2, dev, next);
-                               rte_eal_device_insert(&dev->device);
+                               rte_eal_pci_insert_device(dev2, dev);
                        } else { /* already registered */
                                dev2->kdrv = dev->kdrv;
                                dev2->max_vfs = dev->max_vfs;
@@ -371,8 +372,8 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr 
*addr)
                        }
                        return 0;
                }
-               rte_eal_device_insert(&dev->device);
-               TAILQ_INSERT_TAIL(&pci_device_list, dev, next);
+
+               rte_eal_pci_add_device(dev);
        }
 
        return 0;
@@ -448,6 +449,10 @@ rte_eal_pci_scan(void)
        char dirname[PATH_MAX];
        struct rte_pci_addr addr;
 
+       /* for debug purposes, PCI can be disabled */
+       if (internal_config.no_pci)
+               return 0;
+
        dir = opendir(pci_get_sysfs_path());
        if (dir == NULL) {
                RTE_LOG(ERR, EAL, "%s(): opendir failed: %s\n",
@@ -464,6 +469,7 @@ rte_eal_pci_scan(void)
 
                snprintf(dirname, sizeof(dirname), "%s/%s",
                                pci_get_sysfs_path(), e->d_name);
+
                if (pci_scan_one(dirname, &addr) < 0)
                        goto error;
        }
@@ -709,22 +715,6 @@ rte_eal_pci_ioport_unmap(struct rte_pci_ioport *p)
        return ret;
 }
 
-/* Init the PCI EAL subsystem */
-int
-rte_eal_pci_init(void)
-{
-       /* for debug purposes, PCI can be disabled */
-       if (internal_config.no_pci)
-               return 0;
-
-       if (rte_eal_pci_scan() < 0) {
-               RTE_LOG(ERR, EAL, "%s(): Cannot scan PCI bus\n", __func__);
-               return -1;
-       }
-
-       return 0;
-}
-
 struct rte_pci_bus rte_pci_bus = {
        .bus = {
                .scan = rte_eal_pci_scan,
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map 
b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
index b557e7c..84dfbe7 100644
--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -6,8 +6,6 @@ DPDK_2.0 {
        eal_parse_sysfs_value;
        eal_timer_source;
        lcore_config;
-       pci_device_list;
-       pci_driver_list;
        per_lcore__lcore_id;
        per_lcore__rte_errno;
        rte_calloc;
-- 
2.7.0

Reply via email to