✨ 1. 为何需要 Hierarchy ID ?
先说什么是 PCIe Hierarchy:PCIe I/O 互连的树形拓扑结构称为 PCIe 的 Hierarchy,或称层级、层次(不是事务层、数据链路层的“层”)。层次区域是指与 RC 某一 RP 相关联的所有设备和链路组成的线路结构,单个 PCIe 系统内允许存在多个层次区域。
在初始化 PCIe Hierarchy的时候,软件给每个组件分配 Bus、Device 和 Function Number,以确保每个 Function 在该 PCIe 树中都有一个独一无二的 Routing ID。
在大型 PCIe 系统或 CPU 集群系统中,树多层级多,仅采用原有的 BDF Routing ID 无法唯一确定某个 Function。为此,采用在 Routing ID 上添加额外信息的方式来产生唯一的 ID,在庞大的系统中唯一标识一个 Function。
通过以下三者组合可以唯一标识一个 Function:
✔️ 唯一的系统(RC)标识符;
✔️ RC 内唯一的层级(Hierarchy)标识符;
✔️ Hierarchy 内唯一的 Routing ID。
我们比较熟悉 Routing ID,此处按下不讲。那么,如何传递系统标识符和 Hierarchy 标识符呢? —— 用 Hierarchy ID Message !
— Hierarchy ID Message —
✨2. Hierarchy ID Message
Hierarchy ID Message 是 RC 发出的广播消息,用以给多层级平台中的 Function 传递 Routing ID 外的额外信息,以在多层级系统中确定唯一标识某个 Function。Hierarchy ID Mesage 中包含 Hierarchy ID、System GUID、System GUID Authority ID 等字段,详见 2.2 节。
2.1 Hierarchy ID Message 规则
Hierarchy ID Message 遵循以下规则:
Hierarchy ID Message 由下行端口根据软件请求生成,该下行端口下游的上行端口在收到 Hierarchy ID Message 后提取相关信息存放在其 Hierarchy ID 扩展能力寄存器中。
任何时间都可以发送 Hierarchy ID Message 。若某组件收到 Hierarchy ID Message 却不识别该消息(不支持 Hierarchy ID 能力),不会报错,而是静默忽略。
Hierarchy ID Message 通常由该 Hierarchy 顶层的下行端口(如 RP)发出。若系统 RP 不支持 Hierarchy ID Message ,也可以由 Switch 下行端口发出。
Hierarchy ID Message 可以为软件、固件、硬件所用。若 Function 启用了 Hierarchy ID Message,Function 在确认接收数据包治安除了要比对 Routing ID,还必须比对 Hierarchy ID、System GUID、System GUID Authority ID 字段。
2.2 Hierarchy ID Message 消息格式
Hierarchy ID Message 采用 PCI-SIG 定义的 VDM(Vender-Defined-Mechanism)机制,是一种带有数据载荷的 Type 1 类型的 VDM 消息,其格式如图 1 所示。
图 1 Hierarchy ID Message 消息格式
Hierarchy ID Message 的 TLP Type 为 MsgD,Length 为 4 表明带有 4DW 数据载荷。Fmt 为 011b,Type为10011b(RC 广播消息),TC[2:0] 为 000b,Attr[2:0] 及 Tag 字段预留,Message Code为01111111b,Vender ID为0001h,Subtype字段为 01h。
Hierarchy ID Message 中有 3 个关键的 ID 信息:
- Hierarchy ID 中含有本层级的段组号,跟 Routing ID 一起唯一标志系统中的 Function。RC 默认层级的 Hierarchy ID 为 0,若 Hierarchy ID 非 0,表明当前层级为附加层级。
- System GUID[143:0] 跟 System GUID Authority ID 一起唯一表示一个 PCIe 系统。GUID 是全局唯一标识符的缩写。
- System GUID Authority ID 用以表明为确保 System GUID 全局唯一而采用的机制,不同的 Authority ID 对应不同的机制。如表 1 所示。
表 1 System GUID Authority 机制
注意:Hierarchy ID Message 的接收者可有选择性地对消息各字段有效性进行检查确认,若检查不通过则当作畸形包处理。
2.3 System GUID 一致性与稳定性
一致性:为了支持 System GUID,软件应确保单个 PCIe 系统中所有组件采用相同的 System GUID 及 System GUID Authority ID。
稳定性:有些情况下需要在系统重启后保持 System GUID 不变。如果采用 EUI-48 机制分配 System GUID,且系统重启后因硬件故障第一个以太网 MAC 地址未发现,则会导致 System GUID 变化,从而导致 System GUID 不稳定,在实现过程中应避免这一情况的发生。
2.4 Hierarchy ID 与 设备序列号
设备序列号机制同样可以用于唯一标志一个组件,但是设备序列号要用 ROM 来存,每个组件都配个 ROM 就有点大材小用了,成本也高。
— Hierarchy ID 扩展能力结构 —
✨3. Hierarchy ID 扩展能力结构
Hierarchy ID 扩展能力提供了一种在层级内给 Function 传递唯一标识符的机制,采用 Hierarchy ID 的组件必须实现 Hierarchy ID 扩展能力。 Hierarchy ID 扩展能力是可选的,单个 Function 内最多允许实现一个 Hierarchy ID 扩展能力结构。 Hierarchy ID 扩展能力结构不能用于 Bridge、RC 事件收集器及 RCRB。
Hierarchy ID 扩展能力有 3 种形式:
在上行端口中,
任何与上行端口相关的 Function 都可以采用 Hierarchy ID 扩展能力
Hierarchy ID 扩展能力对 Switch 上行端口是可选的,且上行端口与下行端口独立可选
对于采用 Hierarchy ID Message 的 Function, Hierarchy ID 扩展能力是必选的
除 VF 之外的 Function,若其 Hierarchy ID 不可写,其必须上报其最近接收到的 Hierarchy ID Message 中的 Message Requester ID、Hierarchy ID、System GUID Authority ID 及 System GUID 字段
若 VF 的 Hierarchy ID 不可写,其必须上报与之关联的 PF 中的 Hierarchy ID Valid、Message Requester ID、Hierarchy ID、System GUID Authority ID 及 System GUID 字段
若 PF 相关联的 VF 实现了 Hierarchy ID 扩展能力,该 PF 也必须实现 Hierarchy ID 扩展能力
Hierarchy ID 可写的 Function 必须上报软件分配的 Hierarchy ID Valid、Message Requester ID、Hierarchy ID、System GUID Authority ID 及 System GUID 字段
在下行端口中,
任何下行端口都可以实现 Hierarchy ID 扩展能力,建议在 RP 中实现 Hierarchy ID 扩展能力
若 Switch 某个下行端口支持 Hierarchy ID 能力,这个 Switch 所有下行端口都应实现 Hierarchy ID 扩展能力,且上行端口与下行端口独立可选
在下行端口中,Hierarchy ID、System GUID Authority ID 及 System GUID 是可读可写的,其值为 Hierarchy ID Message 中的相关值
前向转发 Hierarchy ID Message 不会影响相关下行端口的 Hierarchy ID 能力
在RCiEP中,
若 VF 的 Hierarchy ID 不可写,其必须上报与之相关联的 PF 中的 Message Requester ID、Hierarchy ID、System GUID Authority ID 及 System GUID 字段
若 PF 相关联的 VF 实现了 Hierarchy ID 扩展能力,该 PF 也必须实现 Hierarchy ID 扩展能力
除 VF 之外的 Function,若其 Hierarchy ID 不可写,其必须上报 Hierarchy ID Valid、Message Requester ID、Hierarchy ID、System GUID Authority ID 及 System GUID 字段
Hierarchy ID 可写的 Function必须上报软件分配的 Hierarchy ID Valid、Message Requester ID、Hierarchy ID、System GUID Authority ID 及 System GUID 字段
Hierarchy ID 扩展能力结构格式如图 2 所示,包括 Hierarchy ID 扩展能力头标、
Hierarchy ID 状态寄存器、Hierarchy ID 数据寄存器、Hierarchy ID GUID 1-5 寄存器。
图 2 Hierarchy ID Extended Capability
- Hierarchy ID 扩展能力头标(图 3),用于指示当前组件具备 Hierarchy ID 能力、能力版本,并指向下一能力的地址偏移。
- Hierarchy ID 状态寄存器(图 4),
Message Requester ID 字段,在上行端口中,该字段值为最近接收的Hierarchy ID Message 中的 Requster ID,用以指明当前层级中发出 Hierarchy ID Message 的下行端口。该字段仅在 Hierarchy ID Valid 为 1 时有效。由于该字段的值在层级内可以动态变化,所以不把该字段的值算作 Hierarchy ID 的一部分,仅用于协助 debug Hierarchy ID 信息的出处。在下行端口及 RCiEP 中,该字段为预留。
Hierarchy ID Writeable,用以指示 Hierarchy ID Data 和 GUID 寄存器是否可读写。1 表示可读写,0 表示只读。在下行端口中该字段硬链接为 1;上行端口中,非 VF 的 Function 该字段硬链接为 0;非 VF 的 RCiEP 中,该字段可以硬链接为 0 或 1;上行端口的 VF 及 RC 的 VF 中,可以将该字段硬链接为 0,也可以采用默认值 0。
Hierarchy ID VF Configurable,用以指示 Hierarchy ID Writeable 字段是否可配。
Hierarchy ID Pending,在下行端口中该字段可读写,设置该字段为 1 可启动一次 Hierarchy ID Message 传输,传输的消息是基于 Hierarchy Data 和 GUID 寄存器中的数据。在发送完或链路进入 DL_Down 之后要清除该位。如果该字段置一之后又更改了 Hierarchy Data 和 GUID 寄存器,这种行为尚未定义该如何处理。除下行端口的 Function 外,其他 Function 该字段为预留。
Hierarchy ID Valid,该字段用以指示 Hierarchy ID 能力中的其余字段有效。在下行端口中,该字段硬链接为 1;在其他 Function 中,若 Hierarchy ID 可读写,该字段同样可读写;在其他 Function 中,若 Hierarchy ID 不可读写,该字段只读,默认值为 0。
Hierarchy ID 数据寄存器(图 5),存放 System GUID Authority ID 和 Hierarchy ID 数据的地方,生成 Hierarchy ID Message 会参考该寄存器的值。
Hierarchy ID GUID 1-5 寄存器(图 6-7),存放 System GUID 的地方。由于 System GUID 位宽为 144,GUID 1 寄存器只有低 16 位有效。
图 3 Hierarchy ID Extended Capability Header
图 4 Hierarchy ID Status Register
图 5 Hierarchy ID Data Register
图 6 Hierarchy ID GUID 1 Register
图 7 Hierarchy ID GUID 2-5 Register
📚 参考
- PCI Express Base Specification Revision 5.0 Version 1.0 (22 May 2019)