- 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.
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
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.
Turn the output off and on after every resume.
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".
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 withi 0. - sway:
swaymsg 'output * power off', thenswaymsg 'output * power on'. - X11:
xset dpms force off, thenxset dpms force on.
Press Ctrl+Alt+F3, then go back to your session's VT with Ctrl+Alt+F1 or F2.
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.