[PCIe] [电源管理] 面向硬件的ASPM链路状态和L1子状态

PCIe设备的低功耗状态要求系统驱动程序显式地将设备置于低功耗状态,从而PCIe链路则可以依次变为低功耗链路状态。PCIe规范允许PCIe链路在没有系统驱动的情况下进入低功耗状态。这个特性就是所谓的主动状态电源管理(ASPM)。一般来说,无论是系统驱动端硬件(RC)还是设备硬件(EP)都可以通过检测pcie链路上的空闲时间,然后启动电源状态转移。

有两种低功率链路状态:

  1. L0s,也叫L0 standby。对于所有的pcie设备都是强制性的。L0s是一个单向的pcie链路状态。所以设备在初始化L0s时,可以在rx保持在L0状态,但让tx进入L0s。
  2. L1 ASPM。可选的。pcie链路的两个方向都需要在L1中。

为了使ASPM工作,系统驱动程序需要首先读取设备配置空间中的链接功能寄存器,以了解该pcie设备是否支持ASPM。link capabilities register [11:10]是活动状态链路的PM支持位。 [11:10] = 00保留。[11:10]=01表示支持L0s。[11:10]=10又保留了。[11:10]=11表示同时支持L0s和L1。设备也使用[14:12]和[17:15]来指示L0s和L1的退出延迟。

在系统驱动程序读取链路能力寄存器后,驱动程序可以在配置空间中写入链路控制寄存器( link control register )来启用L0S和ASPM L1。 link control register[1:0]是活动状态的PM控制位。[1:0]=00表示两者都是禁用的。01表示启用了L0s,禁用了ASPM L1。10表示禁用L0s,启用ASPM L1。11表示两者都是启用的。

当系统或设备端pcie硬件在pcie链路上检测到空闲时间时,可以将其tx置为L0s状态。它不需要告诉高层软件来阻止outbound (出站)TLP事务。L0s状态退出相应的也由phy 硬件来发起。

L1状态进入不同,因为L1需要两个方向都处在L1中。下面是设备如何请求链接进入ASPM L1:

  1. 设备端phy检测pcie链路上一定的空闲时间。注意,这个空闲时间长度依赖于具体实现,通常是7-10us。然后设备阻塞新的出站事务(outbound transaction)到系统(RC)。
  2. 设备一直向系统端(RC)发送PM_Active_State_Request_L1 DLLP,直到它从系统端(RC)接收PM_Request_ACK。
  3. 系统(RC)接收到PM_Active_State_Request_L1,阻塞要发送给设备的新事务,并不断发送PM_Request_ACK,直到接收到电气空闲ordered set。
  4. 设备接收PM_Request_ACK,发送电气空闲ordered set,将其tx进入电气空闲
  5. 系统接收到电气空闲,将其tx转入电气空闲。现在Pcie链路处于ASPM L1状态。

系统或设备都可以启动ASPM L1退出。

PCIE教程中提到的设备低功耗状态序列,可以看出L1的启动不需要系统驱动介入。这是很重要的,因为设备可以将自己置于低功耗状态,然后将pcie链路放入L1中。设备比任何人都更了解自己的电源状态。

让我们看一下用力科Teledyne LeCroy pcie分析仪捕获的pcie包。首先设备端检测到几个us(微秒)的链接空闲。它将PM_Active_State_Request_L1 DLLP发送到Root Complex,即系统软件端。RC使用PM_Request_Ack DLLP进行响应。如果没有收到电空闲,RC可以发送另一个PM_Request_Ack到设备。这个ack DLLP可以表示为包错误,但它是ok的。这实际上是预期的,因为对方是在电气闲置状态。

下面是另一个例子。设备像先前一样向RC发送PM_Active_State_Request_L1。但是设备立即注意到它有mem wr TLP到RC。它现将这笔数据发送出去。重新检测到链路空闲后,需要再次发送PM_Active_State_Request_L1。最后,当RC返回PM_Request_Ack时,链接可以到达L1。

 

Pcie规范还定义了L1.1和L1.2低功耗子状态。

下面是对L1.1和L1.2的历史和总体思想的一个很好的描述:

 

