PCI内存控制器、PCI数据捕获和信号处理控制器、SM总线控制器,一直是黄色感叹号,怎么处理?

PCI内存控制器、PCI数据捕获和信号处理控制器、SM总线控制器,一直是黄色感叹号,怎么处理?

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 转换。