Skip to content

Instantly share code, notes, and snippets.

@alicercedigital
Created September 25, 2026 16:27
Show Gist options
  • Select an option

  • Save alicercedigital/3f4d99f7a6636b6e3de9a5d27a344d6c to your computer and use it in GitHub Desktop.

Select an option

Save alicercedigital/3f4d99f7a6636b6e3de9a5d27a344d6c to your computer and use it in GitHub Desktop.
NVIDIA on Linux: monitor stays black after suspend until you replug the cable (workaround)

NVIDIA on Linux: monitor stays black after suspend until you replug the cable

The symptom

  • After resume, and sometimes after the monitor's own standby, the monitor stays black or shows "No signal".
  • The system is alive. You can type your password blind or log in over SSH.
  • The monitor is still listed as connected and enabled (hyprctl monitors, kscreen-doctor -o, /sys/class/drm/*/status).
  • Replugging the cable, or switching to a TTY and back, brings the picture back.
  • Windows on the same PC and monitor wakes up fine.

Check that it is this bug

After a black resume, the kernel log has this line. The GPU ID changes from machine to machine.

$ journalctl -b -k | grep "Flip event timeout on head"
[nvidia-drm] [GPU ID 0x00000500] Flip event timeout on head 0

What goes wrong

After resume the driver's display head is stuck. DRM reports the output as on, but no signal reaches the monitor. I read the monitor's own HDMI status register over I2C (SCDC 0x40), and it reported no clock for as long as the screen stayed black.

A mode change to another refresh rate does not bring it back. Turning the output off and on again does. The "off" waits about 3 seconds on the flip timeout above, then the head restarts and the monitor picks up the signal within a second. Replugging the cable and switching VTs work for the same reason, because both turn the output off and on.

The workaround

Turn the output off and on after every resume.

Hyprland

Tested. Add this to hypridle.conf:

general {
    after_sleep_cmd = hyprctl dispatch dpms off && sleep 1 && hyprctl dispatch dpms on
}

With the Lua config, the two dispatches are hyprctl dispatch 'hl.dsp.dpms({ action = "disable" })' and the same with "enable".

Other desktops

Same idea, but I have not tested these off/on commands. Run this script from your session's autostart and keep the off/on line for your desktop. The loop itself is tested: it reacts to the resume signal from logind and ignores the one sent before sleep.

#!/usr/bin/env bash
# Turns the outputs off and on after every resume.
dbus-monitor --system "type='signal',interface='org.freedesktop.login1.Manager',member='PrepareForSleep'" |
while read -r line; do
  [[ $line == *"boolean false"* ]] || continue
  sleep 1
  kscreen-doctor --dpms off; sleep 1; kscreen-doctor --dpms on   # KDE Plasma 6
done
  • GNOME: busctl --user set-property org.gnome.Mutter.DisplayConfig /org/gnome/Mutter/DisplayConfig org.gnome.Mutter.DisplayConfig PowerSaveMode i 3, then the same command with i 0.
  • sway: swaymsg 'output * power off', then swaymsg 'output * power on'.
  • X11: xset dpms force off, then xset dpms force on.

By hand

Press Ctrl+Alt+F3, then go back to your session's VT with Ctrl+Alt+F1 or F2.

Tested on

RTX 3060, nvidia-open 615.71.09, kernel 7.2, Hyprland 0.56, ASUS VG328 over HDMI, S3 deep sleep, at 60, 100 and 120 Hz. The picture comes back about 4 to 5 seconds after resume, and nobody touches the cable.

If this does not help, you probably have a different bug. Two common ones are a monitor that disappears from the output list and a system that freezes on resume.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment