注:网络上有一些图片和表达,引用处会说明。
一、PCIE简介
PCIE总线技术,又称计算机内部总线技术Peripheral Component Interconnect即外围组件互联。PCIe一般用于大型数据中心,可连接显卡、网卡等片外设备。
1.1 PCIe相关概念
PCIe基本结构包括根组件(Root Complex),交换器(Switch)和各种终端设备(Endpoint)
- 设备类型 PCIe子系统有四种设备类型,即Root Complex(RC),PCIe switch,PCIe End Point和PCIe Bridge。如下图所示,switch设备和RC设备可以向上或向下连接PCIe总线,PCIe总线的底层是EP设备。
- RC 在PCI也叫规范HOST主桥,RC该模块需要接收与操作系统相关的硬件信号(如接口寄存器、状态寄存器、异常寄存器、数据缓存、小型状态机等),主要事务包括: 1)PCI域与IO域地址映射机制 2)实现兼容PCI中断映射及设备PCIe中断写作机制 3)实现核与PCIe接口间的报纸和新闻类型转换 4)存储PCIe设备配置数据
- switch
- EP RC和EP在PCIE树形结构中的角色不同,Rp是根,EP是叶结点PCIE角度来看,RP可以发起CFG Rd和Wr,但是EP不可能。 物理层和部分链路层可以相互访问,但传输层不好
- bridge PCIe bridge可用于扩展PCI总线也可用于连接慢速设备PCI总线树起到上下作用。pcie转网卡bridge、pcie转USBbridge等 如图,PCI总线可通过PCI桥形成一个胖树结构,每个桥都是父节点,PCI Agent设备只能是子节点,每个节点PCI总线的下方都可以挂接一个到多个PCI桥,每个PCI可以推出新桥PCI总线。在同一条PCI总线设备之间的数据交换不会影响其他设备PCI总线
-
PCIe计算数据传输速率 如下图所示PCI到PCIe 5.所有版本的带宽和数据传输频率。 以PCIe3.0 x例如,因为PCIe双向传输带宽与频率的关系是: 8GHz * 16bit / 8bit * 2 = 32 GB/s
-
NTB 在一些特殊情况下,如传统存储系统中的多个控制器,它们需要同步大量的数据和控制信息,并希望使用它们PCI-E直接通信链路。但是在switch上有多个RC设备不能直接通信,因为主机BIOS或者OS同一堆枚举PCIe总线内的设备,并为其分配访问地址,此时会发生冲突。为了满足这一需求,出现了NTB技术。 地址翻译的基本原理是两个不同的系统(术语)System Image,SI)各有各的地址空间,会产生重叠。所以只要 在PCI-E Switch内部地址映射翻译相应的数据包,实现双方通信。这种带有地址翻译的桥接技术被称为None Transparent Bridge,非透明桥。
-
PCIe总线的缺点
- 采用基于总线的共享传输模式PCI两组以上的数据不可能同时在总线上传输,当一个时PCI当设备占用总线时,其他设备只能等待;
- 总线频率从33开始MHz提高到66MHz,甚至133MHz(PCI-X),信号线之间的相互干扰越来越严重,在主板上布置多条总线越来越困难;
- 由于PCI设备采用内存映射I/O地址与内存建立联系,热添加PCI设备已经成为一项非常困难的工作。目前的做法是在内存中为每一个PCI设备画50块M到100M在该区域,用户不能使用此空间,因此如果主板上支持的热插拔PCI界面越多,用户损失的内存就越多;
- PCI虽然总线上有buffer作为数据的缓冲区,但没有纠错功能。如果数据丢失或损坏发生在传输过程中,控制器只能触发一个NMI中断通知操作系统PCI错误发生在总线上
-
ARI功能 参考链接:link
-
pcie板级电气特性 参考链接:PCIe控制器——PCIe电气特征
1.2 PCI和PCIe的关系
-
PCI是共享总线,多个设备共享总线,在这种情况下,总线总裁是不可避免的。PCIe点对点连接,一个设备直接连接到另一个设备,没有总线竞争和仲裁。
-
PCI总线是单向传输,任何时候只有一个方向,PCIe可随时双向传输。
-
PCI边带控制信号很多,比如FRAME#, IRDY#, TRDY, STOP#等。PCIe总线传输是基于包(packet),包中嵌入控制等处理。
1.3 PCIE 硬件主模块
PCIe设计可分为controller和PHY,整体设计比较复杂,一般可向IP厂家定制设计,controller和PHY模块的接口是PIPE接口
1.3.1 PCIE控制器
控制器逻辑通常包括以下模块:
- reset逻辑:通常通过总复位控制子设置复位逻辑;
- debug逻辑:监测IP为设计师提供状态debug用;
- msg处理逻辑:IP某些信号由message处理,有CPU内核处理;
- 子系统配置处理逻辑;
- 错误处理逻辑:查找寄存器,并记录,产生中断;
- MSI逻辑:监控地址和数据通道;
- 中断逻辑:IP有些中断可以合并;
- PHY控制逻辑:直通PHY配置和控制模块寄存器;
- DFT:IP中会专门提供DFT的引脚。
1.3.2 PHY模块
PHY模块细分为逻辑、电子层和物理介质连接(PMA)层。 物理逻辑子层包含物理编码子层(PCS);PMA层包含串行器/解串器(SerDes)与其他模拟电路;
- PCIE Serdes SerDes(Serializer-Deserializer)是串行器和解串器的缩写,串行器(Serializer)也称为SerDes发送端(Tx),(Deserializer)也叫接收端Rx。 SerDes可分为三部分,PLL模块,发送模块Tx,接收模块Rx。
1.4 PCIe的参考时钟
Serdes 所用时钟由 PHY 模块内的PLL生成,PLL参考时钟由外部提供或从接收数据流中恢复。 通常内部PLL参考时钟为100MHz,Gen1~Gen4 以下是收发端参考时钟的精度 ±300 ppm 以内,Gen5 要求频率稳定性 ±100 ppm。
二、PCIe层次结构的控制器
PCI Express由设备核心层、传输事务层、数据链路层和物理层组成的分层协议。
2.1 设备核心层
该层级术语PCIe负责报纸生成、报纸分发和控制序列的上层逻辑
2.2 传输事务层
定义了传输事务层PCIe可通过总线使用的总线事务switch等待设备传输RC等其他PCIe设备,RC这些事务也可以用来访问其他事务PCIe设备。工作包括:
- 传输层接收来自核心层的数据,将其封装为TLP(Transaction layer packet)后发向数据链路层
- 传输层还可以从数据链路层接收数据报告,并将其发送到核心层。
- 链路训练
- 信元管理
- 处理PCIe总线序
- 保护流量控制机制PCIe链路的使用效率
2.2.1 TLP相关
当PCIe当设备相互访问时,传输的数据报告将被事务层打包成一个或多个TLP,这些TLP它将继续传输到下层,最终通过PCIe总线发送给被要求的设备。 实际上完整的TLP包由多个字段组成,这些字段由三个层次组成,最终通过物理层形成TLP。
- TLP格式 完成传输事务层TLP主要的部分header段和data段。 详情参考链接: PCIe控制器-数据报文TLP
- 数据负载相关
当数据传输量较大时,需要根据负载的大小和限制进行调整TLP进行传输。PCIe设备含有“Max_Payload_Size”和“Max_Payload_Size Suppored”两个参数,这两个参数分别在Device Capability和Device Control寄存器定义,这两个寄存器在PCIe Capability结构中。
PCIe设备发送数据报文是,使用Max_Payload_Size参数决定TLP的最大有效负载,当PCIe设备所要传输的数据大小超过Max_payload_Size时,这段数据将被分割为多个TLP进行发送。 Max_Payload_Size supported参数固化在硬件中,指Max_Payload_Size的最大值。
2.2.2 总线事务类型
参考链接:PCIe控制器——总线传输事务
2.3 数据链路层
数据链路层保证来自于事务层的数据报文完整可靠的发送到下一层。其主要工作有:
- 来自事务层的报文将被添加sequence number前缀和CRC后缀,使用ACK/NCK协议保证报文的可靠性
- 链路训练
- 信元管理
- 流控制
- 定义多种DLLP(Data link layer packet)
2.3.1 链路训练
参考链接:PCIE控制器——链路训练
2.3.2 flow control
流控制,保证发送端的PCIe设备永远不会发送接收端PCIe设备不能接收的TLP(事务层包)。也就是说,发送端在发送前可以通过Flow Control机制知道接收端能否接收即将发送的TLP。 通过两个port间的链路层发送DLLP来实现。
2.4 物理层
电气信号转换、串并转换
三、PCIE运行机制
3.1 reset机制
PCIe设备可以根据当前的设备的运行状态选择合适的复位方式,PCIe总线提供多种复位方式的主要原因是减小PCIe设备的复位延时。其中传统复位方式的延时大于FLR方式。
3.1.1 传统复位方式(Conventional Reset)
- fundamental reset 有cold reset和hot reset两种方式,Cold Reset使用的时间最长,而Hot Reset使用的时间最短。
- cold reset 当一个PCIe设备的Vcc电源上电后,处理器系统将置该设备的PERST#信号为有效,此时将引发PCIe设备的复位方式。此时,所有使用Vcc进行供电的寄存器和PCIe端口逻辑将无条件进入初始状态。 但是使用这种方式依然无法复用使用Vaux(备用电源)供电的寄存器和逻辑,这些寄存器和逻辑只能在处理器完全掉电时彻底复位
- warm reset 在PCIe的设备完成上电后,也可能重新进行Fundamental Reset,这种复位方式也被称为Warm Reset。
- non-fundamental reset物理层的Link初始化
- hot reset 当PCIe设备出现某种异常时,可以使用软件手段对该设备进行复位,此时链路将会断开,PCIe控制器内部除地址映射相关的寄存器外其余寄存器将会被复位。 具体复位过程:第一种方法是系统软件在client逻辑中产生hotreset信号,另一种方法是将Bridge Control Register 的Secondary Bus Reset位置为1,该桥片将secondary总线上的PCI/PCIe设备进行Hot Reset。PCIe总线将通过TS1和TS2序列对下游设备进行Hot Reset。在TS1和TS2序列中包含一个Hot Reset位。当下游设备收到一个TS1和TS2序列,而且Hot Reset位为1时,下游设备将使用HotReset方式进行复位操作。
3.1.2 FLR reset
除了传统的复位方式之外,PCIe总线还提供了FLR( Function Level Reset)方式,只对控制器的某些功能进行复位,链路训练不受影响。在多RC设备系统中,任务在指定的分区中运行,当这个任务执行完毕后,系统软件需要调整硬件资源的分区。此时受到影响的PCIe设备需要使用FLR方式复位内部的逻辑,以免造成对新的分区的资源污染,并保护之前任务的结果。 系统软件通过填写某些寄存器,如synopsys 的PCIe的IP是可以PCIeExpress Capability 的Device Control Register的第16bit完成FLR。支持FLR方式的PCIe设备需要在其BAR空间中提供一个寄存器,当系统软件对该寄存器的Function LevelReset位写1时,PCIe设备将使用FLR方式复位PCIe设备的内部逻辑。FLR方式对PCIe设备是可选的。
- 不会被FLR方式复位的寄存器 这些寄存器通常和PCIe链路相关
- Sticky寄存器。 与传统的复位方式相同,FLR方式不能复位这些寄存器,但是系统软件对部分Sticky寄存器进行修改。当Vaux(备用电源)被移除后,这些寄存器中的保存的数据才会丢失;
- HwIint类型的寄存器 在PCIe设备中,有效配置寄存器的属性为HwIint,这些寄存器的值由芯片的配置引脚决定,后者上电复位后从EEPROM中获取。Cold和Warm Reset可以复位这些寄存器,然后从EEPROM中从新获取数据,但是使用FLR方式不能复位这些寄存器。
- 还有一些特殊的配置寄存器不能被FLR方式复位,如Max_Payload_Size、RCB和一些与电源管理、流量控制和链路控制直接相关的寄存器。
3.2 虚拟化技术(SR-IOV)
即virtual function技术,例如可以通过SR-IOV技术在一个服务器中虚拟化多个网卡VF的技术来实现多张网卡。使用 SR-IOV 技术,将 PF 映射为多个 VFs,使得每个 VF 都可以绑定到 VM(虚拟机)。如此,吞吐量性能和 CPU 使用效率确实得到了改善,但灵活性却降低了,复杂性也增加了。并且,大多数 SR-IOV 网卡最多有效支持 1Gb 以太网端口的 8-16 个 VFs,和 10Gb 以太网端口的 40-64 个 VFs。网卡借助SR-IOV技术可以通过软硬件协同的方式加速虚拟化环境中的网络性能。
参考链接:微软VF驱动描述
3.3 Bifurcation
pcie通道拆分技术,芯片厂商通过一种叫做bifurcation(分叉)的方式让主板厂商可以灵活配置,组合或者拆分PCIe通道,决定各个设备和PCIe插槽的通道宽度。实现该功能一般有三种方式:Hard Strap,Soft Strap或者Wait for BIOS。
- Hard Strap 通过硬件连接的方式决定PCIe通道的连接方式,一旦定义将不可修改。例如英特尔酷睿CPU通过CFG[6:5]的值决定bifurcation是一个x16还是2个x8等
- Soft Strap 通过软件的方式修改bifurcation的方式,这种配置一版储存在BIOS Image前面的discription中,可以通过工具修改,这种修改一般和BIOS无关,修改后直接烧录BIOS即可
- Wait for BIOS 纯BIOS设置,即在PCIe training之前,通过BIOS对PCIe RC的寄存器进行设置来确定通道宽度。
3.4 Peer to Peer传输技术
点对点传输,即分属于不同PCI总线域的PCI设备可以直接进行数据交换,即两个EP设备直接进行传输
应用范例
- flashtec NVRAM闪存加速卡 参考链接:PMC flashtec NVRAM
3.5 热插拔技术
参考链接:hotpulg——pcieTech
四、PCIE 软件驱动
4.1 PCI地址空间访问机制
参考链接:地址空间访问机制
4.2 PCIe设备初始化过程
下面总结linux启动时PCIe设备初始化的一般性过程。
4.2.1 boot阶段
- 1)上电复位 该过程为冷复位,除了sticky寄存器,其他使用Vcc进行供电的寄存器和PCIe端口逻辑将进入初始状态
- 2)HOST寄存器配置 一般在处理器应用中,通常系统一上电CPU执行boot程序时会初始化PCIe HOST的寄存器;而在非处理器应用中,通常将PCI配置信息存放在板上的ROM中,系统上电时,ROM中的配置信息写到PCI设备的配置空间作为初始值,该过程由硬件完成
- 3)link初始化和Training 复位结束后,物理层将会启动link,一旦link的两端设备都进入初始化link Training状态,为了使数据链路层和事务层准备好连接,两端的设备将会依次进行物理层的Link初始化以及VC0的Flow Control初始化。
- 4)枚举PCI总线上的设备,建立PCIe设备树
- 5)SoC加载运行操作系统后,OS会重新枚举PCIe设备(也可以调用ROM程序枚举的结果),
4.2.2 总线枚举
总线枚举的目的是确定PCIe树形结构的拓扑,发现所有设备及其功能,通常在操作系统启动过程中进行,如下为枚举过程:
- 利用深度优先算法遍历整个PCI设备树,从Root Complex出发,寻找设备和桥,即首先读第0号总线的0号设备0号功能的配置空间
- Device ID为非全F表示有设备
- 通过HeaderType判断是桥还是EP
- 修改0号总线0号设备0号功能(P2P桥)的Primary、Secondary和Subordinate总线号
- 读1号总线的0号设备0号功能的配置空间
- 如果识别到该设备是EP设备,会根据device ID、vender ID和Class Code确定驱动;通过BAR寄存器探索设备实现的Memory或IO空间
- 通过capabilities寄存器组探索设备实现的其他功能
- 完成一个RC或者桥设备的节点上总线枚举后,会配置该HOST设备的BAR寄存器和memory limit
4.2.3 注意点
对应设备方面:
- 有些设备需要在reset结束后在20ms内进入LTSSM Detect阶段
- 连接的两个设备可能会在不同时间退出reset,此时每个设备都需满足在20ms进入 Link Training阶段
- 在Link Training快结束时,设备必须能够接收和处理TLPs和DLLPs
对于系统方面:
- 为了便于设备进入内部初始化,系统软件在被允许向设备提交配置请求前,需要在设备结束复位后等待指定的周期
摘自《PCI_Express_Baser3.0_10Nov10.pdf》 • With a Downstream Port that does not support Link speeds greater than 5.0 GT/s, software 20 must wait a minimum of 100 ms before sending a Configuration Request to the device immediately below that Port. • With a Downstream Port that supports Link speeds greater than 5.0 GT/s, software must wait a minimum of 100 ms after Link training completes before sending a Configuration Request to the device immediately below that Port. Software can determine when Link 25 training completes by polling the Data Link Layer Link Active bit or by setting up an associated interrupt (see Section 6.7.3.3). • A system must guarantee that all components intended to be software visible at boot time are ready to receive Configuration Requests within the applicable minimum period based on the end of Conventional Reset at the Root Complex – how this is done is beyond the scope 30 of this specification. • Note: Software should use 100 ms wait periods only if software enables CRS Software Visibility. Otherwise, Completion timeouts, platform timeouts, or lengthy processor instruction stalls may result. See the Configuration Request Retry Status Implementation Note in Section 2.3.1.
- RC设备或者系统软件在上电复位后需要等待至少 1.0 s才可以决定某个不能成功返回状态的设备是故障设备。具体时间取决于Link training完成的快慢
- 当请求配置接在PCIe Bridge后的是恶被是,时序参数Trhfa必须满足
当Link正在进行时,必须满足以下准则:
- 无论什么原因,当Link结束时,事务层和数据链接层必须进入DL_Inaction状态
- 对于Root或者switch Downstream端口,设置与Port相关的Bridge Control register的第二个Bus Reset将会引起hot reset
4.3 linux驱动
参考链接:Linux——驱动开发——PCIe驱动代码分析
五、PCIe相关验证
pcie的验证分为模块级验证和集成后的系统级验证
- BRINGUP TEST
- 寄存器读写
- IP配置检查
- 存储器集成检查
- 基本的转换种类
- SoC集成检查
- Integration TEST
- 生产者/消费者
- PCIe存储器空间
- MSIs
- 传统中断
- 系统接口错误
- PIPE/serial接口
- Advanced TEST
- ATS
- PCIe error generation
- PCIe ordering rules
- TPH
- PCIe IO virtualization
- power management
- performance analysis
- coverage analysis
- PCIe实物测试 参考链接:是德U4305B
六、问题整理
6.1 PCIe协议问题
- 遍历PCIe总线,简历PCIe树是否是通过进行?
6.2 调试问题
6.2.1 Link training
- 没有link建立的原因
- reset issue导致
- receiver detection issue
- link quality issue
- link在不正确的link width下training,通常是lane(s) reliability issue所致
- reset后设备速率不够快的原因
原因:host设备在外部pcie设备ready之前就开始枚举,导致总线上的设备并没有按最快速度进行link
-
speed变成8.0 GT/s或者equalization失败 原因:link的速度自动返回到2.5 GT/s
-
LTSSM进入recovery状态的原因
- link quality issue(Encoding error/ framing error)
- Flow control timeout
- Device / link partner malfunction
- Low-power entry / exit issue