• 2.3 数据链路层(DLL)模块分析


    数据链路层介于事务层和物理层,主要进行数据链路管理和辅助TLP报文的传输。

    一、概述

    二、硬件模块

    DLL层连通事务层和物理层,硬件架构如下图所示

    在这里插入图片描述

    • DLLP_check模块主要功能是接收物理层发送的DLLP和TLP包,并进行包格式检查,按DLLP包的类型进行分类。
    • TLP_check模块功能是对接收到的TLP包进行CRC和协议检查。如果没有出现问题,则将数据发送到事务层,并告知DLLP GEN模块,发送DLLP给发送方确认数据传输情况。
    • ACK/NAK packets模块是对收到的ACK/NAK DLLP进行解析,并把结果发送给retry buffer,帮助retry buffer判断是否需要重新发送TLP或是将存储的TLP删除。
    • Retry buffer模块:缓存已发送的TLP包,并根据收到的ACK/NAK DLLP包的结果判断是否需要重新发送或是将已经收到确认信息的TLP删除。Retry Buffer在进行重发的时候,数据链路层不再从事务层接收TLP,因此不能同时进行读写,所有是单端口的RAM。
    • DLLP_ARB模块:对要发送的DLLP和TLP进行仲裁,并按优先级进行发送,一般顺序是:完成事务TLP的数据包和当前需要发送的DLLP优先级最高,其次是Nak DLLP,接下来是Ack DLLP、retry buffer中的重传TLP,最后是正在等待的TLP。
    • TLP packets Gen模块:接收事物层发送的数据,并加上sequence、LCRC等数据链路层信息。再发送给DLLP_ARB,同时把数据存入retry buffer,并在需要retry的时候,从retry buffer取数据发送。
    • DLLP_Gen模块:根据事物层发送的信息和DLCMSM、接收到的TLP包、POWER management状态等条件产生DLLP包。
    • DLCMSM模块:Data Link Control and Management State Machine,数据链路控制与管理状态机。将物理层和PCIe的链路层状态报告给数据链路层进行监控,管理和控制数据链路层,包含DL_Inactive、DL_Init、DL_Active三个状态并把链路层状态发送给事物层和物理层,与物理层的链路训练与重定向关联紧密。
    • PM(power management, 电源管理)模块功能负责系统的电源状态与管理。

    三、数据链路层的状态机(DLCMSM)

    3.1 数据链路层状态

    根据DLCMSM的值,数据链路层将对外表现出两种状态:DL_Down和DL_Up

    • DL_Down:DLL将不会和链路对面的设备进行通信
    • DL_Up:DLL可以和链路另一侧设备通信

    3.2 数据链路控制和管理状态机(DLCMSM)

    PCIe总线的数据链路层通过数据链路控制和管理状态机(DLCMSM)实现状态的切换,该状态机共有三个状态,分别为:

    1. DL_Inactive(表示链路无效状态,不可用,或者没有连接设备)
    2. DL_Init(链路可用,将进行VC0的初始化)
    3. DL_Active(链路可正常使用)

    状态机转换如图所示:
    在这里插入图片描述

    3.2.1 DL_Inactive

    • 如何进入DL_Inactive状态
    1. hot reset、warm reset、cold reset的初始化阶段,注意DL状态不会被FLR所影响
    2. 复位所有DLL状态为初始值
    3. 丢弃DLL retry buffer内容
    • DL_Inactive行为
    1. 向事务层和数据链路层其他模块报告DL Down状态,事务层将停止发送TLP
      对下游设备来说等同于“hot-remove”,对上游设备来说等同于“hot-reset”操作。
    2. 丢弃来自事务层和物理层的TLP信息
    3. 不再产生或接收DLLP报文
    • 如何退出DL_Inactive状态
      事务层报告软件没有失能建立链路,同时物理层报告建立链路,linkUp=1(PCIe gen3/gen4/gen5达到gen1速度即可)
      从该状态推出后进入DL_Init状态

    3.2.2 DL_init

    • DL_Init状态行为
    1. 初始化默认VC(virtual channel)的Flow control
    2. 当在FC_Init1状态时报告DL_Down,挡在FC_Init2状态时报告DL_Up。
      FC状态详细参考:PCIe控制器——数据链路层——flow control
    3. 若某设备DLL表现DL_Down状态,一旦发送ACK的DLLP报文而不能识别对应的TLP,该DLL可以丢弃该TLP
    • 如何退出DL_Init状态进入DL_Active状态
      FC初始化完成,同时物理层报告链路建立,linkUp=1

    • 如何退出DL_Init状态进入DL_Inactive状态
      物理层报告链路断开,linkUp=0

    2.3 DL_Active

    DL_Active是正常操作状态

    • DL_Active状态行为
    1. 在事务层和物理层之间接收和传输TLP
    2. 产生和接收DLLP
    3. 向事务层和数据链路层报告DL_Up
    • 如何退出DL_Inactive
  • 相关阅读:
    流程记录:
    windows ubuntu 子系统:肿瘤全外篇,2. fq 数据质控,比对。
    食物分类问题
    Web安全总结
    结合实战,浅析GB/T 28181(二)——设备目录同步
    Hutool,一个超好用的 Java 工具类库
    redis + lua实现分布式接口限流实现方案
    让我们第一次走进Java的世界
    Feign源码分析(without spring)
    JavaScript从入门到精通系列第三十七篇:详解JavaScript中文档的加载顺序
  • 原文地址:https://blog.csdn.net/qq_39815222/article/details/127706144