pci: use bus driver for scan/probe
Remove EAL initiated direct PCI scan/probe and enable PCI Bus linkage. Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com> Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com> Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com> Reviewed-by: Gaetan Rivet <gaetan.rivet@6wind.com> Acked-by: Stephen Hemminger <stephen@networkplumber.org>
This commit is contained in:
parent
0fd1a0eaae
commit
23d96eb688
@ -602,13 +602,6 @@ rte_eal_init(int argc, char **argv)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rte_eal_pci_init() < 0) {
|
||||
rte_eal_init_alert("Cannot init PCI\n");
|
||||
rte_errno = EPROTO;
|
||||
rte_atomic32_clear(&run_once);
|
||||
return -1;
|
||||
}
|
||||
|
||||
eal_check_mem_on_local_socket();
|
||||
|
||||
if (eal_plugins_init() < 0)
|
||||
@ -667,13 +660,6 @@ rte_eal_init(int argc, char **argv)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Probe & Initialize PCI devices */
|
||||
if (rte_eal_pci_probe()) {
|
||||
rte_eal_init_alert("Cannot probe PCI\n");
|
||||
rte_errno = ENOTSUP;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rte_eal_dev_init() < 0)
|
||||
rte_eal_init_alert("Cannot init pmd devices\n");
|
||||
|
||||
|
@ -315,21 +315,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)) {
|
||||
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 = 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_device_insert(&dev->device);
|
||||
rte_eal_pci_insert_device(dev2, dev);
|
||||
} else { /* already registered */
|
||||
dev2->kdrv = dev->kdrv;
|
||||
dev2->max_vfs = dev->max_vfs;
|
||||
@ -340,8 +338,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
rte_eal_device_insert(&dev->device);
|
||||
TAILQ_INSERT_TAIL(&pci_device_list, dev, next);
|
||||
rte_eal_pci_add_device(dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -369,6 +366,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__);
|
||||
@ -662,18 +663,3 @@ 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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -84,11 +84,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"
|
||||
@ -315,7 +310,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 */
|
||||
@ -336,6 +331,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)
|
||||
@ -347,7 +343,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;
|
||||
|
||||
@ -377,7 +373,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;
|
||||
|
||||
@ -389,7 +385,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;
|
||||
}
|
||||
@ -419,7 +415,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) {
|
||||
probed++;
|
||||
|
||||
/* set devargs in PCI structure */
|
||||
@ -472,7 +468,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);
|
||||
}
|
||||
}
|
||||
@ -481,16 +477,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 */
|
||||
|
@ -109,16 +109,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;
|
||||
|
||||
|
@ -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.
|
||||
*/
|
||||
@ -401,17 +393,14 @@ rte_eal_compare_pci_addr(const struct rte_pci_addr *addr,
|
||||
int rte_eal_pci_scan(void);
|
||||
|
||||
/**
|
||||
* 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
|
||||
|
@ -830,13 +830,6 @@ rte_eal_init(int argc, char **argv)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rte_eal_pci_init() < 0) {
|
||||
rte_eal_init_alert("Cannot init PCI\n");
|
||||
rte_errno = EPROTO;
|
||||
rte_atomic32_clear(&run_once);
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef VFIO_PRESENT
|
||||
if (rte_eal_vfio_setup() < 0) {
|
||||
rte_eal_init_alert("Cannot init VFIO\n");
|
||||
@ -946,13 +939,6 @@ rte_eal_init(int argc, char **argv)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Probe & Initialize PCI devices */
|
||||
if (rte_eal_pci_probe()) {
|
||||
rte_eal_init_alert("Cannot probe PCI\n");
|
||||
rte_errno = ENOTSUP;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rte_eal_dev_init() < 0)
|
||||
rte_eal_init_alert("Cannot init pmd devices\n");
|
||||
|
||||
|
@ -354,21 +354,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;
|
||||
@ -378,8 +376,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;
|
||||
@ -455,6 +453,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",
|
||||
@ -471,6 +473,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;
|
||||
}
|
||||
@ -715,19 +718,3 @@ 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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user