summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeon Elazar <leon.elazar@amd.com>2017-01-05 17:47:43 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-09-26 17:09:09 -0400
commitb06b7680e341151c8c60b07ddc6f5e63e7392c17 (patch)
tree0b3dbccadaa12a2e24326d2d5b7358b9abedf069
parentcf388c0da8e978ed766b975ceccbf699e98bd476 (diff)
downloadlinux-stable-b06b7680e341151c8c60b07ddc6f5e63e7392c17.tar.gz
linux-stable-b06b7680e341151c8c60b07ddc6f5e63e7392c17.tar.bz2
linux-stable-b06b7680e341151c8c60b07ddc6f5e63e7392c17.zip
drm/amd/display: blank mechanism for supporting MPO
blank/unblanck functionality apply_ctx_for_surface will update planes visibility by manipulating Blender and CRTC HW modules. Signed-off-by: Leon Elazar <leon.elazar@amd.com> Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> Acked-by: Harry Wentland <Harry.Wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc.c4
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c42
2 files changed, 37 insertions, 9 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 25e7d7bc282b..2277f9bf4bb1 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1246,10 +1246,6 @@ bool dc_pre_update_surfaces_to_target(
core_dc,
&context->res_ctx.pipe_ctx[j],
context);
-
- if (!new_surfaces[i]->visible)
- context->res_ctx.pipe_ctx[j].tg->funcs->set_blank(
- context->res_ctx.pipe_ctx[j].tg, true);
}
unexpected_fail:
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
index 2b61fdf3f03d..7c27a820e5be 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
@@ -1409,20 +1409,52 @@ static void set_default_colors(struct pipe_ctx *pipe_ctx)
pipe_ctx->opp, &default_adjust);
}
-static void program_blender(const struct core_dc *dc,
+
+/*******************************************************************************
+ * In order to turn on/off specific surface we will program
+ * Blender + CRTC
+ *
+ * In case that we have two surfaces and they have a different visibility
+ * we can't turn off the CRTC since it will turn off the entire display
+ *
+ * |----------------------------------------------- |
+ * |bottom pipe|curr pipe | | |
+ * |Surface |Surface | Blender | CRCT |
+ * |visibility |visibility | Configuration| |
+ * |------------------------------------------------|
+ * | off | off | CURRENT_PIPE | blank |
+ * | off | on | CURRENT_PIPE | unblank |
+ * | on | off | OTHER_PIPE | unblank |
+ * | on | on | BLENDING | unblank |
+ * -------------------------------------------------|
+ *
+ ******************************************************************************/
+static void program_surface_visibility(const struct core_dc *dc,
struct pipe_ctx *pipe_ctx)
{
enum blnd_mode blender_mode = BLND_MODE_CURRENT_PIPE;
+ bool blank_target = false;
if (pipe_ctx->bottom_pipe) {
+
+ /* For now we are supporting only two pipes */
+ ASSERT(pipe_ctx->bottom_pipe->bottom_pipe == NULL);
+
if (pipe_ctx->bottom_pipe->surface->public.visible) {
if (pipe_ctx->surface->public.visible)
blender_mode = BLND_MODE_BLENDING;
else
blender_mode = BLND_MODE_OTHER_PIPE;
- }
- }
+
+ } else if (!pipe_ctx->surface->public.visible)
+ blank_target = true;
+
+ } else if (!pipe_ctx->surface->public.visible)
+ blank_target = true;
+
dce_set_blender_mode(dc->hwseq, pipe_ctx->pipe_idx, blender_mode);
+ pipe_ctx->tg->funcs->set_blank(pipe_ctx->tg, blank_target);
+
}
/**
@@ -1495,7 +1527,7 @@ static void set_plane_config(
pipe_ctx->scl_data.lb_params.alpha_en = pipe_ctx->bottom_pipe != 0;
program_scaler(dc, pipe_ctx);
- program_blender(dc, pipe_ctx);
+ program_surface_visibility(dc, pipe_ctx);
mi->funcs->mem_input_program_surface_config(
mi,
@@ -1920,7 +1952,7 @@ static void dce110_apply_ctx_for_surface(
continue;
dce110_program_front_end_for_pipe(dc, pipe_ctx);
- program_blender(dc, pipe_ctx);
+ program_surface_visibility(dc, pipe_ctx);
}
}