X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=lib%2Flibrte_eal%2Flinuxapp%2Feal%2Feal_pci.c;h=1d5a13b3312f33444bcf15e45dd7e1d0d2d6f6a9;hb=e1d09b00d7d486a6cbe2aaed999382bfc60ce1bf;hp=06bfc1a6f633b248de998622d24cb2f394c98a34;hpb=c0ce0577e84de15b2d3f6301f0b4ce6826900e9b;p=dpdk.git diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c index 06bfc1a6f6..1d5a13b331 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci.c @@ -33,11 +33,9 @@ #include #include -#include #include #include -#include #include #include #include @@ -57,10 +55,8 @@ * IGB_UIO driver (or doesn't initialize, if the device wasn't bound to it). */ -struct mapped_pci_res_list *pci_res_list = NULL; - /* unbind kernel driver for this device */ -static int +int pci_unbind_kernel_driver(struct rte_pci_device *dev) { int n; @@ -145,29 +141,6 @@ pci_find_max_end_va(void) return RTE_PTR_ADD(last->addr, last->len); } - -/* map a particular resource from a file */ -void * -pci_map_resource(void *requested_addr, int fd, off_t offset, size_t size, - int additional_flags) -{ - void *mapaddr; - - /* Map the PCI memory resource of device */ - mapaddr = mmap(requested_addr, size, PROT_READ | PROT_WRITE, - MAP_SHARED | additional_flags, fd, offset); - if (mapaddr == MAP_FAILED) { - RTE_LOG(ERR, EAL, "%s(): cannot mmap(%d, %p, 0x%lx, 0x%lx): %s (%p)\n", - __func__, fd, requested_addr, - (unsigned long)size, (unsigned long)offset, - strerror(errno), mapaddr); - } else { - RTE_LOG(DEBUG, EAL, " PCI memory mapped at %p\n", mapaddr); - } - - return mapaddr; -} - /* parse the "resource" sysfs file */ static int pci_parse_sysfs_resource(const char *filename, struct rte_pci_device *dev) @@ -326,19 +299,19 @@ pci_scan_one(const char *dirname, uint16_t domain, uint8_t bus, ret = pci_get_kernel_driver_by_path(filename, driver); if (!ret) { if (!strcmp(driver, "vfio-pci")) - dev->pt_driver = RTE_PT_VFIO; + dev->kdrv = RTE_KDRV_VFIO; else if (!strcmp(driver, "igb_uio")) - dev->pt_driver = RTE_PT_IGB_UIO; + dev->kdrv = RTE_KDRV_IGB_UIO; else if (!strcmp(driver, "uio_pci_generic")) - dev->pt_driver = RTE_PT_UIO_GENERIC; + dev->kdrv = RTE_KDRV_UIO_GENERIC; else - dev->pt_driver = RTE_PT_UNKNOWN; + dev->kdrv = RTE_KDRV_UNKNOWN; } else if (ret < 0) { RTE_LOG(ERR, EAL, "Fail to get kernel driver\n"); free(dev); return -1; } else - dev->pt_driver = RTE_PT_UNKNOWN; + dev->kdrv = RTE_KDRV_UNKNOWN; /* device is valid, add in list (sorted) */ if (TAILQ_EMPTY(&pci_device_list)) { @@ -356,8 +329,7 @@ pci_scan_one(const char *dirname, uint16_t domain, uint8_t bus, TAILQ_INSERT_BEFORE(dev2, dev, next); return 0; } else { /* already registered */ - /* update pt_driver */ - dev2->pt_driver = dev->pt_driver; + dev2->kdrv = dev->kdrv; dev2->max_vfs = dev->max_vfs; memmove(dev2->mem_resource, dev->mem_resource, @@ -423,8 +395,8 @@ error: * Scan the content of the PCI bus, and the devices in the devices * list */ -static int -pci_scan(void) +int +rte_eal_pci_scan(void) { struct dirent *e; DIR *dir; @@ -550,119 +522,18 @@ pci_config_space_set(struct rte_pci_device *dev) } #endif -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->pt_driver) { - case RTE_PT_VFIO: -#ifdef VFIO_PRESENT - if (pci_vfio_is_enabled()) - ret = pci_vfio_map_resource(dev); -#endif - break; - case RTE_PT_IGB_UIO: - case RTE_PT_UIO_GENERIC: - /* map resources for devices that use uio */ - ret = pci_uio_map_resource(dev); - break; - default: - RTE_LOG(DEBUG, EAL, " Not managed by known pt driver," - " skipped\n"); - ret = 1; - break; - } - - return ret; -} - -/* - * If vendor/device ID match, call the devinit() function of the - * driver. - */ -int -rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *dev) -{ - int ret; - struct rte_pci_id *id_table; - - for (id_table = dr->id_table ; id_table->vendor_id != 0; id_table++) { - - /* check if device's identifiers match the driver's ones */ - if (id_table->vendor_id != dev->id.vendor_id && - id_table->vendor_id != PCI_ANY_ID) - continue; - if (id_table->device_id != dev->id.device_id && - id_table->device_id != PCI_ANY_ID) - continue; - if (id_table->subsystem_vendor_id != dev->id.subsystem_vendor_id && - id_table->subsystem_vendor_id != PCI_ANY_ID) - continue; - if (id_table->subsystem_device_id != dev->id.subsystem_device_id && - id_table->subsystem_device_id != PCI_ANY_ID) - continue; - - struct rte_pci_addr *loc = &dev->addr; - - RTE_LOG(DEBUG, 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) { - RTE_LOG(DEBUG, EAL, " Device is blacklisted, not initializing\n"); - return 1; - } - - 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); - if (ret != 0) - return ret; - } else if (dr->drv_flags & RTE_PCI_DRV_FORCE_UNBIND && - rte_eal_process_type() == RTE_PROC_PRIMARY) { - /* unbind current driver */ - if (pci_unbind_kernel_driver(dev) < 0) - return -1; - } - - /* reference driver structure */ - dev->driver = dr; - - /* call the driver devinit() function */ - return dr->devinit(dr, dev); - } - /* return positive value if driver is not found */ - return 1; -} - /* Init the PCI EAL subsystem */ int rte_eal_pci_init(void) { TAILQ_INIT(&pci_driver_list); TAILQ_INIT(&pci_device_list); - pci_res_list = RTE_TAILQ_RESERVE_BY_IDX(RTE_TAILQ_PCI, - mapped_pci_res_list); /* for debug purposes, PCI can be disabled */ if (internal_config.no_pci) return 0; - if (pci_scan() < 0) { + if (rte_eal_pci_scan() < 0) { RTE_LOG(ERR, EAL, "%s(): Cannot scan PCI bus\n", __func__); return -1; }