From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 87DCE9A8D for ; Tue, 24 Feb 2015 14:30:51 +0100 (CET) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga101.fm.intel.com with ESMTP; 24 Feb 2015 05:30:49 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.09,638,1418112000"; d="scan'208";a="458917621" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by FMSMGA003.fm.intel.com with ESMTP; 24 Feb 2015 05:15:22 -0800 Received: from sivswdev01.ir.intel.com (sivswdev01.ir.intel.com [10.237.217.45]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id t1ODUlTi021018; Tue, 24 Feb 2015 13:30:48 GMT Received: from sivswdev01.ir.intel.com (localhost [127.0.0.1]) by sivswdev01.ir.intel.com with ESMTP id t1ODUl46019413; Tue, 24 Feb 2015 13:30:47 GMT Received: (from bricha3@localhost) by sivswdev01.ir.intel.com with id t1ODUlka019408; Tue, 24 Feb 2015 13:30:47 GMT From: Bruce Richardson To: dev@dpdk.org Date: Tue, 24 Feb 2015 13:30:45 +0000 Message-Id: <1424784647-19367-2-git-send-email-bruce.richardson@intel.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1424784647-19367-1-git-send-email-bruce.richardson@intel.com> References: <1424703444-30761-1-git-send-email-bruce.richardson@intel.com> <1424784647-19367-1-git-send-email-bruce.richardson@intel.com> Subject: [dpdk-dev] [PATCH v4 1/3] eal: mmap uio resources using resourceX files X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 Feb 2015 13:30:52 -0000 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 9836446..3df07e8 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 0a0853d..03d2b52 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 ff903d2..7dd9ce1 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 0419172..ee9660f 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.1.0