欢迎光临散文网 会员登陆 & 注册

[QEMU]计算快速链接 (CXL)

2022-07-28 16:03 作者:-小白之家-  | 我要投稿


从单个主机的角度来看,CXL 是一种互连标准,面向连接到 CXL 主机的加速器和内存设备。此描述将重点介绍在 QEMU 仿真主机上运行的软件或功能仿真内部可见的那些方面。因此,它将跳过许多电气和协议元素,这些元素对于真正的硬件来说更感兴趣,并将主导对CCL的更一般的介绍。它还将完全忽略 CXL 的结构管理方面,只需考虑单个主机和静态配置。

CXL 与 CXL 主机网桥共享 PCI Express 的许多概念和大部分基础设施,CXL 主机桥具有可直接连接到 CXL 或 PCI 端点的 CXL 根端口。或者,可能存在 CXL 交换机,其下方连接了 CXL 和 PCI 端点。在许多情况下,额外的控制和功能是通过PCI Express接口公开的。接口的这种共享以及仿真代码反映在QEMU中如何仿真器件。在大多数情况下,各种 CXL 元素都是基于等效的 PCIe 设备构建的。

CXL 设备支持以下接口:

  • 最传统的 PCIe 接口

    • 配置空间访问

    • 用于寄存器和邮箱的 BAR 映射内存访问。

    • 微星/微星-X

    • 艾尔

    • DOE 邮箱

    • 集成开发环境

    • 许多其他PCI表达定义的接口。

  • 内存操作

    • 等效于访问 DRAM/NVDIMM。主机支持的任何普通内存访问/功能也应该适用于 CXL 连接的内存设备。

  • 缓存操作。它们大多与QEMU仿真无关,因为QEMU没有模拟一致性协议。与这些相关的任何仿真都将是特定于设备的,不在本文档的讨论范围之内。

CXL 2.0 设备类型

CXL 2.0 端点通常分为三种类型。

类型 1:它们支持主机内存的一致缓存。示例可能是加密加速器。还可以通过诸如PCI存储器读取和写入BAR之类的方式访问设备专用存储器。

类型 2:它们支持主机内存和主机托管设备内存 (HDM) 的一致性缓存,其中的一致性协议由主机管理。这是一个复杂的主题,因此有关 CXL 一致性的更多信息,请参阅 CXL 2.0 规范。

类型 3 存储设备:这些设备充当将附加内存 (HDM) 附加到 CXL 主机(包括易失性和持久内存)的方法。CXL 拓扑可能支持使用主机、主机网桥、交换机上游端口和端点中的 HDM 解码器在多个类型 3 存储设备之间交错。

QEMU 中 CXL 仿真的范围

CXL 仿真的重点是 CXL 修订版 2.0 及更高版本。早期的 CXL 修订版定义了一组较小的功能,将大部分控制接口保留为已定义实现或特定于设备的操作,这使得通用仿真具有挑战性,因为主机特定的固件负责设置,并且端点作为根复杂集成端点呈现给操作系统。CXL 修订版 2.0 看起来更像 PCI Express,具有 CXL 拓扑的完全可发现性。

CXL 系统组件

CXL系统由具有许多“标准组件”的主机组成,其控制和功能可通过系统软件使用CXL 2.0规范中描述的方法发现。

CXL 固定内存窗口 (CFMW)

CFMW 由特定范围的主机物理地址空间组成,这些空间路由到特定的 CXL 主机网桥。在通用软件初始化时,它将具有特别交错的配置和相关的Serice Throtling Group(QTG)的质量。在决定如何在可用的 CXL 内存设备之间配置交错时,系统软件可以使用此信息。它在 CXL 早期发现表(ACPI 表)中作为 CFMW 结构 (CFMWS) 提供。

注意:QTG 0 是 QEMU 中目前唯一支持的。

CXL 主机桥 (CXL HB)

