- Published on
Fixing Poor Battery Life on Linux Laptops with Hybrid Graphics: The RTD3 Solution
- Authors
- Name
- Abdul Rauf
- @armujahid

If you've recently installed Linux on a laptop with hybrid graphics—particularly one with Intel integrated graphics paired with an Nvidia GPU—you might have noticed dramatically shorter battery life compared to Windows. The culprit is often your discrete Nvidia GPU failing to enter its power-saving mode called RTD3 (Runtime D3).
The Problem with Default Configurations
Linux distributions don't configure hybrid graphics systems with necessary power-saving features by default. This means your Nvidia GPU might be consuming power continuously, even when you're only using the Intel integrated graphics for basic tasks like web browsing or document editing.
In hybrid systems with Intel/Nvidia configurations, the Nvidia GPU should automatically enter D3cold (the deepest power-saving state) when not in use. However, many users find their GPU stuck in the D0 state, actively consuming battery power.
Checking Your GPU's Power State
Before applying any fixes, you should first check if your hybrid GPU is entering power-saving mode. Use these commands to verify your current power state:
# List PCI devices to find your Nvidia GPU device ID
lspci | grep -i nvidia
# Check if your GPU supports RTD3 (replace device ID with yours)
cat /proc/driver/nvidia/gpus/0000:01:00.0/power
# Check current power state
cat /sys/class/drm/card*/device/power_state
# Check runtime status
cat /sys/bus/pci/devices/0000:01:00.0/power/runtime_status
If you see "Runtime D3 status: Not supported" or your power state shows "D0" instead of "D3cold," your GPU isn't entering power-saving mode.
The Solution: Manual RTD3 Configuration
Here's how to properly configure RTD3 power management (Similar steps apply for AMD GPUs, but this guide focuses on Nvidia):
Step 0: Prerequisites
Ensure you're using the proprietary Nvidia drivers (not Nouveau or open-source alternatives).
Step 1: Configure Nvidia Power Management
Create /etc/modprobe.d/nvidia-pm.conf
with the following content:
# For me, below two options were already coming from /usr/lib/modprobe.d/nvidia-* files
# options nvidia NVreg_PreserveVideoMemoryAllocations=1
# options nvidia NVreg_TemporaryFilePath=/var/tmp
options nvidia-drm modeset=1
options nvidia "NVreg_DynamicPowerManagement=0x02" # Use 0x03 for Ampere and later GPUs
options nvidia NVreg_UsePageAttributeTable=1 NVreg_InitializeSystemMemoryAllocations=0
options nvidia NVreg_EnableGpuFirmware=0
options nvidia NVreg_EnableS0ixPowerManagement=1
options nvidia NVreg_DynamicPowerManagementVideoMemoryThreshold=10
Note: For Turing GPUs (like MX450), use NVreg_DynamicPowerManagement=0x02
. Ampere and later GPUs can use 0x03
.
Step 2: Check and modify Udev Rules
Inspect /etc/udev/rules.d/80-nvidia-pm.rules
(Create it if it doesn't exist) and ensure that it contains the following rules:
# Remove NVIDIA USB xHCI Host Controller devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{remove}="1"
# Remove NVIDIA USB Type-C UCSI devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{remove}="1"
# Remove NVIDIA Audio devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{remove}="1"
# Enable runtime PM for NVIDIA VGA/3D controller devices on adding device
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto"
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="auto"
# Enable runtime PM for NVIDIA VGA/3D controller devices on driver bind
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto"
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="auto"
# Disable runtime PM for NVIDIA VGA/3D controller devices on driver unbind
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="on"
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="on"
Step 3: Update Initramfs and Reboot
For EndeavourOS with dracut:
sudo dracut-rebuild
For Arch Linux:
sudo mkinitcpio -P
For other distributions, use the appropriate command to rebuild your initramfs
Step 4: Enable Nvidia Persistence Daemon
systemctl status nvidia-persistenced
sudo systemctl enable --now nvidia-persistenced
Reboot and Verify
Check if RTD3 is working:
# Should show "Runtime D3 status: Enabled (fine-grained)"
cat /proc/driver/nvidia/gpus/0000:01:00.0/power
# Should show "suspended" when GPU is idle
cat /sys/bus/pci/devices/0000:01:00.0/power/runtime_status
# Should show "D3cold" for the Nvidia card when idle
cat /sys/class/drm/card*/device/power_state
Important Notes and Additional Recommendations
- Avoid continuous use of monitoring tools that query GPU status frequently, such as
nvidia-smi
ornvtop
, since these can prevent the Nvidia GPU from entering its deepest power-saving state (D3cold), leading to unnecessary power use. - Use power optimization tools like Powertop and auto-cpufreq alongside this configuration. Powertop analyzes power consumption and suggests tunings to reduce power drain across your system, while auto-cpufreq automatically adjusts CPU frequency and power profiles based on usage and battery health, helping extend battery life without manual intervention.
- This solution has been tested on EndeavourOS but should apply with minor tweaks to Arch and other Linux distributions that support Nvidia proprietary drivers and RTD3.
By combining RTD3 configuration with Powertop and auto-cpufreq, you can significantly improve battery life on hybrid Intel/Nvidia laptops running Linux.
For an in-depth discussion and step-by-step instructions used for an Nvidia MX450 on EndeavourOS, check out the full post: Nvidia/Intel Hybrid Graphics poor battery life: Nvidia not entering D3 (RTD3)
With these configurations, my years old thinkpad is showing 6+ hours battery life although realistically it's around 4+ hours with normal usage, which is a significant improvement over the previous 2-3 hours.
