PCIe系列第四讲、存储器、配置、IO读写请求和原子操作、消息报文

作者:叫什么好呢啊,文章来源:根究FPGA微信公众号

本文将着重讲述TLP的存储器、配置、IO读写请求和原子操作、消息报文几种操作请求,其中主要从其结构和特点进行分析。

存储器读写请求TLP
存储器读请求:non-posted类型读请求,主设备接收到目标设备返回的读完成TLP后,一次存储器读请求完成。

存储器写请求:posted类型事务,主设备(RC、EP)发出存储器写请求TLP给存储器。

存储器读写请求使用地址路由方式进行数据传递,该类TLP头中的Address字段分为32位和64位地址两种类型,在存储器读写请求的byte8~byte11或者byte8~byte15(byte8~byte11存放高[63:32]位)中存放地址数据

DATA BE
字节有效字段,位于byte7。

PCIe总线以字节为单位进行数据传输,但是length中以DW为单位,为此使用DATA BE进行字节使能,为1表示对应的字节有效。

Last DATA BE与First DATA BE的使用规则
1、 传输的数据长度小于1个DW,则仅使用First DATA BE,Last Data BE为全0。First Data BE内允许有不连续的0、1位,PCIe总线允许发送一个DW的第1、3字节或者0,2字节。

2、 传输的数据长度在2DW内时,允许有不连续的0、1位。

3、 传输的数据长度大于等于3DW时,First Data BE和Last Data BE不允许有不连续的0、1位。

zero_length
在length字段中曾提到过请求数据长度或者当前数据报文数据负载为0~1024DW,在length为0时候表示请求的数据长度为1024DW,那么何时才是0?

使用zero-length,该请求时length为1,Fisrt Data Be和Last Data BE为全0,此时表示这个存储器读请求TLP对应的读完成TLP中不包含任何有效数据。

“zero-length”的引入是为了实现“读刷新”操作,该操作的主要目的是为了保证之前的存储器写请求报文,到达最终的目的地,与“zero-length”对应的读完成包文中不含有任何数据负载 ,从而提高了PCIe链路的利用率。

在PCIe总线中,进行存储器写请求时,存储器不会返回存储器写完成报文,此时使用“zero_length”存储器读请求进行“读刷新”,向目标设备进行存储器读操作来保证存储器写到达最终的目的地。

如果一个存储器写请求TLP报文的TH为1时,DW BE字段将被重新置为ST[7:0]字段。

Request ID字段
Request ID字段包含生成这个TLP报文的Bus Number[7:0]、Device Number[4:0]、Function Number[2:0],因为存储器写请求并不需要返回完成报文,所以其实存储器写请求并不需要RequestID,但是仍予以保留。

Request ID={BusNumber,Device Number,Function Number}

对于non-posted类型的请求如存储器读请求、配置读写请求、IO读写请求中,除了RequestID字段还需要Tag字段,Request ID字段和Tag字段合称为Transaction ID。

TransactionID={Request ID,Tag};

Transaction ID的作用是使接收端分析报文的Transaction ID,确认报文到达的最终目的地。

对于non-posted类型的请求,在未收到目标设备的完成报文之前,TLP的发送端需要保存这个TransactionID(Tag字段),此时设备的设备的Tag字段不能再次被使用,直到一次数据传输结束,即数据发送端收齐与该TLP对应的所有报文。

在同一段时间内,在当前的PCI总线域中不能存在两个及以上的Transaction ID相同存储器读请求。

Tag字段
Tag字段的长度决定了发送能暂存多少个同类型的TLP,Tag字段为5时,发送端能够暂存32个同类型的报文。

IO 读写 TLP
non-posted类型事务,IO写请求会返回一个IO写完成事务,该事务包标志着IO写操作是否完成。

IO读写请求只能使用32位的地址路由。

IO请求的TC[2:0]字段必须为0.

Attr[1:0]为2’b00,使用强序数据传送模式,硬件保证其传送的数据与Cache一致。

AT[1:0]为00,不支持地址转换。

Length字段为1,IO读写的最大数据的payload为1DW(Last DataBE=0000),该类TLP不支持突发传送。

完 成 报 文
完成报文使用基于ID的路由方式。

Request ID和Tag字段
与源设备中的Transaction ID对应,完成报文使用Transaction ID进行ID路由,并将数据发送给源设备。

Completer ID字段
存放发送完成报文的PCIe设备的ID号。

Status字段
保存当前完成报文的状态,表示正确将数据传送给数据请求方、请求数据请求方重传、传输过程中发生错误的状态。

配 置 读 写 TLP
1、 配置读写请求由RC发起;

2、 使用强序数据传送模式;

3、 基于ID路由

4、 使用tpye00(EP)与type01(PCI桥)两种配置类型

5、 配置读写长度最大为1DW(Length字段为1,Last Data BE字段为0,First字段中可有效byte 0,2或1,3)

消息请求报文
消息请求事务包,例如:电源管理、中断信息。

1、 使用隐式路由

2、 Message Code中存放消息代码:

(1)、INTx中断消息报文

(2)、电源管理报文

(3)、锁定事务报文

(4)、插槽电源限制报文

(5)、Vendor-Defined Message厂商定义报文

INTx中断报文
PCIe总线推荐设备使用MSI与MSI-X机制提交中断请求。

PCIe设备可以使用Legacy中断方式提交中断请求,此时需要使用INTx中断信息向RC通知中断事件。

对挂载在PCIe桥片上的PCI设备可能不支持MSI中断机制,因此需要使用INTx中断信号提交中断请求,PCIe桥将INTx信号转换为INTx中断信息报文,并向RC提交中断请求。

当PCIe设备不使用MSI报文向RC提交中断请求时,可以使用Assert_INTx向处理器系统提交中断请求,当中断处理完毕,再使用Deassert_INTx报文结束接收到的中断消息报文。(虚拟中断线方式)

错误消息报文
PCIe设备规定了两大类错误类型,分别是可修复错误(correctable error)和不可修复错误(uncorrectable error),其中不可修复错误又分为致命错误(fatal error)和非致命错误(unfatal error),当PCIe设备出现这些错误时将向Root Complex或者RC event Controller发送这些错误消息报文,在接收到这些错误消息报文后,相应的中断服务程序将统一处理PCIe设备的错误信息。

原 子 操 作
Non-posted类型事务,仅能在存储器访问中使用。

PCIe总线支持三类原子操作,分别是EP-to-EP,EP-to-RC,RC-to-EP三种。

原子操作使用基于地址的路由方式,指的是PCIe设备“读取原始数据”、运算、产生新数据三个过程不可被其他操作打断。

推荐阅读