下列规则适用于所有 Memory, I/O, Configuration Requests,以下是针对各类请求的附加规则。
- 除通用 header 字段外,所有 Memory, I/O, 和 Configuration Requests 还包括以下字段:
- Requester ID[15:0] 和 Tag[9:0],组成 Transaction ID。
- Last DW BE[[3:0] 和 First DW BE[3:0]。对于 TH 位为1的 Memory Read Requests 和 AtomicOp Requests,报头中Last DW BE[3:0] 和 First DW BE[3:0] 字段的字节位置将被调整为 ST[7:0] 字段。对于 TH 位为0的Memory Read Requests,参考 【PCIe 5.0 - 8】PCIe 事务层详解4 - First/Last DW Byte Enables规则 中的 First/Last DW Byte Enables规则。对于 TH 位为1的 AtomicOp Requests,DW BE 字段的值隐含为保留。对于 TH 位为0的 AtomicOp Requests,DW BE 字段为保留。
Memory Requests 适用以下规则:
- Memory Requests 按地址路由,使用 64 位或 32 位寻址方式(见图1 和图2)。
- 对于 Memory Read Requests,长度不得超过 Max_Read_Request_Size 指定的值。
- 对于 AtomicOp Requests,表 1 规定了架构操作数大小及其相关的长度字段值。如果完成器支持 AtomicOps,则适用以下规则。Completer 必须检查 Length 字段值。如果该值与架构值不匹配,则完成器必须将 TLP 作为畸形 TLP 处理。否则,如果该值与 Completer 支持的操作数大小不匹配,Completer 必须将 TLP 作为不支持的请求 (Unsupported Request,UR) 处理。这是一个与接收端口相关的报告错误。
AtomicOp Request | 32 Bits | 64 Bits | 128 Bits |
---|---|---|---|
FetchAdd, Swap | 1 DW | 2 DW | N/A |
CAS | 2 DW | 4 DW | 8 DW |
- FetchAdd Request 包含一个操作数,即 “add” 值。
- Swap Request 包含一个操作数,即 “swap” 值。
- 一个CAS Request 包含两个操作数。数据区的第一个操作数是 “compare” 值,第二个操作数是 “swap” 值。
- 对于 AtomicOp Request,地址必须与操作数大小自然对齐。Completer 必须检查是否违反了这一规则。如果 TLP 违反了这一规则,则该 TLP 为畸形 TLP(Malformed TLP)。这是一个与接收端口相关的报告错误。
- 请求不得指定导致内存空间访问跨越 4-KB 边界的 Address/Length 组合。
- Receivers 可选择检查是否违反此规则。如果执行此检查的 Receivers 确定 TLP 违反了此规则,则该 TLP 为畸形 TLP。
- 如果检查到,这将是一个与接收端口相关的报告错误。
- 对于 AtomicOp Requests,对地址自然对齐的强制 Completer 检查(见上文)已经保证了访问不会跨越 4KB 边界,因此不需要单独的 4KB 边界检查。
- 如果对 AtomicOp CAS Requests 执行 4-KB 边界检查,该检查必须理解 TLP Length 值是基于两个操作数的大小,而对内存空间的访问是基于一个操作数的大小。
- Receivers 可选择检查是否违反此规则。如果执行此检查的 Receivers 确定 TLP 违反了此规则,则该 TLP 为畸形 TLP。
实施说明
64位地址的生成
强烈建议 PCI Express 端点能够生成全部 64 位地址范围。但是,如果 PCI Express 端点支持的地址范围较小,无法达到特定平台环境所需的全部地址范围,则相应的设备驱动程序必须确保所有内存事务目标 buffers 都在端点支持的地址范围内。确保这一点的具体方法取决于平台和操作系统,超出了本规范的范围。
对于 I/O Requests,适用以下规则:
- I/O Requests 按地址路由,使用 32 位寻址法(见图3)
- I/O Requests 有以下限制:
- TC[2:0] 必须为 000b
- LN 不适用于 I/O Request,该位保留
- Attr[2] 保留
- Attr[1:0]必须为 00b
- AT[1:0] 必须为 00b。不要求也不鼓励 Receivers 检查这一点。
- Length[9:0] 必须为 00 0000 0001b
- Last DW BE[3:0] 必须为 0000b
Receivers 可选择检查是否违反这些规则(但不得检查保留位,Reserved bit)。这些检查都是独立可选的(见 Optional Error Checking)。如果执行这些检查的 Receiver 确定 TLP 违反了这些规则,则该 TLP 为畸形 TLP(Malformed TLP)。
- 如果检查到,这是与接收端口相关的报告错误(见Error Signaling and Logging)。
对于 Configuration Requests,适用以下规则:
-
除了所有 Memory, I/O 和 Configuration Requests 中包含的报头字段和 ID 路由字段外,Configuration Requests 还包含以下附加字段(参见图 4)。
- Register Number[5:0]
- Extended Register Number[3:0]
-
Configuration Requests 有以下限制:
- TC[2:0] 必须为 000b
- LN 不适用于 Configuration Requests,该位保留。
- TH 不适用于 Configuration Requests,该位保留。
- Attr[2] 保留
- Attr[1:0] 必须为 00b
- AT[1:0] 必须为 00b。不要求也不鼓励 Receivers 检查这一点。
- Length[9:0] 必须为 0000 0001b
- Last DW BE[3:0] 必须为 0000b
Receivers 可选择检查是否违反这些规则(但不得检查保留位,Reserved bit)。这些检查都是独立可选的(见 Optional Error Checking)。如果执行这些检查的 Receiver 确定 TLP 违反了这些规则,则该 TLP 为畸形 TLP(Malformed TLP)。
- 如果检查到,这是与接收端口相关的报告错误(见Error Signaling and Logging)。
MSI/MSI-X 机制使用 Memory Write Requests 来表示中断消息(参见 MSI and MSI-X Operation)。MSI/MSI-X 事务使用的请求格式与上文定义的 Memory Write Request 格式相同,在排序、流量控制和数据完整性方面,MSI/MSI-X 请求与内存写入没有区别。
TPH 规则
- 为 TPH 指定了两种格式。所有提供 TPH 的请求都必须使用 Baseline TPH 格式(见图 6 和图 7)。带有可选的 TPH TLP Prefix 的格式扩展了 TPH 字段(见图 5),为 Steering Tag (ST) 字段提供额外位。
- 可选的 TPH TLP Prefix 用于扩展 TPH 字段。
- TPH TLP Prefix 通过解码 byte 0 来确定是否存在。
Fields | TPH TLP Prefix |
---|---|
ST(15:8) | Bits 7:0 of byte 1 |
Reserved | Bits 7:0 of byte 2 |
Reserved | Bits 7:0 of byte 3 |
- 对于以 Memory Space 为目标的 Requests, TH 位为 1b 表示 TLP header 和 可选 TPH TLP Prefix(如有)中存在 TPH。
- 对于提供 TPH 的请求,TH 位必须设置。
- 带有 TPH TLP Prefix 的请求必须设置 TH 位。
- 当 TH 位为0时,PH 字段保留。
- TH 位和 PH 字段不适用于所有其他 Requests,且为保留字段。
Processing Hints (PH) 映射如图6、图7 和 表3 所示:
PH | 32-bit Addressing | 64-bit Addressing |
---|---|---|
1:0 | Byte 11 的 bits 1:0 | Byte 15 的 bits 1:0 |
PH[1:0] 字段提供有关数据访问模式的信息,其定义如表4 所示:
PH1:0 | Processing Hint | 描述 |
---|---|---|
00 | Bi-directional data structure | 表示 Host 和 Device 频繁读取和/或写入数据 |
01 | Requester | 表示 Device 频繁读取和/或写入数据 |
10 | Target | 表示 Host 频繁读取和/或写入数据 |
11 | Target with Priority | 表示 Host 频繁读取和/或写入,并表明所访问数据具有高时间局部性 |
Steering Tag (ST) 字段映射到 TLP header,如图8 、图9 和表 5 所示。
ST Bits | Memory Write Request | Memory Read Request or AtomicOp Request |
---|---|---|
7:0 | Byte 6 的 Bits 7:0 | Byte 7 的 Bits 7:0 |
-
ST[7:0] 字段
- 全部为 0 的值表示无 Steering Tag 首选项
- 总共提供 255 个唯一的 Steering Tag 值
-
不支持 TPH Completer 或 Routing capability 的 Function,在收到设置了 TH 位的事务时,必须忽略 TH 位,并以与未设置 TH 位的相同事务类型的请求相同的方式处理 Request。