3. PCIe 配置空间:布局、Capability 与扩展 Capability
PCIe 配置空间是软件与硬件交互的核心接口。驱动通过读取和解析配置空间来发现设备、识别功能、分配资源并配置链路特性。本章深入剖析配置空间的布局结构、标准 Capability 链表以及 PCIe 独有的扩展 Capability 机制。
3.1 配置空间整体布局(前 256 字节标准头)
每个 PCIe 功能(Function)都拥有独立的 4KB 配置空间。前 256 字节(Offset 0x00 – 0xFF)的结构与 PCI 兼容,称为“标准配置空间”或“PCI 兼容配置空间”。根据设备类型,标准头分为两种布局:Type 0(Endpoint 端点设备)和 Type 1(Switch/Bridge 桥设备)。
下表列出 Type 0 标准配置头(前 64 字节)的核心字段:
| 偏移(字节) | 寄存器名称 | 宽度 | 说明 |
|---|---|---|---|
| 0x00 | Vendor ID | 16-bit | 厂商编号(如 0x8086 为 Intel) |
| 0x02 | Device ID | 16-bit | 设备编号 |
| 0x04 | Command | 16-bit | 控制 I/O、Memory、Bus Master 等使能 |
| 0x06 | Status | 16-bit | 中断状态、Capabilities List 标志等 |
| 0x08 | Revision ID | 8-bit | 修订版本 |
| 0x09 | Class Code | 24-bit | 基类/子类/编程接口(如 0x020000 为以太网控制器) |
| 0x0C | Cache Line Size | 8-bit | 缓存行大小(单位 DWORD) |
| 0x0D | Latency Timer | 8-bit | PCI 总线延迟定时器(PCIe 中通常忽略) |
| 0x0E | Header Type | 8-bit | 0x00 为 Type 0,0x01 为 Type 1;bit 7 表示多功能设备 |
| 0x0F | BIST | 8-bit | 内建自测试(可选) |
| 0x10 – 0x24 | Base Address Registers (BAR0 – BAR5) | 32-bit each | 内存或 I/O 地址映射基址(共 6 个) |
| 0x28 | Cardbus CIS Pointer | 32-bit | Cardbus 信息结构指针(通常为 0) |
| 0x2C | Subsystem Vendor ID | 16-bit | 子系统厂商编号 |
| 0x2E | Subsystem ID | 16-bit | 子系统设备编号 |
| 0x30 | Expansion ROM Base Address | 32-bit | 扩展 ROM 基址寄存器 |
| 0x34 | Capabilities Pointer | 8-bit | 指向第一个 Capability 结构的偏移(bit 0-1 保留) |
| 0x3C | Interrupt Line | 8-bit | 中断线号(由固件分配) |
| 0x3D | Interrupt Pin | 8-bit | 中断引脚(INTA# = 1, INTB# = 2, INTC# = 3, INTD# = 4) |
| 0x3E | Min_Gnt / Max_Lat | 8-bit each | PCI 总线延迟参数(PCIe 中通常不适用) |
下图展示 Type 0 标准配置头的前 64 字节布局:
3.2 Capability 结构:标准能力链表
PCIe 设备通过 Capability 结构扩展标准配置空间的功能。每个 Capability 结构以 Capability ID(1 字节)开头,紧接着是 Next Capability Pointer(1 字节),指向下一个 Capability 结构的偏移。链表以 Next Pointer 为 0x00 结束。
标准 Capability ID 定义(部分常见值):
| Capability ID | 名称 | 说明 |
|---|---|---|
| 0x01 | PM (Power Management) | 电源管理状态控制 |
| 0x05 | MSI (Message Signaled Interrupts) | 传统 MSI 中断支持 |
| 0x09 | PCI-X | PCI-X 模式配置(仅 PCI-X 设备) |
| 0x10 | PCIe Capability | PCIe 设备核心能力结构(必须实现) |
| 0x11 | MSI-X | MSI-X 中断支持(最多 2048 个向量) |
下图展示 Capability 链表的遍历流程:
3.3 PCIe 扩展 Capability:扩展配置空间(256 – 4095 字节)
PCIe 在标准配置空间之外,将配置空间扩展到 4KB(偏移 0x100 – 0xFFF)。这部分称为“扩展配置空间”,用于存放 PCIe 特有的扩展 Capability 结构。与标准 Capability 不同,扩展 Capability 使用 4 字节的 Capability ID 和 4 字节的 Next Capability Offset,支持更丰富的特性。
扩展 Capability 结构头部格式:
| 偏移(相对扩展 Cap 起始) | 字段 | 宽度 | 说明 |
|---|---|---|---|
| 0x00 | PCIe Extended Capability ID | 16-bit | 扩展能力标识(如 0x0001 为 Advanced Error Reporting) |
| 0x02 | Capability Version | 4-bit | 版本号 |
| 0x02 | Next Capability Offset | 12-bit | 指向下一个扩展 Cap 的偏移(单位字节,从配置空间基址 0x000 开始) |
| 0x04 | Capability Specific Data | 可变 | 能力相关寄存器 |
常见 PCIe 扩展 Capability ID:
| 扩展 Cap ID | 名称 | 典型用途 |
|---|---|---|
| 0x0001 | Advanced Error Reporting (AER) | 高级错误报告:Uncorrectable/Correctable 错误状态与掩码 |
| 0x0002 | Virtual Channel (VC) | 虚拟通道配置与仲裁 |
| 0x0003 | Device Serial Number | 64-bit 唯一设备序列号 |
| 0x0004 | Power Budgeting | 电源预算报告 |
| 0x0005 | Root Complex Link Declaration | Root Complex 链路描述 |
| 0x0008 | ACS (Access Control Services) | 访问控制服务,用于 IOMMU 分组 |
| 0x0010 | SR-IOV (Single Root I/O Virtualization) | SR-IOV 能力:VF 数量、BAR 大小、VF 偏移等 |
| 0x001B | DPA (Dynamic Power Allocation) | 动态电源分配 |
| 0x0026 | DOE (Data Object Exchange) | 数据对象交换,用于 SPDM/CMA 等安全协议 |
下图展示扩展配置空间的整体布局与扩展 Capability 链表: