2.2.10 TLP Prefix Rules
以下规则适用于所有携带Prefix的TLP包:
- byte0的Fmt[2:0] = 100b表示这是1个Prefix TLP,Type[4]指示Prefix的类型
- 0:Local Prefix
- 1:End-End Prefix
- byte1-3 的格式由Prefix的类型定义。
- 含有TLP前缀的TLP必须包含一个底层的TLP报头。接收到的违反此规则的TLP将被视为格式错误的TLP,并作为与接收端口相关的上报错误(参见第6.2节)。
- 允许一个TLP包含多个任何类型的TLP前缀。
- 当TLP中同时存在Local TLP前缀和End-End TLP前缀时,要求所有Local TLP前缀必须位于任何End-End TLP前缀之前。接收到的违反此规则的TLP将被视为格式错误的TLP,并作为与接收端口相关的上报错误(参见第6.2节)。
- 每个TLP Prefix都是1dw。TLP前缀可以重复,以提供额外的数据。
- Local TLP Prefix按照2.2.10.1章节处理
- End-End TLP Prefix按照2.2.10.2章节处理
2.2.10.1 Local TLP Prefix Processing
以下规则适用于Local TLP Prefix:
- L[3:0] 用于区分子类型
- Type[4] 必须为0
- L[3:0](Type[3:0]) 按表2-36定义

- 大小、路由和流控制规则因每种Local TLP前缀类型而异。
- 接收方收到其不支持的Local TLP前缀类型时,属于错误。若扩展Fmt字段支持位(Extended Fmt Field Supported bit)已置位 ,则违反此规则的TLP将被视为格式错误的TLP(除非其他规范另有说明),并作为与接收端口相关的上报错误(参见第6.2节)。若该位未置位,则行为由设备具体实现决定。
- Local TLP前缀不受ECRC保护,即使底层TLP受ECRC保护。
2.2.10.1.1 Vendor Defined Local TLP Prefix
如表2-36所述,Types VendPrefixL0和VendPrefixL1 保留用作厂商自定义Local TLP前缀。为确保互操作性和灵活性,此类前缀需遵循以下规则:
- 除非通过厂商特定机制显式启用,否则组件不得发送包含厂商自定义Local TLP前缀的TLP。
- 支持使用厂商自定义Local TLP前缀的组件必须支持Fmt字段的3位定义,并置位Extended Fmt Field Supported位(参见第7.5.3.15节)。
- 建议组件可通过厂商特定机制进行配置,以便使用两种厂商自定义Local TLP前缀编码中的任意一种发送所有厂商定义的前缀。此类配置无需对称(例如,链路两端可使用不同编码发送相同前缀)。
2.2.10.2 End-End TLP Prefix Processing
以下规则适用于End-End TLP Prefix:
- E[3:0] 用于区分子类型
- Type[4] 必须为1
- E[3:0](Type[3:0]) 按表2-37定义

