5. CPUIdle
• For UP system, support 2 idle stetes
– C0: CPU WFI
– C1: CPU WFI and DDR self-refresh
• For SMP system, only support 1 idle state
– C0: CPU WFI
• CPUIdle governors
– The menu governor can jump into a deeper state immediately.
(C0 -> C2)
– The ladder governor enters the lightest state first, and move on
to the next deeper state if a sleep was long enough. (C0 -> C1 ->
C2)
• Driver
– drivers/cpuidle/cpuidle-xxxxxx.c
6. CPUIdle Example
# cat /sys/devices/system/cpu/cpu0/cpuidle/state0/desc
Wait for interrupt ; Shows the description of the state
# cat /sys/devices/system/cpu/cpu0/cpuidle/state0/disable
0
# cat /sys/devices/system/cpu/cpu0/cpuidle/state0/latency
1 ; Shows the wakeup latency for this state.
# cat /sys/devices/system/cpu/cpu0/cpuidle/state0/name
WFI ; Shows the name of the state
# cat /sys/devices/system/cpu/cpu0/cpuidle/state0/power
4294967295 ; Shows the typical power consumed when CPU enters this state in mW
# cat /sys/devices/system/cpu/cpu0/cpuidle/state0/time
79420040 ; Shows the amount of time spent in this idle state in usec.
# cat /sys/devices/system/cpu/cpu0/cpuidle/state0/usage
14417 ; Shows the count of number of times this idle state has been entered
7. CPUFreq
• CPU Frequency Scaling
• CPUFreq governors
– Conservative: Dynamically switch between CPU(s) available if
at 75% load
– Ondemand: Dynamically switch between CPU(s) available if at
95% load
– Performance: Run the CPU at maximum frequency
– Powersave: Run the CPU at the minimum frequency
– Userspace: Run the CPU at user specified frequencies
• Driver
– drivers/cpufreq/xxxxxx-cpufreq.c
9. CPU DVFS
• CPUFreq + Voltage Layer
• Regulator Framework
– Regulates the output power from input power
• Voltage Control
• Current Limiting
• Switch output power ON/OFF
VDD1 1100 ~ 1200 mV CPU_1V1
VDD2 1350 ~ 1500 mV DRAM_1V5
VIO 3300 mV D.3.3V_G
VDDCTRL 1100 mV SOC_1V1
LDO1 1800 mV Reserved
LDO2 2500 mV Reserved
LDO3 1100 mV SB_1.1V
LDO4 1100 mV Reserved
LDO5 3300 mV SB_3.3V
LDO6 3300 mV Reserved
LDO7 2500 mV CHIP_2.5V
LDO8 1000 ~ 3300 mV SD_IF_VDD
10. Regulator Framework
• Regulator APIs
struct regulator * regulator_get (struct device *dev,
const char *id);
regulator_put(regulator);
int regulator_set_voltage(struct regulator *regulator,
int min_uV, int max_uV);
int regulator_get_voltage(struct regulator *regulator);
int regulator_enable(regulator);
int regulator_disable(regulator);
int regulator_force_disable(regulator);
int regulator_is_enabled(regulator);
Reference:
https://www.kernel.org/doc/htmldocs/regulator.html
11. CPU DVFS Example
# cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
800
# cat /sys/class/regulator/regulator.3/microvolts
1200000
; Change CPU speed to 700 MHz
# echo 700 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
# cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
700
# cat /sys/class/regulator/regulator.3/microvolts
1187500
12. CPU Hotplug
• CPU hotplug is one approach for bring up /
shutdown the secondary CPU Cores
• The code can be used by kernel “suspend” and
“hibernate”.
• From a power consumption point of view, the
CPU hotplug feature might not be very useful
for a SMP system.