👉个人主页:highman110
👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容
参考书籍:PCI_Express体系结构导读
目录
前言
数据链路层概述
数据链路层状态
DLLP介绍
前言
前面两篇分享了PCIE事务层的相关内容,这节开始讲述数据链路层。
数据链路层概述
数据链路层位于事务层与物理层之间,主要功能是为了保证来自事务层的TLP在链路上的准确传递。数据链路层处理的是端到端的报文,也就是发送端到接收端,其基本结构图如下:
发送端:数据链路层接收上层传来的TLP,它给每个TLP加上Sequence Number(序列号,下文都用“序列号”来阐述)和LCRC(Link CRC),先放入replay buffer(规范称retry buffer)暂存,然后转交给物理层,replay buffer会根据接收端的ACK/NAK DLLP报文来决定是重发这些暂存的TLP,还是清除这些TLP。replay buffer的容量越大,发送流水线容纳的报文越多,越不容易发生中断,但是越大占用的系统资源也越多,replay buffer的容量需要根据链路的延时来决定。
接收端:数据链路层接收物理层传来的TLP,检测CRC和序列号,如果有问题,会拒绝接收该TLP,即不会传到它的事务层,并且通知发送端重传;如果该TLP没有问题,数据链路层则去除TLP中的序列号和LCRC,交由它的事务层,并通知发送端TLP正确接收。
总结数据链路层的作用为:
1、将TLP加序列号和LCRC后发往物理层传输;
2、使用握手协议(Ack/Nak)和重传(Retry)机制来保证数据传输的一致性和完整性;
3、TLP流量控制;
4、电源管理。
数据链路层状态
数据链路层会通过物理层监控PCIE链路状态,并维护数据链路层的管理与控制状态机(data link control and management machine,DLCMSM),DLCMSM状态机可以从物理层获得以下与PCIE链路相关的状态:
1、DL_inactive:物理层通知数据链路层当前的PCIE链路不可用。在当前PCIE链路对端没有连接任何设备,或没有检测到对端设备存在时,数据链路层处于该状态。
2、DL_init:PCIE正处于链路初始化状态,此这时数据链路层不能接收或发送TLP和DLLP。此时PCIE链路需要首先初始化VC0的流量控制机制,然后对其他虚拟链路进行流量控制的初始化。
3、DL_active:当前PCIE链路处于正常工作状态。此时物理层已经完成链路训练。
除了上述从物理层获得的PCIE链路状态外,数据链路层还可以使用以下状态位,向事务层通知数据链路层所处的工作状态:
1、DL_down:当数据链路层处于DL_inactive状态时,该状态位有效。表明链路对端没有发现有设备连接,需要进一步检测。
2、DL_up:当数据链路层处于DL_active状态时,该状态位有效。
有些同学可能有疑问了,这两种状态定义不是部分重复了吗?这里解释一下,DL_inactive、DL_init、DL_active是DLCMSM状态机的状态定义,在收到物理层的状态信息后,DLCMSM状态机会进行状态转换,然后在状态机的DL_inactive/ DL_active状态内,会对DL_down/ DL_up这两个状态位进行置位,然后把这两个状态位报给事务层。
如下是DLCMSM状态机的状态转移图:
引发此状态机进行状态转换的条件有很多,这里不一一赘述,总体而言就是复位(指传统复位,FLR复位不行)、物理层link up/down、手动enable/disable链路、热插拔等等有可能改变物理层链路状态的行为。
DLLP介绍
数据链路层的传输内容除了上层发来的TLP外,该层本身还会产生四种类型的DLLP:ACK/NAK类、电源管理类、流控类、厂家自定义类(需要注意DLLP并不是TLP加上Sequence Number和LCRC)。一个DLLP由6个字节组成,如下图:
DLLP的类型描述如下:
今天的介绍先到这里,后面会详细讲解ACK/NAK、电源管理、流控DLLP的工作过程。