PCIE6.3 协议解析-Transaction Layer_2

第二章 事务层

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 返回时会路由歧义。协议给出两套方案:

  1. RC 执行taking ownership 接管请求(存在 NFM 子树时必须走接管);
  2. 全链路全部 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。规则:

  1. 如果 Ingress RP 收到请求报文不带 Requester_Segment(OHC‑C 缺失),Egress RP 出端口必须追加 OHC‑C,填入 Ingress RP 对应的分层域 Segment 编号。
  2. 收到 Completion,如果 DSV=1,且 Destination_Segment 和接收 RP 分层域不匹配,RC 必须把 Completion 转发到报文指定的目标 Hierarchy 分层域。
  3. 返回给最终 EP 的 Completion 报文,Requester‑ID、Tag、OHC‑A5 内部字段必须原样保留,不许修改
模式 B:RC taking ownership(接管请求,下游存在 NFM 子树时强制)
  1. 请求包 Requester‑ID替换成 RC 自身的 ID。RC 内部维护一张 outstanding 追踪表,记录:RC 生成的事务 ID ↔ 原始 EP 的 Requester ID、Tag、原始 Segment。
  2. Tag 允许替换,非 UIO 请求甚至允许改变 Tag 位宽;但 RC 必须保证:RC 侧用的新事务 ID 全局唯一。
  3. Completion 回来之后,RC 查表,把 Completion 里面 Tag、Requester‑ID 恢复成原始请求的值,再送回发起 EP
  4. 出向 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 和 TagRequester 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 的场景)

  1. RC 内部发起的 non‑IDE 存储器请求,RP 不需要插入 Requester_Segment。
  2. P2P 透传的存储器写 MWr(Posted 事务),RP 不需要携带 Requester_Segment。(写事务不需要 Completion,不需要分段路由回包)
  3. 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寄存器:

  1. Segment Captured = Clear(交换机没有绑定任何 Segment):严禁给请求报文添加 OHC‑C
  2. Segment Captured = Set(交换机绑定固定分段):可以给存储器请求、消息请求添加 OHC‑C;配置请求报文绝对不能添加 OHC‑C
  3. 如果新增 OHC‑A 头,DSV 必须清 0,Destination_Segment 写 00h。
  4. Completion 需要 OHC‑A5 时:
    • Segment Captured=Set:Completer_Segment 填入交换机捕获的 Segment;
    • Segment Captured=Clear:Completer_Segment 填 00h。

3.2 Segment Captured=Set(交换机绑定某个 Segment)行为

  1. 上行端口收到NFM 模式 NP 存储器请求,报文携带 Requester_Segment,该值不等于交换机捕获的 Segment → 报TLP Translation Egress Blocked错误,报文禁止向下游转发。
  2. 配置请求路由:只看 BDF,完全忽略 Destination Segment 字段
  3. 如果收到 Completion / Route‑by‑ID 消息报文,DSV=1,Destination_Segment 和本机捕获 Segment 不匹配,报文向上游转发。
  4. 下游端口收到消息 / 存储器请求,报文 Requester_Segment 与本机捕获值不一致,报错,禁止转发。

3.3 Segment Captured=Clear(交换机不绑定任何 Segment,不识别分段)行为

⚠️高频出错点:该交换机不能接收任何携带分段的报文

  1. 如果收到 DSV=1 的 Completion / Route‑by‑ID 消息报文:报错 TLP Translation Egress Blocked,报文不转发。
  2. 如果收到消息 / 存储器请求携带 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)规则

  1. 请求报文如果带上 OHC‑C(Requester_Segment),该 Segment 值必须来自 Type0 配置写捕获的值。
  2. Segment Captured=Clear:所有 non‑IDE 消息、存储器请求禁止携带 OHC‑C
  3. Segment Captured=Set:
    • 所有消息请求必须带上 OHC‑C;
    • 存储器请求可以选择带 OHC‑C(不是强制)。
  4. Route‑by‑ID 消息报文:
    • Captured=Clear:不能带 Destination_Segment(DSV 必须为 0);
    • Captured=Set:访问其他分层域,必须携带 Destination_Segment,DSV=1;访问同分层域,Destination_Segment 可选。
  5. Requester 收到 Completion 报文,必须无条件接受任意合法的 Destination_Segment 值,不能做过滤拒绝
  6. 非 IDE 存储器请求,Requester不是必须带上 Requester_Segment

五、Completer(响应端 EP,生成 Completion 报文)全套规则(最容易混淆)

