Power Management in Linux – Advanced Tweaks: Kernel Parameters, GRUB, and Modprobe Options

A hands-on guide to tuning Linux power management: from sysctl and GRUB kernel parameters to module options and verification. Learn to squeeze extra battery life, cut heat, and balance performance with stability-tested power-saving profiles.

Power Management in Linux – Advanced Tweaks: Kernel Parameters, GRUB, and Modprobe Options
Photo by Shavr IK / Unsplash

Table of Contents

  1. Introduction
    • Why tune power management?
    • Scope & audience
  2. Prerequisites & Safety
    • Back-up & recovery
    • Test environment
    • Tools you need
  3. Fundamentals
    • Linux power-management stack
    • Key kernel subsystems (cpuidle, cpufreq, runtime PM, PCIe ASPM, USB autosuspend)
  4. Kernel Parameters (sysctl & /proc /sys)
    • Global sysctl knobs
    • /proc/sys/vm, /proc/sys/kernel
    • /sys/devices/system/cpu
    • Example “power-save” profile
  5. GRUB – Boot-time Kernel Command Line
    • Anatomy of GRUB_CMDLINE_LINUX
    • Common power-saving options
    • CPU-frequency & idle tweaks
    • PCIe ASPM, USB, SATA, Wi-Fi, Bluetooth
    • Example GRUB configurations
    • Updating GRUB & regenerating initramfs
  6. Modprobe – Module-specific Parameters
    • Overview of modprobe.d
    • Power-related modules (e.g., i915, radeon, amdgpu, thinkpad_acpi, snd_hda_intel, btusb)
    • Syntax & precedence
    • Sample files
  7. Putting It All Together – A “Full-Power-Save” Profile
    • Step-by-step procedure
    • Verification with powertop, turbostat, systemd-analyze
  8. Testing, Benchmarking & Roll-back
    • Stress testing
    • Measuring battery life
    • Reverting changes
  9. Troubleshooting
    • Common symptoms
    • Log-based diagnostics
    • Kernel panics & boot loops
  10. Advanced Topics
    • Dynamic runtime power management (DPM)
    • Using systemd power-saving services
    • Interaction with user-space tools (TLP, laptop-mode-tools, power-profiles-daemon)
  11. FAQ
  12. References & Further Reading
  13. Appendix
    • Full example configuration files
    • Glossary of terms

1. Introduction

1.1 Why Tune Power Management?

  • Battery life: Laptops, convertibles, and ARM‑based notebooks can gain 10‑30 % extra runtime with aggressive tuning.
  • Thermal envelope: Lower power ⇒ cooler chassis ⇒ less fan noise and higher component longevity.
  • Energy cost & carbon footprint: For servers, even a few watts saved per node add up in large farms.
  • Performance vs. efficiency trade‑off: Advanced knobs let you define the exact point on the curve you need.

1.2 Scope & Audience

This manual assumes:

  • A modern Linux distribution (kernel ≥ 6.0) using systemd and GRUB2.
  • Familiarity with the command line, sudo, and basic system administration.
  • A willingness to edit bootloader and kernel module configuration files.

It does not cover:

  • User‑space power‑management utilities (TLP, power-profiles-daemon) – those are mentioned only for completeness.
  • Firmware‑level (BIOS/UEFI) power‑policy configuration (though some BIOS knobs are referenced).

2. Prerequisites & Safety

2.1 Back‑up & Recovery

Action Command / Tool
Backup /etc/default/grub sudo cp /etc/default/grub /etc/default/grub.bak
Backup all modprobe.d files sudo cp -r /etc/modprobe.d /etc/modprobe.d.bak
Snapshot of /etc/sysctl.conf sudo cp /etc/sysctl.conf /etc/sysctl.conf.bak
Create a bootable rescue USB (e.g., SystemRescueCD)

Tip: Keep a copy of the original kernel command line (cat /proc/cmdline) in a text file.

2.2 Test Environment

  • Virtual machine (VM) – Great for syntax checking of GRUB & modprobe files, but power‑management hardware features are not exposed.
  • Live USB – Boot a known‑good live system, then chroot into your installed system to apply changes safely.
  • Dual‑boot fallback – Keep an older kernel entry in GRUB that boots without your custom options.

2.3 Tools You Need

