注意:部分图片和表述来源于网络,引用处会说明。

一、PCIE简介

PCIE总线技术,也叫计算机内部总线技术”Peripheral Component Interconnect”,即外围组件互联。PCIe一般用在大型数据中心,可以接显卡,网卡等片外设备。

1.1 PCIe相关概念

PCIe的基本结构包括根组件(Root Complex),交换器(Switch)和各种终端设备(Endpoint)

  • 设备类型
    PCIe子系统有4种设备类型,分别是Root Complex(RC),PCIe switch,PCIe End Point和PCIe Bridge。如下图所示,switch设备和RC设备可以向上或向下连接PCIe总线,PCIe总线的最底层为EP设备。
  1. RC
    在PCI规范中也被称为HOST主桥,RC模块需要接受操作系统相关的硬件信号(例如接口寄存器、状态寄存器、异常寄存器、数据缓存等,小型状态机等),主要完成的事务有:
    1)PCI域与IO域地址映射机制
    2)实现兼容PCI设备的中断映射以及PCIe中断写事务机制
    3)实现核与PCIe接口间的报文与消息类型转换
    4)存储PCIe设备的配置数据
  2. switch
    switch的实现通常将PCIe控制器的事务层bypass,从数据链路层的数据直接发送到用户逻辑中
  3. EP
    RC和EP在PCIE树形结构中扮演的角色不一样,Rp是根,EP是叶结点。从PCIE角度来看,RP可以发起CFG Rd和Wr,但是EP是不可以的。
    二者在物理层和部分链路层来说可以相互访问,但是传输层却不行
  4. bridge
    PCIe bridge可以用于扩展PCI总线,也可以用于连接慢速设备,在PCI总线树中起到呈上起下的作用。例如pcie转网卡bridge、pcie转USBbridge等

    如图,PCI总线可以通过PCI桥组成一个胖树结构,其中每一个桥片都是父节点,而PCI Agent设备只能是子节点,每一个PCI总线的下方都可以挂接一个到多个PCI桥,每个PCI桥都可以推出一条新的PCI总线。在同一条PCI总线上的设备之间的数据交换不会影响其他PCI总线
  • PCIe的数据传输速率计算
    如下图所示是PCI到PCIe 5.0的所有版本的带宽和数据传输频率。

    以PCIe3.0 x16情况举例,由于PCIe是一种全双共传输总线,因此计算其双向传输带宽和频率的关系为:8GHz * 16bit / 8bit * 2 = 32 GB/s
    实际上由于PCIe采取8/10bit、128/130bit编码传输,实际有效代码需要乘以对应的系数。
    参考链接:PCIe带宽的计算
  • NTB
    有些特殊场景下,比如传统存储系统中的多个控制器,它们之间需要同步很多数据和控制信息,希望使用PCI-E链路直接通信。但是在switch上有多个RC设备时并不可以直接通信,因为主机的BIOS或者OS在枚举同一堆PCIe总线内的设备,并为其分配访问地址,此时会出现冲突。为了满足这个需求,出现了NTB技术。
    其基本原理是地址翻译,因为两个不同的系统(术语System Image,SI)各有各的地址空间,会产生重叠。那么只要 在PCI-E Switch内部将对应的数据包进行地址映射翻译,便可以实现双方通信。这种带有地址翻译的桥接技术叫做None Transparent Bridge,非透明桥。
  • PCIe总线的缺点
  1. 由于采用了基于总线的共享传输模式,在PCI总线上不可能同时传送两组以上的数据,当一个PCI设备占用总线时,其他设备只能等待;
  2. 随着总线频率从33MHz提高到66MHz,甚至133MHz(PCI-X),信号线之间的相互干扰变得越来越严重,在一块主板上布设多条总线的难度也就越来越大;
  3. 由于PCI设备采用了内存映射I/O地址的方式建立与内存的联系,热添加PCI设备变成了一件非常困难的工作。目前的做法是在内存中为每一个PCI设备划出一块50M到100M的区域,这段空间用户是不能使用的,因此如果一块主板上支持的热插拔PCI接口越多,用户损失的内存就越多;
  4. PCI的总线上虽然有buffer作为数据的缓冲区,但是它不具备纠错的功能,如果在传输的过程中发生了数据丢失或损坏的情况,控制器只能触发一个NMI中断通知操作系统在PCI总线上发生了错误
  • ARI功能
    参考链接:link
  • PCI和PCIe的关系
  1. PCI是共享型总线,多个设备共享一条总线,这种情况下必然存在总线总裁。PCIe则是点对点连接,一个设备直接连接到另一个设备,不存在总线竞争和仲裁。
  2. PCI总线上是单向传输,任意时刻只有一个方向的传输,PCIe则是任意时刻都可以双向传输。
  3. PCI有很多的边带控制信号,如FRAME#, IRDY#, TRDY, STOP#等。PCIe总线上传输的都是基于包(packet),控制和其他处理都嵌入在包里。

