From: Chen Pei <cp0613@linux.alibaba.com>
To: palmer@dabbelt.com, alistair.francis@wdc.com, mst@redhat.com,
imammedo@redhat.com, sunilvl@ventanamicro.com, jic23@kernel.org
Cc: pbonzini@redhat.com, liwei1518@gmail.com,
daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com,
chao.liu@processmission.com, anisinha@redhat.com,
dave.jiang@intel.com, alison.schofield@intel.com,
junjie.cao@intel.com, guoren@kernel.org, qemu-riscv@nongnu.org,
qemu-devel@nongnu.org, linux-cxl@vger.kernel.org
Subject: [PATCH v4 3/6] hw/riscv/virt: Advertise the CXL host bridge to firmware via extra-pci-roots
Date: Fri, 28 Aug 2026 23:13:02 +0800 [thread overview]
Message-ID: <20260828151317.815-4-cp0613@linux.alibaba.com> (raw)
In-Reply-To: <20260828151317.815-1-cp0613@linux.alibaba.com>
The pxb-cxl expander bridge presents as a class 0x0600 host bridge with
a type-0 header, so EDK2's PciBusDxe never recurses into it and never
assigns the CXL root port a memory window or bus numbers. As a result
build_crs() produces an empty _CRS for the ACPI0016 host bridge and the
CXL devices behind it are not enumerated by the OS.
Advertise the pxb-cxl expander root buses to firmware via the
etc/extra-pci-roots fw_cfg file, the same way arm/virt and x86 do, by
calling pci_bus_add_fw_cfg_extra_pci_roots() from virt_machine_done().
EDK2's PciBusDxe then enumerates behind the CXL host bridge and assigns
the root-port window and bus numbers. The ACPI tables are rebuilt when
the guest reads them (after that firmware enumeration), so build_crs()
then emits a correct _CRS for the ACPI0016 host bridge.
This approach also scales to multiple pxb-cxl host bridges (each gets
its own window from the shared aperture) and lets firmware size the
window to what is actually behind the bridge, rather than reserving a
fixed carve-out.
Verified by booting an RVA22 guest: the CXL root port and Type3 device
enumerate, and 'cxl enable-memdev' / 'cxl create-region' /
'daxctl online-memory' bring the CXL memory online as system RAM.
Signed-off-by: Chen Pei <cp0613@linux.alibaba.com>
---
v4:
- Replaces the v3 QEMU-side firmware simulation with
pci_bus_add_fw_cfg_extra_pci_roots(), advertising the pxb-cxl
expander root buses to firmware via etc/extra-pci-roots. EDK2 then
enumerates behind the CXL host bridge and assigns the root-port
window and bus numbers, and build_crs() emits a correct _CRS. This
scales to multiple pxb-cxl and lets firmware size the window.
hw/riscv/virt.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index e08c76af4d..67f512cde1 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -1237,6 +1237,14 @@ static void virt_machine_done(Notifier *notifier, void *data)
if (s->cxl_devices_state.is_enabled) {
cxl_fmws_link_targets(&error_fatal);
+
+ /*
+ * Let firmware enumerate the pxb-cxl root buses and assign bus
+ * numbers and windows; build_crs() builds the ACPI0016 _CRS from
+ * the resulting state when the guest reads the ACPI tables.
+ */
+ pci_bus_add_fw_cfg_extra_pci_roots(s->fw_cfg, s->pci_bus,
+ &error_abort);
}
hwaddr firmware_end_addr;
vaddr kernel_start_addr;
--
2.50.1
next prev parent reply other threads:[~2026-08-28 15:13 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-28 15:12 [PATCH v4 0/6] hw/riscv/virt: Add CXL support to the RISC-V virt machine Chen Pei
2026-08-28 15:13 ` [PATCH v4 1/6] " Chen Pei
2026-08-28 15:13 ` [PATCH v4 2/6] hw/riscv/virt-acpi-build: Add _DEP to ACPI0017 for CXL host bridge dependency Chen Pei
2026-08-28 15:13 ` Chen Pei [this message]
2026-08-31 6:37 ` [PATCH v4 3/6] hw/riscv/virt: Advertise the CXL host bridge to firmware via extra-pci-roots Junjie Cao
2026-08-31 12:30 ` Chen Pei
2026-08-28 15:13 ` [PATCH v4 4/6] tests/qtest: Prepare golden files for the RISC-V CXL ACPI test Chen Pei
2026-08-31 6:37 ` Junjie Cao
2026-08-28 15:13 ` [PATCH v4 5/6] tests/qtest: Add RISC-V ACPI bios tables test for CXL Chen Pei
2026-08-31 6:38 ` Junjie Cao
2026-08-28 15:13 ` [PATCH v4 6/6] tests/qtest: Update RISC-V CXL ACPI golden master binaries Chen Pei
2026-08-31 6:38 ` Junjie Cao
2026-08-31 12:27 ` Chen Pei
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260828151317.815-4-cp0613@linux.alibaba.com \
--to=cp0613@linux.alibaba.com \
--cc=alison.schofield@intel.com \
--cc=alistair.francis@wdc.com \
--cc=anisinha@redhat.com \
--cc=chao.liu@processmission.com \
--cc=daniel.barboza@oss.qualcomm.com \
--cc=dave.jiang@intel.com \
--cc=guoren@kernel.org \
--cc=imammedo@redhat.com \
--cc=jic23@kernel.org \
--cc=junjie.cao@intel.com \
--cc=linux-cxl@vger.kernel.org \
--cc=liwei1518@gmail.com \
--cc=mst@redhat.com \
--cc=palmer@dabbelt.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-riscv@nongnu.org \
--cc=sunilvl@ventanamicro.com \
--cc=zhiwei_liu@linux.alibaba.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.