PCIe 入门 Demo(一):基础知识
主要参考 up主
芯片人阿伟
的教程【针对 RISC-V 架构】视频介绍:https://www.bilibili.com/video/BV1Xm4y1V757
源码仓库:https://github.com/oldawei/show_me_the_code
本文主要补充一些详细的注释等,加深对 PCIe 的理解
本人初学 PCI/PCIe,本文以 PCIe 为主,部分句子的主语使用了 PCI,不合适的地方欢迎指出!
部分内容可能选取自部分公开的博客,若没有列出的地方请包含,如侵删!
这一节不涉及太多的细节,旨在从宏观上介绍一下,以对 PCI/PCIe 有一个更全面的认识。
PCIe 子系统拓扑结构如下所示:
1、BDF
如 PCI 一样,每个 PCIe 功能(Function)的标识在其所在的设备内,以及这个设备所连接的总线内,都是唯一的,其标识符一般被称为 “BDF”。对于任意一个 PCIe 拓扑结构,配置软件负责检测出拓扑中的每个 Bus、Device 和 Function,缩写为 BDF。
2、PCI/PCIe 空间
PCIe 主要有两种地址空间 :
- 配置空间 - 通过 PCIe ecam 基址访问 PCIe 配置空间
- memory 空间 - 通过访问 PCIe mmio 基址访问 PCIe memory 空间
3、配置空间
PCI 配置空间 256B,PCIe 配置空间 4KB,PCIe 兼容 PCI,要求前 256B 等效,将这 256B 命名为 PCI-compatible configuration space(PCI兼容配置空间)
配置空间的前 64B 是配置头部(Header),有两种类型的 Header,分别为 Type 0 和 Type 1。Type 0 Header对于每个 Function 都是必须含有的(除了 Bridge),对于 Bridge Function 来说它使用的是 Type 1 Header。两种类型配置空间的具体内容如下所示:
4、ECAM
PCI Express 配置支持两种配置空间访问机制
- PCI-compatible Configuration Access Mechanism(CAM,PCI 兼容配置访问机制)
- PCI Express Enhanced Configuration Access Mechanism(ECAM,PCI Express 增强型配置访问机制)
ECAM(Enhanced Configuration Access Mechanism)利用一个扁平的存储器映射地址空间(MMIO)来访问 PCIe 设备的配置寄存器。从存储器地址空间到 PCI Express 配置空间地址的映射格式参见下表:
在探测一个 PCI 设备时,就是按照 bus、device、function 来计算配置空间基地址:
// ECAM 访问,每个 BDF 对应的 base_addr
base_addr = ecam_base_addr + (bus << 20) | (device<< 15) | (func << 12)
每一个 PCIe/PCI 设备可以只有一个功能(Function),即 Fun0。也可以拥有最多 8 个功能,即多功能设备(Multi-Fun)。需要注意的是,每个设备必须要有功能 0(Fun0),其他的 7 个功能(Fun1~Fun7)都是可选的。不管这个 PCI/PCIe 设备拥有多少个功能,其每一个功能都有一个唯一独立的配置空间(Configuration Space)与之对应。
一个子系统上最多有 256 个 PCI 总线,每个总线最多有 32 个 PCI 设备,每个 PCI 设备最多有 8 个功能,每个功能最多有 256B 的配置地址空间,PCI 系统总的配置空间是 16MB。
PCIe 系统中每个功能有4KB的配置空间,总的配置空间为 256MB。
5、PCIe BAR
BAR - Base Address Register, 即基址寄存器
BAR(base address registers)就是为了把设备的内部各种资源映射(芯片内部寄存器或者 DDR)到 IO 空间(IO BAR)或者 memory 空间(memory BAR)。下面这张图很好的体现了这点,软件初始化时可以根据 BAR 寄存器获取该 BAR 需要的空间,然后在 MMIO 空间中分配该大小的地址空间,并实现映射(将分配的区域的地址写入 BAR 寄存器中),参考下图中的紫色区域,随后 CPU 可以通过 MMIO 访问 PCIe 设备中的 ROM/RAM,这部分在后续的示例中也会涉及。
配置好 BAR 之后,就涉及到和具体设备相关的内容