1.2 PCIe板级电气特征

本节主要参考《PCI Express® Card Electromechanical Specification 3.0》一文,主要针对PCIe的板级设计

参考链接:1.2 PCIe——PCIe电气特征

1.3 PCIE 硬件主要模块

参考链接:1.3 PCIe——硬件实现架构

1.4 PCIe地址空间划分

参考链接:1.4 PCIe——地址空间划分及地址转换

二、PCIe协议层次结构

PCI Express是一种分层协议,由设备核心层、传输事务层,数据链路层和物理层组成。

PCIe架构允许多个RC吗_链路

2.1 设备核心层(Host)

该层级是PCIe协议栈的上层逻辑,负责地址转换、host逻辑接口、DMA等。

2.2 事务层(TL)

传输事务层定义了PCIe总线使用的总线事务,这些事务可以通过switch等设备传送到RC等其他PCIe设备,RC也可以使用这些事务访问其他PCIe设备。其主要工作包括:

  1. 传输层接收来自核心层的数据,将其封装为TLP(Transaction layer packet)后发向数据链路层
  2. 传输层接收DLL层来的TLP并解析,分离事务后发送给核心层。
  3. 虚拟信道管理机制
  4. 流量控制,追踪credit值,使用流量控制机制保护PCIe链路的使用效率
  5. 处理PCIe总线的“序”

2.2.1 TLP相关

当PCIe设备相互访问时,传送的数据报文将被事务层打包为一个或多个TLP,这些TLP会向下层次继续传送,最终通过PCIe总线发送给被请求设备。
实际上一个完整的TLP包由多个字段组成,并且这些字段分别由三个层次各自构建,最后经过物理层形成最终的TLP。

  • TLP格式
    传输事务层完成TLP主要的部分header段和data段。
    详情参考链接: 2.2.1 PCIe控制器——传输层——TLP字段解析
  • TLP-Prefix
    该字段是20bit的PasID进程地址空间标记,可用于在用户结构中扩展IO虚拟化和共享虚拟内存
  • 数据负载相关

当数据传输量较大时,需要根据负载的大小和限制调整为多个TLP进行传输。PCIe设备含有“Max_Payload_Size”和“Max_Payload_Size Supported”两个参数,这两个参数分别在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 总线事务类型

参考链接:2.2.2 PCIe控制器——事务层——总线传输事务

2.2.3

2.2.4 ECRC

END-to-END CRC,该校验码是根据header和data部分计算出来的端到端数据,将其附加到TLP末尾,方便数据包的接收方进行ECRC字段检验。

2.3 数据链路层(DLL)

数据链路层保证来自于事务层的数据报文完整可靠的发送到下一层。
参考链接:2.3 数据链路层(DLL)模块分析

  • 主要功能
  1. 接收TL层的TLP报文数据,集成sequence number前缀和CRC后缀
  2. 接收PL层的数据报文,解析成TLP、LCRC、sequence number等字段
  3. 使用ACK/NCK协议保证报文的可靠性
  4. 流控制管理,根据DLLP报文更新credit值
  5. 发送、接收、解析多种DLLP(Data link layer packet)
  6. LCRC/ECRC对TLP报文错误监测和修正
  7. 链路电源管理DLLP报文

