Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1.. SPDX-License-Identifier: GPL-2.0
2
3============================
4Inter-Host-Bridge Interleave
5============================
6This cxl-cli configuration dump shows the following host configuration:
7
8* A single socket system with one CXL root
9* CXL Root has Four (4) CXL Host Bridges
10* Two CXL Host Bridges have a single CXL Memory Expander Attached
11* The CXL root is configured to interleave across the two host bridges.
12
13This output is generated by :code:`cxl list -v` and describes the relationships
14between objects exposed in :code:`/sys/bus/cxl/devices/`.
15
16::
17
18 [
19 {
20 "bus":"root0",
21 "provider":"ACPI.CXL",
22 "nr_dports":4,
23 "dports":[
24 {
25 "dport":"pci0000:00",
26 "alias":"ACPI0016:01",
27 "id":0
28 },
29 {
30 "dport":"pci0000:a8",
31 "alias":"ACPI0016:02",
32 "id":4
33 },
34 {
35 "dport":"pci0000:2a",
36 "alias":"ACPI0016:03",
37 "id":1
38 },
39 {
40 "dport":"pci0000:d2",
41 "alias":"ACPI0016:00",
42 "id":5
43 }
44 ],
45
46This chunk shows the CXL "bus" (root0) has 4 downstream ports attached to CXL
47Host Bridges. The `Root` can be considered the singular upstream port attached
48to the platform's memory controller - which routes memory requests to it.
49
50The `ports:root0` section lays out how each of these downstream ports are
51configured. If a port is not configured (id's 0 and 1), they are omitted.
52
53::
54
55 "ports:root0":[
56 {
57 "port":"port1",
58 "host":"pci0000:d2",
59 "depth":1,
60 "nr_dports":3,
61 "dports":[
62 {
63 "dport":"0000:d2:01.1",
64 "alias":"device:02",
65 "id":0
66 },
67 {
68 "dport":"0000:d2:01.3",
69 "alias":"device:05",
70 "id":2
71 },
72 {
73 "dport":"0000:d2:07.1",
74 "alias":"device:0d",
75 "id":113
76 }
77 ],
78
79This chunk shows the available downstream ports associated with the CXL Host
80Bridge :code:`port1`. In this case, :code:`port1` has 3 available downstream
81ports: :code:`dport1`, :code:`dport2`, and :code:`dport113`..
82
83::
84
85 "endpoints:port1":[
86 {
87 "endpoint":"endpoint5",
88 "host":"mem0",
89 "parent_dport":"0000:d2:01.1",
90 "depth":2,
91 "memdev":{
92 "memdev":"mem0",
93 "ram_size":137438953472,
94 "serial":0,
95 "numa_node":0,
96 "host":"0000:d3:00.0"
97 },
98 "decoders:endpoint5":[
99 {
100 "decoder":"decoder5.0",
101 "resource":825975898112,
102 "size":274877906944,
103 "interleave_ways":2,
104 "interleave_granularity":256,
105 "region":"region0",
106 "dpa_resource":0,
107 "dpa_size":137438953472,
108 "mode":"ram"
109 }
110 ]
111 }
112 ],
113
114This chunk shows the endpoints attached to the host bridge :code:`port1`.
115
116:code:`endpoint5` contains a single configured decoder :code:`decoder5.0`
117which has the same interleave configuration as :code:`region0` (shown later).
118
119Next we have the decodesr belonging to the host bridge:
120
121::
122
123 "decoders:port1":[
124 {
125 "decoder":"decoder1.0",
126 "resource":825975898112,
127 "size":274877906944,
128 "interleave_ways":1,
129 "region":"region0",
130 "nr_targets":1,
131 "targets":[
132 {
133 "target":"0000:d2:01.1",
134 "alias":"device:02",
135 "position":0,
136 "id":0
137 }
138 ]
139 }
140 ]
141 },
142
143Host Bridge :code:`port1` has a single decoder (:code:`decoder1.0`), whose only
144target is :code:`dport1` - which is attached to :code:`endpoint5`.
145
146The following chunk shows a similar configuration for Host Bridge :code:`port3`,
147the second host bridge with a memory device attached.
148
149::
150
151 {
152 "port":"port3",
153 "host":"pci0000:a8",
154 "depth":1,
155 "nr_dports":1,
156 "dports":[
157 {
158 "dport":"0000:a8:01.1",
159 "alias":"device:c3",
160 "id":0
161 }
162 ],
163 "endpoints:port3":[
164 {
165 "endpoint":"endpoint6",
166 "host":"mem1",
167 "parent_dport":"0000:a8:01.1",
168 "depth":2,
169 "memdev":{
170 "memdev":"mem1",
171 "ram_size":137438953472,
172 "serial":0,
173 "numa_node":0,
174 "host":"0000:a9:00.0"
175 },
176 "decoders:endpoint6":[
177 {
178 "decoder":"decoder6.0",
179 "resource":825975898112,
180 "size":274877906944,
181 "interleave_ways":2,
182 "interleave_granularity":256,
183 "region":"region0",
184 "dpa_resource":0,
185 "dpa_size":137438953472,
186 "mode":"ram"
187 }
188 ]
189 }
190 ],
191 "decoders:port3":[
192 {
193 "decoder":"decoder3.0",
194 "resource":825975898112,
195 "size":274877906944,
196 "interleave_ways":1,
197 "region":"region0",
198 "nr_targets":1,
199 "targets":[
200 {
201 "target":"0000:a8:01.1",
202 "alias":"device:c3",
203 "position":0,
204 "id":0
205 }
206 ]
207 }
208 ]
209 },
210
211
212The next chunk shows the two CXL host bridges without attached endpoints.
213
214::
215
216 {
217 "port":"port2",
218 "host":"pci0000:00",
219 "depth":1,
220 "nr_dports":2,
221 "dports":[
222 {
223 "dport":"0000:00:01.3",
224 "alias":"device:55",
225 "id":2
226 },
227 {
228 "dport":"0000:00:07.1",
229 "alias":"device:5d",
230 "id":113
231 }
232 ]
233 },
234 {
235 "port":"port4",
236 "host":"pci0000:2a",
237 "depth":1,
238 "nr_dports":1,
239 "dports":[
240 {
241 "dport":"0000:2a:01.1",
242 "alias":"device:d0",
243 "id":0
244 }
245 ]
246 }
247 ],
248
249Next we have the `Root Decoders` belonging to :code:`root0`. This root decoder
250applies the interleave across the downstream ports :code:`port1` and
251:code:`port3` - with a granularity of 256 bytes.
252
253This information is generated by the CXL driver reading the ACPI CEDT CMFWS.
254
255::
256
257 "decoders:root0":[
258 {
259 "decoder":"decoder0.0",
260 "resource":825975898112,
261 "size":274877906944,
262 "interleave_ways":2,
263 "interleave_granularity":256,
264 "max_available_extent":0,
265 "volatile_capable":true,
266 "nr_targets":2,
267 "targets":[
268 {
269 "target":"pci0000:a8",
270 "alias":"ACPI0016:02",
271 "position":1,
272 "id":4
273 },
274 {
275 "target":"pci0000:d2",
276 "alias":"ACPI0016:00",
277 "position":0,
278 "id":5
279 }
280 ],
281
282Finally we have the `Memory Region` associated with the `Root Decoder`
283:code:`decoder0.0`. This region describes the overall interleave configuration
284of the interleave set.
285
286::
287
288 "regions:decoder0.0":[
289 {
290 "region":"region0",
291 "resource":825975898112,
292 "size":274877906944,
293 "type":"ram",
294 "interleave_ways":2,
295 "interleave_granularity":256,
296 "decode_state":"commit",
297 "mappings":[
298 {
299 "position":1,
300 "memdev":"mem1",
301 "decoder":"decoder6.0"
302 },
303 {
304 "position":0,
305 "memdev":"mem0",
306 "decoder":"decoder5.0"
307 }
308 ]
309 }
310 ]
311 }
312 ]
313 }
314 ]