From: Leon Elazar <leon.elazar@xxxxxxx> blank/unblanck functionality apply_ctx_for_surface will update planes visibility by manipulating Blender and CRTC HW modules. Change-Id: I0fa0b46cb36de203b07af7a846a740e81fda6233 Signed-off-by: Leon Elazar <leon.elazar at amd.com> Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin at amd.com> Reviewed-by: Tony Cheng <Tony.Cheng at amd.com> Acked-by: Harry Wentland <Harry.Wentland at amd.com> --- drivers/gpu/drm/amd/display/dc/core/dc.c | 4 --- .../amd/display/dc/dce110/dce110_hw_sequencer.c | 42 +++++++++++++++++++--- 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); } } -- 2.9.3