index 428ab2f069..931df22add 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -1949,6 +1949,38 @@ static void vfio_mmap_set_enabled(VFIOPCIDevice *vdev, bool enabled) } }+/*+ * Prevent a pending INTx mmap timer from restoring BAR mmap while + * the PE is undergoing EEH reset. Keep BAR accesses on the VFIO + * region read/write path until PE configuration completes. + */ +void vfio_pci_eeh_pre_reset(PCIDevice *pdev) +{ + VFIOPCIDevice *vdev = VFIO_PCI_DEVICE(pdev); + + if (vdev->intx.mmap_timer) { + timer_del(vdev->intx.mmap_timer); + } + + vfio_mmap_set_enabled(vdev, false); +} + +void vfio_pci_eeh_post_configure(PCIDevice *pdev) +{ + VFIOPCIDevice *vdev = VFIO_PCI_DEVICE(pdev); + + if (vdev->interrupt == VFIO_INT_INTx && vdev->intx.pending) { + if (vdev->intx.mmap_timer && vdev->intx.mmap_timeout) { + timer_mod(vdev->intx.mmap_timer, + qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + + vdev->intx.mmap_timeout); + } + return; + } + + vfio_mmap_set_enabled(vdev, true); +} + static void vfio_bar_prepare(VFIOPCIDevice *vdev, int nr) { VFIOBAR *bar = &vdev->bars[nr]; diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h index c9ab949870..63fa378fbc 100644 --- a/hw/vfio/pci.h +++ b/hw/vfio/pci.h @@ -266,6 +266,8 @@ struct vfio_pci_hot_reset_info;void vfio_pci_pre_reset(VFIOPCIDevice *vdev);void vfio_pci_post_reset(VFIOPCIDevice *vdev); +void vfio_pci_eeh_pre_reset(PCIDevice *pdev); +void vfio_pci_eeh_post_configure(PCIDevice *pdev); bool vfio_pci_host_match(PCIHostDeviceAddress *addr, const char *name); int vfio_pci_get_pci_hot_reset_info(VFIOPCIDevice *vdev, struct vfio_pci_hot_reset_info **info_p);
These are POWER-only routines. Why put them under hw/vfio/pci.c ? C.
