Skip to content

Power Management

CPU frequency scaling, device runtime power, and system suspend in the Linux kernel

The power management stack

User space (udev, systemd, powertop)
sysfs / /sys/devices/.../power/  /sys/devices/system/cpu/cpu*/cpufreq/
PM core (drivers/base/power/)
    ├── Runtime PM:  device active/suspended lifecycle
    ├── System PM:   suspend/hibernate state machine
    └── Wakeup:      wakeup_source tracking
cpufreq subsystem (drivers/cpufreq/)
    ├── Governor:    schedutil / ondemand / powersave / performance
    └── Driver:      intel_pstate / acpi-cpufreq / cppc_cpufreq
Hardware: ACPI P-states, HWP (Hardware P-state), C-states, ARM DVFS

Pages in this section

Page What it covers
cpufreq P-states, governors, schedutil, intel_pstate, HWP
cpuidle C-states, latency/power tradeoffs, menu and TEO governors
Runtime PM dev_pm_ops, pm_runtime_get/put, usage counting, autosuspend
System Suspend suspend-to-RAM, hibernate, wakeup sources, PM notifiers
Thermal Management thermal zones, trip points, cooling devices, step_wise, power_allocator
Power Domains and genpd generic_pm_domain, rail dependencies, DT binding, debugfs
Power Capping and RAPL Intel RAPL, powercap framework, MSRs, ARM SCMI
War Stories Suspend regressions, runtime PM deadlocks, thermal storms, RAPL surprises

Quick reference

# Current CPU frequency scaling
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

# Change governor (all CPUs)
echo schedutil | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# Device runtime PM status
cat /sys/bus/pci/devices/*/power/runtime_status
# active / suspended / error

# System suspend states available
cat /sys/power/state
# freeze mem disk

# Suspend to RAM
echo mem | sudo tee /sys/power/state

# Who is blocking suspend?
cat /sys/kernel/debug/wakeup_sources