PCIE学习
+ -

PCIe学习(七)

2025-08-06 1 0

5 电源管理

PCIe的电源管理是一个系统性的话题。我们今天来一探究竟。

5.1 链路状态电源管理

首先就要先来提一提ACPI (Advanced Configuration and Power Interface)。ACPI旨在为操作系统和应用程序提供所有芯片电源管理的接口。

ACPI定义了系统电源管理状态:

Ø G0/S0:工作状态。系统处于火力全开的工作状态。

Ø G1:睡眠状态。此状态下系统功耗较小,返回工作状态的时间取决于下面几个子状态

² S1:高速缓存被清空,CPU挂起

² S2:与S1类似,但是CPU电源被关断

² S3:也称为“挂起到RAM(Suspend to RAM)”或者“待机(Standby)”,系统上下文被保存到内存

² S4:也称为“挂起到硬盘(Suspend to Disk)”或者“休眠(Hibernate)”,系统上下文被保存到硬盘

Ø G2/S5:软件关机。此状态下系统功耗最小,系统当前状态信息不被保留,需要完全重新启动才能返回工作状态。绝大部分硬件设备处于断电状态,少数硬件有一些电源可用于唤醒,例如按下系统上的电源按钮。

ØG3:机械关机。系统的电源被完全切断。

205124613601

#

ACPI也定了设备电源状态:

Ø D0:设备的全部供电打开,处于完全运行的状态。

Ø D1:低功耗状态(比D0低),设备上下文可能会丢失,也可能不会丢失。

Ø D2:比D1更低的功耗状态,但会导致更长的恢复延迟,并可能导致设备丢失上下文。

Ø D3:设备已做好断电准备,设备的上下文都可能丢失。恢复时间将比D2更长,但在这种状态下可以正常断开设备电源。

其中D1和D2不是强制性的,设备可以根据具体情况选择是否实现这两个状态。

205130889121

#

再来看看PCIe协议做了哪些定义。

首先,PCIe协议中定义了链路电源管理状态:

Ø L0:所有PCIe事务和操作都启用

Ø L0s:Standby模式,恢复延迟低,功耗低

Ø L1:可以分为几个子状态L1.0,L1.1和L1.2

Ø L2/L3 Ready:L2或L3的临时状态,L2/L3 Ready是一种伪状态(pseudo-state)

Ø L2:辅助供电链路状态

Ø L3:链路关闭状态

Ø LDn:L0之前的过渡链路断开伪状态

下图是PCIe链路电源管理状态转换图。需要注意的是,L0s,L1,L2,L3这些状态之间没有直接转换的关系,千万不要想当然的认为存在L0->L1->L2->L3这种顺序关系。理解下面这张图是理解PCIe链路电源状态的关键。

205138652236

#

然后,PCIe协议中定义了设备状态:

Ø D0:这是PCIe设备必须支持的状态,包含两个子状态

² D0uninitialized:Function完成基本复位后,进入此状态。通常,寄存器在此状态下恢复为默认值。此时,Function只能响应配置请求,不能发起事务,也不能处理接收到的Memory或者IO事务。

² D0active:当Function被系统软件正确配置后,进入此状态

Ø D1:也称为轻度睡眠状态(Light Sleep),该状态是可选的,设备不是必须支持。当Function进入D1状态时,链路进入L1状态。此时设备只可以接收配置请求和消息请求

Ø D2:也称为深度睡眠状态(Deep Sleep),该状态是可选的,设备不是必须支持。在进入此状态前,软件需要确保所有的Non-Posted请求都得到了Completion。设备进入D2状态后,对应的链路进入L1状态。此时设备只可以接收配置请求和消息请求

Ø D3:又称为全关(Full-Off)状态。D3状态是设备必须支持的状态,包含两个子状态

Ø D3hot:当设备进入D3hot状态,表明该设备的电源尚未切断,链路进入L1状态

Ø D3cold:当设备进入D3cold状态,则表明设备的电源已被切断,如有Vaux存在,则链路进入L2状态,否则进入L3状态

PCIe的设备电源状态是与ACPI设备电源状态对应的,而且在D0和D3设备状态中又细分了子状态。

PCIe链路电源状态与设备电源状态的对应关系见下图:

205144914886

总结一下,上游组件的设备电源状态不能比下游组件更激进,比如不允许RC先于EP进入低功耗状态;链路两端设备的电源状态不能比链路电源状态更激进,比如不允许设备进入睡眠状态,而链路处于工作状态。

Function的电源状态转换图如下:

205149175109

系统软件可以通过配置Function的PMCSR寄存器来设置Function的电源状态。

205153623471

电源管理能力结构

上图中提到的PMCSR寄存器位于电源管理能力结构(Capability Structure)中。

205201456458

Power Management Capability ID寄存器

PCIe协议为电源管理能力分配的ID是01h。

Power Management Capability寄存器

205207514773

该寄存器位于Capability Structure Header的高16-bit。

各字段含义:

Ø PME Clock:不适用于PCIe

Ø Immediate_Readiness_on_Return_to_D0:1b表示该Function可以在被设置为D0之后立即准备好成功完成有效访问

Ø Device Specific Initialization:指示是否需要对该Function进行特殊初始化。

Ø Aux_Current:报告Function的Vaux辅助电流要求,编码如下表

Aux_Current[2:0] Vaux Max. Current Required (mA)
111b 375
110b 320
101b 270
100b 220
011b 160
010b 100
001b 55
000b 0

Ø D1_Support:Function是否支持D1状态

Ø D2_Support:Function是否支持D2状态

Ø PME_Support:指示Function可以生成PME或转发PME消息的电源状态,编码如下表:

PME_Support[4:0] Function can assert PME
XXXX1b PME can be generated from D0
XXX1Xb PME can be generated from D0
XX1XXb PME can be generated from D0
X1XXXb PME can be generated from D3hot
1XXXXb PME can be generated from D3cold

Power Management Control/Status寄存器

205215500864

各字段含义:

Ø PowerState:既用于确定Function的当前电源状态,又用于将Function设置为新的电源状态,编码如下:

PowerState[1:0] Power state of Function
00b D0
01b D1
10b D2
11b D3hot

Ø No_Soft_Reset:指示在写入PowerState字段以将Function从D3Hot转换为D0之后Function的状态。

Ø PME_En:该位被设置,表示允许Function产生PME

Ø Data_Select:由于选择要通过Data寄存器和Data_Scale字段报告的数据。

Ø Data_Scale:指示在解释Data寄存器的值时要使用的缩放因子

Ø PME_Status:当Function可以正常产生PME时,设置此位

Ø Undefined:在之前版本用到,Gen 5中不用

Data寄存器

205221299899

Data寄存器是可选的8-bit只读寄存器,为电源管理能力提供了一种机制,来报告与状态相关的功耗。如果实现Data寄存器,则PMCS寄存器中的Data_Select和Data_Scale字段也要实现,具体的配合关系参见PCIe基本协议。

微信公众号和word有点不兼容,格式有点乱,大家将就看吧~~

【待续】

本文转自于公众号《老秦谈芯》,版权归《老秦谈芯》所有。

0 篇笔记 写笔记

关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!