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 转出的过程只是根据错误检测阻塞条件所预期的正常过渡。如果实现,这将是一个与检测端口相关的已报告错误。
感谢您的支持,请扫码打赏