162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci.. include:: <isonum.txt>
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci===================================
562306a36Sopenharmony_ciCompute Express Link Memory Devices
662306a36Sopenharmony_ci===================================
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciA Compute Express Link Memory Device is a CXL component that implements the
962306a36Sopenharmony_ciCXL.mem protocol. It contains some amount of volatile memory, persistent memory,
1062306a36Sopenharmony_cior both. It is enumerated as a PCI device for configuration and passing
1162306a36Sopenharmony_cimessages over an MMIO mailbox. Its contribution to the System Physical
1262306a36Sopenharmony_ciAddress space is handled via HDM (Host Managed Device Memory) decoders
1362306a36Sopenharmony_cithat optionally define a device's contribution to an interleaved address
1462306a36Sopenharmony_cirange across multiple devices underneath a host-bridge or interleaved
1562306a36Sopenharmony_ciacross host-bridges.
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciCXL Bus: Theory of Operation
1862306a36Sopenharmony_ci============================
1962306a36Sopenharmony_ciSimilar to how a RAID driver takes disk objects and assembles them into a new
2062306a36Sopenharmony_cilogical device, the CXL subsystem is tasked to take PCIe and ACPI objects and
2162306a36Sopenharmony_ciassemble them into a CXL.mem decode topology. The need for runtime configuration
2262306a36Sopenharmony_ciof the CXL.mem topology is also similar to RAID in that different environments
2362306a36Sopenharmony_ciwith the same hardware configuration may decide to assemble the topology in
2462306a36Sopenharmony_cicontrasting ways. One may choose performance (RAID0) striping memory across
2562306a36Sopenharmony_cimultiple Host Bridges and endpoints while another may opt for fault tolerance
2662306a36Sopenharmony_ciand disable any striping in the CXL.mem topology.
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ciPlatform firmware enumerates a menu of interleave options at the "CXL root port"
2962306a36Sopenharmony_ci(Linux term for the top of the CXL decode topology). From there, PCIe topology
3062306a36Sopenharmony_cidictates which endpoints can participate in which Host Bridge decode regimes.
3162306a36Sopenharmony_ciEach PCIe Switch in the path between the root and an endpoint introduces a point
3262306a36Sopenharmony_ciat which the interleave can be split. For example platform firmware may say at a
3362306a36Sopenharmony_cigiven range only decodes to 1 one Host Bridge, but that Host Bridge may in turn
3462306a36Sopenharmony_ciinterleave cycles across multiple Root Ports. An intervening Switch between a
3562306a36Sopenharmony_ciport and an endpoint may interleave cycles across multiple Downstream Switch
3662306a36Sopenharmony_ciPorts, etc.
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciHere is a sample listing of a CXL topology defined by 'cxl_test'. The 'cxl_test'
3962306a36Sopenharmony_cimodule generates an emulated CXL topology of 2 Host Bridges each with 2 Root
4062306a36Sopenharmony_ciPorts. Each of those Root Ports are connected to 2-way switches with endpoints
4162306a36Sopenharmony_ciconnected to those downstream ports for a total of 8 endpoints::
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci    # cxl list -BEMPu -b cxl_test
4462306a36Sopenharmony_ci    {
4562306a36Sopenharmony_ci      "bus":"root3",
4662306a36Sopenharmony_ci      "provider":"cxl_test",
4762306a36Sopenharmony_ci      "ports:root3":[
4862306a36Sopenharmony_ci        {
4962306a36Sopenharmony_ci          "port":"port5",
5062306a36Sopenharmony_ci          "host":"cxl_host_bridge.1",
5162306a36Sopenharmony_ci          "ports:port5":[
5262306a36Sopenharmony_ci            {
5362306a36Sopenharmony_ci              "port":"port8",
5462306a36Sopenharmony_ci              "host":"cxl_switch_uport.1",
5562306a36Sopenharmony_ci              "endpoints:port8":[
5662306a36Sopenharmony_ci                {
5762306a36Sopenharmony_ci                  "endpoint":"endpoint9",
5862306a36Sopenharmony_ci                  "host":"mem2",
5962306a36Sopenharmony_ci                  "memdev":{
6062306a36Sopenharmony_ci                    "memdev":"mem2",
6162306a36Sopenharmony_ci                    "pmem_size":"256.00 MiB (268.44 MB)",
6262306a36Sopenharmony_ci                    "ram_size":"256.00 MiB (268.44 MB)",
6362306a36Sopenharmony_ci                    "serial":"0x1",
6462306a36Sopenharmony_ci                    "numa_node":1,
6562306a36Sopenharmony_ci                    "host":"cxl_mem.1"
6662306a36Sopenharmony_ci                  }
6762306a36Sopenharmony_ci                },
6862306a36Sopenharmony_ci                {
6962306a36Sopenharmony_ci                  "endpoint":"endpoint15",
7062306a36Sopenharmony_ci                  "host":"mem6",
7162306a36Sopenharmony_ci                  "memdev":{
7262306a36Sopenharmony_ci                    "memdev":"mem6",
7362306a36Sopenharmony_ci                    "pmem_size":"256.00 MiB (268.44 MB)",
7462306a36Sopenharmony_ci                    "ram_size":"256.00 MiB (268.44 MB)",
7562306a36Sopenharmony_ci                    "serial":"0x5",
7662306a36Sopenharmony_ci                    "numa_node":1,
7762306a36Sopenharmony_ci                    "host":"cxl_mem.5"
7862306a36Sopenharmony_ci                  }
7962306a36Sopenharmony_ci                }
8062306a36Sopenharmony_ci              ]
8162306a36Sopenharmony_ci            },
8262306a36Sopenharmony_ci            {
8362306a36Sopenharmony_ci              "port":"port12",
8462306a36Sopenharmony_ci              "host":"cxl_switch_uport.3",
8562306a36Sopenharmony_ci              "endpoints:port12":[
8662306a36Sopenharmony_ci                {
8762306a36Sopenharmony_ci                  "endpoint":"endpoint17",
8862306a36Sopenharmony_ci                  "host":"mem8",
8962306a36Sopenharmony_ci                  "memdev":{
9062306a36Sopenharmony_ci                    "memdev":"mem8",
9162306a36Sopenharmony_ci                    "pmem_size":"256.00 MiB (268.44 MB)",
9262306a36Sopenharmony_ci                    "ram_size":"256.00 MiB (268.44 MB)",
9362306a36Sopenharmony_ci                    "serial":"0x7",
9462306a36Sopenharmony_ci                    "numa_node":1,
9562306a36Sopenharmony_ci                    "host":"cxl_mem.7"
9662306a36Sopenharmony_ci                  }
9762306a36Sopenharmony_ci                },
9862306a36Sopenharmony_ci                {
9962306a36Sopenharmony_ci                  "endpoint":"endpoint13",
10062306a36Sopenharmony_ci                  "host":"mem4",
10162306a36Sopenharmony_ci                  "memdev":{
10262306a36Sopenharmony_ci                    "memdev":"mem4",
10362306a36Sopenharmony_ci                    "pmem_size":"256.00 MiB (268.44 MB)",
10462306a36Sopenharmony_ci                    "ram_size":"256.00 MiB (268.44 MB)",
10562306a36Sopenharmony_ci                    "serial":"0x3",
10662306a36Sopenharmony_ci                    "numa_node":1,
10762306a36Sopenharmony_ci                    "host":"cxl_mem.3"
10862306a36Sopenharmony_ci                  }
10962306a36Sopenharmony_ci                }
11062306a36Sopenharmony_ci              ]
11162306a36Sopenharmony_ci            }
11262306a36Sopenharmony_ci          ]
11362306a36Sopenharmony_ci        },
11462306a36Sopenharmony_ci        {
11562306a36Sopenharmony_ci          "port":"port4",
11662306a36Sopenharmony_ci          "host":"cxl_host_bridge.0",
11762306a36Sopenharmony_ci          "ports:port4":[
11862306a36Sopenharmony_ci            {
11962306a36Sopenharmony_ci              "port":"port6",
12062306a36Sopenharmony_ci              "host":"cxl_switch_uport.0",
12162306a36Sopenharmony_ci              "endpoints:port6":[
12262306a36Sopenharmony_ci                {
12362306a36Sopenharmony_ci                  "endpoint":"endpoint7",
12462306a36Sopenharmony_ci                  "host":"mem1",
12562306a36Sopenharmony_ci                  "memdev":{
12662306a36Sopenharmony_ci                    "memdev":"mem1",
12762306a36Sopenharmony_ci                    "pmem_size":"256.00 MiB (268.44 MB)",
12862306a36Sopenharmony_ci                    "ram_size":"256.00 MiB (268.44 MB)",
12962306a36Sopenharmony_ci                    "serial":"0",
13062306a36Sopenharmony_ci                    "numa_node":0,
13162306a36Sopenharmony_ci                    "host":"cxl_mem.0"
13262306a36Sopenharmony_ci                  }
13362306a36Sopenharmony_ci                },
13462306a36Sopenharmony_ci                {
13562306a36Sopenharmony_ci                  "endpoint":"endpoint14",
13662306a36Sopenharmony_ci                  "host":"mem5",
13762306a36Sopenharmony_ci                  "memdev":{
13862306a36Sopenharmony_ci                    "memdev":"mem5",
13962306a36Sopenharmony_ci                    "pmem_size":"256.00 MiB (268.44 MB)",
14062306a36Sopenharmony_ci                    "ram_size":"256.00 MiB (268.44 MB)",
14162306a36Sopenharmony_ci                    "serial":"0x4",
14262306a36Sopenharmony_ci                    "numa_node":0,
14362306a36Sopenharmony_ci                    "host":"cxl_mem.4"
14462306a36Sopenharmony_ci                  }
14562306a36Sopenharmony_ci                }
14662306a36Sopenharmony_ci              ]
14762306a36Sopenharmony_ci            },
14862306a36Sopenharmony_ci            {
14962306a36Sopenharmony_ci              "port":"port10",
15062306a36Sopenharmony_ci              "host":"cxl_switch_uport.2",
15162306a36Sopenharmony_ci              "endpoints:port10":[
15262306a36Sopenharmony_ci                {
15362306a36Sopenharmony_ci                  "endpoint":"endpoint16",
15462306a36Sopenharmony_ci                  "host":"mem7",
15562306a36Sopenharmony_ci                  "memdev":{
15662306a36Sopenharmony_ci                    "memdev":"mem7",
15762306a36Sopenharmony_ci                    "pmem_size":"256.00 MiB (268.44 MB)",
15862306a36Sopenharmony_ci                    "ram_size":"256.00 MiB (268.44 MB)",
15962306a36Sopenharmony_ci                    "serial":"0x6",
16062306a36Sopenharmony_ci                    "numa_node":0,
16162306a36Sopenharmony_ci                    "host":"cxl_mem.6"
16262306a36Sopenharmony_ci                  }
16362306a36Sopenharmony_ci                },
16462306a36Sopenharmony_ci                {
16562306a36Sopenharmony_ci                  "endpoint":"endpoint11",
16662306a36Sopenharmony_ci                  "host":"mem3",
16762306a36Sopenharmony_ci                  "memdev":{
16862306a36Sopenharmony_ci                    "memdev":"mem3",
16962306a36Sopenharmony_ci                    "pmem_size":"256.00 MiB (268.44 MB)",
17062306a36Sopenharmony_ci                    "ram_size":"256.00 MiB (268.44 MB)",
17162306a36Sopenharmony_ci                    "serial":"0x2",
17262306a36Sopenharmony_ci                    "numa_node":0,
17362306a36Sopenharmony_ci                    "host":"cxl_mem.2"
17462306a36Sopenharmony_ci                  }
17562306a36Sopenharmony_ci                }
17662306a36Sopenharmony_ci              ]
17762306a36Sopenharmony_ci            }
17862306a36Sopenharmony_ci          ]
17962306a36Sopenharmony_ci        }
18062306a36Sopenharmony_ci      ]
18162306a36Sopenharmony_ci    }
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ciIn that listing each "root", "port", and "endpoint" object correspond a kernel
18462306a36Sopenharmony_ci'struct cxl_port' object. A 'cxl_port' is a device that can decode CXL.mem to
18562306a36Sopenharmony_ciits descendants. So "root" claims non-PCIe enumerable platform decode ranges and
18662306a36Sopenharmony_cidecodes them to "ports", "ports" decode to "endpoints", and "endpoints"
18762306a36Sopenharmony_cirepresent the decode from SPA (System Physical Address) to DPA (Device Physical
18862306a36Sopenharmony_ciAddress).
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ciContinuing the RAID analogy, disks have both topology metadata and on device
19162306a36Sopenharmony_cimetadata that determine RAID set assembly. CXL Port topology and CXL Port link
19262306a36Sopenharmony_cistatus is metadata for CXL.mem set assembly. The CXL Port topology is enumerated
19362306a36Sopenharmony_ciby the arrival of a CXL.mem device. I.e. unless and until the PCIe core attaches
19462306a36Sopenharmony_cithe cxl_pci driver to a CXL Memory Expander there is no role for CXL Port
19562306a36Sopenharmony_ciobjects. Conversely for hot-unplug / removal scenarios, there is no need for
19662306a36Sopenharmony_cithe Linux PCI core to tear down switch-level CXL resources because the endpoint
19762306a36Sopenharmony_ci->remove() event cleans up the port data that was established to support that
19862306a36Sopenharmony_ciMemory Expander.
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ciThe port metadata and potential decode schemes that a give memory device may
20162306a36Sopenharmony_ciparticipate can be determined via a command like::
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci    # cxl list -BDMu -d root -m mem3
20462306a36Sopenharmony_ci    {
20562306a36Sopenharmony_ci      "bus":"root3",
20662306a36Sopenharmony_ci      "provider":"cxl_test",
20762306a36Sopenharmony_ci      "decoders:root3":[
20862306a36Sopenharmony_ci        {
20962306a36Sopenharmony_ci          "decoder":"decoder3.1",
21062306a36Sopenharmony_ci          "resource":"0x8030000000",
21162306a36Sopenharmony_ci          "size":"512.00 MiB (536.87 MB)",
21262306a36Sopenharmony_ci          "volatile_capable":true,
21362306a36Sopenharmony_ci          "nr_targets":2
21462306a36Sopenharmony_ci        },
21562306a36Sopenharmony_ci        {
21662306a36Sopenharmony_ci          "decoder":"decoder3.3",
21762306a36Sopenharmony_ci          "resource":"0x8060000000",
21862306a36Sopenharmony_ci          "size":"512.00 MiB (536.87 MB)",
21962306a36Sopenharmony_ci          "pmem_capable":true,
22062306a36Sopenharmony_ci          "nr_targets":2
22162306a36Sopenharmony_ci        },
22262306a36Sopenharmony_ci        {
22362306a36Sopenharmony_ci          "decoder":"decoder3.0",
22462306a36Sopenharmony_ci          "resource":"0x8020000000",
22562306a36Sopenharmony_ci          "size":"256.00 MiB (268.44 MB)",
22662306a36Sopenharmony_ci          "volatile_capable":true,
22762306a36Sopenharmony_ci          "nr_targets":1
22862306a36Sopenharmony_ci        },
22962306a36Sopenharmony_ci        {
23062306a36Sopenharmony_ci          "decoder":"decoder3.2",
23162306a36Sopenharmony_ci          "resource":"0x8050000000",
23262306a36Sopenharmony_ci          "size":"256.00 MiB (268.44 MB)",
23362306a36Sopenharmony_ci          "pmem_capable":true,
23462306a36Sopenharmony_ci          "nr_targets":1
23562306a36Sopenharmony_ci        }
23662306a36Sopenharmony_ci      ],
23762306a36Sopenharmony_ci      "memdevs:root3":[
23862306a36Sopenharmony_ci        {
23962306a36Sopenharmony_ci          "memdev":"mem3",
24062306a36Sopenharmony_ci          "pmem_size":"256.00 MiB (268.44 MB)",
24162306a36Sopenharmony_ci          "ram_size":"256.00 MiB (268.44 MB)",
24262306a36Sopenharmony_ci          "serial":"0x2",
24362306a36Sopenharmony_ci          "numa_node":0,
24462306a36Sopenharmony_ci          "host":"cxl_mem.2"
24562306a36Sopenharmony_ci        }
24662306a36Sopenharmony_ci      ]
24762306a36Sopenharmony_ci    }
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci...which queries the CXL topology to ask "given CXL Memory Expander with a kernel
25062306a36Sopenharmony_cidevice name of 'mem3' which platform level decode ranges may this device
25162306a36Sopenharmony_ciparticipate". A given expander can participate in multiple CXL.mem interleave
25262306a36Sopenharmony_cisets simultaneously depending on how many decoder resource it has. In this
25362306a36Sopenharmony_ciexample mem3 can participate in one or more of a PMEM interleave that spans to
25462306a36Sopenharmony_ciHost Bridges, a PMEM interleave that targets a single Host Bridge, a Volatile
25562306a36Sopenharmony_cimemory interleave that spans 2 Host Bridges, and a Volatile memory interleave
25662306a36Sopenharmony_cithat only targets a single Host Bridge.
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ciConversely the memory devices that can participate in a given platform level
25962306a36Sopenharmony_cidecode scheme can be determined via a command like the following::
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci    # cxl list -MDu -d 3.2
26262306a36Sopenharmony_ci    [
26362306a36Sopenharmony_ci      {
26462306a36Sopenharmony_ci        "memdevs":[
26562306a36Sopenharmony_ci          {
26662306a36Sopenharmony_ci            "memdev":"mem1",
26762306a36Sopenharmony_ci            "pmem_size":"256.00 MiB (268.44 MB)",
26862306a36Sopenharmony_ci            "ram_size":"256.00 MiB (268.44 MB)",
26962306a36Sopenharmony_ci            "serial":"0",
27062306a36Sopenharmony_ci            "numa_node":0,
27162306a36Sopenharmony_ci            "host":"cxl_mem.0"
27262306a36Sopenharmony_ci          },
27362306a36Sopenharmony_ci          {
27462306a36Sopenharmony_ci            "memdev":"mem5",
27562306a36Sopenharmony_ci            "pmem_size":"256.00 MiB (268.44 MB)",
27662306a36Sopenharmony_ci            "ram_size":"256.00 MiB (268.44 MB)",
27762306a36Sopenharmony_ci            "serial":"0x4",
27862306a36Sopenharmony_ci            "numa_node":0,
27962306a36Sopenharmony_ci            "host":"cxl_mem.4"
28062306a36Sopenharmony_ci          },
28162306a36Sopenharmony_ci          {
28262306a36Sopenharmony_ci            "memdev":"mem7",
28362306a36Sopenharmony_ci            "pmem_size":"256.00 MiB (268.44 MB)",
28462306a36Sopenharmony_ci            "ram_size":"256.00 MiB (268.44 MB)",
28562306a36Sopenharmony_ci            "serial":"0x6",
28662306a36Sopenharmony_ci            "numa_node":0,
28762306a36Sopenharmony_ci            "host":"cxl_mem.6"
28862306a36Sopenharmony_ci          },
28962306a36Sopenharmony_ci          {
29062306a36Sopenharmony_ci            "memdev":"mem3",
29162306a36Sopenharmony_ci            "pmem_size":"256.00 MiB (268.44 MB)",
29262306a36Sopenharmony_ci            "ram_size":"256.00 MiB (268.44 MB)",
29362306a36Sopenharmony_ci            "serial":"0x2",
29462306a36Sopenharmony_ci            "numa_node":0,
29562306a36Sopenharmony_ci            "host":"cxl_mem.2"
29662306a36Sopenharmony_ci          }
29762306a36Sopenharmony_ci        ]
29862306a36Sopenharmony_ci      },
29962306a36Sopenharmony_ci      {
30062306a36Sopenharmony_ci        "root decoders":[
30162306a36Sopenharmony_ci          {
30262306a36Sopenharmony_ci            "decoder":"decoder3.2",
30362306a36Sopenharmony_ci            "resource":"0x8050000000",
30462306a36Sopenharmony_ci            "size":"256.00 MiB (268.44 MB)",
30562306a36Sopenharmony_ci            "pmem_capable":true,
30662306a36Sopenharmony_ci            "nr_targets":1
30762306a36Sopenharmony_ci          }
30862306a36Sopenharmony_ci        ]
30962306a36Sopenharmony_ci      }
31062306a36Sopenharmony_ci    ]
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci...where the naming scheme for decoders is "decoder<port_id>.<instance_id>".
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ciDriver Infrastructure
31562306a36Sopenharmony_ci=====================
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ciThis section covers the driver infrastructure for a CXL memory device.
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ciCXL Memory Device
32062306a36Sopenharmony_ci-----------------
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/pci.c
32362306a36Sopenharmony_ci   :doc: cxl pci
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/pci.c
32662306a36Sopenharmony_ci   :internal:
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/mem.c
32962306a36Sopenharmony_ci   :doc: cxl mem
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ciCXL Port
33262306a36Sopenharmony_ci--------
33362306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/port.c
33462306a36Sopenharmony_ci   :doc: cxl port
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ciCXL Core
33762306a36Sopenharmony_ci--------
33862306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/cxl.h
33962306a36Sopenharmony_ci   :doc: cxl objects
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/cxl.h
34262306a36Sopenharmony_ci   :internal:
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/core/port.c
34562306a36Sopenharmony_ci   :doc: cxl core
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/core/port.c
34862306a36Sopenharmony_ci   :identifiers:
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/core/pci.c
35162306a36Sopenharmony_ci   :doc: cxl core pci
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/core/pci.c
35462306a36Sopenharmony_ci   :identifiers:
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/core/pmem.c
35762306a36Sopenharmony_ci   :doc: cxl pmem
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/core/regs.c
36062306a36Sopenharmony_ci   :doc: cxl registers
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/core/mbox.c
36362306a36Sopenharmony_ci   :doc: cxl mbox
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ciCXL Regions
36662306a36Sopenharmony_ci-----------
36762306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/core/region.c
36862306a36Sopenharmony_ci   :doc: cxl core region
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci.. kernel-doc:: drivers/cxl/core/region.c
37162306a36Sopenharmony_ci   :identifiers:
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ciExternal Interfaces
37462306a36Sopenharmony_ci===================
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ciCXL IOCTL Interface
37762306a36Sopenharmony_ci-------------------
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci.. kernel-doc:: include/uapi/linux/cxl_mem.h
38062306a36Sopenharmony_ci   :doc: UAPI
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_ci.. kernel-doc:: include/uapi/linux/cxl_mem.h
38362306a36Sopenharmony_ci   :internal:
384