PCI Express

来自osdev
跳到导航 跳到搜索

这个页面正在建设中! 此页面或部分内容仍在改进中,因此可能还不完整。 其内容可能会在不久的将来更改。

PCI Express总线是一种向后兼容的高性能通用I/O互连总线,专为一系列计算平台设计。 与PCI本地总线相比,PCI Express的主要改进之一是它现在使用串行接口(与PCI使用的并行接口相比)。 这种改进可以与ATA接口的类似序列化进行比较。

PCI Express链接

PCI Express总线通过一对高速单向差分链路(分别为发送和接收)将每个设备直接连接到CPU和其他系统设备。 这些链路以2.5 GB/s的有效速率操作,并且单个设备可以具有多个链路。 单个设备可以具有x1、x2、x4、x8、x12、x16或x32链路,并且可以通过利用x32链路实现80 GB/s的最大带宽。

扩展配置空间

PCI Express总线将 配置空间 从256字节扩展到4096字节。 无法使用传统PCI方法(通过端口0xCF8和0xCFC)访问此扩展配置空间“”。 相反,提供了增强配置机制

但是,仍然可以使用后者访问PCIe设备的旧配置空间。

来自PCI配置空间的更改

表头类型 寄存器(偏移量) 比特位置 差异
All Headers Command Register (0x04) 3 Special Cycle Enable:不适用于PCIe。硬连线到0。
4 Memory Write and Invalidate: 不适用于PCIe。硬连线至0。
5 VGA Palette Snoop: 不适用于PCIe。硬连线为0。
7 IDSEL Stepping/Wait Cycle Control: 不适用于PCIe。硬连线到0。
9 Fast Back-to-Back Transactions Enable: 不适用于PCIe。硬连线至0。
Status Register (0x06) 4 Capabilities List: 需要所有PCIe设备来实现能力结构。硬连线到1。
5 66 MHz Capable: 不适用于PCIe。硬连线到0。
7 Fast Back-to-Back Transactions Capable: 不适用于PCIe。硬连线至0。
10:9 DEVSEL Timing: 不适用于PCIe。硬连线为0。
Cache Line Size Register (0x0C) All Bits 仅用于遗留用途。
Master Latency Timer Register (0x0D) All Bits 不适用于PCIe。硬连线至0。
Type 0 Base Address Registers (0x10:0x24) All Bits PCIe端点设备必须在范围不包含具有读取副作用的内存或内存不允许写入合并的情况下设置该BAR的可预取位。 非遗留端点设备必须支持64位寻址。 请求的最小内存地址范围为BAR 128字节。
Min_Gnt/Max_Lat Registers (0x3E:0x3F) All Bits 不适用于PCIe。硬连线为0。
Type 1 Base Address Registers (0x10:0x24) All Bits PCIe端点设备必须在范围不包含具有读取副作用的内存或内存不允许写入合并的情况下设置BAR的可预取位。 非遗留端点设备必须支持64位寻址。 请求的最小内存地址范围为BAR 128字节。
Primary Bus Number (0x18) All Bits 仅为遗留目的实现。
Secondary Latency Timer (0x1B) All Bits 不适用于PCIe。硬连线为0。
Secondary Status Register (0x1E) 5 支持66 MHz:不适用于PCIe。硬连线到0。
7 Fast Back-to-Back Transactions Capable: 不适用于PCIe。硬连线为0。
10:9 DEVSEL Timing: 不适用于PCIe。硬连线到0。
Prefetchable Memory Base/Limit (0x24) All Bits 必须表示支持64位地址。
Bridge Control Register (0x3E) 5 Master Abort Mode: 不适用于PCIe。硬连线为0。
7 Fast Back-to-Back Transactions Enable: 不适用于PCIe。硬连线至0。
8 Primary Discard Timer: 不适用于PCIe。硬连线到0。
9 Secondary Discard Timer: 不适用于PCIe。硬连线为0。
10 Discard Timer Status: 不适用于PCIe。硬连线至0。
11 Discard Timer SERR# Enable: 不适用于PCIe。硬连线到0。

扩展PCI总线编号

PCI的旧版本(如“PCI Conventional”)最多限制为256个PCI总线段。 PCI Express通过引入“PCI Segment Groups”扩展了这一点,其中系统(理论上)可以具有多达65536个PCI段组,每个组具有256PCI总线段,从而允许单个计算机最多具有2个24(16777216)个PCI总线段。

PCI段组被编号,并且在大多数系统中只有一个PCI段组 (PCI段组编号为0)。 请注意,传统PCI配置空间访问机制#1(为了向后兼容而仍然存在)没有“PCI段组”字段,因此只能用于访问PCI段组号为0的PCI配置空间。 必须使用#增强配置机制访问其他PCI段组中任何设备的PCI配置空间。

增强配置机制

增强的配置机制利用内存映射的地址空间范围来访问PCI配置空间。 简而言之,内存地址决定了被访问的段组,总线,设备,功能和寄存器。 在x86和x64平台上,每个内存区域的地址由ACPI“MCFG”表确定。 此ACPI表的格式为:

偏移 长度 描述
0 4 表签名(“MCFG”)
4 4 表长,单位为字节
8 1 Revision (1)
9 1 校验和 (表中所有字节的总和 & 0xFF = 0)
10 6 OEM ID(与其他ACPI表格的含义相同)
16 8 OEM表ID(厂家型号ID)
24 4 OEM改版 (与其他ACPI表意义相同)
28 4 创建者ID(与其他ACPI表的含义相同)
32 4 创建者修订版(含义与其他ACPI表相同)
36 8 Reserved
44 + (16 * n) 16 配置空间基址分配结构。每个结构使用以下格式:
偏移 长度 描述
0 8 增强配置机制的基址
8 2 PCI网段组号
10 1 启动此主机桥解码的PCI总线号
11 1 结束此主机网桥解码的PCI总线号
12 4 预留

对于非x86系统,方法各不相同,但是通常系统为自己提供在运行时解析的设备树。

要访问设备PCI配置空间内的特定寄存器,必须使用设备的PCI段组和总线来确定要使用哪个内存映射PCI配置空间区域,并获取该内存映射区域的起始物理地址和起始总线号。 获得该内存映射区域的正确起始物理地址和起始总线编号后,你可以使用以下公式来确定函数的PCI配置空间的(4096字节)区域的位置: Physical_Address = MMIO_Starting_Physical_Address + ((Bus - MMIO_Starting_Bus) << 20 | Device << 15 | Function << 12).

请注意,确定 “此函数的PCI配置空间的物理地址” 作为PCI枚举的一部分可能是一个好主意,并将此物理地址与用于管理PCI设备和驱动程序的任何其他信息一起存储 (例如,在设备信息的“设备管理器”层次结构树中)。

还要注意的是,对于绝对最大值(具有65536个PCI段组和每个段组256个总线段),内存映射的PCI配置空间范围消耗的物理地址空间量将是(最多)16TiB(或244字节); 并且ACPI的 “MCFG” 表 (在理论上) 可以略大于256 MiB (每个PCI段组内的每个单独PCI总线的16字节条目加上36字节表头)。

访问空间内的特定设备可以如下所示: (((bus * 256) + (slot * 8) + func) * 4096) + offs (每个设备描述符为4096字节或4k长整型), 因此,前者可以解释为以下类型的数组: ((pcie_ecam[bus][slot][func] * 4096) + offs).

查找设备可以与PCI相同,不同之处在于内核访问内存区域而不是使用CPU I/O。

另见

参考资料

  • PCI Express Base Specification, revision 1.1, PCI Special Interest Group, March 28, 2005