drm/amd/display: Avoid calling blank_stream() twice
authorZhongwei Zhang <Zhongwei.Zhang@amd.com>
Fri, 16 May 2025 06:44:21 +0000 (14:44 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 3 Jun 2025 19:33:04 +0000 (15:33 -0400)
[Why]
We've made fix for garbage in dcn31_reset_back_end_for_pipe(), adding
blank_stream() before disable_crtc(). And set_dpms_off() will call
blank_stream() again.

[How]
Add flag to avoid calling blank_stream() twice.

Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Zhongwei Zhang <Zhongwei.Zhang@amd.com>
Signed-off-by: Wayne Lin <wayne.lin@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c
drivers/gpu/drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.c
drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer_private.h

index b88b2d6b4e811ff5dc8c4b72ec2ec860e96066fa..e8730cc40edbe865e60cbb59d65e2942d66c124a 100644 (file)
@@ -1221,6 +1221,9 @@ void dce110_blank_stream(struct pipe_ctx *pipe_ctx)
        struct dc_link *link = stream->link;
        struct dce_hwseq *hws = link->dc->hwseq;
 
+       if (hws && hws->wa_state.skip_blank_stream)
+               return;
+
        if (link->local_sink && link->local_sink->sink_signal == SIGNAL_TYPE_EDP) {
                if (!link->skip_implict_edp_power_control)
                        hws->funcs.edp_backlight_control(link, false);
index f38340aa3f159db97ee697887e4de5857aca6858..5ba3999991b095639df440538d1a935414bcefaf 100644 (file)
@@ -526,9 +526,15 @@ static void dcn31_reset_back_end_for_pipe(
 
        link = pipe_ctx->stream->link;
 
+       if (dc->hwseq)
+               dc->hwseq->wa_state.skip_blank_stream = false;
+
        if ((!pipe_ctx->stream->dpms_off || link->link_status.link_active) &&
-               (link->connector_signal == SIGNAL_TYPE_EDP))
+               (link->connector_signal == SIGNAL_TYPE_EDP)) {
                dc->hwss.blank_stream(pipe_ctx);
+               if (dc->hwseq)
+                       dc->hwseq->wa_state.skip_blank_stream = true;
+       }
 
        pipe_ctx->stream_res.tg->funcs->set_dsc_config(
                        pipe_ctx->stream_res.tg,
@@ -570,7 +576,8 @@ static void dcn31_reset_back_end_for_pipe(
                        pipe_ctx->stream_res.audio = NULL;
                }
        }
-
+       if (dc->hwseq)
+               dc->hwseq->wa_state.skip_blank_stream = false;
        pipe_ctx->stream = NULL;
        DC_LOG_DEBUG("Reset back end for pipe %d, tg:%d\n",
                                        pipe_ctx->pipe_idx, pipe_ctx->stream_res.tg->inst);
index 09bc65c2fa23b2eb829c2474e0a39a0d1e9f5937..1e2d247fbbacde380fccdfa245b90f4d57ad5246 100644 (file)
@@ -49,6 +49,7 @@ struct hwseq_wa_state {
        bool DEGVIDCN10_253_applied;
        bool disallow_self_refresh_during_multi_plane_transition_applied;
        unsigned int disallow_self_refresh_during_multi_plane_transition_applied_on_frame;
+       bool skip_blank_stream;
 };
 
 struct pipe_ctx;