Skip to content

Commit 298d44d

Browse files
committed
cxl/region: Fix x1 interleave to greater than x1 interleave routing
In cases where the decode fans out as it traverses downstream, the interleave granularity needs to increment to identify the port selector bits out of the remaining address bits. For example, recall that with an x2 parent port intereleave (IW == 1), the downstream decode for children of those ports will either see address bit IG+8 always set, or address bit IG+8 always clear. So if the child port needs to select a downstream port it can only use address bits starting at IG+9 (where IG and IW are the CXL encoded values for interleave granularity (ilog2(ig) - 8) and ways (ilog2(iw))). When the parent port interleave is x1 no such masking occurs and the child port can maintain the granularity that was routed to the parent port. Reported-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Reviewed-by: Vishal Verma <vishal.l.verma@intel.com> Reviewed-by: Ira Weiny <ira.weiny@intel.com> Link: https://lore.kernel.org/r/165973126583.1526540.657948655360009242.stgit@dwillia2-xfh.jf.intel.com Signed-off-by: Dan Williams <dan.j.williams@intel.com>
1 parent 910bc55 commit 298d44d

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

drivers/cxl/core/region.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1025,7 +1025,11 @@ static int cxl_port_setup_targets(struct cxl_port *port,
10251025
return rc;
10261026
}
10271027

1028-
if (cxl_rr->nr_targets > 1) {
1028+
/*
1029+
* If @parent_port is masking address bits, pick the next unused address
1030+
* bit to route @port's targets.
1031+
*/
1032+
if (parent_iw > 1 && cxl_rr->nr_targets > 1) {
10291033
u32 address_bit = max(peig + peiw, eiw + peig);
10301034

10311035
eig = address_bit - eiw + 1;

0 commit comments

Comments
 (0)