dma/idxd: fix error code for PCI device commands
[dpdk.git] / drivers / bus / fslmc / fslmc_vfio.c
index b4704ee..3d4e71a 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
  *   Copyright (c) 2015-2016 Freescale Semiconductor, Inc. All rights reserved.
- *   Copyright 2016-2019 NXP
+ *   Copyright 2016-2021 NXP
  *
  */
 
@@ -728,6 +728,7 @@ fslmc_process_iodevices(struct rte_dpaa2_device *dev)
        case DPAA2_BPOOL:
        case DPAA2_DPRTC:
        case DPAA2_MUX:
+       case DPAA2_DPRC:
                TAILQ_FOREACH(object, &dpaa2_obj_list, next) {
                        if (dev->dev_type == object->dev_type)
                                object->create(dev_fd, &device_info,
@@ -881,6 +882,21 @@ fslmc_vfio_process_group(void)
                return -1;
        }
 
+       /* Search for DPRC device next as it updates endpoint of
+        * other devices.
+        */
+       current_device = 0;
+       RTE_TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, dev_temp) {
+               if (dev->dev_type == DPAA2_DPRC) {
+                       ret = fslmc_process_iodevices(dev);
+                       if (ret) {
+                               DPAA2_BUS_ERR("Unable to process dprc");
+                               return -1;
+                       }
+                       TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+               }
+       }
+
        current_device = 0;
        RTE_TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next,
                dev_temp) {
@@ -979,6 +995,7 @@ fslmc_vfio_setup_group(void)
 {
        int groupid;
        int ret;
+       int vfio_container_fd;
        struct vfio_group_status status = { .argsz = sizeof(status) };
 
        /* if already done once */
@@ -997,8 +1014,15 @@ fslmc_vfio_setup_group(void)
                return 0;
        }
 
+       ret = rte_vfio_container_create();
+       if (ret < 0) {
+               DPAA2_BUS_ERR("Failed to open VFIO container");
+               return ret;
+       }
+       vfio_container_fd = ret;
+
        /* Get the actual group fd */
-       ret = rte_vfio_get_group_fd(groupid);
+       ret = rte_vfio_container_group_bind(vfio_container_fd, groupid);
        if (ret < 0)
                return ret;
        vfio_group.fd = ret;