Commit 6cd79237 authored by Alvin Lee's avatar Alvin Lee Committed by Alex Deucher
Browse files

drm/amd/display: Compare plane when looking for pipe split being lost



[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: default avatarAlvin Lee <alvin.lee2@amd.com>
Acked-by: default avatarAurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 5fd35f12
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -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;
			}
		}