3. PCIe 配置空间:布局、Capability 与扩展 Capability

PCIe 配置空间是软件与硬件交互的核心接口。驱动通过读取和解析配置空间来发现设备、识别功能、分配资源并配置链路特性。本章深入剖析配置空间的布局结构、标准 Capability 链表以及 PCIe 独有的扩展 Capability 机制。

核心要点:PCIe 配置空间分为前 256 字节的“标准配置空间”(兼容 PCI/PCI-X)和 256 字节之后的“扩展配置空间”(PCIe 新增)。标准头定义了设备类型、厂商、类码和 BAR 等关键字段;扩展空间则通过 Capability 链表组织链路控制、电源管理、虚拟化等高级特性。

3.1 配置空间整体布局(前 256 字节标准头)

每个 PCIe 功能(Function)都拥有独立的 4KB 配置空间。前 256 字节(Offset 0x00 – 0xFF)的结构与 PCI 兼容,称为“标准配置空间”或“PCI 兼容配置空间”。根据设备类型,标准头分为两种布局:Type 0(Endpoint 端点设备)和 Type 1(Switch/Bridge 桥设备)。

关键区别:Type 0 头包含最多 6 个 Base Address Register(BAR),用于端点设备的内存或 I/O 空间映射;Type 1 头包含 2 个 BAR、Primary/Secondary/Subordinate Bus Number 以及 Prefetchable Memory 窗口寄存器,用于桥设备转发事务。

下表列出 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 中通常不适用)
驱动开发注意:读取 Vendor ID 和 Device ID 是枚举的第一步。如果读取全 0xFFFF,表示该设备不存在或链路未连接。Capabilities Pointer(偏移 0x34)是遍历 Capability 链表的入口,必须检查 Status 寄存器的 Capabilities List 位(bit 4)是否为 1,否则该指针无效。

下图展示 Type 0 标准配置头的前 64 字节布局:

PCIe Type 0 标准配置头布局(前 64 字节) PCIe Type 0 标准配置头布局(前 64 字节) 偏移 寄存器 宽度 颜色标识 关键字段 0x00-0x03 Vendor/Device ID 32-bit 设备标识 厂商/设备号 0x04-0x07 Command/Status 32-bit 控制/状态 使能位/能力标志 0x08-0x0B Rev/Class Code 32-bit 类码/版本 设备类型/修订 0x0C-0x0F Cache/Header/BIST 32-bit 头类型 Type 0/1 判断 0x10-0x27 BAR0 – BAR5 6 × 32-bit 地址映射 内存/I/O 基址 0x28-0x2B Cardbus CIS 32-bit 可选 通常为 0 0x2C-0x2F Subsystem ID 32-bit 子系统标识 厂商/设备号 0x30-0x33 Expansion ROM 32-bit ROM 基址 可选 0x34 Cap. Pointer 8-bit 能力链表入口 指向 Cap 结构 0x3C-0x3F Int Line/Pin 16-bit 中断配置 中断线/引脚

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 个向量)
驱动遍历技巧:从标准头的偏移 0x34 读取 Capabilities Pointer,然后循环读取每个 Cap 结构的 ID 和 Next Pointer。注意:PCIe 设备必须实现 PCIe Capability(ID = 0x10),驱动可通过该结构获取链路状态、设备端口类型等信息。

下图展示 Capability 链表的遍历流程:

PCIe Capability 链表遍历流程 PCIe Capability 链表遍历流程 读取 Cap. Pointer (0x34) Pointer == 0? 遍历结束 是 读取 Cap ID + Next Next Pointer 赋值

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 等安全协议
驱动开发关键:SR-IOV 扩展 Capability(ID 0x0010)是虚拟化驱动开发的核心。通过它驱动可以获取 Physical Function (PF) 支持的 Virtual Function (VF) 数量、VF BAR 的偏移和大小,以及 VF 使能位。AER 扩展 Cap(ID 0x0001)则是错误处理驱动的必读结构。

下图展示扩展配置空间的整体布局与扩展 Capability 链表:

PCIe 扩展配置空间布局与扩展 Capability 链表 配置空间分段 标准配置空间 0x000 – 0x0FF (256 字节) 扩展配置空间 0x100 – 0xFFF (3840 字节) ← 上一章 📖 返回目录 下一章 →