PCIe 总线的数据链路层处于事务层和物理层之间,主要功能是保证来自事务层的TLP在PCle链路中的正确传递,为此数据链路层定义了一系列数据链路层报文,即DLLP。数据链路层使用了容错和重传机制保证数据传送的完整性与一致性,此外数据链路层还需要对PCIe链路进行管理与监控。 数据链路层将从物理层中获得报文,并将其传递给事务层,同时接收事务层的报文,并将其转发到物理层。
与事务层不同,数据链路层主要处理端到端的数据传送。在事务层中,源设备与目标设备间的传送距离较长,设备之间可能经过若干级Switch;在数据链路层中,源设备与目标设备在一条PCIe 链路的两端,不存在报文转发;
数据链路层的组成结构
数据链路层使用 ACK/NAK协议发送和接收TLP,由发送部件和接收部件组成。 其中发送部件由 replay buffer、 ACK/NAK DLLP 接收逻辑和 TLP 发送逻辑组成;而接收部件由 " Error check" 逻辑、 ACK/NAK 发送逻辑和 TLP 接收逻辑组成。
数据链路层使用 ACK/NAK协议保证 TLP 的正确传送, ACK/ NAK 协议是一种滑动窗口协议,通过Sequence前缀存放当前TLP 的序列号,滑动窗口协议需要使用这个序列号。该序列号可以循环使用,但在同一个时间段内,一条PCIe链路不能含有 Sequence 前缀相同的多个 TLP;
PCIe 总线的数据链路层使用replay buffer和 Error Check部件共同保证数据传送的可靠性和完整性。来自事务层的 TLP首先暂存在replay buffer中,然后发送到目标设备。源设备的数据链路层根据来自目标设备的 ACK/NAK DLLP 报文决定是重发这些 TLP 还是消除保 存在replay buffer中的TLP;
PCIe 设备的数据链路 中,还含有 Error Check单元。PCle设备使用 Error Check 单元检查接收到的 TLP ,并决定如何向对端设备进行报文回应。 如果 TLP 被正确接收, PCle 设备将向对端设备发送 ACK DLLP; 如果 TLP 没有被正确接收, PCIe 设备将向对端设备发 NAK DLLP。
数据链路层的状态
数据链路层需要通过物理层监控PCle 链路的状态,并维护数据链路层的"控制与管理状态机机" (Data Link Control and Management State Machine , DLCMSM) 。 DLCMSM 状态机可以 从物理层获得以下与当前 PCl 链路相关的状态:
• DL_Inactive 状态
物理层通知数据链路层当前PCIe链路不可用,在当前 PCIe链路的对端没有连接任何 PCIe设备,或者没有检测到对端设备的存在时,数据链路层处于该状态。
PCIe设备的物理层设置了 Link Up 位,该位为1时表示 PCle 链路的对端与 PCle设备相连。当物理层的LinkUp状态位为1,而且事务层设有禁用当前PCIe链路时,PCle数据链路层将从 DL_lnactive 状态迁移到 DL Init状态
• DL_lnit状态
物理层通知数据链路层当前PCIe 链路可用,且物理层正处于链路初始化状态,此时数据链路层不能接收或者发送 TLP和DLLP,此时PCIe 链路首先需要初始化 vc0的流量控制机制,然后再对其他虚通路进行流量控制的初始化;
当VC0的流量控制初始化完毕,而且物理层的LinkUp状态位为0b1时,数据链路层将 DL_Init 状态迁移到DL_Active 状态;如果在进行流盘控制初始化时,物理层的LinkUp 态位被更改为0b0时 ,数据链路层将从 DL_Init状态迁移到 DL_lnactive状态。
• DL_Ative状态
当前PCle链路处于正常工作模式,此时物理层已完成 PCle 链路训练或者重训练。
DLCMSM 状态机除了可以使用上述状态位,从物理层获得当前PCle链路状态外,还可以使用以下状态位,向事务层通知数据链路层所处的状态。事务层通过这些状态位获知数据链路层所处的工作状态;
数据链路层可以从 DL_Active 状态迁移到DL_Inactive ,不能迁移到 DL_Init 状态,这也意味着数据链路层从 DL_Active 状态迁移出去后,必须重新进行对端设备的识别和流量控制初始化,之 后才能进入DL_Aclive 状态。
•DL_Down
数据链路层处于该状态时,表示PCle 链路的对端没有发现其他设备,当数据链路层处于 DL_Inactive 状态时,该状态位有效。值得注意的是 DL_Down 有效时,并不意味着对端不存在物理设备,数据链路层仅是使用该状态位通知事务层,暂时没有从对端中发现 PCle 设备,需要进一步检测;
当事务层收到数据链路层的 DL_Down 状态信息时,表示出现 以下情况
• PC 链路的对端没有连接设备
• 链路丢失了与对端设备的连接
• 数据链路层和物理层出现某种错误,PCIe 链路不能正常工作
• 系统软件禁用 PCIe 链路
• DL_Up
数据链路层处于该状态表示在 PCle 链路的对端连接了其他设备 当数据链层处于DL_Active 态时,该状态位有效。
数据链路层收到物理层的状态信息后,DLCMSM 状态机将进行状态转换,并向事务层通知 PCIe链路的状态。
事务层处于 DL_Up 状态时,表示该设备 PCIe链路的对端设备 已经建立连接,链 路两端可以正常收发报文。当事务层发现PCIe链路从 DLDown 迁移 IJ L_Up 状态时, 将向 PC 链路的对端设备重新发送 Set_S ot_ ower Limit 消息,并重新初始化相关的寄 存器。