Completer 通过 Type0 配置写捕获自己 Segment 值,存入 Segment Captured 寄存器。

  1. Segment Captured=Clear:生成 OHC‑A5 时,Completer_Segment 强制写 00h。
  2. Segment Captured=Set:OHC‑A5 中的 Completer_Segment 填写捕获到本机 Segment 值。
  3. 如果是针对配置请求的 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(协议允许不带)

全部条件同时满足:

  1. Completion 状态 = 成功;
  2. LowerAddress[1:0] = 00b;
  3. Completer 的 Segment Captured=Set;
  4. 原始请求不带 Requester_Segment,或者携带的 Requester_Segment 与 Completer 本机 Segment 相等;
  5. 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。

六、高频理解误区、易错点整理

  1. ❌误区:Hierarchy‑Segment 就是老 PCI 的 PCI‑Segment(Domain) ✅正确:老 PCI Segment (Domain) 是软件 ACPI MCFG 概念,不出现在 TLP 报文中;Hierarchy‑Segment 是 PCIe6 FM 新增硬件路由字段,放在 OHC 扩展头,报文链路传输;二者编号空间互相独立。
  2. ❌误区:BDF 全局唯一,为什么还需要 Segment? ✅正确:只有全部是 FM 模式拓扑,BDF 才全局唯一;一旦存在 NFM 子树,FM 转 NFM 的时候 OHC‑C 被剥离,NFM 子树内部枚举 Bus 号可以和外部分层域重复;此时只靠 BDF 不足以定位,需要 Seg+BDF。
  3. ❌误区:交换机可以随意增加 / 修改 Segment 字段 ✅正确:只有 FM↔NFM 模式转换边界才允许增删 OHC‑C;两端都是 FM,交换机绝对不能改动任何 Segment/DSV 字段
  4. ❌误区:只要跨 RP 的 P2P 就一定要 taking ownership 接管 ✅正确:只有下游存在 NFM 子树(No NFM Subtree Below This Root Port位为 0)才强制接管;全部链路 FM,可以直接透传,不接管
  5. ❌误区:Completer 把自己 Segment 填到 Destination_Segment ✅正确:Destination_Segment 存的是请求发起方 Requester 的 Segment(复制 OHC‑C 的值),不是 Completer 自己的 Segment;Completer 自己编号放在Completer_Segment字段。
  6. ❌误区:所有 Completion 报文都要带 OHC‑A5 ✅正确:满足全部条件可以省略 OHC‑A5;但是跨 Segment 的 NP 请求的 Completion强制必须携带 OHC‑A5
  7. ❌误区:Posted 写事务 MWr 也需要携带 Requester_Segment ✅正确:Posted 写没有 Completion 回包,不需要路由回传,协议有例外规则,MWr P2P 不需要 OHC‑C
  8. ❌误区:Segment Captured=Clear 的交换机收到带 Segment 报文可以直接丢弃 TLP,不报错 ✅正确:必须上报TLP Translation Egress Blocked错误,这是协议强制硬件行为。
  9. ❌误区:RC taking ownership 接管时,可以不保存原始 Tag 和 Requester ID ✅正确:RC 必须维护 outstanding 表,Completion 回来必须还原原始 Tag、原始 Requester ID,EP 收到 Completion 看到的必须是自己当初发出去的 Tag。
  10. ❌误区:热插拔 NFM 设备,硬件自动更新No NFM Subtree Below This Root Port位 ✅正确:该位完全由系统软件维护;硬件不会自动更新;热插入 NFM 设备后软件必须清该位,否则会发生 Completion 路由错误。

七、完整数据流示例(跨分层域,下游 RP 存在 NFM 子树,RC 执行 taking ownership)

  1. EP_A(Seg=1,BDF=01:00.0,Hier‑1)发起存储器读 MRd NP 请求;报文携带 OHC‑C,Requester_Segment=1。
  2. 请求进入 Ingress RP‑1,上报 RC;因为 RP‑1 下游有 NFM 子树,RC 执行 taking ownership 接管。
  3. RC 内部保存映射:RC_New_Tag ↔ {原始 Tag, RequesterID=01:00.0, Requester_Segment=1}。
  4. 修改请求报文 Requester‑ID 为 RC 内部 ID,从 Egress RP‑2 发出,访问 Hier‑2 的 EP_B。
  5. EP_B 收到 MRd,生成 Completion,把原始请求的 Requester_Segment=1 复制进 OHC‑A5 的 Destination_Segment,DSV=1;Completer_Segment 填入 EP_B 本机 Segment。
  6. Completion 回到 RC;RC 查表,把 Completion 里面 Requester ID、Tag 恢复为 EP_A 原始值;剥离 / 修改 OHC‑A5 字段;把 Completion 发送回 Hier‑1 的 EP_A。

参考资料:PCI Express® Base Specification Revision 6.3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值