4. PCIe配置空间:配置空间头部(Type0/Type1)、能力结构链表、扩展配置空间(4KB)
PCIe配置空间是软件(BIOS、OS、驱动程序)发现、识别和控制PCIe设备的基础数据结构。与传统的PCI配置空间(256字节)不同,PCIe将配置空间扩展至4KB(4096字节),并引入了能力结构链表和扩展能力结构,以满足高速串行总线对电源管理、错误报告、虚拟化等高级特性的需求。
4.1 配置空间整体布局(4KB)
PCIe配置空间分为两个主要区域:前256字节(兼容PCI规范)和扩展配置空间(256~4095字节)。前256字节包含配置空间头部(Type 0或Type 1)和能力结构链表;扩展配置空间则存放PCIe特有的扩展能力结构。
| 偏移范围(字节) | 区域名称 | 内容说明 |
|---|---|---|
| 0x00 – 0x3F | 配置空间头部(Header) | Type 0(Endpoint)或 Type 1(Switch/Root Port) |
| 0x40 – 0xFF | 能力结构链表(Capability List) | PCI兼容能力结构(PM、MSI、MSI-X、PCIe Cap等) |
| 0x100 – 0xFFF | 扩展配置空间(Extended Config) | PCIe扩展能力结构(AER、VC、SR-IOV、DPC等) |
4.2 配置空间头部:Type 0 vs Type 1
配置空间头部的前64字节(0x00~0x3F)决定了设备类型。PCIe规范定义了两种头部格式:Type 0 用于Endpoint(端点设备),Type 1 用于Switch和Root Port(桥设备)。
4.2.1 Type 0 头部(Endpoint)
Type 0头部包含设备标识、命令、状态、基地址寄存器(BAR)、扩展ROM、中断引脚等字段。BAR寄存器用于向系统报告设备所需的MMIO或I/O地址空间大小和类型。
| 偏移 | 寄存器名称 | 位宽 | 说明 |
|---|---|---|---|
| 0x00 | Vendor ID / Device ID | 16+16 | 厂商和设备标识 |
| 0x04 | Command / Status | 16+16 | 控制命令与状态 |
| 0x08 | Revision ID / Class Code | 8+24 | 版本和类别码 |
| 0x0C | Cache Line / Latency Timer / Header Type / BIST | 8+8+8+8 | Header Type=0x00(Type 0) |
| 0x10 – 0x24 | BAR0 – BAR5 | 32×6 | 基地址寄存器(MMIO/I/O) |
| 0x2C | Subsystem Vendor / Subsystem ID | 16+16 | 子系统标识 |
| 0x30 | Expansion ROM Base Address | 32 | 扩展ROM基地址 |
| 0x3C | Interrupt Line / Interrupt Pin | 8+8 | 中断路由信息 |
4.2.2 Type 1 头部(Bridge)
Type 1头部用于PCIe Switch的Upstream/Downstream Port以及Root Port。与Type 0相比,Type 1头部用桥接地址空间寄存器(Primary Bus Number、Secondary Bus Number、Subordinate Bus Number、Memory/IO Base/Limit)替代了BAR寄存器,用于管理下游总线的地址域。
| 偏移 | 寄存器名称 | 位宽 | 说明 |
|---|---|---|---|
| 0x18 | Primary Bus Number / Secondary Bus Number / Subordinate Bus Number / Secondary Latency Timer | 8+8+8+8 | 总线号分配 |
| 0x1C | I/O Base / I/O Limit / Secondary Status | 8+8+16 | I/O地址范围 |
| 0x20 | Memory Base / Memory Limit | 16+16 | 32位MMIO范围 |
| 0x24 | Prefetchable Memory Base / Prefetchable Memory Limit | 16+16 | 预取MMIO范围 |
| 0x30 | Expansion ROM Base Address | 32 | 桥下游ROM基地址 |
4.3 能力结构链表(Capability List)
PCIe设备通过能力结构链表报告其支持的高级特性。链表起始指针位于配置空间偏移0x34处的Capabilities Pointer寄存器(8位)。每个能力结构包含一个Capability ID(标识能力类型)和一个Next Pointer(指向下一个能力结构,0表示链表结束)。
4.3.1 常见PCI能力结构
| Cap ID | 能力名称 | 说明 |
|---|---|---|
| 0x01 | PM(Power Management) | 电源状态管理(D0、D1、D2、D3hot、D3cold) |
| 0x05 | MSI(Message Signaled Interrupts) | 传统MSI中断机制 |
| 0x10 | PCIe Capability | PCIe设备核心能力(链路速度、宽度、设备类型等) |
| 0x11 | MSI-X | 增强型MSI中断(支持更多向量) |
4.3.2 PCIe Capability结构(Cap ID=0x10)
这是PCIe设备最重要的能力结构,位于配置空间偏移0x40~0x4F(典型位置)。它包含设备/端口类型、链路能力、链路状态、设备能力、设备控制/状态等关键寄存器。
// PCIe Capability Structure 典型布局(偏移相对于Capability基地址)
Offset 0x00: Capability ID (0x10) + Next Pointer
Offset 0x02: PCIe Capabilities Register (版本号、设备/端口类型)
Offset 0x04: Device Capabilities (最大有效载荷、标签深度等)
Offset 0x08: Device Control + Device Status
Offset 0x0C: Link Capabilities (最大速度、最大宽度)
Offset 0x10: Link Control + Link Status
Offset 0x14: Slot Capabilities (热插拔相关)
Offset 0x18: Slot Control + Slot Status
Offset 0x1C: Root Control + Root Capabilities
Offset 0x20: Root Status
4.4 扩展配置空间(Extended Configuration Space)
扩展配置空间位于配置空间偏移0x100~0xFFF(共3.75KB)。它采用扩展能力结构链表组织,每个扩展能力结构以Extended Capability ID(16位)和Next Capability Offset(12位)开头。链表起始位置固定在偏移0x100处。
4.4.1 常见PCIe扩展能力结构
| Ext Cap ID | 能力名称 | 说明 |
|---|---|---|
| 0x0001 | Advanced Error Reporting (AER) | 高级错误报告(Uncorrectable/Correctable Error) |
| 0x0002 | Virtual Channel (VC) | 虚拟通道与TC/VC映射 |
| 0x0003 | Device Serial Number | 64位设备序列号 |
| 0x0004 | Power Budgeting | 电源预算管理 |
| 0x0008 | ACS (Access Control Services) | 访问控制服务(IOMMU相关) |
| 0x0010 | SR-IOV (Single Root I/O Virtualization) | 单根虚拟化(VF配置) |
| 0x0015 | DPC (Downstream Port Containment) | 下游端口隔离(错误恢复) |
| 0x001B | L1 PM Substates | L1低功耗子状态 |
4.4.2 AER扩展能力结构示例
AER(Advanced Error Reporting)是PCIe扩展能力中最常用的结构之一,用于报告和记录Uncorrectable Error和Correctable Error的详细信息。
// AER Capability Structure 典型布局(偏移相对于扩展能力基地址)
Offset 0x00: Extended Capability ID (0x0001) + Next Cap Offset + Version
Offset 0x04: Uncorrectable Error Status Register (32位)
Offset 0x08: Uncorrectable Error Mask Register (32位)
Offset 0x0C: Uncorrectable Error Severity Register (32位)
Offset 0x10: Correctable Error Status Register (32位)
Offset 0x14: Correctable Error Mask Register (32位)
Offset 0x18: Advanced Error Capabilities and Control Register
Offset 0x1C: Header Log Register 0~3 (128位)
Offset 0x2C: Root Error Command / Root Error Status (Root Port only)
Offset 0x30: Error Source Identification Register
Offset 0x34: TLP Prefix Log Register (可选)
4.5 配置空间枚举流程与SVG图示
设备枚举过程中,系统软件通过配置空间头部识别设备类型,遍历能力结构链表和扩展能力结构链表,收集设备支持的全部特性。下图展示了配置空间遍历的逻辑流程。
4.6 配置空间与热插拔的关联
在热插拔链路训练和设备枚举过程中,配置空间的以下字段直接参与状态判断和资源分配:
- Slot Status Register(PCIe Capability): Presence Detect State、Data Link Layer State Active 位用于判断设备是否在位且链路已训练成功。
- Link Status Register(PCIe Capability): Negotiated Link Speed、Negotiated Link Width 反映链路训练结果。
- Command Register(配置空间头部): Bus Master Enable、Memory Space Enable、I/O Space Enable 控制设备是否参与事务。
- BAR Registers(Type 0): 系统软件通过写入全1再读回的方式探测BAR大小,然后分配实际基地址。
- Secondary/Subordinate Bus Number(Type 1): 热插拔Switch下游设备插入时,系统必须分配新的总线号并更新这些寄存器。
4.7 配置空间访问注意事项
- 配置空间只读字段: Vendor ID、Device ID、Revision ID、Class Code 等寄存器是只读的,由硬件固化。软件写入无效。
- 能力链表遍历终止条件: Next Pointer 为 0x00 表示链表结束。扩展能力链表的 Next Capability Offset 为 0x000 表示结束。
- 扩展配置空间访问方式: 传统PCI CF8/CFC机制只能访问前256字节。PCIe必须通过ECAM(Enhanced Configuration Access Mechanism)或MMIO方式访问扩展配置空间。
- 热插拔过程中的配置空间访问: 在链路未训练成功(Data Link Layer Link Active=0)时,配置空间读取可能返回全1(0xFFFFFFFF),软件应具备超时和重试机制。