2.3.1 DLLP报文

参考链接:PCIE控制器——数据链路层——DLLP报文

2.3.2 LCRC

LINK CRC
参考链接:LCRC和ECRC的特征

2.3.3

2.3.4 flow control

参考链接:2.3.4 PCIe控制器——数据链路层——flow control

2.3.5 ACK/NAK

ACK/NAK用来保证TLP报文在链路上传输的可靠性,ACK DLLP表示TLP接收完成,NAK就是Negative acknowledge,表示拒绝接收这个TLP。
TLP packet承载真正的命令(例如MRd,CfgRd等)和响应,每一个TLP发出后,接收端要回复一个DLLP ACK表示收到了TLP,如果接收端收到的TLP有bit error或者CRC error,那么就会回复NAK
参考链接:ACK/NAK应用场景

2.3.6 电源管理

2.4 物理逻辑层(PL Logic sub-block)

物理层用于连接DLL和PHY层,决定了PCIe接口总线的链路训练、热插拔等物理特性。

  1. 接收DLL层的数据报文(DLLP和TLP),在开头和结尾个添加1 byte的开始和结束字符,并通过pipe接口发送出去
  2. 接收来自pipe接口的报文数据(DLLP和TLP),并解析发送到DLL
  3. 字符序列集进行复位后的链路训练和初始化
  4. 链路训练
  5. 进行8b/10b、128b/130b编码
  6. PHY层功能可配置

2.4.1 链路训练

链路训练过程中已进行了链路大部分功能的实现,本节只描述链路训练过程中的状态转移。
参考链接:2.4.1 PCIE控制器——物理MAC层——链路训练

2.4.2 物理层数据包

物理层定义了一系列的字符集,这些字符根据规则排序组成了物理层数据包。
详细参考链接:2.4.2 PCIe——物理逻辑层——字符序列

2.4.3 热插拔

参考链接:hotpulg——pcieTech

有如下三个功能:

  1. 不必关闭系统既可以替换发生故障的扩展卡
  2. 修复期间可保证QoS和其他服务继续运行
  3. 对故障设备相关的设备惊醒关闭和重启

2.4.4

2.4.5 数据加扰和解扰

扰频器使用一种算法,仪表伪随机的加扰数据包的每个字节。开始和结束成帧字节不被加扰。加扰消除了比特流中的重复模式,而重复模式会导致大量的能量集中在离散频率上,进而产生大量的EMI噪声,加扰能将能量分散到一个频率范围内,因此最大限度的减少了所产生的平均EMI噪声。
控制字符无需加扰和解扰,数据字符需要加扰和解扰。

2.4.6 8/10B编码/解码

发送端编码,接收方解码。
参考链接:8B / 10B Encode/Decode详解

发送方:
将已加扰的8bit字符编码成10比特的符号。其目的在于在比特流中创建密度足够高的1到0和0到1的转换,这样链路接收方在PLL的协助下就可以重建一个接收时钟。
对于差分传输,要在发送端的添加一个电容进行耦合,从而隔直流通交流,当链路出现多个0或1时,隔直效应发生,接收端的电压会下降,信号变得复发正确识别,因此通过插入0/1避免连续多个1或者0,实现一组信号中0和1的个数相等,从而达到直流平衡。

接收方:
错误检测报告给数据链路层:

  1. 代码违规错误:10bit符号不能被解码成有效的8bit数据或控制字符
  2. 不一致错误:

2.4.7 lane相位补偿

