Skip to content

USB-C hot-swap from HDMI: every mode rejected while routed to dcpext1, Hyprland aborts #313

Open

Description

@scottjones

Mac and installed build

  • Model / board / SoC: MacBook Pro 14-inch M2 Max (2023) / apple,j414c / apple,t6021
  • Installed Aurora tag: not determinable. Package linux-aurora 7.2.11.aurora12-1 from the omarchy repo is what we know. The repo has no matching release tag.
  • uname -r: 7.2.11-12-1-ARCH
  • Bootloader: m1n1-aurora 1.6.1.aurora22-1, uboot-asahi 2026.07.asahi2-4. asahi,m1n1-stage2-version reads bc79acc4-dirty.
  • Distribution: Omarchy on Arch Linux ARM with the omarchy package repo. omarchy-mac 0.2.3-1 and omarchy-mac-boot 20261027-1 are installed. Audio is Asahi's asahi-audio 4.1-1 and alsa-ucm-conf-asahi 10-1, not aurora-audio.
  • appledrm.hdmi_audio reads Y with no option set, so drm/apple: turn DP/HDMI audio on by default #300's default is active.

Both firmware versions and provisioning

asahi,os-fw-version: 13.5
asahi,system-fw-version: 26.6.2

Provisioning: not relevant.

Reproduction, expected result, and actual result

Display: LG HDR 4K, moved from built-in HDMI to a USB-C adapter on one USB-C port. We didn't record which physical port. All runs used crossbar 70304c000.mux.

Steps: with the monitor on HDMI, unplug HDMI, then plug into USB-C within a few seconds.

Expected: the monitor comes up on USB-C and the session keeps running.

Actual: Hyprland aborted in 2 of 4 runs.

Run (EDT) Sound on Playing HDMI HPD drop to USB-C insertion* Route dcpext0 audio timeout Result
1, 09:26 HDMI output YouTube in Brave 4.1 s dispext1, then dispext0 09:26:28 Hyprland SIGABRT
2, 09:38 MacBook Speakers 5.3 s dispext0 none No crash. Picture after switching the monitor to its USB-C input. First DP entry plays sound over USB-C.
3, 09:43 First DP entry Music in cliamp 2.7 s dispext1, about 14 s later dispext0 09:43:32 No crash. Picture came up.
4, 09:49 First DP entry YouTube in Brave 3.4 s dispext1, then dispext0 09:49:04 Hyprland SIGABRT, pid 1397. Machine stayed up. Relaunched with --safe-mode.

*To the first SMC aceElec line, which we take as the insertion. The crossbar switch follows about 0.9 s later.

Run 1 afterwards: Hyprland restarted itself. The built-in screen went black and we held power (forced shutdown at 09:27:09). No kernel panic was logged. The monitor's dark state in this run may just have been its input, which we didn't change. Hyprland restarts in safe mode, which may explain the black built-in screen, but that isn't proven.

What separates the crash runs: DP-1 cannot follow its CRTC here appears in runs 1 and 4 only, logged by dcpext0 while the route is on dcpext1. It comes from drivers/gpu/drm/apple/dcp-fabric.c, and the print is rate-limited, so its count of 10 per run says nothing. In run 4, Hyprland then tests every mode size from 3840x2160 down to 640x480 on DP-1, all Invalid argument, and the real commit at 640x480 fails too. Run 3 logged neither the kernel line nor any Invalid argument. Run 1's Hyprland log didn't survive the forced shutdown.

Run 4 had two hotplugs on dcpext1. On the first, DP-1 got CRTC 88 and the kernel finished a 3840x2160 modeset. dcpext1 then dropped at 09:49:04.89 and came back at 09:49:05.90. On that second hotplug DP-1 got CRTC 69, and that is when every mode failed.

In both crash runs the route moved to dispext0 under 70 ms after the core dump finished.

Our read: when dcpext0 isn't released yet, the display goes to dispext1, and in the crash runs the kernel rejected every mode. This looks like two problems: the kernel rejection on this handoff, and Hyprland aborting on it. The cause isn't established. Video versus music is two runs against one, too few to conclude anything, and the gap alone doesn't sort the runs.

