摘要:PCIE——第6章——PCIe总线的事务层
目录
第 6 章 PCIe 总线的事务层
6. 1 TLP 的格式
6. 1. 1 通用 TLP 头的 Fmt 字段和 Type 字段
6. 1. 2 TC 字段
6. 1. 3 Attr 字段
6. 1. 4 通用 TLP 头中的其他字段
6. 2 TLP 的路由
6. 2. 1 基于地址的路由
6. 2. 2 基于 ID 的路由
6. 2. 3 隐式路由
6. 3 存储器、 I / O 和配置读写请求 TLP
6. 3. 1 存储器读写请求 TLP
6. 3. 2 完成报文
6. 3. 3 配置读写请求TLP
6. 3. 4 消息请求报文
6. 3. 5 PCIe 总线的原子操作
6. 3. 6 TLP Processing Hint
2. Steering Tag
6. 4 TLP 中与数据负载相关的参数
总结
参考文章:
事务层是PCIe总线层次结构的最高层,该层次将接收 PCIe 设备核心层的数据请求,并将其转换为 PCIe 总线事务, PCIe 总线使用的这些总线事务在 TLP 头中定义。
Fmt[2:0]:表明了TPL大小(几个双字)、带不带数据、带不带prefix
Type:表示请求类型
TC 字段表示当前 TLP 的传送类型, PCIe 总线规定了 8 种传输类型, 分别为 TC0 ~ TC7, 缺省值为 TC0, 该字段与 PCIe 的 QoS 相关。(前面章节提到过TC,类比为货物;VC是运输货物)
Attr 字段由 3 位组成, 其中第 2 位表示该 TLP 是否支持 PCIe 总线的 ID⁃based Ordering;第 1 位表示是否支持 Relaxed Ordering; 而第 0 位表示该 TLP在经过 RC 到达存储器时, 是否需要进行 Cache 共享一致性处理。(传输的模式)
TH:TH 位为 1 表示当前 TLP 中含有 TPH (TLP Processing Hint) 信息
TLP 的发送端可以使用 TPH 信息, 通知接收端即将访问数据 的特性, 以便接收端合理地预读和管理数据
TD 位表示 TLP 中的 TLP Digest 是否有效, 为 1 表示有效, 为 0 表示无效。 而 EP 位表示 当前 TLP 中的数据是否有效, 为 1 表示无效, 为 0 表示有效。
AT 字段与 PCIe 总线的地址转换相关
Length 字段用来描述 TLP 的有效负载 (Data Payload) 大小
TLP 的路由是指 TLP 通过 Switch 或者 PCIe 桥片时采用哪条路径, 最终到达 EP 或者 RC 的方法。 PCIe 总线一共定义了三种路由方法, 分别是基于地址 (Address) 的路由, 基于 ID 的路由和隐式路由 ( Implicit) 方式
存储器和 I / O 读写请求 TLP 使用基于地址的路由方式, 这种方式使用 TLP 中的 Address 字段进行路由选径, 最终到达目的地。这节书中有举例。
而配置读写报文、 “Vendor_Defined Messages” 报文、 Cpl 和 CplD 报文使用基于 ID 的路 由方式, 这种方式使用 PCI 总线号㊁ ( Bus Number) 进行路由选径。 在 Switch 或者多端口 RC 的虚拟 PCI⁃to⁃PCI 桥配置空间中, 包含如何使用 PCI 总线号进行路由选径的信息。(使用 Bus Number、 Device Number 和 Function Number 进行路由寻址。)
隐式路由方式主要用于 Message 报文的传递。 在 PCIe 总线中定义了一系列消息报文, 包括 “ INTx Interrupt Signaling” , “ Power Management Messages” 和 “ Error Signal Messages” 等报文。 在这些报文中, 除了 “Vendor_Defined Messages” 报文, 其他所有消息报文都使用 隐式路由方式, 隐式路由方式是指从下游端口到上游端口进行数据传递的使用路由方式, 或 者用于 RC 向 EP 发出广播报文。
(1) 存储器读请求 TLP 和读完成 TLP
当 PCIe 主设备, RC 或者 EP, 访问目标设备的存储器空间时, 使用 Non⁃Posted 总线事 务向目标设备发出存储器读请求 TLP, 目标设备收到这个存储器读请求 TLP 后, 使用存储器 读完成 TLP, 主动向主设备传递数据。 当主设备收到目标设备的存储器读完成 TLP 后, 将完 成一次 DMA 读操作。
(2) 存储器写请求 TLP
在 PCIe 总线中, 存储器写使用 Posted 总线事务。 PCIe 主设备仅使用存储器写请求 TLP 即可完成 DMA 写操作, 主设备不需要目标设备的回应报文。
(3) 原子操作请求和完成报文
一个完整的原子操作由原子操作请求和原子操作 完成报文组成。有关原子操作的详细说明见第 6. 3. 5 节。
(4) I / O 读写请求 TLP 和读写完成 TLP
在 PCIe 总线中, I / O 读写操作使用 Non⁃Posted 总线事务, I / O 读写 TLP 都需要完成报文 做为回应。 只是在 I / O 写请求的完成报文中不需要 “带数据” , 而仅含有 I / O 写请求是否成 功的状态信息。
(5) 配置读写请求 TLP 和配置读写完成 TLP
从总线事务的角度上看, 配置读写请求操作的过程与 I / O 读写操作的过程类似。 配置读 写请求 TLP 都需要配置读写完成作为应答, 从而完成一个完成的配置读写操作。
(6) 消息报文
在 PCIe 总线中, 一些由 PCI 总线的边带信号完成的工作, 如中断请求和电源管理等, 在 PCIe 总线中由消息请求报文实现。
1. Length 字段
Length 字段表示需要从目 标设备数据区域读取的数据长度;
2. DW BE 字段
PCIe 总线以字节为基本单位进行数据传递, 但是 Length 字段以 DW 为最小单位。
一个字占用2个字节 即
1 Word = 2 个字节 Byte = 16 位 bit
一个双字 Dword 等于2个 字 Word 即
1 DWord = 2个字 Word = 4 个字节 Byte = 32 位 bit
3. Requester ID 字段
4. I / O 读写请求 TLP 的规则
I / O 读写请求 TLP 只能使用 32 位地址模式和基于地址的路由方式, 而且 I / O 读写请求 TLP 只能使用 Non⁃Posted 方式进 行传递。
完成报文一次最多能够传送的报文大小不能超过 Max_Payload_Size 参数。
1. Requester ID 和 Tag 字段
完成报文头的长度为 3DW, 完成报文头中包含 Transaction ID 信息, 由 Requester ID 和 Tag 字段组成, 这个 ID 必须与源 设备发送的数据请求报文的 Transaction ID 对应, 完成报文使用 Transaction ID 进行 ID 路由, 并将数据发送给源设备。
2. Completer ID 字段
该字段存放 “发送完成报 文” 的 PCIe 设备的 ID 号。 PCIe 设备进行数据请求时需要在 TLP 字段中包含 Requester ID 字 段; 而使用完成报文结束数据请求时, 需要提供 Completer ID 字段。
3. Status 字段
4. BCM 位与 Byte Count 字段
BCM ( Byte Count Modified)
当 PCI⁃X 设备进行存储器读请求时, 目标设备不一定一次就能将所有 数据传递给源设备。 此时目标设备在进行第一次数据传送时, 需要设置 Byte Count 字段 和 BCM 位。
5. Lower Address 字段
接收端必须使用存储器读完成 TLP 的 Low Address 字段, 识别一个 TLP 中包含数 据的起始地址。
PCIe 总线也支持两种配置请求报文, 分别为 Type 00h 和 Type 01h 配置请 求。 配置请求 TLP 的格式如图 6-12 所示。
● TC [2∶ 0] 必须为 0, I / O 请求报文的传送类型 (TC) 只能为 0。
● TH 位为保留位; Attr2 位为保留, 而 Attr [1∶ 0] 必须为 “00b” , 这表示 I / O 请求报 文使用 PCI 总线的强序数据传送模式; AT [1∶ 0] 必须为 “0b00” , 表示不进行地址 转换。
● Length [9∶ 0] 为 “0b00 0000 0001” , 表示配置读写请求最大 Payload 为 1DW。
● Last DW BE 字段为 “0b0000” 。 而 First DW BE 字段根据配置读写请求的大小设置。
PCIe 总线规定了以下几类消息报文。
● INTx 中断消息报文 ( INTx Interrupt Signaling)
● 电源管理消息报文 (Power Management)
● 错误消息报文 (Error Signaling)
● 锁定事务消息报文 (Locked Transaction Support)
● 插槽电源限制消息报文 ( Slot Power Limit Support)
● Vendor⁃Defined Messages
原子操作有利于提高智能设备㊀之间以及智能设备与处理器之间的数据传递效率。 当智 能设备与处理器进行数据交换时, 将不可避免地使用某种锁机制访问临界资源。
(1) 源设备向目标设备发送原子操作请求 TLP。 原子操作请求 TLP 使用 Non⁃Posted 方式 进行数据传递, 且使用基于地址的路由方式。
(2) 当目标设备收到这个原子操作请求 TLP 之后, 将从这个 TLP 指定的存储器空间中 读取原始数据。
(3) 目标设备将 “原始数据” 与 “原子操作请求 TLP 中包含的操作数” 进行某种规定 的运算后产生一个新的数据。 这一过程不可被其他总线事务中断, PCIe 设备保证这一过程 为原子操作。 这个步骤对于原子操作至关重要, 也是原子操作的实现要点。
(4) 当上述原子操作执行完毕后, 目标设备使用原子操作完成报文向源设备传送数据, 并将这个新的数据写入目标设备的存储器空间中。 原子操作完成报文与存储器读完成的传递 方式类似。
目前, PCIe 总线共支持 3 种原子操作, 分别为 FetchAdd、 Swap 和 CAS 原子操作。
当 TLP 的 TH 位为 1 时, 表示在当前 TLP 中包含 Processing Hint 字段,该字段的引入可以使目标设备根据源设备对数据的使用情况, 合理地 安排数据缓冲, 从而降低 PCIe 设备的访问延时, 并最大化地利用 PCIe 设备中的数据缓冲。
PH 字段提供的 Processing Hint 控制能力较弱,为此 PCIe 总线规范提供了一个 16 位的 ST ( Steering Tag) 字段。而对于存储器读请求 TLP, TH 位有效时 DW BE 字段被重新 定义为 ST [7∶ 0] 字段, 由于一些存储器读请求 TLP 仍然需要使用 DW BE 字段处理对界, 因此 ST 字段只能应用于不需要对界的存储器读请求 TLP。
ST 字段的主要目的是细分 TLP 的属性, 处理器系统可以使用该字段优化数 据缓冲, 减小数据访问延时。
在 PCIe 总线中, 有些 TLP 含有 Data Payload, 如存储器写请求、 存储器读完成 TLP 等。 在 PCIe 总线中, TLP 含有的 Data Payload 大小与 Max_Payload_Size、 Max_Read_Request_Size 和 RCB 参数相关。
本章重点介绍 PCIe 总线的事务层。 在 PCIe 总线层次结构中, 事务层最易理解, 同时也 与系统软件直接相关。 但是事务层的知识较为琐碎, 在第 12 章将结合一个 EP 的设计实例, 进一步说明 PCIe 总线事务层的具体实现机制。
PCI_Express_体系结构导读——王齐