《PCI Express 体系结构导读》讲述了与PCI及PCI Express总线相关的最为基础的内容,并介绍了一些必要的、与PCI总线相关的处理器体系结构知识,这也是《PCI Express 体系结构导读》的重点所在。深入理解处理器体系结构是理解PCI与PCI Express总线的重要基础。
读者通过对《PCI Express 体系结构导读》的学习,可超越PCI与PCI Express总线自身的内容,理解在一个通用处理器系统中局部总线的设计思路与实现方法,从而理解其他处理器系统使用的局部总线。《PCI Express 体系结构导读》适用于希望多了解一些硬件的软件工程师,以及希望多了解一些软件的硬件工程师,也可供电子工程和计算机类的研究生自学参考。
PCI Express总线是新一代的I/O局部总线标准,是取代PCI总线的革命性总线架构。PCI总线曾经是PC体系结构发展史上的一个里程碑,但是随着技术的不断发展,新涌现出的一些外部设备对传输速度和带宽有更高的要求,如千兆和万兆以太网、4Gb/8Gb的Fiber Channel和高速显示设备等。同时有些外部设备对总线的服务质量还有更严格的要求。PCI总线在设计之初并没有考虑这些因素,因此并不能完全满足这些外部设备的需要。
PCI Express总线正是在这种背景下应运而生的。在2001年的春季英特尔开发者论坛上,英特尔公布了取代PCI总线的第三代I/O技术,当时被称为“3GIO”。经PCI-SIG审核,于2002年7月正式公布了第一版规范,并更名为PCI Express。从2004年开始,PCI Express总线逐渐全面取代PCI和AGP总线,成为新的局部总线工业标准。
与PCI总线的共享并行架构不同,PCI Express总线使用高速串行传送方式,能够支持更高的频率,连接的设备不再像PCI总线那样共享总线带宽。除此之外PCI Express总线还引人了一些新特性,如流量控制机制、服务质量管理、热插拔支持、数据完整性和新型错误处理机制等。而且PCI Express总线在系统软件级与PCI总线保持兼容,最大程度上降低了系统软件从原有的PCI总线体系结构移植到PCI Express总线体系结构的难度。
目前关于PCI Express总线规范的文献和书籍已有多种,但多集中在介绍规范本身。对于广大的开发者来说,能够从处理器系统的角度了解PCI Express总线功能,无疑更有实用价值。无论是系统外部设备的开发、驱动程序的编写,还是其他系统软件的开发,处理器系统始终处于核心位置。
本书正是从处理器系统的视角来讲述PCI Express总线的体系结构,较为细致地介绍了如何使用FPGA实现一个基于PCIe总线的外部设备,以及基于Linux系统的PCI/PCI Express总线驱动程序和设备驱动程序。本书对于PCI Express总线相关的软硬件开发人员具有很高的参考价值。
PCI Express总线规范仍在不断发展。总的来说,PCI Express总线规范提出的最新技术概念往往在英特尔的x86处理器系统和外部设备中最先出现。本书的作者王齐先生,目前工作于英特尔开源技术研究中心,对处理器体系结构和Linux系统核心技术均有深入研究,相信本书的读者能够从他的经验分享中获益。
序
前言
第Ⅰ篇 PCI体系结构概述
第1章 PCI总线的基本知识
1.1 PCI总线的组成结构
1.1.1 HOST主桥
1.1.2 PCI总线
1.1.3 PCI设备
1.1.4 HOST处理器
1.1.5 PCI总线的负载
1.2 PCI总线的信号定义
1.2.1 地址和数据信号
1.2.2 接口控制信号
1.2.3 仲裁信号
1.2.4 中断请求等其他信号
1.3 PCI总线的存储器读写总线事务
1.3.1 PCI总线事务的时序
1.3.2 Posted和NonPosted传送方式
1.3.3 HOST处理器访问PCI设备
1.3.4 PCI设备读写主存储器
1.3.5 Delayed传送方式
1.4 PCI总线的中断机制
1.4.1 中断信号与中断控制器的连接关系
1.4.2 中断信号与PCI总线的连接关系
1.4.3 中断请求的同步
1.5 PCIX总线简介
1.5.1 Split总线事务
1.5.2 总线传送协议
1.5.3 基于数据块的突发传送
1.6 小结
第2章 PCI总线的桥与配置
2.1 存储器域与PCI总线域
2.1.1 CPU域、DRAM域与存储器域
2.1.2 PCI总线域
2.1.3 处理器域
2.2 HOST主桥
2.2.1 PCI设备配置空间的访问机制
2.2.2 存储器域地址空间到PCI总线域地址空间的转换
2.2.3 PCI总线域地址空间到存储器域地址空间的转换
2.2.4 x86处理器的HOST主桥
2.3 PCI桥与PCI设备的配置空间
2.3.1 PCI桥
2.3.2 PCIAgent设备的配置空间
2.3.3 PCI桥的配置空间
2.4 PCI总线的配置
2.4.1 Type01h和Type00h配置请求
2.4.2 PCI总线配置请求的转换原则
2.4.3 PCI总线树Bus号的初始化
2.4.4 PCI总线Device号的分配
2.5 非透明PCI桥
2.5.1 Intel 21555中的配置寄存器
2.5.2 通过非透明桥片进行数据传递
2.6 小结
第3章 PCI总线的数据交换
3.1 PCI设备BAR空间的初始化
3.1.1 存储器地址与PCI总线地址的转换
3.1.2 PCI设备BAR寄存器和PCI桥Base、Limit寄存器的初始化
3.2 PCI设备的数据传递
3.2.1 PCI设备的正向译码与负向译码
3.2.2 处理器到PCI设备的数据传送
3.2.3 PCI设备的DMA操作
3.2.4 PCI桥的Combining、Merging和Collapsing
3.3 与Cache相关的PCI总线事务
3.3.1 Cache一致性的基本概念
3.3.2 PCI设备对不可Cache的存储器空间进行DMA读写
3.3.3 PCI设备对可Cache的存储器空间进行DMA读写
3.3.4 PCI设备进行DMA写时发生Cache命中
3.3.5 DMA写时发生Cache命中的优化
3.4 预读机制
3.4.1 指令预读
3.4.2 数据预读
3.4.3 软件预读
3.4.4 硬件预读
3.4.5 PCI总线的预读机制
3.5 小结
第Ⅱ篇 PCIE xpress体系结构概述
第4章 PCIe总线概述
4.1 PCIe总线的基础知识
4.1.1 端到端的数据传递
4.1.2 PCIe总线使用的信号
4.1.3 PCIe总线的层次结构
4.1.4 PCIe链路的扩展
4.1.5 PCIe设备的初始化
4.2 PCIe体系结构的组成部件
4.2.1 基于PCIe架构的处理器系统
4.2.2 RC的组成结构
4.2.3 Switch
4.2.4 VC和端口仲裁
4.2.5 PCIe_t0.PCI/PCI.x桥片
4.3 PCIe设备的扩展配置空间
4.3.1 Power Management Capability结构
4.3.2 PCI Express CapaJbility结构
4.3.3 PCI Express Extended Capabilities结构
4.4 小结
第5章 Montevilna的MCH和ICH
5.1 PCI总线0的Device0设备
5.1.1 EPBAR寄存器
5.1.2 MCHBAR寄存器
5.1.3 其他寄存器
5.2 Montevina平台的存储器空间的组成结构
5.2.1 Legacy地址空间
5.2.2 DRAM域
5.2.3 存储器域
5.3 存储器域的PCI总线地址空间
5.3.1 PCI设备使用的地址空间
5.3.2 PCIe总线的配置空间
5.4 小结
第6章 PCIe总线的事务层
6.1 TLP的格式
6.1.1 通用TLP头的Fmt字段和Type字段
6.1.2 TC字段
6.1.3 Attr字段
6.1.4 通用TLP头中的其他字段
6.2 FLP的路由
6.2.1 基于地址的路由
6.2.2 基于ID的路由
6.2.3 隐式路由
6.3 存储器、I/O和配置读写请求TLP
6.3.1 存储器读写请求TLP
6.3.2 完成报文
6.3.3 配置读写请求TLP
6.3.4 消息请求报文
6.3.5 PCIe总线的原子操作
6.3.6 TLP Processing Hint
6.4 TLP中与数据负载相关的参数
6.4.1 Max-Payload-Size参数
6.4.2 Max-Read-Request-Size参数
6.4.3 RCB参数
6.5 小结
第7章 PCIe总线的数据链路层与物理层
7.1 数据链路层的组成结构
7.1.1 数据链路层的状态
7.1.2 事务层如何处理DL_Down和DL_Up状态
7.1.3 DLLP的格式
7.2 ACK/NAK协议
7.2.1 发送端如何使用ACK/NAK协议
7.2.2 接收端如何使用ACK/NAK协议
7.2.3 数据链路层发送报文的顺序
7.3 物理层简介
7.3.1 PCIe链路的差分信号
7.3.2 物理层的组成结构
7.3.3 8/10b编码与解码
7.4 小结
第8章 PCIe总线的链路训练与电源管理
8.1 PCIe链路训练简介
8.1.1 链路训练使用的字符序列
8.1.2 Electrical Idle状态
8.1.3 Receivel Detect识别逻辑
8.2 LTSSM状态机
8.2.1 Detect状态
8.2.2 Polling状态
8.2.3 Configuration状态
8.2.4 Recovery状态
8.2.5 LTSSM的其他状态
8.3 PCIe总线的ASPM
8.3.1 与电源管理相关的链路状态
8.3.2 IJD状态
8.3.3 LDs状态
8.3.4 L1状态
8.3.5 L2状态
8.4 PCIPM机制
8.4.1 PCIe设备的D-State
8.4.2 D-State的状态迁移
8.5 小结
第9章 流量控制
9.1 流量控制的基本原理
9.1.1 Rate-Based流量控制
9.1.2 Credit-Based流量控制
9.2 Credit-Based机制使用的算法
9.2.1 N123算法和N123+算法
9.2.2 N23算法
9.2.3 流量控制机制的缓冲管理
9.3 PCIe总线的流量控制
9.3.1 PCIe总线流量控制的缓存管理
9.3.2 Current节点的Credit
9.3.3 VC的初始化
9.3.4 PCIe设备如何使用FCF
9.4 小结
第10章 MSI和MSI-×中断机制
10.1 MSI/MSI-X Capability结构
10.1.1 MSI Capability结构
10.1.2 MSI-X Capability结构
10.2 PowerPC处理器如何处理MSI中断请求
10.2.1 I中断机制使用的寄存器
10.2.2 系统软件如何初始化PCIe设备的MSI Capability结构
10.3 x86处理器如何处理MSI-X中断请求
10.3.1 Message Address字段和Message Data字段的格式
10.3.2 FSB Interrupt Message总线事务
10.4 小结
第11章 PCI/PCIe总线的序
11.1 生产/消费者模型
11.1.1 生产/消费者的工作原理
11.1.2 生产/消费者模型在PCI/PCIe总线中的实现
11.2 PCI总线的死锁
11.2.1 缓冲管理引发的死锁
11.2.2 数据传送序引发的死锁
11.3 PCI总线的序
11.3.1 PCI总线序的通用规则
11.3.2 Delayed总线事务的传送规则
11.3.3 PCI总线事务通过PCI桥的顺序
11.3.4 LOCK,Delayed和Posted总线事务间的关系
11.4 PCIe总线的序
11.4.1 TLP传送的序
11.4.2 ID-Base Ordering
11.4.3 MSI报文的序
11.5 小结
第12章 PCIe总线的应用
12.1 Capric卡的工作原理
12.1.1 BAR空间
12.1.2 Capric卡的初始化
12.1.3 DMA写
12.1.4 DMA读
12.1.5 中断请求
12.2 Capric卡的数据传递
12.2.1 DMA写使用的TLP
12.2.2 DMA读使用的TLP
12.2.3 Capric卡的中断请求
12.3 基于PCIe总线的设备驱动
12.3.1 Caprie卡驱动程序的加载与卸载
12.3.2 Caprie卡的初始化与关闭
12.3.3 Capric卡的DMA读写操作
12.3.4 Capric卡的中断处理
12.3.5 存储器地址到PCI总线地址的转换
12.3.6 存储器与Cache的同步
12.4 Capric卡的延时与带宽
12.4.1 TLP的传送开销
12.4.2 PCIe设备的DMA读写延时
12.4.3 Capric卡的优化
12.5 小结
第13章 PCIe总线与虚拟化技术
13.1 I0MMU
13.1.1 IOMMU的工作原理
13.1.2 IA处理器的VT-d
13.1.3 AMD处理器的IOMMU
13.2 ATS(Address Translation Services)
13.2.1 TLP的AT字段
13.2.2 地址转换请求
13.2.3 Invalidate ATC
13.3 SR.1 0V与MR-IOV
13.3.1 SR-IOV技术
13.3.2 MR-IOV技术
13.4 小结
第Ⅲ篇 Linux与PCI总线
第14章 Linux PCI的初始化过程
14.1 Linuxx86对PCI总线的初始化
14.1.1 pcibus_class_init与pci_driver_init
……
第15章 LinuxPCI的中断处理
参考文献
在处理器系统中,含有PCI总线和PCI总线树这两个概念。这两个概念并不相同,在一棵PCI总线树中可能具有多条PCI总线,而具有血缘关系的PCI总线组成一棵PCI总线树。如在图1-1所示的处理器系统中,PCI总线x树具有两条PCI:总线,分别为PCI总线如和PCI总线x1。而PCI总线y树中仅有一条。PCI总线。
PCI总线由HOST主桥或者:PCI桥管理,用来连接各类设备,如声卡、网卡和IDE接口卡等。在一个处理器系统中,可以通过PCI桥扩展PCI总线,并形成具有血缘关系的多级PCI总线,从而形成PCI总线树型结构。在处理器系统中有几个HOST。主桥,就有几棵这样的PCI总线树,而每一棵PCI总线树都与一个PCI总线域对应。
与HOST主桥直接连接的PCI总线通常被命名为PCI总线0考虑到在一个处理器系统中可能有多个主桥,图1-1将HOST主桥X推出的PCI总线命名为X0总线,而将PCI桥x1扩展出的PCI总线称为X1总线,将HOST主桥y推出的PCI总线称为y0~yn。分属不同PCI总线树的设备,其使用的PCI总线地址空间分属不同的PCI总线域空间。
3 PCI设备
在PCI总线中有三类设备:PCI主设备、PCI从设备和桥设备。其中PCI从设备只能被动地接收来自HOST主桥或者其他PCI设备的读写请求;而PCI主设备可以通过总线仲裁获得PCI总线的使用权,主动地向其他PCI设备或者主存储器发起存储器读写请求。而桥设备的主要作用是管理下游的PCI总线,并转发上下游总线之间的总线事务。
一个PCI设备可以既是主设备也是从设备,但是在同一个时刻,这个:PCI设备或者为主设备或者为从设备。:PCI总线规范将PCI主从设备统称为PCI Agent设备。在处理器系统中常见的PCI网卡、显卡、声卡等设备都属于PCI Agent设备。
在:PCI,总线中,HOST主桥是一个特殊的PCI设备,该设备可以获取PCI总线的控制权访问PCI设备,也可以被PCI设备访问。但是HOST主桥并不是PCI设备。PCI规范也没有规定如何设计HOST主桥。
在PCI总线中,还有一类特殊的设备,即桥设备。它包括PCI:桥、PCI-to-(E)ISA桥和PCI-to-Cardbus桥。本书重点介绍PCI桥,而不介绍其他桥设备的实现原理。PCI桥的存在使PCI总线极具扩展性,处理器系统可以使用PCI桥进一步扩展PCI总线。
PCI桥的出现使得采用PCI总线进行大规模系统互连成为可能。但是在目前已经实现的大规模处理器系统中,并没有使用PCI总线进行处理器系统与处理器系统之间的大规模互连。因为PCI总线是一个以HOST主桥为根的树型结构,使用主从架构,因而不易实现多处理器系统间的对等互连。
即便如此PCI桥仍然是PCI总线规范的精华所在,掌握PCI桥是深入理解PCI体系结构的基础。PCI桥可以连接两条PCI总线,上游PCI总线和下游PCI总线,这两个PCI总线属于同一个PCI总线域,使用PCI桥扩展的所有PCI总线都同属于一个PCI总线域。