vfio/platform: Use vfio_init/register/unregister_group_dev
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 30 Mar 2021 15:53:06 +0000 (09:53 -0600)
committerAlex Williamson <alex.williamson@redhat.com>
Tue, 6 Apr 2021 17:55:10 +0000 (11:55 -0600)
platform already allocates a struct vfio_platform_device with exactly
the same lifetime as vfio_device, switch to the new API and embed
vfio_device in vfio_platform_device.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Acked-by: Eric Auger <eric.auger@redhat.com>
Tested-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Message-Id: <4-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/platform/vfio_amba.c
drivers/vfio/platform/vfio_platform.c
drivers/vfio/platform/vfio_platform_common.c
drivers/vfio/platform/vfio_platform_private.h

index 3626c21..f970eb2 100644 (file)
@@ -66,16 +66,18 @@ static int vfio_amba_probe(struct amba_device *adev, const struct amba_id *id)
        if (ret) {
                kfree(vdev->name);
                kfree(vdev);
+               return ret;
        }
 
-       return ret;
+       dev_set_drvdata(&adev->dev, vdev);
+       return 0;
 }
 
 static void vfio_amba_remove(struct amba_device *adev)
 {
-       struct vfio_platform_device *vdev =
-               vfio_platform_remove_common(&adev->dev);
+       struct vfio_platform_device *vdev = dev_get_drvdata(&adev->dev);
 
+       vfio_platform_remove_common(vdev);
        kfree(vdev->name);
        kfree(vdev);
 }
index 9fb6818..e402779 100644 (file)
@@ -54,23 +54,21 @@ static int vfio_platform_probe(struct platform_device *pdev)
        vdev->reset_required = reset_required;
 
        ret = vfio_platform_probe_common(vdev, &pdev->dev);
-       if (ret)
+       if (ret) {
                kfree(vdev);
-
-       return ret;
+               return ret;
+       }
+       dev_set_drvdata(&pdev->dev, vdev);
+       return 0;
 }
 
 static int vfio_platform_remove(struct platform_device *pdev)
 {
-       struct vfio_platform_device *vdev;
-
-       vdev = vfio_platform_remove_common(&pdev->dev);
-       if (vdev) {
-               kfree(vdev);
-               return 0;
-       }
+       struct vfio_platform_device *vdev = dev_get_drvdata(&pdev->dev);
 
-       return -EINVAL;
+       vfio_platform_remove_common(vdev);
+       kfree(vdev);
+       return 0;
 }
 
 static struct platform_driver vfio_platform_driver = {
index fb4b385..6eb7492 100644 (file)
@@ -659,8 +659,7 @@ int vfio_platform_probe_common(struct vfio_platform_device *vdev,
        struct iommu_group *group;
        int ret;
 
-       if (!vdev)
-               return -EINVAL;
+       vfio_init_group_dev(&vdev->vdev, dev, &vfio_platform_ops, vdev);
 
        ret = vfio_platform_acpi_probe(vdev, dev);
        if (ret)
@@ -685,13 +684,13 @@ int vfio_platform_probe_common(struct vfio_platform_device *vdev,
                goto put_reset;
        }
 
-       ret = vfio_add_group_dev(dev, &vfio_platform_ops, vdev);
+       ret = vfio_register_group_dev(&vdev->vdev);
        if (ret)
                goto put_iommu;
 
        mutex_init(&vdev->igate);
 
-       pm_runtime_enable(vdev->device);
+       pm_runtime_enable(dev);
        return 0;
 
 put_iommu:
@@ -702,19 +701,13 @@ put_reset:
 }
 EXPORT_SYMBOL_GPL(vfio_platform_probe_common);
 
-struct vfio_platform_device *vfio_platform_remove_common(struct device *dev)
+void vfio_platform_remove_common(struct vfio_platform_device *vdev)
 {
-       struct vfio_platform_device *vdev;
-
-       vdev = vfio_del_group_dev(dev);
+       vfio_unregister_group_dev(&vdev->vdev);
 
-       if (vdev) {
-               pm_runtime_disable(vdev->device);
-               vfio_platform_put_reset(vdev);
-               vfio_iommu_group_put(dev->iommu_group, dev);
-       }
-
-       return vdev;
+       pm_runtime_disable(vdev->device);
+       vfio_platform_put_reset(vdev);
+       vfio_iommu_group_put(vdev->vdev.dev->iommu_group, vdev->vdev.dev);
 }
 EXPORT_SYMBOL_GPL(vfio_platform_remove_common);
 
index 2890899..a5ba82c 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <linux/types.h>
 #include <linux/interrupt.h>
+#include <linux/vfio.h>
 
 #define VFIO_PLATFORM_OFFSET_SHIFT   40
 #define VFIO_PLATFORM_OFFSET_MASK (((u64)(1) << VFIO_PLATFORM_OFFSET_SHIFT) - 1)
@@ -42,6 +43,7 @@ struct vfio_platform_region {
 };
 
 struct vfio_platform_device {
+       struct vfio_device              vdev;
        struct vfio_platform_region     *regions;
        u32                             num_regions;
        struct vfio_platform_irq        *irqs;
@@ -80,8 +82,7 @@ struct vfio_platform_reset_node {
 
 extern int vfio_platform_probe_common(struct vfio_platform_device *vdev,
                                      struct device *dev);
-extern struct vfio_platform_device *vfio_platform_remove_common
-                                    (struct device *dev);
+void vfio_platform_remove_common(struct vfio_platform_device *vdev);
 
 extern int vfio_platform_irq_init(struct vfio_platform_device *vdev);
 extern void vfio_platform_irq_cleanup(struct vfio_platform_device *vdev);