PCIe系列专题之二:2.6 Flow Control初始化
一、故事前传
之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍,了解了PCIe是一种封装分层协议(packet-based layered protocol),主要包括事务层(Transaction layer), 数据链路层(Data link layer)和物理层(Physical layer)。
较为详细解释请见之前的文章:
1. PCIe技术概述;
2.0 PCIe Transaction layer事务层概述;
2.1~2.3 TLP结构及原理解析;
2.4~2.5 Flow control机制概述,缓存结构以及信用积分;
二、Flow Control初始化
在PCIe总线中,任何事务传输之前,flow control必须要初始化。如果flow control初始化未成功,那么任何TLPs都无法发送出去。
此外,Flow control的初始化过程是在物理层link training完成之后进行,此时物理层中的LinkUp信号为触发状态,也即以为这物理层已经做好准备了。
注:DLCMSM= Data Link Control and Management State Machine;
LTSSM= Link Training and Satus State Machine;
对于所有的虚拟通道(VC0~7), Flow Control初始化过程都是一样的,默认状态是enable VC0。
我们先来看一下DLCMSM状态图:
DL_Inactive: 物理层通知数据链路层当前PCIe链路不可用;
Reset操作将state machine的状态调整为DL_Inactive. 此时会向链路层以及事务层发送DL_Down信号通知此时状态;
DL_Init: 物理层正处于链路初始化状态;
当看到物理层传来的LinkUp信号(说明物理层做好准备了), stata machine的状态进入DL_init sub-state: FC_INIT1和FC_INIT2. 这两个状态是Flow control的初始化的两个状态;
DL_active: 当前PCIe链路层处于正常工作状态;
接下来,我们针对Flow control初始化的两个阶段FC_INIT1和FC_INIT2作进一步的介绍。
FC_INIT1:
当进入FC_INIT1阶段后,device会持续依次发送3个InitFC1 Flow Control DLLPs初始化接收端的VC buffer。
依照PCIe协议中的定义,InitFC1 Flow Control DLLPs包括Posted, Non-Posted, Completions三类,格式如下表:
FC_INIT2:
FC_INIT1已经对Flow Control相关的缓存进行初始化,FCINIT2的作用主要是验证FC_INIT1的结果。FC_INIT2与FC_INIT1携带相同的Credit信息。
在FC_INIT2阶段时,Device会依次发送3个InitFC2 Flow Control DLLPs初始化接收端的VC buffer。成功发送完毕之后进入DL_active并回报DL_Up,告知事务层链路可以正常工作了。
与FC_INIT1一样,InitFC2 Flow Control DLLPs也包括Posted, Non-Posted, Completions三类,格式如下表:
注:PCIe总线中规定每隔34us发送一组InitFC报文.