Symptom — the machine resumes, fans spin, disks come back, but the panel
stays dark until you move the mouse or press a key.

Cause — this is not a GPU or hibernate-image problem. On an X11 session with
lightdm + light-locker, XFCE locks the screen on the way into sleep
(xfce4-power-manager/lock-screen-suspend-hibernate = true) and the panel is put
into DPMS “off”. Nothing restores DPMS on resume: X only forces the monitor back
on when it sees an input event. Hence “dark until I touch something”.

Fix — a small systemd unit that runs after resume and forces DPMS back on for
every X server lightdm owns (your session, plus light-locker’s greeter if the
screen was locked).

Applies to: X11 + XFCE + lightdm + light-locker.
Tested on Debian, kernel 7.1.x, AMD Cezanne / amdgpu.

1. Create the script

sudo tee /usr/local/bin/wake-display >/dev/null <<'EOF'
#!/bin/sh
# After resume, X leaves the panel in DPMS "off" until an input event arrives.
# Force it back on for every X server lightdm owns (the session and, if the
# screen was locked, the greeter that light-locker started).
i=0
while [ "$i" -lt 6 ]; do
    for auth in /run/lightdm/root/:*; do
        [ -e "$auth" ] || continue
        d="${auth##*/}"
        DISPLAY="$d" XAUTHORITY="$auth" xset dpms force on 2>/dev/null
        DISPLAY="$d" XAUTHORITY="$auth" xset s reset 2>/dev/null
    done
    i=$((i + 1))
    sleep 1
done
EOF
sudo chmod 755 /usr/local/bin/wake-display

The 6-second retry loop is deliberate: when the screen was locked, light-locker’s
greeter X server (:1) can appear slightly after the resume finishes, so a
single one-shot xset would sometimes fire too early.

2. Create the systemd unit

sudo tee /etc/systemd/system/wake-display.service >/dev/null <<'EOF'
[Unit]
Description=Turn the display back on after resume
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/wake-display

[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
EOF

After= + WantedBy= on the sleep targets is what makes this run on the way
out of sleep: the target is reached when sleep begins, systemd-suspend.service
does the actual sleeping before it, so anything ordered after the target starts
once you are back.

3. Enable it

sudo systemctl daemon-reload
sudo systemctl enable wake-display.service

4. Test
systemctl suspend

Wake the machine with the power button or by opening the lid. The panel should
light up on its own and show the lock screen — no mouse jiggle needed. Repeat
with systemctl hibernate.

5. Check it ran

systemctl status wake-display.service
journalctl -u wake-display.service -b

A clean run shows Deactivated successfully (it is a oneshot, so “inactive
(dead)” after the fact is correct, not an error).


Uninstall

sudo systemctl disable wake-display.service
sudo rm /etc/systemd/system/wake-display.service /usr/local/bin/wake-display
sudo systemctl daemon-reload

Notes

  • Do not put this in /etc/systemd/system-sleep/ instead. Hooks there run inside systemd-suspend.service, so they delay the resume, and anything they
    leave running in the background is killed when that service exits — which
    breaks the retry loop.
  • amdgpu ... *ERROR* dc_dmub_srv_log_diagnostic_data: DMCUB error in the journal around suspend/resume is noise on this hardware, not the cause of the
    dark screen.
  • If you would rather have no lock screen on resume at all, untick Settings → Power Manager → Security → Lock screen when system is going for
    sleep
    . The DPMS-off still happens, so you want this unit either way.
  • On Wayland or another display manager the /run/lightdm/root/:* loop does not apply; the equivalent is a DPMS/wlr-randr poke against the compositor.