On 2/20/25 11:48 PM, Alex Williamson wrote:
> We want the device in the D0 power state going into reset, but the
> config write can enable the BARs in the address space, which are
> then removed from the address space once we clear the memory enable
> bit in the command register. Re-order to clear the command bit
> first, so the power state change doesn't enable the BARs.
>
> Cc: Cédric Le Goater <c...@redhat.com>
> Signed-off-by: Alex Williamson <alex.william...@redhat.com>
Reviewed-by: Eric Auger <eric.au...@redhat.com>
Eric
> ---
> hw/vfio/pci.c | 18 +++++++++---------
> 1 file changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
> index ba4ef65b16fa..fcc5f118bf90 100644
> --- a/hw/vfio/pci.c
> +++ b/hw/vfio/pci.c
> @@ -2405,6 +2405,15 @@ void vfio_pci_pre_reset(VFIOPCIDevice *vdev)
>
> vfio_disable_interrupts(vdev);
>
> + /*
> + * Stop any ongoing DMA by disconnecting I/O, MMIO, and bus master.
> + * Also put INTx Disable in known state.
> + */
> + cmd = vfio_pci_read_config(pdev, PCI_COMMAND, 2);
> + cmd &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
> + PCI_COMMAND_INTX_DISABLE);
> + vfio_pci_write_config(pdev, PCI_COMMAND, cmd, 2);
> +
> /* Make sure the device is in D0 */
> if (pdev->pm_cap) {
> uint16_t pmcsr;
> @@ -2424,15 +2433,6 @@ void vfio_pci_pre_reset(VFIOPCIDevice *vdev)
> }
> }
> }
> -
> - /*
> - * Stop any ongoing DMA by disconnecting I/O, MMIO, and bus master.
> - * Also put INTx Disable in known state.
> - */
> - cmd = vfio_pci_read_config(pdev, PCI_COMMAND, 2);
> - cmd &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
> - PCI_COMMAND_INTX_DISABLE);
> - vfio_pci_write_config(pdev, PCI_COMMAND, cmd, 2);
> }
>
> void vfio_pci_post_reset(VFIOPCIDevice *vdev)