sudo apt install -y git curl jq      # Debian/Ubuntu
sudo dnf install -y git curl jq       # Fedora
sudo pacman -S git curl jq            # Arch
  • powertop – interactive power diagnostics.
  • turbostat – per‑CPU frequency/power stats (requires linux-tools).
  • systemd-analyze blame – identify services that may waste power.
  • journalctl -b – review boot logs after changes.

3. Fundamentals

3.1 Linux Power‑Management Stack

Layer Description Typical knobs
CPU idle (cpuidle) Low‑power states when a core is idle. idle=nomwait, idle=disable, idle=1
CPU frequency scaling (cpufreq) Adjusts core frequency based on load. governors (powersave, schedutil), max_perf_pct
Runtime Power Management (runtime PM) Per‑device suspend/resume while the system is running. /sys/bus/*/devices/*/power/control
PCIe ASPM (Active State Power Management) Link‑level power saving for PCIe devices. pcie_aspm=force
USB autosuspend Suspends idle USB devices. usbcore.autosuspend=1
SATA link power management Puts SATA ports in low‑power mode. libata.force=1.5G or sata_alpm=1
Wi‑Fi / Bluetooth power policies Firmware‑controlled power saving. btusb.enable_autosuspend=1
Note: Most of these knobs are exposed via kernel command‑line parameters (GRUB) or via sysfs after boot. The manual covers both approaches.

3.2 Interaction with User‑Space

  • systemd provides systemd-suspend, systemd-hibernate, and the power-profiles-daemon that expose “performance”, “balanced”, and “power‑save” profiles.
  • powertop can “tune” many of the same parameters automatically; however, manual control via GRUB / modprobe is more deterministic and survives reboots without a daemon.

4. Kernel Parameters (sysctl & /proc /sys)

4.1 Global sysctl knobs

Parameter Path Recommended value Effect
kernel.nmi_watchdog /proc/sys/kernel/nmi_watchdog 0 Disables NMI watchdog (saves a few mW).
kernel.sched_rt_runtime_us /proc/sys/kernel/sched_rt_runtime_us -1 Removes runtime limit for real‑time tasks (avoid throttling).
vm.swappiness /proc/sys/vm/swappiness 10 (or 1 on laptops) Reduces swap usage, keeping more RAM for cache, which is cheaper than flash swap.
vm.laptop_mode /proc/sys/vm/laptop_mode 5 (or 0 if you disable laptop mode) Increases dirty‑page write‑back delay, allowing the disk to spin down longer.

Add the above to /etc/sysctl.d/99-power.conf (create if missing):

# /etc/sysctl.d/99-power.conf
kernel.nmi_watchdog = 0
kernel.sched_rt_runtime_us = -1
vm.swappiness = 10
vm.laptop_mode = 5

Apply immediately:

sudo sysctl --system

4.2 /proc/sys/vm & /proc/sys/kernel

Parameter Example value Reason
proc.max_threads 20000 (default is 32768) Reducing max threads may lower kernel overhead on low‑end CPUs.
kernel.perf_event_paranoid 2 Disallow unprivileged access to performance counters (tiny security gain).

4.3 /sys/devices/system/cpu

4.3.1 CPU Frequency Scaling

# Set the default governor to "schedutil" (modern, combines load tracking & power)
sudo cpupower frequency-set -g schedutil

# Force a max performance percentage (e.g., limit to 80% of turbo)
echo 80 | sudo tee /sys/devices/system/cpu/cpufreq/policy0/max_perf_pct

You can make the setting persistent with a systemd service (/etc/systemd/system/cpufreq.service).

4.3.2 CPU Idle Governor

# Use "menu" idle governor (good balance) or "nop" to disable deep C‑states
echo menu | sudo tee /sys/devices/system/cpu/cpuidle/current_driver

4.4 Example “power‑save” profile (sysfs)

Create /etc/rc.local (or a systemd unit) that runs at boot:

#!/bin/sh
# /etc/rc.local – executed after multi‑user.target

# Reduce CPU C‑states to avoid latency spikes (optional)
for c in /sys/devices/system/cpu/cpu*/cpuidle/state*; do
    echo 0 > "$c/disable"
done

# Set all CPUs to powersave governor
for cpu in /sys/devices/system/cpu/cpu[0-9]*; do
    echo powersave > "$cpu/cpufreq/scaling_governor"
done

exit 0

Make it executable:

sudo chmod +x /etc/rc.local
sudo systemctl enable rc-local.service   # on Debian/Ubuntu

