PCIe电源管理系统
PCIe总线的电源管理包含了ASPM和软件电源管理两方面的内容,所谓ASPM是指PCIe路在没有系统软件参与的情况下,由PCIe链路自发进行的电源管理方式;而软件电源管理是指PCI-PM机制(与PCI总线兼容)。PCIe总线为PCIe设备提供了几种低功耗模式,对于一个处理器系统来说,PCIe设备的低功耗模式(D0、D1、D2、D3)应该与处理器本身的低功耗模式协调工作(举个栗子:x86支持非常丰富的低功耗状态设置:G0(S0)、G1(S1/S2/S3/S4)、G2(S5)、G3),才能最优化整个处理器系统的功耗。
PCIe的电源管理(PM)定义了4个主要的应用:
1. PCI‐Compatible PM.:PCIe电源管理在软硬件上与PCI - PM和ACPI规格兼容;这要求所有功能,包括PCI电源管理(PCI-PM)寄存器,允许软件使用配置请求来控制PM状态;
——在PCIe 2.1规范修订版中对PM功能进行了修改,新增了动态功率分配(DPA)寄存器,为D0状态添加了几个子状态(32个),从而为软件提供了更细颗粒度的PM机制。
2. Native PCIe Extensions:定义了链路基于硬件的(非软件参与)有源状态电源管理(ASPM:Active State Power Management),以及系统唤醒机制、电源管理事件(PME)报告的消息事务,以及提供计算并上报从低功耗到正常状态延迟时间的方法。
3. Bandwidth Management:PCIe 2.1规范新增了硬件自动更改链路宽度(Link Width)和链路数据速率(Link Date Rate)或同时更改两者的能力,以降低PCIe设备功耗;该功能允许PCIe设备根据实际应用需求,来提供高链路性能或降低性能以保持节省功耗;
——带宽管理虽然是电源管理的范围,但它是在LTSSM(链路训练)中实现的,忘记的胖友请参考《链路训练》相关章节。
4. Event Timing Optimization:PCIe总线上的外设直接启动总线主事件,会导致其它PCIe系统组件一直工作在高功耗的状态,从而导致更高的功耗(相比于正常功耗)。在PCIe 2.1规范中增加了两个新机制来解决:
1,优化的缓冲区刷新和填充(OBFF:Optimized Buffer Flush and Fill):通知外设当前系统的电源状态;
2,报告延迟容忍(LTR :Latency Tolerance Reporting):外设上报它们当前最大可容忍的服务延迟。
二,PCI-PM
1,PM寄存器设置
PCI‐PM规范定义了Power Management Capability配置寄存器,这些寄存器对于PCI是可选的,但对于PCIe是必需的,而且寄存器位于PCI兼容的配置空间中:Capability ID为01h(如下图所示);软件可以通过如下步骤来找到该配置寄存器并进行操作。
1. 如果该功能的Configuration Status 寄存器Bit 4被置位,则说明该功能配置头中的Capability指针是有效的;然后读取Pointer to Next Capabilities寄存器会得到指向的另外一个功能Capability的偏移量;
——如在《PCIe总线基础》中所述,PCIe设备提供了0x100~0xFFF段扩展功能的配置空间,就像一串糖葫芦一样,这串支持不同功能的Capability结构根据指针顺序定位,从而找到所需的Capability。
2. 如果该偏移量处的Dword的最低有效字节的Capability ID 为01h(如上图所示),那么就是PM寄存器集了,在Capability ID字节后的字节是指向下一个Capability的指针(指向下一个Capability配置空间的偏移量);
——“Next Capability”只要是个非零值,就表示是一个有效的指针,而00h的值表示链表的结束。
2,PM状态
每个PCIe设备必须支持D0状态(全开启)和D3状态(全关闭),而D1和D2是可选的。接下来将简要说明各个可能的PM状态。
2.1 D0状态
D0状态(规范强制要求支持):在该状态下设备完全运行,没有任何的节能措施。所有PCIe功能都必须支持D0状态,又分为两种子状态:D0-Uninitialized和D0-Active。设备在处于该状态时,通过ASPM硬件控制改变链路功率。
1. D0-Uninitialized(未初始化):正常复位或软件控制PCIe设备从D3-hot状态迁移至D0状态时,进入D0-Uninitialized;此时PCIe设备相关寄存器恢复到默认状态,在该状态下的特性如下:
1,只响应配置相关事务的处理;
2,命令寄存器使能位全部恢复到了默认状态,这意味着它不能发起Memory或I/O读写事务。
2. D0-Active:一旦PCIe相关配置寄存器被软件配置和启用,它将处于D0激活状态,并完全运行。
——这里需要注意:D状态是PCIe设备的电源状态,而L状态是PCIe链路的电源状态,两者是有差别的;所有L状态都是在LTSSM状态机中,是链路训练中的一个状态。
在PCIe 2.1版本规范中新加另一个功能:动态功耗分配(DPA :Dynamic Power Allocation),DPA为D0定义了32个的子状态,这是为了方便设备的驱动程序、操作系统和执行应用程序之间关于电源管理的协商。该模式的一个优点是:PCIe设备在技术上来说保持在D0状态,因此可以在PCIe设备性能减弱的情况下继续工作,而不是像D1状态(或更低的功耗状态)那样PCIe链路被直接断开。
DPA寄存器仅在D0状态时适用,而在D1‐D3状态时不适用;DPA最多可以定义32个子态:编号从0到31,初始默认值是0(表示工作在最大功耗);软件可以随意对D0的各子状态进行迁移,甚至不需要等到前一个迁移完成后才请求更改为另一个,因此当完成一个子状态的更改时,软件必须检查目前的配置,如果与设置的子状态不匹配,它必须重新更改为配置的值。支持DPA的寄存器如下图所示。
DPA寄存器组成如下图所示:
1. Substate_Max:表示该Capability结构中描述了多少个子状态(这些数字必须连续地从0增加到该值)。
2. Transition Latency Vaule0/1(Xlcy0/1):每个子状态将通过延迟指示器寄存器(Transition Latency Register)与其它子状态相关联,每个可能的子状态都包含一个Bit:1或0(指示使用Transition Latency Value 1或0);
1,Transition Latency Value给定了从任何其他子状态迁移到该子状态所需的最大时间;
2,延迟乘以Tlunit(Transition Latency Unit),得到具体延迟时间(毫秒);
3,类似的,PAS(Power Allocation Scale)给出了每个子状态所使用功率的乘数(瓦)。
——DPA功率分配阵列(DPA Power Allocation Array)中的32位域描述用于该状态的功率,其中第一个位于偏移量010h,其余的在后续的Dwords中实现。
2.2 D1状态
PCIe设备进入轻度(Light)睡眠的状态,在进入该状态之前,软件必须确保所有Non-Posted的请求都已收到了Clp/ClpD报文,然后可以通过进入Polling状态,设置PCIe设备状态寄存器中的Transactions Pending位来实现;在PCIe设备的低功耗状态下,只能发起PME消息请求(其它业务被暂停);
D1状态下的其它特性如下:
1. 当PCIe设备进入D1状态时,强制链路进入L1状态;
2. 在该状态下,可以进行配置和消息请求,不支持处理除此之外的所有其它请求;
3. 如果输入的请求(配置或消息)导致了一个错误,那么在该状态下会发送一个错误消息;如果发生其它类型的错误(例如:Completion timeout),则需等到设备返回到D0状态后,才会发送错误消息;
4. PCIe设备可能会重新激活链路并发送PME消息,通知软件遇到了需要恢复电源的事件;
5. PCIe设备必须返回到D0 Active状态才能恢复完全运行。
如上图,PCIe设备在D1状态下:PCIe链路状态、电源状态以及允许的操作。
2.3 D2状态
D2是PCIe设备进入深度(Deep)睡眠的状态,提供比D1状态功耗更低,但高于D3Hot状态的功耗;在进入该状态之前软件必须确保所有Non-Posted的请求都收到了Clp/ClpD报文,然后可以通过进入Polling状态,设置PCIe设备状态寄存器中的Transactions Pending位来实现;在D1状态下,只能发起PME消息请求(其它业务被暂停)。
D2状态的其他特性如下:
1. 当PCIe设备进入到D2状态时,强制链路进入L1状态;
2. 在该状态下,可以进行配置和消息请求,不支持处理除此之外的所有其它请求;
3. 如果输入的请求(配置或消息)导致了一个错误,那么在该状态下会发送一个错误消息;如果发生其它类型的错误(例如:Completion timeout),则需等到设备返回到D0状态后,才会发送错误消息;
4. PCIe设备可能会重新激活链路并发送PME消息,通知软件遇到了需要恢复电源的事件;
5. PCIe设备必须返回到D0 Active状态才能恢复完全运行。
2.4 D3状态
所有PCIe设备必须支持D3状态,由D3-hot和D3-cold两个子状态组成,该状态时PCIe设备的功耗最小;当软件将该电源状态写入设备时,会进入D3-hot状态,此时模块供电电源正常,而当PCIe设备的Vcc电源被移除时,PCIe设备无论处于何种状态,都会进入D3-cold状态:
1. 如果设备有备用电源(Vaux),那么PCIe设备进入L2状态;
2. 如果设备没有备用电源(Vaux),则PCIe设备进入L3状态。
PCIe设备处于D3-hot状态与处于D1/D2状态时的功能类似,只是PCIe设备只能从D3-hot状态返回D0-Uninitialized状态,而不能直接返回D0 Active状态;而从D3-hot状态返回D0-Uninitialized状态的过程相当于热复位。有些PCIe设备在处于D3-cold状态时仍然可以发出PME消息,此时该PCIe设备负责发送PME消息的功能模块必须使用Vaux电源而非Vcc电源。
2.5 D-State的状态迁移
如下图所示为PCIe的PM状态迁移,大多数D状态的迁移是系统软件通过修改PMCSR寄存器的Power State字段实现的,但是有些状态迁移采用了其它方式:
1. 使能Command寄存器的命令位,可使设备从D0-Uninitialized状态迁移到D0-Active装态;
2. PCIe设备的Vcc被移除时,D3-hot状态将迁移到D3-cold状态;
3. 当PCIe被唤醒时,Vcc重新上电之后,PCIe设备将从D3-cold状态迁移到D0-Uninitialized状态。
同时PCIe设备进行D状态迁移时,PCIe链路的L状态也可能随之变化。具体对应关系如下图所示。
对于PCIe链路的不同L状态,PCIe端口模块的工作状态如下图所示。