linux pcie热插拔驱动 | 您所在的位置:网站首页 › pci支持热插拔吗 › linux pcie热插拔驱动 |
背景
Read the fucking source code! --By 鲁迅A picture is worth a thousand words. --By 高尔基
说明: Kernel版本:4.14ARM64处理器使用工具:Source Insight 3.5, Visio 1. 概述从本文开始,将会针对PCIe专题来展开,涉及的内容包括: PCI/PCIe总线硬件;Linux PCI驱动核心框架;Linux PCI Host控制器驱动;不排除会包含PCIe外设驱动模块,一切随缘。 作为专题的第一篇,当然会先从硬件总线入手。进入主题前,先讲点背景知识。在PC时代,随着处理器的发展,经历了几代I/O总线的发展,解决的问题都是CPU主频提升与外部设备访问速度的问题: 第一代总线包含ISA、EISA、VESA和Micro Channel等;第二代总线包含PCI、AGP、PCI-X等;第三代总线包含PCIe、mPCIe、m.2等;PCIe(PCI Express)是目前PC和嵌入式系统中最常用的高速总线,PCIe在PCI的基础上发展而来,在软件上PCIe与PCI是后向兼容的,PCI的系统软件可以用在PCIe系统中。 本文会分两部分展开,先介绍PCI总线,然后再介绍PCIe总线,方便在理解上的过渡,开始旅程吧。 2. PCI Local Bus 2.1 PCI总线组成 PCI总线(Peripheral Component Interconnect,外部设备互联),由Intel公司提出,其主要功能是连接外部设备;PCI Local Bus,PCI局部总线,局部总线技术是PC体系结构发展的一次变革,是在ISA总线和CPU总线之间增加的一级总线或管理层,可将一些高速外设,如图形卡、硬盘控制器等从ISA总线上卸下,而通过局部总线直接挂接在CPU总线上,使之与高速CPU总线相匹配。PCI总线,指的就是PCI Local Bus。先来看一下PCI Local Bus的系统架构图: 从图中看,与PCI总线相关的模块包括: Host Bridge,比如PC中常见的North Bridge(北桥)。图中处理器、Cache、内存子系统通过Host Bridge连接到PCI上,Host Bridge管理PCI总线域,是联系处理器和PCI设备的桥梁,完成处理器与PCI设备间的数据交换。其中数据交换,包含处理器访问PCI设备的地址空间和PCI设备使用DMA机制访问主存储器,在PCI设备用DMA访问存储器时,会存在Cache一致性问题,这个也是Host Bridge设计时需要考虑的;此外,Host Bridge还可选的支持仲裁机制,热插拔等; PCI Local Bus;PCI总线,由Host Bridge或者PCI-to-PCI Bridge管理,用来连接各类设备,比如声卡、网卡、IDE接口等。可以通过PCI-to-PCI Bridge来扩展PCI总线,并构成多级总线的总线树,比如图中的PCI Local Bus #0和PCI Local Bus #1两条PCI总线就构成一颗总线树,同属一个总线域; PCI-To-PCI Bridge;PCI桥,用于扩展PCI总线,使采用PCI总线进行大规模系统互联成为可能,管理下游总线,并转发上下游总线之间的事务; PCI Device;PCI总线中有三类设备:PCI从设备,PCI主设备,桥设备。PCI从设备:被动接收来自Host Bridge或者其他PCI设备的读写请求;PCI主设备:可以通过总线仲裁获得PCI总线的使用权,主动向其他PCI设备或主存储器发起读写请求;桥设备:管理下游的PCI总线,并转发上下游总线之间的总线事务,包括PCI桥、PCI-to-ISA桥、PCI-to-Cardbus桥等。 2.2 PCI总线信号定义PCI总线是一条共享总线,可以挂接多个PCI设备,PCI设备通过一系列信号与PCI总线相连,包括:地址/数据信号、接口控制信号、仲裁信号、中断信号等。如下图: 看一下C/BE[3:0]都有哪些命令吧: PCI使用三种模型用于数据的传输: PCI体系架构支持三种地址空间: memory空间:针对32bit寻址,支持4G的地址空间,针对64bit寻址,支持16EB的地址空间; I/O空间PCI最大支持4G的IO空间,但受限于x86处理器的IO空间(16bits带宽),很多平台将PCI的IO地址空间限定在64KB; 配置空间x86 CPU可以直接访问memory空间和I/O空间,而配置空间则不能直接访问;每个PCI功能最多可以有256字节的配置空间;PCI总线在进行配置的时候,采用ID译码方式,使用设备的ID号,包括Bus Number,Device Number,Function Number和Register Number,每个系统支持256条总线,每条总线支持32个设备,每个设备支持8个功能,由于每个功能最多有256字节的配置空间,因此总的配置空间大小为:256B * 8 * 32 * 256 = 16M; 有必要再进一步介绍一下配置空间:x86 CPU无法直接访问配置空间,通过IO映射的数据端口和地址端口间接访问PCI的配置空间,其中地址端口映射到0CF8h - 0CFBh,数据端口映射到0CFCh - 0CFFh; 那具体的配置空间寄存器都是什么样的呢?每个功能256Byte,前边64Byte是Header,剩余的192Byte支持可选功能。有种类型的PCI功能:Bridge和Device,两者的Header都不一样。 Bridge Device 先看一下PCIe架构的组成图: 前文提到过,PCIe在软件上保持了后向兼容性,那么在PCIe的设计上,需要考虑在PCI总线上的软件视角,比如Root Complex的实现可能就如下图所示,从而看起来与PCI总线相差无异: 而Switch的实现可能如下图所示: PCIe规范定义了分层的架构设计,包含三层: Transaction层 负责TLP包(Transaction Layer Packet)的封装与解封装,此外还负责QoS,流控、排序等功能;Data Link层 负责DLLP包(Data Link Layer Packet)的封装与解封装,此外还负责链接错误检测和校正,使用Ack/Nak协议来确保传输可靠;Physical层 负责Ordered-Set包的封装与解封装,物理层处理TLPs、DLLPs、Ordered-Set三种类型的包传输;数据包的封装与解封装,与网络包的创建与解析很类似,如下图: 来一个更详细的PCIe分层图: 为了兼容PCI软件,PCIe保留了256Byte的配置空间,如下图: 此外,在这个基础上将配置空间扩展到了4KB,还进行了功能的扩展,比如Capability、Power Management、MSI中断等: 草草收场吧,对PCI和PCIe有一些轮廓上的认知了,可以开始Source Code的软件分析了,欲知详情、下回分解! 参考《PCI Express Technology 3.0》 《pci local bus specification revision 3.0》 《PCIe体系结构导读》 《PCI Express系统体系结构标准教材》 如果对你有用的话,在看,分享,打赏三连吧,谢谢。 |
CopyRight 2018-2019 实验室设备网 版权所有 |