5. GRUB – Boot‑time Kernel Command Line

5.1 Anatomy of GRUB_CMDLINE_LINUX

The line is a space‑separated list of key=value pairs passed to the kernel at boot. Example:

GRUB_CMDLINE_LINUX="quiet splash intel_iommu=on pci=noaer"

Only the value part may be quoted if it contains spaces.

5.2 Common Power‑Saving Options

Option Syntax Typical value What it does
intel_idle.max_cstate intel_idle.max_cstate=N 1 or 2 Limit deepest C‑state (avoid latency).
processor.max_cstate processor.max_cstate=N 1 Same for generic ACPI.
pcie_aspm pcie_aspm=force force Enables ASPM even if BIOS disabled it.
usbcore.autosuspend usbcore.autosuspend=1 -1 (disable) or 2 (seconds) Auto‑suspend idle USB devices.
acpi_osi acpi_osi=!Windows 2015 !Windows 2015 Hides newer OS signatures to coax firmware into low‑power mode.
acpi_rev_override acpi_rev_override=1 1 Enables newer ACPI revision parsing (useful on older BIOS).
modprobe.blacklist Not a kernel param – see §6.
sata_alpm sata_alpm=1 1 (enable) Enables aggressive SATA link power management.
i915.enable_psr i915.enable_psr=1 1 (or 0 to disable) Panel Self‑Refresh for Intel GPUs (big savings on laptops).
i915.enable_fbc i915.enable_fbc=1 1 Frame Buffer Compression – reduces memory bandwidth.
i915.enable_guc i915.enable_guc=2 2 (full) GuC submission – improves power on newer Intel GPUs.
amdgpu.runpm amdgpu.runpm=1 1 Runtime PM for AMD GPUs.
nouveau.powersave nouveau.powersave=1 1 Enable power‑save mode for NVIDIA cards (if using Nouveau).
nvme_core.default_ps_max_latency_us nvme_core.default_ps_max_latency_us=0 0 Aggressive NVMe power state transitions.
intel_pstate intel_pstate=passive passive Let cpufreq driver manage Intel P‑state (more flexibility).
idle=nomwait idle=nomwait Avoids MWAIT deep idle states on some CPUs (useful if they cause hangs).
mitigations=off mitigations=off Disables Spectre/Meltdown mitigations (large performance boost, but security trade‑off).
quiet / splash Standard Reduce console output (minor power impact).
Caution: Some options (pcie_aspm=force, idle=nomwait, mitigations=off) can cause instability on specific hardware. Test thoroughly.

5.3 CPU‑frequency & Idle Tweaks

5.3.1 Disabling Intel SpeedStep (if you want a fixed low frequency)

GRUB_CMDLINE_LINUX="intel_pstate=disable"

5.3.2 Limiting Turbo Boost

GRUB_CMDLINE_LINUX="intel_pstate=no_hwp turbo_pct=70"

turbo_pct caps turbo to a percentage of the nominal maximum.

GRUB_CMDLINE_LINUX="intel_pstate=passive"

After reboot, the cpufreq governors become visible (e.g., schedutil, powersave).

5.4 PCIe, USB, SATA, Wi‑Fi, Bluetooth

GRUB_CMDLINE_LINUX="pcie_aspm=force usbcore.autosuspend=2 sata_alpm=1 iwlwifi.power_save=1 iwlwifi.bt_coex_active=0 btusb.enable_autosuspend=1"
  • iwlwifi.power_save=1 – Enables power‑save for Intel wireless.
  • iwlwifi.bt_coex_active=0 – Disables Bluetooth coexistence (may improve Wi‑Fi power).

5.5 Example GRUB Configurations

5.5.1 “Balanced” (default)

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="intel_pstate=passive"

5.5.2 “Maximum Battery Life”

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="intel_pstate=passive processor.max_cstate=1 pcie_aspm=force usbcore.autosuspend=2 \
    iwlwifi.power_save=1 iwlwifi.bt_coex_active=0 btusb.enable_autosuspend=1 \
    i915.enable_psr=1 i915.enable_fbc=1 i915.enable_guc=2 amdgpu.runpm=1 \
    nvme_core.default_ps_max_latency_us=0"

5.5.3 “Performance (Desktop) – No Power Saving”

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="intel_pstate=disable turbo_pct=100"

