Skip to content

eDP panel wedges (backlight on, no scanout) after idle-driven DPMS off/on cycle — probabilistic per cycle, regression in 0.11.0 #304

@spheenik

Description

@spheenik

Summary

After upgrading aquamarine 0.10.0 → 0.11.0, an idle-driven DPMS off/on cycle (e.g. hypridle running hyprctl dispatch "dpms off" on idle and dpms on on resume) intermittently leaves the eDP panel with backlight powered on but no scanout. Hyprland reports dpmsStatus: 1, the dispatch returns ok, but aquamarine emits no further commits. Once wedged, only restarting Hyprland recovershyprctl reload, additional DPMS cycles, and explicit hl.monitor({disabled=true}) then disabled=false all return ok but produce zero new aquamarine output and do not recover the panel.

The bug is probabilistic — about 15–20% per cycle. Manual back-to-back hyprctl dispatch dpms off/on cycles (without going through the wayland idle protocol path) do not reproduce it.

Possibly related to #293 (same backlight-on/no-scanout symptom, same aquamarine 0.11.0 regression, same restart-only recovery), but the trigger is different (idle-driven DPMS, not explicit monitor disable/re-enable).

System

  • aquamarine: 0.11.0-2 (broken). 0.10.0-4 was fine (cannot use the package directly with Hyprland 0.55 due to soname bump 9 → 10)
  • Hyprland: 0.55.0-4
  • Kernel: 7.0.5.arch1-1
  • Distro: Arch Linux
  • GPU: AMD Radeon 780M iGPU (amdgpu)
  • Panel: eDP-1, Thermotrex TL140ADXP22-0, 2880x1800@60Hz, scale 2.0
  • Idle daemon: hypridle (latest)
  • Reproduced on a second machine: AMD Ryzen 9 9950X desktop (different amdgpu, no VRR, no eDP) — same wedge symptom following the same idle-driven DPMS pattern

Note on kernel upgrade: the kernel was upgraded in the same window as aquamarine (linux 6.19.10 → 7.0.5 on the laptop, 6.19.12 → 7.0.5 on the desktop). I have not isolated kernel from aquamarine as the regression source — both changed at the same time, and downgrading aquamarine alone is blocked by the soname bump (0.10.0 provides libaquamarine.so=9, Hyprland 0.55 requires =10). The match with #293's symptom signature (which was reproduced on multiple kernels including 7.0.3 and 6.18.26 LTS) makes aquamarine the prime suspect, but I cannot rule out the kernel.

Steps to reproduce

  1. Single eDP output (no external monitors, no VRR — VRR is not required).
  2. Run hypridle with this listener (any short timeout works; 5s for fast iteration):
    listener {
        timeout = 5
        on-timeout = hyprctl dispatch "dpms off"
        on-resume  = hyprctl dispatch "dpms on"
    }
    
  3. Stop touching input devices for timeout seconds → hypridle fires dpms off, panel goes off (correctly).
  4. Wiggle mouse → hypridle fires dpms on. Most cycles work normally; ~1 in 5 leaves the panel wedged: backlight on, no image, hyprctl monitors reports dpmsStatus: 1, dispatch returned ok.
  5. Once wedged, no further activity in hyprland.log from aquamarine. Only hyprctl dispatch exit (Hyprland restart) recovers.

In four runs (timeouts 15s, 15s, 5s, 60s), the wedge appeared at cycles 5, 5, 9, 3 respectively — average ~5.5, consistent with ~15–20% per-cycle probability. The off-time per cycle and Hyprland uptime do not predict the wedge — only the cumulative number of Idled → dpms off → Resumed → dpms on event pairs does.

Aquamarine log at the wedge

The last lines from hyprland.log immediately before the panel wedges:

DEBUG from aquamarine ]: drm: Disabling output eDP-1
DEBUG from aquamarine ]: drm: Modesetting eDP-1 with 2880x1800@60.00Hz

After this, no further aquamarine entries are written even though subsequent dispatches (including hl.monitor({disabled=true/false}) re-enable, hyprctl reload, additional DPMS cycles, mouse input) all return ok from the IPC. Frame submission to the CRTC stops entirely.

Hypridle cycle log (60s test, wedge on cycle 3)

[01:24:53] idle: dpms off
[01:25:34] cycle 1: dispatching dpms on   (off duration 41s — worked)
[01:26:34] idle: dpms off
[01:27:14] cycle 2: dispatching dpms on   (off duration 39s — worked)
[01:28:15] idle: dpms off
[01:28:40] cycle 3: dispatching dpms on   (off duration 25s — wedged)

What does not recover the wedged state

All return ok from the IPC, all produce zero new aquamarine log lines, none restore scanout:

  • Another dpms offdpms on cycle
  • hyprctl reload
  • hl.monitor({output="eDP-1", disabled=true}) then disabled=false, mode="preferred", position="auto", scale=2
  • VT switch + return

Only hyprctl dispatch exit (full Hyprland restart) recovers.

What does NOT trigger the wedge

  • Manual back-to-back hyprctl dispatch "dpms off" / dpms on calls with 5s gaps — multiple cycles, no wedge in any test
  • A single isolated hypridle-driven cycle (very low probability — happens occasionally per the per-cycle probability)

The wayland idle protocol path (Idled event in compositor before dpms-off) appears necessary for the bug to manifest, suggesting interaction between the compositor's idle state and aquamarine's output re-enable bookkeeping.

Possible relation to #293

Same aquamarine 0.11.0 regression, same backlight-on/no-scanout symptom, same restart-only recovery, same Modesetting … with WIDTHxHEIGHT@RATE log signature with no commits afterwards. Different trigger (idle-DPMS vs explicit monitor disable/re-enable). May or may not share root cause — happy to test patches against either path.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions