14cdadfd5SDan Williams.. SPDX-License-Identifier: GPL-2.0
24cdadfd5SDan Williams.. include:: <isonum.txt>
34cdadfd5SDan Williams
44cdadfd5SDan Williams===================================
54cdadfd5SDan WilliamsCompute Express Link Memory Devices
64cdadfd5SDan Williams===================================
74cdadfd5SDan Williams
84cdadfd5SDan WilliamsA Compute Express Link Memory Device is a CXL component that implements the
94cdadfd5SDan WilliamsCXL.mem protocol. It contains some amount of volatile memory, persistent memory,
104cdadfd5SDan Williamsor both. It is enumerated as a PCI device for configuration and passing
114cdadfd5SDan Williamsmessages over an MMIO mailbox. Its contribution to the System Physical
124cdadfd5SDan WilliamsAddress space is handled via HDM (Host Managed Device Memory) decoders
134cdadfd5SDan Williamsthat optionally define a device's contribution to an interleaved address
144cdadfd5SDan Williamsrange across multiple devices underneath a host-bridge or interleaved
154cdadfd5SDan Williamsacross host-bridges.
168adaf747SBen Widawsky
1754cdbf84SBen WidawskyCXL Bus: Theory of Operation
1854cdbf84SBen Widawsky============================
1954cdbf84SBen WidawskySimilar to how a RAID driver takes disk objects and assembles them into a new
2054cdbf84SBen Widawskylogical device, the CXL subsystem is tasked to take PCIe and ACPI objects and
2154cdbf84SBen Widawskyassemble them into a CXL.mem decode topology. The need for runtime configuration
2254cdbf84SBen Widawskyof the CXL.mem topology is also similar to RAID in that different environments
2354cdbf84SBen Widawskywith the same hardware configuration may decide to assemble the topology in
2454cdbf84SBen Widawskycontrasting ways. One may choose performance (RAID0) striping memory across
2554cdbf84SBen Widawskymultiple Host Bridges and endpoints while another may opt for fault tolerance
2654cdbf84SBen Widawskyand disable any striping in the CXL.mem topology.
2754cdbf84SBen Widawsky
2854cdbf84SBen WidawskyPlatform firmware enumerates a menu of interleave options at the "CXL root port"
2954cdbf84SBen Widawsky(Linux term for the top of the CXL decode topology). From there, PCIe topology
3054cdbf84SBen Widawskydictates which endpoints can participate in which Host Bridge decode regimes.
3154cdbf84SBen WidawskyEach PCIe Switch in the path between the root and an endpoint introduces a point
3254cdbf84SBen Widawskyat which the interleave can be split. For example platform firmware may say at a
3354cdbf84SBen Widawskygiven range only decodes to 1 one Host Bridge, but that Host Bridge may in turn
3454cdbf84SBen Widawskyinterleave cycles across multiple Root Ports. An intervening Switch between a
3554cdbf84SBen Widawskyport and an endpoint may interleave cycles across multiple Downstream Switch
3654cdbf84SBen WidawskyPorts, etc.
3754cdbf84SBen Widawsky
3854cdbf84SBen WidawskyHere is a sample listing of a CXL topology defined by 'cxl_test'. The 'cxl_test'
3954cdbf84SBen Widawskymodule generates an emulated CXL topology of 2 Host Bridges each with 2 Root
4054cdbf84SBen WidawskyPorts. Each of those Root Ports are connected to 2-way switches with endpoints
4154cdbf84SBen Widawskyconnected to those downstream ports for a total of 8 endpoints::
4254cdbf84SBen Widawsky
4354cdbf84SBen Widawsky    # cxl list -BEMPu -b cxl_test
4454cdbf84SBen Widawsky    {
4554cdbf84SBen Widawsky      "bus":"root3",
4654cdbf84SBen Widawsky      "provider":"cxl_test",
4754cdbf84SBen Widawsky      "ports:root3":[
4854cdbf84SBen Widawsky        {
4954cdbf84SBen Widawsky          "port":"port5",
5054cdbf84SBen Widawsky          "host":"cxl_host_bridge.1",
5154cdbf84SBen Widawsky          "ports:port5":[
5254cdbf84SBen Widawsky            {
5354cdbf84SBen Widawsky              "port":"port8",
5454cdbf84SBen Widawsky              "host":"cxl_switch_uport.1",
5554cdbf84SBen Widawsky              "endpoints:port8":[
5654cdbf84SBen Widawsky                {
5754cdbf84SBen Widawsky                  "endpoint":"endpoint9",
5854cdbf84SBen Widawsky                  "host":"mem2",
5954cdbf84SBen Widawsky                  "memdev":{
6054cdbf84SBen Widawsky                    "memdev":"mem2",
6154cdbf84SBen Widawsky                    "pmem_size":"256.00 MiB (268.44 MB)",
6254cdbf84SBen Widawsky                    "ram_size":"256.00 MiB (268.44 MB)",
6354cdbf84SBen Widawsky                    "serial":"0x1",
6454cdbf84SBen Widawsky                    "numa_node":1,
6554cdbf84SBen Widawsky                    "host":"cxl_mem.1"
6654cdbf84SBen Widawsky                  }
6754cdbf84SBen Widawsky                },
6854cdbf84SBen Widawsky                {
6954cdbf84SBen Widawsky                  "endpoint":"endpoint15",
7054cdbf84SBen Widawsky                  "host":"mem6",
7154cdbf84SBen Widawsky                  "memdev":{
7254cdbf84SBen Widawsky                    "memdev":"mem6",
7354cdbf84SBen Widawsky                    "pmem_size":"256.00 MiB (268.44 MB)",
7454cdbf84SBen Widawsky                    "ram_size":"256.00 MiB (268.44 MB)",
7554cdbf84SBen Widawsky                    "serial":"0x5",
7654cdbf84SBen Widawsky                    "numa_node":1,
7754cdbf84SBen Widawsky                    "host":"cxl_mem.5"
7854cdbf84SBen Widawsky                  }
7954cdbf84SBen Widawsky                }
8054cdbf84SBen Widawsky              ]
8154cdbf84SBen Widawsky            },
8254cdbf84SBen Widawsky            {
8354cdbf84SBen Widawsky              "port":"port12",
8454cdbf84SBen Widawsky              "host":"cxl_switch_uport.3",
8554cdbf84SBen Widawsky              "endpoints:port12":[
8654cdbf84SBen Widawsky                {
8754cdbf84SBen Widawsky                  "endpoint":"endpoint17",
8854cdbf84SBen Widawsky                  "host":"mem8",
8954cdbf84SBen Widawsky                  "memdev":{
9054cdbf84SBen Widawsky                    "memdev":"mem8",
9154cdbf84SBen Widawsky                    "pmem_size":"256.00 MiB (268.44 MB)",
9254cdbf84SBen Widawsky                    "ram_size":"256.00 MiB (268.44 MB)",
9354cdbf84SBen Widawsky                    "serial":"0x7",
9454cdbf84SBen Widawsky                    "numa_node":1,
9554cdbf84SBen Widawsky                    "host":"cxl_mem.7"
9654cdbf84SBen Widawsky                  }
9754cdbf84SBen Widawsky                },
9854cdbf84SBen Widawsky                {
9954cdbf84SBen Widawsky                  "endpoint":"endpoint13",
10054cdbf84SBen Widawsky                  "host":"mem4",
10154cdbf84SBen Widawsky                  "memdev":{
10254cdbf84SBen Widawsky                    "memdev":"mem4",
10354cdbf84SBen Widawsky                    "pmem_size":"256.00 MiB (268.44 MB)",
10454cdbf84SBen Widawsky                    "ram_size":"256.00 MiB (268.44 MB)",
10554cdbf84SBen Widawsky                    "serial":"0x3",
10654cdbf84SBen Widawsky                    "numa_node":1,
10754cdbf84SBen Widawsky                    "host":"cxl_mem.3"
10854cdbf84SBen Widawsky                  }
10954cdbf84SBen Widawsky                }
11054cdbf84SBen Widawsky              ]
11154cdbf84SBen Widawsky            }
11254cdbf84SBen Widawsky          ]
11354cdbf84SBen Widawsky        },
11454cdbf84SBen Widawsky        {
11554cdbf84SBen Widawsky          "port":"port4",
11654cdbf84SBen Widawsky          "host":"cxl_host_bridge.0",
11754cdbf84SBen Widawsky          "ports:port4":[
11854cdbf84SBen Widawsky            {
11954cdbf84SBen Widawsky              "port":"port6",
12054cdbf84SBen Widawsky              "host":"cxl_switch_uport.0",
12154cdbf84SBen Widawsky              "endpoints:port6":[
12254cdbf84SBen Widawsky                {
12354cdbf84SBen Widawsky                  "endpoint":"endpoint7",
12454cdbf84SBen Widawsky                  "host":"mem1",
12554cdbf84SBen Widawsky                  "memdev":{
12654cdbf84SBen Widawsky                    "memdev":"mem1",
12754cdbf84SBen Widawsky                    "pmem_size":"256.00 MiB (268.44 MB)",
12854cdbf84SBen Widawsky                    "ram_size":"256.00 MiB (268.44 MB)",
12954cdbf84SBen Widawsky                    "serial":"0",
13054cdbf84SBen Widawsky                    "numa_node":0,
13154cdbf84SBen Widawsky                    "host":"cxl_mem.0"
13254cdbf84SBen Widawsky                  }
13354cdbf84SBen Widawsky                },
13454cdbf84SBen Widawsky                {
13554cdbf84SBen Widawsky                  "endpoint":"endpoint14",
13654cdbf84SBen Widawsky                  "host":"mem5",
13754cdbf84SBen Widawsky                  "memdev":{
13854cdbf84SBen Widawsky                    "memdev":"mem5",
13954cdbf84SBen Widawsky                    "pmem_size":"256.00 MiB (268.44 MB)",
14054cdbf84SBen Widawsky                    "ram_size":"256.00 MiB (268.44 MB)",
14154cdbf84SBen Widawsky                    "serial":"0x4",
14254cdbf84SBen Widawsky                    "numa_node":0,
14354cdbf84SBen Widawsky                    "host":"cxl_mem.4"
14454cdbf84SBen Widawsky                  }
14554cdbf84SBen Widawsky                }
14654cdbf84SBen Widawsky              ]
14754cdbf84SBen Widawsky            },
14854cdbf84SBen Widawsky            {
14954cdbf84SBen Widawsky              "port":"port10",
15054cdbf84SBen Widawsky              "host":"cxl_switch_uport.2",
15154cdbf84SBen Widawsky              "endpoints:port10":[
15254cdbf84SBen Widawsky                {
15354cdbf84SBen Widawsky                  "endpoint":"endpoint16",
15454cdbf84SBen Widawsky                  "host":"mem7",
15554cdbf84SBen Widawsky                  "memdev":{
15654cdbf84SBen Widawsky                    "memdev":"mem7",
15754cdbf84SBen Widawsky                    "pmem_size":"256.00 MiB (268.44 MB)",
15854cdbf84SBen Widawsky                    "ram_size":"256.00 MiB (268.44 MB)",
15954cdbf84SBen Widawsky                    "serial":"0x6",
16054cdbf84SBen Widawsky                    "numa_node":0,
16154cdbf84SBen Widawsky                    "host":"cxl_mem.6"
16254cdbf84SBen Widawsky                  }
16354cdbf84SBen Widawsky                },
16454cdbf84SBen Widawsky                {
16554cdbf84SBen Widawsky                  "endpoint":"endpoint11",
16654cdbf84SBen Widawsky                  "host":"mem3",
16754cdbf84SBen Widawsky                  "memdev":{
16854cdbf84SBen Widawsky                    "memdev":"mem3",
16954cdbf84SBen Widawsky                    "pmem_size":"256.00 MiB (268.44 MB)",
17054cdbf84SBen Widawsky                    "ram_size":"256.00 MiB (268.44 MB)",
17154cdbf84SBen Widawsky                    "serial":"0x2",
17254cdbf84SBen Widawsky                    "numa_node":0,
17354cdbf84SBen Widawsky                    "host":"cxl_mem.2"
17454cdbf84SBen Widawsky                  }
17554cdbf84SBen Widawsky                }
17654cdbf84SBen Widawsky              ]
17754cdbf84SBen Widawsky            }
17854cdbf84SBen Widawsky          ]
17954cdbf84SBen Widawsky        }
18054cdbf84SBen Widawsky      ]
18154cdbf84SBen Widawsky    }
18254cdbf84SBen Widawsky
18354cdbf84SBen WidawskyIn that listing each "root", "port", and "endpoint" object correspond a kernel
18454cdbf84SBen Widawsky'struct cxl_port' object. A 'cxl_port' is a device that can decode CXL.mem to
18554cdbf84SBen Widawskyits descendants. So "root" claims non-PCIe enumerable platform decode ranges and
18654cdbf84SBen Widawskydecodes them to "ports", "ports" decode to "endpoints", and "endpoints"
18754cdbf84SBen Widawskyrepresent the decode from SPA (System Physical Address) to DPA (Device Physical
18854cdbf84SBen WidawskyAddress).
18954cdbf84SBen Widawsky
19054cdbf84SBen WidawskyContinuing the RAID analogy, disks have both topology metadata and on device
19154cdbf84SBen Widawskymetadata that determine RAID set assembly. CXL Port topology and CXL Port link
19254cdbf84SBen Widawskystatus is metadata for CXL.mem set assembly. The CXL Port topology is enumerated
19354cdbf84SBen Widawskyby the arrival of a CXL.mem device. I.e. unless and until the PCIe core attaches
19454cdbf84SBen Widawskythe cxl_pci driver to a CXL Memory Expander there is no role for CXL Port
19554cdbf84SBen Widawskyobjects. Conversely for hot-unplug / removal scenarios, there is no need for
19654cdbf84SBen Widawskythe Linux PCI core to tear down switch-level CXL resources because the endpoint
19754cdbf84SBen Widawsky->remove() event cleans up the port data that was established to support that
19854cdbf84SBen WidawskyMemory Expander.
19954cdbf84SBen Widawsky
20054cdbf84SBen WidawskyThe port metadata and potential decode schemes that a give memory device may
20154cdbf84SBen Widawskyparticipate can be determined via a command like::
20254cdbf84SBen Widawsky
20354cdbf84SBen Widawsky    # cxl list -BDMu -d root -m mem3
20454cdbf84SBen Widawsky    {
20554cdbf84SBen Widawsky      "bus":"root3",
20654cdbf84SBen Widawsky      "provider":"cxl_test",
20754cdbf84SBen Widawsky      "decoders:root3":[
20854cdbf84SBen Widawsky        {
20954cdbf84SBen Widawsky          "decoder":"decoder3.1",
21054cdbf84SBen Widawsky          "resource":"0x8030000000",
21154cdbf84SBen Widawsky          "size":"512.00 MiB (536.87 MB)",
21254cdbf84SBen Widawsky          "volatile_capable":true,
21354cdbf84SBen Widawsky          "nr_targets":2
21454cdbf84SBen Widawsky        },
21554cdbf84SBen Widawsky        {
21654cdbf84SBen Widawsky          "decoder":"decoder3.3",
21754cdbf84SBen Widawsky          "resource":"0x8060000000",
21854cdbf84SBen Widawsky          "size":"512.00 MiB (536.87 MB)",
21954cdbf84SBen Widawsky          "pmem_capable":true,
22054cdbf84SBen Widawsky          "nr_targets":2
22154cdbf84SBen Widawsky        },
22254cdbf84SBen Widawsky        {
22354cdbf84SBen Widawsky          "decoder":"decoder3.0",
22454cdbf84SBen Widawsky          "resource":"0x8020000000",
22554cdbf84SBen Widawsky          "size":"256.00 MiB (268.44 MB)",
22654cdbf84SBen Widawsky          "volatile_capable":true,
22754cdbf84SBen Widawsky          "nr_targets":1
22854cdbf84SBen Widawsky        },
22954cdbf84SBen Widawsky        {
23054cdbf84SBen Widawsky          "decoder":"decoder3.2",
23154cdbf84SBen Widawsky          "resource":"0x8050000000",
23254cdbf84SBen Widawsky          "size":"256.00 MiB (268.44 MB)",
23354cdbf84SBen Widawsky          "pmem_capable":true,
23454cdbf84SBen Widawsky          "nr_targets":1
23554cdbf84SBen Widawsky        }
23654cdbf84SBen Widawsky      ],
23754cdbf84SBen Widawsky      "memdevs:root3":[
23854cdbf84SBen Widawsky        {
23954cdbf84SBen Widawsky          "memdev":"mem3",
24054cdbf84SBen Widawsky          "pmem_size":"256.00 MiB (268.44 MB)",
24154cdbf84SBen Widawsky          "ram_size":"256.00 MiB (268.44 MB)",
24254cdbf84SBen Widawsky          "serial":"0x2",
24354cdbf84SBen Widawsky          "numa_node":0,
24454cdbf84SBen Widawsky          "host":"cxl_mem.2"
24554cdbf84SBen Widawsky        }
24654cdbf84SBen Widawsky      ]
24754cdbf84SBen Widawsky    }
24854cdbf84SBen Widawsky
24954cdbf84SBen Widawsky...which queries the CXL topology to ask "given CXL Memory Expander with a kernel
25054cdbf84SBen Widawskydevice name of 'mem3' which platform level decode ranges may this device
25154cdbf84SBen Widawskyparticipate". A given expander can participate in multiple CXL.mem interleave
25254cdbf84SBen Widawskysets simultaneously depending on how many decoder resource it has. In this
25354cdbf84SBen Widawskyexample mem3 can participate in one or more of a PMEM interleave that spans to
25454cdbf84SBen WidawskyHost Bridges, a PMEM interleave that targets a single Host Bridge, a Volatile
25554cdbf84SBen Widawskymemory interleave that spans 2 Host Bridges, and a Volatile memory interleave
25654cdbf84SBen Widawskythat only targets a single Host Bridge.
25754cdbf84SBen Widawsky
25854cdbf84SBen WidawskyConversely the memory devices that can participate in a given platform level
25954cdbf84SBen Widawskydecode scheme can be determined via a command like the following::
26054cdbf84SBen Widawsky
26154cdbf84SBen Widawsky    # cxl list -MDu -d 3.2
26254cdbf84SBen Widawsky    [
26354cdbf84SBen Widawsky      {
26454cdbf84SBen Widawsky        "memdevs":[
26554cdbf84SBen Widawsky          {
26654cdbf84SBen Widawsky            "memdev":"mem1",
26754cdbf84SBen Widawsky            "pmem_size":"256.00 MiB (268.44 MB)",
26854cdbf84SBen Widawsky            "ram_size":"256.00 MiB (268.44 MB)",
26954cdbf84SBen Widawsky            "serial":"0",
27054cdbf84SBen Widawsky            "numa_node":0,
27154cdbf84SBen Widawsky            "host":"cxl_mem.0"
27254cdbf84SBen Widawsky          },
27354cdbf84SBen Widawsky          {
27454cdbf84SBen Widawsky            "memdev":"mem5",
27554cdbf84SBen Widawsky            "pmem_size":"256.00 MiB (268.44 MB)",
27654cdbf84SBen Widawsky            "ram_size":"256.00 MiB (268.44 MB)",
27754cdbf84SBen Widawsky            "serial":"0x4",
27854cdbf84SBen Widawsky            "numa_node":0,
27954cdbf84SBen Widawsky            "host":"cxl_mem.4"
28054cdbf84SBen Widawsky          },
28154cdbf84SBen Widawsky          {
28254cdbf84SBen Widawsky            "memdev":"mem7",
28354cdbf84SBen Widawsky            "pmem_size":"256.00 MiB (268.44 MB)",
28454cdbf84SBen Widawsky            "ram_size":"256.00 MiB (268.44 MB)",
28554cdbf84SBen Widawsky            "serial":"0x6",
28654cdbf84SBen Widawsky            "numa_node":0,
28754cdbf84SBen Widawsky            "host":"cxl_mem.6"
28854cdbf84SBen Widawsky          },
28954cdbf84SBen Widawsky          {
29054cdbf84SBen Widawsky            "memdev":"mem3",
29154cdbf84SBen Widawsky            "pmem_size":"256.00 MiB (268.44 MB)",
29254cdbf84SBen Widawsky            "ram_size":"256.00 MiB (268.44 MB)",
29354cdbf84SBen Widawsky            "serial":"0x2",
29454cdbf84SBen Widawsky            "numa_node":0,
29554cdbf84SBen Widawsky            "host":"cxl_mem.2"
29654cdbf84SBen Widawsky          }
29754cdbf84SBen Widawsky        ]
29854cdbf84SBen Widawsky      },
29954cdbf84SBen Widawsky      {
30054cdbf84SBen Widawsky        "root decoders":[
30154cdbf84SBen Widawsky          {
30254cdbf84SBen Widawsky            "decoder":"decoder3.2",
30354cdbf84SBen Widawsky            "resource":"0x8050000000",
30454cdbf84SBen Widawsky            "size":"256.00 MiB (268.44 MB)",
30554cdbf84SBen Widawsky            "pmem_capable":true,
30654cdbf84SBen Widawsky            "nr_targets":1
30754cdbf84SBen Widawsky          }
30854cdbf84SBen Widawsky        ]
30954cdbf84SBen Widawsky      }
31054cdbf84SBen Widawsky    ]
31154cdbf84SBen Widawsky
31254cdbf84SBen Widawsky...where the naming scheme for decoders is "decoder<port_id>.<instance_id>".
31354cdbf84SBen Widawsky
3148adaf747SBen WidawskyDriver Infrastructure
3158adaf747SBen Widawsky=====================
3168adaf747SBen Widawsky
3178adaf747SBen WidawskyThis section covers the driver infrastructure for a CXL memory device.
3188adaf747SBen Widawsky
3198adaf747SBen WidawskyCXL Memory Device
3208adaf747SBen Widawsky-----------------
3218adaf747SBen Widawsky
32221e9f767SBen Widawsky.. kernel-doc:: drivers/cxl/pci.c
32321e9f767SBen Widawsky   :doc: cxl pci
3248adaf747SBen Widawsky
32521e9f767SBen Widawsky.. kernel-doc:: drivers/cxl/pci.c
3268adaf747SBen Widawsky   :internal:
327b39cb105SDan Williams
3288dd2bc0fSBen Widawsky.. kernel-doc:: drivers/cxl/mem.c
3298dd2bc0fSBen Widawsky   :doc: cxl mem
3308dd2bc0fSBen Widawsky
33154cdbf84SBen WidawskyCXL Port
33254cdbf84SBen Widawsky--------
33354cdbf84SBen Widawsky.. kernel-doc:: drivers/cxl/port.c
33454cdbf84SBen Widawsky   :doc: cxl port
33554cdbf84SBen Widawsky
3365f653f75SDan WilliamsCXL Core
33735c32e30SDan Williams--------
3384812be97SDan Williams.. kernel-doc:: drivers/cxl/cxl.h
3394812be97SDan Williams   :doc: cxl objects
3404812be97SDan Williams
3414812be97SDan Williams.. kernel-doc:: drivers/cxl/cxl.h
3424812be97SDan Williams   :internal:
3434812be97SDan Williams
3440ff0af18SDan Williams.. kernel-doc:: drivers/cxl/core/port.c
3455f653f75SDan Williams   :doc: cxl core
346583fa5e7SBen Widawsky
3470ff0af18SDan Williams.. kernel-doc:: drivers/cxl/core/port.c
348fa9a7d2dSBen Widawsky   :identifiers:
349fa9a7d2dSBen Widawsky
3508dd2bc0fSBen Widawsky.. kernel-doc:: drivers/cxl/core/pci.c
3518dd2bc0fSBen Widawsky   :doc: cxl core pci
3528dd2bc0fSBen Widawsky
3538dd2bc0fSBen Widawsky.. kernel-doc:: drivers/cxl/core/pci.c
3548dd2bc0fSBen Widawsky   :identifiers:
3558dd2bc0fSBen Widawsky
35606737cd0SDan Williams.. kernel-doc:: drivers/cxl/core/pmem.c
357a01da6caSDan Williams   :doc: cxl pmem
35806737cd0SDan Williams
3590f06157eSDan Williams.. kernel-doc:: drivers/cxl/core/regs.c
3602b922a9dSDan Williams   :doc: cxl registers
3610f06157eSDan Williams
3624faf31b4SDan Williams.. kernel-doc:: drivers/cxl/core/mbox.c
3634faf31b4SDan Williams   :doc: cxl mbox
3644faf31b4SDan Williams
365*779dd20cSBen WidawskyCXL Regions
366*779dd20cSBen Widawsky-----------
367*779dd20cSBen Widawsky.. kernel-doc:: drivers/cxl/core/region.c
368*779dd20cSBen Widawsky   :doc: cxl core region
369*779dd20cSBen Widawsky
370*779dd20cSBen Widawsky.. kernel-doc:: drivers/cxl/core/region.c
371*779dd20cSBen Widawsky   :identifiers:
372*779dd20cSBen Widawsky
373583fa5e7SBen WidawskyExternal Interfaces
374583fa5e7SBen Widawsky===================
375583fa5e7SBen Widawsky
376583fa5e7SBen WidawskyCXL IOCTL Interface
377583fa5e7SBen Widawsky-------------------
378583fa5e7SBen Widawsky
379583fa5e7SBen Widawsky.. kernel-doc:: include/uapi/linux/cxl_mem.h
380583fa5e7SBen Widawsky   :doc: UAPI
381583fa5e7SBen Widawsky
382583fa5e7SBen Widawsky.. kernel-doc:: include/uapi/linux/cxl_mem.h
383583fa5e7SBen Widawsky   :internal:
384