
8.1.4 Non-CXL Function Map DVSEC
该 DVSEC 能力用于标识 CXL 设备所实现的、无法参与 CXL.Cache 或 CXL.Mem 协议的非虚拟功能所对应的设备号和功能号列表。这里的非虚拟功能是指不是 VF(Virtual Function,虚拟功能) 的功能。
CXL 2.0 Endpoint 或 CXL 1.1 RCiEP 的 Device 0、Function 0 的 PCIe 配置空间中,可以包含图 127 所示的 Non-CXL Function Map DVSEC。完整的寄存器列表参见表 124。
为了声明该能力,标准 DVSEC 寄存器字段必须设置为下表所示的值。DVSEC Length 字段必须设置为 2Ch 字节,以容纳该 DVSEC 中包含的所有寄存器。
DVSEC ID 必须设置为 02h,以表明该结构是用于 CXL 端口的 Non-CXL Function Map DVSEC 能力结构。
如果存在该 DVSEC 能力,则它必须位于 CXL 设备的:Device 0, Function 0
如果不存在 Non-CXL Function Map DVSEC,则由位于 Device 0、Function 0 中的 PCIe DVSEC for CXL Device(第 8.1.3 节)统一决定所有功能是否参与 CXL.Cache 和 CXL.Mem 协议。
1. 该 DVSEC 解决的问题
一个 CXL 设备可以实现多个 PCIe 功能,但其中某些非虚拟功能可能只支持普通 PCIe/http://CXL.io 操作,不能参与:
CXL.Cache,CXL.Mem。
Non-CXL Function Map DVSEC 用于将这些功能单独标识出来:
没有这个映射结构时,软件只能根据 Device 0、Function 0 的 CXL DVSEC 对所有功能进行统一判断。
2. Non-CXL 的含义
这里的 Non-CXL Function 并不意味着该功能完全不能使用 CXL 链路,也不一定意味着它不是 PCIe 功能。
它特指该功能:
不能参与 CXL.Cache 或者 不能参与 CXL.Mem.
这些功能仍可能:
.通过 PCIe 配置空间被枚举;
.使用 CXL.io/PCIe 事务;
.提供设备管理或其他厂商定义功能。
因此,Non-CXL 在这里主要针对 CXL.Cache 和 CXL.Mem 协议参与能力。
3. 只描述非虚拟功能
该 DVSEC 只标识:不是 Virtual Function 的功能
也就是说,它不是用于逐个描述 SR-IOV VF 的映射表。
这里的非虚拟功能可以包括传统 PCIe Function 或 Physical Function,但规范定义的关键判断条件是:该功能不是 VF
4. 为什么必须位于 Device 0、Function 0
如果该 DVSEC 存在,必须放在:Device Number = 0, Function Number = 0
这样,系统软件只需要检查 CXL 设备的标准入口功能,就可以获得整个设备的 Non-CXL 功能映射信息。
枚举流程可表示为:
1).发现 CXL 设备
2).访问 Device 0, Function 0
3).遍历 PCIe Extended Capability
4).查找 Non-CXL Function Map DVSEC
5).解析所有 Non-CXL Function Map Registers
软件不需要在每个功能中分别搜索该 DVSEC。
5. 八个映射寄存器
该结构包含八个 32 位映射寄存器:Register 0,Register 1,Register 2,Register 3,Register 4,Register 5,Register 6,Register 7
总映射位数为:8 × 32 = 256 bit
这些位共同用于表示设备号与功能号的组合。PCIe 设备号和功能号组合后也可以形成 8 位标识:
Device Number :5 bit
Function Number :3 bit
总计 :8 bit
因此,可表示的组合数量为:2^8 = 256
具体哪个 Bit 对应哪个 Device/Function 组合,应以规范表 124 中的完整字段定义为准。
6. DVSEC 长度为什么是 2Ch
DVSEC Length = 2Ch 表示该能力结构总长度为:0x2C = 44 字节
其地址范围为:偏移 00h~2Bh
结构中共有 11 个 DWORD:44 B ÷ 4 B = 11 DWORD
组成如下:
| PCI Express Extended Capability Header | 1 DWORD |
| Designated Vendor-Specific Header 1 | 1 DWORD |
| Designated Vendor-Specific Header 2及保留字段 | 1 DWORD |
| Non-CXL Function Map Register | 8 DWORD |
| 总计 | 11 DWORD |
因此:11 × 4 B = 44 B = 2Ch
7. 标准 DVSEC 识别字段
软件可以通过以下字段识别该能力:
核心识别条件为:
DVSEC Vendor ID = 1E98h
DVSEC ID = 02h
DVSEC Length = 2Ch
8. DVSEC 存在时
如果 Device 0、Function 0 中存在该 DVSEC,软件应:
1).读取 Device 0、Function 0 的 CXL 能力;
2).读取八个 Non-CXL Function Map 寄存器;
3).找出被标记为 Non-CXL 的非虚拟功能;
4).不让这些功能参与 CXL.Cache 或 CXL.Mem;
5).对未被标记的功能继续根据相应 CXL 能力进行配置。
9. DVSEC 不存在时
如果没有找到 Non-CXL Function Map DVSEC,则不存在逐功能的例外映射。
此时,由 Device 0、Function 0 中的:PCIe DVSEC for CXL Device
统一控制所有功能的 CXL.Cache 和 CXL.Mem 参与能力。
1).Non-CXL Function Map DVSEC 不存在
2).读取 Device 0, Function 0 的 CXL DVSEC
3).其能力设置适用于所有 Functions
例如,如果 Device 0、Function 0 报告相应协议能力和使能状态,则软件按照该统一信息判断整个设备的功能参与情况,而不是查找逐功能例外。
10. 存在与不存在的区别
存在 : 使用映射寄存器识别不能参与 CXL.Cache/CXL.Mem 的特定非虚拟功能
不存在 :Device 0、Function 0 的 PCIe DVSEC for CXL Device 统一管理所有功能
可以表示为:
11. 核心结论
该 DVSEC 的核心作用是:在多功能 CXL 设备中提供逐功能例外映射,明确指出哪些非虚拟功能不能参与 CXL.Cache 或 CXL.Mem;如果该结构不存在,则由 Device 0、Function 0 的 CXL DVSEC 统一决定所有功能的协议参与能力。
1. 不支持 ARI 时
不支持 ARI 时,PCIe BDF 使用:
Bus Number :8 bit
Device Number :5 bit,范围 0~31
Function Number:3 bit,范围 0~7
每个 Map Register 对应一个固定的 Function Number,寄存器内的 Bit x 对应 Device x:
对应关系如下:
Register 0 Bit x → D=x, F=0
Register 1 Bit x → D=x, F=1
Register 2 Bit x → D=x, F=2
Register 3 Bit x → D=x, F=3
Register 4 Bit x → D=x, F=4
Register 5 Bit x → D=x, F=5
2. 非 ARI 映射示例
假设:Non-CXL Function Map Register 3 = 0x00000020
0x20 表示 Bit 5 为 1,因此:
Bit x = Bit 5
Device = 5
Function = 3
对应 BDF = 当前 Bus:05.3
该功能不能参与:CXL.Cache, CXL.Mem
但它仍可能作为普通 PCIe/http://CXL.io Function,通过自己的 PCIe BAR、配置空间、中断或 DMA机制工作。
3. 不支持 ARI 时的整体布局
八个 32 位寄存器形成一个二维映射:
例如,要标记 Device 6, Function 4 为 Non-CXL:
选择 Register 4
设置 Bit 6
即:Non-CXL Function Map Register 4 |= (1U << 6)
4. 支持 ARI 时
ARI 将传统的 Device/Function 组合扩展为一个 8 位 Function Number,范围为:
Function 0~255
八个寄存器各覆盖连续的 32 个 Function:
统一公式为:ARI Function Number =Register_Number × 32 + Bit_Number
5. ARI 映射示例
如果要标记:ARI Function 100
Register_Number = 100 / 32 = 3
Bit_Number = 100 % 32 = 4
因此需要:Non-CXL Function Map Register 3 Bit 4 = 1
再例如:ARI Function 175
计算:
Register_Number = 175 / 32 = 5
Bit_Number = 175 % 32 = 15
对应:Non-CXL Function Map Register 5 Bit 15 = 1
6. Bit 值的含义
`0` :该位没有把对应非虚拟 Function 标记为 Non-CXL,或者对应 Function 不存在
`1` :对应非虚拟 Function 不能参与 CXL.Cache 或 CXL.Mem |
需要注意,Bit 为 0 并不能单独证明 Function 一定支持某个具体协议。它只说明该 Function 没有被该映射表排除。
最终是否支持协议,还需要结合 D0F0 中 PCIe DVSEC for CXL Device 的能力字段,例如:
Cache_Capable,Mem_Capable,Cache_Enable,Mem_Enable
7. 不存在的 Function
如果某个 BDF 或 ARI Function 没有实现,其对应位必须返回 0:
Function 不存在, 对应 Non-CXL Map Bit = 0
因此不能将:Bit = 0
直接解释为“该 Function 支持 CXL.cache/CXL.mem”。
正确判断流程为:
1).先确认 Function 是否存在
2).再检查对应 Non-CXL Map Bit
3).检查 D0F0 的 CXL能力和使能状态
8. 与地址译码的关系
这些寄存器只描述 Function 的协议参与资格
Non-CXL Function Map->该 Function 是否可以参与 CXL.Cache/CXL.Mem
它们不包含:HPA Base;HPA Size;DPA Base;HDM Decoder 编号;Interleave Granularity;Interleave Ways。
因此,这些寄存器不执行也不划分 HPA→DPA 地址转换。
实际关系为:
1).Non-CXL Map Bit = 1
2).该 Function 不参与 CXL.mem
3).不存在为该 Function 单独划分 HDM Range 的含义
而设备的地址译码仍由以下机制完成:
HDM Decoder Enable = 0
→ 使用 D0F0 DVSEC CXL Range
HDM Decoder Enable = 1
→ 使用 Component HDM Decoder
9. 关于 Register 0 Bit 0
Register 0 Bit 0 必须为 1
但这与同一字段中“Bit 为 1 表示对应 Function 不能参与 CXL.Cache/CXL.Mem”的一般定义存在表面矛盾。
如果 Non-CXL Function Map DVSEC 存在,
对应于携带该 DVSEC 的 D0F0 的映射位必须为 0。
即 D0F0 不应被 Non-CXL Function Map 排除
因此:
严格按上图时: 原图写的是 Bit 0 必须为 1。
进行新设计或实现验证时: 应检查所采用 CXL 版本及对应勘误;不要仅依据这张旧版表格直接固定为 1。
按后续官方勘误理解: D0F0 对应位应为 0,D0F0 的 CXL 参与能力由其 PCIe DVSEC for CXL Device 声明。
10. 核心映射公式
非 ARI:
Register n, Bit x
→ Device x, Function n
ARI:
Register n, Bit x
→ Function (n × 32 + x)
这组寄存器的核心作用是:使用一个 256 位硬件初始化位图,标记同一总线上哪些非虚拟 Function 不能参与 CXL.Cache 或 CXL.Mem。该位图只决定协议参与资格,不负责 CXL.mem 地址范围分配和 HPA→DPA 转换。
