X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Fbsdapp%2Feal%2Feal_pci.c;h=5457a21b6cb624324c0baf54848a1da32be476c0;hb=ff708facfcbf42f3dcb3c62d82ecd93e7b8c2506;hp=03200f3c43793c2c9ed136ec0b2033e13fa49082;hpb=6bf883260d0d00fd2351a2d24c7f86f69f8850fe;p=dpdk.git diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c b/lib/librte_eal/bsdapp/eal/eal_pci.c index 03200f3c43..5457a21b6c 100644 --- a/lib/librte_eal/bsdapp/eal/eal_pci.c +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c @@ -58,7 +58,6 @@ #include #include #include -#include #include #include #include @@ -156,10 +155,6 @@ fail: return NULL; } -#ifndef OFF_MAX -#define OFF_MAX ((uint64_t)(off_t)-1) -#endif - static int pci_uio_map_secondary(struct rte_pci_device *dev) { @@ -187,7 +182,7 @@ pci_uio_map_secondary(struct rte_pci_device *dev) } RTE_LOG(ERR, EAL, "Cannot find resource for device\n"); - return -1; + return 1; } /* map the PCI resource of a PCI device in virtual memory */ @@ -211,7 +206,7 @@ pci_uio_map_resource(struct rte_pci_device *dev) if (rte_eal_process_type() != RTE_PROC_PRIMARY) return (pci_uio_map_secondary(dev)); - rte_snprintf(devname, sizeof(devname), "/dev/uio@pci:%u:%u:%u", + snprintf(devname, sizeof(devname), "/dev/uio@pci:%u:%u:%u", dev->addr.bus, dev->addr.devid, dev->addr.function); if (access(devname, O_RDWR) < 0) { @@ -236,7 +231,7 @@ pci_uio_map_resource(struct rte_pci_device *dev) return (-1); } - rte_snprintf(uio_res->path, sizeof(uio_res->path), "%s", devname); + snprintf(uio_res->path, sizeof(uio_res->path), "%s", devname); memcpy(&uio_res->pci_addr, &dev->addr, sizeof(uio_res->pci_addr)); @@ -274,23 +269,6 @@ pci_uio_map_resource(struct rte_pci_device *dev) return (0); } -/* parse the "resource" sysfs file */ -#define IORESOURCE_MEM 0x00000200 - -/* Compare two PCI device addresses. */ -static int -pci_addr_comparison(struct rte_pci_addr *addr, struct rte_pci_addr *addr2) -{ - uint64_t dev_addr = (addr->domain << 24) + (addr->bus << 16) + (addr->devid << 8) + addr->function; - uint64_t dev_addr2 = (addr2->domain << 24) + (addr2->bus << 16) + (addr2->devid << 8) + addr2->function; - - if (dev_addr > dev_addr2) - return 1; - else - return 0; -} - - /* Scan one pci sysfs entry, and fill the devices list from it. */ static int pci_scan_one(int dev_pci_fd, struct pci_conf *conf) @@ -363,13 +341,24 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf) } else { struct rte_pci_device *dev2 = NULL; + int ret; TAILQ_FOREACH(dev2, &pci_device_list, next) { - if (pci_addr_comparison(&dev->addr, &dev2->addr)) + ret = rte_eal_compare_pci_addr(&dev->addr, &dev2->addr); + if (ret > 0) continue; - else { + else if (ret < 0) { TAILQ_INSERT_BEFORE(dev2, dev, next); return 0; + } else { /* already registered */ + /* update pt_driver */ + dev2->pt_driver = dev->pt_driver; + dev2->max_vfs = dev->max_vfs; + memmove(dev2->mem_resource, + dev->mem_resource, + sizeof(dev->mem_resource)); + free(dev); + return 0; } } TAILQ_INSERT_TAIL(&pci_device_list, dev, next); @@ -389,7 +378,7 @@ skipdev: static int pci_scan(void) { - int fd = -1; + int fd; unsigned dev_count = 0; struct pci_conf matches[16]; struct pci_conf_io conf_io = { @@ -475,7 +464,7 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d return 0; } - if (dr->drv_flags & RTE_PCI_DRV_NEED_IGB_UIO) { + if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { /* map resources for devices that use igb_uio */ ret = pci_uio_map_resource(dev); if (ret != 0) @@ -503,7 +492,7 @@ rte_eal_pci_init(void) { TAILQ_INIT(&pci_driver_list); TAILQ_INIT(&pci_device_list); - uio_res_list = RTE_TAILQ_RESERVE_BY_IDX(RTE_TAILQ_PCI, uio_res_list); + uio_res_list = RTE_TAILQ_LOOKUP_BY_IDX(RTE_TAILQ_PCI, uio_res_list); /* for debug purposes, PCI can be disabled */ if (internal_config.no_pci)