基于PCIE配置空间深入了解MaxPayloadSize

MaxPayloadSize介绍

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

PCIE配置空间中的MaxPayloadSize

PCI有三个相互独立的物理地址空间:memory地址空间、I/O地址空间和配置空间。这三个地址空间都是采用唯一的地址进行寻址,比如我们使用地址0x100时需要指定这个地址在哪个地址空间(配置空间,I/O地址空间和memory地址空间的0x100偏移,对应的是不同的存储位置)。
PCIe设备的每一个功能(function)都对应一个独立的配置空间, pcie的配置空间布局如下图:
在这里插入图片描述
如上图所示,pci的配置空间是256字节,其中64字节是标准配置空间header, 后面的192字节是Capability结构, 展示pci能提供的能力。 为了兼容PCI,PCIe的配置空间前256字节与PCI保持一致,256~4096字节是pcie 扩展配置空间,包含pcie的扩展能力如AER。
其中MaxPayloadSize就在Capability结构中,如何查找到MaxPayloadSize?如下图为一个ep设备的64字节标准配置空间,其中偏移第34字节位置为Capability Pointer寄存器,通过此指针可以找到Capability部分。
在这里插入图片描述
标准配置空间header
Capbility Pointer寄存器: PCI capbility的地址偏移, capbility用于表示pci设备支持的能力。该寄存器存放Capabilities 结构链表的头指针。在一个PCIe 设备中,可能含有多个Capability 结构,这些寄存器组成一个链表:
在这里插入图片描述
Capbility结构组成如下图(这里个人理解并不是所有的Capbility都是下图的组成,只有Cap ID为0x10时才是下图的组成,因为每个Capbility所占的字节数并不相同,而且所包含的信息也不相同,具体应该要查协议),其中与MaxPayloadSize相关的寄存器有Device Capabilities和Device Control两个寄存器。
在这里插入图片描述
Device Capability 寄存器:
该寄存器的第 2:0 字段为 “ Max_Payload_Size Supported” 字段, 该字段存放该设备支持的 Max_Payload_Size 参数的大小, 该字段只读,具体含义如下图。这里需要注意此值仅表示该设备可以使用的最大值并不是实际使用的值,实际使用的值在Device Control 寄存器中。
在这里插入图片描述
PCIe 设备支持的 Max_Payload_Size
Device Control 寄存器:
该寄存器的第7:5字段为Max_Payload_Size的值,该字段是可读写的,此值为链路两端的 PCIe 设备进行协商后确定使用的实际值。该寄存器 的具体含义如下图。
在这里插入图片描述

系统下配置空间的查看与设置

常用命令:

lspci -tv//查看pcie树
lspci -vvv -s [B:D.S] //查看具体设备的详细信息
lspci -xxx -s [B:D.S] //查看设备的整个配置空间,-x查看前64B,-xxx查看前256B,-xxxx查看4K
setpci -s 00:00.0 0x地址.W=0x值 //修改设备配置空间值,L4个字节,W2个字节,B一个字节
setpci -s 03:00.0 CAP_EXP+08.W=0x值 //CAP_EXP代表Cap ID为0x10的能力结构偏移,其中配置空间的各个属性偏移代表名字,可用setpci --dumpregs命令查看。

通过具体设备深入了解配置空间

如下图中12:00.0为pcie转usb的卡,下面就以此设备为例了解配置空间。
在这里插入图片描述
查看此设备的详细配置空间,如下图所示。在标准配置空间的0x34偏移处描述的为第一个Capbility结构的指针,通过此指针可以依次往下排查,一直找到Cap ID为0x10的Capbility。查找过程如下图中的紫色框(三列数据),第一列为配置空间的偏移,第二列为Cap ID,第三列为下一个Capbility的偏移。
下图中的粗蓝色框部分为Cap ID为0x10的Capbility,可看到Device Capability 寄存器的值为0x00008fc0(bit[2:0]为0b000),Device Control 寄存器的值为0x0800(bit[7:5]为0b000)。所以Max_Payload_Size Supported值为128B,Max_Payload_Size值为128字节。
通过此方法,不仅可以找到MaxPayloadSize也可以找到链路的链接状态等,在此就不赘述了。
在这里插入图片描述
直接查看解析出的设备信息,发现各个Capbility的偏移以及Max_Payload_Size的值与上述的分析一致。
在这里插入图片描述

修改设备的MaxPayloadSize

在平时设备的使用过程中,有可能遇到过数据通信错误(malformed tlp), 或者网卡/磁盘在进行数据读写时性能没有达到预期,这些都可能和pcie 的max payload size配置有关系。
注意:只能修改配置空间中Device Control 寄存器中MaxPayloadSize的值,不能修改Device Capability 寄存器中MaxPayloadSize的值,因为Device Capability 寄存器中MaxPayloadSize字段是只读的。

方法1:手动修改配置空间中Device Control寄存器

还是以上面的pcie转usb的卡为例,修改MaxPayloadSize值为256字节,即将Device Control寄存器的bit[7:5]改为0b001。修改后的结果如下图所示,其实只修改此设备的MaxPayloadSize是无法生效的,需要设置整条pcie链路上面的节点,非常繁琐,有时候设置也不生效,这个也是和硬件支持的能力相关联,所以有了下面的方法2。
在这里插入图片描述

方法2:修改grub(建议使用此方法)

在grub文件中添加pci=pcie_bus_perf参数,会自动将整个链路上的MaxPayloadSize值根据设备所支持的值调整为最大。

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PCIe配置空间寄存器是PCI Express总线设备中的一种特殊类型的寄存器,用于配置和管理设备的功能和属性。每个PCIe设备都有一个配置空间,该空间包含了设备的配置信息和功能寄存器,这些信息和寄存器可以被系统软件读取和写入,用于进行设备的初始化和控制。 配置空间寄存器使用了标准的PCI配置空间寄存器格式,包括设备ID、供应商ID、命令和状态寄存器等。通过读取和设置这些寄存器的值,系统软件可以访问和控制PCIe设备的各种功能。 配置空间寄存器的结构和布局是由PCIe规范定义的,包含了设备的通用配置数据、功能寄存器和扩展配置区域。其中通用配置数据包括了设备的基本信息,如设备类型、供应商标识、设备标识等。功能寄存器用于控制和管理设备的功能,如启用或禁用设备、设置中断和总线驱动程序等。扩展配置区域用于存储设备特定的配置信息,各个设备的扩展配置区域的结构和内容是不同的,由设备厂商自行定义。 系统软件可以通过访问PCIe配置空间寄存器来获取设备的配置信息,如设备名称、设备类型、硬件ID等,还可以进行设备的初始化和配置,如设定中断线路、分配资源等。一般情况下,操作系统和驱动程序会使用配置空间寄存器来与PCIe设备进行通信和管理,以实现设备的正常工作和使用。 总之,PCIe配置空间寄存器是PCI Express总线设备中用于配置和管理设备的一种寄存器,通过读取和设置其中的值,系统软件可以访问和控制设备的各种功能。这些配置空间寄存器的结构和布局是由PCIe规范定义的,不同设备的配置信息和功能也各不相同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值