PCIe错误源详解(二)
这篇文章主要介绍事务(Transaction)错误、链路流量控制(Link Flow Control)相关的错误、异常的TLP(Malformed TLP)以及内部错误(Internal Errors)等。
事务(Transaction )错误
事务错误主要包括不支持的请求(Unsupported Request)、Completer Abort、非预期的Completion和Completion超时。该错误类型主要通过返回的Completion TLP包头中的Compl. Status告知Requester,如下图所示。另外,之前介绍TLP Header的文章中也简单地提到过相关内容,可以回顾一下:http://www.pciee.com/article/detail-49.html
不支持的请求(Unsupported Request)主要包括:
- 请求类型不被当前PCIe设备支持
- 消息中使用了不支持或者未定义的消息编码
- 请求的地址空间超出(或者不在)设备的地址空间中
- 针对Completer的IO或者存储映射控制空间(Memory-mapped Control Space)进行的Poisoned写操作(EP=1)
- Root或者Switch的Downstream端口接收到针对其二级总线(Secondary Bus)上的不存在的设备的配置请求(Configuration Request)
- Endpoint接收到Type1型的配置请求
- Completion中使用了保留的Completion状态编码(参考上面的表格)
- 设备(的某个功能,Function)处于D1、D2或者D3hot电源管理状态时,却接收到了除了配置请求和消息之外的内容
Completer Abort(CA)主要包括:
- Completer接收的特殊请求,只有在违背其规则的情况下才能对该请求进行响应(返回Completion)
- 因为某些恒定的错误状态(Permanent Error Condition),导致Completer无法响应接收到的请求
- Completer接收到存在访问控制服务错误(Access Control Services Error,ACS Error)的请求
- PCIe-to-PCI桥接收到针对其连接的PCI设备的请求,但是该PCI设备无法处理该请求
非预期的Completion主要包括:
- Requester接收到的Completion和其发出的Request不一致
Completion超时:
所有的PCIe设备都必须支持Completion超时定时器,除非该设备只是用于初始化配置事务的。需要注意的是,PCIe设备必须能够针对多个事务(Transaction)分别计时。PCIe 1.x和2.0的Spec建议超时时间最好设置为10ms至50ms之间,对于一些特殊情况,超时时间最低可设置为30us。PCIe 2.1 Spec开始,增加了第二设备控制寄存器(Device Control Register 2)用于查看和控制超时时间的值。如下图所示:
如果,某个请求对应多个Completion,那么除了最后一个Completion,其他的Completion不会造成该请求的定时器停止计时。
链路流量控制(Link Flow Control)相关的错误
链路流量控制相关的错误主要有:
- 在FC初始化时,链路相邻设备无法完成针对任何一个VC的,最小的FC Credits的交换更新(Advertises)
- 链路相邻设备交换更新(Advertises)的FC Credits超过了最大值(Data Payload最大为2047,Header最大为127)
- 链路相邻设备交换更新时,FC Credits为非零值,且该链路的FC Credits之前已经被初始化为无限值了
- 接收端Buffer溢出,导致数据丢失(可选的,但是如果使能,则认为是Fatal Error)
关于Flow Control可以参考之前的文章:http://blog.chinaaet.com/justlxy/p/5100053464
和http://blog.chinaaet.com/justlxy/p/5100053465
异常的TLP(Malformed TLP)
异常的TLP(Malformed TLP)错误主要有:
- Data Payload超过了最大值(Max Payload Size)
- 数据长度(Data Length)与包头中的长度值不一致
- 存储地址起始位置跨越了4KB边界(Naturally-aligned 4KB Boundary)
- TD(TLP Digest)的值与ECRC是否使用不一致
- 字节使能冲突(Byte Enable Violation)
- 未定义的类型值(Type Field Values)
- Completion违反了RCB(Read Completion Boundary)值
- 针对非配置请求返回的Completion中的状态为配置请求重试状态(Configuration Request Retry Status)
- TC域包含了一个未被分配到当前使能的VC的值(也被称为TC Filtering)
- IO或者配置请求冲突(可选的)
- 中断Emulation消息向下发送(可选的)
- TLP前缀错误(具体请参考PCIe Spec V2.0的2.2~2.6相关章节)
内部错误(Internal Errors)
一般指的是Switch等桥设备内部产生的错误
原文转自:http://blog.chinaaet.com/justlxy/p/5100057799