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

目录

    简介

    DL 层需要与 PL 层交流链路状态和事务 (Transaction),这些操作是通过数据链路控制和状态机 (The Data Link Control and Management State Machine, 简称 DLCMSM ) 来完成的。DL 层的状态机有 : DL_Inactive, DL_Feature, DL_Init 和 DL_Active

    • 状态输出,对外有 DL_Down 和 DL_Up 两种 DL 状态
      • DL_Down : DL 层不能跟链路对方的组件 (compoent) 通信
      • DL_Up : DL 层可以跟链路对方的组件 (compoent) 通信

    DL_Inactive 状态

    PL 层报告链路不可操作或者 port 上任何都没连接 ,PCI Express hot, warm 或者 clod reset 之后的初始状态,DL 层的状态不会受到 Function Layer Reset (简称 FLR) 的影响

    DL_Inactive 状态行为

    • 把 DL 层的所有状态信息都复位成默认值
    • 如果 port 支持可选的 Data Link Feature Exchange,则必须清掉 Remote Data Link Feature Supported 和 Remote Data Link Feature Supported Valid
    • 丢弃 DL 层 Retry Buffer 的内容
    • 将 DL_Down 的状态告诉给 TL 层以及 DL 层的其它部分,这会导致 TL 层丢掉任何未完成的传输以及终止任何内部尝试发送TLP的行为,对 Downsteam port 而言,等效于 Hot-Remove (热移除),对 Upstream Port 而言,等效于 Hot Reset (热复位)
    • 丢弃来自 PL 和 TL 的 TLP 包
    • 不会产生或者接受 DLLP 包

    DL_Inactive 状态跳转

    下一状态 跳转原因
    DL_Feature 满足所有
    1. port 支持 Data Link Feature Exchange
    2. Data Link Feature Exchange Enable 位被置起来
    3. TL 层指示链路不能被软件禁止
    4. PL 层报告物理层的 LinkUp = 1b
    DL_Init 满足其一
    1.port 不支持 Data Link Feature Exchange, TL 层指示链路不能被软件禁止并且 PL 层报告物理层的 LinkUp = 1b
    2.port 支持 Data Link Feature Exchange, Data Link Feature Exchange Enable 位被清掉, TL 层指示链路不能被软件禁止并且 PL 层报告物理层的 LinkUp = 1b

    DL_Feature (可选)

    PL 层报告链路可以操作, 执行数据链路特性交换

    DL_Feature 状态行为

    • 执行 Data Link Feature Exchange 协议
    • 报告 DL_Down 状态
    • 如果 port 是 DL_Down 状态,那么该 port 的 DL 层允许丢弃任何接收到的 TLP,前提是它不通过发送一个或多个Ack DLLP 来确认这些 TLP。

    DL_Feature 状态跳转

    下一状态 跳转原因
    DL_Init 满足其一:
    1. Data Link Feature Exchange 完成并且 PL 层持续报告 LinkUp = 1b
    2. Data Link Feature Exchange 确认对端的 DL 层不支持 Data Link Feature Exchange 协议,并且 PL 层持续报告 LinkUp = 1b
    DL_Inactive PL 层报告 LinkUp = 0b,如果要进去 DL_Inactive 状态,则需要中止 Data Link Feature Exchange 协议

    DL_Init

    PL 层上报链路可以操作, 对默认的虚拟通道 (Virtual Channel, 简称 VC) 进行流控的初始化操作

    DL_Init 状态行为

    • VC0 按照流控初始化协议进行初始化
    • 当处于 FC_INIT1 (流控相关的状态机) 时报告 DL_Down 状态,当处于 FC_INIT2 时报告 DL_Up 的状态
    • 如果 port 是 DL_Down 状态,那么该 port 的 DL 层允许丢弃任何接收到的 TLP,前提是它不通过发送一个或多个Ack DLLP 来确认这些 TLP。

    DL_Init 状态状态跳转

    • 退出 DL_Init 状态
    下一状态 跳转原因
    DL_Active 流控初始化完成,并且 PL 层持续报告 LinkUp = 1b
    DL_Inactive PL 层报告 LinkUp = 0b,进入到 DL_Inactive 时也会中止流控初始化

    DL_Active

    正常操作模式

    DL_Active 状态行为

    • 与 TL 和 PL 层传输 TLP 信息
    • 产生和接受 DLLP 包
    • 向 TL 和 DL 报告 DL_Up 状态

    DL_Active 状态跳转

    下一状态 跳转条件
    DL_Inactive PL 层报告 LinkUp = 0b

    具有 Surprise Down Error Reporting 能力 (Link Capabilities 寄存器的 bit[19] 为 1) 的 Downstream Ports 必须将 DL_Active 到 DL_Inactive 的状态跳转视为一种 Surprise Down 错误,除了下面这些情况,在这些情况下啊,错误检查是被阻挡了:

    • 软件把 Bridge Control 寄存器中的 Secondary Bus Reset 位置起来(为 1),后面向 DL_Inactive 的跳转禁止当成一种错误
    • 软件把 Link Disable 位置起来或者触发了 DPC,后面向 DL_Inactive 的跳转禁止当成一种错误
    • 如果 Switch Downstream Port 跳转到 DL_Inactive 是由于上方的事件导致,跳转到 DL_Inactive 禁止当成一种错误。比如 Swtich Upstream 传播了 Hot Reset 事件,Swtich 上游链路跳转到 DL_Down 状态,或者 Swtich Upstream Port 设置了 Secondary Bus Reset
    • 如果该 port 发送了 PME_Turn_Off message,后面向 DL_Inactive 的跳转禁止当成一种错误。对于此条件,DL_Inactive 转换不会在物理层收到关机、复位或恢复链路的请求之前发生,如果 PME_Turn_Off/PME_TO_Ack 握手未能成功完成,则可能会检测到 Surprise Down 错误
    • 如果 port 跟可热插拔的插槽关联 ( Slot Capabilities 寄存器中的 Hot-Plug Capable 位为 1),并且 Slot Capabilities 寄存器中的 Hot-Plug Surprise 域为 1,往 DL_Inactive 的跳转禁止当成一种错误
    • 如果 port 跟可热插拔的插槽关联 ( Slot Capabilities 寄存器中的 Hot-Plug Capable 位为 1),并且 Slot Control 寄存器中的 Power Controller Control 比特为 1(标明是 power-off,关机),往 DL_Inactive 的跳转禁止当成一种错误

    由上述一种或多种情况引发的错误阻断必须持续生效,直到端口退出 DL_Active 状态,并随后重新进入 DL_Active 状态,且在返回 DL_Active 时,所有阻断情况均不再生效。

    请注意,从 DL_Active 转出的过程只是根据错误检测阻塞条件所预期的正常过渡。如果实现,这将是一个与检测端口相关的已报告错误。

    如果在这个过程中遇到了其它问题,欢迎在评论区留言,如果你已解决,也欢迎把具体的解决方法留在评论区,以供后来者参考
    ×

    感谢您的支持,请扫码打赏

    微信打赏 支付宝打赏
    guest

    这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

    0 评论