【PCIE】Device Control Register (Offset 08h)

DCR

Maximum Payload Size

“Maximum Payload Size”
(最大传输负载大小)是PCI Express设备控制寄存器中的一个位域,用于设置设备支持的最大传输负载的大小。

PCI Express使用数据包(Packet)来传输数据,而数据包由头部和有效载荷(Payload)组成。有效载荷是实际要传输的数据部分。最大传输负载大小定义了设备可以支持的最大有效载荷大小。

在"Maximum Payload Size Supported"(MPSS)位域中,[2:0]表示3个比特位,用于编码支持的最大传输负载大小的取值。通常情况下,可能的取值包括:

000: 128字节
001: 256字节
010: 512字节
011: 1024字节
100: 2048字节
101: 4096字节
这些取值表示设备最大支持的有效载荷大小。有效载荷大小的选择会影响PCI Express总线的传输性能和效率。较大的有效载荷大小可以提高带宽利用率和传输效率,但同时也会增加延迟。因此,在配置设备时,需要根据具体应用需求和系统性能要求来选择合适的最大传输负载大小。

请注意,每个设备对最大传输负载大小的支持是有限制的,系统中所有设备的最大传输负载大小应当保持一致,以确保正常的数据传输和兼容性

控制一个TLP可以传输的最大数据长度。作为接收方,必须能处理跟MPS设定大小相同的TLP数据包,作为传输方,不允许创建超过MPS设定的TLP数据包。

PCIe协议允许最大一个Payload可以到4K,但是规定了在整个传输路径上的所有Device,都必须使用相同的MPS设置,同时不能超过该路径上一个设备的MPS能力值。也就是说,MPS capability高的设备要迁就低的设备。以PCIe SSD来说,插到一块老掉牙的主板上(MPS只有128 Byte),你的Payload size再大,也是没有用的。

系统的MPS值设置是在上电以后的设备枚举配置阶段完成的, 以主板上的PCIe RC和PCIe SSD为例,他们都在Device Capability Register里声明自己能支持的各种MPS,OS的PCIe驱动侦测到他们各自的能力值,然后挑低的那个设置到两者的Device Control register中。

PCIe SSD自身的MPS capability则是在其PCIe core初始化阶段设置的。

Maximum Read Request Size

“Maximum Read Request Size”(最大读取请求大小)是PCI Express设备控制寄存器中的一个位域,用于设置设备支持的最大读取请求的大小。

在PCI Express总线上,系统主机可以向设备发送读取请求以获取数据。最大读取请求大小定义了设备可以支持的最大读取请求的数据量。

在"Maximum Read Request Size"(MRRS)位域中,[2:0]表示3个比特位,用于编码支持的最大读取请求大小的取值。通常情况下,可能的取值包括:

000: 128字节
001: 256字节
010: 512字节
011: 1024字节
100: 2048字节
101: 4096字节
这些取值表示设备最大支持的读取请求数据量。较大的读取请求大小可以提高数据传输效率和带宽利用率,因为更多的数据可以在一个请求中传输。然而,读取请求数据量过大也会增加总线传输的延迟。

在配置阶段,OS的PCIe驱动也会配置另外一个参数maximum read request size,用于控制一个Memory read的最大size,最大4K(以128 Byte为单位)
Read request size是可以大于MPS滴,比如给一个MPS=128 Byte的PCIe SSD发一个512 Byte的read request,PCIe SSD可以通过返回多个4个128 Byte的 Cpld,或者8个64 Byte的Cpld,完成这个request的响应。OS 层面可以通过控制PCIe SSD的maximum read request size参数,平衡多个PCIe SSD之间的吞吐量,避免系统带宽(总共40个lane)被某些个SSD霸占。

同时,Read request size也对PCIe SSD的Performance有影响,这个size太小,意味着同样的data,需要发送更多的request去获取,而read request的TLP是不带任何data payload的。

举例来说,要传64K的数据,如果read request=128 byte, 需要512个read TLP,512个TLP的浪费那是不小滴。

为了提高特别是大Block Size data的传输效率,尽量把read request size设的大一点,用更少的次数传递更多的数据,那是很好的。

猜你喜欢

转载自blog.csdn.net/qq_21688871/article/details/131679170