|
@@ -3121,10 +3121,15 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
|
|
|
|
|
|
vfio_bars_register(vdev);
|
|
|
|
|
|
- if (!vfio_add_capabilities(vdev, errp)) {
|
|
|
+ if (!pci_device_set_iommu_device(pdev, vbasedev->hiod, errp)) {
|
|
|
+ error_prepend(errp, "Failed to set iommu_device: ");
|
|
|
goto out_teardown;
|
|
|
}
|
|
|
|
|
|
+ if (!vfio_add_capabilities(vdev, errp)) {
|
|
|
+ goto out_unset_idev;
|
|
|
+ }
|
|
|
+
|
|
|
if (vdev->vga) {
|
|
|
vfio_vga_quirk_setup(vdev);
|
|
|
}
|
|
@@ -3141,7 +3146,7 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
|
|
|
error_setg(errp,
|
|
|
"cannot support IGD OpRegion feature on hotplugged "
|
|
|
"device");
|
|
|
- goto out_teardown;
|
|
|
+ goto out_unset_idev;
|
|
|
}
|
|
|
|
|
|
ret = vfio_get_dev_region_info(vbasedev,
|
|
@@ -3150,11 +3155,11 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
|
|
|
if (ret) {
|
|
|
error_setg_errno(errp, -ret,
|
|
|
"does not support requested IGD OpRegion feature");
|
|
|
- goto out_teardown;
|
|
|
+ goto out_unset_idev;
|
|
|
}
|
|
|
|
|
|
if (!vfio_pci_igd_opregion_init(vdev, opregion, errp)) {
|
|
|
- goto out_teardown;
|
|
|
+ goto out_unset_idev;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3238,6 +3243,8 @@ out_deregister:
|
|
|
if (vdev->intx.mmap_timer) {
|
|
|
timer_free(vdev->intx.mmap_timer);
|
|
|
}
|
|
|
+out_unset_idev:
|
|
|
+ pci_device_unset_iommu_device(pdev);
|
|
|
out_teardown:
|
|
|
vfio_teardown_msi(vdev);
|
|
|
vfio_bars_exit(vdev);
|
|
@@ -3266,6 +3273,7 @@ static void vfio_instance_finalize(Object *obj)
|
|
|
static void vfio_exitfn(PCIDevice *pdev)
|
|
|
{
|
|
|
VFIOPCIDevice *vdev = VFIO_PCI(pdev);
|
|
|
+ VFIODevice *vbasedev = &vdev->vbasedev;
|
|
|
|
|
|
vfio_unregister_req_notifier(vdev);
|
|
|
vfio_unregister_err_notifier(vdev);
|
|
@@ -3280,7 +3288,8 @@ static void vfio_exitfn(PCIDevice *pdev)
|
|
|
vfio_teardown_msi(vdev);
|
|
|
vfio_pci_disable_rp_atomics(vdev);
|
|
|
vfio_bars_exit(vdev);
|
|
|
- vfio_migration_exit(&vdev->vbasedev);
|
|
|
+ vfio_migration_exit(vbasedev);
|
|
|
+ pci_device_unset_iommu_device(pdev);
|
|
|
}
|
|
|
|
|
|
static void vfio_pci_reset(DeviceState *dev)
|