Power Management

Quick Reference

# Battery status
cat /sys/class/power_supply/BAT0/capacity
upower -i /org/freedesktop/UPower/devices/battery_BAT0

# Power profile (power-profiles-daemon)
powerprofilesctl list
powerprofilesctl set power-saver

# TLP status
sudo tlp-stat -s

# Suspend
systemctl suspend

# Hibernate
systemctl hibernate

Power Management Options

Choose Your Approach

Tool Best For Notes

power-profiles-daemon

GNOME/KDE desktops

Simple, GUI integration

TLP

Maximum battery life

Extensive tuning options

auto-cpufreq

Automatic optimization

AI-based frequency scaling

Manual tuning

Specific needs

Direct sysfs/sysctl control

Don’t run multiple power managers simultaneously. Choose one approach.

power-profiles-daemon

Installation

# Install
sudo pacman -S power-profiles-daemon

# Enable
sudo systemctl enable --now power-profiles-daemon

Usage

# List profiles
powerprofilesctl list
# * power-saver
#   balanced
#   performance

# Get current profile
powerprofilesctl get

# Set profile
powerprofilesctl set power-saver
powerprofilesctl set balanced
powerprofilesctl set performance

Integration

Works automatically with: * GNOME (Settings > Power) * KDE Plasma (Battery applet) * Most desktop environments

TLP (Advanced Power Management)

Installation

# Install TLP
sudo pacman -S tlp tlp-rdw

# For ThinkPads
sudo pacman -S tp_smapi acpi_call

# Enable
sudo systemctl enable tlp.service
sudo systemctl enable NetworkManager-dispatcher.service

# Disable conflicting services
sudo systemctl mask systemd-rfkill.service
sudo systemctl mask systemd-rfkill.socket

Basic Configuration

# /etc/tlp.conf

# --- AC/Battery Operation ---
TLP_ENABLE=1
TLP_DEFAULT_MODE=AC
TLP_PERSISTENT_DEFAULT=0

# --- CPU ---
CPU_SCALING_GOVERNOR_ON_AC=performance
CPU_SCALING_GOVERNOR_ON_BAT=powersave

CPU_ENERGY_PERF_POLICY_ON_AC=performance
CPU_ENERGY_PERF_POLICY_ON_BAT=balance_power

CPU_BOOST_ON_AC=1
CPU_BOOST_ON_BAT=0

# --- Platform ---
PLATFORM_PROFILE_ON_AC=performance
PLATFORM_PROFILE_ON_BAT=low-power

# --- Disk ---
DISK_DEVICES="nvme0n1 sda"
DISK_APM_LEVEL_ON_AC="254 254"
DISK_APM_LEVEL_ON_BAT="128 128"

# --- WiFi ---
WIFI_PWR_ON_AC=off
WIFI_PWR_ON_BAT=on

# --- USB ---
USB_AUTOSUSPEND=1
USB_EXCLUDE_BTUSB=1    # Don't suspend Bluetooth

# --- Battery ---
START_CHARGE_THRESH_BAT0=75
STOP_CHARGE_THRESH_BAT0=80

TLP Commands

# Show status
sudo tlp-stat -s

# Show battery info
sudo tlp-stat -b

# Show all settings
sudo tlp-stat -c

# Apply settings manually
sudo tlp start

# Force AC mode
sudo tlp ac

# Force battery mode
sudo tlp bat

TLP-RDW (Radio Device Wizard)

# /etc/tlp.conf

# Disable radios on network connect
DEVICES_TO_DISABLE_ON_LAN_CONNECT="wifi wwan"
DEVICES_TO_ENABLE_ON_LAN_DISCONNECT="wifi"

# Disable radios on dock
DEVICES_TO_DISABLE_ON_DOCK="wifi"
DEVICES_TO_ENABLE_ON_UNDOCK="wifi"

auto-cpufreq

Installation

# From AUR
yay -S auto-cpufreq

# Enable daemon
sudo systemctl enable --now auto-cpufreq

Usage

# Check status
auto-cpufreq --stats

# Monitor live
auto-cpufreq --live

# One-time run
sudo auto-cpufreq --force=powersave
sudo auto-cpufreq --force=performance
sudo auto-cpufreq --force=reset

