2023-05-04
PCI桥与PCI设备的配置空间
#
每一个PCI设备中(包括PCI桥)都包含一个配置空间。这个配置空间由HOST主桥管理,而PCI桥可以转发来自HOST主桥的配置访问。
PCI设备的ID号由总线号(Bus Number)、设备号(Device Number)和功能号(Function Number)组成。
Bus号在HOST主桥遍历PCI总线树时确定。系统软件使用DFS算法扫描PCI总线树上的所有PCI总线,并依次进行编号。
Function号与PCI设备的具体设计有关。
X86处理器定义了两个I/O端口寄存器,分别为CONFIG_ADDRESS(0xCF8)和CONFIG_DATA(0xCFC),X86处理器使用这两个I/O端口访问PCI设备的配置空间。
PCI agent使用的配置空间如下图所示:
(这张图要从右往左看)Vendor ID代表PCI设备的生产厂商,Device ID代表这个厂商生产的具体设备。
Revision ID寄存器记录PCI设备的版本号。
Class Code寄存器记载PCI设备的分类,该寄存器由三个字段组成,分别是Base Class Code、Sub Class Code和Interface,其中Base Class Code将PCI设备分类为显卡、网卡、PCI桥等设备。当Base Class Code是0X06,Sub class code是0x04、interface寄存器为0x00时,表示当前的PCI设备是一个桥。
Header Type寄存器,第7位为1表示当前PCI设备是多Function设备,为0表示当前PCI设备是单Function设备,第0~6位表示当前PCI设备的类型,为0表示该设备使用PCI Agent设备的配置空间,为1表示使用PCI桥的配置空间。
Subsystem ID和Subsystem Vendor ID:用于区分设备,有些通过4个ID可以确定一个设备。
Expansion ROM base address寄存器:存放Option ROM程序的基地址。
Capabilities Pointer寄存器:该寄存器存放Capabilities寄存器组的基地址,所有的PCIe设备都要支持Power Management Capability结构和PCI Express Capability结构,所以通过改指针可以找到这两个capability的位置。
BAR寄存器保存PCI设备使用的地址空间的基地址。其中每一个设备最多可以有6个基地址空间。
PCI 桥的配置空间如下(图2-10)
PCI桥中只有两组BAR寄存器,这两组寄存器是可选的。如果PCI桥中不存在私有寄存器,可以不使用这两组寄存器设置BAR空间。
Primary Bus寄存器保存上游的PCI总线号,Subordinate Bus寄存器存放当前PCI子树中编号最大的PCI总线树,Secondary Bus寄存器存放当前PCI桥使用的总线号。一个PCI桥管理的PCI总线号在Secondary Bus ~ Subordinate Bus之间。这两个寄存器的值由系统软件遍历PCI总线树时设置。
I/O Limit和I/O Base寄存器:存放PCI子树中所有PCI设备使用的I/O地址空间的基地址和大小。
MemoryLimit和Memory Base寄存器:存放PCI子树中PCI设备使用的MMIO基址和大小。
Prefetchable Memory Limit和Prefetchable Memory Base:存放PCI子树中PCI设备使用的可预取MMIO基址和大小。
I/O Base Upper 16 Bits和I/O Limit Upper 16寄存器:如果PCI桥支持32位I/O端口,这组寄存器提供I/O端口的高16位地址。
读取slot capabilities
#
ep设备的SLOT号位于上一级桥的slot capabilities中,slot capabilities位于PCI Express Capability Structure中。PCI Express Capability Structure结构如下图,其Cap ID为0x10。
slot号位于slot capabilities的19~31位。
案例
#
下图硬盘的BDF为86:00.0,槽位号为37
其上一级桥的slot capabilities位置如下图,01 28 00 60
转换为二进制为0000 0001 0010 1000 0000 0000 0110 0000
,其中31~19位为0000 0001 0010 1
,将此二进制转为16进制为37。