浅析PCI配置空间

简介: 每个Function都有一个大小为4KB的configuration space。在系统上电的过程中,在枚举整个PCI Bus之后,就会将所有的BDF的configuration space读到Host内存中。在Host内存中有一个大小256MB的Memory Block, 专门用来存放所有的configuration space.

在PCIe的拓扑结构中,最多支持256个Bus, 每条Bus最多支持32个Device,每个Device最多支持8个Function,所以,由Bus:Device:Function(BDF)构成了每个Function的唯一的"身份证号". 如下图,一个简单的PCIe拓扑结构中BDF分布:


那么,这么多的Function,Host怎么知道他们具有什么本领?答案是,每个Function都有一个大小为4KB的configuration space。在系统上电的过程中,在枚举整个PCI Bus之后,就会将所有的BDF的configuration space读到Host内存中。在Host内存中有一个大小256MB的Memory Block, 专门用来存放所有的configuration space.

为什么是256MB?我们计算一下:256(Bus)*32(Dev)*8(Func)*4KB=64*1024*4KB=256MB.

其中,Host Bridge对应的是256MB Memory Block的起始地址,其他Bridge、Dev按照顺序往后排序。


那么, 问题又来了,每个Function对应的4KB configuration space长什么样子呢?如何解析?看下图:

从上图的4KB configuration space可以看到,主要有3部分构成:

  • Byte 0~63: 这64B代表的是PCI配置Header;
  • Byte 64~255: 这192B代表的是PCI Capability Structures,这部分会记录对应Function所具备的技能;
  • Byte 256~4095: 这3840B代表是PCIe扩展配置空间。

注:本文我们重点提一下前0~255B的内容,PCIe扩展空间不再展开阐述。


PCI配置Header具有固定的格式,主要有两种:Type0和Type1。Type0主要用于获取Endpoint的Configuration Space。Type1主要用于获取Switch或者Bridge的Configuration Space.


想要更进一步了解PCIe Endpoint或者Bridge所具备的技能(Capability),怎么办?方法如下:

(1) 检查PCI Header中Byte6 Bit[4] Capabilities List Bit是否置起来;

(2) 结合PCI Header的Byte[34] Capability Pointer寻址;

在每一个Capability Structure offset byte0代表这个Capability ID,offset byte1则指向下一个Capability Structure, 依次寻址,直至Capability Pointer=0. 如下图:

在PCI/PCIe系统中,总共定义了17种Capability ID(如下图),其实,在我们平时使用NVMe SSD过程中,主要关注4个就可以了:01,05,10,11.

Capability ID=01, Power Management Capability Structure定义如下:

Capability ID=05, MSI Capability Structure定义如下:

在PCIe总线中,MSI中断机制使用Memory Write TLP向处理提交中断请求。PCIe设备提交MSI中断请求时,需要向MSI Capability结构中的Message Address的地址写入Message Data数据。根据Address的长度(32位或者64位)以及是否Mask中断向量,MSI Capability结构分为四类如下图:

Capability ID=10, PCIe Capability Structure定义如下:

Capability ID=11, MSI-X Capability Structure定义如下:

MSI-X与MSI的机制基本相同,不过,MSI中断机制最多支持32个中断请求,并且要求中断向量连续。而MSI-X中断机制可以支持2048个中断请求,并且不要求中断向量连续。与MSI Capability寄存器相比,MSI-X Capability寄存器使用了一个数组存放Message Address字段和Message Data字段,而不是将这两个字段放入Capability寄存器中,这个数组称为MSI-X Table。所以,MSI-X Capability寄存器比MSI Capability寄存器要小,具体格式如下图,


了解了上面这些概念之后,在Linux系统下用lspci -xx/-xxx/-xxxx命令获取Configuration Space之后,我们就可以直接解析了. 在这里,请不要告诉我lspci -vvv命令可以直接读到Configuration Space解析之后的内容。我只想静静地自娱自乐!

(1) 先通过lspci命令读到Endpoint NVMe SSD对应的4KB configuration space前256B的内容(如下图)。其中,PCI Configuration Header Space采用Type 0。


注:Byte0~3代表了Device ID和Vendor ID,为了避免争议,我用AA,BB,CC , DD取代了原本内容。

(2) 根据前面介绍的定义,开始解析这个256B的内容:


相关文章
MOTOROLA MVME715P 允许PCI设备实现的最小存储空间
MOTOROLA MVME715P 允许PCI设备实现的最小存储空间
85 0
MOTOROLA MVME715P 允许PCI设备实现的最小存储空间
RK3399平台开发系列讲解(高速设备驱动篇)6.54、PCIe对PCI配置空间的扩展
RK3399平台开发系列讲解(高速设备驱动篇)6.54、PCIe对PCI配置空间的扩展
295 0
RK3399平台开发系列讲解(高速设备驱动篇)6.54、PCIe对PCI配置空间的扩展
RK3399平台开发系列讲解(PCI/PCI-E)5.53、PCIE RC侧 地址映射
RK3399平台开发系列讲解(PCI/PCI-E)5.53、PCIE RC侧 地址映射
163 0
RK3399平台开发系列讲解(PCI/PCI-E)5.53、PCIE RC侧 地址映射
|
编译器 Linux C语言
PCI配置空间简介
一、PCI配置空间简介 PCI有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCI所特有的一个物理空间。由于PCI支持设备即插即用,所以PCI设备不占用固定的内存地址空间或I/O地址空间,而是由操作系统决定其映射的基址。
2553 0
|
内存技术
2.1 存储器域与PCI总线域
<div class="bct fc05 fc11 nbw-blog ztag"> <div> <p style="TEXT-INDENT: 21pt;"><span lang="EN-US" xmllang="EN-US">HOST</span><span style="FONT-FAMILY: 宋体;">主桥的实现因处理器系统而异。</span><span lang="EN-US" x
2025 0
|
存储 测试技术
cgroup测试存储设备IOPS分配
1 使用:创建树并且attach子系统 首先要创建文件系统的挂载点作为树的根    mkdir /cgroup/name    mkdir /cgroup/cpu_and_mem Mount这个挂载点到一个或者多个子系统     mount -t cgroup -o subsyst...
1187 0
|
芯片 内存技术 索引
如何访问pcie整个4k的配置空间
<span style="font-size:18px">目前用于访问PCIe配置空间寄存器的方法需要追溯到原始的PCI规范。为了发起PCI总线配置周期,Intel实现的PCI规范使用IO空间的CF8h和CFCh来分别作为索引和数据寄存器,这种方法可以访问所有PCI设备的255 bytes配置寄存器。Intel Chipsets目前仍然支持这种访问PCI配置空间的方法。</span> <
5172 0