当PCIe链路上有多个lane时,常常会出现通道间相位偏移问题。如果不同lane上同时传输的符号在不同时间点到达接收方,然后被串并转换,则会引发数据混乱,为保证正确接收和处理数据,接收发必须消除相位偏移。
接收方在链路定向时使用TS1/2序列实现相位补偿,在退出L0s时则使用FTS序列实现。

  • 常见的相位偏移原因有:
  1. 芯片差动驱动器和接收器
  2. PCB板的阻抗变化
  3. 通道线路长度不匹配
  4. 串行化和反串行化引入的延迟
  • 相位补偿的方法:
    PCIe SPEC并未定义实现多通道数据对齐的方法,接收方可以通过微调一个自动延迟电路来补偿相位偏移。

2.5 物理电气层(PL Electrical sub-block)

电气子层功能有:

  1. 串行/并行转换
  2. 数字信号和模拟信号转换
  3. 动态均衡
  4. P2M和M2P message Bus

PCIe架构允许多个RC吗_pci-e_02

2.5.1 时钟产生电路

PCIe的REFCLK

参考链接:PCIe——物理电气层——REFCLK

2.5.2 时钟数据恢复

2.5.3 收发均衡电路

参考链接:2.5.3 PCIe——物理电气子层——动态均衡

串/并转换

  • 接收方:此时时钟恢复已恢复出来的接收时钟,使用该时钟频率除以10的时钟将生成的10 bit符号定时输入到缓冲中
    字符锁定:通过COM字符实现字符锁定。
    由于COM字符比较特殊,10bit编码中先有2个连续的极性相同的比特,后接5个连续的极性相反的比特,即为0011111010或1100000101,非常容易识别。一旦识别到COM字符即实现了符号锁定,从而将10bit数据输入到缓冲中。
  • 发送方:并串转换

三、PCIE运行机制

3.1 reset机制

PCIe设备可以根据当前的设备的运行状态选择合适的复位方式,PCIe总线提供多种复位方式的主要原因是减小PCIe设备的复位延时。其中传统复位方式的延时大于FLR方式。

3.1.1 传统复位方式(Conventional Reset)

  • fundamental reset
    有cold reset和hot reset两种方式,Cold Reset使用的时间最长,而Hot Reset使用的时间最短。
  1. cold reset
    当一个PCIe设备的Vcc电源上电后,处理器系统将置该设备的PERST#信号为有效,此时将引发PCIe设备的复位方式。此时,所有使用Vcc进行供电的寄存器和PCIe端口逻辑将无条件进入初始状态。
    但是使用这种方式依然无法复用使用Vaux(备用电源)供电的寄存器和逻辑,这些寄存器和逻辑只能在处理器完全掉电时彻底复位
  2. warm reset
    在PCIe的设备完成上电后,也可能重新进行Fundamental Reset,这种复位方式也被称为Warm Reset。
  • non-fundamental reset物理层的Link初始化
  1. 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链路相关
  1. Sticky寄存器。
    与传统的复位方式相同,FLR方式不能复位这些寄存器,但是系统软件对部分Sticky寄存器进行修改。当Vaux(备用电源)被移除后,这些寄存器中的保存的数据才会丢失;
  2. HwIint类型的寄存器
    在PCIe设备中,有效配置寄存器的属性为HwIint,这些寄存器的值由芯片的配置引脚决定,后者上电复位后从EEPROM中获取。Cold和Warm Reset可以复位这些寄存器,然后从EEPROM中从新获取数据,但是使用FLR方式不能复位这些寄存器。
  3. 还有一些特殊的配置寄存器不能被FLR方式复位,如Max_Payload_Size、RCB和一些与电源管理、流量控制和链路控制直接相关的寄存器。

3.2 PCIe报文路由方式

在一个PCIe网络中,存在两类地址空间,一类是设备自身的地址空间,可称为设备存储器域空间;另一类是PCIe链路上的地址空间,可称为PCIe域地址空间。网络中的设备要发出请求需要将存储器域的地址转换为PCIe域的地址,而接收设备需要将PCIe域地址转换为自身存储器域的地址。