CXL 主机网桥类似于 PCIe 等效器,但具有规范定义的寄存器接口,称为 CXL 主机网桥组件寄存器 (CHBCR)。此 CHBCR MMIO 空间的位置通过 CEDT ACPI 表中的 CXL 主机桥接结构 (CHBS) 向系统软件描述。实际接口与用于 CXL 层次结构的其他部分的接口相同,例如 PCI BAR 中的 CXL 组件寄存器。

提供的接口包括:

  • 配置 HDM 解码器以将具有特定主机物理地址范围的 CXL 内存访问路由到目标端口,而为该地址提供服务的 CXL 设备位于该目标端口下方。这可能是映射到单个根端口 (RP) 或跨一组目标 RP 的映射。

CXL 根端口 (CXL RP)

CXL 根端口服务器与 PCIe 根端口具有相同的用途。PCIe 配置空间中有许多特定于 CXL 的指定供应商特定扩展功能 (DVSEC),以及通过 PCI 条进行的相关组件寄存器访问。

CXL 交换机

在这里,我们考虑一个只有一个虚拟层次结构的简单 CXL 交换机。虽然存在更复杂的设备,但它们对特定主机的可见性通常与简单的交换机设计相同。主机通常不知道复杂的重新路由和设备池,他们只是看到设备被热添加或热删除。

CXL 交换机具有与 PCIe 中类似的架构,具有单个上行端口、内部 PCI 总线和多个下行端口。

CXL 上行和下行端口在配置空间中都有特定于 CXL 的 DVSEC,在 PCI BAR 中具有组件寄存器。上游端口具有 HDM 解码器的配置接口,这些接口将传入的内存访问路由到相应的下行端口。

CXL 交换机的创建方式与 PCI 交换机类似,方法是在内部交换机总线(cxl-downstream)上创建一个上游端口(cxl-upstream)和多个下行端口。

CXL 存储设备 - 类型 3

CXL 类型 3 设备使用 PCI 类代码,旨在由通用操作系统驱动程序支持。它们具有HDM解码器,尽管在这些EP设备中,解码器不用于路由,而是用于将传入主机物理地址(HPA)转换为设备物理地址(DPA)。

CXL 内存交错

为了理解在 QEMU 中模拟的不同 CXL 硬件组件的交互,让我们考虑在完全配置的 CXL 拓扑中读取内存。请注意,系统软件负责配置除 CFMW 之外的所有组件。系统软件负责从 CFMW 中分配适当的范围,并通过正常的内存配置公开这些范围,就像对系统 RAM 所做的那样。

示例系统拓扑。x 标记每个解码器级别的匹配项:

|<------------------SYSTEM PHYSICAL ADDRESS MAP (1)----------------->||    __________   __________________________________   __________    ||   |          | |                                  | |          |   ||   | CFMW 0   | |  CXL Fixed Memory Window 1       | | CFMW 1   |   ||   | 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| |             | |            | |              |    |_______________| |_____________| |____________| |______________|

