最近应客户需求又写了些SRIO的错误处理的基本原理和方式,其中部分是参考于协议,当然也基于TI的东西做了相应说明。特贴上来供大家讨论,希望对大家能有帮助。
SRIO的错误侦测主要分为两部分,物理层的错误侦测,逻辑层/传输层的错误侦测,每种错误侦测都有特定的寄存器来控制。
物理层错误侦测
特性
1) 每一种错误只能有1个bit来表示;
2) 可以连续检测错误,不会因为某些错误状态而停止检测其余错误;
3) 物理层的错误侦测被使能后,错误的信息被保存在Port Attribute Capture CSR和Port Packet/Control Symbol Capture 0-3 CSR中。
记录的错误信息
当Port Attribute Capture CSR还没有捕获到有效信息时(Valid Info状态为0),如果出现错误,那么错误信息会记录在Packet/Control Symbol Capture 0-3 CSR中,而且Valid Info会被更新为1,这样其他接下来的错误就不会再去更改这些寄存器。一般来说,报文的前16byte,短分隔控制符号的4byte或者长分隔控制符号的8byte会被保存在Packet/Control Symbol Capture 0-3 CSR中。
可供检测的错误
参见SPx_ERR_DET寄存器:
错误门限
物理层的错误有可能自动恢复,因此一般是对系统软件屏蔽的。但是我们可以通过设置两个门限(在Port Error Rate Threshold CSR中)来强制的上报你所需要的物理层错误。这两个门限分别是Degraded门限和Failed门限。
Degraded门限和Failed门限功能类似,都是通过超过设定一个门限,如果错误计数超出这个门限则产生告警。一般来说Failed的门限要高于Degraded的门限。
关于控制门限的几个事项:
1) 错误计数器只计数物理层错误的相关数据;
2) 只有错误计数使能和错误侦测使能同时打开的选项才能计数;
3) 错误计数器可以根据用户的配置周期性自动减1,但不会翻转,也就是不会从0x0到0xff
满足错误门限后SRIO的状态
当错误达到门限后的动作(这个取决于Port Control CSR里面的Stop on和Drop Packet两个位域)
Stop on Port Failed Encountered Enable |
Drop Packet Enable |
端口行为 |
备注 |
0 |
0 |
端口会继续传输报文 |
|
0 |
1 |
端口会丢弃报文并去接收一个Packet-not-accept控制符号;在丢失报文的时候会设置output packet-dropped bit |
仅用在switch设备 |
1 |
0 |
端口会停止发送报文的尝试,但是不丢失报文,因此端口会被堵塞 |
|
1 |
1 |
端口会丢失所有输出报文,Output packet-dropped bit会被置位 |
|
逻辑/传输层
特性
1) 逻辑/传输层的错误侦测被记录在Logical/Transport Capture CSR中。
2) 该寄存器在捕获到错误之后就会自动锁住,因此,在软件清除捕获错误之前,只能捕获第一次侦测到的错误。
可检测的逻辑层错误
参见ERR_DET寄存器
错误通知方式
SRIO的错误管理机制主要是完成当侦测到SRIO错误的时候需要如何进行操作。协议规定有两种错误告知方式,主机中断,port-write维护报文。
主机中断
主机中断方式不在协议中规定,由各个主机完成。
主机中断的就是说当出现这些错误之后,SRIO会产生一个中断告知主机。主机在响应这个中断的时候进行相关处理。
TI的架构中在ERR_RST_EVNT_ICSR设置对应的主机中断,分别可以设置物理层各个port,传输层和逻辑层的错误中断。
Maintenance Port-Write
Port-write是SRIO物理层自动发送的一个Maintenance报文。该包需要系统设备预先做一些设定。通常一个maintenance Port-write报文包含16byte内容,这些内容都来自CSR,包括遇到的错误添加,一些可选的执行操作信息等。
其中Component tag CSR是一个设备的身份标识,在系统初始化的时候由软件设置;
其余CSR和部分都来自错误相关的寄存器。
在TI的设备中,在PLM_SP(n)_PW_ENABLE寄存器中能使能和禁止各种状态的Port-write。如果使能了,那么Port-write会按照PW_Timer的方式反复发送,直到对端收到并修复相应的错误状态为止。
yu li1:
这个非常有用啊,谢谢楼主啊