You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[fairydust] DP Alt Mode: sink's swing/pre-emphasis requests are never applied to atcphy (set_drive_settings only stored; atcphy rejects set_voltages) — M1 Pro + Samsung G95NC trains and modesets but panel stays black #611
Machine: MacBook Pro 14" 2021, M1 Pro — apple,j314s / apple,t6000
Distro / kernel: Omarchy (Arch Linux ARM), stock linux-asahi 7.1.6 (asahi-7.1.6-1, 16K pages), with the fairydust tipd change applied as an out-of-tree module (details below)
Cable: Cable Matters USB-C → DisplayPort cable (Realtek billboard 0bda:5452), no hub/dock
Monitor: Samsung Odyssey G95NC (57", EDID preferred 3840x2160@60 / 5120x1440@60 on DP), DisplayPort input, PBP off
Same cable + monitor work on this machine under macOS.
Setup notes (so nothing is hidden)
I could not get a fairydust build (ce9f2eb) to boot on this machine (hung before console; not investigated further), so I ran stock asahi-7.1.6-1 and built drivers/usb/typec/tipd from that tag plus the fairydust cd321x OOB-hotplug change (CD321X_DATA_STATUS_HPD_LEVEL → drm_connector_oob_hotplug_event on the displayport fwnode) as an out-of-tree module. For everything below (dcp.c, dptxep.c, atc.c) stock and fairydust head ce9f2eb are identical.
The display is on the port the DT calls typec0 (usb-pd@38, 702280000.usb, atcphy0), because I need a USB SSD on the other port. I rebuilt the j314s DTB so dcpext1 points at atcphy0 (apple,dptx-phy = <0>, mux-index = <2>). Everything AP-side works with this wiring, so I don't think the port choice matters for what follows, but flagging it.
Summary
The whole AP-side path completes: OOB HPD → dcp_dptx_connect → AUX/EDID (28 modes) → link config HBR2 (0x14) × 4 lanes → set_digital_out_mode → switch to normal mode succeeded → swaps accepted (no more "swallowed swap"). DP-1 is connected and the compositor renders to it. With the monitor set to DP 1.2 in its OSD the link stays up indefinitely (>20 min, survives repeated modesets).
The monitor never shows a picture: black, backlight off, and its relay clicks each time the source retrains. Same at 2560x1440@60 (depth:10) and 3840x2160@60 (depth:8), and with the USB-C plug flipped 180°.
What the training log shows
Every connect/modeset produces the same four set_drive_settings calls: the sink first gets swing 0 / pre-emphasis 0, then asks for 2 / 2 three times in a row:
(dptxport_call_set_link_rate trace: link rate 0x14; set_active_lane_count 4.)
Why I think the picture is missing
dptxport_call_set_drive_settings (dptxep.c:210) acks the request and stores unk5/unk7 in dptx->drive_settings[] (dptxep.c:228), but nothing ever pushes them to the PHY.
atcphy_dpphy_configure (atc.c:2077) returns -EINVAL if opts->set_voltages is set, and I can't find any main-lane swing/pre-emphasis programming in atc.c (only LPDPTX_AUX_MARGIN_RCAL_TXSWING for AUX).
So the main lanes run at whatever the fixed tunables give, regardless of what the sink asks for. That fits the symptom exactly: AUX works (HPD, EDID, DPCD), the sink repeatedly requests a stronger level, never locks, and stays black — while macOS (which does apply drive settings) drives the same cable and panel fine.
I realise this is probably known internally, but I couldn't find it written down in an issue, and it may explain a share of the "trains fine, no picture" / cable-dependent reports (e.g. #571 is a link-bounce with one adapter and stable with another on the same monitor).
Connect ordering: with this sink the firmware only starts link config after dptxport_set_hpd(true), so dcp_dptx_connect always waits the full DPTX_CONNECT_TIMEOUT (2000 ms, dcp.c:358/387) before calling set_hpd (dcp.c:399). Harmless, but every hotplug costs 2 s.
WARN_ON_ONCE(atcphy->pipehandler_up) (atc.c:2328) fires from atcphy_mux_set ← typec_set_mode(TYPEC_STATE_SAFE) ← tps6598x_disconnect ← tipd_remove when unloading tipd while a DP-only partner is attached (the pipehandler is still up at that point). Only relevant if you care about module unload.
Happy to help
I can test patches on this hardware (j314s, this cable, this monitor), capture m1n1/hypervisor traces if you tell me what you need, or provide the full previous-boot journalctl -k, EDID, and the type-C sysfs state.
Hardware / software
apple,j314s/apple,t6000linux-asahi7.1.6 (asahi-7.1.6-1, 16K pages), with thefairydusttipd change applied as an out-of-tree module (details below)0bda:5452), no hub/dockSetup notes (so nothing is hidden)
fairydustbuild (ce9f2eb) to boot on this machine (hung before console; not investigated further), so I ran stockasahi-7.1.6-1and builtdrivers/usb/typec/tipdfrom that tag plus the fairydustcd321xOOB-hotplug change (CD321X_DATA_STATUS_HPD_LEVEL→drm_connector_oob_hotplug_eventon thedisplayportfwnode) as an out-of-tree module. For everything below (dcp.c,dptxep.c,atc.c) stock andfairydusthead ce9f2eb are identical.typec0(usb-pd@38,702280000.usb,atcphy0), because I need a USB SSD on the other port. I rebuilt the j314s DTB sodcpext1points atatcphy0(apple,dptx-phy = <0>,mux-index = <2>). Everything AP-side works with this wiring, so I don't think the port choice matters for what follows, but flagging it.Summary
The whole AP-side path completes: OOB HPD →
dcp_dptx_connect→ AUX/EDID (28 modes) → link config HBR2 (0x14) × 4 lanes →set_digital_out_mode→switch to normal mode succeeded→ swaps accepted (no more "swallowed swap").DP-1isconnectedand the compositor renders to it. With the monitor set to DP 1.2 in its OSD the link stays up indefinitely (>20 min, survives repeated modesets).The monitor never shows a picture: black, backlight off, and its relay clicks each time the source retrains. Same at 2560x1440@60 (depth:10) and 3840x2160@60 (depth:8), and with the USB-C plug flipped 180°.
What the training log shows
Every connect/modeset produces the same four
set_drive_settingscalls: the sink first gets swing 0 / pre-emphasis 0, then asks for 2 / 2 three times in a row:(
dptxport_call_set_link_ratetrace: link rate 0x14;set_active_lane_count4.)Why I think the picture is missing
dptxport_call_set_drive_settings(dptxep.c:210) acks the request and storesunk5/unk7indptx->drive_settings[](dptxep.c:228), but nothing ever pushes them to the PHY.atcphy_dpphy_configure(atc.c:2077) returns-EINVALifopts->set_voltagesis set, and I can't find any main-lane swing/pre-emphasis programming inatc.c(onlyLPDPTX_AUX_MARGIN_RCAL_TXSWINGfor AUX).I realise this is probably known internally, but I couldn't find it written down in an issue, and it may explain a share of the "trains fine, no picture" / cable-dependent reports (e.g. #571 is a link-bounce with one adapter and stable with another on the same monitor).
Side observations (same logs)
DEVICE_BUSY_TIMEOUT) during the modeset and retrained first. Setting the G95NC to DP 1.2 in its OSD removes the drop entirely. Possibly the same class as [fairydust] M2 Air: DP Alt Mode link repeatedly bounces with VIA Labs hub adapter (PS186); stable with UGREEN CM478 #571.dptxport_set_hpd(true), sodcp_dptx_connectalways waits the fullDPTX_CONNECT_TIMEOUT(2000 ms,dcp.c:358/387) before callingset_hpd(dcp.c:399). Harmless, but every hotplug costs 2 s.WARN_ON_ONCE(atcphy->pipehandler_up)(atc.c:2328) fires fromatcphy_mux_set←typec_set_mode(TYPEC_STATE_SAFE)←tps6598x_disconnect←tipd_removewhen unloading tipd while a DP-only partner is attached (the pipehandler is still up at that point). Only relevant if you care about module unload.Happy to help
I can test patches on this hardware (j314s, this cable, this monitor), capture m1n1/hypervisor traces if you tell me what you need, or provide the full previous-boot
journalctl -k, EDID, and the type-C sysfs state.