drm/amd/display: Compare plane when looking for pipe split being lost
authorAlvin Lee <alvin.lee2@amd.com>
Fri, 28 Aug 2020 14:09:05 +0000 (10:09 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 15 Sep 2020 21:52:41 +0000 (17:52 -0400)
[Why]
There are situations where we go from 2 pipe to 1 pipe in MPO, but this
isn't a pipe split being lost -- it's a plane disappearing in (i.e. video overlay
goes away) so we lose one pipe. In these situations we don't want to
disable the pipe in a separate operation from the rest of the pipe
programming sequence. We only want to disable a pipe in a
separate operation when we're actually disabling pipe split.

[How]
Make sure the pipe being lost has the same stream AND plane
as the old top pipe to ensure.

Signed-off-by: Alvin Lee <alvin.lee2@amd.com>
Acked-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c

index 8ca94f5..d0f3bf9 100644 (file)
@@ -2765,7 +2765,7 @@ bool dcn10_disconnect_pipes(
                struct dc *dc,
                struct dc_state *context)
 {
-               bool found_stream = false;
+               bool found_pipe = false;
                int i, j;
                struct dce_hwseq *hws = dc->hwseq;
                struct dc_state *old_ctx = dc->current_state;
@@ -2805,26 +2805,28 @@ bool dcn10_disconnect_pipes(
                                        old_ctx->res_ctx.pipe_ctx[i].top_pipe) {
 
                                        /* Find the top pipe in the new ctx for the bottom pipe that we
-                                        * want to remove by comparing the streams. If both pipes are being
-                                        * disabled then do it in the regular pipe programming sequence
+                                        * want to remove by comparing the streams and planes. If both
+                                        * pipes are being disabled then do it in the regular pipe
+                                        * programming sequence
                                         */
                                        for (j = 0; j < dc->res_pool->pipe_count; j++) {
                                                if (old_ctx->res_ctx.pipe_ctx[i].top_pipe->stream == context->res_ctx.pipe_ctx[j].stream &&
+                                                       old_ctx->res_ctx.pipe_ctx[i].top_pipe->plane_state == context->res_ctx.pipe_ctx[j].plane_state &&
                                                        !context->res_ctx.pipe_ctx[j].top_pipe &&
                                                        !context->res_ctx.pipe_ctx[j].update_flags.bits.disable) {
-                                                       found_stream = true;
+                                                       found_pipe = true;
                                                        break;
                                                }
                                        }
 
                                        // Disconnect if the top pipe lost it's pipe split
-                                       if (found_stream && !context->res_ctx.pipe_ctx[j].bottom_pipe) {
+                                       if (found_pipe && !context->res_ctx.pipe_ctx[j].bottom_pipe) {
                                                hws->funcs.plane_atomic_disconnect(dc, &dc->current_state->res_ctx.pipe_ctx[i]);
                                                DC_LOG_DC("Reset mpcc for pipe %d\n", dc->current_state->res_ctx.pipe_ctx[i].pipe_idx);
                                                mpcc_disconnected = true;
                                        }
                                }
-                               found_stream = false;
+                               found_pipe = false;
                        }
                }