struct pci_driver_list pci_driver_list;
struct pci_device_list pci_device_list;
+#define SYSFS_PCI_DEVICES "/sys/bus/pci/devices"
+
+const char *pci_get_sysfs_path(void)
+{
+ const char *path = NULL;
+
+ path = getenv("SYSFS_PCI_DEVICES");
+ if (path == NULL)
+ return SYSFS_PCI_DEVICES;
+
+ return path;
+}
+
static struct rte_devargs *pci_devargs_lookup(struct rte_pci_device *dev)
{
struct rte_devargs *devargs;
requested_addr);
}
-/* Map pci device */
-static int
-pci_map_device(struct rte_pci_device *dev)
-{
- int ret = -1;
-
- /* try mapping the NIC resources using VFIO if it exists */
- switch (dev->kdrv) {
- case RTE_KDRV_VFIO:
-#ifdef VFIO_PRESENT
- if (pci_vfio_is_enabled())
- ret = pci_vfio_map_resource(dev);
-#endif
- break;
- case RTE_KDRV_IGB_UIO:
- case RTE_KDRV_UIO_GENERIC:
- case RTE_KDRV_NIC_UIO:
- /* map resources for devices that use uio */
- ret = pci_uio_map_resource(dev);
- break;
- default:
- RTE_LOG(DEBUG, EAL, " Not managed by a supported kernel driver,"
- " skipped\n");
- ret = 1;
- break;
- }
-
- return ret;
-}
-
-#ifdef RTE_LIBRTE_EAL_HOTPLUG
-/* Unmap pci device */
-static void
-pci_unmap_device(struct rte_pci_device *dev)
-{
- if (dev == NULL)
- return;
-
- /* try unmapping the NIC resources using VFIO if it exists */
- switch (dev->kdrv) {
- case RTE_KDRV_VFIO:
- RTE_LOG(ERR, EAL, "Hotplug doesn't support vfio yet\n");
- break;
- case RTE_KDRV_IGB_UIO:
- case RTE_KDRV_UIO_GENERIC:
- case RTE_KDRV_NIC_UIO:
- /* unmap resources for devices that use uio */
- pci_uio_unmap_resource(dev);
- break;
- default:
- RTE_LOG(DEBUG, EAL, " Not managed by a supported kernel driver,"
- " skipped\n");
- break;
- }
-}
-#endif /* RTE_LIBRTE_EAL_HOTPLUG */
-
/*
* If vendor/device ID match, call the devinit() function of the
* driver.
struct rte_pci_addr *loc = &dev->addr;
- RTE_LOG(DEBUG, EAL, "PCI device "PCI_PRI_FMT" on NUMA socket %i\n",
+ RTE_LOG(INFO, EAL, "PCI device "PCI_PRI_FMT" on NUMA socket %i\n",
loc->domain, loc->bus, loc->devid, loc->function,
dev->numa_node);
- RTE_LOG(DEBUG, EAL, " probe driver: %x:%x %s\n", dev->id.vendor_id,
- dev->id.device_id, dr->name);
-
/* no initialization when blacklisted, return without error */
if (dev->devargs != NULL &&
dev->devargs->type == RTE_DEVTYPE_BLACKLISTED_PCI) {
return 1;
}
+ RTE_LOG(INFO, EAL, " probe driver: %x:%x %s\n", dev->id.vendor_id,
+ dev->id.device_id, dr->name);
+
if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) {
-#ifdef RTE_PCI_CONFIG
- /*
- * Set PCIe config space for high performance.
- * Return value can be ignored.
- */
- pci_config_space_set(dev);
-#endif
/* map resources for devices that use igb_uio */
- ret = pci_map_device(dev);
+ ret = rte_eal_pci_map_device(dev);
if (ret != 0)
return ret;
} else if (dr->drv_flags & RTE_PCI_DRV_FORCE_UNBIND &&
/* call the driver devinit() function */
return dr->devinit(dr, dev);
}
- /* return positive value if driver is not found */
+ /* return positive value if driver doesn't support this device */
return 1;
}
-#ifdef RTE_LIBRTE_EAL_HOTPLUG
/*
* If vendor/device ID match, call the devuninit() function of the
* driver.
*/
static int
-rte_eal_pci_close_one_driver(struct rte_pci_driver *dr,
+rte_eal_pci_detach_dev(struct rte_pci_driver *dr,
struct rte_pci_device *dev)
{
const struct rte_pci_id *id_table;
RTE_LOG(DEBUG, EAL, " remove driver: %x:%x %s\n", dev->id.vendor_id,
dev->id.device_id, dr->name);
- /* call the driver devuninit() function */
if (dr->devuninit && (dr->devuninit(dev) < 0))
return -1; /* negative value is an error */
if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING)
/* unmap resources for devices that use igb_uio */
- pci_unmap_device(dev);
+ rte_eal_pci_unmap_device(dev);
return 0;
}
- /* return positive value if driver is not found */
+ /* return positive value if driver doesn't support this device */
return 1;
}
-#endif /* RTE_LIBRTE_EAL_HOTPLUG */
/*
* If vendor/device ID match, call the devinit() function of all
/* negative value is an error */
return -1;
if (rc > 0)
- /* positive value means driver not found */
+ /* positive value means driver doesn't support it */
continue;
return 0;
}
return 1;
}
-#ifdef RTE_LIBRTE_EAL_HOTPLUG
/*
* If vendor/device ID match, call the devuninit() function of all
* registered driver for the given device. Return -1 if initialization
* failed, return 1 if no driver is found for this device.
*/
static int
-pci_close_all_drivers(struct rte_pci_device *dev)
+pci_detach_all_drivers(struct rte_pci_device *dev)
{
struct rte_pci_driver *dr = NULL;
int rc = 0;
return -1;
TAILQ_FOREACH(dr, &pci_driver_list, next) {
- rc = rte_eal_pci_close_one_driver(dr, dev);
+ rc = rte_eal_pci_detach_dev(dr, dev);
if (rc < 0)
/* negative value is an error */
return -1;
if (rc > 0)
- /* positive value means driver not found */
+ /* positive value means driver doesn't support it */
continue;
return 0;
}
}
/*
- * Find the pci device specified by pci address, then invoke close function of
- * the driver of the devive.
+ * Detach device specified by its pci address.
*/
int
-rte_eal_pci_close_one(const struct rte_pci_addr *addr)
+rte_eal_pci_detach(const struct rte_pci_addr *addr)
{
struct rte_pci_device *dev = NULL;
int ret = 0;
if (rte_eal_compare_pci_addr(&dev->addr, addr))
continue;
- ret = pci_close_all_drivers(dev);
+ ret = pci_detach_all_drivers(dev);
if (ret < 0)
goto err_return;
dev->addr.devid, dev->addr.function);
return -1;
}
-#endif /* RTE_LIBRTE_EAL_HOTPLUG */
/*
* Scan the content of the PCI bus, and call the devinit() function for