PCIe学习笔记之Max payload

基本

1.1 什么是max payload size

我们都知道,PCIe设备是以TLP的形式发送报文的,而max payload size(简称mps)决定了pcie设备实际使用的tlp能够传输的最大字节数。mps的大小是由PCIe链路两端的设备协商决定的,PCIe设备发送TLP时,其最大payload不能超过mps的值。

mps定义在Device control register中。

知识点实同样定义在该寄存器中还有一个Max read request size(简称mrrs)配置,它表示每一个读请求所能够读到的最大字节数。当PCIe设备发送memory读请求TLP时,该TLP所请求的数据的大小不能超过mrrs的值。

1.2 max payload size的作用

pice协议规定有数据的TLP包的传递规则是:按照指定DW长度单位传递数据,发送端的数据承载量不得超过“Device Control Register”中的“Max_Payload_Size”数值,接收端中,所接收到的数据量也不能超过接收端“Device Control Register”中的“Max_Payload_Size”数值。

所以mps主要的作用是:

(1) mps的大小影响pcie设备的传输效率。 对于比较大的数据量,如果mps设置比较小,那么数据只能被分割成多个TLP进行发送,势必会影响pcie链路带宽的利用率。但是mps的值也不是越大越好,一方面mps设置的越大,硬件处理数据包所需的内存和逻辑量也随之增加; 另一方面,mps的值是一个自协商的结果,当前市场上支持较大mps值的ep设备不常见,所以没有必要设置本端的mps值太大。

(2) 不合理的mps设置会导致数据通信时上报"Malformed TLP"错误。 RC设备在与EP设备对接时,对端的EP设备的MPS可能各不相同,需要RC端去适配EP端的mps, 如果EP设备接收的TLP length字段超过了它的mps配置,该设备就会认为该TLP非法。

1.3 mrrs 对mps的影响

mrrs和mps并没有直接的联系,但是有时候mrrs会对mps有影响。

举个例子:一个典型的pcie拓扑结构, 中间的红色数字mps的值。

假设发起一个memory tlp读请求操作:

根据上文的分析,这种情况下,RC和EP的通信会失败,因为他们的mps的值不相等。

但是如果设置各个节点的mrrs的值为128B,那么虽然RC设备的mps为256B,但是实际能够传输的大小却受到mrrs的影响,变成128B,这种情况下,实际上传输的TLP报文最终是128字节,可以满足各节点mps一致的条件,可以传输成功。

总结: mrrs的值不能设置的太小,一方面,如果mrrs设置太小,会影响实际TLP的mps。另一方面,如果我们设定MRRS为128B,我们读64KB数据时,就需要发送512(64KB/128B=512)次读请求,这样的话,就增加了很多额外的开销,对数据传输速率也是一种伤害,所以,为了提高特别是大Block Size data的传输效率,尽量把mrrs设的大一点,用更少的次数传递更多的数据。但是mrrs也不能设置过大,在PCIe链路中,我们不能一直发送TLP,而是需要接受端有足够的接受空间之后,才能继续发送TLP,buffer空间太大的话对于EP的设备而言是比较苛刻的,所以在实际的设计中,也会对mrrs的大小进行限制。

Device Control寄存器位于PCI express capability结构里,对应的capability id 为0x10(#define PCI_CAP_ID_EXP 0x10 /* PCI Express */)。

[root@localhost linux]# lspci -s 00:18.0 -xxx

00:18.0 PCI bridge: VMware PCI Express Root Port (rev 01)

00: ad 15 a0 07 07 00 10 00 01 00 04 06 08 00 81 00

10: 00 00 00 00 00 00 00 00 00 1b 1b 00 70 70 00 00

20: 10 fd 10 fd 71 e7 71 e7 00 00 00 00 00 00 00 00

查看lspci结果, 可以看出偏移0x20的位置对应的capability id为0x10, 所以device control register的偏移是0x20 + 0x8。

查看device control register的值:

[root@localhost linux]# setpci -s 00:18.0 0x28.W

1b00

或者使用CAP_EXP(对应的是pcie express capability的偏移)

[root@localhost linux]# setpci -s 00:18.0 CAP_EXP+08.W

0000

可以看出device control register的值为0, 该寄存器【14:12】是mrrs, [7:5]是mps, 所以mps和mrrs都是0, 对应的正好是128B。

0101 0111

bit[2:0]        max payload size or max read request size

000        128B

001        256B

010        512B

011        1024B

100        2048B

101        4096B

设置mps和mrrs的大小为256B,即【14:12】=0x1, [7:5]=0x1

setpci -s 00:18.0 CAP_EXP+08.W=0x2020

1

[root@localhost linux]# lspci -s 00:18.0 -vvv

00:18.0 PCI bridge: VMware PCI Express Root Port (rev 01) (prog-if 00 [Normal decode])

Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B-

Capabilities: [50] Express (v2) Root Port (Slot+), MSI 00

DevCap:        MaxPayload 256 bytes, PhantFunc 0

ExtTag- RBE-

DevCtl:        Report errors: Correctable- Non-Fatal- Fatal- Unsupported-

RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-

MaxPayload 256 bytes, MaxReadReq 256 bytes

mps和mrrs的值成功设置为256byte. (有时候设置会不生效,这个也是和硬件支持的能力相关联)

3.1 mps的配置类型

在linux内核中,当前有四种配置mps的类型,定义在include/linux/pci.h中

enum pcie_bus_config_types {

        PCIE_BUS_TUNE_OFF,      /* Don't touch MPS at all */

        PCIE_BUS_SAFE,          /* Use largest MPS boot-time devices support */

        PCIE_BUS_PERFORMANCE,   /* Use MPS and MRRS for best performance */

        PCIE_BUS_PEER2PEER,     /* Set MPS = 128 for all devices */

};

PCIE_BUS_TUNE_OFF: 不对PCIe MPS(Max Payload Size)进行调整,而是使用BIOS配置好的默认值。

PCIE_BUS_SAFE: 将每个设备的MPS都设为root complex下所有设备支持的MPS中的最大值。 指的是设置最小的那个设备的mps为所有设备的mps。

PCIE_BUS_PERFORMANCE: 将设备的MPS设为其上级总线允许的最大MPS,同时将MRRS(Max Read Request Size)设为能支持的最大值(但不能大于设备或总线所支持的MPS值)

PCIE_BUS_PEER2PEER: 所有的设备的MPS都设置为128B,以确保支持所有设备之间的点对点DMA,同时也能保证热插入(hot-added)设备能够正常工作,但代价是可能会造成性能损失。

1.相关问题:系统下设置Maxpay Load 128 导致系统hang机

解决方案:设置BIFPx00000040 (PCIEP_PORT_CNTL) 寄存器bit[16:17]=0,使用Device  Control register MPS,然后设置设备和root端MPS正常生效

模基本知在识点式实模式阿事实上萨断电断电

w

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小菜鸟-BIOS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值