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:
Shreyansh Jain 2017-04-11 13:07:32 +02:00 committed by Thomas Monjalon
parent 0fd1a0eaae
commit 23d96eb688
9 changed files with 35 additions and 119 deletions

View File

@ -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");

View File

@ -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;
}

View File

@ -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;

View File

@ -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 */

View File

@ -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;

View File

@ -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

View File

@ -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");

View File

@ -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;
}

View File

@ -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;