
PCIe 总线事务层序在 PCI Express 系统中数据以 Transaction Layer PacketTLP的形式传输。为了控制单个 TLP 的大小、接收缓冲需求以及链路传输效率PCIe 定义了两个经常同时出现、但作用完全不同的参数Max Payload SizeMPS限制一张带数据 TLP 实际能够携带多少数据。Max Read Request SizeMRRS限制 Requester 的一张 Memory Read Request 最多能够请求多少数据。概括来说MPS 限制的是“包里实际装了多少数据”MRRS 限制的是“一次请求希望读取多少数据”。理解 Memory Write 和 Memory Read 在协议中的不同传输过程是准确区分二者的基础。1. 从 PCIe 读写事务说起1.1 Memory WriteMemory Write Request简称 MWr是一种带数据的 Posted Request。地址、长度和待写入的数据都在同一张 TLP 中发送Requester ---- MWr Header Data Payload ---- 目标设备因此MWr 中 Data Payload 的大小直接受 MPS 限制。1.2 Memory ReadMemory Read 使用请求和完成两个阶段Requester ---- MRd Header不带 Data Payload---- Completer Requester --- CplD Header Data Payload -------- CompleterMemory Read Request简称 MRd本身不携带待读取的数据。它通过 Header 中的 Address、Length、Byte Enable 等字段描述需要读取的范围。真正的数据由 Completer 通过一个或多个 Completion with Data简称 CplD返回。由此可以得到两个基本结论MRRS 限制 MRd 的请求长度。MPS 不限制 MRd 的请求长度但会限制每张 CplD 实际携带的数据量。2. Max Payload Size2.1 定义MPS 是一张带 Data Payload 的 TLP 所允许携带的最大数据量。它只计算 Data Payload不包括以下开销3 DW 或 4 DW TLP HeaderTLP Prefix可选的 ECRCData Link Layer 的 Sequence Number 和 LCRC物理层编码及组帧开销MPS 适用于所有带数据的 TLP例如Memory Write RequestCompletion with DataConfiguration WriteMessage with Data其他带 Data Payload 的事务MPS 表示上限而不是固定包长。MPS 配置为 512 B 时设备仍然可以发送 Payload 为 64 B、128 B 或 256 B 的 TLP。2.2 发送端和接收端规则PCIe Base Specification 对 MPS 同时规定了发送端和接收端行为发送端不得生成 Payload 大于自身当前 MPS 配置的 TLP。接收端必须检查收到的 TLP。若其 Payload 大于接收端当前配置的 MPS该 TLP 应被判定为 Malformed TLP并按错误报告规则处理。因此一张带数据 TLP 不仅要满足发送 Function 的 MPS还必须能够被整个传输路径上的相关接收端口和最终目标接受。2.3 硬件能力与当前配置PCI Express Capability 中存在两个容易混淆的 MPS 字段字段所在寄存器属性含义Max Payload Size SupportedDevice Capabilities只读Function 硬件能够支持的最大 PayloadMax Payload SizeDevice Control可配置当前实际生效的 MPS当前 MPS 不得被配置为超过Max Payload Size Supported。例如某设备可以报告最大支持 512 B但系统软件根据拓扑情况将当前 MPS 配置为 256 B。2.4 MPS 为什么与整条路径有关PCIe Switch 通常不会因为下游端口只支持较小的 MPS就把已经收到的大 TLP 重新拆成多个小 TLP。因此系统软件在枚举和配置 PCIe 拓扑时必须保证相关路径上的 MPS 配置相互兼容。假设一条路径中的能力如下Root Port 最大支持 512 B Switch Port 最大支持 256 B Endpoint 最大支持 512 B这条路径可安全使用的 MPS 不能超过 256 B。对于简单的点到点流量可以将其理解为路径可用 MPS 路径上相关组件所能支持的最小值“系统路径 MPS” 是一种便于讨论的说法。严格来说MPS 是配置在各 Function 或 Port 上的参数并不是链路训练期间由两端自动协商出的单一链路属性。3. Max Read Request Size3.1 定义MRRS 限制一个 Function 作为 Requester 时单张 Memory Read Request 最多能够请求的数据量。例如MRRS 512 B表示该 Requester 可以生成 Length 为 128 B、256 B 或 512 B 的 MRd但不能生成 Length 为 1024 B 的 MRd。MRRS 同样只是上限。即使 MRRS 配置为 512 BRequester 也可以根据地址边界、内部实现或资源情况生成更小的请求。3.2 谁负责拆分读请求当上层 DMA 操作的长度大于 MRRS 时由 Requester 内部的 DMA Read Engine、Transaction Layer 或请求生成逻辑负责拆分。PCIe Switch 不会依据 Requester 的 MRRS 代替它拆分请求。例如一个 Endpoint 需要通过 DMA 读取 1024 B且其 MRRS 为 512 B。在地址满足边界要求的情况下Requester 可以生成MRd #1Address 0x1000Length 512 BTag 0x10 MRd #2Address 0x1200Length 512 BTag 0x11如果两张请求同时处于 Outstanding 状态它们通常使用不同的 Tag。Completer 将每张 CplD 中的 Requester ID 和 Tag 与原始请求对应。对 Completer 来说这是两笔独立的读事务它通常不知道两张 MRd 源于 Requester 内部同一个 1024 B DMA 操作。3.3 MRRS 是 Requester 的本地约束MRRS 不需要像 MPS 一样在整条路径上配置成相同或兼容的值。原因是 MRd TLP 本身不携带所请求的数据沿途设备不需要为一个等同于 MRRS 的 Data Payload 提供接收空间。Completer 收到较大的 MRd 后可以将结果拆成多个满足 MPS 等规则的 CplD。路径中其他设备的 MRRS 只约束它们自己作为 Requester 时生成的读请求不用于限制经过它们转发的 MRd。4. MPS 与 MRRS 如何共同作用两者最清晰的关系可以表示为单张 MRd 的请求长度 Requester 的 MRRS 单张 CplD 的 Data Payload 当前读请求尚未返回的数据量 该传输路径允许的 MPSMRRS 决定一次可以“请求多少”MPS 决定每张数据包可以“返回多少”。4.1 示例一MRRS 大于 MPS假设读取总长度 1024 B MRRS 512 B 路径 MPS 128 B 地址和边界均满足要求Requester 通常生成两张 MRdMRd #1请求 512 B MRd #2请求 512 B每张 CplD 最多携带 128 B因此一种典型返回形式是MRd #1 - 128 B 128 B 128 B 128 B MRd #2 - 128 B 128 B 128 B 128 B整个读操作使用两张 MRd并返回至少八张 CplD。在符合 RCB 等 Completion 规则的前提下Completer 可以选择更小的 Completion因此实际 CplD 数量也可能更多。4.2 示例二MPS 大于 MRRS假设读取总长度 1024 B MRRS 512 B 路径 MPS 1024 B 地址和边界均满足要求Requester 仍然至少需要两张 MRd因为每张 MRd 不能超过 512 B。典型形式为MRd #1请求 512 B - CplD #1返回 512 B MRd #2请求 512 B - CplD #2返回 512 BCompleter 不能把这两张 MRd 合并成一张 1024 B 的 CplD。每张 Completion 必须对应某一张具体的请求不能返回超出该请求范围的数据。因此当一张读请求的长度不超过 MPS 时理想情况下单张 CplD 的最大有效长度为min(本次 MRd Length, 路径 MPS)这仍然只是上限。Completer 可以根据自身实现和其他协议约束将其拆得更小。4.3 示例三Memory Write假设写入总长度 1024 B MPS 256 B 地址和边界均满足要求由于每张 MWr 的 Payload 不得超过 256 BRequester 至少需要生成MWr #1256 B MWr #2256 B MWr #3256 B MWr #4256 BMRRS 对 Memory Write 不起作用。5. Length 字段为什么容易引起混淆Memory Write 和 Memory Read Request 都有 Length 字段但其语义不同TLP 类型是否携带数据Length 表示什么主要受哪个参数限制Memory Write Request是当前 TLP 携带的数据长度MPSMemory Read Request否希望 Completer 返回的数据长度MRRSCompletion with Data是当前 Completion 携带的数据长度MPSPCIe 的 Length 以 DWDouble Word4 Byte为单位编码。对于首尾不是完整 DW 的访问还需要结合 First DW Byte Enable 和 Last DW Byte Enable 理解实际有效字节数。协议对 MPS 和 MRRS 的检查以 TLP 所编码的长度规则为基础不能简单地只统计应用层认为有效的字节数。6. 除 MPS 和 MRRS 外的分包约束不能仅根据 MPS 和 MRRS 推断所有 TLP 的最终大小。实际分包还可能受到以下规则影响。6.1 4 KB 边界Memory Request 不得跨越自然对齐的 4 KB 地址边界。例如从地址0x1F00开始读取 1024 B即使 MRRS 为 512 B也不能直接生成两张连续的 512 B MRd因为第一张会跨越0x2000边界。一种合法拆分是0x1F00 - 0x1FFF256 B 0x2000 - 0x21FF512 B 0x2200 - 0x22FF256 B因此“总长度除以 MRRS”只能给出理想对齐情况下的最少请求数量。6.2 Read Completion Boundary当一张读请求通过多个 Completion 返回时Completion 的分割还需要遵守 Read Completion BoundaryRCB相关规则。RCB 不替代 MPS也不表示每张 CplD 必须等于 64 B 或 128 B它约束的是多个 Completion 之间允许采用的完成边界。6.3 流控 Credit 和内部资源PCIe Flow Control Credit 决定一个 TLP 何时能够发送但不会允许设备突破 MPS 或 MRRS。设备也可能因为 Completion Buffer、Tag、内部总线宽度或 DMA 描述符边界而选择更小的 TLP。7. 对性能的影响7.1 增大 MPS较大的 MPS 可以让一张 TLP 携带更多数据通常具有以下效果减少 TLP Header、LCRC 等固定开销所占的比例。减少完成同等数据量所需的 MWr 或 CplD 数量。提高连续大块传输时的有效带宽。但较大的 TLP 也会带来更长的单包链路占用时间、更高的缓冲要求以及更大的错误重放开销并可能影响不同流量之间的延迟公平性。7.2 增大 MRRS较大的 MRRS 允许 Requester 用更少的 MRd 覆盖同等数据量通常可以减少读请求 Header 开销。减少传输相同数据量所占用的 Tag 数量。增加有限 Outstanding Request 数量下的在途读取数据量。改善高带宽、高往返延迟链路上的读吞吐率。不过较大的 MRRS 可能造成更集中的 Completion 返回流量并增加 Requester Completion Buffer 和系统流控资源的压力。最佳值取决于 Root Complex、Switch、Endpoint 及其驱动和工作负载不能简单理解为越大越好。8. 常见误区误区一交换机会自动拆分超过下游 MPS 的 TLP通常不会。系统软件必须正确配置拓扑中的 MPS避免发送路径上的接收端遇到无法接受的 Payload。误区二MPS 和 MRRS 是链路训练时自动协商出来的不是。它们位于 PCIe 配置空间通常由固件或操作系统在枚举设备后配置与链路速率和 Lane 数量不是同一个概念。9. 多 Function 设备的补充说明对于 ARI Device规范规定其 MPS 由 Function 0 的配置决定其他 Function 中的 MPS 设置被忽略。对于非 ARI Multi-Function Device如果各 Function 的 MPS 设置不同实际采用哪个值可能与实现有关。因此除非软件明确了解设备实现通常不应将共享同一 Upstream Port 的不同 Function 配置为不同的 MPS。10. 总结MPS 和 MRRS 分别作用于 PCIe 数据传输的不同位置MPS限制带数据 TLP 的实际 Data Payload 主要影响 MWr 和 CplD 的分包 MRRS限制单张 Memory Read Request 的请求长度 只约束 Requester 生成 MRd 的行为对一个完整的 Memory Read 来说Requester 先按照 MRRS、4 KB 边界等要求生成一个或多个 MRdCompleter 再按照 MPS、RCB 和自身实现将每个请求对应的数据放入一个或多个 CplD 中返回。不同请求之间不能合并为同一个 Completion。对一个完整的 Memory Write 来说待写数据直接包含在 MWr 中因此 Requester 主要按照 MPS、4 KB 边界和地址对齐等要求生成一个或多个写请求MRRS 不参与这一过程。掌握这条读写路径就能在阅读配置空间、分析协议波形、设计 DMA 引擎或进行 PCIe 性能调优时准确判断 MPS 与 MRRS 各自影响的是哪个环节。参考资料PCI-SIG,PCI Express Base Specification, “TLPs with Data Payloads - Rules”.PCI-SIG,PCI Express Base Specification, “Device Capabilities Register” and “Device Control Register”.PCI-SIG,PCI Express Base Specification, Memory Request and Completion rules.