* [PATCH v2 0/3] cxl/test: mockfixups and new topology support
@ 2026-10-09 22:11 Alison Schofield
2026-10-09 22:11 ` [PATCH v2 1/3] tools/testing/cxl: Preserve DPA skip across mock decoder reset Alison Schofield
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Alison Schofield @ 2026-10-09 22:11 UTC (permalink / raw)
To: Davidlohr Bueso, Jonathan Cameron, Dave Jiang, Alison Schofield,
Vishal Verma, Ira Weiny, Li Ming, Richard Cheng
Cc: linux-cxl
Changes in v2:
Patch 2: Avoid duplicate look up of auto region window (RichardC)
CoverLetter: Add link to the ndctl companion series
While working to enhance the cxl-cli cxl-create-region command to handle
out-of-order target lists or no user-supplied target list, I ran into some
basic issues in the existing command that need to be addressed first.
Developing tests for those fixes exposed two bugs and a topology gap in
the cxl_test mock module.
This cxl_test series addresses those issues:
1/3 fixes a DPA skip leak across mock decoder reset.
2/3 skips auto-region setup when no volatile window is active.
3/3 adds two x1 CFMWS windows needed to exercise root decoder selection.
A companion ndctl series[1] fixes the existing cxl-create-region issues
in cxl-cli, clearing the way for out-of-order or automatically generated
target lists.
These changes preserve the existing cxl_test unit test behavior while
enabling new create-region test cases.
[1] https://lore.kernel.org/nvdimm/cover.1790658549.git.alison.schofield@intel.com/
Alison Schofield (3):
tools/testing/cxl: Preserve DPA skip across mock decoder reset
tools/testing/cxl: Skip the auto region when no volatile window is
active
tools/testing/cxl: Add CFMWS windows for region selection tests
tools/testing/cxl/test/cxl.c | 116 ++++++++++++++++++++++++++---------
1 file changed, 87 insertions(+), 29 deletions(-)
base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
--
2.37.3
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH v2 1/3] tools/testing/cxl: Preserve DPA skip across mock decoder reset 2026-10-09 22:11 [PATCH v2 0/3] cxl/test: mockfixups and new topology support Alison Schofield @ 2026-10-09 22:11 ` Alison Schofield 2026-10-09 23:00 ` Dave Jiang 2026-10-09 22:11 ` [PATCH v2 2/3] tools/testing/cxl: Skip the auto region when no volatile window is active Alison Schofield 2026-10-09 22:11 ` [PATCH v2 3/3] tools/testing/cxl: Add CFMWS windows for region selection tests Alison Schofield 2 siblings, 1 reply; 9+ messages in thread From: Alison Schofield @ 2026-10-09 22:11 UTC (permalink / raw) To: Davidlohr Bueso, Jonathan Cameron, Dave Jiang, Alison Schofield, Vishal Verma, Ira Weiny, Li Ming, Richard Cheng Cc: linux-cxl Mock decoder reset clears the DPA skip before releasing the decoder's resources. This leaks skipped capacity and can cause a later DPA allocation to fail with ENOSPC. Preserve the skip until the DPA resource is released. Assisted-by: LLM Signed-off-by: Alison Schofield <alison.schofield@intel.com> Reviewed-by: Richard Cheng <icheng@nvidia.com> --- tools/testing/cxl/test/cxl.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tools/testing/cxl/test/cxl.c b/tools/testing/cxl/test/cxl.c index 62bd92b3be45..aa140307e0c3 100644 --- a/tools/testing/cxl/test/cxl.c +++ b/tools/testing/cxl/test/cxl.c @@ -913,15 +913,13 @@ static void __cxld_registry_save(struct cxl_test_decoder *td, cxld_copy(&td->cxled.cxld, cxld); td->cxled.state = cxled->state; - td->cxled.skip = cxled->skip; - if (!(cxld->flags & CXL_DECODER_F_ENABLE)) { - td->dpa_range.start = 0; - td->dpa_range.end = -1; - } else if (cxled->dpa_res) { + if ((cxld->flags & CXL_DECODER_F_ENABLE) && cxled->dpa_res) { + td->cxled.skip = cxled->skip; td->dpa_range.start = cxled->dpa_res->start; td->dpa_range.end = cxled->dpa_res->end; } else { + td->cxled.skip = 0; td->dpa_range.start = 0; td->dpa_range.end = -1; } @@ -1001,7 +999,6 @@ static void mock_decoder_reset(struct cxl_decoder *cxld) to_cxl_endpoint_decoder(&cxld->dev); cxled->state = CXL_DECODER_STATE_MANUAL; - cxled->skip = 0; } if (decoder_reset_preserve_registry) dev_dbg(port->uport_dev, "decoder%d: skip registry update\n", -- 2.37.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/3] tools/testing/cxl: Preserve DPA skip across mock decoder reset 2026-10-09 22:11 ` [PATCH v2 1/3] tools/testing/cxl: Preserve DPA skip across mock decoder reset Alison Schofield @ 2026-10-09 23:00 ` Dave Jiang 0 siblings, 0 replies; 9+ messages in thread From: Dave Jiang @ 2026-10-09 23:00 UTC (permalink / raw) To: Alison Schofield, Davidlohr Bueso, Jonathan Cameron, Vishal Verma, Ira Weiny, Li Ming, Richard Cheng Cc: linux-cxl On 10/9/26 3:11 PM, Alison Schofield wrote: > Mock decoder reset clears the DPA skip before releasing the decoder's > resources. This leaks skipped capacity and can cause a later DPA > allocation to fail with ENOSPC. > > Preserve the skip until the DPA resource is released. > > Assisted-by: LLM > Signed-off-by: Alison Schofield <alison.schofield@intel.com> > Reviewed-by: Richard Cheng <icheng@nvidia.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> > --- > tools/testing/cxl/test/cxl.c | 9 +++------ > 1 file changed, 3 insertions(+), 6 deletions(-) > > diff --git a/tools/testing/cxl/test/cxl.c b/tools/testing/cxl/test/cxl.c > index 62bd92b3be45..aa140307e0c3 100644 > --- a/tools/testing/cxl/test/cxl.c > +++ b/tools/testing/cxl/test/cxl.c > @@ -913,15 +913,13 @@ static void __cxld_registry_save(struct cxl_test_decoder *td, > > cxld_copy(&td->cxled.cxld, cxld); > td->cxled.state = cxled->state; > - td->cxled.skip = cxled->skip; > > - if (!(cxld->flags & CXL_DECODER_F_ENABLE)) { > - td->dpa_range.start = 0; > - td->dpa_range.end = -1; > - } else if (cxled->dpa_res) { > + if ((cxld->flags & CXL_DECODER_F_ENABLE) && cxled->dpa_res) { > + td->cxled.skip = cxled->skip; > td->dpa_range.start = cxled->dpa_res->start; > td->dpa_range.end = cxled->dpa_res->end; > } else { > + td->cxled.skip = 0; > td->dpa_range.start = 0; > td->dpa_range.end = -1; > } > @@ -1001,7 +999,6 @@ static void mock_decoder_reset(struct cxl_decoder *cxld) > to_cxl_endpoint_decoder(&cxld->dev); > > cxled->state = CXL_DECODER_STATE_MANUAL; > - cxled->skip = 0; > } > if (decoder_reset_preserve_registry) > dev_dbg(port->uport_dev, "decoder%d: skip registry update\n", ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 2/3] tools/testing/cxl: Skip the auto region when no volatile window is active 2026-10-09 22:11 [PATCH v2 0/3] cxl/test: mockfixups and new topology support Alison Schofield 2026-10-09 22:11 ` [PATCH v2 1/3] tools/testing/cxl: Preserve DPA skip across mock decoder reset Alison Schofield @ 2026-10-09 22:11 ` Alison Schofield 2026-10-09 22:24 ` sashiko-bot 2026-10-09 23:02 ` Dave Jiang 2026-10-09 22:11 ` [PATCH v2 3/3] tools/testing/cxl: Add CFMWS windows for region selection tests Alison Schofield 2 siblings, 2 replies; 9+ messages in thread From: Alison Schofield @ 2026-10-09 22:11 UTC (permalink / raw) To: Davidlohr Bueso, Jonathan Cameron, Dave Jiang, Alison Schofield, Vishal Verma, Ira Weiny, Li Ming, Richard Cheng Cc: linux-cxl The mock auto region always uses CFMWS0. With XOR interleave arithmetic that window is inactive, so its HPA base is never assigned and the endpoint decoders are programmed at HPA 0. No root decoder matches that range, leaving DPA allocated to endpoint decoders that are not part of a region. Set up the auto region only when a volatile window is active. Assisted-by: LLM Signed-off-by: Alison Schofield <alison.schofield@intel.com> --- Changes in v2: - Avoid duplicate look up of auto region window (RichardC) --- tools/testing/cxl/test/cxl.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/tools/testing/cxl/test/cxl.c b/tools/testing/cxl/test/cxl.c index aa140307e0c3..46a87633e962 100644 --- a/tools/testing/cxl/test/cxl.c +++ b/tools/testing/cxl/test/cxl.c @@ -423,6 +423,18 @@ struct acpi_cedt_cxims *mock_cxims[1] = { [0] = &mock_cedt.cxims0.cxims, }; +static struct acpi_cedt_cfmws *mock_auto_region_cfmws(void) +{ + for (int i = cfmws_start; i <= cfmws_end; i++) { + struct acpi_cedt_cfmws *window = mock_cfmws[i]; + + if (window->restrictions & ACPI_CEDT_CFMWS_RESTRICT_VOLATILE) + return window; + } + + return NULL; +} + struct cxl_mock_res { struct list_head list; struct range range; @@ -1091,7 +1103,8 @@ enum cxld_init_type { static enum cxld_init_type get_decoder_init_type(struct cxl_decoder *cxld, struct platform_device *pdev, bool hb0, - struct cxl_test_decoder **td) + struct cxl_test_decoder **td, + struct acpi_cedt_cfmws **window) { struct cxl_test_decoder *found_td = cxld_registry_find(cxld); @@ -1101,6 +1114,7 @@ static enum cxld_init_type get_decoder_init_type(struct cxl_decoder *cxld, } *td = NULL; + *window = NULL; /* * The first decoder on the first 2 devices on the first switch @@ -1114,6 +1128,11 @@ static enum cxld_init_type get_decoder_init_type(struct cxl_decoder *cxld, pdev->id > 4 || cxld->id > 0) return MOCK_DECODER_INIT_DEFAULT; + /* XOR windows are all pmem, no window to host the RAM region */ + *window = mock_auto_region_cfmws(); + if (!*window) + return MOCK_DECODER_INIT_DEFAULT; + return type2_test ? MOCK_DECODER_INIT_TYPE2_AUTO : MOCK_DECODER_INIT_TYPE3_AUTO; } @@ -1135,9 +1154,9 @@ static bool mock_decoder_handle_saved(struct cxl_decoder *cxld, struct cxl_test_ } static void mock_init_hdm_type2_cxled(struct cxl_endpoint_decoder *cxled, - struct cxl_port *port) + struct cxl_port *port, + struct acpi_cedt_cfmws *window) { - struct acpi_cedt_cfmws *window = mock_cfmws[0]; struct cxl_decoder *cxld = &cxled->cxld; struct cxl_switch_decoder *cxlsd; struct cxl_dport *dport; @@ -1209,9 +1228,9 @@ static void mock_init_hdm_type2_cxled(struct cxl_endpoint_decoder *cxled, static void mock_init_hdm_type3_cxled(struct cxl_endpoint_decoder *cxled, struct cxl_port *port, struct platform_device *pdev, - bool hb0) + bool hb0, + struct acpi_cedt_cfmws *window) { - struct acpi_cedt_cfmws *window = mock_cfmws[0]; struct cxl_decoder *cxld = &cxled->cxld; struct cxl_switch_decoder *cxlsd; struct cxl_dport *dport; @@ -1326,6 +1345,7 @@ static bool mock_init_hdm_decoder(struct cxl_decoder *cxld) { struct cxl_endpoint_decoder *cxled = NULL; struct platform_device *pdev = NULL; + struct acpi_cedt_cfmws *window; struct cxl_test_decoder *td; struct cxl_memdev *cxlmd; struct cxl_port *port; @@ -1354,7 +1374,7 @@ static bool mock_init_hdm_decoder(struct cxl_decoder *cxld) port = to_cxl_port(cxld->dev.parent); } - switch (get_decoder_init_type(cxld, pdev, hb0, &td)) { + switch (get_decoder_init_type(cxld, pdev, hb0, &td, &window)) { case MOCK_DECODER_INIT_SAVED: if (WARN_ON(!td)) return false; @@ -1367,10 +1387,10 @@ static bool mock_init_hdm_decoder(struct cxl_decoder *cxld) default_mock_decoder(cxld); return false; case MOCK_DECODER_INIT_TYPE3_AUTO: - mock_init_hdm_type3_cxled(cxled, port, pdev, hb0); + mock_init_hdm_type3_cxled(cxled, port, pdev, hb0, window); return false; case MOCK_DECODER_INIT_TYPE2_AUTO: - mock_init_hdm_type2_cxled(cxled, port); + mock_init_hdm_type2_cxled(cxled, port, window); return false; default: return false; -- 2.37.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/3] tools/testing/cxl: Skip the auto region when no volatile window is active 2026-10-09 22:11 ` [PATCH v2 2/3] tools/testing/cxl: Skip the auto region when no volatile window is active Alison Schofield @ 2026-10-09 22:24 ` sashiko-bot 2026-10-09 22:39 ` Alison Schofield 2026-10-09 23:02 ` Dave Jiang 1 sibling, 1 reply; 9+ messages in thread From: sashiko-bot @ 2026-10-09 22:24 UTC (permalink / raw) To: Alison Schofield; +Cc: linux-cxl Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [Medium] cxl_test: mock HMEM and region APIs still hardcode inactive mock_cfmws[0] -- commit ab47ae118b5deca13e8e911d3065f4b4d5bbbf01 Author: Alison Schofield <alison.schofield@intel.com> tools/testing/cxl: Skip the auto region when no volatile window is active This commit updates the mock auto region in the CXL testing infrastructure to dynamically locate an active volatile window instead of hardcoding CFMWS0. It sets up the auto region only when a volatile window is available, avoiding issues where endpoint decoders are programmed at HPA 0 during XOR interleave tests. > diff --git a/tools/testing/cxl/test/cxl.c b/tools/testing/cxl/test/cxl.c > index aa140307e0c3c..46a87633e9621 100644 > --- a/tools/testing/cxl/test/cxl.c > +++ b/tools/testing/cxl/test/cxl.c > @@ -423,6 +423,18 @@ struct acpi_cedt_cxims *mock_cxims[1] = { > [0] = &mock_cedt.cxims0.cxims, > }; > > +static struct acpi_cedt_cfmws *mock_auto_region_cfmws(void) > +{ > + for (int i = cfmws_start; i <= cfmws_end; i++) { > + struct acpi_cedt_cfmws *window = mock_cfmws[i]; > + > + if (window->restrictions & ACPI_CEDT_CFMWS_RESTRICT_VOLATILE) > + return window; > + } > + > + return NULL; > +} > + [ ... ] > @@ -1135,9 +1154,9 @@ static bool mock_decoder_handle_saved(struct cxl_decoder *cxld, struct cxl_test_ > } > > static void mock_init_hdm_type2_cxled(struct cxl_endpoint_decoder *cxled, > - struct cxl_port *port) > + struct cxl_port *port, > + struct acpi_cedt_cfmws *window) > { > - struct acpi_cedt_cfmws *window = mock_cfmws[0]; > struct cxl_decoder *cxld = &cxled->cxld; [Severity: Medium] With this patch introducing `mock_auto_region_cfmws()` and removing the hardcoded `mock_cfmws[0]` here, should the mock HMEM and region APIs also be updated to use the dynamic window? Looking at `mock_walk_hmem_resources()`, `mock_region_intersects()`, and `mock_region_intersects_soft_reserve()`, they all still unconditionally reference `mock_cfmws[0]`: tools/testing/cxl/test/cxl.c:mock_walk_hmem_resources() { struct acpi_cedt_cfmws *cfmws = mock_cfmws[0]; struct resource window = DEFINE_RES_MEM(cfmws->base_hpa, cfmws->window_size / 2); ... } If `interleave_arithmetic=1` (XOR tests) is active, `mock_cfmws[0]` is inactive and its HPA base is left as 0. Will these functions falsely report soft-reserved memory and CXL intersections at HPA 0 instead of the real volatile window? -- Sashiko AI review · https://sashiko.dev/#/patchset/cover.1791582353.git.alison.schofield@intel.com?part=2 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/3] tools/testing/cxl: Skip the auto region when no volatile window is active 2026-10-09 22:24 ` sashiko-bot @ 2026-10-09 22:39 ` Alison Schofield 0 siblings, 0 replies; 9+ messages in thread From: Alison Schofield @ 2026-10-09 22:39 UTC (permalink / raw) To: sashiko-reviews; +Cc: linux-cxl On Fri, Oct 09, 2026 at 10:24:03PM +0000, sashiko-bot@kernel.org wrote: > Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: > - [Medium] cxl_test: mock HMEM and region APIs still hardcode inactive mock_cfmws[0] not an issue snip > [Severity: Medium] > With this patch introducing `mock_auto_region_cfmws()` and removing the > hardcoded `mock_cfmws[0]` here, should the mock HMEM and region APIs also be > updated to use the dynamic window? > > Looking at `mock_walk_hmem_resources()`, `mock_region_intersects()`, and > `mock_region_intersects_soft_reserve()`, they all still unconditionally > reference `mock_cfmws[0]`: > > tools/testing/cxl/test/cxl.c:mock_walk_hmem_resources() { > struct acpi_cedt_cfmws *cfmws = mock_cfmws[0]; > struct resource window = > DEFINE_RES_MEM(cfmws->base_hpa, cfmws->window_size / 2); > ... > } > > If `interleave_arithmetic=1` (XOR tests) is active, `mock_cfmws[0]` is inactive > and its HPA base is left as 0. Will these functions falsely report soft-reserved > memory and CXL intersections at HPA 0 instead of the real volatile window? No. These mocks only serve the hmem_test configuration, and cxl_test_init() refuses more than one mode parameter, so interleave_arithmetic=1 and hmem_test=1 can't be loaded together. - mock_walk_hmem_resources() is only reached for hmem_platform.1, which is only registered when hmem_test=1. - mock_region_intersects{,_soft_reserve}() are only called from dax_hmem on resources from that walk, and fall back to the real helpers on a miss. They are tied to cfmws0 on purpose because that window is the hmem fixture. Patch 2 only changes the auto-region decoders because they are the only cfmws0 users that run in XOR mode. > > -- > Sashiko AI review · https://sashiko.dev/#/patchset/cover.1791582353.git.alison.schofield@intel.com?part=2 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/3] tools/testing/cxl: Skip the auto region when no volatile window is active 2026-10-09 22:11 ` [PATCH v2 2/3] tools/testing/cxl: Skip the auto region when no volatile window is active Alison Schofield 2026-10-09 22:24 ` sashiko-bot @ 2026-10-09 23:02 ` Dave Jiang 1 sibling, 0 replies; 9+ messages in thread From: Dave Jiang @ 2026-10-09 23:02 UTC (permalink / raw) To: Alison Schofield, Davidlohr Bueso, Jonathan Cameron, Vishal Verma, Ira Weiny, Li Ming, Richard Cheng Cc: linux-cxl On 10/9/26 3:11 PM, Alison Schofield wrote: > The mock auto region always uses CFMWS0. With XOR interleave arithmetic > that window is inactive, so its HPA base is never assigned and the > endpoint decoders are programmed at HPA 0. > > No root decoder matches that range, leaving DPA allocated to endpoint > decoders that are not part of a region. > > Set up the auto region only when a volatile window is active. > > Assisted-by: LLM > Signed-off-by: Alison Schofield <alison.schofield@intel.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> > --- > Changes in v2: > - Avoid duplicate look up of auto region window (RichardC) > --- > tools/testing/cxl/test/cxl.c | 36 ++++++++++++++++++++++++++++-------- > 1 file changed, 28 insertions(+), 8 deletions(-) > > diff --git a/tools/testing/cxl/test/cxl.c b/tools/testing/cxl/test/cxl.c > index aa140307e0c3..46a87633e962 100644 > --- a/tools/testing/cxl/test/cxl.c > +++ b/tools/testing/cxl/test/cxl.c > @@ -423,6 +423,18 @@ struct acpi_cedt_cxims *mock_cxims[1] = { > [0] = &mock_cedt.cxims0.cxims, > }; > > +static struct acpi_cedt_cfmws *mock_auto_region_cfmws(void) > +{ > + for (int i = cfmws_start; i <= cfmws_end; i++) { > + struct acpi_cedt_cfmws *window = mock_cfmws[i]; > + > + if (window->restrictions & ACPI_CEDT_CFMWS_RESTRICT_VOLATILE) > + return window; > + } > + > + return NULL; > +} > + > struct cxl_mock_res { > struct list_head list; > struct range range; > @@ -1091,7 +1103,8 @@ enum cxld_init_type { > static enum cxld_init_type get_decoder_init_type(struct cxl_decoder *cxld, > struct platform_device *pdev, > bool hb0, > - struct cxl_test_decoder **td) > + struct cxl_test_decoder **td, > + struct acpi_cedt_cfmws **window) > { > struct cxl_test_decoder *found_td = cxld_registry_find(cxld); > > @@ -1101,6 +1114,7 @@ static enum cxld_init_type get_decoder_init_type(struct cxl_decoder *cxld, > } > > *td = NULL; > + *window = NULL; > > /* > * The first decoder on the first 2 devices on the first switch > @@ -1114,6 +1128,11 @@ static enum cxld_init_type get_decoder_init_type(struct cxl_decoder *cxld, > pdev->id > 4 || cxld->id > 0) > return MOCK_DECODER_INIT_DEFAULT; > > + /* XOR windows are all pmem, no window to host the RAM region */ > + *window = mock_auto_region_cfmws(); > + if (!*window) > + return MOCK_DECODER_INIT_DEFAULT; > + > return type2_test ? MOCK_DECODER_INIT_TYPE2_AUTO : > MOCK_DECODER_INIT_TYPE3_AUTO; > } > @@ -1135,9 +1154,9 @@ static bool mock_decoder_handle_saved(struct cxl_decoder *cxld, struct cxl_test_ > } > > static void mock_init_hdm_type2_cxled(struct cxl_endpoint_decoder *cxled, > - struct cxl_port *port) > + struct cxl_port *port, > + struct acpi_cedt_cfmws *window) > { > - struct acpi_cedt_cfmws *window = mock_cfmws[0]; > struct cxl_decoder *cxld = &cxled->cxld; > struct cxl_switch_decoder *cxlsd; > struct cxl_dport *dport; > @@ -1209,9 +1228,9 @@ static void mock_init_hdm_type2_cxled(struct cxl_endpoint_decoder *cxled, > static void mock_init_hdm_type3_cxled(struct cxl_endpoint_decoder *cxled, > struct cxl_port *port, > struct platform_device *pdev, > - bool hb0) > + bool hb0, > + struct acpi_cedt_cfmws *window) > { > - struct acpi_cedt_cfmws *window = mock_cfmws[0]; > struct cxl_decoder *cxld = &cxled->cxld; > struct cxl_switch_decoder *cxlsd; > struct cxl_dport *dport; > @@ -1326,6 +1345,7 @@ static bool mock_init_hdm_decoder(struct cxl_decoder *cxld) > { > struct cxl_endpoint_decoder *cxled = NULL; > struct platform_device *pdev = NULL; > + struct acpi_cedt_cfmws *window; > struct cxl_test_decoder *td; > struct cxl_memdev *cxlmd; > struct cxl_port *port; > @@ -1354,7 +1374,7 @@ static bool mock_init_hdm_decoder(struct cxl_decoder *cxld) > port = to_cxl_port(cxld->dev.parent); > } > > - switch (get_decoder_init_type(cxld, pdev, hb0, &td)) { > + switch (get_decoder_init_type(cxld, pdev, hb0, &td, &window)) { > case MOCK_DECODER_INIT_SAVED: > if (WARN_ON(!td)) > return false; > @@ -1367,10 +1387,10 @@ static bool mock_init_hdm_decoder(struct cxl_decoder *cxld) > default_mock_decoder(cxld); > return false; > case MOCK_DECODER_INIT_TYPE3_AUTO: > - mock_init_hdm_type3_cxled(cxled, port, pdev, hb0); > + mock_init_hdm_type3_cxled(cxled, port, pdev, hb0, window); > return false; > case MOCK_DECODER_INIT_TYPE2_AUTO: > - mock_init_hdm_type2_cxled(cxled, port); > + mock_init_hdm_type2_cxled(cxled, port, window); > return false; > default: > return false; ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 3/3] tools/testing/cxl: Add CFMWS windows for region selection tests 2026-10-09 22:11 [PATCH v2 0/3] cxl/test: mockfixups and new topology support Alison Schofield 2026-10-09 22:11 ` [PATCH v2 1/3] tools/testing/cxl: Preserve DPA skip across mock decoder reset Alison Schofield 2026-10-09 22:11 ` [PATCH v2 2/3] tools/testing/cxl: Skip the auto region when no volatile window is active Alison Schofield @ 2026-10-09 22:11 ` Alison Schofield 2026-10-09 23:03 ` Dave Jiang 2 siblings, 1 reply; 9+ messages in thread From: Alison Schofield @ 2026-10-09 22:11 UTC (permalink / raw) To: Davidlohr Bueso, Jonathan Cameron, Dave Jiang, Alison Schofield, Vishal Verma, Ira Weiny, Li Ming, Richard Cheng Cc: linux-cxl Region selection needs topologies where multiple root decoders can satisfy a request and where a decoder supports both RAM and PMEM. The mock topology provides neither. Add two x1 windows, one PMEM only and one supporting both RAM and PMEM, while preserving the existing modulo decoder identities. Assisted-by: LLM Signed-off-by: Alison Schofield <alison.schofield@intel.com> --- tools/testing/cxl/test/cxl.c | 71 ++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 15 deletions(-) diff --git a/tools/testing/cxl/test/cxl.c b/tools/testing/cxl/test/cxl.c index 46a87633e962..93bb520612f1 100644 --- a/tools/testing/cxl/test/cxl.c +++ b/tools/testing/cxl/test/cxl.c @@ -184,12 +184,20 @@ static struct { } cfmws6; struct { struct acpi_cedt_cfmws cfmws; - u32 target[2]; + u32 target[1]; } cfmws7; struct { struct acpi_cedt_cfmws cfmws; - u32 target[3]; + u32 target[1]; } cfmws8; + struct { + struct acpi_cedt_cfmws cfmws; + u32 target[2]; + } cfmws9; + struct { + struct acpi_cedt_cfmws cfmws; + u32 target[3]; + } cfmws10; struct { struct acpi_cedt_cxims cxims; u64 xormap_list[2]; @@ -324,22 +332,20 @@ static struct { }, .target = { 3 }, }, - /* .cfmws6,7,8 use ACPI_CEDT_CFMWS_ARITHMETIC_XOR */ .cfmws6 = { .cfmws = { .header = { .type = ACPI_CEDT_TYPE_CFMWS, .length = sizeof(mock_cedt.cfmws6), }, - .interleave_arithmetic = ACPI_CEDT_CFMWS_ARITHMETIC_XOR, .interleave_ways = 0, .granularity = 4, .restrictions = ACPI_CEDT_CFMWS_RESTRICT_HOSTONLYMEM | ACPI_CEDT_CFMWS_RESTRICT_PMEM, .qtg_id = FAKE_QTG_ID, - .window_size = SZ_256M * 8UL, + .window_size = SZ_256M * 4UL, }, - .target = { 0, }, + .target = { 2 }, }, .cfmws7 = { .cfmws = { @@ -347,16 +353,17 @@ static struct { .type = ACPI_CEDT_TYPE_CFMWS, .length = sizeof(mock_cedt.cfmws7), }, - .interleave_arithmetic = ACPI_CEDT_CFMWS_ARITHMETIC_XOR, - .interleave_ways = 1, - .granularity = 0, + .interleave_ways = 0, + .granularity = 4, .restrictions = ACPI_CEDT_CFMWS_RESTRICT_HOSTONLYMEM | + ACPI_CEDT_CFMWS_RESTRICT_VOLATILE | ACPI_CEDT_CFMWS_RESTRICT_PMEM, .qtg_id = FAKE_QTG_ID, - .window_size = SZ_256M * 8UL, + .window_size = SZ_256M * 4UL, }, - .target = { 0, 1, }, + .target = { 1 }, }, + /* .cfmws8,9,10 use ACPI_CEDT_CFMWS_ARITHMETIC_XOR */ .cfmws8 = { .cfmws = { .header = { @@ -364,6 +371,38 @@ static struct { .length = sizeof(mock_cedt.cfmws8), }, .interleave_arithmetic = ACPI_CEDT_CFMWS_ARITHMETIC_XOR, + .interleave_ways = 0, + .granularity = 4, + .restrictions = ACPI_CEDT_CFMWS_RESTRICT_HOSTONLYMEM | + ACPI_CEDT_CFMWS_RESTRICT_PMEM, + .qtg_id = FAKE_QTG_ID, + .window_size = SZ_256M * 8UL, + }, + .target = { 0, }, + }, + .cfmws9 = { + .cfmws = { + .header = { + .type = ACPI_CEDT_TYPE_CFMWS, + .length = sizeof(mock_cedt.cfmws9), + }, + .interleave_arithmetic = ACPI_CEDT_CFMWS_ARITHMETIC_XOR, + .interleave_ways = 1, + .granularity = 0, + .restrictions = ACPI_CEDT_CFMWS_RESTRICT_HOSTONLYMEM | + ACPI_CEDT_CFMWS_RESTRICT_PMEM, + .qtg_id = FAKE_QTG_ID, + .window_size = SZ_256M * 8UL, + }, + .target = { 0, 1, }, + }, + .cfmws10 = { + .cfmws = { + .header = { + .type = ACPI_CEDT_TYPE_CFMWS, + .length = sizeof(mock_cedt.cfmws10), + }, + .interleave_arithmetic = ACPI_CEDT_CFMWS_ARITHMETIC_XOR, .interleave_ways = 8, .granularity = 1, .restrictions = ACPI_CEDT_CFMWS_RESTRICT_HOSTONLYMEM | @@ -406,18 +445,20 @@ struct acpi_cedt_cfmws *mock_cfmws[] = { [3] = &mock_cedt.cfmws3.cfmws, [4] = &mock_cedt.cfmws4.cfmws, [5] = &mock_cedt.cfmws5.cfmws, - /* Modulo Math above, XOR Math below */ [6] = &mock_cedt.cfmws6.cfmws, [7] = &mock_cedt.cfmws7.cfmws, + /* Modulo Math above, XOR Math below */ [8] = &mock_cedt.cfmws8.cfmws, + [9] = &mock_cedt.cfmws9.cfmws, + [10] = &mock_cedt.cfmws10.cfmws, }; static int cfmws_start; 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_MOD_ARRAY_END 7 +#define CFMWS_XOR_ARRAY_START 8 +#define CFMWS_XOR_ARRAY_END 10 struct acpi_cedt_cxims *mock_cxims[1] = { [0] = &mock_cedt.cxims0.cxims, -- 2.37.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 3/3] tools/testing/cxl: Add CFMWS windows for region selection tests 2026-10-09 22:11 ` [PATCH v2 3/3] tools/testing/cxl: Add CFMWS windows for region selection tests Alison Schofield @ 2026-10-09 23:03 ` Dave Jiang 0 siblings, 0 replies; 9+ messages in thread From: Dave Jiang @ 2026-10-09 23:03 UTC (permalink / raw) To: Alison Schofield, Davidlohr Bueso, Jonathan Cameron, Vishal Verma, Ira Weiny, Li Ming, Richard Cheng Cc: linux-cxl On 10/9/26 3:11 PM, Alison Schofield wrote: > Region selection needs topologies where multiple root decoders can > satisfy a request and where a decoder supports both RAM and PMEM. The > mock topology provides neither. > > Add two x1 windows, one PMEM only and one supporting both RAM and PMEM, > while preserving the existing modulo decoder identities. > > Assisted-by: LLM > Signed-off-by: Alison Schofield <alison.schofield@intel.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> > --- > tools/testing/cxl/test/cxl.c | 71 ++++++++++++++++++++++++++++-------- > 1 file changed, 56 insertions(+), 15 deletions(-) > > diff --git a/tools/testing/cxl/test/cxl.c b/tools/testing/cxl/test/cxl.c > index 46a87633e962..93bb520612f1 100644 > --- a/tools/testing/cxl/test/cxl.c > +++ b/tools/testing/cxl/test/cxl.c > @@ -184,12 +184,20 @@ static struct { > } cfmws6; > struct { > struct acpi_cedt_cfmws cfmws; > - u32 target[2]; > + u32 target[1]; > } cfmws7; > struct { > struct acpi_cedt_cfmws cfmws; > - u32 target[3]; > + u32 target[1]; > } cfmws8; > + struct { > + struct acpi_cedt_cfmws cfmws; > + u32 target[2]; > + } cfmws9; > + struct { > + struct acpi_cedt_cfmws cfmws; > + u32 target[3]; > + } cfmws10; > struct { > struct acpi_cedt_cxims cxims; > u64 xormap_list[2]; > @@ -324,22 +332,20 @@ static struct { > }, > .target = { 3 }, > }, > - /* .cfmws6,7,8 use ACPI_CEDT_CFMWS_ARITHMETIC_XOR */ > .cfmws6 = { > .cfmws = { > .header = { > .type = ACPI_CEDT_TYPE_CFMWS, > .length = sizeof(mock_cedt.cfmws6), > }, > - .interleave_arithmetic = ACPI_CEDT_CFMWS_ARITHMETIC_XOR, > .interleave_ways = 0, > .granularity = 4, > .restrictions = ACPI_CEDT_CFMWS_RESTRICT_HOSTONLYMEM | > ACPI_CEDT_CFMWS_RESTRICT_PMEM, > .qtg_id = FAKE_QTG_ID, > - .window_size = SZ_256M * 8UL, > + .window_size = SZ_256M * 4UL, > }, > - .target = { 0, }, > + .target = { 2 }, > }, > .cfmws7 = { > .cfmws = { > @@ -347,16 +353,17 @@ static struct { > .type = ACPI_CEDT_TYPE_CFMWS, > .length = sizeof(mock_cedt.cfmws7), > }, > - .interleave_arithmetic = ACPI_CEDT_CFMWS_ARITHMETIC_XOR, > - .interleave_ways = 1, > - .granularity = 0, > + .interleave_ways = 0, > + .granularity = 4, > .restrictions = ACPI_CEDT_CFMWS_RESTRICT_HOSTONLYMEM | > + ACPI_CEDT_CFMWS_RESTRICT_VOLATILE | > ACPI_CEDT_CFMWS_RESTRICT_PMEM, > .qtg_id = FAKE_QTG_ID, > - .window_size = SZ_256M * 8UL, > + .window_size = SZ_256M * 4UL, > }, > - .target = { 0, 1, }, > + .target = { 1 }, > }, > + /* .cfmws8,9,10 use ACPI_CEDT_CFMWS_ARITHMETIC_XOR */ > .cfmws8 = { > .cfmws = { > .header = { > @@ -364,6 +371,38 @@ static struct { > .length = sizeof(mock_cedt.cfmws8), > }, > .interleave_arithmetic = ACPI_CEDT_CFMWS_ARITHMETIC_XOR, > + .interleave_ways = 0, > + .granularity = 4, > + .restrictions = ACPI_CEDT_CFMWS_RESTRICT_HOSTONLYMEM | > + ACPI_CEDT_CFMWS_RESTRICT_PMEM, > + .qtg_id = FAKE_QTG_ID, > + .window_size = SZ_256M * 8UL, > + }, > + .target = { 0, }, > + }, > + .cfmws9 = { > + .cfmws = { > + .header = { > + .type = ACPI_CEDT_TYPE_CFMWS, > + .length = sizeof(mock_cedt.cfmws9), > + }, > + .interleave_arithmetic = ACPI_CEDT_CFMWS_ARITHMETIC_XOR, > + .interleave_ways = 1, > + .granularity = 0, > + .restrictions = ACPI_CEDT_CFMWS_RESTRICT_HOSTONLYMEM | > + ACPI_CEDT_CFMWS_RESTRICT_PMEM, > + .qtg_id = FAKE_QTG_ID, > + .window_size = SZ_256M * 8UL, > + }, > + .target = { 0, 1, }, > + }, > + .cfmws10 = { > + .cfmws = { > + .header = { > + .type = ACPI_CEDT_TYPE_CFMWS, > + .length = sizeof(mock_cedt.cfmws10), > + }, > + .interleave_arithmetic = ACPI_CEDT_CFMWS_ARITHMETIC_XOR, > .interleave_ways = 8, > .granularity = 1, > .restrictions = ACPI_CEDT_CFMWS_RESTRICT_HOSTONLYMEM | > @@ -406,18 +445,20 @@ struct acpi_cedt_cfmws *mock_cfmws[] = { > [3] = &mock_cedt.cfmws3.cfmws, > [4] = &mock_cedt.cfmws4.cfmws, > [5] = &mock_cedt.cfmws5.cfmws, > - /* Modulo Math above, XOR Math below */ > [6] = &mock_cedt.cfmws6.cfmws, > [7] = &mock_cedt.cfmws7.cfmws, > + /* Modulo Math above, XOR Math below */ > [8] = &mock_cedt.cfmws8.cfmws, > + [9] = &mock_cedt.cfmws9.cfmws, > + [10] = &mock_cedt.cfmws10.cfmws, > }; > > static int cfmws_start; > 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_MOD_ARRAY_END 7 > +#define CFMWS_XOR_ARRAY_START 8 > +#define CFMWS_XOR_ARRAY_END 10 > > struct acpi_cedt_cxims *mock_cxims[1] = { > [0] = &mock_cedt.cxims0.cxims, ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-10-09 23:03 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-10-09 22:11 [PATCH v2 0/3] cxl/test: mockfixups and new topology support Alison Schofield 2026-10-09 22:11 ` [PATCH v2 1/3] tools/testing/cxl: Preserve DPA skip across mock decoder reset Alison Schofield 2026-10-09 23:00 ` Dave Jiang 2026-10-09 22:11 ` [PATCH v2 2/3] tools/testing/cxl: Skip the auto region when no volatile window is active Alison Schofield 2026-10-09 22:24 ` sashiko-bot 2026-10-09 22:39 ` Alison Schofield 2026-10-09 23:02 ` Dave Jiang 2026-10-09 22:11 ` [PATCH v2 3/3] tools/testing/cxl: Add CFMWS windows for region selection tests Alison Schofield 2026-10-09 23:03 ` Dave Jiang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox