mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
vfio: add vfio_device_prepare()
Commonize some initialization code shared by the legacy and iommufd vfio implementations. Reviewed-by: Cédric Le Goater <clg@redhat.com> Signed-off-by: John Levon <john.levon@nutanix.com> Link: https://lore.kernel.org/qemu-devel/20250507152020.1254632-2-john.levon@nutanix.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
parent
1cab5a02ab
commit
a901682f53
4 changed files with 20 additions and 20 deletions
|
@ -826,18 +826,14 @@ static bool vfio_device_get(VFIOGroup *group, const char *name,
|
|||
}
|
||||
}
|
||||
|
||||
vfio_device_prepare(vbasedev, &group->container->bcontainer, info);
|
||||
|
||||
vbasedev->fd = fd;
|
||||
vbasedev->group = group;
|
||||
QLIST_INSERT_HEAD(&group->device_list, vbasedev, next);
|
||||
|
||||
vbasedev->num_irqs = info->num_irqs;
|
||||
vbasedev->num_regions = info->num_regions;
|
||||
vbasedev->flags = info->flags;
|
||||
|
||||
trace_vfio_device_get(name, info->flags, info->num_regions, info->num_irqs);
|
||||
|
||||
vbasedev->reset_works = !!(info->flags & VFIO_DEVICE_FLAGS_RESET);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -890,7 +886,6 @@ static bool vfio_legacy_attach_device(const char *name, VFIODevice *vbasedev,
|
|||
int groupid = vfio_device_get_groupid(vbasedev, errp);
|
||||
VFIODevice *vbasedev_iter;
|
||||
VFIOGroup *group;
|
||||
VFIOContainerBase *bcontainer;
|
||||
|
||||
if (groupid < 0) {
|
||||
return false;
|
||||
|
@ -919,11 +914,6 @@ static bool vfio_legacy_attach_device(const char *name, VFIODevice *vbasedev,
|
|||
goto device_put_exit;
|
||||
}
|
||||
|
||||
bcontainer = &group->container->bcontainer;
|
||||
vbasedev->bcontainer = bcontainer;
|
||||
QLIST_INSERT_HEAD(&bcontainer->device_list, vbasedev, container_next);
|
||||
QLIST_INSERT_HEAD(&vfio_device_list, vbasedev, global_next);
|
||||
|
||||
return true;
|
||||
|
||||
device_put_exit:
|
||||
|
|
|
@ -398,3 +398,17 @@ void vfio_device_detach(VFIODevice *vbasedev)
|
|||
}
|
||||
VFIO_IOMMU_GET_CLASS(vbasedev->bcontainer)->detach_device(vbasedev);
|
||||
}
|
||||
|
||||
void vfio_device_prepare(VFIODevice *vbasedev, VFIOContainerBase *bcontainer,
|
||||
struct vfio_device_info *info)
|
||||
{
|
||||
vbasedev->num_irqs = info->num_irqs;
|
||||
vbasedev->num_regions = info->num_regions;
|
||||
vbasedev->flags = info->flags;
|
||||
vbasedev->reset_works = !!(info->flags & VFIO_DEVICE_FLAGS_RESET);
|
||||
|
||||
vbasedev->bcontainer = bcontainer;
|
||||
QLIST_INSERT_HEAD(&bcontainer->device_list, vbasedev, container_next);
|
||||
|
||||
QLIST_INSERT_HEAD(&vfio_device_list, vbasedev, global_next);
|
||||
}
|
||||
|
|
|
@ -588,14 +588,7 @@ found_container:
|
|||
iommufd_cdev_ram_block_discard_disable(false);
|
||||
}
|
||||
|
||||
vbasedev->group = 0;
|
||||
vbasedev->num_irqs = dev_info.num_irqs;
|
||||
vbasedev->num_regions = dev_info.num_regions;
|
||||
vbasedev->flags = dev_info.flags;
|
||||
vbasedev->reset_works = !!(dev_info.flags & VFIO_DEVICE_FLAGS_RESET);
|
||||
vbasedev->bcontainer = bcontainer;
|
||||
QLIST_INSERT_HEAD(&bcontainer->device_list, vbasedev, container_next);
|
||||
QLIST_INSERT_HEAD(&vfio_device_list, vbasedev, global_next);
|
||||
vfio_device_prepare(vbasedev, bcontainer, &dev_info);
|
||||
|
||||
trace_iommufd_cdev_device_info(vbasedev->name, devfd, vbasedev->num_irqs,
|
||||
vbasedev->num_regions, vbasedev->flags);
|
||||
|
|
|
@ -134,6 +134,9 @@ typedef QLIST_HEAD(VFIODeviceList, VFIODevice) VFIODeviceList;
|
|||
extern VFIODeviceList vfio_device_list;
|
||||
|
||||
#ifdef CONFIG_LINUX
|
||||
void vfio_device_prepare(VFIODevice *vbasedev, VFIOContainerBase *bcontainer,
|
||||
struct vfio_device_info *info);
|
||||
|
||||
int vfio_device_get_region_info(VFIODevice *vbasedev, int index,
|
||||
struct vfio_region_info **info);
|
||||
int vfio_device_get_region_info_type(VFIODevice *vbasedev, uint32_t type,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue