[PATCH v3 2/2] cxl/test: Add a 2-way 16K root decoder for passthrough testing
Alison Schofield <[email protected]> Fri, 24 Jul 2026 18:08:55 -0700
| Newsgroups | org.kernel.vger.linux-cxl |
|---|---|
| Message-ID | <e89552a2c51b63657da50c9286d48ab858016721.1784940306.git.alison.schofield@intel.com> |
The cxl-test topologies do not provide a configuration where pass- through decoders compute a granularity above the 16K max encodable in hardware. The widest power-of-2 root decoder currently available is 2-way at 4K granularity, so a passthrough decoder below it computes at most 16K. Add a CFMWS entry for a 2-way root decoder at 16K granularity. This topology supports a region configuration spanning the two multi-port host bridges and placing one endpoint under each bridge. The intermediate switch decoders are then passthrough decoders with a computed granularity of 32K. This allows a CXL unit test to be added for this case. Place the new window in the XOR topology set so the default modulo topology used by most cxl-test coverage is unchanged. Assisted-by: Claude:Opus-4-8 Signed-off-by: Alison Schofield <[email protected]> --- tools/testing/cxl/test/cxl.c | 48 ++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/tools/testing/cxl/test/cxl.c b/tools/testing/cxl/test/cxl.c index ef92dd35e030..5b87a3f5673f 100644 --- a/tools/testing/cxl/test/cxl.c +++ b/tools/testing/cxl/test/cxl.c @@ -188,10 +188,18 @@ static struct { struct acpi_cedt_cfmws cfmws; u32 target[3]; } cfmws8; + struct { + struct acpi_cedt_cfmws cfmws; + u32 target[2]; + } cfmws9; struct { struct acpi_cedt_cxims cxims; u64 xormap_list[2]; } cxims0; + struct { + struct acpi_cedt_cxims cxims; + u64 xormap_list[1]; + } cxims1; } __packed mock_cedt = { .cedt = { .header = { @@ -371,6 +379,28 @@ static struct { }, .target = { 0, 1, 2, }, }, + /* + * A 2-way root at 16K granularity. A passthrough decoder below this + * root computes a 32K granularity (16K * 2), which exceeds the maximum + * encodable in hardware. It exercises the passthrough granularity path + * in cxl_port_setup_targets(). + */ + .cfmws9 = { + .cfmws = { + .header = { + .type = ACPI_CEDT_TYPE_CFMWS, + .length = sizeof(mock_cedt.cfmws9), + }, + .interleave_arithmetic = ACPI_CEDT_CFMWS_ARITHMETIC_XOR, + .interleave_ways = 1, + .granularity = 6, + .restrictions = ACPI_CEDT_CFMWS_RESTRICT_HOSTONLYMEM | + ACPI_CEDT_CFMWS_RESTRICT_PMEM, + .qtg_id = FAKE_QTG_ID, + .window_size = SZ_256M * 8UL, + }, + .target = { 0, 1, }, + }, .cxims0 = { .cxims = { .header = { @@ -382,6 +412,18 @@ static struct { }, .xormap_list = { 0x404100, 0x808200, }, }, + /* CXIMS for the 16K (hbig = 6) 2-way root, cfmws9 */ + .cxims1 = { + .cxims = { + .header = { + .type = ACPI_CEDT_TYPE_CXIMS, + .length = sizeof(mock_cedt.cxims1), + }, + .hbig = 6, + .nr_xormaps = 1, + }, + .xormap_list = { 0x0, }, + }, }; struct acpi_cedt_cfmws *mock_cfmws[] = { @@ -395,6 +437,7 @@ struct acpi_cedt_cfmws *mock_cfmws[] = { [6] = &mock_cedt.cfmws6.cfmws, [7] = &mock_cedt.cfmws7.cfmws, [8] = &mock_cedt.cfmws8.cfmws, + [9] = &mock_cedt.cfmws9.cfmws, }; static int cfmws_start; @@ -402,10 +445,11 @@ static int cfmws_end; #define CFMWS_MOD_ARRAY_START 0 #define CFMWS_MOD_ARRAY_END 5 #define CFMWS_XOR_ARRAY_START 6 -#define CFMWS_XOR_ARRAY_END 8 +#define CFMWS_XOR_ARRAY_END 9 -struct acpi_cedt_cxims *mock_cxims[1] = { +struct acpi_cedt_cxims *mock_cxims[2] = { [0] = &mock_cedt.cxims0.cxims, + [1] = &mock_cedt.cxims1.cxims, }; struct cxl_mock_res { -- 2.37.3