From mboxrd@z Thu Jan 1 00:00:00 1970 From: Santosh Shukla Subject: Re: [PATCH] eal: map io resources for non x86 architectures Date: Wed, 16 Dec 2015 19:21:55 +0530 Message-ID: References: <1450269064-23608-1-git-send-email-david.marchand@6wind.com> <20151216124834.GR29571@yliu-dev.sh.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Cc: dev@dpdk.org To: Yuanhan Liu Return-path: Received: from mail-pf0-f172.google.com (mail-pf0-f172.google.com [209.85.192.172]) by dpdk.org (Postfix) with ESMTP id 3BF8E68A5 for ; Wed, 16 Dec 2015 14:51:56 +0100 (CET) Received: by mail-pf0-f172.google.com with SMTP id e66so12933704pfe.0 for ; Wed, 16 Dec 2015 05:51:56 -0800 (PST) In-Reply-To: <20151216124834.GR29571@yliu-dev.sh.intel.com> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On Wed, Dec 16, 2015 at 6:18 PM, Yuanhan Liu wrote: > On Wed, Dec 16, 2015 at 01:31:04PM +0100, David Marchand wrote: >> x86 requires a special set of instructions to access ioports, but other >> architectures let you remap io resources. >> So let eal remap io resources by accepting IORESOURCE_IO flag for >> architectures other than x86. > > One question: this patch could be a replacement of the igbuio_iomap patch > from Santosh? If so, I like it: It's more elegant. > > --yliu > I did tried similar in past but not in parse_sysfs (such that mem.resource_addr to accept IO_RESOURCE_IO types) and observed that pci_map_resource not able to map address hence segfault at tespmd initialization. i was getting these: EAL: pci_map_resource(): cannot mmap(19, 0x7fa5c00000, 0x20, 0x0): Invalid argument (0xffffffffffffffff) after enabling RTE_PCI_NEED_DRV_MAPPING flags in virtio_ethdev. I guess patch assume that flag enabled for driver right? >> >> Signed-off-by: David Marchand >> --- >> lib/librte_eal/common/include/rte_pci.h | 3 ++- >> lib/librte_eal/linuxapp/eal/eal_pci.c | 21 +++++++++++++++------ >> 2 files changed, 17 insertions(+), 7 deletions(-) >> >> diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h >> index 334c12e..8aaab4a 100644 >> --- a/lib/librte_eal/common/include/rte_pci.h >> +++ b/lib/librte_eal/common/include/rte_pci.h >> @@ -105,7 +105,8 @@ extern struct pci_device_list pci_device_list; /**< Global list of PCI devices. >> /** Nb. of values in PCI resource format. */ >> #define PCI_RESOURCE_FMT_NVAL 3 >> >> -/** IO resource type: memory address space */ >> +/** IO resource type: */ >> +#define IORESOURCE_IO 0x00000100 >> #define IORESOURCE_MEM 0x00000200 >> >> /** >> diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c >> index bc5b5be..9c4651d 100644 >> --- a/lib/librte_eal/linuxapp/eal/eal_pci.c >> +++ b/lib/librte_eal/linuxapp/eal/eal_pci.c >> @@ -236,12 +236,21 @@ pci_parse_sysfs_resource(const char *filename, struct rte_pci_device *dev) >> goto error; >> } >> >> - if (flags & IORESOURCE_MEM) { >> - dev->mem_resource[i].phys_addr = phys_addr; >> - dev->mem_resource[i].len = end_addr - phys_addr + 1; >> - /* not mapped for now */ >> - dev->mem_resource[i].addr = NULL; >> - } >> + /* we only care about IORESOURCE_IO or IORESOURCE_MEM */ >> + if (!(flags & IORESOURCE_IO) && >> + !(flags & IORESOURCE_MEM)) >> + continue; >> + >> +#if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686) >> + /* x86 can not remap ioports, so skip it, remapping code will >> + * look at dev->mem_resource[i].phys_addr == 0 and skip it */ >> + if (flags & IORESOURCE_IO) >> + continue; >> +#endif >> + dev->mem_resource[i].phys_addr = phys_addr; >> + dev->mem_resource[i].len = end_addr - phys_addr + 1; >> + /* not mapped for now */ >> + dev->mem_resource[i].addr = NULL; >> } >> fclose(f); >> return 0; >> -- >> 1.7.10.4