Commit cb616458 authored by Jason Gunthorpe's avatar Jason Gunthorpe Committed by Alex Williamson
Browse files

vfio/platform: Use vfio_init/register/unregister_group_dev



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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
Acked-by: default avatarEric Auger <eric.auger@redhat.com>
Tested-by: default avatarEric Auger <eric.auger@redhat.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Message-Id: <4-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com>
Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent 0bfc6a4e
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -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);
}
+9 −11
Original line number Diff line number Diff line
@@ -54,25 +54,23 @@ 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;
	}
	dev_set_drvdata(&pdev->dev, vdev);
	return 0;
}

static int vfio_platform_remove(struct platform_device *pdev)
{
	struct vfio_platform_device *vdev;
	struct vfio_platform_device *vdev = dev_get_drvdata(&pdev->dev);

	vdev = vfio_platform_remove_common(&pdev->dev);
	if (vdev) {
	vfio_platform_remove_common(vdev);
	kfree(vdev);
	return 0;
}

	return -EINVAL;
}

static struct platform_driver vfio_platform_driver = {
	.probe		= vfio_platform_probe,
	.remove		= vfio_platform_remove,
+8 −15
Original line number Diff line number Diff line
@@ -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 @@ int vfio_platform_probe_common(struct vfio_platform_device *vdev,
}
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;
	vfio_iommu_group_put(vdev->vdev.dev->iommu_group, vdev->vdev.dev);
}
EXPORT_SYMBOL_GPL(vfio_platform_remove_common);

+3 −2
Original line number Diff line number Diff line
@@ -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);