]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
vfio/fsl-mc: Add support for device reset
authorDiana Craciun <diana.craciun@oss.nxp.com>
Mon, 5 Oct 2020 17:36:54 +0000 (20:36 +0300)
committerAlex Williamson <alex.williamson@redhat.com>
Mon, 12 Oct 2020 17:33:48 +0000 (11:33 -0600)
Currently only resetting the DPRC container is supported which
will reset all the objects inside it. Resetting individual
objects is possible from the userspace by issueing commands
towards MC firmware.

Signed-off-by: Diana Craciun <diana.craciun@oss.nxp.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/fsl-mc/vfio_fsl_mc.c

index d95568cd8021302314257885bb8890fa8e0c52aa..d009f873578c0161581441637592b8f1081aba23 100644 (file)
@@ -217,6 +217,10 @@ static long vfio_fsl_mc_ioctl(void *device_data, unsigned int cmd,
                        return -EINVAL;
 
                info.flags = VFIO_DEVICE_FLAGS_FSL_MC;
+
+               if (is_fsl_mc_bus_dprc(mc_dev))
+                       info.flags |= VFIO_DEVICE_FLAGS_RESET;
+
                info.num_regions = mc_dev->obj_desc.region_count;
                info.num_irqs = mc_dev->obj_desc.irq_count;
 
@@ -299,7 +303,19 @@ static long vfio_fsl_mc_ioctl(void *device_data, unsigned int cmd,
        }
        case VFIO_DEVICE_RESET:
        {
-               return -ENOTTY;
+               int ret;
+               struct fsl_mc_device *mc_dev = vdev->mc_dev;
+
+               /* reset is supported only for the DPRC */
+               if (!is_fsl_mc_bus_dprc(mc_dev))
+                       return -ENOTTY;
+
+               ret = dprc_reset_container(mc_dev->mc_io, 0,
+                                          mc_dev->mc_handle,
+                                          mc_dev->obj_desc.id,
+                                          DPRC_RESET_OPTION_NON_RECURSIVE);
+               return ret;
+
        }
        default:
                return -ENOTTY;