]> Git Repo - linux.git/commitdiff
cxl/region: Fix x1 root-decoder granularity calculations
authorJim Harris <[email protected]>
Thu, 26 Oct 2023 17:09:06 +0000 (10:09 -0700)
committerDan Williams <[email protected]>
Fri, 27 Oct 2023 20:04:52 +0000 (13:04 -0700)
Root decoder granularity must match value from CFWMS, which may not
be the region's granularity for non-interleaved root decoders.

So when calculating granularities for host bridge decoders, use the
region's granularity instead of the root decoder's granularity to ensure
the correct granularities are set for the host bridge decoders and any
downstream switch decoders.

Test configuration is 1 host bridge * 2 switches * 2 endpoints per switch.

Region created with 2048 granularity using following command line:

cxl create-region -m -d decoder0.0 -w 4 mem0 mem2 mem1 mem3 \
  -g 2048 -s 2048M

Use "cxl list -PDE | grep granularity" to get a view of the granularity
set at each level of the topology.

Before this patch:
        "interleave_granularity":2048,
        "interleave_granularity":2048,
    "interleave_granularity":512,
        "interleave_granularity":2048,
        "interleave_granularity":2048,
    "interleave_granularity":512,
"interleave_granularity":256,

After:
        "interleave_granularity":2048,
        "interleave_granularity":2048,
    "interleave_granularity":4096,
        "interleave_granularity":2048,
        "interleave_granularity":2048,
    "interleave_granularity":4096,
"interleave_granularity":2048,

Fixes: 27b3f8d13830 ("cxl/region: Program target lists")
Cc: <[email protected]>
Signed-off-by: Jim Harris <[email protected]>
Link: https://lore.kernel.org/r/169824893473.1403938.16110924262989774582.stgit@bgt-140510-bm03.eng.stellus.in
[djbw: fixup the prebuilt cxl_test region]
Signed-off-by: Dan Williams <[email protected]>
drivers/cxl/core/region.c
tools/testing/cxl/test/cxl.c

index 3167b19f40814da8e0d43aba85a3b0f81534600c..a1eac592c66a9734baaa0ddaf9216c14ea829582 100644 (file)
@@ -1127,7 +1127,14 @@ static int cxl_port_setup_targets(struct cxl_port *port,
        }
 
        if (is_cxl_root(parent_port)) {
-               parent_ig = cxlrd->cxlsd.cxld.interleave_granularity;
+               /*
+                * Root decoder IG is always set to value in CFMWS which
+                * may be different than this region's IG.  We can use the
+                * region's IG here since interleave_granularity_store()
+                * does not allow interleaved host-bridges with
+                * root IG != region IG.
+                */
+               parent_ig = p->interleave_granularity;
                parent_iw = cxlrd->cxlsd.cxld.interleave_ways;
                /*
                 * For purposes of address bit routing, use power-of-2 math for
index fb6ab9cef84f773665ef83ff1ccc9f6510a143e7..b8854629990227d9f3f984298db0e70ce95849d4 100644 (file)
@@ -831,7 +831,7 @@ static void mock_init_hdm_decoder(struct cxl_decoder *cxld)
                        cxld->interleave_ways = 2;
                else
                        cxld->interleave_ways = 1;
-               cxld->interleave_granularity = 256;
+               cxld->interleave_granularity = 4096;
                cxld->hpa_range = (struct range) {
                        .start = base,
                        .end = base + size - 1,
This page took 0.070664 seconds and 4 git commands to generate.