第二章 事务层
2.2 Transaction Layer Protocol - Packet Definition

2.2.2 PCIe6.0 Hierarchy-Segment(分层分段)
本章节解决:跨 Hierarchy 分层域的 P2P NP 存储器事务(存储器读等),在同时存在 FM 和 NFM 混合子树的拓扑下如何正确路由 Completion 完成包。

核心痛点:Segment 分段信息只在 FM 链路 TLP 的 OHC 头里面传输;NFM 链路上没有任何 Segment 字段。当请求报文从 FM 进入 NFM 子树,OHC-C(请求者分段)会被剥离丢掉。此时子树内部只看 BDF,不同分层域可能出现 Bus 号重复,Completion 返回时会路由歧义。协议给出两套方案:
- RC 执行taking ownership 接管请求(存在 NFM 子树时必须走接管);
- 全链路全部 FM 模式,无 NFM 子树:RC 可以直接 pass-through 透传 P2P,不需要接管。
参考拓扑图 Figure 2‑14:同一个 RC 下面多个 RP,有的 RP 下面子树全 FM;有的 RP 下面包含 NFM 子树(EP 运行传统 Non‑Flit 模式)。
二、RC / Root Port(RP)侧全部规则
2.1 关键软件配置位:No NFM Subtree Below This Root Port
- 默认值 = 0 (Clear):代表该 RP 下游可能存在 NFM 子树。
- 硬件含义:RC必须对从这个 RP 出去的跨分层 NP 请求执行 taking ownership 接管。
- 软件置 1 (Set):代表确认该 RP 下游全部链路都是 FM,没有任何 NFM 设备。
- RC 可以不做接管,直接透传 P2P 报文。
⚠️极易踩坑:
- 系统软件必须维护该位;热插入 NFM 设备后,软件必须把该位清 0,否则硬件会错误跳过 taking ownership,Completion 报文路由错乱丢包。
- RP4 下游全部 FM,软件强烈建议把该位置 1,避免不必要的接管带来性能损耗。
2.2 两种 P2P 转发模式对比
模式 A:RC pass‑through 透传(不 taking ownership)
适用条件:跨分层 P2P NP/UIO 存储器请求,RC 原样转发报文,不修改原始请求的 Requester ID、Tag。规则:
- 如果 Ingress RP 收到请求报文不带 Requester_Segment(OHC‑C 缺失),Egress RP 出端口必须追加 OHC‑C,填入 Ingress RP 对应的分层域 Segment 编号。
- 收到 Completion,如果 DSV=1,且 Destination_Segment 和接收 RP 分层域不匹配,RC 必须把 Completion 转发到报文指定的目标 Hierarchy 分层域。
- 返回给最终 EP 的 Completion 报文,Requester‑ID、Tag、OHC‑A5 内部字段必须原样保留,不许修改。
模式 B:RC taking ownership(接管请求,下游存在 NFM 子树时强制)
- 请求包 Requester‑ID替换成 RC 自身的 ID。RC 内部维护一张 outstanding 追踪表,记录:RC 生成的事务 ID ↔ 原始 EP 的 Requester ID、Tag、原始 Segment。
- Tag 允许替换,非 UIO 请求甚至允许改变 Tag 位宽;但 RC 必须保证:RC 侧用的新事务 ID 全局唯一。
- Completion 回来之后,RC 查表,把 Completion 里面 Tag、Requester‑ID 恢复成原始请求的值,再送回发起 EP。
- 出向 Egress RP 发出请求时:请求报文要么携带 Egress RP 分层域对应的 Requester_Segment;要么报文不携带 OHC‑C。
下表从多个维度对比模式 A 与模式 B 的差异:
| 对比维度 | 模式 A:RC pass-through 透传 | 模式 B:RC taking ownership 接管 |
|---|---|---|
| 适用条件 | 跨分层 P2P NP/UIO 存储器请求,下游全部链路为 FM,无 NFM 子树 | 下游存在 NFM 子树(No NFM Subtree Below This Root Port 位为 0)时强制使用 |
| 是否修改 Requester ID / Tag | 不修改,原样保留原始请求的 Requester ID 和 Tag | Requester ID 替换为 RC 自身 ID;Tag 允许替换,非 UIO 请求甚至可改变 Tag 位宽 |
| 是否维护 outstanding 表 | 不需要,RC 不追踪事务映射关系 | 必须维护,记录 RC 生成的事务 ID 与原始 EP 的 Requester ID、Tag、原始 Segment 的映射 |
| Completion 处理方式 | 原样转发,Requester ID、Tag、OHC-A5 内部字段必须原样保留,不许修改 | Completion 回来后查表,把 Tag、Requester ID 恢复成原始请求的值,再送回发起 EP |
| 性能影响 | 开销低,RC 只做透传,无额外查表与字段改写 | 开销较高,RC 需维护追踪表并执行 ID/Tag 替换与还原,增加处理延迟 |
简要说明:模式 A 适用于全 FM 拓扑,RC 仅做透传,不修改任何事务标识,性能开销最低;模式 B 用于下游存在 NFM 子树的场景,RC 必须接管请求、替换 Requester ID 并维护 outstanding 表,以便 Completion 返回时还原原始事务信息,代价是额外的查表与字段改写开销。
2.3 RP 分段例外(RP Segment Exceptions,不需要带 Segment/OHC‑C 的场景)
- RC 内部发起的 non‑IDE 存储器请求,RP 不需要插入 Requester_Segment。
- P2P 透传的存储器写 MWr(Posted 事务),RP 不需要携带 Requester_Segment。(写事务不需要 Completion,不需要分段路由回包)
- NP 存储器请求跨 RC P2P,Egress RP 要执行 taking ownership 接管,则不需要携带 Requester_Segment。
2.4 RP 收到非法 Segment 报文处理
RP 收到报文,报文中 Requester_Segment 和接收 RP 所属分层域不匹配:把该 TLP 当作 Unsupported Request(不支持请求)处理。
2.5 Selective IDE Stream 跨分层域 P2P 的约束
- 不允许随便配置跨分层域的 Selective IDE 流;必须确认两端 RP 之间全部链路是 FM,并且 RC 支持 IDE 流透传。
- RC 没有义务必须支持跨分层 IDE 流;硬件不支持透传 IDE‑TLP 时,必须报Misrouted IDE TLP error(入端口或者出端口报错)。
三、Switch 交换机规则(非常多易错点)
重要前提:协议定义:单个 Switch 整机完全属于同一个 Hierarchy 分层域。交换机必须理解 Segment 字段用于路由,但:✅ 如果入端口、出端口都工作于 FM 模式:交换机严禁修改、新增、删除任何 Segment 字段、DSV/RSV 比特,报文原样透传。
3.1 NFM ↔ FM 模式转换边界(只有这里才允许增删 OHC‑C / 分段)
由 NFM 进入 FM 时,交换机根据Segment Captured寄存器:
- Segment Captured = Clear(交换机没有绑定任何 Segment):严禁给请求报文添加 OHC‑C。
- Segment Captured = Set(交换机绑定固定分段):可以给存储器请求、消息请求添加 OHC‑C;配置请求报文绝对不能添加 OHC‑C。
- 如果新增 OHC‑A 头,DSV 必须清 0,Destination_Segment 写 00h。
- Completion 需要 OHC‑A5 时:
- Segment Captured=Set:Completer_Segment 填入交换机捕获的 Segment;
- Segment Captured=Clear:Completer_Segment 填 00h。
3.2 Segment Captured=Set(交换机绑定某个 Segment)行为
- 上行端口收到NFM 模式 NP 存储器请求,报文携带 Requester_Segment,该值不等于交换机捕获的 Segment → 报
TLP Translation Egress Blocked错误,报文禁止向下游转发。 - 配置请求路由:只看 BDF,完全忽略 Destination Segment 字段。
- 如果收到 Completion / Route‑by‑ID 消息报文,DSV=1,Destination_Segment 和本机捕获 Segment 不匹配,报文向上游转发。
- 下游端口收到消息 / 存储器请求,报文 Requester_Segment 与本机捕获值不一致,报错,禁止转发。
3.3 Segment Captured=Clear(交换机不绑定任何 Segment,不识别分段)行为
⚠️高频出错点:该交换机不能接收任何携带分段的报文
- 如果收到 DSV=1 的 Completion / Route‑by‑ID 消息报文:报错 TLP Translation Egress Blocked,报文不转发。
- 如果收到消息 / 存储器请求携带 Requester_Segment(OHC‑C):直接报错,禁止转发。
3.4 交换机重排 Completion 时对 Segment 的处理
- Completion 重排顺序时,Destination_Segment 视作事务 ID 的一部分参与排序。
- 如果报文没有携带 Destination_Segment,默认认为目标分段和 Completion 本身所在分层域相同。
- IDO(ID Based Ordering)排序时,Requester_Segment、Completion 中的 Destination_Segment 都纳入排序判断;请求不带 Requester_Segment,IDO 逻辑默认分段值匹配本机分层域。
四、Requester(请求发起端 EP)规则
- 请求报文如果带上 OHC‑C(Requester_Segment),该 Segment 值必须来自 Type0 配置写捕获的值。
- Segment Captured=Clear:所有 non‑IDE 消息、存储器请求禁止携带 OHC‑C。
- Segment Captured=Set:
- 所有消息请求必须带上 OHC‑C;
- 存储器请求可以选择带 OHC‑C(不是强制)。
- Route‑by‑ID 消息报文:
- Captured=Clear:不能带 Destination_Segment(DSV 必须为 0);
- Captured=Set:访问其他分层域,必须携带 Destination_Segment,DSV=1;访问同分层域,Destination_Segment 可选。
- Requester 收到 Completion 报文,必须无条件接受任意合法的 Destination_Segment 值,不能做过滤拒绝。
- 非 IDE 存储器请求,Requester不是必须带上 Requester_Segment。
五、Completer(响应端 EP,生成 Completion 报文)全套规则(最容易混淆)
Completer 通过 Type0 配置写捕获自己 Segment 值,存入 Segment Captured 寄存器。
- Segment Captured=Clear:生成 OHC‑A5 时,Completer_Segment 强制写 00h。
- Segment Captured=Set:OHC‑A5 中的 Completer_Segment 填写捕获到本机 Segment 值。
- 如果是针对配置请求的 Completion:OHC‑A5 中 DSV 清 0,Destination_Segment 写 00h。
5.1 Completion 报文中 DSV 和 Destination_Segment 如何赋值?
- 收到原始请求没有携带 Requester_Segment:生成 Completion 时,OHC‑A5 中 DSV=0,Destination_Segment=00h。
- 收到原始请求携带 Requester_Segment(OHC‑C 存在):Completion 的 OHC‑A5 中DSV=1,Destination_Segment 复制原始请求的 Requester_Segment 的值。
原理:Completion 需要知道 “要回到哪一个 Requester 的 Segment”,把请求方的 Requester_Segment 复制到 Completion 的 Destination_Segment 字段。
5.2 什么时候 Completion强制必须携带 OHC‑A5?
当:Segment Captured=Set,收到 NP 存储器请求,报文中 Requester_Segment 不等于 Completer 本机捕获 Segment → 该请求对应的所有 Completion 必须带上 OHC‑A5。
5.3 什么时候可以省略 OHC‑A5(协议允许不带)
全部条件同时满足:
- Completion 状态 = 成功;
- LowerAddress[1:0] = 00b;
- Completer 的 Segment Captured=Set;
- 原始请求不带 Requester_Segment,或者携带的 Requester_Segment 与 Completer 本机 Segment 相等;
- TEE‑IO Supported 为 0,或者该 Completion 不属于 Selective IDE Stream。
5.4 什么时候绝对不能省略 OHC‑A5(必须带上)
- Completion 报错状态非成功;
- LowerAddress[1:0]≠00;
- 跨 Segment 请求(请求方 Segment≠Completer 本机 Segment);
- Selective IDE Stream 相关 Completion。
没有 OHC‑A5 时协议隐式约定:DSV=0、Completer_Segment=00h、Destination_Segment=00h。
六、高频理解误区、易错点整理
- ❌误区:Hierarchy‑Segment 就是老 PCI 的 PCI‑Segment(Domain) ✅正确:老 PCI Segment (Domain) 是软件 ACPI MCFG 概念,不出现在 TLP 报文中;Hierarchy‑Segment 是 PCIe6 FM 新增硬件路由字段,放在 OHC 扩展头,报文链路传输;二者编号空间互相独立。
- ❌误区:BDF 全局唯一,为什么还需要 Segment? ✅正确:只有全部是 FM 模式拓扑,BDF 才全局唯一;一旦存在 NFM 子树,FM 转 NFM 的时候 OHC‑C 被剥离,NFM 子树内部枚举 Bus 号可以和外部分层域重复;此时只靠 BDF 不足以定位,需要 Seg+BDF。
- ❌误区:交换机可以随意增加 / 修改 Segment 字段 ✅正确:只有 FM↔NFM 模式转换边界才允许增删 OHC‑C;两端都是 FM,交换机绝对不能改动任何 Segment/DSV 字段。
- ❌误区:只要跨 RP 的 P2P 就一定要 taking ownership 接管 ✅正确:只有下游存在 NFM 子树(
No NFM Subtree Below This Root Port位为 0)才强制接管;全部链路 FM,可以直接透传,不接管。 - ❌误区:Completer 把自己 Segment 填到 Destination_Segment ✅正确:Destination_Segment 存的是请求发起方 Requester 的 Segment(复制 OHC‑C 的值),不是 Completer 自己的 Segment;Completer 自己编号放在
Completer_Segment字段。 - ❌误区:所有 Completion 报文都要带 OHC‑A5 ✅正确:满足全部条件可以省略 OHC‑A5;但是跨 Segment 的 NP 请求的 Completion强制必须携带 OHC‑A5。
- ❌误区:Posted 写事务 MWr 也需要携带 Requester_Segment ✅正确:Posted 写没有 Completion 回包,不需要路由回传,协议有例外规则,MWr P2P 不需要 OHC‑C。
- ❌误区:Segment Captured=Clear 的交换机收到带 Segment 报文可以直接丢弃 TLP,不报错 ✅正确:必须上报
TLP Translation Egress Blocked错误,这是协议强制硬件行为。 - ❌误区:RC taking ownership 接管时,可以不保存原始 Tag 和 Requester ID ✅正确:RC 必须维护 outstanding 表,Completion 回来必须还原原始 Tag、原始 Requester ID,EP 收到 Completion 看到的必须是自己当初发出去的 Tag。
- ❌误区:热插拔 NFM 设备,硬件自动更新
No NFM Subtree Below This Root Port位 ✅正确:该位完全由系统软件维护;硬件不会自动更新;热插入 NFM 设备后软件必须清该位,否则会发生 Completion 路由错误。
七、完整数据流示例(跨分层域,下游 RP 存在 NFM 子树,RC 执行 taking ownership)
- EP_A(Seg=1,BDF=01:00.0,Hier‑1)发起存储器读 MRd NP 请求;报文携带 OHC‑C,Requester_Segment=1。
- 请求进入 Ingress RP‑1,上报 RC;因为 RP‑1 下游有 NFM 子树,RC 执行 taking ownership 接管。
- RC 内部保存映射:RC_New_Tag ↔ {原始 Tag, RequesterID=01:00.0, Requester_Segment=1}。
- 修改请求报文 Requester‑ID 为 RC 内部 ID,从 Egress RP‑2 发出,访问 Hier‑2 的 EP_B。
- EP_B 收到 MRd,生成 Completion,把原始请求的 Requester_Segment=1 复制进 OHC‑A5 的 Destination_Segment,DSV=1;Completer_Segment 填入 EP_B 本机 Segment。
- Completion 回到 RC;RC 查表,把 Completion 里面 Requester ID、Tag 恢复为 EP_A 原始值;剥离 / 修改 OHC‑A5 字段;把 Completion 发送回 Hier‑1 的 EP_A。
参考资料:PCI Express® Base Specification Revision 6.3

312

被折叠的 条评论
为什么被折叠?



