PCIe TLP详解
事务层数据包格式:
TLP前缀 | TLP包头 | 数据负载 | TLP摘要 |
---|---|---|---|
0, 1, 2,3,… | H+1, H+2,… | J, J+1,J+2,… | K,K+1,K+2,… |
- 前缀,这是一个可选的
- TLP 标头
- 数据有效载荷
- TLP 摘要
TLP 数据包格式中的信息分布为:
TLP 前缀。
标题(必填)。
数据(适用时包括在内):取决于交易类型。
TLP 摘要(可选)。
TLP 包头:
- 提供数据包的格式。
- 数据包的类型。
- 关联数据的长度(如果有)。
- 事务描述符。
- 地址/路由信息
- 字节使能
- 消息编码
- 完成状态
32 位 if 信息提供:
- 格式
- TLP 数据包类型
- 流量类别信息
- 属性
- T 头(存在 TLP 前缀,如果存在)
- TLP 摘要、端点(TLP 是正常的或中毒的)
- 地址转换(当内存可用时)
- 长度(以 32 位字表示的数据长度符号)
数据包格式和类型编码:
TLP Type | Format | Type | Description |
---|---|---|---|
MR | 000 / 001 | 0 0000 | 读存储器请求 |
MRL | 000 / 001 | 0 0001 | Memory Read Request Locked |
MW | 010 | 0 0000 | Memory Write Request |
IOR | 000 | 0 0010 | I/O读请求 |
IOW | 010 | 0 0010 | I/O写请求 |
CR0 | 000 | 0 0100 | 配置读类型0 |
CW0 | 010 | 0 0100 | 配置写类型0 |
CR1 | 000 | 0 0101 | 配置读类型1 |
CW1 | 010 | 0 0101 | 配置写类型1 |
Msg | 001 | 1 0 r2 r1 r0 | 消息请求 |
MsgD | 011 | 1 0 r2 r1 r0 | 带数据的消息请求 |
一些额外的交易类型如下:
TLP Type | Format | Type | Description |
---|---|---|---|
Cpl | 000 | 0 1010 | 无数据完成(0字节) |
CplD | 010 | 0 1010 | Completion with data (data will be present in TLP) |
CplLk | 000 | 0 1011 | Completion for Locked Memory read without data |
CplDLk | 010 | 0 1011 | Completion for Locked Memory Read |
FetchAdd | 010 / 011 | 0 1100 | Fetch and Add atomic Operation Request |
Swap | 010 / 011 | 0 1101 | Unconditional Swap Atomic Operation Request |
CAS (Compare and Swap) | 010 / 011 | 0 1110 | Compare and swap Atomic Operation |
LPrfx | 100 | 0 L3 L2 L1 L0 | Local TLP Prefix |
EPrfx | 100 | 1 E3 E2 E1 E0 | End-End TLP Prefix |
TLP 长度编码:
Length [9:0] | TLP Data Payload Size |
---|---|
00 0000 0001 | 1 DW |
00 0000 0010 | 2 DW |
… | … |
11 1111 1111 | 1023 DW |
00 0000 0000 | 1024 DW |
DW:双字。
全 1:1023 个 双字。
全 0:数据包中有 1024 个双字。
假设有 1024个双字的数据,那么Root Complex会将数据分成更小的数据包,并发送到端点。如果中间存在交换机,则数据将按原样转发,而不会将其拆分为数据包,即没有任何更改。
地址翻译:
AT Coding | Description |
---|---|
00 | Default / Untranslated |
01 | Translation Request |
10 | Translated |
11 | Reserved |
数据使用路由信息,如总线号;到达特定端点的设备号、功能号等。
路由类型(3 或 4 个 D Words of Header)取决于 TLP 摘要的需要。
交换机检查总线号和设备号,并相应地将数据包转发到该特定端点,以便在运行时执行路由。