DPMS enable does not retrain the DP link — panel stays black while dpmsStatus: 1
Summary
On an Intel Arrow Lake-S iGPU driving a Samsung Odyssey G91SD at its preferred mode
5120x1440@143.99, a DPMS off → on cycle leaves the panel permanently black. Hyprland reports
the output as fully healthy the whole time — dpmsStatus: 1, disabled: false, correct mode,
no config errors — but no frames reach the panel. Only a real mode change recovers it.
Re-applying the same mode is a no-op and does not help.
This left the machine with an unusable display for ~16 hours. It is recoverable only over SSH,
or presumably by a reboot.
Environment
|
|
| Hyprland |
0.56.2 (efb5099, tag v0.56.2) |
| aquamarine |
0.15.0-2 |
| Kernel |
7.2.3-arch1-3 (Arch) |
| Mesa |
1:26.2.2-1 |
| GPU (driving display) |
Intel Arrow Lake-S [8086:7d67] — card0 |
| Second GPU (idle) |
NVIDIA RTX A1000 [10de:25b0] |
| Monitor |
Samsung Odyssey G91SD, DP-5, preferred 5120x1440@143.99 (needs DSC) |
| Shell |
quickshell 0.3.1-1, omarchy-dev 4.0.0.r2071 |
Reproduction
- Be at the preferred mode
5120x1440@143.99 on DP-5.
hyprctl dispatch 'hl.dsp.dpms({ action = "disable" })' — panel goes off, as expected.
(In practice this is what Omarchy's lock does automatically 5s after locking.)
hyprctl dispatch 'hl.dsp.dpms({ action = "enable" })' — returns ok.
- Panel stays black.
hyprctl monitors reports dpmsStatus: 1, disabled: false, mode
5120x1440@143.98700, currentFormat: XRGB8888. No config errors.
Physical input (keyboard, mouse) does not help — it is correctly delivered and does trigger
another dpms enable, which again reports success while the panel stays dark.
Evidence that no frames are produced
grim is a clean discriminator, since it waits on a frame:
# while wedged
$ timeout 15 grim -o DP-5 -s 0.15 /tmp/sc.png
# → times out, file is never created (0 bytes)
# after recovery
$ timeout 15 grim -o DP-5 -s 0.15 /tmp/sc.png; echo rc=$?
rc=0 # 111307-byte PNG
Hyprland's main thread sits in do_epoll_wait at 0.0% CPU while wedged — it is not spinning or
deadlocked, it simply never produces a frame. hyprland.log stops mid-word at the point of the
last connector rescan and is not appended to again.
Recovery — mode change is required
Re-applying the same mode does nothing (hyprctl reload at the preferred mode is a no-op —
no modeset occurs, panel stays black). Changing to any other mode lights the panel instantly:
-- ~/.config/hypr/monitors.lua
hl.monitor({ output = "DP-5", mode = "1920x1080@60", position = "0x0", scale = 1 })
hyprctl reload → panel lights up immediately.
Crucially, switching back to 5120x1440@143.99 then works fine and keeps working. So this is
not a bandwidth or DSC-capability limit on the 144Hz mode — that mode is perfectly usable. It is
a link left un-retrained by the DPMS enable path.
What this is not
- Not a bandwidth/DSC ceiling.
5120x1440@143.99 renders fine once the link is retrained,
and has run for days.
- Not stale compositor state. Hyprland's reported state was correct and self-consistent throughout.
- Not a DDC/brightness issue.
ddcutil reports "No displays implementing DDC/CI found" on
this monitor, so omarchy-brightness-display has no brightness channel and maps on/off
directly to DPMS — but that only means DPMS is the actuator, not the cause.
- Not visible in sysfs.
/sys/class/drm/card0-DP-5/{enabled,dpms} read disabled / Off
even on a healthy, actively-rendering output, because atomic KMS never writes those legacy
attributes. They are not a useful signal here (they cost me significant debugging time).
Suggested fix
On dpms enable, force a full modeset / link retrain for the connector rather than assuming the
previous mode is still valid. A DPMS-off period long enough for the sink to drop the link appears
to leave the enable path committing against a link that was never retrained.
Why this is user-visible on Omarchy
Omarchy's lock screen blanks via DPMS ~5s after locking (idleBlankTimer { interval: 5000 } in
plugins/lock/Service.qml, then omarchy-brightness-display off). That is by design. But on
affected hardware it means: lock the screen, wait 5 seconds, and the display cannot be brought
back by any input — the user is locked out of their own display with no on-screen recovery path.
A defensive workaround on the Omarchy side would be to force a mode change (or an
output disable/enable) as part of omarchy-system-wake when a dpms enable fails to produce a
frame, rather than trusting dpmsStatus.
Note on hyprctl ergonomics (0.56, separate & minor)
hyprctl dispatch dpms on fails with a lua parse error:
[string "return hl.dispatch(dpms on)"]:1: ')' expected near 'on'. The correct form is
hyprctl dispatch 'hl.dsp.dpms({ action = "enable" })'.
hyprctl dispatch 'hl.dsp.dpms("on")' returns ok but silently ignores the argument and
toggles, which makes DPMS state bounce confusingly while debugging. Rejecting an
unrecognised argument would be friendlier than toggling.
hyprctl keyword monitor ... returns keyword can't work with non-legacy parsers. Use eval.,
but hl.monitor({...}) via hyprctl eval returns ok while not applying at runtime.
There appears to be no supported way to change a monitor mode at runtime without editing the
config file and reloading.
DPMS enable does not retrain the DP link — panel stays black while
dpmsStatus: 1Summary
On an Intel Arrow Lake-S iGPU driving a Samsung Odyssey G91SD at its preferred mode
5120x1440@143.99, a DPMS off → on cycle leaves the panel permanently black. Hyprland reportsthe output as fully healthy the whole time —
dpmsStatus: 1,disabled: false, correct mode,no config errors — but no frames reach the panel. Only a real mode change recovers it.
Re-applying the same mode is a no-op and does not help.
This left the machine with an unusable display for ~16 hours. It is recoverable only over SSH,
or presumably by a reboot.
Environment
efb5099, tag v0.56.2)[8086:7d67]—card0[10de:25b0]5120x1440@143.99(needs DSC)Reproduction
5120x1440@143.99on DP-5.hyprctl dispatch 'hl.dsp.dpms({ action = "disable" })'— panel goes off, as expected.(In practice this is what Omarchy's lock does automatically 5s after locking.)
hyprctl dispatch 'hl.dsp.dpms({ action = "enable" })'— returnsok.hyprctl monitorsreportsdpmsStatus: 1,disabled: false, mode5120x1440@143.98700,currentFormat: XRGB8888. No config errors.Physical input (keyboard, mouse) does not help — it is correctly delivered and does trigger
another
dpms enable, which again reports success while the panel stays dark.Evidence that no frames are produced
grimis a clean discriminator, since it waits on a frame:Hyprland's main thread sits in
do_epoll_waitat 0.0% CPU while wedged — it is not spinning ordeadlocked, it simply never produces a frame.
hyprland.logstops mid-word at the point of thelast connector rescan and is not appended to again.
Recovery — mode change is required
Re-applying the same mode does nothing (
hyprctl reloadat the preferred mode is a no-op —no modeset occurs, panel stays black). Changing to any other mode lights the panel instantly:
hyprctl reload→ panel lights up immediately.Crucially, switching back to
5120x1440@143.99then works fine and keeps working. So this isnot a bandwidth or DSC-capability limit on the 144Hz mode — that mode is perfectly usable. It is
a link left un-retrained by the DPMS enable path.
What this is not
5120x1440@143.99renders fine once the link is retrained,and has run for days.
ddcutilreports "No displays implementing DDC/CI found" onthis monitor, so
omarchy-brightness-displayhas no brightness channel and mapson/offdirectly to DPMS — but that only means DPMS is the actuator, not the cause.
/sys/class/drm/card0-DP-5/{enabled,dpms}readdisabled/Offeven on a healthy, actively-rendering output, because atomic KMS never writes those legacy
attributes. They are not a useful signal here (they cost me significant debugging time).
Suggested fix
On
dpms enable, force a full modeset / link retrain for the connector rather than assuming theprevious mode is still valid. A DPMS-off period long enough for the sink to drop the link appears
to leave the enable path committing against a link that was never retrained.
Why this is user-visible on Omarchy
Omarchy's lock screen blanks via DPMS ~5s after locking (
idleBlankTimer { interval: 5000 }inplugins/lock/Service.qml, thenomarchy-brightness-display off). That is by design. But onaffected hardware it means: lock the screen, wait 5 seconds, and the display cannot be brought
back by any input — the user is locked out of their own display with no on-screen recovery path.
A defensive workaround on the Omarchy side would be to force a mode change (or an
output disable/enable) as part of
omarchy-system-wakewhen adpms enablefails to produce aframe, rather than trusting
dpmsStatus.Note on
hyprctlergonomics (0.56, separate & minor)hyprctl dispatch dpms onfails with a lua parse error:[string "return hl.dispatch(dpms on)"]:1: ')' expected near 'on'. The correct form ishyprctl dispatch 'hl.dsp.dpms({ action = "enable" })'.hyprctl dispatch 'hl.dsp.dpms("on")'returnsokbut silently ignores the argument andtoggles, which makes DPMS state bounce confusingly while debugging. Rejecting an
unrecognised argument would be friendlier than toggling.
hyprctl keyword monitor ...returnskeyword can't work with non-legacy parsers. Use eval.,but
hl.monitor({...})viahyprctl evalreturnsokwhile not applying at runtime.There appears to be no supported way to change a monitor mode at runtime without editing the
config file and reloading.