Export fixed BAR metadata from the virt machine through the "etc/fixed-bars" fw_cfg file during machine initialization.
Fixed BAR placement requires firmware to preserve the PCI resource configuration established by QEMU. ACPI provides this via the PCI boot configuration preservation mechanism, _DSM function 5. Reject fixed BAR configuration when ACPI is disabled, and request PCI boot configuration preservation when ACPI is enabled. Signed-off-by: Tushar Dave <[email protected]> --- hw/arm/virt.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index e7a56e37f7..cb9cd2d25c 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -96,6 +96,7 @@ #include "hw/cxl/cxl_host.h" #include "qemu/guest-random.h" #include "hw/watchdog/sbsa_gwdt.h" +#include "hw/pci/pci-fixed-bar.h" static GlobalProperty arm_virt_compat_defaults[] = { { TYPE_VIRTIO_IOMMU_PCI, "aw-bits", "48" }, @@ -2440,6 +2441,21 @@ void virt_machine_done(Notifier *notifier, void *data) vms->memmap[VIRT_PLATFORM_BUS].size, vms->irqmap[VIRT_PLATFORM_BUS]); } + if (fixed_bars_write_blob(vms->fw_cfg, + vms->memmap[VIRT_PCIE_MMIO].base, + vms->memmap[VIRT_PCIE_MMIO].size, + vms->memmap[VIRT_HIGH_PCIE_MMIO].base, + vms->memmap[VIRT_HIGH_PCIE_MMIO].size)) { + if (!virt_is_acpi_enabled(vms)) { + error_report("pci-bars: fixed BAR placement requires ACPI to " + "preserve the PCI boot configuration, otherwise " + "these BAR assignments could be reassigned later " + "with no protection"); + exit(1); + } + vms->pci_preserve_config = true; + } + if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as, ms, cpu) < 0) { exit(1); } -- 2.34.1
