1,PCIe的配置空间

PCIe每个Function都存在4K的配置空间,4K空间中前256 Byte(0x00 ~ 0xff)是与PCI 兼容的寄存器。256 Byte的前64 Byte(0x00 ~ 0x3f)就是PCI Header,可以分为Type0 和Type1 两种类型。

Bios配置pciex1供电 pcie供电设置_PCIe能力寄存器空间

对于RC的port和 SW的port,PCI Header都是Type1

对于EP,PCI Header是Type0

Bios配置pciex1供电 pcie供电设置_PCIe能力寄存器空间_02

PCIe的4K配置寄存器的前64 Byte寄存器(PCI Header)的两种类型分别如下图所示。其中有部分寄存器是一样的,有些寄存器是不一样的。

Bios配置pciex1供电 pcie供电设置_Bios配置pciex1供电_03

2,PCIe能力寄存器空间(0x40 ~ 0xff)

配置空间中,除了PCI Header,还存在很多描述PCIe相关能力的寄存器,这些寄存器在0x40 ~ 0xff中实现,这一段空间称为PCIe能力寄存器空间,此处可以由用户实施很多的PCIe能力,常见的有PM能力寄存器、MSI能力寄存器、PCIe Capability Structure(PCIe 设备必须有)。

能力寄存器在PCIe Capability Register Space中以链表的形式分布。在Status寄存器的bit[4]可以表示是否实施了PCIe相关的能力寄存器,因为PCIe设备必须实施PCIe Capability Structure,所以这一比特必须是1。

Bios配置pciex1供电 pcie供电设置_PCIe能力寄存器空间_04

Bios配置pciex1供电 pcie供电设置_扩展能力寄存器空间_05

PCIe能力寄存器空间实施了一些能力,第一个能力的寄存器地址偏移信息保存在Capabilities Pointer寄存器中。

Bios配置pciex1供电 pcie供电设置_PCIe配置空间_06

Capabilities Pointer共8 bit,正好可以在0xff(PCIe能力寄存器空间)这个地址范围内寻址。每一个PCIe能力寄存器块的第一行寄存器格式都是类似的。

Bios配置pciex1供电 pcie供电设置_Bios配置pciex1供电_07

        Capability ID:表示是什么种类的PCIe能力

        Next Pointer:下一个能力的偏移地址。如果为0x00,则表示结束,没有下一个能力寄存器块了。

        Message Control:该能力的一些特殊寄存器

整个链表通过Capabilities Pointer为起点,一直找到Next Pointer寄存器为0x00结束。

Bios配置pciex1供电 pcie供电设置_PCIe配置空间_08

3,PCIe扩展能力寄存器空间(0x100~0xfff)

有一些PCIe扩展能力寄存器定义在配置空间的0x100 ~ 0xfff 段,即在PCIe Extend Configuration Space里。这里定义的各种扩展能力也是以链表的形式分布,只不过第一个扩展能力寄存器就在0x100位置。每一个扩展能力寄存器的第一排寄存器格式类似,如下图所示。

Bios配置pciex1供电 pcie供电设置_扩展能力寄存器空间_09

        PCIe Extend Capability ID:用来区分是什么扩展能力

        Capability Version:版本信息

        Next Capability Offset:下一个扩展能力寄存器的偏移地址。该地址为12 比特,寻址范围为4K内,故可以在0x100 ~ 0xfff地址之间正确寻址。如果为0x000,则表示结束了。