配置空间概述

PCIe配置空间是每个PCIe设备必须实现的一段专用内存区域,用于存储设备的基本信息和控制寄存器。系统软件通过访问配置空间来完成设备识别、资源分配、功能配置等关键操作。

空间大小

PCI兼容配置空间:256字节(0x000-0x0FF)

PCIe扩展配置空间:4096字节(0x000-0xFFF)

访问方式

传统方式:I/O端口 0xCF8/0xCFC

增强方式:MMIO (ECAM)

寻址方式

Bus: 8位 (0-255)

Device: 5位 (0-31)

Function: 3位 (0-7)

配置空间结构

PCI兼容配置空间 (0x000-0x0FF) 256 字节
Type 0/1 Header 0x00-0x3F
标准能力结构区域 0x40-0xFF
PCIe扩展配置空间 (0x100-0xFFF) 3840 字节
PCIe扩展能力结构 0x100-0xFFF

配置头类型 (Type 0/Type 1)

配置空间的头部类型决定了设备的功能角色。Type 0用于终端设备(Endpoint),Type 1用于桥接设备(Bridge/Root Port)。

Type 0 - Endpoint

用于终端设备,如网卡、显卡、NVMe SSD等。

  • 包含6个BAR(Base Address Register)
  • 支持Memory和I/O空间映射
  • 无下游总线号配置
BAR0 BAR1 BAR2 BAR3 BAR4 BAR5

Type 1 - Bridge

用于桥接设备,如PCIe Root Port、Switch Port等。

  • 仅包含2个BAR
  • 包含总线号配置寄存器
  • 管理下游总线范围
Primary Bus Secondary Bus Subordinate Bus

标准配置寄存器

基本标识寄存器

偏移 寄存器 位域 描述
0x00 Device ID [31:16] 设备标识符,由厂商分配
0x00 Vendor ID [15:0] 厂商标识符(如 0x8086 = Intel)
0x02 Status [15:0] 设备状态寄存器
0x04 Command [15:0] 命令寄存器,控制设备行为
0x08 Class Code [31:8] 设备类型代码(Base/Sub/Prog IF)
0x08 Revision ID [7:0] 修订版本号
0x0E Header Type [7:0] 头部类型(Type 0/1,多功能标志)

BAR寄存器 (Type 0)

偏移 寄存器 属性 描述
0x10 BAR0 可变 基址寄存器0
0x14 BAR1 可变 基址寄存器1
0x18 BAR2 可变 基址寄存器2
0x1C BAR3 可变 基址寄存器3
0x20 BAR4 可变 基址寄存器4
0x24 BAR5 可变 基址寄存器5

BAR 位域说明

0 1 2 3-31
类型 预取 类型 基址/大小
名称 说明
0 Space Type 0 = Memory空间,1 = I/O空间
1-2 Address Type 00 = 32位,10 = 64位,01/11 = 保留
3 Prefetchable 是否可预取(仅Memory空间有效)
4-31 Base Address 基址或大小(探测时写入全1)

桥接寄存器 (Type 1)

偏移 寄存器 位域 描述
0x18 Primary Bus Number [7:0] 上游总线号
0x19 Secondary Bus Number [7:0] 下游(直接连接)总线号
0x1A Subordinate Bus Number [7:0] 下游最大总线号
0x1C IO Base/Limit [15:0] I/O空间范围
0x20 Memory Base/Limit [31:0] Memory空间范围
0x24 Prefetchable Base/Limit [31:0] 可预取Memory范围

能力结构 (Capability Structure)

能力结构是PCIe设备扩展功能的机制,通过链表形式组织。每个能力结构包含唯一的ID标识和指向下一个能力的指针。

标准PCI能力结构

0x05 MSI (Message Signaled Interrupt) 消息信号中断,允许设备通过Memory Write发送中断
0x10 PCI Express PCIe核心能力,包含链路状态和配置
0x11 MSI-X MSI的增强版本,支持更多中断向量
0x09 PCI-X PCI-X协议扩展
0x03 Vital Product Data 产品关键数据(序列号等)
0x04 Slot Identification 插槽标识
0x06 CompactPCI Hot Swap 热插拔支持
0x07 PCI-X Secondary PCI-X次要能力
能力链表示意图
Cap Pointer 0x40
PCIe Cap @0x40 Next: 0x60
MSI Cap @0x60 Next: 0x80
MSI-X Cap @0x80 Next: 0x00

PCIe扩展能力结构

扩展能力位于配置空间0x100-0xFFF区域,支持更多高级功能。

