Instead of distinguishing the BAR mappings via offset within a single file, originally /dev/uioX, switch to mapping each individual bar via the appropriately numbered resourceX file.
Signed-off-by: Bruce Richardson <bruce.richardson at intel.com> --- lib/librte_eal/common/include/rte_pci.h | 2 +- lib/librte_eal/linuxapp/eal/eal_pci_init.h | 1 + lib/librte_eal/linuxapp/eal/eal_pci_uio.c | 34 ++++++++++++++++-------------- lib/librte_eal/linuxapp/eal/eal_pci_vfio.c | 1 + 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h index 4301c16..e34b139 100644 --- a/lib/librte_eal/common/include/rte_pci.h +++ b/lib/librte_eal/common/include/rte_pci.h @@ -117,7 +117,7 @@ struct rte_pci_resource { }; /** Maximum number of PCI resources. */ -#define PCI_MAX_RESOURCE 7 +#define PCI_MAX_RESOURCE 6 /** * A structure describing an ID for a PCI driver. Each driver provides a diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_init.h b/lib/librte_eal/linuxapp/eal/eal_pci_init.h index 1070eb8..2125d7b 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci_init.h +++ b/lib/librte_eal/linuxapp/eal/eal_pci_init.h @@ -38,6 +38,7 @@ struct pci_map { void *addr; + char *path; uint64_t offset; uint64_t size; uint64_t phaddr; diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c index 2b16fcb..ecf385a 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci_uio.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci_uio.c @@ -137,10 +137,10 @@ pci_uio_map_secondary(struct rte_pci_device *dev) /* * open devname, to mmap it */ - fd = open(uio_res->path, O_RDWR); + fd = open(uio_res->maps[i].path, O_RDWR); if (fd < 0) { RTE_LOG(ERR, EAL, "Cannot open %s: %s\n", - uio_res->path, strerror(errno)); + uio_res->maps[i].path, strerror(errno)); return -1; } @@ -149,7 +149,8 @@ pci_uio_map_secondary(struct rte_pci_device *dev) (size_t)uio_res->maps[i].size) != uio_res->maps[i].addr) { RTE_LOG(ERR, EAL, - "Cannot mmap device resource\n"); + "Cannot mmap device resource file: %s\n", + uio_res->maps[i].path); close(fd); return -1; } @@ -294,8 +295,6 @@ pci_uio_map_resource(struct rte_pci_device *dev) void *mapaddr; int uio_num; uint64_t phaddr; - uint64_t offset; - uint64_t pagesz; int nb_maps; struct rte_pci_addr *loc = &dev->addr; struct mapped_pci_resource *uio_res; @@ -336,11 +335,6 @@ pci_uio_map_resource(struct rte_pci_device *dev) return -1; } - /* update devname for mmap */ - snprintf(devname, sizeof(devname), - SYSFS_PCI_DEVICES "/" PCI_PRI_FMT "/resource%d", - loc->domain, loc->bus, loc->devid, loc->function, 0); - /* set bus master that is not done by uio_pci_generic */ if (rte_eal_process_type() == RTE_PROC_PRIMARY) { if (pci_uio_set_bus_master(dev->intr_handle.uio_cfg_fd)) { @@ -370,8 +364,6 @@ pci_uio_map_resource(struct rte_pci_device *dev) uio_res->nb_maps = nb_maps; /* Map all BARs */ - pagesz = sysconf(_SC_PAGESIZE); - maps = uio_res->maps; for (i = 0; i != PCI_MAX_RESOURCE; i++) { int fd; @@ -389,10 +381,15 @@ pci_uio_map_resource(struct rte_pci_device *dev) /* if matching map is found, then use it */ if (j != nb_maps) { int fail = 0; - offset = j * pagesz; + + /* update devname for mmap */ + snprintf(devname, sizeof(devname), + SYSFS_PCI_DEVICES "/" PCI_PRI_FMT "/resource%d", + loc->domain, loc->bus, loc->devid, loc->function, + i); /* - * open devname, to mmap it + * open resource file, to mmap it */ fd = open(devname, O_RDWR); if (fd < 0) { @@ -408,7 +405,7 @@ pci_uio_map_resource(struct rte_pci_device *dev) if (pci_map_addr == NULL) pci_map_addr = pci_find_max_end_va(); - mapaddr = pci_map_resource(pci_map_addr, fd, (off_t)offset, + mapaddr = pci_map_resource(pci_map_addr, fd, 0, (size_t)maps[j].size); if (mapaddr == MAP_FAILED) fail = 1; @@ -416,6 +413,10 @@ pci_uio_map_resource(struct rte_pci_device *dev) pci_map_addr = RTE_PTR_ADD(mapaddr, (size_t) maps[j].size); } + maps[j].path = rte_malloc(NULL, strlen(devname) + 1, 0); + if (maps[j].path == NULL) + fail = 1; + if (fail) { rte_free(uio_res); close(fd); @@ -424,7 +425,8 @@ pci_uio_map_resource(struct rte_pci_device *dev) close(fd); maps[j].addr = mapaddr; - maps[j].offset = offset; + maps[j].offset = 0; + strcpy(maps[j].path, devname); dev->mem_resource[i].addr = mapaddr; } } diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c index 20e0977..7a57d0f 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c @@ -751,6 +751,7 @@ pci_vfio_map_resource(struct rte_pci_device *dev) maps[i].addr = bar_addr; maps[i].offset = reg.offset; maps[i].size = reg.size; + maps[i].path = NULL; /* vfio doesn't have per-resource paths */ dev->mem_resource[i].addr = bar_addr; } -- 2.1.0