PCIe设备间的数据传输主要通过TLP报文进行,基于switch的PCIe网络中TLP要在多个设备间发送和接收,该过程势必要有多种TLP报文路由方式。

参考链接:3.2 PCIe——报文路由方式

3.3 Bifurcation

pcie通道拆分技术,芯片厂商通过一种叫做bifurcation(分叉)的方式让主板厂商可以灵活配置,组合或者拆分PCIe通道,决定各个设备和PCIe插槽的通道宽度。实现该功能一般有三种方式:Hard Strap,Soft Strap或者Wait for BIOS。

  1. Hard Strap
    通过硬件连接的方式决定PCIe通道的连接方式,一旦定义将不可修改。例如英特尔酷睿CPU通过CFG[6:5]的值决定bifurcation是一个x16还是2个x8等
  2. Soft Strap
    通过软件的方式修改bifurcation的方式,这种配置一版储存在BIOS Image前面的discription中,可以通过工具修改,这种修改一般和BIOS无关,修改后直接烧录BIOS即可
  3. Wait for BIOS
    纯BIOS设置,即在PCIe training之前,通过BIOS对PCIe RC的寄存器进行设置来确定通道宽度。

3.4 Peer to Peer传输技术

点对点传输,即分属于不同PCI总线域的PCI设备可以直接进行数据交换,即两个EP设备直接进行传输

应用范例
  1. flashtec NVRAM闪存加速卡
    参考链接:PMC flashtec NVRAM

3.5 Power Management

PCIe定义了link power management states取代了bus power management states

3.6 虚拟化技术(SR-IOV)

即virtual function技术,例如可以通过SR-IOV技术在一个服务器中虚拟化多个网卡VF的技术来实现多张网卡。使用 SR-IOV 技术,将 PF 映射为多个 VFs,使得每个 VF 都可以绑定到 VM(虚拟机)。本质上是虚拟机绕过Hypervisor层直接调用EP的功能。

PCIe架构允许多个RC吗_pci-e_03

如此,吞吐量性能和 CPU 使用效率确实得到了改善,但灵活性却降低了,复杂性也增加了。并且,大多数 SR-IOV 网卡最多有效支持 1Gb 以太网端口的 8-16 个 VFs,和 10Gb 以太网端口的 40-64 个 VFs。网卡借助SR-IOV技术可以通过软硬件协同的方式加速虚拟化环境中的网络性能。

PCIe架构允许多个RC吗_寄存器_04

  • 优势
  1. 不通过OS的Hypervisor层,减少了进程间的切换,数据传输延时更低
  2. CPU资源得到解放

参考链接:微软VF驱动描述

3.7 虚拟化技术(VirtIO)

该技术解决了SRIOV在虚拟机迁移方面的缺陷,与SRIOV不同的是,SRIOV驱动程序需要特定的连接到某网卡,virtio技术可以使虚拟机很容易实现跨服务器迁移。

PCIe架构允许多个RC吗_PCIe架构允许多个RC吗_05

3.8 错误处理

参考链接:3.8 PCIe控制器——运行机制——错误处理

3.9 序

生产者/消费者模型

该模型是指两个主设备在同一系统中共享资源的模型,这两个设备分别是生产者和消费者。
生产者负责产生和发送数据,将数据存放在数据缓存中,消费者使用数据,二者通过标志位和状态位相互通信。
在一个系统中可能有多个生产者/消费者模型,每个模型有各自的标志位和状态位,模型间的序互不影响。

PCIe序规则

序规则只适用于同一TC在同一VC上传输的事务,不同VC间“无序”的关系。

  1. 强序
  2. 乱序
  3. ID序规则
    同ID的事务遵循强序规则,不同ID的TLP没有序约束

如图是序规则的总结,列表示先产生的事务,行表示后产生的事务;Yes表示第一个事务发生阻塞,第二个事务必须超越第一个事务避免死锁,Y/N表示对先后两个事务的序不做要求,No表示第二个事务不能超越前一个事务。

