这周研究了一下spec中关于prefix的部分,在此做一个总结,欢迎大家指正补充。
TLP Prefix基本介绍
• TLP 第 0 字节的 Fmt [2:0] 字段值为 100b 表示当前 DW 为 TLP Prefix 。
• TLP Prefix 分为两大类: Local 和 End-End ,其中 Local TLP Prefix 用以在 PCIe 链路两侧传递信息, End-End 用以在 Requester 和 Completer 之间传递信息。
• 通过 Type 字段 第 [4]bit 来加以区分, 0 为 Local TLP Prefix , 1 为 End-End TLP Prefix 。
• 允许一个 TLP 包含 多个 任何类型的 TLP 前缀
• 当 TLP 中存在 Local 和 End-End TLP 前缀的组合时,需要所有 Local TLP 前缀位于任何 End-End TLP 前缀 之前 。
• 每个 TLP 前缀的大小为 1DW 。
下图为prefix基本组成。
下图为Type编码及对应的prefix类型
Local TLP Prefix处理
• Local TLP Prefix 中 Type 字段 Type[4] 位为 0b ,用 L[3:0] 作更细的 Local TLP Prefix 分类。
• 各类型的 Local TLP Prefix 的大小、路由、流控不一而论。
• 若接收者收到了不支持类型的 Local TLP Prefix 则为出现错误。若设备能力 2 寄存器中开启了 Extended Fmt Field Supported 则按照畸形包处理,并在接收端口处上报错误。若未开启 Extended Fmt Field Supported ,错误处理方式由设备自行决定。
Local TLP Prefix不受ECRC的保护,此时其后续TLP仍然可以受ECRC保护
下图为Local TLP prefix类型
“VendPrefixL0”和“VendPrefixL1”类型保留作为厂商自定义的本地TLP前缀。为了最大限度地提高互操作性和灵活性,以下规则应用于这些前缀:
•组件不得发送包含供应商定义的本地TLP前缀的TLP,除非已明确启用(使用供应商特定的机制)。
•支持任何供应商定义的本地TLP前缀的组件必须支持Fmt字段的3位定义,并具有扩展Fmt字段支持位集。
•建议组件是可配置的(使用供应商特定的机制),以便所有供应商定义的前缀都可以使用两种供应商定义的本地TLP前缀编码中的任何一种发送。这样的配置不必是对称的(例如,链路的每一端可以使用不同的编码传输相同的前缀)
下图为Extended Fmt Field Supported 字段所在寄存器位置。
Extended Fmt Field Supported : If Set, the Function supports the 3-bit definition of the Fmt field. If Clear, the Function supports a 2-bit definition of the Fmt field. Must be Set for Functions that support End-End TLP Prefixes. All Functions in an Upstream Port must have the same value for this bit. Each Downstream Port of a component may have a different value for this bit.It is strongly recommended that Functions support the 3-bit definition of the Fmt field.
End-End TLP Prefix处理
• End-End TLP Prefix 中 Type 字段 Type[4] 位为 1b ,用 E[3:0] 作更细的 End-End TLP Prefix 分类。
• End-End TLP Prefix 的 最大数目为 4 ,若接收者接收到的 End-End TLP Prefix 数目大于 4 ,应按照畸形包处理。
• End-End TLP Prefixd 的出现不会改变该 TLP 原本的路由规则。
• Function 支持的最大 End-End TLP Prefix 数目通过 Device Capabilities 2 register 的 Max End-End TLP Prefixes field 进行配置;
• 支持 End-End TLP Prefix 的 switch 应支持转发最高携带 4 个 End-End TLP Prefix 的 TLP ;
• 多个支持 End-End TLP Prefix 的 RP 间,支持的最大 End-End TLP Prefix 数目可以不同;
• 若后续 TLP 受 ECRC 保护,则 End-End TLP Prefix 同样 受 ECRC 保护 ;
• 若接收者不支持 End-End TLP Prefix 但收到了带有 End-End TLP Prefix 的 TLP ,则为出现错误,按照畸形包处理,接收端口上报错误;
• 软件应确保携带 End-End TLP Prefix 的 TLP 不会发给不支持 End-End TLP Prefix 的组件,因为该组件会曲解 End-End TLP Prefix 。
• 若上游端口某 Function 支持 End-End TLP Prefix 但收到了不支持类型的 End-End TLP Prefix ,该上游端口所有 Function 都应把其收到的地址请求按照 UR 处理,地址 Complition 按照 CA 处理,接收端口上报错误;
• 对于一些其路由作用的元素,若某出端口开启了 End-End Prefix Blocking 功能,则携带 End-End TLP Prefix 的 TLP 会被阻塞在该出端口;一旦被阻塞,不仅是 TLP Prefix ,整个 TLP 都会被丢掉,并上报 TLP Prefix 阻塞错误;若被阻塞的是非转发请求 TLP ,该出端口会返回一笔完成状态为不支持请求的完成的消息;
若某元素开启了组播功能,复制到每一个组播组的TLP都会携带原TLP的End-End TLP Prefix
下图为End-End TLP prefix类型
还没写完,发现总结的文档没带回来,后面补上。