QCOM Idle States for cpuidle driver 
 | 
  
 | 
ARM provides idle-state node to define the cpuidle states, as defined in [1]. 
 | 
cpuidle-qcom is the cpuidle driver for Qualcomm SoCs and uses these idle 
 | 
states. Idle states have different enter/exit latency and residency values. 
 | 
The idle states supported by the QCOM SoC are defined as - 
 | 
  
 | 
    * Standby 
 | 
    * Retention 
 | 
    * Standalone Power Collapse (Standalone PC or SPC) 
 | 
    * Power Collapse (PC) 
 | 
  
 | 
Standby: Standby does a little more in addition to architectural clock gating. 
 | 
When the WFI instruction is executed the ARM core would gate its internal 
 | 
clocks. In addition to gating the clocks, QCOM cpus use this instruction as a 
 | 
trigger to execute the SPM state machine. The SPM state machine waits for the 
 | 
interrupt to trigger the core back in to active. This triggers the cache 
 | 
hierarchy to enter standby states, when all cpus are idle. An interrupt brings 
 | 
the SPM state machine out of its wait, the next step is to ensure that the 
 | 
cache hierarchy is also out of standby, and then the cpu is allowed to resume 
 | 
execution. This state is defined as a generic ARM WFI state by the ARM cpuidle 
 | 
driver and is not defined in the DT. The SPM state machine should be 
 | 
configured to execute this state by default and after executing every other 
 | 
state below. 
 | 
  
 | 
Retention: Retention is a low power state where the core is clock gated and 
 | 
the memory and the registers associated with the core are retained. The 
 | 
voltage may be reduced to the minimum value needed to keep the processor 
 | 
registers active. The SPM should be configured to execute the retention 
 | 
sequence and would wait for interrupt, before restoring the cpu to execution 
 | 
state. Retention may have a slightly higher latency than Standby. 
 | 
  
 | 
Standalone PC: A cpu can power down and warmboot if there is a sufficient time 
 | 
between the time it enters idle and the next known wake up. SPC mode is used 
 | 
to indicate a core entering a power down state without consulting any other 
 | 
cpu or the system resources. This helps save power only on that core.  The SPM 
 | 
sequence for this idle state is programmed to power down the supply to the 
 | 
core, wait for the interrupt, restore power to the core, and ensure the 
 | 
system state including cache hierarchy is ready before allowing core to 
 | 
resume. Applying power and resetting the core causes the core to warmboot 
 | 
back into Elevation Level (EL) which trampolines the control back to the 
 | 
kernel. Entering a power down state for the cpu, needs to be done by trapping 
 | 
into a EL. Failing to do so, would result in a crash enforced by the warm boot 
 | 
code in the EL for the SoC. On SoCs with write-back L1 cache, the cache has to 
 | 
be flushed in s/w, before powering down the core. 
 | 
  
 | 
Power Collapse: This state is similar to the SPC mode, but distinguishes 
 | 
itself in that the cpu acknowledges and permits the SoC to enter deeper sleep 
 | 
modes. In a hierarchical power domain SoC, this means L2 and other caches can 
 | 
be flushed, system bus, clocks - lowered, and SoC main XO clock gated and 
 | 
voltages reduced, provided all cpus enter this state.  Since the span of low 
 | 
power modes possible at this state is vast, the exit latency and the residency 
 | 
of this low power mode would be considered high even though at a cpu level, 
 | 
this essentially is cpu power down. The SPM in this state also may handshake 
 | 
with the Resource power manager (RPM) processor in the SoC to indicate a 
 | 
complete application processor subsystem shut down. 
 | 
  
 | 
The idle-state for QCOM SoCs are distinguished by the compatible property of 
 | 
the idle-states device node. 
 | 
  
 | 
The devicetree representation of the idle state should be - 
 | 
  
 | 
Required properties: 
 | 
  
 | 
- compatible: Must be one of - 
 | 
            "qcom,idle-state-ret", 
 | 
            "qcom,idle-state-spc", 
 | 
            "qcom,idle-state-pc", 
 | 
        and "arm,idle-state". 
 | 
  
 | 
Other required and optional properties are specified in [1]. 
 | 
  
 | 
Example: 
 | 
  
 | 
    idle-states { 
 | 
        CPU_SPC: spc { 
 | 
            compatible = "qcom,idle-state-spc", "arm,idle-state"; 
 | 
            entry-latency-us = <150>; 
 | 
            exit-latency-us = <200>; 
 | 
            min-residency-us = <2000>; 
 | 
        }; 
 | 
    }; 
 | 
  
 | 
[1]. Documentation/devicetree/bindings/arm/idle-states.txt 
 |