From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id D51AC1B68B for ; Sun, 8 Apr 2018 22:18:55 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 Apr 2018 13:18:53 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,424,1517904000"; d="scan'208";a="214970684" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by orsmga005.jf.intel.com with ESMTP; 08 Apr 2018 13:18:49 -0700 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 w38KInEJ021145; Sun, 8 Apr 2018 21:18:49 +0100 Received: from sivswdev01.ir.intel.com (localhost [127.0.0.1]) by sivswdev01.ir.intel.com with ESMTP id w38KImpc011066; Sun, 8 Apr 2018 21:18:48 +0100 Received: (from aburakov@localhost) by sivswdev01.ir.intel.com with LOCAL id w38KImOi011062; Sun, 8 Apr 2018 21:18:48 +0100 From: Anatoly Burakov To: dev@dpdk.org Cc: Hemant Agrawal , Shreyansh Jain , keith.wiles@intel.com, jianfeng.tan@intel.com, andras.kovacs@ericsson.com, laszlo.vadkeri@ericsson.com, benjamin.walker@intel.com, bruce.richardson@intel.com, thomas@monjalon.net, konstantin.ananyev@intel.com, kuralamudhan.ramakrishnan@intel.com, louise.m.daly@intel.com, nelio.laranjeiro@6wind.com, yskoh@mellanox.com, pepperjo@japf.ch, jerin.jacob@caviumnetworks.com, olivier.matz@6wind.com, gowrishankar.m@linux.vnet.ibm.com Date: Sun, 8 Apr 2018 21:17:59 +0100 Message-Id: X-Mailer: git-send-email 1.7.0.7 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v4 26/70] bus/fslmc: use memseg walk instead of iteration X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 08 Apr 2018 20:18:57 -0000 Reduce dependency on internal details of EAL memory subsystem, and simplify code. Signed-off-by: Anatoly Burakov Acked-by: Shreyansh Jain --- drivers/bus/fslmc/fslmc_vfio.c | 78 ++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c index 4291871..0c048dc 100644 --- a/drivers/bus/fslmc/fslmc_vfio.c +++ b/drivers/bus/fslmc/fslmc_vfio.c @@ -189,17 +189,51 @@ static int vfio_map_irq_region(struct fslmc_vfio_group *group) return -errno; } -int rte_fslmc_vfio_dmamap(void) +static int +fslmc_vfio_map(const struct rte_memseg *ms, void *arg) { - int ret; + int *n_segs = arg; struct fslmc_vfio_group *group; struct vfio_iommu_type1_dma_map dma_map = { .argsz = sizeof(struct vfio_iommu_type1_dma_map), .flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE, }; + int ret; + + dma_map.size = ms->len; + dma_map.vaddr = ms->addr_64; +#ifdef RTE_LIBRTE_DPAA2_USE_PHYS_IOVA + dma_map.iova = ms->iova; +#else + dma_map.iova = dma_map.vaddr; +#endif + + /* SET DMA MAP for IOMMU */ + group = &vfio_group; + + if (!group->container) { + DPAA2_BUS_ERR("Container is not connected "); + return -1; + } + + DPAA2_BUS_DEBUG("-->Initial SHM Virtual ADDR %llX", + dma_map.vaddr); + DPAA2_BUS_DEBUG("-----> DMA size 0x%llX", dma_map.size); + ret = ioctl(group->container->fd, VFIO_IOMMU_MAP_DMA, + &dma_map); + if (ret) { + DPAA2_BUS_ERR("VFIO_IOMMU_MAP_DMA API(errno = %d)", + errno); + return -1; + } + (*n_segs)++; + return 0; +} - int i; +int rte_fslmc_vfio_dmamap(void) +{ const struct rte_memseg *memseg; + int i = 0; if (is_dma_done) return 0; @@ -210,51 +244,21 @@ int rte_fslmc_vfio_dmamap(void) return -ENODEV; } - for (i = 0; i < RTE_MAX_MEMSEG; i++) { - if (memseg[i].addr == NULL && memseg[i].len == 0) { - DPAA2_BUS_DEBUG("Total %d segments found", i); - break; - } - - dma_map.size = memseg[i].len; - dma_map.vaddr = memseg[i].addr_64; -#ifdef RTE_LIBRTE_DPAA2_USE_PHYS_IOVA - dma_map.iova = memseg[i].iova; -#else - dma_map.iova = dma_map.vaddr; -#endif - - /* SET DMA MAP for IOMMU */ - group = &vfio_group; - - if (!group->container) { - DPAA2_BUS_ERR("Container is not connected"); - return -1; - } - - DPAA2_BUS_DEBUG("-->Initial SHM Virtual ADDR %llX", - dma_map.vaddr); - DPAA2_BUS_DEBUG("-----> DMA size 0x%llX", dma_map.size); - ret = ioctl(group->container->fd, VFIO_IOMMU_MAP_DMA, - &dma_map); - if (ret) { - DPAA2_BUS_ERR("Unable to map DMA address (errno = %d)", - errno); - return ret; - } - } + if (rte_memseg_walk(fslmc_vfio_map, &i) < 0) + return -1; /* Verifying that at least single segment is available */ if (i <= 0) { DPAA2_BUS_ERR("No Segments found for VFIO Mapping"); return -1; } + DPAA2_BUS_DEBUG("Total %d segments found.", i); /* TODO - This is a W.A. as VFIO currently does not add the mapping of * the interrupt region to SMMU. This should be removed once the * support is added in the Kernel. */ - vfio_map_irq_region(group); + vfio_map_irq_region(&vfio_group); is_dma_done = 1; -- 2.7.4