在符合GICv3体系结构的实现中,CPU接口和PE必须位于相同的电源域,但这不必与关联的Redistributor所在的电源域相同。这意味着可能会出现PE及其CPU interface断电,而Redistributor、Distributor和its上电的情况。在这种情况下,GIC架构支持使用针对PE的中断,向PE和CPU接口发送上电事件的信号。
ARM强烈建议不要将GIC配置为这样一种方式,即如果PE上的软件无法处理中断,则中断会导致特定PE的唤醒。
GICv3提供电源管理来控制这种情况,因为该体系结构允许由一个组织设计的redistributor与由另一个组织设计的pe和CPU接口一起使用。
GIC电源管理的所有其他方面都是具体实现定义的。
当Redistributor上电时,在CPU接口和PE下电之前,软件必须将CPU interface和Redistributor之间的接口置于静息状态(quiescent state),否则系统将变得不可预测。通过设置gicr_wake.ProcessorSleep为1完成启动到静态状态的转换。当接口处于静态状态时,
GICR_WAKER.ChildrenAsleep也被设置为1。
-
GICR_WAKER.ChildrenAsleep,bit[2]:
read-only 表明GICR连接的PE是否处于quiescent状态
- 0 表明连接PE的一个接口可能处于active状态
- 1 表明连接PE的所有接口都处于quiescent状态
该字段的复位值应该为1
-
GICR_WAKER.ProcessorSleep, bit[1]:
表明GICR是否能assert WakeRequest信号:
-
0 该PE没有处于也没有进入低功耗状态
-
1 PE处于低功耗状态或正在进入低功耗状态
所有到达GICR的中断:
- assert WakeRequest信号
- 在GICR中处于 pending状态,并且未通信到CPU interface。
当ProcessorSleep == 1时,重分发器必须确保任何挂起在CPU interface上的中断都被释放。
对于使用GIC流协议接口的实现:
- Quiesce命令可以将重分发器和CPU接口之间的接口置于静止状态。
- Release命令可以释放任何CPU接口上挂起的中断。
在让PE下电之前,软件必须将ProcessorSleep位置为1,并且等待ChildrenAsleep==1。在PE上电之后,或者下电失败之后,软件必须将ProcessorSleep位置为0,并且等待ChildrenAsleep==0。
-
GICR_WAKER.ProcessorSleep == 1有以下效果:
- GICR不会将PE的任何中断转发到CPU接口。如果有针对PE的pending状态的中断,则断言一个硬件信号WakeRequest转发给PE,以指示PE将恢复其电源。在GICv4实现中,除了任何其他中断之外,这还适用于虚拟LPI。
- GICD不选择此PE作为1或N中断的候选选择,除非GICD_CTLR.E1NWF == 1, PE已被具体设计实现的机制选中:
- 对于引起wake-up的1 / N中断,如果收到WakeRequest的PE不处理唤醒的中断,则GIC不需要选择新的目标PE。
当GICR和CPU interface之间的接口处于quiescent状态时,可以保存CPU接口的以下架构状态,作为保存CPU interface和PE的电源域内状态的一部分:
- 与所连接PE的物理中断相关的CPU interface状态。
- 与虚拟中断相关的CPU interface状态,该状态是在关联PE上调度的vPE的一部分。
当CPU interface上物理中断分组enable位为1时,设置GICR_WAKER.ProcessorSleep为1,会造成不可预测的后果。
当ProcessorSleep==1或ChildrenAsleep==1时,对GICC*,GICV,GICH_,ICC*,ICV,ICH_寄存器的写操作,都会造成不可预测的后果。