Last known good: unknown.

Graphics or session details

  • hyprland 0.57.0-2 (v0.57.0, 0aa6745f), aquamarine 0.15.1-1.3, mesa 1:26.2.6-1. Hyprland logs Using: OpenGL ES 3.2 Mesa 26.2.6-arch1.1.
  • Started through start-hyprland under UWSM. Brave is brave-origin-bin 1:1.98.63-1.
  • Crashes: /usr/bin/Hyprland, signal 6 (ABRT), pid 1311 at 09:26:28 and pid 1397 at 09:49:06, 2026-10-31.
  • Neither the Hyprland log nor the crash report shows a 0x0 output or mode. We don't know what size alloc was called with.

Backtrace, same frames in runs 1 and 4:

#4  raise ()
#5  Render::IFramebuffer::alloc(int, int, unsigned int) ()
#6  Monitor::CMonitorResources::initFB(...)
#7  Monitor::CMonitorResources::CMonitorResources(...)
#8  Monitor::CMonitor::resources() ()
#9  Config::Supplementary::CPropRefresher::refreshProp(bool) ()
#10 ?? ()
#11 wl_event_loop_dispatch_idle ()

Relevant error lines

Date, hostname and kernel: trimmed. Repeats collapsed.

# Run 4, kernel
09:48:57.997452 apple-dcp 289c00000.dcp: DP2HDMI HPD irq, connected:0
09:49:02.312039 apple-display-crossbar 70304c000.mux: Switched dpphy to dispext1,0
09:49:04.071518 apple-dcp 289c00000.dcp: AFK[ep:29]: DCPAVAudioInterface (chan:31) command type 0xc0 tag 0x2d00 timed out after 1000 ms
09:49:04.072053 apple-dcp 289c00000.dcp: AFK[ep:29]: DCPAVAudioInterface (chan:31) service call group 0 cmd 10 failed to complete: -110
09:49:04.073556 apple-dcp 289c00000.dcp: dcp_poweroff() done
09:49:05.896954 apple-dcp 315c00000.dcp: dcp_hotplug() connected:1 valid_mode:0 nr_modes:13
09:49:05.947450 apple-dcp 289c00000.dcp: DP-1 cannot follow its CRTC here
09:49:06.734283 apple-display-crossbar 70304c000.mux: Switched dpphy to dispext0,0

# Run 4, Hyprland (the last lines are from the crash report's log tail)
DEBUG from aquamarine ]: drm: connected slot 1 crtc 69 assigned to DP-1
DEBUG from aquamarine ]: atomic drm request: failed to commit: Invalid argument, flags: ATOMIC_ALLOW_MODESET ATOMIC_TEST_ONLY 
DEBUG from aquamarine ]: drm: Modesetting DP-1 with 640x480@59.94Hz
ERR from aquamarine ]: atomic drm request: failed to commit: Invalid argument, flags: ATOMIC_ALLOW_MODESET PAGE_FLIP_EVENT 

# Run 1, kernel
09:26:27.646216 apple-display-crossbar 70304c000.mux: Switched dpphy to dispext1,0
09:26:28.733715 apple-dcp 289c00000.dcp: AFK[ep:29]: DCPAVAudioInterface (chan:3) command type 0xc0 tag 0x0d00 timed out after 1000 ms
09:26:28.784620 apple-dcp 289c00000.dcp: DP-1 cannot follow its CRTC here
09:26:29.555772 apple-display-crossbar 70304c000.mux: Switched dpphy to dispext0,0

Core dumps are kept locally and not attached.

Related issues, pull requests, or code examples

Workaround: none tested.

What was not tested

  • Without drm/apple: turn DP/HDMI audio on by default #300 (audio off through appledrm.hdmi_audio=0)
  • Other USB-C ports, other monitors, other Macs
  • The aurora-audio stack
  • Kernels before aurora12
  • More than 4 total runs, so we can't say how often a fast swap with video crashes or doesn't

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions