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
RCB(Read Completion Boundary)定义了一个存储器读请求需要多个存储器读完成报文响应时,完成报文数据地址对齐的边界。RC的RCB参数可以为64字节或者128字节,由硬件自身决定,系统软件可以通过配置空间获取这个值,其他PCIe设备固定为128字节。
RCB(Read Completion Boundary)定义在PCI Express Capability Structure的Link Control寄存器中,如下图所示,0表示64字节,1表示128字节,默认为64字节。对于RC只读属性,由硬件设置好,系统软件读取即可,硬件可设置为64字节或者128字节。对于Switch则没有意义,硬件设置为0。对于EP或者桥为读写属性,其主要反应RC的RCB值,当RC的RCB值为128字节,系统软件需要设置为128字节,使EP或者桥能更好的优化传输,提高传输效率,EP或者桥自身的RCB值固定为128字节。
如果存储器读请求只需要一个完成报文响应,则无需考虑RCB,数据长度不超过MPS即可;若需要多个完成报文响应,则需要考虑完成报文数据地址对齐的边界,即RCB,具体的规则如下:
- 第一个完成报文的数据结束地址必须对齐到RCB的整数倍。
- 中间完成报文的数据起始和结束地址必须对齐到RCB的整数倍。
- 最后一个完成报文的起始地址必须对齐到RCB的整数倍。
下面举几个例子进行说明:
- EP通过存储器读请求,读取RC的0x10000地址处的数据,数据长度为0xC0字节(192字节),RC的RCB为64字节。MPS和MRRS都为256字节。则RC的完成报文数据地址和长度有以下几种可能:
方式1 | 方式2 | 方式3 | 方式4 |
---|---|---|---|
0x10000-0x100BF:192 | 0x10000-0x1007F:128 | 0x10000-0x1003F:64 | 0x10000-0x1003F:64 |
– | 0x10080-0x100BF:64 | 0x10040-0x100BF:128 | 0x10040-0x1007F:64 |
– | – | 0x10080-0x100BF:64 |
- EP通过存储器读请求,读取RC的0x10000地址处的数据,数据长度为0xC0字节(192字节),RC的RCB为128字节。MPS和MRRS都为256字节。则RC的完成报文有以下几种可能:
方式1 | 方式2 |
---|---|
0x10000-0x100BF:192 | 0x10000-0x1007F:128 |
– | 0x10080-0x100BF:64 |
- EP通过存储器读请求,读取RC的0x10020地址处的数据,数据长度为0x100字节(256字节),RC的RCB为64字节。MPS和MRRS都为256字节。则RC的完成报文有以下几种可能:
方式1 | 方式2 | 方式3 | 方式4 | 方式5 | 方式6 |
---|---|---|---|---|---|
0x10020-0x1011F:256 | 0x10020-0x1003F:32 | 0x10020-0x1003F:32 | 0x10020-0x1003F:32 | 0x10020-0x1003F:32 | 0x10020-0x1003F:32 |
– | 0x10040-0x1011F:224 | 0x10040-0x1007F:64 | 0x10040-0x1007F:64 | 0x10040-0x1007F:64 | 0x10040-0x100BF:128 |
– | – | 0x10080-0x1011F:160 | 0x10080-0x100BF:64 | 0x10080-0x100BF:64 | 0x100C0-0x1011F:96 |
– | – | – | 0x100C0-0x1011F:96 | 0x100C0-0x100FF:64 | – |
– | – | – | – | 0x10100-0x1011F:32 | – |
方式7 | 方式8 | 方式9 | 方式10 | 方式11 | 方式12 |
---|---|---|---|---|---|
0x10020-0x1007F:96 | 0x10020-0x1007F:96 | 0x10020-0x1007F:96 | 0x10020-0x1007F:96 | 0x10020-0x100BF:160 | 0x10020-0x100FF:224 |
0x10080-0x1011F:160 | 0x10080-0x100FF:128 | 0x10080-0x100BF:64 | 0x10080-0x100BF:64 | 0x100C0-0x1011F:96 | 0x10100-0x1011F:32 |
– | 0x10100-0x1011F:32 | 0x100C0-0x1011F:96 | 0x100C0-0x100FF:64 | – | – |
– | – | – | 0x10100-0x1011F:32 | – | – |
- RC通过存储器读请求,读取EP的0x10020地址处的数据,数据长度为0x100字节(256字节),EP的RCB固定为128字节。MPS和MRRS都为256字节。则EP的完成报文有以下几种可能:
方式1 | 方式2 | 方式3 | 方式4 |
---|---|---|---|
0x10020-0x1011F:256 | 0x10020-0x1007F:96 | 0x10020-0x1007F:96 | 0x10020-0x100FF:224 |
– | 0x10080-0x1011F:160 | 0x10080-0x100FF:128 | 0x10100-0x1011F:32 |
– | – | 0x10100-0x1011F:32 | – |
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