一些背景知识:
(1)PCIe Ordered Set 和 Framing Token 有何区别?
有序集用于链路训练、时钟偏差补偿、进出电气闲等。有序集长度为 4B 整倍数,一般 16 Symbol(SKPOS/EIOS 4 symbol @Gen1/2)。Gen3+ 时,有序集的同步头为 01b,在 Orderer Sets Block 中发送,有序集的 Symbol 0 来指示当前有序集的类型。
Framing Token 是帧令牌,标记帧的类型、起始、长度、状态、结束等等。Framing Token 长度较短,为 1, 2, 4 Symbol。Framing Token 是 PCIe Gen3 出现的概念,Framing Token 中的 STP、SDP、EDB、IDL 在 Gen1/2 时候以特殊符号(K Code)的形式存在。Gen3+ 时,Framing Token 的同步头为 10b,在 Data Block 中发送。参考网络
framing token:
ordered set:
TS1/TS2:
EIEOS/EIOS:
SDS:
SKP:
(2)PCIe SDS/EDS 是什么?
SDS,全称 Start of Data Stream Ordered Set,在发送Data Block 第 1 DW 前发送。与之对应的是EDS,发送Data Block 最后 1 DW 后发送 EDS,标志数据块的结束,下一笔就是 OS 有序集了。
发送 SDS 对链路状态有所要求,在 LTSSM 跳转到 L0 状态前的最后一个子状态发送 ,包括 Cfg.Idle、Rcvr.Idle、Tx_L0s.FTS,且只能在这些状态时发送。
SDS/EDS 仅适用于Gen3 及以上速率,不适用于 Gen1/Gen2 是因为 Gen1/Gen2 时还没出现 SDS/EDS,协议要兼容老版本。Gen1/Gen2 时,LTSSM 跳到 L0 前不发 SDS 发啥?在所有lane上同时发 Logic Idle Symbol,就是0x00。
Loopback 时,OS<->DataBlock切换时 Tx 无需发送 SDS 或 EDS,Rx 也 无需检查 SDS 或 EDS。参考网络
注意,SDS是order set,EDS是token。
(3)aligmen和lock:
一文讲清楚PCIE中的alignment和lock_pcie bit lock-CSDN博客
frame error的场景:
non-flit mode
(1)在期望产生symbol的地方没有产生对应的symbol -> frame error;
(2)针对STP:
rx需要计算frame crc和frame parity(tlp length域),crc或者parity错误 -> frame error;
tlp length域为1的stp需要看看是不是EDS token;
tlp length域为0,2,3,4 -> frame error(检查可选);
不支持Protocol Multiplexing,tlp length域需要小于1535,否则 -> frame error(检查可选);
(对于支持Protocol Multiplexing,rx处理长度大于1535的包需要”as the start of a PMUX Packet“);
一个 Symbol Time内如果收到大于一个的stp, -> frame error(检查可选);
(3)针对EDB:
EDB只能出现在TLP之后,其他的情况下都是 -> frame error;
pl收到EDB之后需要通知dl层他已经收到EDB;
(4)针对EDS(rx收到EDS之后停止处理数据):
在EDS之后收到ordered set(除了SKP,EIOS,EIEOS以为),都是 -> frame error;
针对收到EDS之后又收到SKP的情况,rx会在data block的第一个symbol下恢复data stream(除非发生framing error);
(5)针对SDP:
一个 Symbol Time内如果收到大于一个的sdp, -> frame error(检查可选);
下一个处理的symbol来自于dllp之后的symbol;
(6)针对IDL:
对于x2来说,如果收到了IDL,下一个需要处理的symbol在下一个lane0,另外,在这种情况下(lane0收到了IDL),如果lane1收到了非IDL,那么 -> frame error(检查可选);
对于x4,类似,下一个需要处理的symbol同样在下一个lane0,只不过检查的点变为lane1-3;
对于x8和x16,下一个需要处理的symbol在DW对其的lane,比如针对x16,lane4收到IDL之后,下个需要处理的symbol在lane8,中间的lane的位置同意可选的进行frame err的检查;
另外需要注意的是,在一个Symbol Time内,IDL token之后可以收的token只可能是IDL或EDS。
flit mode:
待补充
framing error后进行recovery的流程:
(1)report error;
(2)停止处理数据流,在下个SDS之后开始新的处理新的数据流;
(3)状态机切换:
L0 -> recovery;
Configuration.Complete ?? -> L0 -> recovery??
Configuration.Idle -> Recovery.RcvrLock(timeout);
Recovery.RcvrCfg ?? -> L0 -> recovery??
Recovery.Idle -> Recovery.RcvrLock(timeout);
Recovery.RcvrLock / Configuration.Linkwidth.Start 状态下发生frame err,非直接的方式进入recovery状态;