mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-17 18:36:00 +00:00
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: 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>
This commit is contained in:
parent
0bfc6a4ea6
commit
cb61645868
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
struct vfio_platform_device *vdev = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
vdev = vfio_platform_remove_common(&pdev->dev);
|
||||
if (vdev) {
|
||||
kfree(vdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
vfio_platform_remove_common(vdev);
|
||||
kfree(vdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver vfio_platform_driver = {
|
||||
|
@ -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;
|
||||
vfio_unregister_group_dev(&vdev->vdev);
|
||||
|
||||
vdev = vfio_del_group_dev(dev);
|
||||
|
||||
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);
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user