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