Documentation/driver-api/cxl/linux/example-configurations/multi-interleave.rst GitHub 원문 ↗

Linux 6.18.37 · Driver API / CXL / Linux / Example Configurations

Multi-Level Interleave

두 Host Bridge와 각 bridge 아래 두 Memory Expander를 결합한 4-way 다단계 interleave의 decoder 및 region mapping을 풀이합니다.

Source pathDocumentation/driver-api/cxl/linux/example-configurations/multi-interleave.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약과 해설

multi-interleave.rst:1-401

이 예제는 root의 2-way 256-byte interleave와 각 Host Bridge의 2-way 512-byte interleave를 결합해 endpoint 네 개에 대한 4-way region을 구성합니다. mapping position 0~3은 `mem0`, `mem2`, `mem1`, `mem3` 순서이며, 원문에 있는 decoder 이름·target 수·JSON 쉼표 불일치도 수정 없이 보존하고 별도로 해설합니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 .. SPDX-License-Identifier: GPL-2.0
2
3 ======================
4 Multi-Level Interleave
5 ======================
6 This 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 two CXL Memory Expanders Attached each.
11 * The CXL root is configured to interleave across the two host bridges.
12 * Each host bridge with expanders interleaves across two endpoints.
13
14 This output is generated by :code:`cxl list -v` and describes the relationships
15 between objects exposed in :code:`/sys/bus/cxl/devices/`.
16
17 ::
18
19 [
20 {
21 "bus":"root0",
22 "provider":"ACPI.CXL",
23 "nr_dports":4,
24 "dports":[
25 {
26 "dport":"pci0000:00",
27 "alias":"ACPI0016:01",
28 "id":0
29 },
30 {
31 "dport":"pci0000:a8",
32 "alias":"ACPI0016:02",
33 "id":4
34 },
35 {
36 "dport":"pci0000:2a",
37 "alias":"ACPI0016:03",
38 "id":1
39 },
40 {
41 "dport":"pci0000:d2",
42 "alias":"ACPI0016:00",
43 "id":5
44 }
45 ],
46
47 This chunk shows the CXL "bus" (root0) has 4 downstream ports attached to CXL
48 Host Bridges. The `Root` can be considered the singular upstream port attached
49 to the platform's memory controller - which routes memory requests to it.
50
51 The `ports:root0` section lays out how each of these downstream ports are
52 configured. If a port is not configured (id's 0 and 1), they are omitted.
53
54 ::
55
56 "ports:root0":[
57 {
58 "port":"port1",
59 "host":"pci0000:d2",
60 "depth":1,
61 "nr_dports":3,
62 "dports":[
63 {
64 "dport":"0000:d2:01.1",
65 "alias":"device:02",
66 "id":0
67 },
68 {
69 "dport":"0000:d2:01.3",
70 "alias":"device:05",
71 "id":2
72 },
73 {
74 "dport":"0000:d2:07.1",
75 "alias":"device:0d",
76 "id":113
77 }
78 ],
79
80 This chunk shows the available downstream ports associated with the CXL Host
81 Bridge :code:`port1`. In this case, :code:`port1` has 3 available downstream
82 ports: :code:`dport0`, :code:`dport2`, and :code:`dport113`.
83
84 ::
85
86 "endpoints:port1":[
87 {
88 "endpoint":"endpoint5",
89 "host":"mem0",
90 "parent_dport":"0000:d2:01.1",
91 "depth":2,
92 "memdev":{
93 "memdev":"mem0",
94 "ram_size":137438953472,
95 "serial":0,
96 "numa_node":0,
97 "host":"0000:d3:00.0"
98 },
99 "decoders:endpoint5":[
100 {
101 "decoder":"decoder5.0",
102 "resource":825975898112,
103 "size":549755813888,
104 "interleave_ways":4,
105 "interleave_granularity":256,
106 "region":"region0",
107 "dpa_resource":0,
108 "dpa_size":137438953472,
109 "mode":"ram"
110 }
111 ]
112 },
113 {
114 "endpoint":"endpoint6",
115 "host":"mem1",
116 "parent_dport":"0000:d2:01.3",
117 "depth":2,
118 "memdev":{
119 "memdev":"mem1",
120 "ram_size":137438953472,
121 "serial":0,
122 "numa_node":0,
123 "host":"0000:d3:00.0"
124 },
125 "decoders:endpoint6":[
126 {
127 "decoder":"decoder6.0",
128 "resource":825975898112,
129 "size":549755813888,
130 "interleave_ways":4,
131 "interleave_granularity":256,
132 "region":"region0",
133 "dpa_resource":0,
134 "dpa_size":137438953472,
135 "mode":"ram"
136 }
137 ]
138 }
139 ],
140
141 This chunk shows the endpoints attached to the host bridge :code:`port1`.
142
143 :code:`endpoint5` contains a single configured decoder :code:`decoder5.0`
144 which has the same interleave configuration as :code:`region0` (shown later).
145
146 :code:`endpoint6` contains a single configured decoder :code:`decoder5.0`
147 which has the same interleave configuration as :code:`region0` (shown later).
148
149 Next we have the decoders belonging to the host bridge:
150
151 ::
152
153 "decoders:port1":[
154 {
155 "decoder":"decoder1.0",
156 "resource":825975898112,
157 "size":549755813888,
158 "interleave_ways":2,
159 "interleave_granularity":512,
160 "region":"region0",
161 "nr_targets":2,
162 "targets":[
163 {
164 "target":"0000:d2:01.1",
165 "alias":"device:02",
166 "position":0,
167 "id":0
168 },
169 {
170 "target":"0000:d2:01.3",
171 "alias":"device:05",
172 "position":2,
173 "id":0
174 }
175 ]
176 }
177 ]
178 },
179
180 Host Bridge :code:`port1` has a single decoder (:code:`decoder1.0`), whose
181 targets are :code:`dport0` and :code:`dport2` - which are attached to
182 :code:`endpoint5` and :code:`endpoint6` respectively.
183
184 The following chunk shows a similar configuration for Host Bridge :code:`port3`,
185 the second host bridge with a memory device attached.
186
187 ::
188
189 {
190 "port":"port3",
191 "host":"pci0000:a8",
192 "depth":1,
193 "nr_dports":1,
194 "dports":[
195 {
196 "dport":"0000:a8:01.1",
197 "alias":"device:c3",
198 "id":0
199 },
200 {
201 "dport":"0000:a8:01.3",
202 "alias":"device:c5",
203 "id":0
204 }
205 ],
206 "endpoints:port3":[
207 {
208 "endpoint":"endpoint7",
209 "host":"mem2",
210 "parent_dport":"0000:a8:01.1",
211 "depth":2,
212 "memdev":{
213 "memdev":"mem2",
214 "ram_size":137438953472,
215 "serial":0,
216 "numa_node":0,
217 "host":"0000:a9:00.0"
218 },
219 "decoders:endpoint7":[
220 {
221 "decoder":"decoder7.0",
222 "resource":825975898112,
223 "size":549755813888,
224 "interleave_ways":4,
225 "interleave_granularity":256,
226 "region":"region0",
227 "dpa_resource":0,
228 "dpa_size":137438953472,
229 "mode":"ram"
230 }
231 ]
232 },
233 {
234 "endpoint":"endpoint8",
235 "host":"mem3",
236 "parent_dport":"0000:a8:01.3",
237 "depth":2,
238 "memdev":{
239 "memdev":"mem3",
240 "ram_size":137438953472,
241 "serial":0,
242 "numa_node":0,
243 "host":"0000:a9:00.0"
244 },
245 "decoders:endpoint8":[
246 {
247 "decoder":"decoder8.0",
248 "resource":825975898112,
249 "size":549755813888,
250 "interleave_ways":4,
251 "interleave_granularity":256,
252 "region":"region0",
253 "dpa_resource":0,
254 "dpa_size":137438953472,
255 "mode":"ram"
256 }
257 ]
258 }
259 ],
260 "decoders:port3":[
261 {
262 "decoder":"decoder3.0",
263 "resource":825975898112,
264 "size":549755813888,
265 "interleave_ways":2,
266 "interleave_granularity":512,
267 "region":"region0",
268 "nr_targets":1,
269 "targets":[
270 {
271 "target":"0000:a8:01.1",
272 "alias":"device:c3",
273 "position":1,
274 "id":0
275 },
276 {
277 "target":"0000:a8:01.3",
278 "alias":"device:c5",
279 "position":3,
280 "id":0
281 }
282 ]
283 }
284 ]
285 },
286
287
288 The next chunk shows the two CXL host bridges without attached endpoints.
289
290 ::
291
292 {
293 "port":"port2",
294 "host":"pci0000:00",
295 "depth":1,
296 "nr_dports":2,
297 "dports":[
298 {
299 "dport":"0000:00:01.3",
300 "alias":"device:55",
301 "id":2
302 },
303 {
304 "dport":"0000:00:07.1",
305 "alias":"device:5d",
306 "id":113
307 }
308 ]
309 },
310 {
311 "port":"port4",
312 "host":"pci0000:2a",
313 "depth":1,
314 "nr_dports":1,
315 "dports":[
316 {
317 "dport":"0000:2a:01.1",
318 "alias":"device:d0",
319 "id":0
320 }
321 ]
322 }
323 ],
324
325 Next we have the `Root Decoders` belonging to :code:`root0`. This root decoder
326 applies the interleave across the downstream ports :code:`port1` and
327 :code:`port3` - with a granularity of 256 bytes.
328
329 This information is generated by the CXL driver reading the ACPI CEDT CMFWS.
330
331 ::
332
333 "decoders:root0":[
334 {
335 "decoder":"decoder0.0",
336 "resource":825975898112,
337 "size":549755813888,
338 "interleave_ways":2,
339 "interleave_granularity":256,
340 "max_available_extent":0,
341 "volatile_capable":true,
342 "nr_targets":2,
343 "targets":[
344 {
345 "target":"pci0000:a8",
346 "alias":"ACPI0016:02",
347 "position":1,
348 "id":4
349 },
350 {
351 "target":"pci0000:d2",
352 "alias":"ACPI0016:00",
353 "position":0,
354 "id":5
355 }
356 ],
357
358 Finally we have the `Memory Region` associated with the `Root Decoder`
359 :code:`decoder0.0`. This region describes the overall interleave configuration
360 of the interleave set. So we see there are a total of :code:`4` interleave
361 targets across 4 endpoint decoders.
362
363 ::
364
365 "regions:decoder0.0":[
366 {
367 "region":"region0",
368 "resource":825975898112,
369 "size":549755813888,
370 "type":"ram",
371 "interleave_ways":4,
372 "interleave_granularity":256,
373 "decode_state":"commit",
374 "mappings":[
375 {
376 "position":3,
377 "memdev":"mem3",
378 "decoder":"decoder8.0"
379 },
380 {
381 "position":2,
382 "memdev":"mem1",
383 "decoder":"decoder6.0"
384 }
385 {
386 "position":1,
387 "memdev":"mem2",
388 "decoder":"decoder7.0"
389 },
390 {
391 "position":0,
392 "memdev":"mem0",
393 "decoder":"decoder5.0"
394 }
395 ]
396 }
397 ]
398 }
399 ]
400 }
401 ]
402

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

다단계 interleave 구성

1-18
.. SPDX-License-Identifier: GPL-2.0

이 `Multi-Level Interleave`의 `cxl-cli` configuration dump는 다음 host 구성을 보여 줍니다.

  • CXL root가 하나인 single-socket system입니다.
  • CXL Root에는 CXL Host Bridge가 네 개 있습니다.
  • 그중 두 CXL Host Bridge에 CXL Memory Expander가 두 개씩 연결되어 있습니다.
  • CXL root는 두 host bridge에 걸쳐 interleave하도록 구성되어 있습니다.
  • Expander가 있는 각 host bridge도 두 endpoint에 걸쳐 interleave합니다.

이 출력은 `cxl list -v`로 생성했으며 `/sys/bus/cxl/devices/`에 노출되는 object 사이의 관계를 설명합니다.

CXL root bus와 downstream port

19-53
[
  {
      "bus":"root0",
      "provider":"ACPI.CXL",
      "nr_dports":4,
      "dports":[
          {
              "dport":"pci0000:00",
              "alias":"ACPI0016:01",
              "id":0
          },
          {
              "dport":"pci0000:a8",
              "alias":"ACPI0016:02",
              "id":4
          },
          {
              "dport":"pci0000:2a",
              "alias":"ACPI0016:03",
              "id":1
          },
          {
              "dport":"pci0000:d2",
              "alias":"ACPI0016:00",
              "id":5
          }
      ],

이 부분은 CXL `bus`인 `root0`에 CXL Host Bridge로 연결되는 downstream port 네 개가 있음을 보여 줍니다. `Root`는 platform memory controller에 연결된 하나의 upstream port로 볼 수 있고, memory controller는 memory request를 이 port로 routing합니다.

`ports:root0` section은 각 downstream port의 구성을 펼쳐 보여 줍니다. 구성되지 않은 port, 즉 ID 0과 1은 이 section에서 생략됩니다.

Host Bridge port1의 downstream port

54-83
"ports:root0":[
    {
        "port":"port1",
        "host":"pci0000:d2",
        "depth":1,
        "nr_dports":3,
        "dports":[
            {
                "dport":"0000:d2:01.1",
                "alias":"device:02",
                "id":0
            },
            {
                "dport":"0000:d2:01.3",
                "alias":"device:05",
                "id":2
            },
            {
                "dport":"0000:d2:07.1",
                "alias":"device:0d",
                "id":113
            }
        ],

이 부분은 CXL Host Bridge `port1`에 연결된 사용 가능한 downstream port를 보여 줍니다. 여기서 `port1`에는 `dport0`, `dport2`, `dport113`이라는 downstream port 세 개가 있습니다.

port1의 endpoint5와 endpoint6

84-150
"endpoints:port1":[
    {
        "endpoint":"endpoint5",
        "host":"mem0",
        "parent_dport":"0000:d2:01.1",
        "depth":2,
        "memdev":{
            "memdev":"mem0",
            "ram_size":137438953472,
            "serial":0,
            "numa_node":0,
            "host":"0000:d3:00.0"
        },
        "decoders:endpoint5":[
            {
                "decoder":"decoder5.0",
                "resource":825975898112,
                "size":549755813888,
                "interleave_ways":4,
                "interleave_granularity":256,
                "region":"region0",
                "dpa_resource":0,
                "dpa_size":137438953472,
                "mode":"ram"
            }
        ]
    },
    {
        "endpoint":"endpoint6",
        "host":"mem1",
        "parent_dport":"0000:d2:01.3",
        "depth":2,
        "memdev":{
            "memdev":"mem1",
            "ram_size":137438953472,
            "serial":0,
            "numa_node":0,
            "host":"0000:d3:00.0"
        },
        "decoders:endpoint6":[
            {
                "decoder":"decoder6.0",
                "resource":825975898112,
                "size":549755813888,
                "interleave_ways":4,
                "interleave_granularity":256,
                "region":"region0",
                "dpa_resource":0,
                "dpa_size":137438953472,
                "mode":"ram"
            }
        ]
    }
],

이 부분은 host bridge `port1`에 연결된 endpoint를 보여 줍니다. `endpoint5`는 `mem0` 및 `0000:d2:01.1`에, `endpoint6`은 `mem1` 및 `0000:d2:01.3`에 연결됩니다.

`decoder5.0`과 `decoder6.0`은 모두 `region0`의 전체 구성을 반영해 4-way, 256-byte granularity, 549755813888-byte region을 decode합니다. 각 endpoint가 제공하는 DPA size는 137438953472 byte이고 mode는 `ram`입니다.

원문 설명은 `endpoint6`의 decoder도 `decoder5.0`이라고 적었지만 dump에는 `decoder6.0`으로 표시됩니다. 원문 블록과 설명은 수정하지 않고 각각의 표기를 해설에서 구분합니다.

다음으로 host bridge 자체에 속한 decoder가 이어집니다.

port1의 Host Bridge decoder

151-186
    "decoders:port1":[
        {
            "decoder":"decoder1.0",
            "resource":825975898112,
            "size":549755813888,
            "interleave_ways":2,
            "interleave_granularity":512,
            "region":"region0",
            "nr_targets":2,
            "targets":[
                {
                    "target":"0000:d2:01.1",
                    "alias":"device:02",
                    "position":0,
                    "id":0
                },
                {
                    "target":"0000:d2:01.3",
                    "alias":"device:05",
                    "position":2,
                    "id":0
                }
            ]
        }
    ]
},

Host Bridge `port1`에는 decoder `decoder1.0`이 하나 있습니다. target은 `dport0`과 `dport2`이며 각각 `endpoint5`와 `endpoint6`에 연결됩니다. target position은 0과 2입니다.

이 bridge decoder는 2-way interleave와 512-byte granularity를 사용합니다. 상위 root의 256-byte, 2-way interleave 한 cycle이 512 byte이므로 host bridge 내부 선택 단위가 이에 맞춰집니다.

이어서 memory device가 연결된 두 번째 host bridge인 `port3`의 유사한 구성을 보여 줍니다.

Host Bridge port3과 두 endpoint

187-289
{
    "port":"port3",
    "host":"pci0000:a8",
    "depth":1,
    "nr_dports":1,
    "dports":[
        {
            "dport":"0000:a8:01.1",
            "alias":"device:c3",
            "id":0
        },
        {
            "dport":"0000:a8:01.3",
            "alias":"device:c5",
            "id":0
        }
    ],
    "endpoints:port3":[
        {
            "endpoint":"endpoint7",
            "host":"mem2",
            "parent_dport":"0000:a8:01.1",
            "depth":2,
            "memdev":{
                "memdev":"mem2",
                "ram_size":137438953472,
                "serial":0,
                "numa_node":0,
                "host":"0000:a9:00.0"
            },
            "decoders:endpoint7":[
                {
                    "decoder":"decoder7.0",
                    "resource":825975898112,
                    "size":549755813888,
                    "interleave_ways":4,
                    "interleave_granularity":256,
                    "region":"region0",
                    "dpa_resource":0,
                    "dpa_size":137438953472,
                    "mode":"ram"
                }
            ]
        },
        {
            "endpoint":"endpoint8",
            "host":"mem3",
            "parent_dport":"0000:a8:01.3",
            "depth":2,
            "memdev":{
                "memdev":"mem3",
                "ram_size":137438953472,
                "serial":0,
                "numa_node":0,
                "host":"0000:a9:00.0"
            },
            "decoders:endpoint8":[
                {
                    "decoder":"decoder8.0",
                    "resource":825975898112,
                    "size":549755813888,
                    "interleave_ways":4,
                    "interleave_granularity":256,
                    "region":"region0",
                    "dpa_resource":0,
                    "dpa_size":137438953472,
                    "mode":"ram"
                }
            ]
        }
    ],
    "decoders:port3":[
        {
            "decoder":"decoder3.0",
            "resource":825975898112,
            "size":549755813888,
            "interleave_ways":2,
            "interleave_granularity":512,
            "region":"region0",
            "nr_targets":1,
            "targets":[
                {
                    "target":"0000:a8:01.1",
                    "alias":"device:c3",
                    "position":1,
                    "id":0
                },
                {
                    "target":"0000:a8:01.3",
                    "alias":"device:c5",
                    "position":3,
                    "id":0
                }
            ]
        }
    ]
},

`port3`에는 downstream port `0000:a8:01.1`과 `0000:a8:01.3`이 있고, 각각 `mem2`의 `endpoint7`과 `mem3`의 `endpoint8`이 연결됩니다.

`decoder7.0`과 `decoder8.0`도 4-way, 256-byte granularity, 549755813888-byte region을 decode하며 각각 137438953472-byte DPA를 제공합니다.

Host Bridge decoder `decoder3.0`은 2-way, 512-byte granularity로 두 target을 position 1과 3에 배치합니다. dump의 `nr_targets` 값은 1이지만 실제 `targets` 배열에는 두 항목이 있으며, 이 불일치는 원문 그대로 보존됩니다.

다음 부분은 endpoint가 연결되지 않은 CXL host bridge 두 개를 보여 줍니다.

Endpoint가 없는 두 Host Bridge

290-330
    {
        "port":"port2",
        "host":"pci0000:00",
        "depth":1,
        "nr_dports":2,
        "dports":[
            {
                "dport":"0000:00:01.3",
                "alias":"device:55",
                "id":2
            },
            {
                "dport":"0000:00:07.1",
                "alias":"device:5d",
                "id":113
            }
        ]
    },
    {
        "port":"port4",
        "host":"pci0000:2a",
        "depth":1,
        "nr_dports":1,
        "dports":[
            {
                "dport":"0000:2a:01.1",
                "alias":"device:d0",
                "id":0
            }
        ]
    }
],

`port2`에는 downstream port 두 개가 있고 `port4`에는 하나가 있지만, 어느 bridge에도 endpoint나 구성된 decoder가 표시되지 않습니다.

다음은 `root0`에 속한 `Root Decoder`입니다. 이 root decoder는 downstream port `port1`과 `port3`에 걸쳐 256-byte granularity로 interleave를 적용합니다.

이 정보는 CXL driver가 ACPI CEDT의 CFMWS를 읽어 생성하며, 원문에는 구조 이름이 `CMFWS`로 표기되어 있습니다.

root0의 Root Decoder

331-362
"decoders:root0":[
    {
        "decoder":"decoder0.0",
        "resource":825975898112,
        "size":549755813888,
        "interleave_ways":2,
        "interleave_granularity":256,
        "max_available_extent":0,
        "volatile_capable":true,
        "nr_targets":2,
        "targets":[
            {
                "target":"pci0000:a8",
                "alias":"ACPI0016:02",
                "position":1,
                "id":4
            },
            {
                "target":"pci0000:d2",
                "alias":"ACPI0016:00",
                "position":0,
                "id":5
            }
        ],

`decoder0.0`은 2-way, 256-byte granularity를 사용합니다. target position 0은 `pci0000:d2`의 `port1`, position 1은 `pci0000:a8`의 `port3`입니다.

마지막은 `Root Decoder` `decoder0.0`과 연결된 `Memory Region`입니다. 이 region은 interleave set 전체의 구성을 설명하며, 네 endpoint decoder에 걸친 interleave target은 총 4개입니다.

4-way Memory Region

363-401
              "regions:decoder0.0":[
                  {
                      "region":"region0",
                      "resource":825975898112,
                      "size":549755813888,
                      "type":"ram",
                      "interleave_ways":4,
                      "interleave_granularity":256,
                      "decode_state":"commit",
                      "mappings":[
                          {
                              "position":3,
                              "memdev":"mem3",
                              "decoder":"decoder8.0"
                          },
                          {
                              "position":2,
                              "memdev":"mem1",
                              "decoder":"decoder6.0"
                          }
                          {
                              "position":1,
                              "memdev":"mem2",
                              "decoder":"decoder7.0"
                          },
                          {
                              "position":0,
                              "memdev":"mem0",
                              "decoder":"decoder5.0"
                          }
                      ]
                  }
              ]
          }
      ]
  }
]

`region0`은 549755813888-byte RAM region이며 4-way, 256-byte granularity로 `commit`된 상태입니다. mapping position 0은 `mem0`의 `decoder5.0`, position 1은 `mem2`의 `decoder7.0`, position 2는 `mem1`의 `decoder6.0`, position 3은 `mem3`의 `decoder8.0`입니다.

이 position 순서는 root decoder가 `port1`과 `port3`을 번갈아 선택하고, 각 host bridge decoder가 자기 아래 두 endpoint를 다시 번갈아 선택한 결과입니다.

원문 JSON에는 position 2 mapping 객체 뒤의 쉼표가 빠져 있습니다. 이 구문 오류도 원문 블록에서는 수정하지 않고 그대로 보존합니다.