Configuration

# /etc/auto-cpufreq.conf
[charger]
governor = performance
turbo = auto

[battery]
governor = powersave
turbo = off

CPU Frequency Scaling

Manual Control

# Install tools
sudo pacman -S cpupower

# Check current state
cpupower frequency-info

# List governors
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
# performance powersave schedutil

# Set governor
sudo cpupower frequency-set -g powersave

# Set frequency limits
sudo cpupower frequency-set -u 2.0GHz    # Max frequency
sudo cpupower frequency-set -d 800MHz    # Min frequency

Persistent Configuration

# /etc/default/cpupower
governor='powersave'
min_freq="800MHz"
max_freq="2.0GHz"

# Enable service
sudo systemctl enable cpupower

Intel P-State

# Check driver
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
# intel_pstate or acpi-cpufreq

# Intel P-state options
cat /sys/devices/system/cpu/intel_pstate/no_turbo
echo 1 | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo    # Disable turbo

# Energy Performance Preference
cat /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference
echo "power" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference

Suspend and Hibernate

Suspend (Sleep/S3)

# Suspend immediately
systemctl suspend

# Check suspend type
cat /sys/power/mem_sleep
# [s2idle] deep

# Prefer deep sleep (S3)
echo deep | sudo tee /sys/power/mem_sleep

# Permanent (kernel parameter)
# Add to boot options: mem_sleep_default=deep

Hibernate (Suspend to Disk)

# Requirements:
# 1. Swap partition/file >= RAM size
# 2. Resume kernel parameter

# Find swap UUID
findmnt -no UUID -T /swapfile    # Or use swap partition UUID

# Add to kernel parameters
# /boot/loader/entries/arch.conf
options ... resume=UUID=YOUR-SWAP-UUID

# For swap file, also need offset
sudo filefrag -v /swapfile | head -4
# Add: resume_offset=OFFSET_VALUE

# Regenerate initramfs with resume hook
# /etc/mkinitcpio.conf
HOOKS=(... block resume filesystems ...)
sudo mkinitcpio -P

# Test hibernate
systemctl hibernate

Hybrid Sleep

# Suspend + write to swap (resume even after power loss)
systemctl hybrid-sleep

# Configure
# /etc/systemd/sleep.conf
[Sleep]
AllowSuspend=yes
AllowHibernation=yes
AllowSuspendThenHibernate=yes
AllowHybridSleep=yes
SuspendMode=suspend
SuspendState=mem
HibernateMode=platform shutdown
HibernateState=disk
HybridSleepMode=suspend platform shutdown
HybridSleepState=disk

Suspend-then-Hibernate

# Suspend, then hibernate after timeout
systemctl suspend-then-hibernate

# Configuration
# /etc/systemd/sleep.conf
[Sleep]
HibernateDelaySec=3600    # Hibernate after 1 hour of suspend

Lid Close Actions

# /etc/systemd/logind.conf
[Login]
HandleLidSwitch=suspend
HandleLidSwitchExternalPower=ignore
HandleLidSwitchDocked=ignore
HandlePowerKey=poweroff
HandleSuspendKey=suspend
HandleHibernateKey=hibernate

# Restart
sudo systemctl restart systemd-logind

Battery Management

Check Battery Status

# Using upower
upower -e    # List devices
upower -i /org/freedesktop/UPower/devices/battery_BAT0

# Direct sysfs
cat /sys/class/power_supply/BAT0/status
cat /sys/class/power_supply/BAT0/capacity
cat /sys/class/power_supply/BAT0/energy_full
cat /sys/class/power_supply/BAT0/energy_now
cat /sys/class/power_supply/BAT0/power_now

# Battery health
cat /sys/class/power_supply/BAT0/energy_full_design
cat /sys/class/power_supply/BAT0/energy_full
# Compare to calculate wear

Battery Charge Thresholds

Limit charge to extend battery lifespan:

# ThinkPad (with tp_smapi or acpi_call)
# TLP configuration
START_CHARGE_THRESH_BAT0=75
STOP_CHARGE_THRESH_BAT0=80

