1 PCIe中的PM职能
PM,即Power Management提供以下服务:
- 确定给定function的PM能力机制
- 将function转换到特定PM状态的能力
- function当前PM状态的通知
- 在特定事件时唤醒系统
前三条基本就是各种通信IP中各功能的软件入口三件套:能力(capability)、控制(control)、状态(status)。
2 PM的两种机制
PCIe的PM机制有两种:基于软件的PCI-PM和基于硬件的ASPM(active state power management)。PCI-PM会涉及链路状态(即L状态)和function状态(即D状态)的管理;而ASPM只管理L状态,ASPM可以被软件禁用,ASPM在function处于D0时也可以根据需要把链路置于非L0来降低功耗,而PCI-PM只能通过将function置入非D0才有可能把链路状态转到非L0。
本文仅介绍PCI-PM机制。
3 L状态
图1 链路PM状态转移图
注意:图1所示的状态不能跟物理层LTSSM里的状态直接对应,比如上图的L0其实对应了LTSSM的L0,Recovery以及linkup期间的Configuration;而LDn则有可能是Linkdown下的所有状态,比如detect,polling等。
图1中有2点我感兴趣的信息说明如下:
- 为什么L1不能直接切到L2/L3 Ready?---因为仅L2/L3 Ready需要TLP支持,而TLP仅可在L0下收发,所以只能通过Recovery先回到L0再进。
- L2/L3 Ready进L2和L3的选择---系统支持Vaux就会进L2,否则就进L3。
其余信息图上文字描述比较清楚,不赘述。
上表里的internal PLL,如果关闭,代价是增大退出延迟。
L0s的退出延迟为100 symbol的时间;L1的退出延迟为若干ms。
4 L1
4.1 L1和L0之间的互相转换
上图为L0到L1的流程,简要描述如下:
(为了简单起见,以UC代替upstream component,DC代替downstream component)
1、 UP发configuration write TLP配置DC的PMCSR来将DC从D0转移到其它状态
2、DP启动链路L0到L1的切换,应答configuration write TLP
3、DP关闭事务层,重复发送PM_Enter_L1 DLLP
4、UP关闭事务层,重复应答PM_Request_Ack DLLP
5、DP关闭数据链路层,并把物理层置入EI
6、UP检测到EI后也关掉数据链路层,把物理层置入EI
至此,完成L0到L1的切换
上图为L1到L0的转换流程,基本就是UP先回到D0后再逐步把链路切到L0,再把DP且到D0,这部分内容跟LTSSM部分的L1到L0有点重合,不展开描述。
4.2 L1子状态的进出
由于其余状态比较简单,只挑L1进行介绍。
L1有三个子状态:
L1.0
RX需要能检测到对端退出EI(电气空闲)
L1.1
共模电压被保持;
不需要具备检测EI退出的能力,依靠sideband信号CLKREQ#来触发退出;
不需要参考时钟
L1.2
共模电压不被保持;
不需要具备检测EI退出的能力,依靠sideband信号CLKREQ#来触发退出;
不需要参考时钟
需要注意的是,通过ASPM和PCI-PM都可以进入L1,这两种机制进入的L1是独立的。由ASPM进入的记作ASPM L1.0/ASPM L1.1/ASPM L1.2,而由PCI-PM进入的把前缀改成PCI-PM即可,本文后续描述的均是PCI-PM,为了简便起见,不加前缀。
三个状态之间的转换入下图,可见L1.1和L1.2是互不相关的,L1.0后进哪个完全取决于软件对L1 PM Substates Control 1寄存器的配置。
L1.1和L1.2进入的规则:
- USP和DSP都必须监视CLKREQ#的状态
- 处于PCI-PM L1.0时,PCI-PM L1.2 Enablebit被置1时,当CLKREQ#被拉高时需要进L1.2
- 处于PCI-PM L1.0时,PCI-PM L1.1 Enablebit被置1时,当CLKREQ#被拉高时需要进L1.1,且PCI-PM L1.2 Enable bit被清除。
当进L1.2的条件被满足时,需要应用如下规则:
- USP和DSP都必须监视CLKREQ#的状态
- 链路进入L1.0后USP才能拉高CLKREQ#
- USP和DSP都可以通过拉低CLKREQ#来避免进L1.2
- DSP如果想中断进L1.2,那么在进L1前就应该保持拉低CLKREQ#
- CLKREQ#被拉高后,链路进入L1.2中的子状态L1.2.Entry
上图为spec给出的L1.2进出波形,由DSP驱动进入L1.0(通过DLLP协商),再由USP拉高CLKREQ#进入L1.2,退出则是USP和DSP都可触发,上图是以USP触发来举例。上图所标的时间参数约束如下表
5 L2/L3 Ready
如前文所述,L2/L3 Ready是L2 L3之前的伪状态,这里以spec给的例子介绍进入机制
例1
1.系统软件将DC的所有function引导到D3hot
2.DC将链路转到L1
3.系统软件让RC广播PME_Turn_Off,以准备移除主电源
4.为了能发送此报文,链路将被切回L0,如此DC也能够以PME_to_Ack进行响应
5.DC启动L2/L3 Ready转换协议(用PM_Enter_L23 DLLP于UC交互)
故链路状态转换流程为L0--L1--L0--L2/L3 Ready
例2
1.系统软件让RC广播PME_Turn_Off,以准备移除主电源
2.DP以PME_to_Ack进行响应
3.DP启动L2/L3 Ready转换协议
故链路状态转换流程为L0--L2/L3 Ready
剩余D状态、唤醒、PME等介绍将放到下一篇文章。