NVIDIA Open Driver Power Management#
This article covers power management behavior for the nvidia-open kernel driver on Bluefin laptop systems — specifically suspend/resume reliability, battery drain patterns, SELinux interactions, D3/RTD3 state handling, and the udev rules that control NVIDIA sub-device power. It does not cover driver packaging, Optimus display routing, or container GPU passthrough.
All Bluefin NVIDIA variants use nvidia-open exclusively; the closed driver was deprecated in October 2025.
Default Power Management Configuration#
Bluefin ships no custom modprobe.d configuration for NVIDIA power management parameters. Parameters like NVreg_DynamicPowerManagement and NVreg_EnableGpuFirmware are left at NVIDIA driver defaults — they are not set in ublue-os/bluefin, ublue-os/main, or ublue-os/akmods.
The one active power-related intervention is a udev rules file in ublue-os-nvidia-addons that removes three NVIDIA PCI sub-devices on add:
| Rule | PCI Class | Effect |
|---|---|---|
| Remove NVIDIA USB xHCI Host Controller | 0x0c0330 | Reduces USB subsystem power draw |
| Remove NVIDIA USB Type-C UCSI | 0x0c8000 | Eliminates idle UCSI overhead |
| Remove NVIDIA Audio | 0x040300 | Drops GPU audio device power |
These removals improve idle power consumption on systems where the GPU audio and USB endpoints are not needed. They do not affect rendering or compute performance.
UseKernelSuspendNotifiers#
The NVIDIA 595.45.04 driver introduced UseKernelSuspendNotifiers=1 in the negativo17 packaging, which switches the suspend mechanism from legacy nvidia-sleep.sh scripts to kernel notifier callbacks. This setting was the upstream trigger for the March 2026 regression.
If you need to apply custom NVreg parameters (e.g.,
NVreg_DynamicPowerManagement=0x02for fine-grained RTD3 power management), create a file in/etc/modprobe.d/— changes there persist across OS updates. To bake them into your own image, add the file to yourContainerfile.
March 2026 SELinux Suspend Regression#
Build 43.20260312.1 introduced a critical regression that caused complete battery drain on all NVIDIA laptop configurations.
Root cause: SELinux denied systemd-sleep the CAP_PERFMON capability (capability 38) in the systemd_sleep_t context. The NVIDIA 595.45.04 driver's new UseKernelSuspendNotifiers=1 mode requires this capability to complete GPU shutdown hooks. Without it, the suspend sequence aborts mid-flight.
Failure cascade:
systemd-sleepdeniedperfmon→ emitsFailed to put system to sleep. System resumed again: Operation not permitted- GPU firmware crashes mid-suspend: Xid 120 / GSP task exception (
kern_bus_vbar2.c:346) - GPU enters a corrupted state —
nvidia-smi,nvtop,btophang indefinitely nvidia-powerdlogsERROR! Failed to get AC Line status(RM Error Code 98) every second- Lid appears closed, system appears suspended — GPU and fans remain fully active
- Complete battery drain within hours
SELinux audit entry:
AVC avc: denied { perfmon } for pid=50444 comm="systemd-sleep" capability=38
scontext=system_u:system_r:systemd_sleep_t:s0 tclass=capability2 permissive=0
Affected versions:
| Version | Status |
|---|---|
43.20260303 | ✅ Last known good |
43.20260312.1 | ❌ Regression introduced |
43.20260317.1 (latest channel) | ✅ Fixed |
43.20260324 (stable channel) | ✅ Fixed |
The upstream fix was a revert of UseKernelSuspendNotifiers — not an SELinux policy patch. The SELinux policy changes are tracked at negativo17/nvidia-driver#196 and require:
allow systemd_sleep_t self:capability2 perfmon;
allow systemd_sleep_t tmp_t:file { open write };
GPU State Corruption After Failed Suspend#
Once the NVIDIA GPU enters a corrupted state after an aborted suspend, there is no software recovery path — a full system reboot is required to perform a hardware-level GPU reset.
Signs of GPU state corruption:
nvidia-smihangs indefinitely (does not return)nvtopandbtopfreeze on GPU metricsnvidia-powerdlogsERROR! Failed to get AC Line statusrepeatedly- HDMI-connected external displays remain dark
- Kernel logs show
NVRM: _issueRpcLarge: rpcSendMessage failederrors
On Optimus systems, HDMI output (which is physically wired to the dGPU) will also be unavailable until after reboot.
Other Battery Drain Patterns#
Framework 13 — Spurious Wake Events#
Framework 13 NVIDIA Optimus users have reported spurious wake events causing severe drain (~90% → 10% in a few hours in a bag). The workaround is to disable the lid and trackpad as wakeup sources:
sudo tee /etc/systemd/system/lid-wakeup-disable.service << 'EOF'
[Unit]
Description=Disable lid wakeup
After=sysinit.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo "disabled" > /sys/bus/acpi/devices/PNP0C0D:00/power/wakeup'
ExecStart=/bin/sh -c 'echo "disabled" > /sys/bus/i2c/devices/i2c-PIXA3854:00/power/wakeup'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable --now lid-wakeup-disable.service
This is safe because it leaves the power button as the only wakeup source.
Framework 16 — s2idle Drain#
Framework 16 AMD models are limited to s2idle (suspend-to-idle), not S3 deep sleep — a firmware constraint. NVIDIA dGPU configurations compound idle drain on these systems.
| Metric | Value |
|---|---|
| Battery drain in s2idle | ~1.6%/hour (~20% overnight) |
| Available sleep state | s2idle only |
| Kernel improvement expected | 6.19+ / 7.0 |
Verify your available sleep states with: cat /sys/power/mem_sleep
Workarounds & Configuration#
Update or Roll Back#
The fastest fix for any suspend regression is to update to current stable, or roll back to the last known good deployment:
# Roll back to previous deployment
sudo ostree admin set-default 1
# Or use the interactive helper
ujust rebase-helper
Custom SELinux Policy (Temporary)#
For systems stuck on an affected build without an update path:
ausearch -c 'systemd-sleep' --raw | audit2allow -M my-systemdsleep
semodule -X 300 -i my-systemdsleep.pp
Important:
semodulepolicies are not guaranteed to survive OS image updates on bootc-managed systems. For a permanent fix, embed the policy module in your own image definition (e.g., via a customContainerfile), or wait for the policy fix to land upstream.
Custom NVreg Parameters#
Bluefin images do not set NVreg_DynamicPowerManagement or NVreg_EnableGpuFirmware. To apply them yourself:
# Example: enable fine-grained RTD3 power management
echo "options nvidia NVreg_DynamicPowerManagement=0x02" | \
sudo tee /etc/modprobe.d/nvidia-pm.conf
Files in /etc/modprobe.d/ persist across OS updates on bootc systems. Rebuild your initramfs if needed: sudo dracut --force.
Diagnostics#
# Check which sleep states the kernel offers
cat /sys/power/mem_sleep
# Watch suspend/resume transitions live
journalctl -f | grep -E 'suspend|resume|PM:|systemd-sleep'
# Look for SELinux denials (key for diagnosing suspend failures)
sudo ausearch -m avc -ts recent | grep -i sleep
# Check current NVIDIA driver version
nvidia-smi
# Verify the GPU is not in a hung state
timeout 5 nvidia-smi && echo "GPU OK" || echo "GPU HUNG — reboot required"
# Check current image version and rollback availability
bootc status
Quick Symptom Reference#
| Symptom | Likely Cause | Action |
|---|---|---|
| Complete battery drain during "suspend" | SELinux perfmon regression (build 43.20260312.1) | Update to 43.20260324+ or roll back |
nvidia-smi hangs indefinitely | GPU state corruption from aborted suspend | Reboot (hard reset required) |
| Fans spin while lid is closed | GPU never powered down during failed suspend | Same as above |
| Spurious wake draining battery | Framework 13 lid/trackpad wakeup | Disable wakeup sources (see above) |
| ~20% drain overnight with no activity | Framework 16 s2idle firmware constraint | Expected; kernel improvements in 6.19+ |
Key Source Files#
| File | Repo | Relevance |
|---|---|---|
60-nvidia-extra-devices-pm.rules | ublue-os/akmods | Removes NVIDIA USB/audio sub-devices to reduce idle power |
build_files/nvidia-install.sh | ublue-os/main | Driver install; no NVreg parameters set |
build_files/base/03-install-kernel-akmods.sh | ublue-os/bluefin | Kernel args (nvidia-drm.modeset=1, nouveau blacklist) |
| negativo17/nvidia-driver#196 | upstream | UseKernelSuspendNotifiers regression and SELinux policy fix |
| Bluefin issue #4308 | ublue-os/bluefin | Full regression thread with logs, workarounds, and resolution |