[PATCH 21/42] drm/amd/display: Compare plane when looking for pipe split being lost

Aurabindo Pillai aurabindo.pillai at amd.com
Thu Sep 10 13:47:02 UTC 2020


From: Alvin Lee <alvin.lee2 at amd.com>

[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 at amd.com>
Acked-by: Aurabindo Pillai <aurabindo.pillai at amd.com>
---
 .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c  | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
index 8ca94f506195..d0f3bf953d02 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
@@ -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;
 			}
 		}
 
-- 
2.25.1



More information about the amd-gfx mailing list