5.6 Editing and Updating GRUB

On Debian‑based distros:

sudo nano /etc/default/grub
# edit the lines as above
sudo update-grub

On Fedora/CentOS (grub2-mkconfig):

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

After editing, reboot to apply.

5.7 Verifying the Parameters

After boot, run:

cat /proc/cmdline

You should see the exact string you set.

5.8 Override a GRUB parameters

The configuration file structure:

The /etc/default/grub.d/ directory contains shell script fragments that are sourced by grub-mkconfig. The configuration files are read in alphabetical order, and the final settings are combined before generating the grub.cfg file. 
This process works by using a shell variable expansion and concatenation. For example, to add a new kernel parameter, you do not replace the GRUB_CMDLINE_LINUX_DEFAULT variable; you append your new parameter to it using ${GRUB_CMDLINE_LINUX_DEFAULT}

How to override a GRUB parameter:

This procedure can be used to add or modify parameters like: pci=noaer

Create a new file in the /etc/default/grub.d/ directory. Use a descriptive name that ends in .cfg and starts with a number to control its execution order. A number like 50 or 90 is generally safe to ensure it is processed after any system defaults.

sudo nano /etc/default/grub.d/90-custom-params.cfg

Add the override logic to the new file. Use shell variable expansion to prepend or append your new parameters. To append a parameter: Append your new parameter to the existing value of GRUB_CMDLINE_LINUX_DEFAULT. This is the most common use case.

# 90-custom-params.cfg
GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT} pci=noaer"

To prepend a parameter: Some parameters need to be at the beginning of the list.

# 90-custom-params.cfg
GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 ${GRUB_CMDLINE_LINUX_DEFAULT}"

6. modprobe – Kernel Module Parameters & Blacklisting

6.1 Why modprobe matters for power

Many drivers expose module parameters that can be set at load time (e.g., i915.enable_psr=1). These are supplied via a modprobe configuration file in /etc/modprobe.d/.

6.2 Syntax

File format: options <module> <key>=<value>.

Example /etc/modprobe.d/99-power.conf:

# /etc/modprobe.d/99-power.conf
options i915 enable_psr=1 enable_fbc=1 enable_guc=2
options amdgpu runpm=1
options nouveau powersave=1
options iwlwifi power_save=1 bt_coex_active=0
options snd_hda_intel power_save=1
options xhci_hcd autosuspend=1

6.3 Blacklisting Unwanted Modules

If a driver is known to prevent deep sleep (e.g., mei_me on some Intel platforms), blacklist it:

blacklist mei_me
blacklist mei

Add these lines to the same 99-power.conf file.

6.4 Persistent NVMe Power Settings

Create /etc/modprobe.d/nvme.conf:

options nvme_core default_ps_max_latency_us=0

6.5 GPU‑Specific Module Options

Driver Module Option Recommended value Note
Intel i915 i915 enable_psr 1 Panel Self‑Refresh.
Intel i915 i915 enable_fbc 1 Frame Buffer Compression.
AMDGPU amdgpu runpm 1 Runtime PM.
Nouveau (NVIDIA) nouveau powersave 1 Power‑save mode.
Intel Wi‑Fi iwlwifi power_save 1 Enable Wi‑Fi power saving.
Realtek Wi‑Fi (rtl8723be) rtl8723be fwlps=1 1 Firmware low‑power state.

6.6 Reloading Module Options without Reboot

If you change a modprobe file, you can reload the module:

sudo modprobe -r i915
sudo modprobe i915
Warning: Unloading the graphics driver on an active X session will kill the display. Use a virtual console (Ctrl+Alt+F3) or reboot.

7. Verifying Power‑Saving Behaviour

7.1 Using powertop

sudo powertop --html=powertop-report.html

Open the HTML file in a browser; look for:

  • CPU C‑states (C1, C2, …) – higher percentages indicate deeper sleep.
  • GPU Power – Panel Self‑Refresh (PSR) should be active.
  • PCIe ASPM – shows if ASPM is enabled.

7.2 Checking C‑state Limits

cat /sys/devices/system/cpu/cpu0/cpuidle/state*/name
cat /sys/devices/system/cpu/cpu0/cpuidle/state*/disable

A 0 means the state is enabled.

7.3 Monitoring Battery Drain

Use upower or acpi:

upower -i $(upower -e | grep BAT)

Observe time to empty before and after changes.

