欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

理解PCIe 5.0规范的第4.1部分:PCI-PM(第一部分)

最编程 2024-08-11 07:38:55
...

1 PCIe中的PM职能

PM,即Power Management提供以下服务:

  1. 确定给定function的PM能力机制
  2. 将function转换到特定PM状态的能力
  3. function当前PM状态的通知
  4. 在特定事件时唤醒系统

前三条基本就是各种通信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点我感兴趣的信息说明如下:

  1. 为什么L1不能直接切到L2/L3 Ready?---因为仅L2/L3 Ready需要TLP支持,而TLP仅可在L0下收发,所以只能通过Recovery先回到L0再进。
  2. 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进入的规则:

  1. USP和DSP都必须监视CLKREQ#的状态
  2. 处于PCI-PM L1.0时,PCI-PM L1.2 Enablebit被置1时,当CLKREQ#被拉高时需要进L1.2
  3. 处于PCI-PM L1.0时,PCI-PM L1.1 Enablebit被置1时,当CLKREQ#被拉高时需要进L1.1,且PCI-PM L1.2 Enable bit被清除。

当进L1.2的条件被满足时,需要应用如下规则:

  1. USP和DSP都必须监视CLKREQ#的状态
  2. 链路进入L1.0后USP才能拉高CLKREQ#
  3. USP和DSP都可以通过拉低CLKREQ#来避免进L1.2
  4. DSP如果想中断进L1.2,那么在进L1前就应该保持拉低CLKREQ#
  5. 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等介绍将放到下一篇文章。

推荐阅读