登录后台

页面导航

在符合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_寄存器的写操作,都会造成不可预测的后果。

博主已关闭本页面的评论功能