[PATCH v2 5/5] tests/qtest/cxl: Add CXL Fixed Memory Window restriction flag tests
Davidlohr Bueso <[email protected]>
| Newsgroups | org.kernel.vger.linux-cxl,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
Add a /pci/cxl/cfmw group exercising the configurable CFMWS Window Restrictions. Signed-off-by: Davidlohr Bueso <[email protected]> --- tests/qtest/cxl-test.c | 95 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/tests/qtest/cxl-test.c b/tests/qtest/cxl-test.c index 8fb7e58d4f17..49d820cde16f 100644 --- a/tests/qtest/cxl-test.c +++ b/tests/qtest/cxl-test.c @@ -81,6 +81,13 @@ "-object memory-backend-file,id=lsa3,mem-path=%s,size=256M " \ "-device cxl-type3,bus=rp3,persistent-memdev=cxl-mem3,lsa=lsa3,id=pmem3 " +/* Single pxb + volatile type3 + one window; base for the CFMW tests. */ +#define QEMU_CFMW \ + "-machine q35,cxl=on " \ + "-device pxb-cxl,id=cxl.0,bus=pcie.0,bus_nr=52 " \ + QEMU_RP QEMU_T3D_VMEM \ + "-M cxl-fmw.0.targets.0=cxl.0,cxl-fmw.0.size=4G" + static void cxl_basic_hb(void) { qtest_start("-machine q35,cxl=on"); @@ -117,6 +124,81 @@ static void cxl_2root_port(void) qtest_end(); } +/* + * CFMWS "Window Restrictions" (CXL r4.0 9.18.1.3) are configurable per + * window; check that valid restriction sets are accepted. + */ +static void cxl_cfmw_default(void) +{ + /* No coherency flag advertises both HDM-D and HDM-H. */ + qtest_start(QEMU_CFMW); + qtest_end(); +} + +static void cxl_cfmw_host_only_off(void) +{ + /* Disabling host-only leaves device-coherent (HDM-D). */ + qtest_start(QEMU_CFMW ",cxl-fmw.0.host-only=off"); + qtest_end(); +} + +static void cxl_cfmw_device_coherent_off(void) +{ + /* Disabling device-coherent leaves host-only (HDM-H). */ + qtest_start(QEMU_CFMW ",cxl-fmw.0.device-coherent=off"); + qtest_end(); +} + +static void cxl_cfmw_back_invalidate(void) +{ + /* Back-Invalidate implies device-coherent (HDM-DB). */ + qtest_start(QEMU_CFMW ",cxl-fmw.0.back-invalidate=on"); + qtest_end(); +} + +static void cxl_cfmw_fixed_config(void) +{ + qtest_start(QEMU_CFMW ",cxl-fmw.0.fixed-config=on"); + qtest_end(); +} + +static void cxl_cfmw_device_and_host(void) +{ + /* + * device-coherent and host-only may both be advertised (the spec + * permits multiple bits set); this must be accepted -- a regression + * guard against reinstating a device/host-only mutual exclusion. + */ + qtest_start(QEMU_CFMW + ",cxl-fmw.0.device-coherent=on,cxl-fmw.0.host-only=on"); + qtest_end(); +} + +static void cxl_cfmw_volatile_only(void) +{ + qtest_start(QEMU_CFMW ",cxl-fmw.0.persistent=off"); + qtest_end(); +} + +static void cxl_cfmw_persistent_only(void) +{ + qtest_start(QEMU_CFMW ",cxl-fmw.0.volatile=off"); + qtest_end(); +} + +/* Two windows in one VM: a Back-Invalidate window and a host-only window. */ +static void cxl_cfmw_two_windows(void) +{ + qtest_start("-machine q35,cxl=on " + "-device pxb-cxl,id=cxl.0,bus=pcie.0,bus_nr=52 " + "-device pxb-cxl,id=cxl.1,bus=pcie.0,bus_nr=53 " + QEMU_RP QEMU_T3D_VMEM + "-M cxl-fmw.0.targets.0=cxl.0,cxl-fmw.0.size=4G," + "cxl-fmw.0.back-invalidate=on," + "cxl-fmw.1.targets.0=cxl.1,cxl-fmw.1.size=4G"); + qtest_end(); +} + #ifdef CONFIG_POSIX static void cxl_t3d_deprecated(void) { @@ -233,6 +315,19 @@ int main(int argc, char **argv) qtest_add_func("/pci/cxl/pxb_x2_with_window", cxl_2pxb_with_window); qtest_add_func("/pci/cxl/rp", cxl_root_port); qtest_add_func("/pci/cxl/rp_x2", cxl_2root_port); + qtest_add_func("/pci/cxl/cfmw/default", cxl_cfmw_default); + qtest_add_func("/pci/cxl/cfmw/host_only_off", cxl_cfmw_host_only_off); + qtest_add_func("/pci/cxl/cfmw/device_coherent_off", + cxl_cfmw_device_coherent_off); + qtest_add_func("/pci/cxl/cfmw/back_invalidate", + cxl_cfmw_back_invalidate); + qtest_add_func("/pci/cxl/cfmw/fixed_config", cxl_cfmw_fixed_config); + qtest_add_func("/pci/cxl/cfmw/device_and_host", + cxl_cfmw_device_and_host); + qtest_add_func("/pci/cxl/cfmw/volatile_only", cxl_cfmw_volatile_only); + qtest_add_func("/pci/cxl/cfmw/persistent_only", + cxl_cfmw_persistent_only); + qtest_add_func("/pci/cxl/cfmw/two_windows", cxl_cfmw_two_windows); #ifdef CONFIG_POSIX qtest_add_func("/pci/cxl/type3_device", cxl_t3d_deprecated); qtest_add_func("/pci/cxl/type3_device_pmem", cxl_t3d_persistent); -- 2.39.5