PCIe学习(一)
PCIe学习(二)
PCIe学习(三)
PCIe学习(四)
PCIe学习(五)
PCIe学习(六)
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:机械关机。系统的电源被完全切断。
ACPI也定了设备电源状态:
- D0:设备的全部供电打开,处于完全运行的状态。
- D1:低功耗状态(比D0低),设备上下文可能会丢失,也可能不会丢失。
- D2:比D1更低的功耗状态,但会导致更长的恢复延迟,并可能导致设备丢失上下文。
- D3:设备已做好断电准备,设备的上下文都可能丢失。恢复时间将比D2更长,但在这种状态下可以正常断开设备电源。
其中D1和D2不是强制性的,设备可以根据具体情况选择是否实现这两个状态。
再来看看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链路电源状态的关键。
然后,PCIe协议中定义了设备状态:
D0:这是PCIe设备必须支持的状态,包含两个子状态
- D1:也称为轻度睡眠状态(Light Sleep),该状态是可选的,设备不是必须支持。当Function进入D1状态时,链路进入L1状态。此时设备只可以接收配置请求和消息请求
- D2:也称为深度睡眠状态(Deep Sleep),该状态是可选的,设备不是必须支持。在进入此状态前,软件需要确保所有的Non-Posted请求都得到了Completion。设备进入D2状态后,对应的链路进入L1状态。此时设备只可以接收配置请求和消息请求
- D3:又称为全关(Full-Off)状态。D3状态是设备必须支持的状态,包含两个子状态
PCIe的设备电源状态是与ACPI设备电源状态对应的,而且在D0和D3设备状态中又细分了子状态。
PCIe链路电源状态与设备电源状态的对应关系见下图:
总结一下,上游组件的设备电源状态不能比下游组件更激进,比如不允许RC先于EP进入低功耗状态;链路两端设备的电源状态不能比链路电源状态更激进,比如不允许设备进入睡眠状态,而链路处于工作状态。
Function的电源状态转换图如下:
系统软件可以通过配置Function的PMCSR寄存器来设置Function的电源状态。
电源管理能力结构
上图中提到的PMCSR寄存器位于电源管理能力结构(Capability Structure)中。
Power Management Capability ID寄存器
PCIe协议为电源管理能力分配的ID是01h。
Power Management Capability寄存器
该寄存器位于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辅助电流要求,编码如下表
- D1_Support:Function是否支持D1状态
- D2_Support:Function是否支持D2状态
- PME_Support:指示Function可以生成PME或转发PME消息的电源状态,编码如下表:
各字段含义:
- PowerState:既用于确定Function的当前电源状态,又用于将Function设置为新的电源状态,编码如下:
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寄存器
Data寄存器是可选的8-bit只读寄存器,为电源管理能力提供了一种机制,来报告与状态相关的功耗。如果实现Data寄存器,则PMCS寄存器中的Data_Select和Data_Scale字段也要实现,具体的配合关系参见PCIe基本协议。
【待续】
END
作者:老秦谈芯
文章来源:老秦谈芯
推荐阅读
更多 IC 设计干货请关注IC 设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。