这周研究了一下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类型

还没写完,发现总结的文档没带回来,后面补上。