mempool/dpaa2: support saving context of buffer pool
[dpdk.git] / drivers / bus / fslmc / fslmc_vfio.c
index 26167f1..98768a4 100644 (file)
@@ -176,7 +176,7 @@ static int vfio_map_irq_region(struct fslmc_vfio_group *group)
        vaddr = (unsigned long *)mmap(NULL, 0x1000, PROT_WRITE |
                PROT_READ, MAP_SHARED, container_device_fd, 0x6030000);
        if (vaddr == MAP_FAILED) {
-               DPAA2_BUS_ERR("Unable to map region (errno = %d)", errno);
+               DPAA2_BUS_INFO("Unable to map region (errno = %d)", errno);
                return -errno;
        }
 
@@ -221,6 +221,13 @@ fslmc_memevent_cb(enum rte_mem_event type, const void *addr, size_t len,
                                        "alloc" : "dealloc",
                                va, virt_addr, iova_addr, map_len);
 
+               /* iova_addr may be set to RTE_BAD_IOVA */
+               if (iova_addr == RTE_BAD_IOVA) {
+                       DPAA2_BUS_DEBUG("Segment has invalid iova, skipping\n");
+                       cur_len += map_len;
+                       continue;
+               }
+
                if (type == RTE_MEM_EVENT_ALLOC)
                        ret = fslmc_map_dma(virt_addr, iova_addr, map_len);
                else
@@ -318,11 +325,15 @@ fslmc_unmap_dma(uint64_t vaddr, uint64_t iovaddr __rte_unused, size_t len)
 
 static int
 fslmc_dmamap_seg(const struct rte_memseg_list *msl __rte_unused,
-                const struct rte_memseg *ms, void *arg)
+               const struct rte_memseg *ms, void *arg)
 {
        int *n_segs = arg;
        int ret;
 
+       /* if IOVA address is invalid, skip */
+       if (ms->iova == RTE_BAD_IOVA)
+               return 0;
+
        ret = fslmc_map_dma(ms->addr_64, ms->iova, ms->len);
        if (ret)
                DPAA2_BUS_ERR("Unable to VFIO map (addr=%p, len=%zu)",
@@ -549,6 +560,7 @@ fslmc_process_iodevices(struct rte_dpaa2_device *dev)
        case DPAA2_IO:
        case DPAA2_CI:
        case DPAA2_BPOOL:
+       case DPAA2_MUX:
                TAILQ_FOREACH(object, &dpaa2_obj_list, next) {
                        if (dev->dev_type == object->dev_type)
                                object->create(dev_fd, &device_info,
@@ -665,9 +677,6 @@ fslmc_vfio_process_group(void)
        }
 
        TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, dev_temp) {
-               if (!dev)
-                       break;
-
                switch (dev->dev_type) {
                case DPAA2_ETH:
                case DPAA2_CRYPTO:
@@ -683,6 +692,7 @@ fslmc_vfio_process_group(void)
                case DPAA2_IO:
                case DPAA2_CI:
                case DPAA2_BPOOL:
+               case DPAA2_MUX:
                        /* Call the object creation routine and remove the
                         * device entry from device list
                         */