Signed-off-by: Chen Fan <chen.fan.f...@cn.fujitsu.com> --- hw/vfio/pci.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 91ad9ad..a8c5988 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -156,6 +156,7 @@ typedef struct VFIOPCIDevice { PCIHostDeviceAddress host; EventNotifier err_notifier; EventNotifier req_notifier; + Notifier sec_bus_reset_notifier; int (*resetfn)(struct VFIOPCIDevice *); uint32_t features; #define VFIO_FEATURE_ENABLE_VGA_BIT 0 @@ -172,6 +173,7 @@ typedef struct VFIOPCIDevice { bool has_flr; bool has_pm_reset; bool has_bus_reset; + bool needs_bus_reset; bool rom_read_failed; } VFIOPCIDevice; @@ -3828,6 +3830,17 @@ static Notifier machine_notifier = { .notify = vfio_pci_machine_done_notify, }; +static void vfio_pci_host_needs_bus_reset(Notifier *n, void *opaque) +{ + VFIOPCIDevice *vdev = container_of(n, VFIOPCIDevice, sec_bus_reset_notifier); + VFIODevice *vbasedev = &vdev->vbasedev; + + if (vdev->has_bus_reset) { + vdev->needs_bus_reset = true; + vbasedev->needs_reset = true; + } +} + static int vfio_initfn(PCIDevice *pdev) { VFIOPCIDevice *vdev = DO_UPCAST(VFIOPCIDevice, pdev, pdev); @@ -3978,6 +3991,9 @@ static int vfio_initfn(PCIDevice *pdev) vfio_register_req_notifier(vdev); vfio_setup_resetfn(vdev); + vdev->sec_bus_reset_notifier.notify = vfio_pci_host_needs_bus_reset; + pci_bus_add_reset_notifier(pdev->bus, &vdev->sec_bus_reset_notifier); + return 0; out_teardown: @@ -4006,6 +4022,7 @@ static void vfio_exitfn(PCIDevice *pdev) vfio_unregister_req_notifier(vdev); vfio_unregister_err_notifier(vdev); + pci_bus_remove_reset_notifier(&vdev->sec_bus_reset_notifier); pci_device_set_intx_routing_notifier(&vdev->pdev, NULL); vfio_disable_interrupts(vdev); if (vdev->intx.mmap_timer) { -- 1.9.3