-
-
Notifications
You must be signed in to change notification settings - Fork 70
Description
Description
After a udev-triggered hotplug event on an HDMI-connected LG TV, the HDMI output becomes permanently stuck. Aquamarine detects the disconnect and reconnect correctly, re-enumerates modes, allocates new swapchain buffers, and attempts to modeset — but every atomic commit fails with Cannot commit when a page-flip is awaiting. The output never recovers. Only a full compositor restart fixes it.
The hotplug is not physical — no cable was touched. The NVIDIA driver emits a udev change event on /dev/dri/card0, likely triggered by the TV toggling the HPD pin internally. This worked fine on the previous driver/compositor combination (NVIDIA 580.119.02 + Hyprland 0.52.2 + aquamarine 0.9.4).
Sequence of events from logs
- System is running normally, HDMI-A-1 modesetting at 2560x1440@120Hz
udev: new udev change event for card0— no physical interaction- Aquamarine scans connectors, HDMI-A-1 reports
connection state: 2(disconnected) drm: Connector HDMI-A-1 disconnected/drm: Disabling output HDMI-A-1— CRTC 61 removed- Second udev change event — still disconnected, CRTC removed again
- Third udev change event — connector reports
connection state: 1(connected) - Aquamarine reconnects HDMI-A-1, assigns CRTC 61, dumps modes, detects VRR/HDR capabilities
- Swapchain cleared, new buffers allocated:
XR30allocation fails:GBM: Failed to allocate a GBM buffer: format XR30 isn't supported by primary backend- Falls back to
XB30successfully
drm: Modesetting HDMI-A-1 with 2560x1440@120.00Hzdrm: Cannot commit when a page-flip is awaiting— every subsequent commit fails with this error- Output is permanently stuck.
hyprctl keyword monitorchanges, DPMS toggles, disable/re-enable all fail because no atomic commit can go through.
Note: The XR30 allocation failure also occurs for the DP-2 (7680x2160) output, but DP-2 recovers fine by falling back to XB30. The issue is specifically that the HDMI atomic commit pipeline gets wedged after the hotplug reconnect.
Key observations
- The first hotplug cycle early in the session (at boot) shows the same disconnect/reconnect pattern and recovers successfully. The second cycle later in the session does not recover — suggesting some state isn't being properly reset between hotplug events.
hyprctl keyword monitor "HDMI-A-1,disable"followed by re-enable does not clear the stuck state.- DPMS off/on does not clear the stuck state.
- The DP-2 output on the same GPU continues working fine throughout.
System info
Hyprland 0.53.3 (commit dd220efe7b1e)
Aquamarine 0.10.0
NVIDIA GeForce RTX 5090 (GB202)
NVIDIA UNIX Open Kernel Module 590.48.01
Manjaro Linux, kernel 6.12.68-1-MANJARO
Monitors:
- DP-2: Samsung Odyssey G95NC 7680x2160@240Hz (works fine)
- HDMI-A-1: LG TV 2560x1440@120Hz (broken after hotplug)
Previous working configuration
- NVIDIA 580.119.02
- Hyprland 0.52.2
- Aquamarine 0.9.4
All upgraded simultaneously on Jan 8, 2026, so the regression could be in aquamarine 0.10.0, Hyprland 0.53, or an interaction with the NVIDIA 590 driver. The aquamarine 0.10.0 change "Ensure disconnect called for removed connectors" (#215) modified connector disconnect handling and may be relevant.
Relevant log excerpt
udev: new udev change event for card0
drm: Got a hotplug event for /dev/dri/card0
drm: Connector 127 connection state: 2
drm: Connector HDMI-A-1 disconnected
drm: Disabling output HDMI-A-1
drm: Connector HDMI-A-1 is not connected, removing old crtc 61
...
[second hotplug — reconnects]
drm: Connector HDMI-A-1 connected
drm: Connecting connector HDMI-A-1, CRTC ID 61
drm: Modesetting HDMI-A-1 with 2560x1440@120.00Hz
ERR: GBM: Failed to allocate a GBM buffer: format XR30 isn't supported by primary backend
[falls back to XB30 — OK]
drm: Modesetting HDMI-A-1 with 2560x1440@120.00Hz
ERR: drm: Cannot commit when a page-flip is awaiting
drm: Modesetting HDMI-A-1 with 2560x1440@120.00Hz
ERR: drm: Cannot commit when a page-flip is awaiting
drm: Modesetting HDMI-A-1 with 2560x1440@120.00Hz
ERR: drm: Cannot commit when a page-flip is awaiting
[repeats indefinitely — output never recovers]