7.4 Stress‑Testing for Stability

Run a short CPU stress test:

sudo apt install stress
stress --cpu 4 --timeout 120

Watch for freezes, excessive throttling, or kernel messages (dmesg | grep -i error).

Below is a fleshed‑out version of the sections you flagged as missing.
I kept the same numbering and titles you provided and expanded each bullet into a short‑to‑medium‑length paragraph (or a few paragraphs where appropriate). Feel free to trim, reorder, or add examples that match the rest of your document.


8. Testing, Benchmarking & Roll‑back

8.1 Stress testing

Before shipping a kernel or a power‑management configuration, you need to verify that the system remains stable under load. Typical stress‑testing tools include stress‑ng, sysbench, and Phoronix Test Suite. Run a mix of CPU, memory, I/O and GPU workloads while the power‑saving features (CPUFreq, runtime PM, autosuspend, etc.) are active. Monitor the kernel logs (dmesg -w), temperature sensors (sensors), and the power consumption (powertop or an external power meter). If you see frequent throttling, unexpected wake‑ups, or kernel oopses, isolate the offending component by toggling individual features.

8.2 Measuring battery life

Real‑world battery life is the ultimate metric for a laptop or embedded device. Use a repeatable workload (e.g., video playback, web browsing, compile‑heavy loops) and record the discharge curve with upower, acpi, or a dedicated power‑meter. The powertop --html report gives a nice visual of which devices are consuming the most power and how many wake‑ups they generate. For more scientific results, script the test so that the same sequence of actions (open a browser, start a video, run stress-ng --cpu 4) is performed on each build, then compute the average runtime until the battery reaches the shutdown threshold.

8.3 Reverting changes

Never assume a new kernel or config will work on every machine. Keep a rollback plan:

Step Action
1 Keep the previous kernel image and initramfs in /boot (e.g., vmlinuz-5.15.0‑old).
2 Add a GRUB menu entry for the old kernel (most distributions do this automatically).
3 Store the original sysctl.conf, modprobe.d/, and systemd service overrides in a version‑controlled directory (Git or a simple tarball).
4 Test the new kernel once, and if a regression appears, reboot and select the old entry.
5 If the new kernel is the only one left in the bootloader, use grub-reboot or efibootmgr to force a one‑time boot into the previous version.

Document the exact git commit or package version you rolled back from, so you can reproduce the environment later.

9. Troubleshooting

9.1 Common symptoms

