首页 理论教育数据链路层的状态及PCIExpress体系结构导读

数据链路层的状态及PCIExpress体系结构导读

【摘要】:物理层通知数据链路层当前PCIe链路可用,且物理层正处于链路初始化状态,此时数据链路层不能接收或者发送TLP和DLLP。数据链路层仅是使用该状态位通知事务层,暂时没有从对端中发现PCIe设备,需要进一步检测。数据链路层处于该状态表示在PCIe链路的对端连接了其他设备。当数据链路层收到物理层的状态信息后,DLCMSM状态机将进行状态转换,并向事务层通知PCIe链路的状态。但是在下列情况时,数据链路层状态从DL_Active状态迁移到DL_Inactive状态时并不会引发异常。

数据链路层需要通过物理层监控PCIe链路的状态,并维护数据链路层的“控制与管理状态机”(Data Link Control and Management State Machine,DLCMSM)。DLCMSM状态机可以从物理层获得以下与当前PCIe链路相关的状态。

●DL_Inactive状态。物理层通知数据链路层当前PCIe链路不可用。在当前PCIe链路的对端没有连接任何PCIe设备,或者没有检测到对端设备的存在时,数据链路层处于该状态。

●DL_Init状态。物理层通知数据链路层当前PCIe链路可用,且物理层正处于链路初始化状态,此时数据链路层不能接收或者发送TLP和DLLP。此时PCIe链路首先需要初始化VC0的流量控制机制,然后再对其他虚通路进行流量控制的初始化。有关流量控制的详细描述见第9章。

●DL_Active状态。当前PCIe链路处于正常工作模式。此时物理层已完成PCIe链路训练或者重训练。有关链路训练的详细描述见第8章。

DLCMSM状态机的迁移模型如图7-3所示。

978-7-111-29822-9-Part02-73.jpg

图7-3 DLCMSM的状态机模型

DLCMSM状态机除了可以使用上述状态位,从物理层获得当前PCIe链路状态外,还可以使用以下状态位,向事务层通知数据链路层所处的状态。事务层通过这些状态位获知数据链路层所处的工作状态。

●DL_Down。数据链路层处于该状态时,表示在PCIe链路的对端没有发现其他设备。当数据链路层处于DL_Inactive状态时,该状态位有效。值得注意的是DL_Down有效时,并不意味着对端不存在物理设备。数据链路层仅是使用该状态位通知事务层,暂时没有从对端中发现PCIe设备,需要进一步检测。

●DL_Up。数据链路层处于该状态表示在PCIe链路的对端连接了其他设备。当数据链路层处于DL_Active状态时,该状态位有效。

当数据链路层收到物理层的状态信息后,DLCMSM状态机将进行状态转换,并向事务层通知PCIe链路的状态。如果在PCIe链路的两端都连接着PCIe设备,那么这两个PCIe设备的数据链路层,在绝大多数时间内状态相同。数据链路层各个状态的详细说明,及PCIe链路的状态迁移过程如下。

1.DL_Inactive状态

当PCIe设备复位时,将进入该状态。值得注意的是,只有传统复位方式才能使PCIe设备进入DL_Inactive状态,而FLR方式并不会影响DLCMSM状态机。

当PCIe设备从复位状态进入DL_Inactive状态时,将对PCIe数据链路层进行彻底复位,将与PCIe链路相关的寄存器置为复位值,并丢弃在Replay Buffer中保存的所有报文。当PCIe设备处于DL_Inactive状态时,数据链路层将向事务层提交DL_Down状态信息,并丢弃来自数据链路层和物理层的所有TLP,而且不接收对端设备发送的DLLP。

PCIe设备的物理层设置了一个LinkUp位,该位为1时表示PCIe链路的对端与一个PCIe设备相连。当物理层的LinkUp状态位为1,而且事务层没有禁用当前PCIe链路时,PCIe数据链路层将从DL_Inactive状态迁移到DL_Init状态。

PCIe设备在进行链路训练时,将检查PCIe链路的对端是否存在PCIe设备,如果对端不存在PCIe设备,物理层的LinkUp位将为0,此时数据链路层将一直处于DL_Inactive状态。系统软件可以设置Switch下游端口Link Control寄存器的“Link Disable”位为1,禁用该端口连接的PCIe链路,此时即便PCIe链路对端存在PCIe设备,数据链路层的状态也仍然为DL_Inactive。(www.chuimin.cn)

2.DL_Init状态

当数据链路层处于DL_Init状态时,将对PCIe链路的虚通道VC0进行流量控制初始化。在PCIe总线中,流量控制的初始化分为两个阶段,分别为FC_INIT1和FC_INIT2。在流量控制的FC_INIT1阶段,数据链路层将向事务层提交DL_Down状态信息;而在流量控制的FC_INIT2阶段,数据链路层将向事务层提交DL_Up状态信息。流量控制的初始化部分详见第9.3.3节。

当PCIe链路处于DL_Down状态时,发送端可以丢弃任何没有被ACK/NAK确认的TLP,此时数据链路层几乎不会受到事务层的干扰,从而可以保证流量控制初始化的正常进行。这也是PCIe链路的流量控制分为FC_INIT1和FC_INIT2的主要原因。

当VC0的流量控制初始化完毕,而且物理层的LinkUp状态位为0b1时,数据链路层将从DL_Init状态迁移到DL_Active状态;如果在进行流量控制初始化时,物理层的LinkUp状态位被更改为0b0时,数据链路层将从DL_Init状态迁移到DL_Inactive状态。

3.DL_Active状态

当数据链路层处于DL_Active状态时,PCIe链路可以正常工作,此时数据链路层可以从事务层和物理层正常接收和发送TLP,并处理DLLP,此时数据链路层向事务层提交DL_Up状态信息。

当发生以下事件后,数据链路层可以从DL_Active状态迁移到DL_Inactive状态,但是不能迁移到DL_Init状态。这也意味着数据链路层从DL_Active状态迁移出去后,必须重新进行对端设备的识别和流量控制初始化,之后才能进入DL_Active状态。

在多数情况下,数据链路层从DL_Active状态迁移到DL_Inactive状态时,意味着处理器系统出现了异常,系统软件需要处理这些异常。但是在下列情况时,数据链路层状态从DL_Active状态迁移到DL_Inactive状态时并不会引发异常。

●Bridge Control Register的Secondary Bus Reset位被系统软件置为1时,数据链路层将迁移到DL_Inactive状态。

●Link Disable位被系统软件置为1时,数据链路层迁移到DL_Inactive状态。

●当一个PCIe端口向对端设备发送“PME_Turn_Off”消息之后,其数据链路层经过一段时间,可以迁移到DL_Inactive状态。RC和Switch在进入低功耗状态之前,将向其下游端口广播PME_Turn_Off消息,下游PCIe设备收到该消息后,将向RC和Switch发出PME_TO_Ack回应。当RC和Switch的下游端口收到这个回应报文后,数据链路层可以迁移到DL_Inactive状态。

●如果PCIe链路连接了一个支持“热插拔”功能的PCIe插槽,而当这个插槽的Slot Capability寄存器的“Hot Plug Surprise”位为1时,数据链路层将迁移到DL_Inactive状态。

●如果PCIe链路连接一个热插拔插槽,当这个插槽的Slot Control寄存器的“Power Con-troller Control”位为1时,数据链路层也将迁移到DL_Inactive状态。

在PCIe总线中,还有一些系统事件也可以引发数据链路层的状态转换,本书对此不进行一一描述。