接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(4)
7.1 数据链路层的组成结构
7.1.1 数据链路层的状态
数据链路层需要通过物理层监控PCIe链路的状态,并维护数据链路层的“控制与管理状态机”(Data Link Control and Management State Machine,DLCMSM)。DLCMSM状态机可以从物理层获得以下与当前PCIe链路相关的状态。
- DL_Inactive状态
物理层通知数据链路层当前PCIe链路不可用。
- DL_Init状态
物理层通知数据链路层当前PCIe链路可用,且物理层正处于链路初始化状态。此时数据链路层不能接收或者发送TLP或DLLP。
- DL_Active状态
当前PCIe链路处于正常工作模式。此时物理层已完成PCIe链路训练或者重训练。
DLCMSM状态机除了可以使用上述状态位,从物理层获得当前PCIe链路状态外,还可以使用以下状态位,向事务层通知数据链路层所处的状态。事务层通过这些状态位获知数据链路层所处的工作状态。
- DL_Down
数据链路层处于该状态时,表示在PCIe链路的对端没有发现其它设备。当数据链路层处于DL_Inactive状态时,该状态位有效。
- DL_Up
数据链路层处于该状态时,表示在PCIe链路的对端连接了其它设备。当数据链路层处于DL_Active状态时,该状态位有效。
当数据链路层收到物理层的状态信息后,DLCMSM(Data Link Control and Management State Machine,数据链路层控制与管理状态机)状态机将进行状态转换,并向事务层通知PCIe链路的状态。如果在PCIe链路的两端都连接着PCIe设备,那么这两个PCIe设备的数据链路层,在绝大多数时间内状态相同。数据链路层各个状态的详细说明,及PCIe链路的状态迁移过程如下:
1. DL_Inactive状态
当PCIe设备复位时,将进入该状态。值得注意的是,只有传统复位方式才能使PCIe设备进入DL_Inactive状态,而FLR方式并不影响DLCMSM状态机。
当PCIe设备从复位状态进入DL_Inactive状态时,将对PCIe数据链路层进行彻底复位,将与PCIe链路相关的寄存器置为复位值,并丢弃在Replay Buffer中保存的所有报文。当PCIe设备处于DL_Inactive状态时,数据链路层将向事务层提交DL_Down状态信息,并丢弃来自数据链路层和物理层的所有TLP,而且不接收对端设备发送的DLLP。
PCIe设备的物理层设置了一个LinkUp位,该位为1时,表示PCIe链路的对端与一个PCIe设备相连。当物理层的LinkUp状态位为1、且事务层没有禁止当前PCIe链路时(设置Switch下游端口Link Control寄存器的“Link Disable”位为1),PCIe数据链路层将从DL_Inactive状态迁移到DL_Init状态。
PCIe设备在进行链路训练时,将检查PCIe链路的对端是否存在PCIe设备。如果对端不存在PCIe设备,则物理层的LinkUp位将为0,此时数据链路层将一直处于DL_Inactive状态。系统软件可以设置Switch下游端口Link Control寄存器的“Link Disable”位为1,禁用该端口连接的PCIe链路,此时即便PCIe链路对端存在PCIe设备,数据链路层的状态也仍然为DL_Inactive。
更多内容请看下回。