[PATCH v2 1/2] drm/amd/display: skip receiver power control without AUX

From: NepNep7601

Date: Wed Aug 26 2026 - 16:45:28 EST


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 <neptune@xxxxxxxxxxxxxxxxxxxx>
---

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/20260826193602.6441-1-neptune@xxxxxxxxxxxxxxxxxxxx

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