全球微速讯:PCI Express 基础
PCI-e 是一种高速串行计算机扩展总线标准,是常用的 PC IO 接口。
PCI-e 初始化可以分为以下几步:
1. 获得 PCI-e 设备配置空间
(资料图片)
2. 为设备加载相应的驱动程序
3. 由驱动程序完成硬件配置
获取 ECAM 基址
ECAM (Enhanced Configuration Address Mapping) 基址由固件或桥设备提供
ACPI 体系计算机的 ECAM 基址 (Base address of enhanced configuration mechanism) 储存在 MCFG 中
获取 ECAM 基址的具体方式:
1.系统在初始化时,先获取 RSDP (Root System Description Ptr)
不同平台拥获取 RSDP 实现方法不同,具体见 ACPI_Spec 的 5.2.5 Root System Description Pointer (RSDP) 章节
2.根据 RSDP 找到 RSDT ( Root System Decription ) 或 XSDT ( Extend System Decription )
XSDT 目的是取代 RSDT 而并非 RSDT 的拓展。所以,所以这里就只提 XSDT。
固件加载 boot*.efi 后,会将 SystemTable 传入主函数。详细的内容后续会补充在 UEFI 引导编写教程的相关章节。
EDK2 规范中指明的 XSDT 位置 :
SystemTable -> XSDT -> MCFG
通过 图 APCI MCFG Table 构建结构体,即可导出ECAM基址 (Base address of enhanced configuration mechanism)
读取 PCI-e 配置空间内容:
ECAM 基址由固件决定,所占用空间不得低于 n*32MB(n表示总线数)。通常情况 可修改 ECAM 大小为 64MB、128MB、256MB。
Base address of enhanced configuration mechanism 表示的即前文提及的 ECAM 基址
ECAM 访问 PCI-e 配置空间的方式如下,
BaseAddress[63:27] 基址
BaseAddress[27:20] 映射 总线号
BaseAddress[19:15] 映射 设备号
BaseAddress[14:12] 映射 功能号
BaseAddress[11:8] 拓展寻址器
BaseAddress[7:2] 寻址器
BaseAddress[1:0] 字节取值器(注意RW属性)
拓展寻址器、寻址器与字节取值器 与其它部分组成完整地址,用于指针取值。
在 IO 过程中 拓展寻址器、寻址器与字节取值器 并不发挥功能。
对于用户,访问的方式是,将总线号,设备号,功能号整合与基址相加。
如图:
MCFG 中的 Base Adress 即 Base Adress of Enhanced configuration mechanism,
构建 00:00:01 设备的编号,0x800 (0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_1000_0000_0000)
得到该设备的增强配置空间基址,即 Base Adress & 0x800
得到的 E000 0800H 便是该设备的配置空间基址
经过测试,该内存段与软件提供的配置空间内容相符合。
图片来自网络,侵删