在 PCIe 枚举过程中,ECAM(Enhanced Configuration Access Mechanism) 是一种用于访问设备的 PCI 配置空间 的机制。在每个设备的配置空间中,系统通过 ECAM 访问设备的配置信息,并完成设备枚举与资源分配。对于你的例子(RC 有两个 Root Port,每个 Root Port 各挂载一个 Endpoint),ECAM 基址的分配是操作系统或固件的一部分,在系统启动时由固件(如 BIOS 或 UEFI)来设定和管理。
ECAM(配置空间)简介:
- ECAM 提供了一种线性映射机制,用于访问 PCIe 设备的 配置空间。ECAM 允许访问设备的标准配置空间(前 256 字节)和扩展配置空间(最高可达 4KB)。
- ECAM 机制通过内存映射的方式将配置空间映射到物理内存地址空间中,系统通过这些物理地址来访问每个设备的配置空间。
ECAM 基址分配的流程:
-
Root Complex 提供 ECAM 基址范围:
- 在系统启动时,Root Complex(RC) 或固件(BIOS/UEFI)会为 PCIe 配置空间预留一段物理内存地址空间,这段地址空间专门用于 ECAM 映射。
- RC 负责为整个 PCIe 拓扑提供 ECAM 空间,包括挂载在 RC 上的所有设备和桥的配置空间。
- 这段 ECAM 地址空间一般是由硬件提供的,是固定的物理内存区域。在一些系统中,固件会提供一个全局的 ECAM 基地址,而不同设备的配置空间通过偏移和总线号、设备号、功能号来访问。
-
地址空间分配和结构:
- ECAM 基址空间是以 总线号、设备号 和 功能号 的方式组织的。ECAM 提供了一种直接访问设备配置空间的方法,通过如下格式来计算配置空间地址:
mathematica
ECAM_BASE + (Bus Number << 20) + (Device Number << 15) + (Function Number << 12) + Register Offset
- Bus Number:标识 PCIe 总线号(例如 Bus 0, Bus 1, Bus 2 等)。
- Device Number:标识每个总线上的设备号(0 到 31)。
- Function Number:标识每个设备上的功能号(0 到 7)。
- Register Offset:标识配置空间中的寄存器地址(每个功能的配置空间最多 4KB)。
- ECAM 基址空间是以 总线号、设备号 和 功能号 的方式组织的。ECAM 提供了一种直接访问设备配置空间的方法,通过如下格式来计算配置空间地址:
-
固件分配 ECAM 基址:
- 固件(如 BIOS 或 UEFI)在系统启动时会为 PCIe ECAM 地址空间分配一个全局的 ECAM 基地址。
- 该地址空间的大小通常取决于系统中支持的总线数目、设备数目以及每个设备的功能数。
- 例如,假设系统支持 256 个总线,每个总线上有 32 个设备,每个设备最多有 8 个功能,且每个功能的配置空间为 4KB,则所需的 ECAM 地址空间为:
256 个总线 × 32 个设备 × 8 个功能 × 4KB = 256MB
-
为不同设备分配 ECAM 地址:(假设rc有2个rp,每个rp下挂1个ep为例子)
- 假设 ECAM 基址被设置为
0x80000000
。系统可以通过如下方式计算每个设备的 ECAM 地址:- 对于总线
0
上的设备(Root Ports):- RP1 的 ECAM 地址为:
0x80000000 + (0 << 20) + (0 << 15) + (0 << 12)
,即0x80000000
。 - RP2 的 ECAM 地址为:
0x80000000 + (0 << 20) + (1 << 15) + (0 << 12)
,即0x80008000
。
- RP1 的 ECAM 地址为:
- 对于 RP1 下的 Endpoint(EP1):
- EP1 被分配在总线
1
,其 ECAM 地址为:0x80000000 + (1 << 20) + (0 << 15) + (0 << 12)
,即0x80100000
。
- EP1 被分配在总线
- 对于 RP2 下的 Endpoint(EP2):
- EP2 被分配在总线
2
,其 ECAM 地址为:0x80000000 + (2 << 20) + (0 << 15) + (0 << 12)
,即0x80200000
。
- EP2 被分配在总线
- 对于总线
- 假设 ECAM 基址被设置为
-
操作系统通过 ECAM 访问配置空间:
- 当操作系统或固件需要访问一个设备的配置空间时,它会根据总线号、设备号、功能号计算出该设备的物理地址,并直接通过内存访问设备的配置寄存器。
- 例如,操作系统可以通过计算出的 ECAM 地址
0x80100000
来访问总线 1 上 EP1 的配置空间,并读取其 Vendor ID、Device ID 以及其他信息。
- 枚举过程从设备号
0
开始,逐个扫描设备号,直到遇到一个没有设备存在的设备号为止,从而得知总线 0 上挂载的设备数量。在你的例子中,系统扫描到设备号 2 时没有设备存在,因此得知总线 0 上只有 2 个 Root Port。