通过学习PCIE扫描系列文章,结合PCIE3规范深入理解PCIE
硬件时序
pci独立于处理器,树形结构,可以和CPU总线并行操作,一般是33MHz(pci)-133Mhz
pci总线上同一时刻只能有一个主,但是从设备也不是绝对从,可以通过peer-to-peer
pci总线是共享总线,需要仲裁器(arbiter)来决定总线控制权
pci总线地址和数据复用AD,所有信号都与时钟同步,所有信号都发生在时钟上升沿,或者在上升沿采样
关键信号:
From ChatGPT:
在PCIe(Peripheral Component Interconnect Express)接口中,存在许多不同的信号,用于在设备之间进行通信和控制。以下是一些常见的PCIe信号及其解释:
TX(Transmit):发送数据的信号线。用于将数据从发送器传输到接收器。
RX(Receive):接收数据的信号线。用于接收从发送器发送的数据。
CLK(Clock):时钟信号线。用于同步和定时数据传输。
RESET(Reset):复位信号线。用于将设备复位到初始状态。
REQ(Request):请求信号线。用于请求对方设备执行某个操作或提供服务。
ACK(Acknowledge):应答信号线。用于确认收到请求并表示同意执行操作。
INT(Interrupt):中断信号线。用于设备之间的中断通知。
PME(Power Management Event):电源管理事件信号线。用于设备之间的电源管理事件通知。
PWRGOOD(Power Good):电源正常信号线。用于指示设备的电源供应是否正常。
ERR(Error):错误信号线。用于指示设备发生错误或异常情况。
FRAME(帧):表示传输数据的帧开始和结束的信号。它指示数据传输的开始和结束,用于同步数据的传输。
AD(地址/数据):通常被称为地址/数据信号,用于指示数据传输的类型。在传输阶段,AD信号可以表示地址或数据。
C/BE(Command/Byte Enable):用于传输命令和字节使能的信号。C信号用于传输控制信息,而BE信号用于指示有效数据的字节。
IRDY(Initiator Ready):表示发起方是否准备好发送数据。当IRDY为高电平时,发起方可以发送数据。
DEVSEL(Device Select):由目标设备产生的信号,用于指示是否已选择目标设备。当DEVSEL为低电平时,表示目标设备已经选择。
TRDY(Target Ready):表示目标设备是否准备好接收数据。当TRDY为高电平时,目标设备可以接收数据。
GNT(Grant):由总线主控制器发出的信号,用于授予从设备对总线的使用权。当GNT为低电平时,表示总线主控制器授予从设备使用总线的权限。
时序解读
- 在第一个时钟上升沿,FRAME#(一次数据传输的起始)和IRDY#(Initiator Ready for data)都为inactive,但是此时某个设备的GNT#(Grant)为active,说明总线仲裁器已经选定当下设备为下一个initiator
- 在第二个时钟上升沿,FRAME#被initiator(主机)拉低,说明一个新的事务(Transaction)开始。同时地址和命令都被发到AD上,总线上所有设备(从机)都会锁存这些信息,并检查地址和命令是否和自己匹配。
- 第三个时钟上升沿,IRDY#处于active状态,表明主机准备就绪,可以接收数据。AD信号处于三态,需要发生翻转机turn-around cycle,此时TRDY#必须处于inactive,以保证turn-around完成
- 第四个时钟上升沿,总线上某个从机确认身份,并依次将DEVSEL#和TRDY#拉低,将响应数据放到AD上,此时FRAME#为active,说明这不是最后一个数据
- 第五个时钟上升沿,TRDY# inactive,说明从机尚未就绪,因此所有的操作暂停一个时钟周期(插入一个wait state,最多允许8个)
- 第六个时钟上升沿,从机向主机发送第二个数据,此时,FRAME#信号依旧为active,不是最后一个数据
- 第七个时钟上升沿,IRDY# inactive,表明主机位就绪,再次出入一个wait state,但是此时从机仍可以向AD上放数据
- 第八个时钟上升沿,AD上的第三个数据发送至主机,此时FRAME#被拉高,inactive,说明本次事物(transaction)的最后一个数据,然后,所有控制信号都被拉高,FRAME#、AD、C/BE#处于三态
PCIE 错误检测
重要概念:
错误检测(Error detection):检测某个错误是否存在
错误登记(Error Logging):将相关寄存器(配置空间中的)的对应位置位,等待软件中的相关错误处理程序来处理
错误报告(Error Reporting):通知系统错误发生,pcie中发生错误的设备会通过错误消息逐级将错误发送至root,root接收到错误消息后会产生对应的中断通知os
错误发送(Error Signaling):通过发送错误消息来传递错误信息
错误等级
分为两级,一是基本(Baseline capability),对应pci-compatible registers,一个是可选(advanced error reporting capability),对应pci express capability registers
错误类型分为:correctable errors (可被硬件识别并自动校正和恢复)和uncorrectable error(分为non-fatal和fatal),non-fatal由设备驱动软件处理,且链路可恢复数据一般不会丢失,fatal只能由os处理,且一般需要复位,数据会丢失
检测机制
包传递过程主要通过CRC来检测,pcie定义了两种CRC:LCRC(链路层)和ECRC(事务层),其中ECRC是AER的一部分。
各层的错误类型(错误源):
物理层:8b/10b编解码异常;framing异常;elastic buffer错误;起始字符失锁(Loss of symbol lock)或者通道对齐失锁(lane deskew)
数据链路层:LCRC校验失败;序列号(SN)异常;DLLP中的16-bitCRC校验失败;Link layer protocol errors
事务层:ECRC校验失败;异常的TLP;Flow control protocol violation;不支持的请求;Data corruption(Poisoned Packet);completer abort;receiver overflow;completion timeout;unexpected completion(completion与发出的request不一致)
错误优先级
uncorrectable internal error
接收端buffer溢出(receiver overflow)
流量控制协议错误(Flow control protocol violation)
ECRC校验失败
异常的TLP
atomicop egress blocked
TLP包头异常
访问控制服务(Access control services,ACS)异常
MC(Multi-cast)Blocked TLP
不支持的请求(UR,CA)或者不对应的返回包
接收到损坏的数据包
错误源
ECRC错误
需要先查询设备的配置空间来确认某个function是否支持ECRC,如果支持,通过配置ECCR(error capability and control register)来使能ECRC。如果使能了ecrc可以通过TLP包头中的TD位来判断是否使用ECRC。接收端会根据TLP的包头和数据重新计算CRC然后和收到的ECRC(发送端计算的)进行比较,不一致则认为数据在传输过程中损坏。发生错误后的处理粗略分为两部分,一个是接收端,另一个是发送端:接收端发生ECRC后会丢弃TLP,不对该请求发送TLP,并将ECRC置位,发送端长时间未接收到返回的TLP会超时,一般会重发request;发送端发送完请求后收到返回的completion TLP,如果此时发生ECRC,会置ecrc位,发送端可以选择重发,亦可以选择通过中断上送os。
错误传递 Data Poisoning(Poisoned Data or error forwarding):指已知TLP Data Payload被破坏的情况下,该TLP仍被发送至其他PCIE设备,此时TLP包头的EP会被置位,只针对带Data psyload的TLP和包头无关,比如memory,Configuration,I/O写。传送错误的包有几个原因:
- 便于发送端和系统分析错误,至少发送端知道接收端已经接收到了数据
- 便于发现switch中的错误
- 有些应用允许接受存在错误的数据,比如音视频数据
- 应用层可能会恢复数据,比如单bit的ECC
事务错误
包括:UR,CA,UC(Unexpected completion)和CT(completion timeout)。主要通过返回的completion TLP包头中的Compl.Status告知requester
UR
5. 请求类型不被当前PCIE设备支持
6. 消息中使用了不支持或者未定义的消息编码
7. 请求的地址空间超出或不在设备的地址空间内
8. 针对completer的IO或者存储映射控制空间(Memory-mapped control space)进行的Poisoned写操作(EP=1)
9. root或者switch的downstream端口接收到针对其二级总线(secondary bus)上的不存在的设备的配置请求
10. endpoint接收到type1型的配置请求
11. completion总使用了保留的completion状态编号
12. 设备(或某个function)处于D1、D2或D3hot电源管理状态时,却接收到了除了配置请求和消息之外的内容
CA
13. completer接收的特殊请求,只有在违背其规则的情况下才能对该请求进行响应
14. 因为某些恒定的错误状态,导致completer无法响应接收到的请求
15. completer接收到存在访问控制服务错误(ACS error)的请求
16. pcie-to-pci桥接收到针对其连接的pci设备的请求,但是该pci设备无法处理该请求
UC
requester接收到的completion和其发出的request不一致
CT
From ChatGPT:
PCIe(Peripheral Component Interconnect Express)的Completion Timeout Mechanism(完成超时机制)是用于检测和处理传输操作在设备之间超时的一种机制。
在PCIe传输过程中,当一个设备向另一个设备发送一个请求或命令时,接收设备需要在一定时间内完成相应的操作并发送完成响应(Completion)回来。如果接收设备无法在规定的时间内完成操作并发送完成响应,就会发生超时。
Completion Timeout Mechanism的工作原理如下:
Timeout计时器:
每个PCIe设备都有一个内部的计时器,用于跟踪传输操作的时间。
当设备接收到请求或命令时,计时器开始计时。
Completion Timeout值:
PCIe规范定义了一个Completion Timeout值,它规定了设备完成操作的时间限制。
该值通常是根据系统的需求和性能要求进行配置的。
超时检测和处理:
如果设备无法在规定的时间内完成操作并发送完成响应,就会触发超时检测。
当超时检测到时,设备会生成一个超时错误信号或中断,并通知系统主机。
错误处理:
当系统主机接收到超时错误信号或中断时,它可以采取相应的措施来处理错误。
错误处理的具体方式取决于系统的设计和应用需求,可以是重新尝试传输、重置设备等。
Completion Timeout Mechanism的目的是确保PCIe传输操作在合理的时间内完成,以避免系统出现潜在的问题。它可以帮助系统主机识别和处理超时情况,并采取相应的纠正措施。这样可以提高系统的可靠性和性能,并确保设备之间的正常通信。
链路流量控制错误(Link Flow Control Errors)
- FC初始化时,链路相邻设备无法完成针对任何一个VC的最小FC credits的交换更新
- 链路相邻设备交换更新的FC credits超过了最大值(data payload最大2047,header最大127)
- 链路相邻设备交换更新时,FC credits为非零值,且该链路的FC credits之前已经被初始化为无限值
- 接收端buffer溢出,导致数据丢失
异常的TLP
- Data paload超过了最大值
- 数据长度与包头中的长度值不一致
- 存储地址起始位置跨越了4KB边界
- TD(TLP Digest)的值与ECRC使用不一致
- 字节使能冲突(byte enable violation)
- 未定义的类型值
- completion违反了RCB(Read Cmpletion Boundary)值
- 针对非配置请求返回的completion中的状态为配置请求重试状态
- TC域包含了一个未被分配到当前使能的VC的值(TC filtering)
- IO或者陪孩子请求冲突
- 中断emulation消息向下发送
- TLP前缀错误
PCIE错误报告
PCIE错误报告流程图
三种错误报告方式
1,Completions:通过completion tlp中的状态位向requestor返回错误信息
2,Poisoned Packet:告知接收端当前TLP的Data Payload已经被破坏
3,Errors Message:向主机报告错误消息
错误消息机制
消息请求头信息如下:
message code如下表,此时type的[2:0]为000b:
错误信息列表
上述错误类型可以通过Device Control Register中的相应位来使能和禁止,也可以通过Device Status Register查询响应状态:
链路错误处理机制
一般发生在物理层与数据链路层通信的过程中。对于downstream设备,如果链路上发生了fatal错误,此时设备不能像root报告。需要upstream设备向root报告错误,为了消除错误,一般需要对链路进行重新训练(retrain),即操作Link Control register相应位写1,同时可以查看Link status register的对应位来确认是否训练成功。
From ChatGPT:
PCIe链路错误处理机制主要涉及错误检测、错误报告和错误恢复。下面是PCIe链路错误处理机制的一般流程:
错误检测:PCIe链路上的错误可以通过各种机制进行检测,包括物理层错误检测、数据链路层错误检测和传输层错误检测。这些错误可以包括数据传输错误、CRC错误、重传超时等。
错误报告:当检测到链路错误时,错误信息需要被报告给相关的组件或系统。PCIe使用Advanced Error Reporting (AER)机制来报告错误。错误报告可以通过特定的寄存器或消息传递机制来完成,以便通知系统和相关设备。
错误处理:根据错误的性质和严重程度,采取不同的错误处理措施。处理错误的方法可能包括重新传输数据、重新配置设备、发起复位操作等。错误处理的具体步骤和措施取决于错误类型和系统的要求。
错误记录和分析:在错误发生后,系统通常会记录错误信息以便后续分析和故障排除。记录的信息可以包括错误类型、时间戳、错误位置等,以帮助确定错误的原因和解决方案。
需要注意的是,具体的PCIe链路错误处理机制可能会因实现和配置而有所不同。PCIe规范提供了基本的错误处理框架和要求,但具体的实现可能会有所差异。因此,在开发和设计PCIe系统时,需要仔细阅读相关的规范和文档,并根据系统需求和设计目标进行适当的错误处理策略。
在PCIe中,Retrain(重新训练)是一种机制,用于在链路出现错误或不稳定情况时重新建立和稳定链路连接。下面是一些可能需要进行Retrain的情况:
链路错误:当PCIe链路上发生严重的错误或不可恢复的错误时,可能需要进行Retrain。这些错误包括CRC错误、数据传输错误、重传超时等。Retrain可以帮助重新建立正确的链路连接并纠正错误。
环境变化:如果PCIe链路所处的环境发生变化,例如电源供应不稳定、电磁干扰、温度变化等,可能会导致链路的不稳定性。在这种情况下,进行Retrain可以重新建立稳定的链路连接。
重新配置:当PCIe设备或系统进行重新配置时,可能需要进行Retrain。例如,添加或删除PCIe设备、更改PCIe设备的参数或配置等。Retrain可以确保新配置的设备能够正确地与其他设备建立连接。
错误恢复:在某些错误恢复场景中,进行Retrain可以帮助恢复正常的链路通信。例如,在发生重传超时或链路错误后,通过Retrain重新建立链路连接可以恢复正常的数据传输。
需要注意的是,Retrain是一种消耗资源和时间的操作,可能会导致链路中断或延迟。因此,在决定是否进行Retrain时,需要综合考虑系统的要求、错误的严重程度以及Retrain的影响。具体的Retrain触发和操作方式可能因PCIe设备和实现而有所不同,需要参考相关设备和系统的文档和规范。
PCIE的AER
From ChatGPT:
PCIe的AER(Advanced Error Reporting)机制是一种用于检测、报告和处理PCIe设备中发生的错误的高级错误报告机制。它提供了一种标准化的方法来报告和管理PCIe链路和设备的错误,以提高系统的可靠性和可维护性。下面是AER机制的主要特点和功能:
错误检测:AER机制通过监测PCIe链路和设备上的错误条件来进行错误检测。它可以检测到包括数据传输错误、CRC错误、重传超时、链路层错误等各种类型的错误。
错误报告:一旦检测到错误,AER机制会生成错误报告,其中包含了错误的详细信息,如错误类型、错误位置、错误状态等。错误报告通常以特定的格式被写入AER寄存器,供系统软件读取和处理。
错误通知:AER机制可以通过中断或其他机制向系统软件通知错误的发生。这使得系统能够及时获知错误并采取相应的处理措施。
错误处理:AER机制允许系统软件对错误进行处理和响应。根据错误的性质和严重程度,处理措施可以包括重传数据、重新配置设备、发起复位操作等。
层次结构支持:AER机制可以在PCIe设备和系统的层次结构中进行错误报告和处理。错误可以从下层设备向上报告,直到达到RC。
可选性:AER机制是可选的,根据具体的实现和需求可以选择是否支持。如果支持AER,相关的设备和软件需要满足AER规范的要求。
总体而言,AER机制为PCIe系统提供了一种统一和可扩展的错误管理机制,可以及时检测、报告和处理PCIe设备中发生的错误,提高系统的可靠性和可维护性。
AER在已有错误报告基础上,还只支持如下特性:
- 在登记实际发生错误类型时,粒度、区分度或者叫精确度更好
- 可以区分各种不可校正错误的严重程度
- 支持登记包头中的错误
- 为root通过中断报告接收到的错误消息提供了标准化的控制机制
- 可以定位错误源在PCIE体系结构中的位置
- 能够独立地屏蔽某种或多种错误类型的报告
AER capability 结构体如上图所示,AER Capa的ID是0001h。
这里first error pointer为当前错误指针,当相关错误状态更新时,该指针由硬件自动更新。一般情况下,当前错误指针指向的错误优先级最高,需要最先被处理,往往也是其他错误的根源。
1,Correctable Error
相关错误发生时,硬件会将响应bit置1,软件可以写1清除。可以通过写mask相应位为1来屏蔽错误消息上报。
2,Uncorrectable Error
无论这些错误是否会被上报root,相关bit都会被置1。通过修改severity来修改对应错误是否作为fatal(致命)错误处理:0,non-fatal;1,fatal。
3,TLP包头缓存寄存器
这个4DW的寄存器,用于缓存接收到的,发生uncorrectable error的TLP的包头。包头包含了TLP的类型,地址,传输大小,标记等字段,以及错误的原因和描述。主要作用是方便系统获取错误的详细信息,并进行错误诊断和处理,由于这些错误发生位置、类型和特征等关键信息的提供,对于调试和故障排除非常有用。
4,Root error command/status register
当root接收到错误报告后,会将响应的状态位置位,并通知os处理。root本身出现故障时也会置对应位。
通过修改上面寄存器相应位使能或者禁止相关错误类型上报os。
5,Error Source Identification Register
记录错误源的设备id信息(BDF),根据此信息,确定错误源的位置