drm/amd/display: Fix black screen when disabling Freesync in OSD
authorIlya Bakoulin <Ilya.Bakoulin@amd.com>
Thu, 9 Jun 2022 22:45:04 +0000 (18:45 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 12 Jul 2022 20:50:29 +0000 (16:50 -0400)
[Why]
Black screen encountered when disabling Freesync through OSD on some
displays.

[How]
Set the should_disable flag when new top pipe has no plane state to
ensure that pipes get cleaned up.

Reviewed-by: Chris Park <Chris.Park@amd.com>
Acked-by: Solomon Chiu <solomon.chiu@amd.com>
Signed-off-by: Ilya Bakoulin <Ilya.Bakoulin@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/core/dc.c

index 715b2ef80d3811229573833275e070d8c3e1eb82..03bf4be81ea33ffda82c7d8cbb4375a134bef9a4 100644 (file)
@@ -1085,6 +1085,16 @@ static void disable_dangling_plane(struct dc *dc, struct dc_state *context)
                                dc->current_state->stream_count != context->stream_count)
                        should_disable = true;
 
+               if (old_stream && !dc->current_state->res_ctx.pipe_ctx[i].top_pipe) {
+                       struct pipe_ctx *old_pipe, *new_pipe;
+
+                       old_pipe = &dc->current_state->res_ctx.pipe_ctx[i];
+                       new_pipe = &context->res_ctx.pipe_ctx[i];
+
+                       if (old_pipe->plane_state && !new_pipe->plane_state)
+                               should_disable = true;
+               }
+
                if (should_disable && old_stream) {
                        dc_rem_all_planes_for_stream(dc, old_stream, dangling_context);
                        disable_all_writeback_pipes_for_stream(dc, old_stream, dangling_context);