0x0001 Advanced Error Reporting (AER) 高级错误报告,提供详细的错误诊断信息
0x0002 Virtual Channel (VC) 虚拟通道,支持QoS
0x0003 Device Serial Number 设备序列号扩展
0x0004 Power Budgeting 功耗预算管理
0x0005 Root Complex Link Declaration RC链路声明
0x0006 Root Complex Internal Link Control RC内部链路控制
0x0007 Root Complex Event Collector RC事件收集器
0x0008 Multi-Function Virtual Channel 多功能虚拟通道
0x0009 Virtual Channel over Multicast 组播虚拟通道
0x000A Root Complex Register Block RC寄存器块
0x000B Vendor-Specific Extended 厂商特定扩展
0x000C Config Access Correlation 配置访问关联
0x000D Access Control Services 访问控制服务(ACS)
0x000E Atomic Request Routing 原子操作请求路由
0x000F Resizable BAR 可调整大小的BAR
0x0010 Dynamic Power Allocation 动态功耗分配(DPA)
0x0011 TPH Requester TPH请求者
0x0012 LTR 延迟容忍报告
0x0015 Secondary PCI Express PCIe二级扩展(用于Gen4+)
0x0016 Data Link Feature 数据链路特性
0x0017 Physical Layer 16.0 GT/s 物理层Gen4能力

PCIe能力结构详解

PCIe能力结构是最重要的能力结构之一,包含链路状态、设备能力、链路控制等关键信息。

PCIe Capabilities Register (偏移: CapOffset + 0x04)

位域 名称 描述
[3:0] Capability Version 能力结构版本(通常为0x02)
[7:4] Device/Port Type 设备类型(Endpoint/Root Port/Switch等)
8 Slot Implemented 是否实现插槽
13 Interrupt Message Number 中断消息号

Device Capabilities Register (偏移: CapOffset + 0x08)

位域 名称 描述
[2:0] Max Payload Size Supported 支持的最大有效载荷大小
[4:3] Phantom Functions Supported 幽灵函数支持
5 Extended Tag Field Supported 扩展标签支持
[9:6] Endpoint L0s Acceptable Latency L0s可接受延迟
[11:10] Endpoint L1 Acceptable Latency L1可接受延迟
12 Role-Based Error Reporting 基于角色的错误报告
[14:13] Captured Slot Power Limit Value 插槽功耗限制值
[17:15] Captured Slot Power Limit Scale 功耗限制比例

Link Capabilities Register (偏移: CapOffset + 0x0C)

位域 名称 描述
[3:0] Maximum Link Speed 最大链路速度(1=2.5GT/s, 2=5GT/s...)
[9:4] Maximum Link Width 最大链路宽度(x1/x2/x4/x8/x16)
[11:10] Active State Power Management Support ASPM支持级别
[14:12] L0s Exit Latency L0s退出延迟
[17:15] L1 Exit Latency L1退出延迟
18 Clock Power Management 时钟电源管理
19 Surprise Down Error Reporting 意外断开错误报告
20 Data Link Layer Link Active Reporting 数据链路层活跃报告

Link Status Register (偏移: CapOffset + 0x12)

位域 名称 描述
[3:0] Current Link Speed 当前链路速度
[9:4] Negotiated Link Width 协商的链路宽度
13 Slot Clock Configuration 使用插槽参考时钟
11 Link Training 链路训练中

交互式配置空间查看器

输入配置空间偏移地址,查看对应寄存器的详细信息。

输入偏移地址并点击查询按钮

配置空间示例

以下是一个典型PCIe设备(NVMe SSD)的配置空间前256字节:

配置空间访问机制

传统I/O方式

使用两个I/O端口访问配置空间:

  • 0xCF8 - 配置地址端口
  • 0xCFC - 配置数据端口
// 构造配置地址
uint32_t addr = (bus << 16) | (device << 11) | 
                (func << 8) | (offset & 0xFC) | 0x80000000;
outl(0xCF8, addr);
uint32_t data = inl(0xCFC);
                                
限制:只能访问前256字节,不能访问扩展配置空间

ECAM (增强配置访问机制)

PCIe 2.0引入的MMIO访问方式:

  • 为每个设备分配4KB内存映射区域
  • 直接通过Memory Read/Write访问
  • 支持访问完整4096字节配置空间
// ECAM地址计算
// Base + (Bus << 20) + (Device << 15) + (Func << 12) + Offset
void *ecam_base = ioremap(ECAM_BASE, ECAM_SIZE);
uint32_t *config = ecam_base + (bus << 20) + 
                   (device << 15) + (func << 12);
uint32_t data = config[offset / 4];
                                
推荐:现代系统首选方式,支持完整配置空间访问