笔记:

  1. 3 CXL固定内存窗口(CFMW)对应不同范围的系统物理地址映射。每个 CFMW 在 CXL 主机桥 (HB) 上都有特定的交错设置,CFMW0 提供对 HB0 的无交错访问,CFW2 提供对 HB1 的无交错访问。CFW1 提供跨 HB0 和 HB1 的交错内存访问。

  2. 两个 CXL 主机桥。每个都有2个CXL根端口和可编程HDM解码器,可将内存访问路由到单个端口或跨多个端错。此处的复杂配置可能是在 HB0 中使用以下 HDM 解码器。HDM0 将 CFMW0 请求路由到 RP0,从而路由到 CXL Type3 0 的一部分。HDM1 将 CFMW0 请求从 CFMW0 PA 范围的不同区域路由到 RP2,从而路由到 CXL Type 3 1 的一部分。HDM2 将另一个 PA 系列从 CFMW0 中路由到 RP0 和 RP1 之间交错,提供 CXL Type3 0 和 CXL Type 3 1 提供的部分内存的双向交错。HDM3 将那些从 CFMW1 以 HB0 为目标的交错访问路由到 RP 0 和 CXL Type 3 0 内存的另一部分(作为系统级双向交错的一部分,例如 CXL Type3 0 和 CXL Type3 2。HDM4 用于通过交错 HB0 从 CFMW1 接收的 RP 0 和 RP 1 请求,从而在当前的所有 CXL type3 设备之间实现系统范围的 4 路交错,从而交错到所连接的 Type3 设备的内存的更多区域。请注意,这是此拓扑中所有可能的 HDM 解码器配置的代表性子集。

  3. 四个 CXL 根端口。在这种情况下,CXL Type 3 设备直接连接到这些端口。

  4. 四个 CXL Type3 内存扩展设备。它们将具有 HDM 解码器,但在这种情况下,它们将获取访问的主机物理地址并将其映射到自己的本地设备物理地址空间 (DPA),而不是执行交错。

涉及交换机的示例拓扑:

|<------------------SYSTEM PHYSICAL ADDRESS MAP (1)----------------->||    __________   __________________________________   __________    ||   |          | |                                  | |          |   ||   | CFMW 0   | |  CXL Fixed Memory Window 1       | | CFMW 1   |   ||   | 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    |         |    appropiate 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| |             | |            | |              |    |_______________| |_____________| |____________| |______________|

示例命令行

非常简单的设置,只需一个直接连接的 CXL Type 3 设备:

qemu-system-aarch64 -M virt,gic-version=3,cxl=on -m 4g,maxmem=8G,slots=8 -cpu max \...-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,memdev=cxl-mem1,lsa=cxl-lsa1,id=cxl-pmem0 \-M cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.size=4G

适合 4 路交错的设置。仅提供一个固定窗口,可在 2 个 CXL 主机桥上实现双向交错。每个主机网桥都有 2 个 CXL 根端口,其中 CXL Type3 设备直接连接(无交换机):

qemu-system-aarch64 -M virt,gic-version=3,cxl=on -m 4g,maxmem=8G,slots=8 -cpu max \...-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,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,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,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,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

开关下方适合 1、2 或 4 路交错的 4 个设备示例:

qemu-system-aarch64 -M virt,gic-version=3,cxl=on -m 4g,maxmem=8G,slots=8 -cpu max \...-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,memdev=cxl-mem0,lsa=cxl-lsa0,id=cxl-pmem0,size=256M \-device cxl-downstream,port=1,bus=us0,id=swport1,chassis=0,slot=5 \-device cxl-type3,bus=swport1,memdev=cxl-mem1,lsa=cxl-lsa1,id=cxl-pmem1,size=256M \-device cxl-downstream,port=2,bus=us0,id=swport2,chassis=0,slot=6 \-device cxl-type3,bus=swport2,memdev=cxl-mem2,lsa=cxl-lsa2,id=cxl-pmem2,size=256M \-device cxl-downstream,port=3,bus=us0,id=swport3,chassis=0,slot=7 \-device cxl-type3,bus=swport3,memdev=cxl-mem3,lsa=cxl-lsa3,id=cxl-pmem3,size=256M \-M cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.size=4G,cxl-fmw.0.interleave-granularity=4k

内核配置选项

在 Linux 5.18 中,以下选项对于使用 CXL 内存设备的操作系统管理是必需的,如此处所述。

  • CONFIG_CXL_BUS

  • CONFIG_CXL_PCI

  • CONFIG_CXL_ACPI

  • CONFIG_CXL_PMEM

  • CONFIG_CXL_MEM

  • CONFIG_CXL_PORT

  • CONFIG_CXL_REGION

引用

  • 规范等的联盟网站:http://www.computeexpresslink.org

  • 计算快速链接修订版 2 规范,2020 年 10 月

  • CEDT CFMWS & QTG _DSM ECN May 2021


[QEMU]计算快速链接 (CXL)的评论 (共 条)

分享到微博请遵守国家法律