PCIe架构允许多个RC吗_pci-e_06

维持序的机制

  1. TLP的TC字段的优先级信息
  2. 虚拟通道数量(VC)
  3. flow control

四、PCIE 软件驱动

4.1 PCie配置空间

参考链接:PCIe——配置空间寄存器

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号功能的配置空间
  1. Device ID为非全F表示有设备
  2. 通过HeaderType判断是桥还是EP
  • 修改0号总线0号设备0号功能(P2P桥)的Primary、Secondary和Subordinate总线号
  • 读1号总线的0号设备0号功能的配置空间
  1. 如果识别到该设备是EP设备,会根据device ID、vender ID和Class Code确定驱动;通过BAR寄存器探索设备实现的Memory或IO空间
  2. 通过capabilities寄存器组探索设备实现的其他功能
  • 完成一个RC或者桥设备的节点上总线枚举后,会配置该HOST设备的BAR寄存器和memory limit

4.2.3 注意点

注意:在上电复位后,一些设备在能对请求响应前需要一些额外的时间恢复,以下是一些时序准则
对应设备方面:

  1. 有些设备需要在reset结束后在20ms内进入LTSSM Detect阶段
  2. 连接的两个设备可能会在不同时间退出reset,此时每个设备都需满足在20ms进入 Link Training阶段
  3. 在Link Training快结束时,设备必须能够接收和处理TLPs和DLLPs

对于系统方面:

  1. 为了便于设备进入内部初始化,系统软件在被允许向设备提交配置请求前,需要在设备结束复位后等待指定的周期

摘自《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.

  1. RC设备或者系统软件在上电复位后需要等待至少 1.0 s才可以决定某个不能成功返回状态的设备是故障设备。具体时间取决于Link training完成的快慢
  2. 当请求配置接在PCIe Bridge后的是恶被是,时序参数Trhfa必须满足

当Link正在进行时,必须满足以下准则:

  1. 无论什么原因,当Link结束时,事务层和数据链接层必须进入DL_Inaction状态
  2. 对于Root或者switch Downstream端口,设置与Port相关的Bridge Control register的第二个Bus Reset将会引起hot reset

4.3 linux驱动

参考链接:Linux——驱动开发——PCIe驱动代码分析

五、PCIe控制器的验证

pcie的验证可分为硅前验证和硅后验证。由于PCIe协议较为复杂,IP RTL代码量较大,可配置性较高,这给硅前验证中只进行单一层次的验证带来了较大的挑战。因此为了提高覆盖率,可结合PCIe主要模块级验证,PCIe子系统级验证以及SoC集成后的系统级验证三个层次进行验证。

  • 模块级验证主要参考PCIe协议划分和RTL模块架构进行分模块,针对该模块本身的功能点进行验证。
  • 子系统级验证主要针对PCIe IP子系统层级进行验证,对IP内部经过多个模块数据通路的功能点进行验证,这些功能点通常也是PCIe标准协议定义的功能点。
  • 系统级验证层次更高,也可分为裸机验证和os驱动验证,裸机验证将针对IP连接SoC的接口提取功能点并进行验证,os驱动验证将对IP性能、设备连通性、驱动兼容性等进行验证

总之,无论哪个层级验证,最重要的是提取功能点,而从模块级到子系统级再到系统级的提取功能点将是一个从具象到抽象的过程,如何把握需要验证人员有一定经验。

5.1 模块级验证

PCIe PHY scrambler模块验证:scramble模块验证特性梳理

5.2 子系统级验证

参考链接:

5.3 系统级验证

5.4 硅后验证

参考链接:5.4 PCIe——硅后测试

六、问题整理

  • 没有link建立的原因
  1. reset issue导致
  2. receiver detection issue
  3. link quality issue
  4. 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状态的原因
  1. link quality issue(Encoding error/ framing error)
  2. Flow control timeout
  3. Device / link partner malfunction
  4. Low-power entry / exit issue