This series adds an 'acs-ctrl' property to PCIe root ports and downstream ports, letting the hypervisor expose a specific PCIe ACS (Access Control Services) configuration to the guest instead of QEMU always advertising every ACS capability the port structurally supports.
This matters for P2P (peer-to-peer) topologies such as GPUDirect RDMA, where the actual ACS configuration in effect must match what the host side is doing -- otherwise the guest sees a topology/configuration that doesn't reflect reality, which is undefined behavior and can fail either in software or in hardware. Patch 1 adds the missing ACS capability to xio3130 downstream ports (previously only root ports exposed one), gated behind a new 'x-pcie-acs' property so older machine types can disable it via hw_compat and preserve migration compatibility. Patch 2 introduces the 'acs-ctrl' property itself on both root and downstream ports, so the configured value -- not just the maximal capability set -- is what gets exposed to the guest. Patch 3 makes the ACS Control register read-only to the guest once 'acs-ctrl' has been explicitly configured, so a guest OS doing normal PCIe programming can't silently override the host-configured ACS state. An explicitly configured value of 0 is treated the same as any other configured value (locked), distinct from the property never being set at all (which stays guest-writable, unchanged from current behavior). Changes in v2: - Patch 1: Limit x-pcie-acs to the xio3130 downstream port - Patch 2: Error out when acs-ctrl is set on a port without ACS, reword the commit message and the unsupported-bits error - Patch 3: Make pcie_acs_init() safe for devices that are not PCIe ports, clarify the acs-ctrl property description Link to v1: https://lore.kernel.org/qemu-devel/[email protected]/ Tushar Dave (2): xio3130_downstream: Add ACS support for downstream PCIe ports hw/pci: Make ACS Control read-only to guests Yishai Hadas (1): hw/pci: Expose ACS ctrl on Guest as configured by the hypervisor hw/core/machine.c | 1 + hw/pci-bridge/pcie_root_port.c | 14 ++++++- hw/pci-bridge/xio3130_downstream.c | 19 ++++++++++ hw/pci/pcie.c | 61 ++++++++++++++++++++++++++++-- include/hw/pci/pci.h | 3 ++ include/hw/pci/pcie.h | 8 +++- include/hw/pci/pcie_port.h | 2 + 7 files changed, 100 insertions(+), 8 deletions(-) -- 2.34.1
