]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd/display: Add AV mute wait frames to dce110_set_avmute
authorRay Wu <ray.wu@amd.com>
Mon, 13 Jul 2026 14:23:34 +0000 (22:23 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 29 Jul 2026 00:00:12 +0000 (20:00 -0400)
Port the three-frame wait logic from dcn30_set_avmute to
dce110_set_avmute so that older DCN versions (1.0, 2.0) also
wait for GCP packets to be sent out before proceeding.

This ensures HDMI sinks properly process the mute state,
preventing garbled display after link re-establishment.

Closes: https://gitlab.freedesktop.org/drm/amd/-/work_items/5167
Reviewed-by: Wayne Lin <wayne.lin@amd.com>
Signed-off-by: Ray Wu <ray.wu@amd.com>
Signed-off-by: Fangzhi Zuo <jerry.zuo@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 414da24137ace80d8c59fefd43ba3ec9f5f854ba)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c

index 042602c50e350d9fc5051f7c6e074352431756fe..53fffe58602f13ff30e13376938e9fb2fcd207c2 100644 (file)
@@ -1337,8 +1337,27 @@ void dce110_blank_stream(struct pipe_ctx *pipe_ctx)
 
 void dce110_set_avmute(struct pipe_ctx *pipe_ctx, bool enable)
 {
-       if (pipe_ctx != NULL && pipe_ctx->stream_res.stream_enc != NULL)
+       if (pipe_ctx == NULL || pipe_ctx->stream_res.stream_enc == NULL)
+               return;
+
+       if (dc_is_hdmi_signal(pipe_ctx->stream->signal)) {
                pipe_ctx->stream_res.stream_enc->funcs->set_avmute(pipe_ctx->stream_res.stream_enc, enable);
+
+               /* Wait for three frames to make sure AV mute is sent out.
+                * Some HDMI sinks need additional GCP packets to properly
+                * process the mute state, especially after link re-establishment
+                * with HDMI 2.0 scrambling enabled.
+                */
+               if (enable && pipe_ctx->stream_res.tg->funcs->is_tg_enabled(pipe_ctx->stream_res.tg)) {
+                       int i;
+
+                       pipe_ctx->stream_res.tg->funcs->wait_for_state(pipe_ctx->stream_res.tg, CRTC_STATE_VACTIVE);
+                       for (i = 0; i < 3; i++) {
+                               pipe_ctx->stream_res.tg->funcs->wait_for_state(pipe_ctx->stream_res.tg, CRTC_STATE_VBLANK);
+                               pipe_ctx->stream_res.tg->funcs->wait_for_state(pipe_ctx->stream_res.tg, CRTC_STATE_VACTIVE);
+                       }
+               }
+       }
 }
 
 enum audio_dto_source translate_to_dto_source(enum controller_id crtc_id)