# Apply
sudo tlp setcharge 75 80 BAT0

# Check
sudo tlp-stat -b

# ASUS laptops
# Install asus-wmi-tools or use /sys
echo 60 | sudo tee /sys/class/power_supply/BAT0/charge_control_end_threshold

Screen and Backlight

Brightness Control

# Install brightnessctl
sudo pacman -S brightnessctl

# Get current brightness
brightnessctl get
brightnessctl info

# Set brightness
brightnessctl set 50%
brightnessctl set +10%
brightnessctl set 10%-

# Maximum brightness
brightnessctl set 100%

# Minimum visible
brightnessctl set 1

Automatic Brightness (Light Sensor)

# Install clight
yay -S clight

# Configuration
# ~/.config/clight.conf

# Enable and start
systemctl --user enable --now clight

Display Power Management

# DPMS settings (X11)
xset dpms 300 600 900    # Standby, suspend, off (seconds)
xset s 300               # Screensaver timeout

# Wayland (compositor-specific)
# Hyprland example in config
exec-once = swayidle -w \
    timeout 300 'swaylock -f' \
    timeout 600 'hyprctl dispatch dpms off' \
    resume 'hyprctl dispatch dpms on' \
    before-sleep 'swaylock -f'

Monitoring Power Usage

PowerTOP

# Install
sudo pacman -S powertop

# Interactive mode
sudo powertop

# Generate HTML report
sudo powertop --html=report.html

# Auto-tune (apply all optimizations)
sudo powertop --auto-tune

# Calibrate (run on battery)
sudo powertop --calibrate

PowerTOP Auto-Tune Service

# Create service
# /etc/systemd/system/powertop.service
[Unit]
Description=Powertop tunings

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/powertop --auto-tune

[Install]
WantedBy=multi-user.target

# Enable
sudo systemctl enable powertop

Battery Statistics

# upower history
upower -d

# Power consumption
cat /sys/class/power_supply/BAT0/power_now
# Value in microwatts

# Estimate remaining time
upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep -E "time|percentage"

Troubleshooting

Suspend Not Working

# Check for issues
journalctl -b | grep -i suspend
dmesg | grep -i suspend

# Common fixes:
# 1. NVIDIA: Add nvidia modules to initramfs
MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)

# 2. USB waking system
# Find wake sources
cat /proc/acpi/wakeup
# Disable problematic device
echo XHC | sudo tee /proc/acpi/wakeup

High Power Usage

# Find power-hungry processes
powertop

# Check CPU frequency
watch -n 1 'cat /proc/cpuinfo | grep MHz'

# Check for stuck processes
top
htop

# Check wake events
cat /sys/kernel/debug/wakeup_sources

Battery Draining Fast

# Check current draw
cat /sys/class/power_supply/BAT0/current_now

# Identify power consumers
sudo powertop

# Check TLP status
sudo tlp-stat -s

# Common culprits:
# - Discrete GPU not suspended
# - WiFi power save off
# - USB devices
# - High CPU frequency

NVIDIA Power Issues

# Check GPU power state
cat /sys/bus/pci/devices/0000:01:00.0/power/runtime_status
# suspended = good, active = drawing power

# Enable runtime PM for NVIDIA
# /etc/udev/rules.d/80-nvidia-pm.rules
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto"
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="on"

# Reload
sudo udevadm control --reload
sudo udevadm trigger

Quick Reference

# Battery status
cat /sys/class/power_supply/BAT0/capacity
upower -i /org/freedesktop/UPower/devices/battery_BAT0

# Power profile
powerprofilesctl list/get/set

# TLP
sudo tlp-stat -s                  # Status
sudo tlp start                    # Apply settings
sudo tlp ac / tlp bat             # Force mode

# CPU
cpupower frequency-info           # Current state
cpupower frequency-set -g GOVERNOR

# Suspend/Hibernate
systemctl suspend
systemctl hibernate
systemctl hybrid-sleep

# Brightness
brightnessctl set 50%
brightnessctl set +10%

# Monitoring
sudo powertop                     # Interactive
sudo powertop --auto-tune         # Apply optimizations

# Logs
journalctl -u tlp -b
journalctl | grep -i suspend