-
一个TLP中允许的最大End-End TLP前缀数量为4个:
- 支持TLP前缀的接收方必须检查此规则。如果接收方确定TLP违反此规则,则该TLP为格式错误的TLP,并作为与接收端口相关的上报错误(参见第6.2节)。
-
End-End TLP前缀的存在不会改变TLP的路由。TLP的路由基于第2.2.4节所述的路由规则。
-
Function通过Device Capabilities 2寄存器 中的Max End-End TLP Prefixes字段(参见第7.5.3.15节)声明其支持的End-End TLP前缀数量。
- 对于Root Ports ,该字段允许返回一个值,表明其支持的End-End TLP前缀数量少于Root Port硬件实际实现的数量;然而,错误处理语义仍必须基于该字段中的值。接收到的包含超过Root Port支持数量的End-End TLP前缀的TLP必须按以下方式处理。建议将请求(Requests)处理为 不支持的请求(Unsupported Requests),否则必须处理为 格式错误的TLP(Malformed TLPs)。 建议将 完成(Completions)处理为 意外完成(Unexpected Completions),否则必须处理为格式错误的TLP 。对于**接收端口(Ingress Port)接收到的TLP,这是与接收端口相关的上报错误(参见第6.2节)。对于在内部接收并传输至发送端口(Egress Port)**的TLP,这是与发送端口相关的上报错误(参见第6.2节)。
- 对于所有其他功能类型,接收到的包含超过功能支持数量的End-End TLP前缀的TLP必须处理为格式错误的TLP 。这是与接收端口相关的上报错误(参见第6.2节)。如果支持,高级错误报告(AER)日志记录将按照第6.2.4.4节的规定进行。
-
如果End-End TLP Prefix支持位(End-End TLP Prefix Supported bit)已置位,则交换机必须支持转发包含最多4个End-End TLP前缀的TLP。
-
置位了End-End TLP Prefix支持位的不同Root Port可以报告不同的Max End-End TLP Prefixes值。
-
如果底层TLP受ECRC保护,则所有End-End TLP前缀均受ECRC保护。(Local Prefix不受支持)
-
接收方不支持End-End TLP前缀时,接收包含End-End TLP前缀的TLP属于错误。违反此规则的TLP将被视为格式错误的TLP,并作为与接收端口相关的上报错误(参见第6.2节)。
-
软件应确保不将包含End-End TLP前缀的TLP发送给不支持的组件。Extended Fmt Field Supported位未置位的组件可能错误解析包含TLP前缀的TLP。
-
如果Upstream端口的某个Function置位了End-End TLP Prefix支持位 ,则该上游端口的所有功能必须将接收到的包含不支持的End-End TLP前缀类型的请求处理为Unsupported Request。这是与接收端口相关的上报错误(参见第6.2节)。
-
如果Upstream端口的某个功能置位了End-End TLP Prefix支持位 ,则该上游端口的所有功能必须将接收到的包含不支持的End-End TLP前缀类型的完成处理为Unexpected Completion。这是与接收端口相关的上报错误(参见第6.2节)。
-
对于路由组件(Switch),每个发送端口(Egress Port)中的End-End TLP Prefix阻塞位 决定是否允许通过该发送端口传输包含End-End TLP前缀的TLP(参见第7.5.3.16节)。如果转发被阻塞,则丢弃整个TLP并报告TLP Prefix Blocked Error 。如果被阻塞的TLP是Non-Posted请求 ,则发送端口返回带有Unsupported Request Completion Status 的完成。TLP Prefix Blocked Error是与发送端口相关的上报错误(参见第6.2节)。
-
对于启用了多播(Multicast)的路由组件(Switch)(参见第6.14节),End-End TLP Prefix复制多份。多播数据包的TLP Prefix Egress Blocking在每个发送端口独立执行。
2.2.10.2.1 Vendor Defined End-End TLP Prefix
如表2-37所述,Types VendPrefixE0和VendPrefixE1 保留用作厂商自定义End-End TLP前缀。为确保互操作性和灵活性,此类前缀需遵循以下规则:
- 除非通过厂商特定机制显式启用,否则组件不得发送包含厂商自定义End-End TLP前缀的TLP。
- 建议组件可通过厂商特定机制进行配置,以便使用两种厂商自定义End-End TLP前缀编码中的任意一种。这样,允许在单个PCI Express拓扑中同时使用两种不同的厂商自定义End-End TLP前缀,而无需每个发送方都理解其发送的每个TLP的最终目的地。
2.2.10.2.2 Root Ports with End-End TLP Prefix Supported
支持Root Port之间携带End-End TLP前缀的TLP的点对点路由是可选的,具体实现由设备决定。如果RC支持在两个或多个Root Port之间路由End-End TLP前缀,则必须在每个相关Root Port的Device Capabilities 2寄存器 中通过End-End TLP Prefix Supported位 声明此能力。
RC无需支持在所有已置位End-End TLP Prefix Supported位的Root Port对之间路由End-End TLP前缀。如果请求的End-End TLP前缀需要在不受支持的Root Port对之间路由,则必须将其处理为UR(Unsupported Request);如果完成包含End-End TLP前缀且需要在不受支持的Root Port对之间路由,则必须将其处理为 Unexpected Completion(UC)。在这两种情况下,错误均由"发送"端口报告。
任何支持由主机软件或Root Complex集成端点(RCiEP)发起的携带End-End TLP前缀的TLP转发的Root Port,都必须置位End-End TLP Prefix Supported位 。任何支持将从接收端口接收的携带End-End TLP前缀的TLP转发至RCiEP的Root Port,也必须置位该位。已置位End-End TLP Prefix Supported位的不同Root Port可以报告不同的Max End-End TLP Prefixes 值。
当RC在Root Port之间执行点对点路由时将TLP拆分为更小的TLP时,必须在每个较小的TLP中复制原始TLP的End-End TLP前缀(参见第1.3.1节)。