Symptom Typical cause First‑look check
Rapid battery drain Aggressive wake‑ups, missing autosuspend, high CPU frequency powertop --summary → look for “Wake‑ups per second”
Cold‑boot hangs / long boot time Stuck device initialization, kernel waiting on timeouts systemd-analyze blame and journalctl -b -p err
Random freezes or lock‑ups CPU throttling, over‑voltage, driver bugs sensors for thermal throttling, dmesg for “CPU frequency scaling driver” errors
Wi‑Fi or Bluetooth disconnects after suspend Power state not restored correctly `dmesg

9.2 Log‑based diagnostics

  1. Kernel ring bufferdmesg -T (timestamps) or journalctl -k give the most immediate clues. Look for lines containing PM:, CPUFreq:, autosuspend, or any “failed to set power state” messages.
  2. Systemd journaljournalctl -b -p 3 filters for warnings and errors from the current boot. You can also query a specific service, e.g., journalctl -u systemd-suspend.service.
  3. Device‑specific logs – many drivers expose debugfs entries:
    • /sys/kernel/debug/pm_runtime – shows per‑device runtime‑PM usage counters.
    • /sys/kernel/debug/pm_trace – enables tracing of suspend/resume events (echo 1 > trace).

Collecting these logs before and after a reproducible step (e.g., plugging in a USB‑C dock) makes it far easier to spot the exact moment something goes wrong.

9.3 Kernel panics & boot loops

When a kernel panic occurs during early boot, you may only see a cryptic Kernel panic - not syncing: Fatal exception. Common culprits in the power‑management area are:

  • Broken ACPI tables – try booting with acpi=off or acpi=noirq to see if the panic disappears. If it does, the problem is likely a buggy BIOS; file a bug report to the vendor.
  • Mismatched CPUFreq governor – a governor that expects a missing cpufreq driver can cause a BUG: unable to handle kernel paging request. Verify that the appropriate driver (intel_pstate, acpi-cpufreq, or amd_pstate) is loaded.
  • Incorrect device tree / platform data – on ARM boards, a missing compatible string can cause the runtime‑PM core to dereference a null pointer.

Recovery steps:

  1. Boot into an older kernel (GRUB → “Advanced options”).
  2. Add init=/bin/sh to the kernel command line to drop into a minimal shell before most services start.
  3. Mount the root filesystem read‑write (mount -o remount,rw /).
  4. Undo the last change (e.g., restore the original cpufreq driver, revert a modprobe.d blacklist, or delete a broken systemd override).
  5. Reboot and verify the system boots cleanly.

10. Advanced Topics

10.1 Dynamic runtime power management (DPM)

Modern kernels (≥ 5.4) expose Dynamic DPM for GPUs, NVMe, and other high‑performance devices. DPM works by exposing a set of performance states (P‑states) that the runtime‑PM core can switch between based on utilization. To enable it:

# For AMD GPU
echo "1" > /sys/class/drm/card0/device/power_dpm_state   # "performance" or "battery"
echo "auto" > /sys/class/drm/card0/device/power_dpm_force_performance_level

The kernel automatically selects the lowest power state that satisfies the current workload. You can fine‑tune thresholds via /sys/module/amdgpu/parameters/dpm_forced_performance_level. Similar interfaces exist for Intel i915 (/sys/class/drm/card0/power_profile) and for NVMe (/sys/block/nvme0n1/power/control).

10.2 Using systemd power‑saving services

systemd ships a collection of power‑saving units that can be enabled or disabled per‑profile:

Service Purpose Typical enable command
systemd-suspend.service Handles suspend entry systemctl enable systemd-suspend.service
systemd-hibernate.service Handles hibernate systemctl enable systemd-hibernate.service
systemd-sleep.conf Global sleep settings (e.g., SuspendMode=freeze) Edit /etc/systemd/sleep.conf
systemd-rfkill.service Turns off RF devices on suspend systemctl enable systemd-rfkill.service
systemd-power-profiles.service Provides D‑Bus API for powerprofilesctl systemctl enable systemd-power-profiles.service

You can also create custom targets (power-saving.target) that pull in a set of services (e.g., disabling Bluetooth, lowering screen brightness, switching to a low‑power CPU governor) and then systemctl isolate power-saving.target before a long‑run battery test.

10.3 Interaction with user‑space tools

Tool What it controls Typical integration point
TLP Aggressive laptop power management (CPUFreq, SATA, Wi‑Fi, USB autosuspend) Runs as a systemd service; respects kernel runtime‑PM settings. Use tlp-stat -s to verify active profile.
laptop‑mode‑tools Writes /proc/sys/vm/laptop_mode and reduces disk writeback during battery Can be combined with TLP; disable overlapping settings (e.g., TLP_DISABLE_WIFI=1 if you use laptop‑mode’s Wi‑Fi power‑saving).
power‑profiles‑daemon (powerprofilesctl) Exposes “performance”, “balanced”, and “power‑saver” profiles via DBus and UI front‑ends (GNOME, KDE) Calls into the kernel via cpufreq-set and adjusts systemd services. Works nicely with the systemd-power-profiles.service mentioned above.

When you enable more than one of these tools, be mindful of conflict zones (CPU governor, USB autosuspend, PCIe ASPM). The safest approach is to pick a primary manager (e.g., TLP) and disable the overlapping modules in the others (/etc/laptop-mode/conf.d/disable.conf, powerprofilesctl profile overrides, etc.).

11 . FAQ

# Question Short answer
1 Why does my laptop still drain quickly even though powertop shows low wake‑ups? Battery drain can be caused by high static power (e.g., GPU at full clock, Wi‑Fi always on). Check tlp-stat -b or powertop --html for “Device Power Consumption” and look at the GPU P‑state and Wi‑Fi power‑saving mode.
2 Can I completely disable all CPU frequency scaling? Yes, set the governor to performance and disable intel_pstate or acpi-cpufreq via kernel boot parameters (intel_pstate=disable). Note that this will increase power draw.
3 My USB‑C dock wakes the laptop even though autosuspend is on. Many docks present a charging controller that signals activity. Add the device’s vendor/product ID to /etc/udev/rules.d/99-usb-autosuspend.rules with ATTR{autosuspend}="-1" to keep it always on, or explicitly blacklist it in TLP (USB_BLACKLIST="1234:abcd").
4 How do I know if the BIOS/UEFI firmware is the culprit? Look for ACPI errors in dmesg (e.g., “_SB_.PCI0._OSC failed”). Update the firmware, then test with acpi_osi= kernel parameters to hide the OS name from the BIOS.
5 Is it safe to run the system with acpi=off to avoid power‑management bugs? No. Disabling ACPI removes the ability to suspend, manage battery, and control many devices. Use it only for debugging a very early‑boot crash, then revert.

12. References & Further Reading

# Reference Link / Citation
1 Linux Kernel Documentation – Power Management https://www.kernel.org/doc/html/latest/power/index.html
2 Intel® Power Management Guide (covers intel_pstate, ACPI, DPTF) https://www.intel.com/content/www/us/en/architecture-and-technology/intel-power-management-technology.html
3 ACPI Specification Rev 6.5 (official spec for _S0, _S3, etc.) https://uefi.org/specifications
4 TLP – Advanced Power Management for Linux (man page, config examples) https://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html
5 systemd Power Profiles Daemon https://www.freedesktop.org/wiki/Software/systemd/power-profiles/
6 Phoronix Test Suite – Power Benchmarking https://www.phoronix-test-suite.com/
7 “Understanding Linux Power Management” – Red Hat Blog (Oct 2023) https://developers.redhat.com/articles/2023/10/02/understanding-linux-power-management
8 “Dynamic Runtime Power Management for GPUs” – Linux Plumbers Conference 2024 slides https://www.linuxplumbersconf.org/event/2024
9 Arch Wiki – Laptop Mode Tools https://wiki.archlinux.org/title/Laptop_mode
10 Ubuntu Community Help Wiki – Power Management https://help.ubuntu.com/community/PowerManagement

13 Appendix

A. Full example configuration files

/etc/tlp.conf (excerpt)

# TLP 1.6 configuration
# -------------------------------------------------------------------
# CPU scaling governor (on battery)
CPU_SCALING_GOVERNOR_ON_BAT=power-saver
# Minimum/maximum frequencies (kHz)
CPU_MIN_FREQ_ON_BAT=800000
CPU_MAX_FREQ_ON_BAT=1800000

# USB autosuspend
USB_AUTOSUSPEND=1
USB_BLACKLIST_BTUSB=1   # disable autosuspend for Bluetooth dongle

# Wi‑Fi power saving
WIFI_PWR_ON_BAT=5       # 5 = enable power save

# PCI Express Active State Power Management
PCI_EXPRESS_ASPM_ON_BAT=ondemand

# Runtime PM for SATA
SATA_LINKPWR_ON_BAT=min_power

/etc/systemd/sleep.conf.d/10-custom.conf

[Sleep]
SuspendMode=freeze
HibernateMode=shutdown

/etc/udev/rules.d/99-usb-autosuspend.rules

# Keep external docking stations always powered (vendor:product)
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="abcd", ATTR{autosuspend}="-1"

B. Glossary of terms

Term Definition
Autosuspend Runtime‑PM feature where a device is automatically placed into a low‑power state after a configurable idle period.
P‑state Processor performance state; a combination of frequency and voltage. Lower numbers = higher performance.
C‑state CPU idle state; deeper C‑states consume less power but have higher exit latency.
ACPI Advanced Configuration and Power Interface – firmware‑level spec that the kernel uses to enumerate power states and device dependencies.
DPM Dynamic Power Management – the kernel’s ability to change device power states on‑the‑fly based on utilization.
systemd target A collection of units (services, sockets, etc.) that can be started together; analogous to a runlevel.
powertop “wake‑ups” Number of times a device interrupts the CPU from an idle state per second.
intel_pstate Intel’s native CPU frequency scaling driver; replaces the generic acpi-cpufreq on many Intel CPUs.
tlp-stat TLP utility that prints the current power‑management status, useful for debugging.
powerprofilesctl CLI front‑end for systemd-power-profiles-daemon that switches between “performance”, “balanced”, and “power‑saver”.

Read next

Testing OpenGL Performance on CPU nouveau driver

While waiting for the right NVLink bridge, I decided to see how my dual RTX 2080 Ti setup performs without them—by turning the GPUs off entirely. The result? A deep dive into OpenGL on CPU using the humble Nouveau driver, where even spinning gears tell a story about patience and pixels.