From 9e67561acd1a10ec41fffe5ca512a6376de96369 Mon Sep 17 00:00:00 2001 From: Bruce Richardson Date: Tue, 24 Feb 2015 13:30:45 +0000 Subject: [PATCH] eal/linux: mmap uio resources using resourceX files 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 Acked-by: David Marchand --- 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 98364463f8..3df07e8e8a 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 0a0853d4c4..03d2b527ba 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 ff903d287e..7dd9ce12d0 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, 0) != 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, 0); 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 041917231f..ee9660f3cb 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c @@ -829,6 +829,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.20.1