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

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
...@@ -2765,7 +2765,7 @@ bool dcn10_disconnect_pipes( ...@@ -2765,7 +2765,7 @@ bool dcn10_disconnect_pipes(
struct dc *dc, struct dc *dc,
struct dc_state *context) struct dc_state *context)
{ {
bool found_stream = false; bool found_pipe = false;
int i, j; int i, j;
struct dce_hwseq *hws = dc->hwseq; struct dce_hwseq *hws = dc->hwseq;
struct dc_state *old_ctx = dc->current_state; struct dc_state *old_ctx = dc->current_state;
...@@ -2805,26 +2805,28 @@ bool dcn10_disconnect_pipes( ...@@ -2805,26 +2805,28 @@ bool dcn10_disconnect_pipes(
old_ctx->res_ctx.pipe_ctx[i].top_pipe) { old_ctx->res_ctx.pipe_ctx[i].top_pipe) {
/* Find the top pipe in the new ctx for the bottom pipe that we /* 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 * want to remove by comparing the streams and planes. If both
* disabled then do it in the regular pipe programming sequence * pipes are being disabled then do it in the regular pipe
* programming sequence
*/ */
for (j = 0; j < dc->res_pool->pipe_count; j++) { 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 && 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].top_pipe &&
!context->res_ctx.pipe_ctx[j].update_flags.bits.disable) { !context->res_ctx.pipe_ctx[j].update_flags.bits.disable) {
found_stream = true; found_pipe = true;
break; break;
} }
} }
// Disconnect if the top pipe lost it's pipe split // 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]); 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); DC_LOG_DC("Reset mpcc for pipe %d\n", dc->current_state->res_ctx.pipe_ctx[i].pipe_idx);
mpcc_disconnected = true; mpcc_disconnected = true;
} }
} }
found_stream = false; found_pipe = false;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment