mempool/dpaa2: map external memory with VFIO
authorSachin Saxena <sachin.saxena@nxp.com>
Mon, 15 Jul 2019 08:44:42 +0000 (14:14 +0530)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 15 Jul 2019 21:52:04 +0000 (23:52 +0200)
This patch help in adding a routine to help memory map
the user provided memory via VFIO.

Signed-off-by: Sachin Saxena <sachin.saxena@nxp.com>
drivers/bus/fslmc/fslmc_vfio.c
drivers/bus/fslmc/fslmc_vfio.h
drivers/bus/fslmc/rte_bus_fslmc_version.map
drivers/mempool/dpaa2/dpaa2_hw_mempool.c

index 1383af4..247b2a4 100644 (file)
@@ -358,6 +358,45 @@ fslmc_dmamap_seg(const struct rte_memseg_list *msl __rte_unused,
        return ret;
 }
 
+int
+rte_fslmc_vfio_mem_dmamap(uint64_t vaddr, uint64_t iova, uint64_t size)
+{
+       int ret;
+       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,
+       };
+
+       if (fslmc_iommu_type == RTE_VFIO_NOIOMMU) {
+               DPAA2_BUS_DEBUG("Running in NOIOMMU mode");
+               return 0;
+       }
+
+       /* SET DMA MAP for IOMMU */
+       group = &vfio_group;
+       if (!group->container) {
+               DPAA2_BUS_ERR("Container is not connected");
+               return -1;
+       }
+
+       dma_map.size = size;
+       dma_map.vaddr = vaddr;
+       dma_map.iova = iova;
+
+       DPAA2_BUS_DEBUG("VFIO dmamap 0x%llx:0x%llx, size 0x%llx\n",
+                       dma_map.vaddr, dma_map.iova, dma_map.size);
+       ret = ioctl(group->container->fd, VFIO_IOMMU_MAP_DMA,
+                   &dma_map);
+       if (ret) {
+               printf("Unable to map DMA address (errno = %d)\n",
+                       errno);
+               return ret;
+       }
+
+       return 0;
+}
+
 int rte_fslmc_vfio_dmamap(void)
 {
        int i = 0, ret;
index 9e2c4fe..e877255 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
  *   Copyright (c) 2015-2016 Freescale Semiconductor, Inc. All rights reserved.
- *   Copyright 2016 NXP
+ *   Copyright 2016,2019 NXP
  *
  */
 
@@ -50,5 +50,7 @@ int fslmc_vfio_process_group(void);
 char *fslmc_get_container(void);
 int fslmc_get_container_group(int *gropuid);
 int rte_fslmc_vfio_dmamap(void);
+__rte_experimental
+int rte_fslmc_vfio_mem_dmamap(uint64_t vaddr, uint64_t iova, uint64_t size);
 
 #endif /* _FSLMC_VFIO_H_ */
index e860073..4da7872 100644 (file)
@@ -141,3 +141,9 @@ DPDK_19.05 {
        qbman_result_eqresp_set_rspid;
        qbman_swp_enqueue_multiple_fd;
 } DPDK_18.11;
+
+EXPERIMENTAL {
+       global:
+
+       rte_fslmc_vfio_mem_dmamap;
+};
index da66577..f26c30b 100644 (file)
@@ -23,6 +23,7 @@
 #include <rte_dev.h>
 #include "rte_dpaa2_mempool.h"
 
+#include "fslmc_vfio.h"
 #include <fslmc_logs.h>
 #include <mc/fsl_dpbp.h>
 #include <portal/dpaa2_hw_pvt.h>
@@ -405,6 +406,18 @@ dpaa2_populate(struct rte_mempool *mp, unsigned int max_objs,
              void *vaddr, rte_iova_t paddr, size_t len,
              rte_mempool_populate_obj_cb_t *obj_cb, void *obj_cb_arg)
 {
+       struct rte_memseg_list *msl;
+       /* The memsegment list exists incase the memory is not external.
+        * So, DMA-Map is required only when memory is provided by user,
+        * i.e. External.
+        */
+       msl = rte_mem_virt2memseg_list(vaddr);
+
+       if (!msl) {
+               DPAA2_MEMPOOL_DEBUG("Memsegment is External.\n");
+               rte_fslmc_vfio_mem_dmamap((size_t)vaddr,
+                               (size_t)paddr, (size_t)len);
+       }
        /* Insert entry into the PA->VA Table */
        dpaax_iova_table_update(paddr, vaddr, len);