Passive DP to TMDS dongles do not provide a DP receiver and use native GPIO I2C rather than AUX. The normal link PHY and stream blanking paths nevertheless try to write DP_SET_POWER, causing the DP helpers to retry a transaction that cannot succeed 32 times before giving up.
Gate the receiver-power calls in dp_enable_link_phy(), dp_disable_link_phy() and link_blank_dp_stream() on the post-detection aux_mode state. Keep dpcd_write_rx_power_ctrl() unchanged because early DP detection calls it before aux_mode is initialized, and active dongles may require the receiver power-up before DPCD reads. On an Oland GPU with a passive DP to HDMI to DVI chain, this reduced boot-time "DP AUX transfer fail" messages from 32 to 0. The EDID remained 256 bytes and the display continued to use its native 1600x900 mode. Assisted-by: Claude:claude-opus-5 Assisted-by: Codex:gpt-5 Signed-off-by: NepNep7601 <[email protected]> --- Notes (amdgpu-followups-v2): v2: - Move the aux_mode check out of dpcd_write_rx_power_ctrl() so early detection can still power active dongles before reading DPCD. - Gate receiver-power writes at the normal PHY and stream-blanking call sites. - Retest the revised placement on the affected Oland system. v1: https://lore.kernel.org/r/[email protected] drivers/gpu/drm/amd/display/dc/link/link_dpms.c | 6 ++++-- .../drm/amd/display/dc/link/protocols/link_dp_phy.c | 10 ++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c index 48b086d15ab0..81d63e1aab53 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c @@ -146,8 +146,10 @@ void link_blank_dp_stream(struct dc_link *link, bool hw_init) } } - if (((!dc->is_switch_in_progress_dest) && ((!link->wa_flags.dp_keep_receiver_powered) || hw_init)) && - (link->type != dc_connection_none)) + if (link->aux_mode && + !dc->is_switch_in_progress_dest && + (!link->wa_flags.dp_keep_receiver_powered || hw_init) && + link->type != dc_connection_none) dpcd_write_rx_power_ctrl(link, false); } } diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c index 49521ac4b0e8..24f09bdcab51 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c @@ -65,7 +65,8 @@ void dp_enable_link_phy( link->cur_link_settings = *link_settings; link->dc->hwss.enable_dp_link_output(link, link_res, signal, clock_source, link_settings); - dpcd_write_rx_power_ctrl(link, true); + if (link->aux_mode) + dpcd_write_rx_power_ctrl(link, true); } void dp_disable_link_phy(struct dc_link *link, @@ -74,9 +75,10 @@ void dp_disable_link_phy(struct dc_link *link, { struct dc *dc = link->ctx->dc; - if (!link->wa_flags.dp_keep_receiver_powered && - !link->skip_implict_edp_power_control && - link->type != dc_connection_none) + if (link->aux_mode && + !link->wa_flags.dp_keep_receiver_powered && + !link->skip_implict_edp_power_control && + link->type != dc_connection_none) dpcd_write_rx_power_ctrl(link, false); dc->hwss.disable_link_output(link, link_res, signal); -- 2.47.3
