8.0 控制和状态寄存器
Compute Express Link 设备控制和状态寄存器被映射到单独的空间:配置空间和内存映射空间。配置空间寄存器使用配置读取和配置写入进行访问。内存映射寄存器使用内存读取和内存写入进行访问。表 123 总结了本章中定义的寄存器位的属性。除非另有说明,否则这些属性的定义与 PCI Express 基本规范一致。
各种寄存器和数据结构中的所有数值始终以小端格式编码。
CXL 组件在将寄存器字段初始化为其默认值的硬件方面与 PCIe 具有相同的要求,但系统集成设备有明显的例外。有关详细信息,请参阅 PCI Express 基本规范。
如下图是对寄存器属性的一些解释:
8.1 配置空间寄存器
CXL 配置空间寄存器由 CXL 1.1 设备、CXL 2.0 设备、CXL 交换机和 CXL 2.0 根端口实现。CXL 1.1 上行和下行端口不会将任何寄存器映射到配置空间。
8.1.1 PCI Express 指定供应商特定扩展功能
(DVSEC)ID 分配 CXL 规范定义的配置空间寄存器被分组为块,每个块都被枚举为 PCI Express 指定供应商特定扩展功能 (DVSEC) 结构。DVSEC 供应商 ID 字段设置为 1E98h,以指示这些
功能结构由 CXL 规范定义。
DVSEC 修订 ID 字段表示 DVSEC 结构的版本。每当扩展结构以添加更多功能时,DVSEC 修订 ID 都会递增。在此过程中应保持向后兼容性。对于所有 n 值,DVSEC 修订 ID n+1 结构可以通过替换修订 ID n 中标记为保留的字段来扩展修订 ID n,但不得重新定义现有字段的含义。为较低修订 ID 编写的软件可以继续在具有较高修订 ID 的 CXL DVSEC 结构上运行,但无法利用新功能。
DVSEC ID 的以下值由 CXL 规范定义
- P- PCI Express 设备、D1 - CXL 1.1 设备、D2 - CXL 2.0 设备、LD - 逻辑设备、FMLD - Fabric Manager 拥有的 LD 0xFFFF、UP1 - CXL 1.1 上行端口 RCRB、DP1 - CXL 1.1 下行端口 RCRB、
R - CXL 2.0 根端口、USP - CXL 交换机上行端口、DSP - CXL 交换机下行端口
8.1.2 CXL 数据对象交换 (DOE) 类型分配
数据对象交换 (DOE) 是 PCI SIG 定义的一种机制,用于主机与 PCIe 功能执行数据对象交换。
CXL 规范定义了以下 DOE 类型的值。CXL 规范定义的数据对象交换消息使用供应商 ID 1E98h。
- 强烈建议 CXL 2.0 设备支持合规性 DOE 类型。如果设备未实现合规性 DOE 类型,则应实现 PCIe DVSEC 以实现测试能力
(第 14.16.1 节)。
8.1.3 CXL 设备的 PCIe DVSEC
注意:CXL 1.1 规范将此 DVSEC 称为“用于 Flex 总线设备的 PCIe DVSEC”,并在引用各种寄存器名称和字段时使用术语“Flex 总线”。CXL 2.0 规范重命名了 DVSEC 和寄存器/字段名称,将术语“Flex 总线”替换为术语“CXL”,同时保留了功能。
CXL 1.1 设备创建新的 PCIe 枚举层次结构。因此,它会产生新的根总线,并可以在此总线号上公开一个或多个 PCIe 设备号和功能号。这些被公开为根复合体集成端点 (RCiEP)。
设备 0、功能 0 的 PCIe 配置空间应包括 CXL PCI Express 指定供应商特定扩展功能 (DVSEC),如图 126 所示。设备 0、功能 0 DVSEC 中的功能、状态和控制字段控制整个 CXL 设备的 CXL 功能。
CXL 2.0 设备像标准 PCIe 端点一样枚举,并出现在 CXL 2.0 根端口或 CXL 交换机下方。它应在父端口的辅助总线号处公开一个 PCIe 设备号和一个或多个功能号。这些被公开为标准 PCIe 端点 (EP)。设备 0、功能 0 的 PCIe 配置空间应包括 CXL PCI Express 指定的供应商特定扩展功能 (DVSEC),如图 126 所示。设备 0、功能 0 DVSEC 中的功能、状态和控制字段控制整个 CXL 设备的 CXL 功能。
软件可以使用此 DVSEC 的存在来区分 CXL 设备和 PCIe 设备。因此,标准 PCIe 设备不得公开此 DVSEC。请参阅表 124 了解完整列表。
有关标准 DVSEC 寄存器字段的描述,请参阅 PCIe 规范。
为了宣传 CXL 功能,标准 DVSEC 寄存器字段应设置为下表所示的值。DVSEC 长度字段设置为 38h 字节,以容纳 DVSEC 中包含的寄存器。DVSEC ID 设置为 0h,以宣传这是用于 CXL 设备的 PCIe DVSEC 结构。DVSEC 修订 ID 0h 表示 CXL 1.1 规范中定义的结构。DVSEC 修订 ID 01h 表示本规范中定义的结构。DVSEC 修订 ID 01h 结构通过替换 CXL 1.1 规范中标记为保留的字段来扩展修订 ID 0h,但不会重新定义现有字段的含义。CXL 1.1 设备可以实现修订 ID 0 或 1。CXL 2.0 设备不允许实现修订 ID 0,必须实现修订 ID 1。
8.1.3.1 DVSEC CXL Capability(偏移 0Ah)
Bit 0: Cache_Capable:如果设置,则表示在 Flex Bus.CXL 模式下运行时支持 CXL.cache 协议。对于 MLD 的所有功能,该值必须为 0
Bit 1: IO_Capable:如果设置,则表示在 Flex Bus.CXL 模式下运行时支持 CXL.io 协议。必须为 1。
Bit 2: Mem_Capable:如果设置,则表示在 Flex Bus.CXL 模式下运行时支持 CXL.mem 协议。对于 MLD 的所有功能,该值必须为 1。
Bit 3: Mem_HwInit_Mode:如果设置,则表示此支持 CXL.mem 的设备在设备上的硬件和固件的帮助下初始化内存。如果清除,则表示内存由主机软件(例如设备驱动程序)初始化。
如果 CXL.mem_Capable=0,则必须忽略此位。
Bit 5:4: HDM_Count:由 CXL 设备实现并通过此功能报告的 HDM 范围数。
00 - 零范围。如果 CXL.mem Capable=1,则此设置非法。
01 - 一个 HDM 范围。
10 - 两个 HDM 范围
11 - 保留
如果 CXL.mem_Capable=0,则此字段必须返回 00
Bit 6:缓存回写和无效功能:如果设置,则表示设备在 CXL Control2 寄存器中实现禁用缓存并启动缓存回写和无效控制位,在 CXL Status2 寄存器中实现缓存无效状态位。如果 CXL.Cache_Capable=1,则所有 CXL 2.0 设备都应设置此功能位。
Bit 7: CXL 复位功能:如果设置,表示设备支持 CXL 复位并在此寄存器中实现 CXL 复位超时字段、在 CXL Control2 寄存器中启动 CXL 复位位并在 CXL Status2 寄存器中实现 CXL 复位完成状态。此字段必须为 MLD 的所有功能报告相同的值。
Bit 10:8:CXL 重置超时:如果设置了 CXL 重置能力位,则此字段表示设备完成 CXL 重置可能需要的最长时间。如果 CXL 重置 Mem Clr 能力位为 1,则此时间还考虑了清除或随机化易失性 HDM 范围所需的时间。如果在此时间期限过后未设置 CXL Status2 寄存器中的 CXL 重置完成状态位,则软件可能会认为 CXL 重置失败。此值对于 MLD 的所有功能都必须相同。
编码:
000b - 10 毫秒
001b - 100 毫秒
010b - 1 秒
011b - 10 秒
100b - 100 秒
所有其他 - 保留
Bit 11:CXL 重置内存清除功能:设置后,设备能够在 CLX 重置期间清除或随机化易失性 HDM 范围。
Bit 12:保留
Bit13:多逻辑设备:如果设置,则表示这是 MLD 中的逻辑设备,包括 FM 拥有的 LD。如果清除,则表示这是 SLD。
Bit14:Viral_Capable:如果设置,则表示 CXL 设备支持病毒处理。对于所有设备,此值必须为 1。
Bit15:PM 初始化完成报告功能:如果设置,则表示 CXL 设备能够支持电源管理初始化完成标志。所有 CXL 2.0 设备都应设置此功能位。CXL 1.1 设备可以实现此功能。
此功能不适用于交换机和根端口。交换机和根端口应将此位硬连线为 0。
8.1.3.2 DVSEC CXL Control (偏移 0Ch)
Bit0:Cache_Enable:设置后,在 Flex Bus.CXL 模式下启用 CXL.cache 协议操作。由 CONFIG_LOCK 锁定。
此位的默认值为 0。
Bit1:IO_Enable:设置后,在 Flex Bus.CXL 模式下启用 CXL.io 协议操作。
此位始终返回 1
Bit2:Mem_Enable:设置后,在 Flex Bus.CXL 模式下启用 CXL.mem 协议操作。由 CONFIG_LOCK 锁定。
此位的默认值为 0。
Bit7:3:Cache_SF_Coverage:设备性能提示。由 CONFIG_LOCK 锁定。
0x00:表示主机上没有监听过滤器覆盖
对于所有其他 N 值:表示主机上的监听过滤器覆盖范围为 2^(N+15d) 字节。
例如,如果此字段包含值 5,则表示监听过滤器覆盖范围为 1 MB。
此字段的默认值为 0。
Bit10:8:Cache_SF_Granularity:设备的性能提示。由 CONFIG_LOCK 锁定。
000:表示主机上的 64B 粒度跟踪
001:表示主机上的 128B 粒度跟踪
010:表示主机上的 256B 粒度跟踪
011:表示主机上的 512B 粒度跟踪
100:表示主机上的 1KB 粒度跟踪
101:表示主机上的 2KB 粒度跟踪
110:表示主机上的 4KB 粒度跟踪
111:保留
此字段的默认值为 0。
Bit11:Cache_Clean_Eviction:设备性能提示。由 CONFIG_LOCK 锁定。
0:表示需要从设备缓存中彻底清除缓存以获得最佳性能
1:表示不需要从设备缓存中彻底清除缓存以获得最佳性能
此位的默认值为 0。
Bit13:12:保留
Bit14:Viral_Enable:设置后,在 CXL 设备中启用病毒处理。
由 CONFIG_LOCK 锁定。
如果为 0,CXL 设备可能会忽略其收到的病毒。
此位的默认值为 0。
Bit15:保留
8.1.3.3 DVSEC CXL Status (偏移 0Eh)
DVSEC CXL Control2 (偏移 10h)
Bit0:禁用缓存:设置为 1 时,设备将不再在其本地缓存中缓存新修改的行。设备将继续正确响应 CXL.cache 事务。
此位的默认值为 0。
Bit1:启动缓存写回和失效:设置为 1 时,设备应将所有修改过的行写回本地缓存中并使所有行失效。设备应根据 CXL.Cache 协议的要求向主机发送 CacheFlushed 消息,以表明它不保存任何修改过的行。
如果在禁用缓存 = 0 时设置此位,则设备行为未定义。
当软件读取此位时,始终返回 0 值。写入 0 将被忽略。
Bit2:启动 CXL 复位:设置为 1 时,设备应按照第 9.7 节中的定义启动 CXL 复位。软件读取此位时,该位始终返回 0 值。写入 0 将被忽略。如果软件在上一次 CXL 复位正在进行时设置此位,则结果不确定。
Bit3:CXL 重置 Mem Clr 启用:设置后,CXL 重置 Mem Clr 能力返回 1,设备应在 CXL 重置操作中清除或随机化易失性 HDM 范围。当 CXL 重置 Mem Clr 能力清除时,此位将被忽略,并且易失性 HDM 范围可能会或可能不会在 CXL 重置期间被清除或随机化。
Bit15:4:保留
8.1.3.5 DVSEC CXL Status2 (偏移 12h)
Bit0:缓存无效:设置后,设备保证不保留任何有效行,并且禁用缓存 = 1。当禁用缓存 = 0 时,此位应读为 0。
Bit1:CXL 复位完成:设置后,设备已成功完成第 9.7 节中定义的 CXL 复位。
在启动 CXL 复位流程之前,设备应在启动 CXL 复位位从 0 转换为 1 时清除此位。
Bit2:CXL 重置错误:设置后,设备已完成 CXL 重置但存在错误。设备错误记录中可能提供更多信息(图 8.2.9.1.1)。主机软件或 Fabric Manager 可以选择重新发出 CXL 重置。
在启动 CXL 重置流程之前,设备应在启动 CXL 重置位从 0 转换为 1 时清除此位。
Bit14:2:保留
Bit15:电源管理初始化完成:设置后,表示设备已成功完成图 16 中描述的电源管理初始化流程,并已准备好处理各种电源管理消息。
如果在链接后 100 毫秒内未设置此位,软件可能会断定电源管理初始化失败,并可能发出辅助总线复位以强制重新初始化链接和电源管理。
8.1.3.6 DVSEC CXL Lock (Offset 14h)
8.1.3.7 DVSEC CXL Capability2 (Offset 16h)
8.1.3.8 DVSEC CXL 范围寄存器
这些寄存器不适用于 FM 拥有的 LD。
如果 CXL.mem Capable=1,则必须实现 DVSEC CXL 范围 1 寄存器集。如果 (CXL.mem Capable=1 和 HDM_Count=10b),则必须实现 DVSEC CXL 范围 2 寄存器集。每组包含 4 个寄存器 - Size High、Size Low、Base High、Base Low。
允许具有 CXL.mem 功能的设备报告零内存大小。
8.1.3.8.1 DVSEC CXL Range 1 Size High (Offset 18h)
8.1.3.8.2 DVSEC CXL Range1 Size Low (Offset 1Ch)
8.1.3.8.3 DVSEC CXL Range 1 Base High (Offset 20h)
8.1.3.8.4 DVSEC CXL Range 1 Base Low (Offset 24h)
如果满足以下两个方程式,则无法实现CXL HDM解码器功能寄存器的CXL.MEM功能的设备将主机访问到其本地HDM内存中的地址A -Memory_base [63:28] <=(a> 28)<(a> 28)< memory_ base [63:28]+memory_size [63:28] memory_active and mem_enable = 1
,其中>>代表一个位右移操作。
实现CXL HDM解码器功能寄存器的CXL.MEM功能的设备遵循上述行为,只要HDM解码器在CXL HDM HDM解码器全局控制寄存器中启用位为零即可。
如果地址 A 没有实际内存支持(例如,内存小于 256 MB 的设备),则未实现 CXL HDM 解码器功能寄存器的设备必须妥善处理这些访问,即在读取时返回所有 1 并删除写入。
禁止别名(将多个主机物理地址 (HPA) 映射到单个设备物理地址)。
8.1.3.8.5 DVSEC CXL Range 2 Size High (Offset 28h)
8.1.3.8.6 DVSEC CXL Range 2 Size Low (Offset 2Ch)
8.1.3.8.7 DVSEC CXL Range 2 Base High (Offset 30h)
8.1.3.8.8 DVSEC CXL Range 2 Base Low (Offset 34h)
8.2 Memory Mapped Registers
CXL 内存映射寄存器位于表 137 中指定的六个通用区域中。值得注意的是,CXL 1.1 下行端口和 CXL 1.1 上行端口无法通过 PCIe 配置空间发现。相反,CXL 1.1 下行和上行端口寄存器是使用 PCIe 根复合体寄存器块 (RCRB) 实现的。此外,CXL 1.1 下行和上行端口各自实现一个 MEMBAR0 区域(也称为组件寄存器)来托管寄存器,用于配置与相应端口关联的 CXL 子系统组件。MEMBAR0 寄存器(图 134)保存组件寄存器的地址。
CXL 1.1 内存映射寄存器区域出现在内存空间中,如图 133 所示。请注意,RCRB 不与 MEMBAR0 区域重叠。另请注意,上行端口的 MEMBAR0 区域必须位于下行端口的内存基址和限制寄存器指定的范围内。只要满足这些要求,RCRB 如何映射到内存空间的细节是特定于实现的。
软件应使用 CXL.io 内存读取和写入来访问本节中定义的内存映射寄存器。除非另有规定,否则软件应根据以下情况限制访问宽度:
• 32 位寄存器应以 1 字节、2 字节或 4 字节的数量进行访问。
• 64 位寄存器应以 1 字节、2 字节、4 字节或 8 字节的数量进行访问
• 地址应为访问宽度的倍数,例如,当以 4 字节的数量访问寄存器时,地址应为 4 的倍数。
• 访问应映射到连续的字节。
如果不遵循这些规则,则行为未定义
Table 137. CXL Memory Mapped Registers Regions
Figure 133. CXL 1.1 Memory Mapped Register Regions
8.2.1 CXL 1.1 Upstream and Downstream Port Registers
8.2.1.1 CXL 1.1 Downstream Port RCRB
CXL 1.1 下行端口 RCRB 是一个 4K 内存区域,其中包含基于 PCIe 规范为根端口定义的寄存器的寄存器。图 134 说明了下行端口的 CXL RCRB 布局。除了第一个 DWORD 之外,CXL DP RCRB 的前 64 个字节实现了 PCIe 类型 1 配置头中的寄存器。RCRB 的第一个 DWORD 包含一个 NULL 扩展功能 ID,版本为 0h,以及一个下一个功能偏移指针。64 位 MEMBAR0 在偏移量 10h 和 14h 处实现;这指向一个私有内存区域,该区域托管用于配置下行端口子系统组件的寄存器,如表 137 中所述。通过跟踪指针的链接列表可以发现支持的 PCIe 功能和扩展功能。支持的 PCIe 功能映射到从 040h 到 0FFh 的偏移范围。支持的 PCIe 扩展功能映射到从 100h 到 FFFh 的偏移范围。表 138 列出了 CXL 下行端口支持的 PCIe 功能和扩展功能;相关寄存器的定义请参阅 PCIe 5.0 基本规范。
Figure 134. CXL Downstream Port RCRB
Table 138. CXL 1.1 Downstream Port PCIe Capabilities and Extended Capabilities (Sheet
1 of 2)
Table 138. CXL 1.1 Downstream Port PCIe Capabilities and Extended Capabilities (Sheet
2 of 2)
- 注意:如果设计选择对 PCIe 和 CXL 模式使用通用代码库,则软件有责任了解在 CXL 模式下不适用的功能内的寄存器。
8.2.1.2 CXL 1.1 Upstream Port RCRB
CXL 1.1 上行端口 RCRB 是一个 4K 内存区域,其中包含基于 PCIe 规范定义的寄存器的寄存器。上行端口捕获链路初始化后收到的第一个内存读取的高位地址位 [63:12] 作为上行端口 RCRB 的基地址。图 135 说明了上行端口的 CXL RCRB 布局。除了第一个 DW 之外,CXL UP RCRB 的前 64 个字节实现了 PCIe 类型 0 配置头中的寄存器。RCRB 的第一个 DW 包含一个 NULL 扩展功能 ID,版本为 0h 和一个下一个功能偏移指针。64 位 BAR(标记为 MEMBAR0)在偏移量 10h 和 14h 处实现;它指向一个内存区域,该区域托管用于配置
上行端口子系统 CXL.mem 的寄存器,如表 137 中所述。通过跟踪指针的链接列表可以发现支持的 PCIe
功能和扩展功能。支持的 PCIe 功能映射到从 040h 到
0FFh 的偏移范围。支持的 PCIe 扩展功能映射到从
100h 到 FFFh 的偏移范围。CXL 上行端口支持的 PCIe 功能和扩展功能列于表 139 中;请参阅 PCIe 5.0 基本规范以了解相关寄存器的定义。
作为 PCI Type 0 标头定义一部分的以下标准寄存器被视为保留的,对 CXL 1.1 上行端口的行为没有影响:
• 命令寄存器(偏移量 04h)
• 状态寄存器(偏移量 06h)。
根据 PCIe 基本规范,PCI Express 功能中的以下寄存器标记为 RCiEP 保留,不得由 CXL 1.1 设备的设备 0、功能 0 实现。
• 链路寄存器 - 链路功能寄存器、链路控制寄存器、链路状态寄存器、链路功能 2 寄存器、链路控制 2 寄存器和链路状态 2 寄存器
• 插槽寄存器 - 插槽功能寄存器、插槽控制寄存器、插槽状态寄存器、插槽功能 2 寄存器、插槽控制 2 寄存器和插槽状态 2 寄存器
• 根端口寄存器 - 根功能寄存器、根控制寄存器和根状态寄存器。
软件必须引用上游端口 RCRB PCI Express 功能结构中的链路寄存器,以便发现链路功能和链路状态;并配置链路属性。这些寄存器应遵循 PCIe 基本规范对上游交换机端口的定义。如果软件希望启用 CXL.io L1,则必须在链路控制寄存器中设置 ASPM 控制字段。
上行端口的设备功能寄存器、设备控制寄存器、设备状态寄存器、设备功能 2 寄存器、设备控制 2 寄存器和设备状态 2 寄存器中的所有字段均被保留。
上行端口功能寄存器中的设备/端口类型、已实现的插槽和中断消息编号字段被保留。
Figure 135. CXL 1.1 Upstream Port RCRB
Table 139. CXL 1.1 Upstream Port PCIe Capabilities and Extended Capabilities
- 注意:如果设计选择使用 PCIe 和 CXL 模式的通用代码库,则软件有责任了解在 CXL 模式下不适用的功能内的寄存器
8.2.1.3 Flex Bus Port DVSEC
所有 CXL 端口均实现 Flex 总线端口 DVSEC。此 DVSEC 位于 1.1 上行和 1.1 下行端口的 RCRB 中。CXL 1.1 端口可以实现此 DVSEC 的 DVSEC 修订版本 = 0 或 1。完整列表请参见表 124。如果 CXL 1.1 端口实现修订版本 = 1,则软件应忽略下面指定为“为 CXL 1.1 保留”的某些字段。
此 DVSEC 还位于 CXL 2.0 根端口、上行交换机端口、下行交换机端口和 CXL 2.0 设备的主要功能(设备 0、功能 0)的配置空间中。CXL 2.0 组件应报告此 DVSEC 的 DVSEC 修订版本 = 1。
图 136 显示了 Flex 总线端口 DVSEC 的布局,表 140 显示了应如何设置 header1 和 header2 寄存器。以下小节详细介绍了 Flex Bus Port DVSEC 中定义的寄存器。
Figure 136. PCIe DVSEC for Flex Bus Port
Table 140. PCI Express DVSEC Header Registers Settings for Flex Bus Port
8.2.1.3.1 DVSEC Flex Bus Port Capability (Offset 0Ah)
注意:设备的 Flex Bus DVSEC 中还存在 Mem_Capable、IO_Capable 和 Cache_Capable 字段。这为未来的可扩展性提供了保障,即多个设备(每个设备可能具有不同的功能)可以安装在单个端口后面
略。。。