PCI、PCIe相关知识整理汇总 【PCIe总线】 -- PCI、PCIe相关实现
目录
PCI基础知识
HOST桥
PCI桥
PCI设备
PCIe基础知识
PCI和PCIe的差别
PCIe硬件相关基础知识
PCIe总线使用的信号
PCIe链路的扩展
PCIe寄存器配置信息
PCI设备的配置空间
PCI桥的配置空间
PCIe设备的扩展配置空间
PCI Express Capability结构
PCI基础知识
PCI总线的组成:HOST桥、PCI桥、PCI设备PCI采用的是树型拓扑结构,每一个PCI device相当于树的一个结点或者叶子,对整个PCI Bus的遍历可以采用遍历树的算法,在对树进行遍历之后,可以获得整个PCI Bus的资源需求情况,从而进行统一的分配。PCI总线上有多个设备,当他们需要通信时,都必须向PCI总线仲裁器提出申请,当得到允许后才能在总线中发送数据PCI总线上的设备可以通过四根中断请求信号INTA INTB INTC INTD向处理器发出中断请求;其中INTA是单功能设备,其他的是多功能设备总线x1上的通讯和总线x2上的通讯无关,同一条总线上的设备可以自由通讯PCI总线操作的一具典型的特点就是支持BURST传输。什么是BURST传输呢?首先你得知道PCI的数据总线和地址总线是复用的。这就是说在同样的总线上,一段时间是地址,一段时间是传输数据。如果没有BURST传输,那么完成一次数据传输之前都得发一次地址,这就是总线有一半的时间都在传地址,这使得总线和利用率很低。有了BURST传输,可以先发一个起始地址和数据长度N, 之后传输数据0~N-1就可以直接发数据,不用再发地址了。PCI总线32位中,第一个16位表示域,第二个8位表示一个总线编号,第三个5位表示一个设备号,最后是3位,表示功能号。在系统引导阶段,PCI硬件设备保持未激活状态,但每个PCI主板均配备有能够处理PCI的固件,固件通过读写PCI控制器中的寄存器,提供了对设备配置地址空间的访问。
HOST桥
HOST主桥是用来隔离处理器的存储器域与PCI总线域的特殊桥片,管理PCI总线域。在其所管理的PCI设备中所有设备的配置空间都由HOST主桥通过配置读写总线周期访问的
PCI总线上的设备都有自己的设备地址,处理器空间地址和PCI总线地址通过HOST主桥进行隔离。(HOST主桥中有很多的寄存器,可以使得处理器工作的频率和总线工作的频率不一样,通过寄存器缓存数据,当处理器需要访问PCI设备时,需要通过HOST主桥进行地址转换,把处理器地址转换成PCI总线地址,然后才能访问PCI设备;同理,PCI设备中的数据要想往外走,也要通过HOST主桥进行地址转换。说到底,HOST主桥就是一个桥梁)同一HOST桥中的设备可以通讯(HOST主桥可以通过设置Inbound寄存器来让不同的PCI总线域中的设备进行通讯)上游总线就是PCI桥靠近HOST主桥的一端总线、下游总线就是另外一端总线在一个处理器系统中,有几个HOST主桥,就有几个PCI总线域。
PCI桥
PCI桥是PCI总线的一个重要组成部件,该部件的存在使得PCI总线极具拓展性。PCI的可扩展性指的是PCI总线上可以挂个PCI桥,然后PCI桥会推出另一条PCI总线,PCI总线上又可以挂载PCI桥,再推出PCI总线...(但是,PCI总线以HOST主桥为树根,连接的设备上限为256,其中包括HOST桥和PCI桥PCI桥的作用可以隔离PCI设备,不影响各条总线的带宽如果PCI桥出现问题,那么PCI桥下的设备之间可以自由通讯但是无法将数据发送到外面
PCI设备
PCI Agent设备:一个PCI设备既可以是主设备也可以是从设备,但是在同一个时刻,这个PCI设备或者为主设备或者为从设备。PCI总线规范将PCI主从设备统称为PCI Agent设备。PCI设备的地址可以由系统软件动态分配,解决了地址冲突。(每个PCI设备有一个独立的配置空间,里面有设备在总线上的地址;注:PCI桥的配置空间中有其PCI子树使用的地址范围)PCI设备与存储器直接进行数据交换的过程也被称为DMA。PCI总线进行DMA操作时,需要得到数据的大小和目的地址(PCI总线域的物理地址,HOST主桥会负责地址转换)PCI设备配置地址空间的前64字节是标准化的,它提供了厂商号,设备号,版本号等信息,唯一标识一个PCI设备。
PCIe基础知识
pcie全称叫做:Peripheral Component Interconnect(外围组件互联),属于局部总线,主要功能就是连接外围设备pcie的组成有:RC(根节点)、siwtch(pcie桥)、EP(设备)pcie总线有独立的地址空间,所以CPU想要通过pcie访问外围设备,需要对pcie的地址空间进行映射pcie分多版本的,x1、x2、x4、x8、x16...各级之间传输速率呈倍数增加,但价格也呈倍增加。PCI-E的接口根据总线位宽不同而有所差异,包括X1、X4、X8以及X16,而X2模式将用于内部接口而非插槽模式。pcie传输和网络类似封装成包,有协议栈。pcie使用端到端的连接方式,正常设备与设备之间只能连接一个,但通过pcie桥可以扩展。PCI是并行总线;PCI-X是并行总线;PCIe是高速差分总线
高速差分总线替代并行总线是大势所趋。与单端并行信号相比,高速差分信号可以使用更高的时钟频率,更少的信号线,完成之前许多单端并行数据才能达到的总线带宽。
PCI和PCIe的差别
PCI使用并行总线结构,同一条总线上的所有外部设备共享总线带宽
PCIe使用高速差分总线,支持更高的时钟频率,达到更高的总线带宽
PCI总线上最多支持256个设备
PCIe采用端到端的连接方式,在每一条PCIe链路中只能连接两个设备
PCIe硬件相关基础知识
PCIe使用“端到端的数据传送方式”,发送端和接收端都含有TX和RX,其结构如图所示:
PCIe总线的物理链路的一个数据通路(Lane)中,有两组差分信号,共四根信号线。一个PCIe链路可以由多个Lane组成。PCIe链路可以由多个Lane组成,目前PCIe链路可以支持1、2、4、8、12、16、32个Lane,即*1、*2、*4、*8、*12、*16、*32宽度的PCIe链路。每一个Lane上使用的总线频率与PCIe总线使用的版本有关。PCIe的总线规范有v1.0、v1.0a、v1.1、v2.0、v2.1、v3.0...不同的PCIe总线规范使用的总线频率并不相同,其使用的编码方式也不相同。
与单端信号相比,差分信号抗干扰能力更强,因为差分信号在布线时被要求“等长”、“等宽”、“贴近”,而且在同层。因此外部干扰噪声将被“同值”,其差值理想状态下为0。此外差分信号能有效抑制电磁干扰。差分信号的缺点也显而易见:一是差分信号使用两根信号传输一位数据,二是差分信号的布线要求比较严格。PCIe总线中,使用GT计算PCIe链路的峰值带宽,其计算公式为:总线频率*数据位宽*2
PCIe总线使用的信号
PCIe设备使用两种电源信号供电,分别是Vcc与Vaux,其额定电压为3.3V。PCIe设备使用的主要逻辑模块均使用Vcc供电,而一些与电源管理相关的逻辑使用Vaux供电。使用Vaux的主要原因是为了降低功耗和缩短系统恢复时间。
PCIe还使用了下列辅助信号:
PERST#信号
为全局复位信号,由处理器系统提供,为PCIe插槽和PCIe设备提供复位信号,PCIe设备使用该信号复位内部逻辑。
REFCLK+和REFCLK-信号
PCIe设备与PCIe插槽都具有REFCLK+和REFCLK-信号,其中PCIe插槽使用这组信号与处理器系统同步。在处理器系统中,通常采用专用逻辑向PCIe插槽提供REFCLK+和REFCLK-信号。PCIe插槽需要使用参考时钟,其频率为100MHz。在PCIe设备配置空间的Link Control Register 中,含有一个“common clock configuration”位。当该位为“1”时,表示该设备与PCIe链路的对端设备使用“相同位”的参考时钟;如果为“0”,表示该设备与PCIe链路的对端设备使用的参考时钟是异步的。(默认这一位缺省值为“0”)这个异步时钟设置方法对于使用PCIe链路进行远程连接时尤为重要。
WAKE#信号
当PCIe设备进入休眠状态,主电源已经停止供电时,PCIe设备可以将WAKE#信号向处理器系统提交唤醒请求,使系统重新为该PCIe设备提供主电源。(产生该信号的硬件逻辑必须使用Vaux供电)PCIe设备除了使用WAKE#信号实现唤醒功能外,还可以使用Beason信号实现唤醒功能。与WAKE#信号实现唤醒功能不同,Beacon使用In-band信号(即差分信号D+和D-)实现唤醒功能。当PCIe设备准备退出L2状态时,可以使用Beacon信号,提出唤醒请求。
JTAG信号
JTAG(joint Test Action Group)是一种国际标准测试协议,与IEEE 1149.1兼容,主要用于芯片内部测试。目前绝大多数器件都支持JTAG测试标准。JTAG信号由TRST#、TCK#、TDI、TDO和TMS信号组成。其中TRST为复位信号;TCK为时钟信号;TDI和TDO分别于数据输入和数据输出对应;TMS为模式选择。
PRSNT1#和PRSNT2#信号
PRSNT1#和PRSNT2#信号与PCIe设备热插拔相关。在基于PCIe总线的Add-In卡中,PRSNT1#和PRSNT2#信号直接相连,而在处理器主板中,PRSNT1#信号接地,PRSNT2#信号通过上拉电阻接为高。在Add-In卡插入主板时,PRSNT2#信号将与PRSNT1#信号通过Add-In信号连通,此时PRSNT2#信号为低。处理器主板的热插拔控制逻辑将捕获这个“低电平”,从而触发软件系统进行相应的处理。
PCIe链路的扩展
PCIe链路使用端到端的数据传输方式。
在一条PCIe链路中,两个端口完全对等,分别连接发送设备和接收设备,而且一个PCIe链路的一端只能连接一个发送设备或者接收设备。因此PCIe链路必须使用Switch扩展PCIe链路后,才能连接多个设备。
在PCIe总线中,Switch是一个特殊的设备,该设备由1个上游端口和2~n个下游端口组成。PCIe总线规定,在一个Switch中可以与RC直接或者间接相连的端口为上游端口。除了上游端口外,其他所有端口都被称为下游端口,下游端口一般与EP相连,或者链接下一级Switch。
在Switch中,还有两个与端口相关的概念,分别是Egress端口和Ingress端口。这两个端口与通过Switch的数据流向有关。Egress端口指发送端口即数据离开Switch使用的端口;Ingress端口指接收端口即数据进入Switch使用的端口。
PCIe寄存器配置信息
PCI设备的配置空间
在PCI Agent设备的配置空间中包含的寄存器如下图所示。
Device ID和Vendor ID寄存器
这两个值由PCISIG分配,只读。其中Vendor ID代表PCI设备的生产厂商,而Device ID代表这个厂商所生产的具体设备。
Revision ID和Class Code寄存器
这两个寄存器只读。Revision ID记录PCI设备的版本号,可以认为是Device ID的扩展。Class Code记载PCI设备的分类。
Class Code寄存器有三个字段组成,分别是Base Class Code、Sub Class Code和Interface。其中Base Class Code将PCI设备分类为显卡、网卡、PCI桥等设备;Sub Class Code对这些设备进行进一步细分;而Interface定义编程接口。Class Code寄存器可供系统软件识别当前PCI设备的分类。
Header Type寄存器
该寄存器只读,由八位组成。第7位表示当前PCI设备是多功能设备,为0表示为单功能设备。第6~0位表示当前配置空间的类型,为0表示使用PCI Agent设备的配置空间,普通PCI设备都是用这种配置头;为1表示使用PCI桥的配置空间,PCI桥使用这种配置头;为2表示Cardbus桥片的配置空间,Card Bus桥片使用这种配置头。
Cache Line Size寄存器
该寄存器记录HOST处理器使用的Cache行长度。在PCI总线中和Cache相关的总线事务,如存储器写并无效和Cache多行读等总线事务需要使用这个寄存器。(如果PCI设备不支持与Cache相关的总线事务,系统软件可以不设置该寄存器,此时寄存器的值为0x00。对于PCIe设备,该寄存器值毫无意义。)
Subsystem ID和Subsystem Vendor ID寄存器
这两个寄存器和Devide ID及Vendor ID类似,也是记录PCI设备的生产厂商和设备名称。
Expansion ROM base address寄存器
有些设备在处理器还没有运行操作系统之前,就需要完成基本的初始化设置,比如显卡、键盘和硬盘等设备。为了实现这个“预先执行”功能,PCI设备需要提供一段ROM程序。而处理器在初始化过程中将运行这段ROM程序,初始化这些PCI设备。Expansion ROM base address记录这段ROM程序的基地址。
Capabilities Pointer寄存器
在PCI设备中,该寄存器是可选的,但是在PCI-X和PCIe设备中必须支持这个寄存器,Capabilities Pointer寄存器存放Capabilities寄存器组的基地址,PCI设备使用Capabilities寄存器组存放一些与PCI设备相关的扩展配置信息。
Interrupt Line寄存器
这个寄存器是系统软件对PCI设备进行配置时写入的,记录当前PCI设备使用的中断向量号,设备驱动程序可以通过这个寄存器,判断当前PCI设备使用处理器系统中的哪个中断向量号,并将驱动程序中的中断服务例程注册到操作系统中。(改寄存器由系统䶲对PCI设备进行配置时写入)
Interrupt Pin寄存器
这个寄存器保存PCI设备使用的中断引脚。PCI总线提供了四个中断引脚:INTA#、INTB#、INTC#、INTD#。(如果PCI设备只有一个子设备时,该设备只能使用INTA#)
Base Address Register 0~5寄存器
该寄存器简称为BAR寄存器,BAR寄存器保存PCI设备使用的地址空间的基地址,该基地址保存的是该设备在PCI总线域中的地址。其中每一个设备最多可以有6个基址空间,但多数设备不会使用这么多的地址空间。
在PCI设备复位后,该寄存器将存放PCI设备使用的基地址空间大小,这段空间是I/O空间还是存储器空间,如果是存储器空间该空间是否课预取...
系统软件对PCI总线进行配置时,首先获得BAR寄存器中的初始化信息,之后根据处理器系统的配置,将合理的基地址写入相应的BAR寄存器中。(系统软件可以使用该寄存器获得PCI设备使用的BAR空间的长度)
处理器访问PCI设备的BAR空间时,需要使用BAR寄存器提供的基地址。值得注意的是,处理器使用存储器域的地址,而BAR寄存器存放PCI总线域的地址。因此处理器系统并不能直接使用“BAR寄存器+偏移”的方式访问PCI设备的寄存器空间,而需要将PCI总线域的地址转换为存储器域的地址。
在编写Linux设备驱动程序时,必须使用pci_resource_start函数获得BAR空间对应的存储器域的物理地址,再使用ioremap函数将这个物理地址转换为虚拟地址。
Command寄存器
该寄存器为PCI设备的命令寄存器,在初始化时,其值为0。系统软件需要合理的配置该寄存器之后,才能访问该设备的存储器或者I/O空间。
Status寄存器
该寄存器绝大多数位都是只读位,保存PCI设备的状态。
Latency Timer寄存器
PCI总线中,多个设备共享同一条总线带宽。该寄存器用来控制PCI设备占用PCI总线的时间。当PCI设备获得总线使用权,并使能Frame#信号后,Latency Timer寄存器将递减,当该寄存器归零后,该设备将使用超时机制停止对当前总线的使用。
PCI桥的配置空间
PCI桥使用的配置空间的寄存器如图所示。
Subordinate Bus Number、Secondary Bus Number、Primary Bus Number寄存器
PCI桥可以管理其下的PCI总线子树。其中Subordinate Bus Number寄存器存放当前PCI子树中,编号最大的PCI总线号。而Secondary Bus Number寄存器存放当前PCI桥Secondary Bus使用的子线号,也是该PCI桥管理的PCI子树中最小的PCI总线号。因此一个PCI桥能够管理的PCI总线号在Subordinate Bus Number~Secondary Bus Number之间。这两个寄存器的值由系统软件遍历PCI总线树时设置。
Primary Bus Number寄存器存放该PCI桥上游的PCI总线号,该寄存器可读写。
Subordinate Bus Number、Secondary Bus Number、Primary Bus Number寄存器在初始化是必须为0,系统会根据这几个寄存器是否为0,判断PCI桥是否没配置过。
Secondary Status寄存器
该寄存器含义与PCI Agent配置空间的Status寄存器的含义相近,PCI桥的Secondary Status寄存器记录Secondary Bus的状态,而不是PCI桥作为PCI设备时使用的状态。在PCI桥配置空间中还有一个Status寄存器,该寄存器保存PCI桥作为PCI设备时的状态。
secondary Latency Timer寄存器
该寄存器含义与PCI Agent配置空间Latency Timer寄存器的含义相近,PCI桥的Secondary Latency Timer寄存器管理Secondary Bus的超时机制,即PCI桥发向下游的总线事务;在PCI桥配置空间中还有一个Latency Timer寄存器,该寄存器管理PCI桥发向上游的总线事务。
I/O Limit 和 I/O Base寄存器
在PCI桥管理的PCI子树中有许多PCI设备,这些PCI设备可能会使用I/O地址空间。PCI桥使用这两个寄存器,存放PCI子树中所有设备使用的I/O地址空间集合的基地址和大小。
Memory Limit 和 Memory Base寄存器
在PCI桥管理的PCI子树中有许多PCI设备,这些PCI设备可能会使用存储器地址空间。PCI桥使用这两个寄存器,存放PCI子树中所有设备使用的存储器地址空间集合的基地址和大小。PCI桥规定这个空间的大小至少为1MB。
Prefetchable Memory Limit 和 Prefetchable Memory Base寄存器
在PCI桥管理的PCI子树中有许多PCI设备,如果这些PCI设备支持预读,则需要从PCI桥的可预读空间中获取地址空间。PCI桥的这两个寄存器存放这些PCI设备使用的可预读存储器空间的基地址和大小。
I/O Base Upper 16Bits and I/O Limit Upper 16寄存器
如果PCI桥仅支持16位的I/O端口,这组寄存器只读,且其值为0。如果PCI桥支持32位I/O端口,这组寄存器可以提供I/O端口的高16位地址。
Bridge Control寄存器
该寄存器用来管理PCI桥的secondary Bus,其主要位的描述如下。
secondary Bus Reset位,第6位,可读写。当该位为1时,将使用下游总线提供的RST#信号复位与PCI桥的下游总线连接的PCI设备。
Primary Discary Timer位,第8位,可读写。当该位为1时,表示Primary Bus上的主设备需要在2^10个时钟周期内重试这个数据请求,为0时,表示主设备需要在2^15个时钟周期内重试这个数据请求,否则PCI桥将丢弃Delay数据请求。
Secondary Discard Timer位,第9位,可读写。当该位为1时,表示在Secondary Bus上的主设备需要在2^10个时钟周期内重试这个数据请求,为0时,表示主设备需要在2^15个时钟周期内重试这个数据请求,否则PCI桥将丢弃Delay数据请求。
PCIe设备的扩展配置空间
PCI-X和PCIe总线规范要求其设备必须支持Capabilities结构。在PCI总线的基本配置空间中,包含一个Capabilities Pointer寄存器,该寄存器存放Capabilities结构链表的头指针。在一个PCIe设备中,可能含有多个Capability结构,这些寄存器组成一个链表,其结构如图所示。
其中每一个Capability结构都有唯一的ID号,每一个Capability寄存器都有一个指针,这个指针指向下一个Capability结构,从而组成一个单向链表结构,这个链表的最后一个Capability结构的指针为0。
一个PCIe设备可以包含多个Capability结构,包括与电源管理相关、与PCIe总线相关的结构、与中断请求相关的Capability结构、PCIe Capability结构和PCIe扩展的Capability结构。在PCIe总线规范中,定义了较多的Capability结构,这些结构适用于不同的应用场合,在一个指定的PCIe设备中,并不一定支持本篇中涉及的所有Capability结构。系统软件程序员也不需要完全掌握PCIe总线规范定义的这些Capability结构。
PCI Express Capability结构
PCI Express Capability结构存放一些和PCIe总线相关的信息,包括PCIe链路和插槽的信息。有些PCIe设备不一定实现了PCI Express Capability结构中的所有寄存器,或者并没有提供这些寄存器供系统软件访问。