1.事务层概述
从高层次上看,事务层的关键方面包括:
- 一个流水线化的全分割事务协议
- 用于区分事务层数据包(TLPs)的排序和处理要求的机制
- 基于信用量的流控制
- 可选支持数据中毒和端到端数据完整性检测
事务层包含以下内容:
- TLP的构建和处理
- 与设备资源关联的事务级机制,包括:
- 流量控制
- 虚拟通道管理
-
用于排序和管理TLPs的规则
- 兼容PCI/PCIX的排序
- 包括流量类别区分
1.1 地址空间、事务类型和用途
事务构成了请求者和完成者之间信息传输的基础。定义了四种地址空间,并定义了不同的事务类型,每种都有其独特的目标用途,如表2-1所示。
地址空间 | 事务类型 | 基本用途 |
---|---|---|
内存 | 读取 | 从内存映射位置读取数据 |
写入 | 写入数据到内存映射位置 | |
I/O | 读取 | 从I/O映射位置读取数据 |
写入 | 写入数据到I/O映射位置 | |
配置 | 读取 | 设备功能配置/设置 |
写入 | ||
消息 | baseline(包括供应商定义的) | 从事件信号机制到通用消息传递 |
1.1.1 内存事务
内存事务包括以下类型:
- 读请求/完成
- 写请求
- 原子操作请求/完成
内存事务使用两种不同的地址格式:
- 短地址格式:32位地址
- 长地址格式:64位地址
某些内存事务可以选择性地有一个包含进程地址空间ID(PASID)的PASID TLP前缀。
1.1.2 I/O事务
PCI Express支持I/O空间,以兼容需要使用它们的旧设备。本规范的未来修订可能会弃用I/O空间的使用。I/O事务包括以下类型:
- 读请求/完成
- 写请求/完成
I/O 事务使用单一地址格式:
- 短地址格式:32位地址
1.1.3 配置事务
配置事务用于访问设备内功能的配置寄存器。
配置事务包括以下类型:
- 读请求/完成
- 写请求/完成
1.1.4 消息事务
消息事务,或简称消息,用于支持设备之间的带内事件通信。
除了本文档中定义的特定消息,PCI Express 还提供支持使用指定消息代码的供应商定义消息。 除了使用 PCI-SIG* 供应商 ID(0001h)的供应商定义消息外,特定供应商定义消息的定义不在本文档的范围之内。
本规范建立了一个标准框架,供应商可以在该框架内指定自己的供应商定义消息,以适应其平台的特定要求。 请注意,这些供应商定义的消息不能保证与来自不同供应商的组件互操作。
1.2 数据包格式概述
事务由请求和完成组成,它们使用数据包进行通信。图 2-2 显示了一个 TLP 的高级序列化视图,由一个或多个可选的 TLP 前缀、一个 TLP 头标、一些数据包类型的数据有效载荷,以及一个可选的 TLP digest(ECRC)组成。图 2-3 显示了 TLP 的更详细视图。本章的以下各节定义了数据包头标和ECRC的详细结构。
PCI Express 概念上将信息传输为字节的串行流,如图 2-2 所示。请注意,在字节级别,信息是以 TLP 的最左边的字节在互连上进行传输/接收的。图 2-2 中的字节首先被传输/接收(如果是一个字节或者多个可选的 TLP 前缀存在,则是字节 0;否则是字节 H)。
TLP 前缀、TLP 头标和 TLP digest的详细布局(在图 2-3 中以通用形式呈现)是按照字节编号较低的在左边而不是在右边绘制的,这与传统上在其他 PCI 规范中所描述的相反。头部布局针对串行互连的性能进行了优化,这是由于需要首先传输最关键的信息。例如,在 TLP 头标中,地址字段的最重要字节首先被传输,以便它可以用于早期地址解码。
TLP 中最低地址字节的有效载荷数据(图 2-3 中的字节 J)显示在左上角。 详细布局显示数据结构组织保留了传统的 PCI 字节布局,其中最低地址字节显示在右侧。无论表示方式如何,所有字节都概念上按字节号递增的顺序在链路上传输。
根据数据包的类型,该数据包的头标将包含以下一些字段:
- 数据包的格式
- 数据包的类型
- 任何相关数据的长度
- 事务描述符,包括:
- 事务 ID
- 属性
- TC
- 地址/路由信息
- 字节使能
- 消息解码
- 完成状态
2. 事务层协议 - 数据包定义
PCI Express 使用基于数据包的协议在通过链路通信的两个组件的事务层之间交换信息。PCI Express 支持以下基本事务类型:内存、I/O、配置和消息。内存请求支持两种寻址格式:32位和64位。
事务通过请求和完成来承载。仅在需要时使用完成,例如,返回读取数据,或确认 I/O 和配置写事务的完成。完成与它们对应的请求通过数据包头标中的事务 ID 字段的值关联。
所有标为保留的 TLP 字段(有时缩写为 R)在形成 TLP 时必须用全 0 填充。接收方必须忽略这些字段中的值,并且Switch必须不修改地转发它们。注意,对于某些字段,有指定的和保留的值 - 这些情况下保留值的处理方式对每种情况都单独指定。
2.1 通用数据包头标字段
所有 TLP 前缀和头标包含以下字段(见图 2-4):
- Fmt[2:0] - TLP 格式(见表 2-2)- 字节 0 的位 7:5
- Type[4:0] - TLP 类型 - 字节 0 的位 4:0
Fmt 字段指示存在一个或多个 TLP 前缀,Type 字段指示相关的 TLP 前缀类型。
TLP 头标的 Fmt 和 Type 字段提供了确定 TLP 头标剩余部分大小所需的信息,以及数据包是否包含跟在头标后面的数据有效载荷。
TLP 头标的 Fmt、Type、TD(事务描述符)和长度字段包含确定 TLP 非前缀部分总大小所需的所有信息。Type 字段除了定义 TLP 的类型外,还决定了Switch如何路由 TLP。不同类型的 TLP 在以下各节中更详细地讨论。
- 允许的 Fmt[2:0] 和 Type[4:0] 字段值显示在下节中。
- 所有其他编码都是保留的。
- TC[2:0] - 流量类别 - byte1 的bit [6:4]
- 轻量级通知 (Lightweight Notification LN) - 1 位表示内存请求是 LN 读取或 LN 写入,或者完成是 LN 完成。
- TLP 提示 (TLP Hints TH) - 1 位表示在 TLP 头标存在 TLP 处理提示 (TPH) 以及可选的 TPH TLP 前缀(如果存在)- byte1 bit 0。
- Attr[1:0] - 属性 - byte2 bit [5:4]。
- Attr[2] - 属性 - byte1 bit 2。
- TD - 1 位表示在 TLP 结尾处以单个双字 (DW) 的形式存在 TLP ECRC - byte2 bit 7。
- 错误中毒 (EP) - 表示 TLP 中毒- byte2 的bit 6。
- Length[9:0] - 数据有效载荷长度,以双字 (DW) 为单位- byte2 的bit [1:0] 与byte3 的bit [7:0]连接。
- TLP 数据必须以 4 字节自然对齐,并以 4 字节 DW 的增量进行。
- 保留给不包含或不引用数据有效载荷的 TLP,包括完成 (Cpl)、完成锁定 (CplLk) 和消息(除非另有规定)。
2.2 带数据载荷的 TLP - 规则
- 长度以双字 (DW) 的整数倍指定。
- 除了明确引用数据长度的消息外,所有消息的 Length[9:0] 都是保留的。
- 带有数据载荷的 TLP 的发送器不得允许 TLP 的长度字段给出的数据有效载荷长度超过发送器的设备控制寄存器中 Max_Payload_Size 字段指定的长度,该长度以 DW 的整数倍表示。
- 对于 ARI 设备,Max Payload_Size 仅由功能 0 中的设置确定。其他功能中的 Max_Payload_Size 设置将被忽略。
- 对于与所有功能中 Max Payload_Size 设置相同的非 ARI 多功能设备 (MFD) 相关联的上游端口,传输的 TLP 的数据有效载荷不得超过共同的 Max_ Payload_Size 设置。
- 对于与所有功能中 Max_Payload_Size 设置不相同的非 ARI MFD 相关联的上游端口,传输的 TLP 的数据有效载荷不得超过 Max_ Payload_Size 设置,其确定是特定实现的。
(1) 鼓励发送器实现使用生成事务的功能中的 Max_Payload_Size 设置,或者使用所有功能中最小的 Max_Payload_Size 设置。
(2)软件不应在不同的功能中将 Max_Payload_Size 设置为不同的值,除非软件了解特定的实现。
4. 注意:Max_Payload_Size 仅适用于带有数据载荷的 TLP;内存读取请求的长度不受 Max_ Payload_Size 限制。内存读取请求的大小由长度字段控制。
- 接收到的 TLP 的数据载荷大小,由 TLP 的长度字段给出,不得超过接收器的设备控制寄存器中 Max_ Payload_Size 字段指定的长度,该长度以 DW 的整数倍表示。
- 接收器必须检查此规则的违规情况。如果接收器确定 TLP 违反此规则,则该 TLP 是一个畸形 TLP。
- 这是一个与接收端口相关联的报告错误。
- 对于 ARI 设备,Max_Payload_Size 仅由功能 0 中的设置确定。其他功能中的 Max Payload_ Size 设置将被忽略。
- 对于与所有功能中 Max_Payload_Size 设置相同的非 ARI MFD 相关联的上游端口,接收器需要检查 TLP 的数据有效载荷大小与共同的 Max_Payload_Size 设置。
- 对于与所有功能中 Max_Payload_Size 设置不相同的非 ARI 多功能设备 (MFD) 相关联的上游端口,接收器需要检查 TLP 的数据有效载荷是否符合特定于实现的 Max_Payload_Size 设置。
- 鼓励接收器实现使用目标功能中的 Max_Payload_Size 设置,或者使用所有功能中最大的 Max_Payload_Size 设置。
- 软件不应在不同功能中将 Max_Payload_Size 设置为不同的值,除非软件了解特定的实现。
- 对于包含数据的 TLP,长度字段中的值和 TLP 中包含的实际数据量必须匹配。
- 接收器必须检查此规则的违规情况。如果接收器确定 TLP 违反此规则,则该 TLP 是一个畸形 TLP。
- 这是与接收端口相关联的报告错误。
- 长度字段中的值仅适用于数据 - 不包括 TLP ECRC。
- 当与字节地址关联的数据有效载荷包含在除原子操作请求或原子操作完成之外的 TLP 中时,标头后的第一个字节对应于最接近零的字节地址,后续字节按字节地址递增的顺序排列。
- 例如:对于写入位置 0x100 的 16 字节数据,标头后的第一个字节将写入位置 0x100,第二个字节将写入位置 0x101,依此类推,最后一个字节写入位置 0x10F。
- 原子操作请求和原子操作完成中的数据有效载荷必须格式化,以使标头后的第一个字节是第一个数据值的最低有效字节,后续字节的数据重要性严格递增。对于比较和交换 (Compare And Swap CAS) 请求,第二个数据值紧跟在第一个数据值之后,并且必须使用相同的格式。
- 原子操作完成器用于在目标位置读取和写入数据的字节序格式是特定于实现的,并且允许完成器确定适合目标内存的任何格式(例如,小端序,大端序等)。原子操作完成器的字节序格式能力报告和控制不在本规范范围内。
- 小端序示例:对于目标内存为小端序格式、目标位置为 0x100、大小为 64 位(8 字节)的交换请求,标头后的第一个字节写入位置 0x100,第二个字节写入位置 0x101,依此类推,最后一个字节写入位置 0x107。注意,在执行写入之前,完成器首先读取目标内存位置,以便它可以在完成时返回原始值。完成中数据的字节地址对应关系与请求中相同。
- 大端序示例:对于目标内存为大端序格式、目标位置为 0x100、大小为 64 位(8 字节)的交换请求,标头后的第一个字节写入位置 0x107,第二个字节写入位置 0x106,依此类推,最后一个字节写入位置 0x100。注意,在执行写入之前,完成器首先读取目标内存位置,以便它可以在完成时返回原始值。完成中数据的字节地址对应关系与请求中相同。
- 图 2-6 显示了 64 位(8 字节)FetchAdd操作的完成器目标内存访问的小端序和大端序示例。操作数和结果中的字节编号为 0-7,其中字节 0 是最低有效字节,字节 7 是最高有效字节。在每种情况下,完成器使用适当的字节序格式获取目标内存操作数。接下来,完成器中的原子操作计算逻辑使用原始目标内存值和 FetchAdd 请求中的“加*”值执行 FetchAdd 操作。最后,完成器将 FetchAdd 结果存储回目标内存,使用与获取时相同的字节序格式。
2.3 TLP Digest规则
- 对于任何 TLP,TD 位上的 1 位表示在 TLP 末尾存在 TLP disgest字段,该字段包含端到端 CRC(ECRC)值。
- 如果 TD 位的值与观察到的大小(考虑数据有效载荷,如果存在)不对应,则该 TLP 是畸形 TLP。
- 这是与接收端口相关联的报告错误。
- 如果 TLP 的中间或最终 PCI Express 接收器不支持 ECRC 校验,接收器必须忽略 TLP digest。
- 如果 TLP 的接收器支持 ECRC 校验,接收器根据规则将 TLP digest字段中的值解释为 ECRC 值。
2.4 路由和寻址规则
有三种主要的 TLP 路由机制:地址、ID 和隐式。本节定义了地址和 ID 路由机制的规则。隐式路由仅与消息请求一起使用,后面介绍。
2.4.1 基于地址的路由规则
- 地址路由用于内存和 I/O 请求。
- 规定了两种地址格式,一种是与 4 DW 头标一起使用的 64 位格式(见图 2-7),另一种是与 3 DW 头标一起使用的 32 位格式(见图 2-8)。
- 对于内存读取、内存写入和原子操作请求,地址类型 (AT) 字段按照表 10-1 所示进行编码。
- 对于所有其他请求,除非另有明确说明,AT 字段是保留的。LN 读取和 LN 写入有特殊要求。
- 如果 TH 位被设置,则 PH 字段按照表 2-15 所示进行编码。
- 如果 TH 位被清除,则 PH 字段是保留的。
- 地址映射到 TLP 头部的详细信息在表 2-5 中展示。
- 内存读取、内存写入和原子操作请求可以使用任一格式。
- 对于低于 4 GB 的地址,请求者必须使用 32 位格式。如果接收器收到一个使用 64 位格式寻址低于 4 GB 的请求(即,地址的高 32 位为全 1),接收器的行为是未指定的。
- I/O 读取请求和 I/O 写入请求使用 32 位格式。
2.4.2 基于ID的路由规则
- ID路由用于配置请求、ID路由消息和完成事务。本规范定义了几个ID路由消息(表F-1)。允许其他规范定义额外的ID路由消息。
- ID路由使用总线、设备和功能号(BDF)来指定TLP的目的地:
- 对于非 ARI 路由ID,总线、设备和(3位)功能号到TLP头部的映射显示在表 2-6、图 2-9和图 2-11中。
- 对于 ARI 路由ID,总线和(s位)功能号到TLP头部的映射显示在表 2-7、图 2-10和图 2-12中。
- 规定了两种基于ID的路由格式,一种用于带有4 DW头部的(见图 2-9和图 2-10),另一种用于带有3 DW头部的(见图 2-12和图 2-10)。
- 两种格式的头标字段位置是相同的(见图 2-5)。
2.5 第一/最后一个DW的数据字节使能规则
字节使能位包括在内存、I/O 和配置请求中。本节定义了相应的规则。 字节使能位,当在请求头标出现时,位于头标的byte 7(见图 2-13)。对于设置了 TH 位的内存读取请求,字节使能字段被重新用于携带 ST[7:0] 字段,字节使能的值如下所定义的含义。只有在可以接受将所有请求的数据字节都使能的情况下,才应将 TH 位设置在内存读请求中。
- 对于设置了 TH 位的内存读请求,字节使能的以下值是隐含的。
- 如果此请求的长度字段指示长度为 1 DW,则第一个 DW 字节启用的值隐含地被认为是 1111b,最后一个 DW 字节启用的值隐含地被认为是 0000b。
- 如果此请求的长度字段指示长度大于 1 DW,则第一个 DW 字节启用和最后一个 DW 字节启用的值隐含地被认为是 1111b。
- First DW BE[3:0] 字段包含对请求引用的第一个(或唯一)DW的字节使能位。
- 如果一个请求的长度字段指示长度大于 1 双字节 (DW),则该字段不能等于 0000b。
- Last DW BE[3:0] 字段包含请求的最后一个DW的字节使能位。
- 如果一个请求的长度字段指示长度为 1 DW,则该字段必须等于 0000b。
- 如果一个请求的长度字段指示长度大于 1 DW,则该字段不能等于 0000b。
对于字节使能位字段的每个位:
-
0b 表示在完成器处对应的数据字节不应被写入,或者如果是非预取的,则不应被读取。
-
1b 表示在完成器处对应的数据字节必须被写入或读取。
对于所有长度为 1 DW 的请求,允许在First DW BE[3:0]中使用非连续的字节使能位。
-
非连续字节使能位示例:1010b, 0101b, 1001b, 1011b, 1101b
对于四字节 (QW) 对齐且长度为 2 DW (1 QW) 的内存请求,允许在两个字节使能位字段中都使用非连续的字节使能位。
所有非 QW 对齐且长度为 2 DW (1 QW) 的内存请求,以及长度为 3 DW 或更长的内存请求,必须仅使能请求的First DW和Last DW之间数据的连续字节。
-
连续字节启用位示例::
-
First DW BE :1100b,Last DW BE:0011b
-
First DW BE :1000b,Last DW BE:0111b
表 2-8 显示了字节使能位字段的位、它们在请求头标中的位置,以及引用数据的相应字节之间的对应关系。
带有长度为 1 DW但没有启用任何字节的写入请求是允许的,并且在完成器处(除非另有规定)不会产生任何效果。
如果一个长度为 1 DW 的读取请求指定没有启用任何字节来读取( FirstDW BE[3:0] = 0000b),相应的完成包必须指定长度为 1 DW,并且包含 1 DW 的数据有效载荷。
- 数据有效载荷的内容在完成包中是未指定的,可以是任意值。
如果 TLP 违反了本节中指定的字节使能位规则,接收器/完成器的行为是未定义的。
接收器可以(但不是必须)检查是否违反了本节中指定的字节使能位规则。如果实施这些检查的接收器确定 TLP 违反了一个或多个字节使能位规则,该 TLP 就是一个畸形 TLP。这些检查是独立可选的(见第 6.2.3.4 节)。
- 如果检查了字节使能位规则,违规行为是一个与接收端口相关联的报告错误。