2.2.10 TLP前缀规则
以下规则适用于任何包含TLP前缀的TLP:
- 对于任何TLP,TLP中byte0的Fmt[2:0]字段中的值100b表示存在TLP前缀,并且Type[4]位指示TLP前缀的类型。
- Type[4]位中的值0b表示存在本地TLP前缀。
- Type[4]位中的值1b表示存在端到端TLP前缀。
- TLP前缀的byte1到3的格式由其TLP前缀类型定义。
- 包含TLP前缀的TLP必须有一个底层的TLP头标。违反此规则的接收到的TLP将被视为畸形TLP。这是一个与接收端口相关联的报告错误(见第6.2节)。
- 允许一个TLP包含多个任何类型的TLP前缀。
- 当TLP中同时存在本地和端到端TLP前缀时,要求所有的本地TLP前缀都在任何端到端TLP前缀之前。违反此规则的接收到的TLP将被视为畸形TLP。这是一个与接收端口相关联的报告错误(见第6.2节)。
- 每个TLP前缀的大小为1 DW。可以通过重复TLP前缀来提供额外数据的空间。
-
如果Fmt和Type字段的值指示存在本地TLP前缀,则根据本地TLP前缀处理(见第2.2.10.1节)。 如果Fmt和Type字段的值指示存在端到端TLP前缀,则根据端到端TLP前缀处理(见第2.2.10.2节)。
2.2.10.1 本地TLP前缀处理
以下规则适用于本地TLP前缀:
- 本地TLP前缀类型使用Type字段的子字段L[3:0]确定。
- Type[4]必须为0b。
- 本地TLP前缀L[3:0]值在表2-36中定义
- 每个本地TLP前缀类型的大小、路由和流量控制规则是特定的。
- 接收到不支持的本地TLP前缀类型的TLP是一个错误。如果设置了扩展Fmt字段支持位,除非在另一规格中明确另有规定,违反此规则的TLP将被视为畸形TLP。这是一个与接收端口相关联的报告错误(见第6.2节)。如果清除了扩展Fmt字段支持位,行为是设备定义的。
- 即使底层TLP受到ECRC(错误校验和)保护,也没有本地TLP前缀受到ECRC保护。
2.2.10.1.1 厂商定义的本地TLP前缀
如表2-36所述,类型VendPrefixL0和VendPrefixL1被保留用作厂商定义的本地TLP前缀。为了最大化互操作性和灵活性,对此类前缀应用了以下规则:
- 组件不得发送包含厂商定义的本地TLP前缀的TLP,除非已明确使能(使用厂商特定的机制)。
- 支持任何厂商定义的本地TLP前缀使用的组件必须支持Fmt字段的3位定义,并设置扩展Fmt字段支持位(见第7.5.3.15节)。
- 建议组件可以配置(使用厂商特定的机制),以便可以使用两种厂商定义的本地TLP前缀编码发送所有厂商定义的前缀。这样的配置不需要对称(例如,链路的每个端点可以使用不同的编码传输相同的前缀)。
2.2.10.2 端到端TLP前缀处理
以下规则应用于端到端前缀
- 端到端TLP前缀类型使用Type字段的子字段E[3:0]确定。
- Type[4]必须为1b。
- 端到端TLP前缀E[3:0]值在表2-37中定义。
- TLP中允许的端到端TLP前缀的最大数量为4:
- 支持TLP前缀的接收器必须检查此规则。如果接收器确定TLP违反了此规则,则TLP是畸形TLP。这是一个与接收端口相关联的报告错误(见第6.2节)。
- 端到端TLP前缀的存在不会改变TLP的路由。TLP的路由基于第2.2.4节中涵盖的路由规则。
- 功能通过设备能力2寄存器(Device Capabilities 2 register)中的最大端到端TLP前缀字段(Max End-End TLP Prefixes field)来指示它们支持多少端到端TLP前缀(见第7.5.3.15节)。
- 对于根端口,最大端到端TLP前缀字段允许返回一个值,该值表明支持的端到端TLP前缀比根端口硬件实际实现的少;然而,错误处理语义仍必须基于字段中包含的值。接收到的TLP如果包含的端到端TLP前缀比根端口支持的多,必须如下处理。建议将请求作为不支持的请求处理,但其他情况下必须作为畸形TLP处理。建议将完成作为意外完成处理,但其他情况下必须作为畸形TLP处理。对于入端口接收的TLP,这是一个与入端口相关联的报告错误。对于内部接收以通过出端口传输的TLP,这是一个与出端口相关联的报告错误。见第6.2节。
- 对于所有其他功能类型,如果接收到的TLP包含的功能支持的端到端TLP前缀多于功能支持的,必须将TLP作为畸形TLP处理。这是一个与接收端口相关联的报告错误(见第6.2节)。
- 如果支持高级错误报告(Advanced Error Reporting AER),则按第6.2.4.4节中指定的发生进行AER记录。
- 如果设置了端到端TLP前缀支持位,则Switch必须支持转发最多带有4个端到端TLP前缀的TLP。
- 不同根端口如果设置了端到端TLP前缀支持位,允许报告不同的最大端到端TLP前缀值。
- 如果底层TLP受到ECRC(错误校验和)保护,则所有端到端TLP前缀都受到ECRC保护。
- 如果不支持端到端TLP前缀的接收器接收到带有端到端TLP前缀的TLP,则是一个错误。违反此规则的TLP将被视为畸形TLP。这是一个与接收端口相关联的报告错误(见第6.2节)。
- 软件应确保不要向不支持它们的组件发送包含端到端TLP前缀的TLP。如果组件的扩展Fmt字段支持位被清除,可能会误认为TLP包含TLP前缀。
- 如果上游端口的一个功能具有设置的端到端TLP前缀支持位,则该上游端口的所有功能必须将收到的包含不支持的端到端TLP前缀类型的请求作为不支持的请求来处理。这是一个与接收端口相关联的报告错误(见第6.2节)。
- 如果上游端口的一个功能具有设置的端到端TLP前缀支持位,则该上游端口的所有功能必须将收到的包含不支持的端到端TLP前缀类型的完成作为意外完成来处理。这是一个与接收端口相关联的报告错误(见第6.2节)。
- 对于路由元素,每个出口端口中的端到端TLP前缀阻塞位决定是否可以通过该出口端口传输包含端到端TLP前缀的TLP(见第7.5.3.16节)。如果转发被阻塞,则整个TLP被丢弃,并且报告一个TLP前缀阻塞错误。如果被阻塞的TLP是一个非转发请求,出口端口返回一个具有不支持请求完成状态的完成。TLP前缀阻塞错误是与出口端口相关联的报告错误(见第6.2节)。
- 对于启用了多播的路由元素(见第6.14节),端到端TLP前缀在TLP的所有多播副本中复制。多播包的TLP前缀出口阻塞在每个出口端口独立执行。
2.2.10.2.1 厂商定义的端到端TLP前缀
如表2-37所述,类型VendPrefixE0和VendPrefixE1被保留用作厂商定义的端到端TLP前缀。为了最大化互操作性和灵活性,对此类前缀应用了以下规则:
- 组件不得发送包含厂商定义的端到端TLP前缀的TLP,除非已明确使能(使用厂商特定的机制)。
- 建议组件可以配置(使用厂商特定的机制)以使用两种厂商定义的端到端TLP前缀编码。这样做允许在单个PCI Express拓扑内同时使用两种不同的厂商定义的端到端TLP前缀,而不需要每个源都理解它发送的每个TLP的最终目的地址。
2.2.10.2.2 支持端到端TLP前缀的根端口
根端口之间支持包含端到端TLP前缀的TLP的点对点路由是可选的,并且取决于硬件设计。如果根复合体(RC)支持两个或更多根端口之间的端到端TLP前缀路由能力,它必须通过设备能力2寄存器中的端到端TLP前缀支持位在每个相关根端口中指示该能力。
RC不需要支持具有设置端到端TLP前缀支持位的所有根端口对之间的端到端TLP前缀路由。需要在不支持的根端口对之间路由的带有端到端TLP前缀的请求必须作为未知请求(UR)处理。需要在不支持的根端口对之间路由的带有端到端TLP前缀的完成必须作为意外完成(UC)处理。在这两种情况下,错误都由“发送”端口报告。
任何支持由主机软件或根复合体集成端点(RCiEPs)发起的带有端到端TLP前缀的TLP转发的根端口,都必须设置端到端TLP前缀支持位。任何支持将带有端到端TLP前缀的TLP从其入口端口转发到RCiEPs的根端口,都必须设置端到端TLP前缀支持位。
不同根端口如果设置了端到端TLP前缀支持位,允许报告不同的最大端到端TLP前缀值。
当执行根端口之间的点对点路由时,如果根复合体(RC)将TLP分割成更小的TLP,它必须在每个较小的TLP中复制原始TLP的端到端TLP前缀(见第1.3.1节)。