6ee07cfbdf
These crossed with the previous fix to get rid of examples using aarch64 for which support is not yet upstream. Reviewed-by: Fan Ni <fan.ni@samsung.com> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1892 Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
416 lines
21 KiB
ReStructuredText
416 lines
21 KiB
ReStructuredText
Compute Express Link (CXL)
|
|
==========================
|
|
From the view of a single host, CXL is an interconnect standard that
|
|
targets accelerators and memory devices attached to a CXL host.
|
|
This description will focus on those aspects visible either to
|
|
software running on a QEMU emulated host or to the internals of
|
|
functional emulation. As such, it will skip over many of the
|
|
electrical and protocol elements that would be more of interest
|
|
for real hardware and will dominate more general introductions to CXL.
|
|
It will also completely ignore the fabric management aspects of CXL
|
|
by considering only a single host and a static configuration.
|
|
|
|
CXL shares many concepts and much of the infrastructure of PCI Express,
|
|
with CXL Host Bridges, which have CXL Root Ports which may be directly
|
|
attached to CXL or PCI End Points. Alternatively there may be CXL Switches
|
|
with CXL and PCI Endpoints attached below them. In many cases additional
|
|
control and capabilities are exposed via PCI Express interfaces.
|
|
This sharing of interfaces and hence emulation code is reflected
|
|
in how the devices are emulated in QEMU. In most cases the various
|
|
CXL elements are built upon an equivalent PCIe devices.
|
|
|
|
CXL devices support the following interfaces:
|
|
|
|
* Most conventional PCIe interfaces
|
|
|
|
- Configuration space access
|
|
- BAR mapped memory accesses used for registers and mailboxes.
|
|
- MSI/MSI-X
|
|
- AER
|
|
- DOE mailboxes
|
|
- IDE
|
|
- Many other PCI express defined interfaces..
|
|
|
|
* Memory operations
|
|
|
|
- Equivalent of accessing DRAM / NVDIMMs. Any access / feature
|
|
supported by the host for normal memory should also work for
|
|
CXL attached memory devices.
|
|
|
|
* Cache operations. The are mostly irrelevant to QEMU emulation as
|
|
QEMU is not emulating a coherency protocol. Any emulation related
|
|
to these will be device specific and is out of the scope of this
|
|
document.
|
|
|
|
CXL 2.0 Device Types
|
|
--------------------
|
|
CXL 2.0 End Points are often categorized into three types.
|
|
|
|
**Type 1:** These support coherent caching of host memory. Example might
|
|
be a crypto accelerators. May also have device private memory accessible
|
|
via means such as PCI memory reads and writes to BARs.
|
|
|
|
**Type 2:** These support coherent caching of host memory and host
|
|
managed device memory (HDM) for which the coherency protocol is managed
|
|
by the host. This is a complex topic, so for more information on CXL
|
|
coherency see the CXL 2.0 specification.
|
|
|
|
**Type 3 Memory devices:** These devices act as a means of attaching
|
|
additional memory (HDM) to a CXL host including both volatile and
|
|
persistent memory. The CXL topology may support interleaving across a
|
|
number of Type 3 memory devices using HDM Decoders in the host, host
|
|
bridge, switch upstream port and endpoints.
|
|
|
|
Scope of CXL emulation in QEMU
|
|
------------------------------
|
|
The focus of CXL emulation is CXL revision 2.0 and later. Earlier CXL
|
|
revisions defined a smaller set of features, leaving much of the control
|
|
interface as implementation defined or device specific, making generic
|
|
emulation challenging with host specific firmware being responsible
|
|
for setup and the Endpoints being presented to operating systems
|
|
as Root Complex Integrated End Points. CXL rev 2.0 looks a lot
|
|
more like PCI Express, with fully specified discoverability
|
|
of the CXL topology.
|
|
|
|
CXL System components
|
|
----------------------
|
|
A CXL system is made up a Host with a number of 'standard components'
|
|
the control and capabilities of which are discoverable by system software
|
|
using means described in the CXL 2.0 specification.
|
|
|
|
CXL Fixed Memory Windows (CFMW)
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
A CFMW consists of a particular range of Host Physical Address space
|
|
which is routed to particular CXL Host Bridges. At time of generic
|
|
software initialization it will have a particularly interleaving
|
|
configuration and associated Quality of Service Throttling Group (QTG).
|
|
This information is available to system software, when making
|
|
decisions about how to configure interleave across available CXL
|
|
memory devices. It is provide as CFMW Structures (CFMWS) in
|
|
the CXL Early Discovery Table, an ACPI table.
|
|
|
|
Note: QTG 0 is the only one currently supported in QEMU.
|
|
|
|
CXL Host Bridge (CXL HB)
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
A CXL host bridge is similar to the PCIe equivalent, but with a
|
|
specification defined register interface called CXL Host Bridge
|
|
Component Registers (CHBCR). The location of this CHBCR MMIO
|
|
space is described to system software via a CXL Host Bridge
|
|
Structure (CHBS) in the CEDT ACPI table. The actual interfaces
|
|
are identical to those used for other parts of the CXL hierarchy
|
|
as CXL Component Registers in PCI BARs.
|
|
|
|
Interfaces provided include:
|
|
|
|
* Configuration of HDM Decoders to route CXL Memory accesses with
|
|
a particularly Host Physical Address range to the target port
|
|
below which the CXL device servicing that address lies. This
|
|
may be a mapping to a single Root Port (RP) or across a set of
|
|
target RPs.
|
|
|
|
CXL Root Ports (CXL RP)
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
A CXL Root Port serves the same purpose as a PCIe Root Port.
|
|
There are a number of CXL specific Designated Vendor Specific
|
|
Extended Capabilities (DVSEC) in PCIe Configuration Space
|
|
and associated component register access via PCI bars.
|
|
|
|
CXL Switch
|
|
~~~~~~~~~~
|
|
Here we consider a simple CXL switch with only a single
|
|
virtual hierarchy. Whilst more complex devices exist, their
|
|
visibility to a particular host is generally the same as for
|
|
a simple switch design. Hosts often have no awareness
|
|
of complex rerouting and device pooling, they simply see
|
|
devices being hot added or hot removed.
|
|
|
|
A CXL switch has a similar architecture to those in PCIe,
|
|
with a single upstream port, internal PCI bus and multiple
|
|
downstream ports.
|
|
|
|
Both the CXL upstream and downstream ports have CXL specific
|
|
DVSECs in configuration space, and component registers in PCI
|
|
BARs. The Upstream Port has the configuration interfaces for
|
|
the HDM decoders which route incoming memory accesses to the
|
|
appropriate downstream port.
|
|
|
|
A CXL switch is created in a similar fashion to PCI switches
|
|
by creating an upstream port (cxl-upstream) and a number of
|
|
downstream ports on the internal switch bus (cxl-downstream).
|
|
|
|
CXL Memory Devices - Type 3
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
CXL type 3 devices use a PCI class code and are intended to be supported
|
|
by a generic operating system driver. They have HDM decoders
|
|
though in these EP devices, the decoder is responsible not for
|
|
routing but for translation of the incoming host physical address (HPA)
|
|
into a Device Physical Address (DPA).
|
|
|
|
CXL Memory Interleave
|
|
---------------------
|
|
To understand the interaction of different CXL hardware components which
|
|
are emulated in QEMU, let us consider a memory read in a fully configured
|
|
CXL topology. Note that system software is responsible for configuration
|
|
of all components with the exception of the CFMWs. System software is
|
|
responsible for allocating appropriate ranges from within the CFMWs
|
|
and exposing those via normal memory configurations as would be done
|
|
for system RAM.
|
|
|
|
Example system topology. x marks the match in each decoder level::
|
|
|
|
|<------------------SYSTEM PHYSICAL ADDRESS MAP (1)----------------->|
|
|
| __________ __________________________________ __________ |
|
|
| | | | | | | |
|
|
| | CFMW 0 | | CXL Fixed Memory Window 1 | | CFMW 2 | |
|
|
| | HB0 only | | Configured to interleave memory | | HB1 only | |
|
|
| | | | memory accesses across HB0/HB1 | | | |
|
|
| |__________| |_____x____________________________| |__________| |
|
|
| | | |
|
|
| | | |
|
|
| | | |
|
|
| Interleave Decoder | |
|
|
| Matches this HB | |
|
|
\_____________| |_____________/
|
|
__________|__________ _____|_______________
|
|
| | | |
|
|
(2) | CXL HB 0 | | CXL HB 1 |
|
|
| HB IntLv Decoders | | HB IntLv Decoders |
|
|
| PCI/CXL Root Bus 0c | | PCI/CXL Root Bus 0d |
|
|
| | | |
|
|
|___x_________________| |_____________________|
|
|
| | | |
|
|
| | | |
|
|
A HB 0 HDM Decoder | | |
|
|
matches this Port | | |
|
|
| | | |
|
|
___________|___ __________|__ __|_________ ___|_________
|
|
(3)| Root Port 0 | | Root Port 1 | | Root Port 2| | Root Port 3 |
|
|
| Appears in | | Appears in | | Appears in | | Appear in |
|
|
| PCI topology | | PCI topology| | PCI topo | | PCI topo |
|
|
| as 0c:00.0 | | as 0c:01.0 | | as de:00.0 | | as de:01.0 |
|
|
|_______________| |_____________| |____________| |_____________|
|
|
| | | |
|
|
| | | |
|
|
_____|_________ ______|______ ______|_____ ______|_______
|
|
(4)| x | | | | | | |
|
|
| CXL Type3 0 | | CXL Type3 1 | | CXL type3 2| | CLX Type 3 3 |
|
|
| | | | | | | |
|
|
| PMEM0(Vol LSA)| | PMEM1 (...) | | PMEM2 (...)| | PMEM3 (...) |
|
|
| Decoder to go | | | | | | |
|
|
| from host PA | | PCI 0e:00.0 | | PCI df:00.0| | PCI e0:00.0 |
|
|
| to device PA | | | | | | |
|
|
| PCI as 0d:00.0| | | | | | |
|
|
|_______________| |_____________| |____________| |______________|
|
|
|
|
Notes:
|
|
|
|
(1) **3 CXL Fixed Memory Windows (CFMW)** corresponding to different
|
|
ranges of the system physical address map. Each CFMW has
|
|
particular interleave setup across the CXL Host Bridges (HB)
|
|
CFMW0 provides uninterleaved access to HB0, CFMW2 provides
|
|
uninterleaved access to HB1. CFMW1 provides interleaved memory access
|
|
across HB0 and HB1.
|
|
|
|
(2) **Two CXL Host Bridges**. Each of these has 2 CXL Root Ports and
|
|
programmable HDM decoders to route memory accesses either to
|
|
a single port or interleave them across multiple ports.
|
|
A complex configuration here, might be to use the following HDM
|
|
decoders in HB0. HDM0 routes CFMW0 requests to RP0 and hence
|
|
part of CXL Type3 0. HDM1 routes CFMW0 requests from a
|
|
different region of the CFMW0 PA range to RP2 and hence part
|
|
of CXL Type 3 1. HDM2 routes yet another PA range from within
|
|
CFMW0 to be interleaved across RP0 and RP1, providing 2 way
|
|
interleave of part of the memory provided by CXL Type3 0 and
|
|
CXL Type 3 1. HDM3 routes those interleaved accesses from
|
|
CFMW1 that target HB0 to RP 0 and another part of the memory of
|
|
CXL Type 3 0 (as part of a 2 way interleave at the system level
|
|
across for example CXL Type3 0 and CXL Type3 2.
|
|
HDM4 is used to enable system wide 4 way interleave across all
|
|
the present CXL type3 devices, by interleaving those (interleaved)
|
|
requests that HB0 receives from from CFMW1 across RP 0 and
|
|
RP 1 and hence to yet more regions of the memory of the
|
|
attached Type3 devices. Note this is a representative subset
|
|
of the full range of possible HDM decoder configurations in this
|
|
topology.
|
|
|
|
(3) **Four CXL Root Ports.** In this case the CXL Type 3 devices are
|
|
directly attached to these ports.
|
|
|
|
(4) **Four CXL Type3 memory expansion devices.** These will each have
|
|
HDM decoders, but in this case rather than performing interleave
|
|
they will take the Host Physical Addresses of accesses and map
|
|
them to their own local Device Physical Address Space (DPA).
|
|
|
|
Example topology involving a switch::
|
|
|
|
|<------------------SYSTEM PHYSICAL ADDRESS MAP (1)----------------->|
|
|
| __________ __________________________________ __________ |
|
|
| | | | | | | |
|
|
| | CFMW 0 | | CXL Fixed Memory Window 1 | | CFMW 2 | |
|
|
| | HB0 only | | Configured to interleave memory | | HB1 only | |
|
|
| | | | memory accesses across HB0/HB1 | | | |
|
|
| |____x_____| |__________________________________| |__________| |
|
|
| | | |
|
|
| | | |
|
|
| | |
|
|
Interleave Decoder | | |
|
|
Matches this HB | | |
|
|
\_____________| |_____________/
|
|
__________|__________ _____|_______________
|
|
| | | |
|
|
| CXL HB 0 | | CXL HB 1 |
|
|
| HB IntLv Decoders | | HB IntLv Decoders |
|
|
| PCI/CXL Root Bus 0c | | PCI/CXL Root Bus 0d |
|
|
| | | |
|
|
|___x_________________| |_____________________|
|
|
| | | |
|
|
|
|
|
A HB 0 HDM Decoder
|
|
matches this Port
|
|
___________|___
|
|
| Root Port 0 |
|
|
| Appears in |
|
|
| PCI topology |
|
|
| as 0c:00.0 |
|
|
|___________x___|
|
|
|
|
|
|
|
|
\_____________________
|
|
|
|
|
|
|
|
---------------------------------------------------
|
|
| Switch 0 USP as PCI 0d:00.0 |
|
|
| USP has HDM decoder which direct traffic to |
|
|
| appropriate downstream port |
|
|
| Switch BUS appears as 0e |
|
|
|x__________________________________________________|
|
|
| | | |
|
|
| | | |
|
|
_____|_________ ______|______ ______|_____ ______|_______
|
|
(4)| x | | | | | | |
|
|
| CXL Type3 0 | | CXL Type3 1 | | CXL type3 2| | CLX Type 3 3 |
|
|
| | | | | | | |
|
|
| PMEM0(Vol LSA)| | PMEM1 (...) | | PMEM2 (...)| | PMEM3 (...) |
|
|
| Decoder to go | | | | | | |
|
|
| from host PA | | PCI 10:00.0 | | PCI 11:00.0| | PCI 12:00.0 |
|
|
| to device PA | | | | | | |
|
|
| PCI as 0f:00.0| | | | | | |
|
|
|_______________| |_____________| |____________| |______________|
|
|
|
|
Example command lines
|
|
---------------------
|
|
A very simple setup with just one directly attached CXL Type 3 Persistent Memory device::
|
|
|
|
qemu-system-x86_64 -M q35,cxl=on -m 4G,maxmem=8G,slots=8 -smp 4 \
|
|
...
|
|
-object memory-backend-file,id=cxl-mem1,share=on,mem-path=/tmp/cxltest.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-lsa1,share=on,mem-path=/tmp/lsa.raw,size=256M \
|
|
-device pxb-cxl,bus_nr=12,bus=pcie.0,id=cxl.1 \
|
|
-device cxl-rp,port=0,bus=cxl.1,id=root_port13,chassis=0,slot=2 \
|
|
-device cxl-type3,bus=root_port13,persistent-memdev=cxl-mem1,lsa=cxl-lsa1,id=cxl-pmem0 \
|
|
-M cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.size=4G
|
|
|
|
A very simple setup with just one directly attached CXL Type 3 Volatile Memory device::
|
|
|
|
qemu-system-x86_64 -M q35,cxl=on -m 4G,maxmem=8G,slots=8 -smp 4 \
|
|
...
|
|
-object memory-backend-ram,id=vmem0,share=on,size=256M \
|
|
-device pxb-cxl,bus_nr=12,bus=pcie.0,id=cxl.1 \
|
|
-device cxl-rp,port=0,bus=cxl.1,id=root_port13,chassis=0,slot=2 \
|
|
-device cxl-type3,bus=root_port13,volatile-memdev=vmem0,id=cxl-vmem0 \
|
|
-M cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.size=4G
|
|
|
|
The same volatile setup may optionally include an LSA region::
|
|
|
|
qemu-system-x86_64 -M q35,cxl=on -m 4G,maxmem=8G,slots=8 -smp 4 \
|
|
...
|
|
-object memory-backend-ram,id=vmem0,share=on,size=256M \
|
|
-object memory-backend-file,id=cxl-lsa0,share=on,mem-path=/tmp/lsa.raw,size=256M \
|
|
-device pxb-cxl,bus_nr=12,bus=pcie.0,id=cxl.1 \
|
|
-device cxl-rp,port=0,bus=cxl.1,id=root_port13,chassis=0,slot=2 \
|
|
-device cxl-type3,bus=root_port13,volatile-memdev=vmem0,lsa=cxl-lsa0,id=cxl-vmem0 \
|
|
-M cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.size=4G
|
|
|
|
A setup suitable for 4 way interleave. Only one fixed window provided, to enable 2 way
|
|
interleave across 2 CXL host bridges. Each host bridge has 2 CXL Root Ports, with
|
|
the CXL Type3 device directly attached (no switches).::
|
|
|
|
qemu-system-x86_64 -M q35,cxl=on -m 4G,maxmem=8G,slots=8 -smp 4 \
|
|
...
|
|
-object memory-backend-file,id=cxl-mem1,share=on,mem-path=/tmp/cxltest.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-mem2,share=on,mem-path=/tmp/cxltest2.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-mem3,share=on,mem-path=/tmp/cxltest3.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-mem4,share=on,mem-path=/tmp/cxltest4.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-lsa1,share=on,mem-path=/tmp/lsa.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-lsa2,share=on,mem-path=/tmp/lsa2.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-lsa3,share=on,mem-path=/tmp/lsa3.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-lsa4,share=on,mem-path=/tmp/lsa4.raw,size=256M \
|
|
-device pxb-cxl,bus_nr=12,bus=pcie.0,id=cxl.1 \
|
|
-device pxb-cxl,bus_nr=222,bus=pcie.0,id=cxl.2 \
|
|
-device cxl-rp,port=0,bus=cxl.1,id=root_port13,chassis=0,slot=2 \
|
|
-device cxl-type3,bus=root_port13,persistent-memdev=cxl-mem1,lsa=cxl-lsa1,id=cxl-pmem0 \
|
|
-device cxl-rp,port=1,bus=cxl.1,id=root_port14,chassis=0,slot=3 \
|
|
-device cxl-type3,bus=root_port14,persistent-memdev=cxl-mem2,lsa=cxl-lsa2,id=cxl-pmem1 \
|
|
-device cxl-rp,port=0,bus=cxl.2,id=root_port15,chassis=0,slot=5 \
|
|
-device cxl-type3,bus=root_port15,persistent-memdev=cxl-mem3,lsa=cxl-lsa3,id=cxl-pmem2 \
|
|
-device cxl-rp,port=1,bus=cxl.2,id=root_port16,chassis=0,slot=6 \
|
|
-device cxl-type3,bus=root_port16,persistent-memdev=cxl-mem4,lsa=cxl-lsa4,id=cxl-pmem3 \
|
|
-M cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.targets.1=cxl.2,cxl-fmw.0.size=4G,cxl-fmw.0.interleave-granularity=8k
|
|
|
|
An example of 4 devices below a switch suitable for 1, 2 or 4 way interleave::
|
|
|
|
qemu-system-x86_64 -M q35,cxl=on -m 4G,maxmem=8G,slots=8 -smp 4 \
|
|
...
|
|
-object memory-backend-file,id=cxl-mem0,share=on,mem-path=/tmp/cxltest.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-mem1,share=on,mem-path=/tmp/cxltest1.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-mem2,share=on,mem-path=/tmp/cxltest2.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-mem3,share=on,mem-path=/tmp/cxltest3.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-lsa0,share=on,mem-path=/tmp/lsa0.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-lsa1,share=on,mem-path=/tmp/lsa1.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-lsa2,share=on,mem-path=/tmp/lsa2.raw,size=256M \
|
|
-object memory-backend-file,id=cxl-lsa3,share=on,mem-path=/tmp/lsa3.raw,size=256M \
|
|
-device pxb-cxl,bus_nr=12,bus=pcie.0,id=cxl.1 \
|
|
-device cxl-rp,port=0,bus=cxl.1,id=root_port0,chassis=0,slot=0 \
|
|
-device cxl-rp,port=1,bus=cxl.1,id=root_port1,chassis=0,slot=1 \
|
|
-device cxl-upstream,bus=root_port0,id=us0 \
|
|
-device cxl-downstream,port=0,bus=us0,id=swport0,chassis=0,slot=4 \
|
|
-device cxl-type3,bus=swport0,persistent-memdev=cxl-mem0,lsa=cxl-lsa0,id=cxl-pmem0 \
|
|
-device cxl-downstream,port=1,bus=us0,id=swport1,chassis=0,slot=5 \
|
|
-device cxl-type3,bus=swport1,persistent-memdev=cxl-mem1,lsa=cxl-lsa1,id=cxl-pmem1 \
|
|
-device cxl-downstream,port=2,bus=us0,id=swport2,chassis=0,slot=6 \
|
|
-device cxl-type3,bus=swport2,persistent-memdev=cxl-mem2,lsa=cxl-lsa2,id=cxl-pmem2 \
|
|
-device cxl-downstream,port=3,bus=us0,id=swport3,chassis=0,slot=7 \
|
|
-device cxl-type3,bus=swport3,persistent-memdev=cxl-mem3,lsa=cxl-lsa3,id=cxl-pmem3 \
|
|
-M cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.size=4G,cxl-fmw.0.interleave-granularity=4k
|
|
|
|
Deprecations
|
|
------------
|
|
|
|
The Type 3 device [memdev] attribute has been deprecated in favor of the
|
|
[persistent-memdev] attributes. [memdev] will default to a persistent memory
|
|
device for backward compatibility and is incapable of being used in combination
|
|
with [persistent-memdev].
|
|
|
|
Kernel Configuration Options
|
|
----------------------------
|
|
|
|
In Linux 5.18 the following options are necessary to make use of
|
|
OS management of CXL memory devices as described here.
|
|
|
|
* CONFIG_CXL_BUS
|
|
* CONFIG_CXL_PCI
|
|
* CONFIG_CXL_ACPI
|
|
* CONFIG_CXL_PMEM
|
|
* CONFIG_CXL_MEM
|
|
* CONFIG_CXL_PORT
|
|
* CONFIG_CXL_REGION
|
|
|
|
References
|
|
----------
|
|
|
|
- Consortium website for specifications etc:
|
|
http://www.computeexpresslink.org
|
|
- Compute Express link Revision 2 specification, October 2020
|
|
- CEDT CFMWS & QTG _DSM ECN May 2021
|