到PCI Express在2002年开发时,附加的“链接状态”又称“L-States”已经包含在规范中。这些模式兼容现有的“D - state”模式。“L0”反映了一个PCI Express链路完全运行。“L1”是一个不传输数据的链路,但可以相对较快地恢复正常运行。“L2”和“L3”分别反映一个主电源已被移除的连接(“L2”表示一个辅助电源处于活动状态,为设备提供“保持通电”的电源)。还定义了“L0s”状态,在这种状态下,PCI Express链路的各个方向都可以独立关闭,快速恢复正常运行。“D0”中完全活动的设备可以在“L0”、“L0s”和“L1”之间自由切换,不需要软件干预,不需要任何操作系统的交互,自动省电。

虽然这似乎是设备主动节能问题的一个解决方案,但“L-States”的致命弱点却是电源的启动或关闭速度。PCI Express规范要求设备在不到1微秒的时间内从“L0s”退出,从“L1”退出的时间约为2-4微秒。虽然物理层设计人员可以让处于L1中的接收器和发射机逻辑空转以满足这些恢复时间,但是他们不得不让他们的共模电压保持器和锁相环(PLLs)保持通电并运行。这意味着“L1”中的每条PCIe通道(lane)仍然可能消耗20-30毫瓦的能量,这对于电池供电的设备来说显然是太高了。

到2012年,人们越来越清楚地认识到,这种移动设备中专门的硬件和软件组合可以处理正常和低功耗状态之间的PCI Express组件转换,只要它们有这样的机制。进而引入“带CLKREQ的L1 PM子状态”到PCI Express(通常简称为“L1子状态”)是为了允许PCI Express设备进入更深层的省电状态(“L1.1”和“L1.2”),同时仍然显示让软件处于“L1”状态。

L1子态的关键是提供一个数字信号(“clkreq#”),供物理系统唤醒并恢复正常工作。这允许PCI Express PHYs在新的子状态完全关闭他们的接收器和发射机逻辑,因为它不再需要检测或信号的链路恢复。当ECN指定了两级恢复延迟时,它们还可以关闭它们的PLLs,甚至可能关闭共模电压保持器。L1.1子状态的目标恢复时间为20微秒(比L1子状态允许的时间长5到10倍),而L1.2子状态的目标恢复时间为100微秒(比L1子状态长50倍)。两个状态都应该允许好的物理层设计来关闭他们的锁相环。L1.1子状态要求维持共模电压,而L1.2子状态允许其释放。在L1.1状态下设计良好的PCI Express PHYs应该能够达到L1状态下的1/100左右的功率水平。同样地,在L1.2子状态中,PHYs的功耗应该降低到L1态的1/1000左右。

传统的L1状态也是新的L1.0子状态。

L1.1的功耗比L1.0低。这是因为不需要启用pcie端口来检测电力空闲状态。但是pcie链路的共模电压仍然保持不变。

L1.2的功率甚至比L1.1还要低,因为没有保持链路共模电压。

L1.1和L1.2都需要一个双向开漏的CLKREQ#来进入和退出状态。

L1.1和L1.2进入顺序如下:

  1. 首先设备在pcie链路上检测到一些空闲时间,它想进入L1.0,这是传统的L1状态。
  2. 设备将检查L1.1和L1.2是否由系统驱动程序启用。
    1. 如果禁用,设备将转到L1.0。
    2. 如果启用,设备将根据L1.1和L1.2预先编程的LTR阈值检查LTR值。如果LTR值不小于LTR阈值,则设备应进一步检查CLKREQ#
  3. 如果clkreq#是高指示系统不需要设备在L0,设备可以得到pcie链接到L1.1或L1.2。

LTR阈值在配置空间中。LTR值是定期发送到系统的LTR消息设备。LTR表示延迟容忍报告。这是为了让设备向系统端报告其内存读写的服务延迟需求,以便能够在不影响设备功能和性能的情况下对系统进行电源管理。LTR消息值不小于LTR阈值,表示设备能够容忍长时间的读写系统内存延迟(因此可以将链接置于低功耗状态)。