MindShare 官网,地址如下:
MindShare
Chapter 1:PCIE 背景介绍 - PCI 总线模型
1. 以 PCI 总线作为外设总线的 SOC 芯片架构
下图展示了一个以 PCI 总线作为外设总线的 SOC 芯片架构(PCI 总线类似 AXI 下的 AHB?):
由上图可知:PCI 作为芯片内部的外设总线,那么处理器内核的地址指令与数据指令(寄存器读写)可以方便的转换为 PCI 总线数据,与各外设 IP 核进行通信。
进一步扩展:芯片外部的 pci 总线上的外设,也可以通过地址指令和数据指令(寄存器读写)访问。
North Bridge: 北桥,连接处理器与外设总线(类似 AXI?龙芯的处理器上似乎也有)。
South Bridge: 南桥,连接 PCI 与系统外设(类似 APB?)。
2. functions 与 PCI device
每一个 pci 设备最多包含 8 个 functions, 每一个功能都有一个编号:[0:7].
3. PCI device 与 PCI bus
PCI 总线最多可挂载 32 个设备,由于电气特性,实际只会更少。 33MHz 频率时,最多能挂载 10-12 个设备.
4. PCI 总线与 PCI 架构
一个 PCI 架构最多允许挂载 256 条 PCI 总线
5. PCI 地址空间映射
PCI 架构支持 3 种地址空间:
- mem 空间:包含 32/64 位 mem;
- I/O 空间:外设寄存器区域?
- configuration: 配置空间
PCI 设备的每一个 function 都需要 256 字节的配置空间。
那么在任一 PCI 架构中,最多需要 256 * 8(功能)* 32(设备) * 256(总线) = 16MB 配置空间。
因为每一个 PCI 架构最多支持 256 条 PCI 总线,每条总线最多支持 32 个设备,每个设备最多支持 8 个 functions, 每个 function 需要 256 字节配置空间。
6. PCI function 配置空间 header。
每一个 function 需要 256 字节配置空间,配置空间的前 64 字节包含一个称为 Header 的标准结构。剩余的 192 字节支持可选的功能。
存在两种类型的 Header:
- bridge 类 Header;
- device 类 Header;
7. bridge 类 Header(Type 1 Header)
位域 Header Type = 1, 表示 bridge 类 Header.
8. device 类 Header(Type 0 Header)
位域 Header Type = 0, 表示device 类 Header.
9. pci 驱动首先需要做的事就是查找 function 的 Header,并判断 Header 类。
这一步称做枚举。(通过访问配置空间完成.)
10. PCI-X 与 PCI 只有硬件上的区别
PCI-x 频率更高,带宽更大。
Chapter 2: PCIe 架构概述
1. PCIE 是由 PCI 并行总线发展而来的串行总线
pcie 是使用差分线传输的串行全双工总线。
2. PCIE 驱动与 PCI 驱动完全兼容
因为 PCIE 使用与 PCI 一样的配置 Header,所以可以保证软件的兼容性。
3. PCIE 运行在更高的频率下
与 PCI 不同,由于不需要考虑高频并行总线下的信令偏移问题,PCIE 总线可以运行在更高的时钟频率下。
PCIE 1.0 运行在 2.5GT/s 频率下。
PCIE 2.0 运行在 5 GT/s 频率下;
PCIE 3.0 运行在 8 GT/s 频率下;
PCIe 1.0/2.0 使用 8b/10b 编码。
PCIe 3.0 使用 128b/130b 编码。
PCIE 链路带宽如下图:
不同版本 PCIE 带宽计算方法如下:
PCIE 1.0 Bandwidth = (2.5Gb/s * 2) / 10 bits per symbol = 0.5GB/s
PCIE 2.0 Bandwidth = (5Gb/s * 2) / 10 bits per symbol = 1.0GB/s
PCIE 3.0 Bandwidth = (8Gb/s * 2) / 8 bits per symbol = 2.0GB/s
4. PCIE 不需要公共时钟
PCIE 使用源同步模型,也就是由数据发送方提供时钟给接收方,发送方会将时钟信号编码进差分数据中,接收方通过 PLL 对比、锁频来确定时钟.
5. PCIE 使用基于包的数据传输协议
物理底层使用数据包的形式进行数据交换
6. PCIE 链路可以使用多个 lane
两个 PCIE 设备之间的链路, 称为 link. link 可以会使用多个通道, 称为 lane.
比如 pcie x1, x2, x4, x8, x16, x32
7. PCIE link 必须是点对点的连接
PCIE 需要使用 switch/bridge 来建立更灵活的树形拓扑结构
那么两个 PCIE 设备之间的每一个点对点的连接, 单独占用一条总线?
8. CPU 使用 Root Complex 与外部 PCIE 设备或总线连接
CPU 与 PCIE 总线之间也许包含几个额外的组件(处理器接口, DRAM 接口或其他芯片), 这些额外组件统称为 Root Complex.
Root Complex 代表 CPU 与 PCIE 树形拓扑结构中的剩余设备通信.
Root Complex 内部存在一个 Host-PCI Bridge 作为 PCIE 0 号虚拟总线, 并存在额外的 PCIE bridges 用于创建新的总线.
9. Switch 与 Bridge
Switch 和 Bridge 感觉没啥区别. 都可以拓展 PCIE 总线,与 Root Complex 一样,switch 内部也存在一条虚拟总线,以及多个 pcie bridge,用于创建新的总线或下挂设备。.
switch 图解如下(与 Root Complex 差不多):
10. End point 即是 PCIE 设备
11. PCIE 设备是层级设备
设备分层架构如下:
从上至下的 layer | layer 描述 |
---|---|
Device Core/ PCIe Core | 软件层, PCIE 设备功能的核心实现, 如果 PCIE 设备由 8 个 functions, 那么每个 functions 都有自己的配置空间, 用于实现设备功能. |
Transaction Layer | 传输层, 负责 TLP 数据包的生成并发送, 接收并解析, 同时实现流控/QOS |
Data Link Layer | 数据链路层, 负责 DLLP 生成并发送/接收并解析, 同时负责错误检测与纠正, 应答. |
Paysical Layer | 物理层, 使用差分信号线实现面向数据包的传输. |
物理层发送的数据包概念图如下:
12. Device Core/ Software Layer
用于实现具体的设备功能,不在 PCIE 规范中定义。
13. Transaction Layer
响应软件层的请求,传输层生成待发送的数据包,也会解析输入的数据包,并上传给软件层;
传输层使用 TLP 进行数据处理,每一个 TLP 属于下列帧类型之一:
- Memory
- I/O
- Configuration
- Message
14. Data Link Layer
数据链路层负责链路管理,并完成如下三个功能:
- TLP 错误检测;
- 流控;
- 链路功耗管理;
15. Paysical Layer
物理层是使用数据包的数据交换协议.
16. 一个实例,用于读取 PCIE 设备 memory
首先, 发送方发送 memory read request 给接受方, 图解如下:
request 发送方:
- 软件层将读取的内存地址发送给传输层, 传输层打包为传输层数据包 TLP, 并传递给 DLL
- 数据链路层将 TLP 打包为 DLLP, 然后传输给 Physical Layer
- 物理层添加自己的包头与包围, 通过差分线路,将数据发送到对端.
request 接收方:
以相反的顺序对数据包进行解析.
之后, 接收方发送 memory read Completion with Data 给发送方, 图解如下:
数据封包与拆包过程与 request 过程差不多, 不赘述.