1.概述
PCIe总线的存储器写请求、存储器读完成等TLP中含有数据负载,即Data Payload。Data Payload的长度和MPS(Max Payload Size)、MRRS(Max Read Request Size)和RCB(Read Completion Boundary)相关。
2.MPS
MPS(Max Payload Size)表示TLP报文中数据负载的长度。PCIe总线规MPS的最大值为4KB,但PCIe设备并不一定都能够按照最大长度发送数据负载。因此实际使用的MPS由链路两端的设备Function协商决定。当发送的数据长度超过MPS时,这段数据会被分割成多个TLP报文发送,若接收的TLP报文数据负载超过MPS,则接收端会认为这是一个非法的TLP。对于存储器读完成TLP报文,数据负载的长度也不能超过MPS,如果超过MPS,则需要发送多个读完成报文,同时也要满足RCB的要求。
在PCIe设备配置空间中,PCI Express Capability Structure中有两个寄存器,Device Capabilities寄存器记录了PCIe设备Function支持的MPS,Device Control寄存器保存主机设置的MPS。对于多Function的PCIe设备,每个Function的MPS可能不同。
Device Capabilities寄存器如下图所示,主机通过该寄存器获取当前PCIe设备Function的MPS大小。
Max_Payload_Size Supported的值和MPS对应关下如下:
取值 | MPS |
---|---|
000b | 128 bytes max payload size |
001b | 256 bytes max payload size |
010b | 512 bytes max payload size |
011b | 1024 bytes max payload size |
100b | 2048 bytes max payload size |
101b | 4096 bytes max payload size |
110b | Reserved |
111b | Reserved |
Device Control寄存器如下图所示,主机将协商好的MPS写入该该寄存器。实际使用的MPS通常是链路两端设备Function中最小的MPS。
在多数X86处理其系统的MCH或者ICH中,MPS参数为128B,而在PowerPC处理器系统中,MPS大多为256B。目前在大多数EP中,MPS参数不大于512B,因此很多RC的MPS也不大于512B。
MPS参数的大小与PCIe总线的传送效率成正比,MPS越大,带宽利用率越低,反之带宽利用率越高。MPS参数的大小与实时性成反比,MPS越大,某个Function占用总线的时间过长,导致实时性降低,反之实时性越高,对于实时性要求高的PCIe设备Function,MPS参数不应该设置的过大。
3.MRRS
MRRS(Max Read Request Size)参数决定了PCIe设备Function使用存储器读请求,一次能从目标设备读取多少数据,即PCIe设备Function的读请求TLP中的Lewngth字段不能超过MRRS。若PCIe设备Function使用存储器读请求读取的数据长度超过了MRRS,则需要发送多个存储器读请求TLP。PCIe总线规定MRRS最大值为4KB,通常情况下PCIe设备Function的MRRS都会小于这个值。
在PCIe设备配置空间中,PCI Express Capability Structure的Device Control寄存器用于设置MRRS。对于多Function的PCIe设备,每个Function的MRRS可能不同。若PCIe设备Function的Max_Read_Request_Size固定为128字节,则Max_Read_Request_Size位域可实现为只读,且值为000b。
Max_Read_Request_Size的值和MRRS对应关下如下:
取值 | MRRS |
---|---|
000b | 128 bytes maximum Read Request size |
001b | 256 bytes maximum Read Request size |
010b | 512 bytes maximum Read Request size |
011b | 1024 bytes maximum Read Request size |
100b | 2048 bytes maximum Read Request size |
101b | 4096 bytes maximum Read Request size |
110b | Reserved |
111b | Reserved |
MRRS和MPS没有关系,MPS描述的是TLP中数据负载的实际长度,而MRRS描述的是存储器读请求TLP需要读取的数据长度,此时TLP中没有有效数据,当返回存储器读完成报文时,数据负载的长度不能大于MPS。
4.RCB
在PCIe总线中,一个存储器读请求TLP需要使用一个或多个存储器读完成报文响应。
存储器读完成报文读取数据的地址若没有跨过RCB(Read Completion Boundary)参数定义的边界,则只需要一个完成报文。例如RC通过存储器读请求读取EP的0xFFFF0000-0xFFFF0010段内存数据,由于读取的内存数据地址没有超过RCB,所以EP只需要一个存储器读完成报文响应即可。
如果存储器读完成报文读取数据的地址跨过RCB(Read Completion Boundary)参数定义的边界,则需要一个或多个完成报文,遵循的原则如下:
- 如果读取数据起始地址和结束地址为RCB的整数倍,若读取长度小于等于MPS,则可以使用一个完成报文,若读取长度大于MPS,则需要使用多个完成报文,每个报文长度不超过MPS,起始地址和结束地址按RCB对齐。
- 若起始地址没有按RCB对齐,则需要先使用一个完成报文读取起始地址-RCB边界的数据。
- 若结束地址没有按RCB对齐,则需要额外使用一个完成报文读取RCB边界-结束地址的数据。
- 在2和3的情况下,中间的地址按RCB对齐,则按1的方法读取并返回完成报文。
例如RC通过存储器读请求读取EP的0xFFFEFFF0-0xFFFF00C7段内存数据,EP可以按如下方式进行组织:
方式1 | 方式2 | 方式3 |
---|---|---|
0xFFFEFFF0-0xFFFEFFFF | 0xFFFEFFF0-0xFFFEFFFF | 0xFFFEFFF0-0xFFFEFFFF |
0xFFFF0000-0xFFFF003F | 0xFFFF0000-0xFFFF007F | 0xFFFF0000-0xFFFF00C7 |
0xFFFF0040-0xFFFF007F | 0xFFFF0080-0xFFFF00C7 | |
0xFFFF0080-0xFFFF00BF | ||
0xFFFF00C0-0xFFFF00C7 |
RCB(Read Completion Boundary)定义在PCI Express Capability Structure的Link Control寄存器中,如下图所示,0表示64字节,1表示128字节,默认为64字节。对于Root Ports为只读属性,由硬件设置好,系统软件只需要读取即可。对于Switch Ports,没有意义,硬件设置为0。对于EP或者桥为读写属性,其上游的Root Ports的RCB值为128字节,系统软件需要设置为128字节,否则使用默认值。
5.应用
如下图所示,使用lspci命令,查看虚拟机里面PCIe桥的某个Root Ports的配置空间,可以看到MPS和MRRS都为128字节,RCB为64字节。
参考资料
- PCIEXPRESS体系结构导读
- PCI Express technology 3.0
- PCI Express® Base Specification Revision 5.0 Version 1.0