aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2770-drm-amd-display-Update-dchub-and-dpp-as-per-update-f.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2770-drm-amd-display-Update-dchub-and-dpp-as-per-update-f.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2770-drm-amd-display-Update-dchub-and-dpp-as-per-update-f.patch282
1 files changed, 282 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2770-drm-amd-display-Update-dchub-and-dpp-as-per-update-f.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2770-drm-amd-display-Update-dchub-and-dpp-as-per-update-f.patch
new file mode 100644
index 00000000..d9ac9972
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2770-drm-amd-display-Update-dchub-and-dpp-as-per-update-f.patch
@@ -0,0 +1,282 @@
+From 0c40865c19015a742323d48997c7b3b29ce4cee4 Mon Sep 17 00:00:00 2001
+From: Yongqiang Sun <yongqiang.sun@amd.com>
+Date: Wed, 8 Nov 2017 17:24:54 -0500
+Subject: [PATCH 2770/4131] drm/amd/display: Update dchub and dpp as per update
+ flags.
+
+Check update flags and update dchub and dpp as per flags,
+reduce reg access from 347 to 200, duration time reduce
+to 170us.
+
+Signed-off-by: Yongqiang Sun <yongqiang.sun@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>
+---
+ .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 191 +++++++++++++--------
+ 1 file changed, 117 insertions(+), 74 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 4ff1608..1cf7ff0 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
+@@ -1878,47 +1878,10 @@ void build_prescale_params(struct dc_bias_and_scale *bias_and_scale,
+ }
+ }
+
+-static void update_dchubp_dpp(
+- struct dc *dc,
+- struct pipe_ctx *pipe_ctx,
+- struct dc_state *context)
++static void update_dpp(struct dpp *dpp, struct dc_plane_state *plane_state)
+ {
+- struct dce_hwseq *hws = dc->hwseq;
+- struct hubp *hubp = pipe_ctx->plane_res.hubp;
+- struct dpp *dpp = pipe_ctx->plane_res.dpp;
+- struct dc_plane_state *plane_state = pipe_ctx->plane_state;
+- union plane_size size = plane_state->plane_size;
+- struct mpcc_cfg mpcc_cfg = {0};
+- struct pipe_ctx *top_pipe;
+- bool per_pixel_alpha = plane_state->per_pixel_alpha && pipe_ctx->bottom_pipe;
+ struct dc_bias_and_scale bns_params = {0};
+
+- /* TODO: proper fix once fpga works */
+- /* depends on DML calculation, DPP clock value may change dynamically */
+- enable_dppclk(
+- dc->hwseq,
+- pipe_ctx->pipe_idx,
+- pipe_ctx->stream_res.pix_clk_params.requested_pix_clk,
+- context->bw.dcn.calc_clk.dppclk_div);
+- dc->current_state->bw.dcn.cur_clk.dppclk_div =
+- context->bw.dcn.calc_clk.dppclk_div;
+- context->bw.dcn.cur_clk.dppclk_div = context->bw.dcn.calc_clk.dppclk_div;
+-
+- /* TODO: Need input parameter to tell current DCHUB pipe tie to which OTG
+- * VTG is within DCHUBBUB which is commond block share by each pipe HUBP.
+- * VTG is 1:1 mapping with OTG. Each pipe HUBP will select which VTG
+- */
+- REG_UPDATE(DCHUBP_CNTL[pipe_ctx->pipe_idx], HUBP_VTG_SEL, pipe_ctx->stream_res.tg->inst);
+-
+- hubp->funcs->hubp_setup(
+- hubp,
+- &pipe_ctx->dlg_regs,
+- &pipe_ctx->ttu_regs,
+- &pipe_ctx->rq_regs,
+- &pipe_ctx->pipe_dlg_param);
+-
+- size.grph.surface_size = pipe_ctx->plane_res.scl_data.viewport;
+-
+ // program the input csc
+ dpp->funcs->dpp_setup(dpp,
+ plane_state->format,
+@@ -1930,6 +1893,17 @@ static void update_dchubp_dpp(
+ build_prescale_params(&bns_params, plane_state);
+ if (dpp->funcs->dpp_program_bias_and_scale)
+ dpp->funcs->dpp_program_bias_and_scale(dpp, &bns_params);
++}
++
++static void update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)
++{
++ struct mpcc_cfg mpcc_cfg = {0};
++ struct hubp *hubp = pipe_ctx->plane_res.hubp;
++ struct pipe_ctx *top_pipe;
++ bool per_pixel_alpha =
++ pipe_ctx->plane_state->per_pixel_alpha && pipe_ctx->bottom_pipe;
++
++ /* TODO: proper fix once fpga works */
+
+ mpcc_cfg.dpp_id = hubp->inst;
+ mpcc_cfg.opp_id = pipe_ctx->stream_res.opp->inst;
+@@ -1952,33 +1926,110 @@ static void update_dchubp_dpp(
+ && per_pixel_alpha;
+ hubp->mpcc_id = dc->res_pool->mpc->funcs->add(dc->res_pool->mpc, &mpcc_cfg);
+ hubp->opp_id = mpcc_cfg.opp_id;
++}
++
++static void update_scaler(struct pipe_ctx *pipe_ctx)
++{
++ bool per_pixel_alpha =
++ pipe_ctx->plane_state->per_pixel_alpha && pipe_ctx->bottom_pipe;
++
++ /* TODO: proper fix once fpga works */
+
+ pipe_ctx->plane_res.scl_data.lb_params.alpha_en = per_pixel_alpha;
+ pipe_ctx->plane_res.scl_data.lb_params.depth = LB_PIXEL_DEPTH_30BPP;
+ /* scaler configuration */
+ pipe_ctx->plane_res.dpp->funcs->dpp_set_scaler(
+ pipe_ctx->plane_res.dpp, &pipe_ctx->plane_res.scl_data);
++}
+
+- hubp->funcs->mem_program_viewport(hubp,
+- &pipe_ctx->plane_res.scl_data.viewport, &pipe_ctx->plane_res.scl_data.viewport_c);
++static void update_dchubp_dpp(
++ struct dc *dc,
++ struct pipe_ctx *pipe_ctx,
++ struct dc_state *context)
++{
++ struct dce_hwseq *hws = dc->hwseq;
++ struct hubp *hubp = pipe_ctx->plane_res.hubp;
++ struct dpp *dpp = pipe_ctx->plane_res.dpp;
++ struct dc_plane_state *plane_state = pipe_ctx->plane_state;
++ union plane_size size = plane_state->plane_size;
+
+- /*gamut remap*/
+- program_gamut_remap(pipe_ctx);
++ /* depends on DML calculation, DPP clock value may change dynamically */
++ if (pipe_ctx->plane_state->update_flags.raw != 0) {
++ enable_dppclk(
++ dc->hwseq,
++ pipe_ctx->pipe_idx,
++ pipe_ctx->stream_res.pix_clk_params.requested_pix_clk,
++ context->bw.dcn.calc_clk.dppclk_div);
++ dc->current_state->bw.dcn.cur_clk.dppclk_div =
++ context->bw.dcn.calc_clk.dppclk_div;
++ context->bw.dcn.cur_clk.dppclk_div = context->bw.dcn.calc_clk.dppclk_div;
++ }
+
+- program_output_csc(dc,
+- pipe_ctx,
+- pipe_ctx->stream->output_color_space,
+- pipe_ctx->stream->csc_color_matrix.matrix,
+- mpcc_cfg.opp_id);
+-
+- hubp->funcs->hubp_program_surface_config(
+- hubp,
+- plane_state->format,
+- &plane_state->tiling_info,
+- &size,
+- plane_state->rotation,
+- &plane_state->dcc,
+- plane_state->horizontal_mirror);
++ /* TODO: Need input parameter to tell current DCHUB pipe tie to which OTG
++ * VTG is within DCHUBBUB which is commond block share by each pipe HUBP.
++ * VTG is 1:1 mapping with OTG. Each pipe HUBP will select which VTG
++ */
++ if (plane_state->update_flags.bits.full_update) {
++ REG_UPDATE(DCHUBP_CNTL[pipe_ctx->pipe_idx], HUBP_VTG_SEL, pipe_ctx->stream_res.tg->inst);
++
++ hubp->funcs->hubp_setup(
++ hubp,
++ &pipe_ctx->dlg_regs,
++ &pipe_ctx->ttu_regs,
++ &pipe_ctx->rq_regs,
++ &pipe_ctx->pipe_dlg_param);
++ }
++
++ size.grph.surface_size = pipe_ctx->plane_res.scl_data.viewport;
++
++ if (plane_state->update_flags.bits.full_update ||
++ plane_state->update_flags.bits.bpp_change)
++ update_dpp(dpp, plane_state);
++
++ if (plane_state->update_flags.bits.full_update ||
++ plane_state->update_flags.bits.per_pixel_alpha_change)
++ update_mpcc(dc, pipe_ctx);
++
++ if (plane_state->update_flags.bits.full_update ||
++ plane_state->update_flags.bits.per_pixel_alpha_change ||
++ plane_state->update_flags.bits.scaling_change ||
++ plane_state->update_flags.bits.position_change) {
++ update_scaler(pipe_ctx);
++ }
++
++ if (plane_state->update_flags.bits.full_update ||
++ plane_state->update_flags.bits.scaling_change) {
++ hubp->funcs->mem_program_viewport(
++ hubp,
++ &pipe_ctx->plane_res.scl_data.viewport,
++ &pipe_ctx->plane_res.scl_data.viewport_c);
++ }
++
++ if (plane_state->update_flags.bits.full_update) {
++ /*gamut remap*/
++ program_gamut_remap(pipe_ctx);
++
++ program_output_csc(dc,
++ pipe_ctx,
++ pipe_ctx->stream->output_color_space,
++ pipe_ctx->stream->csc_color_matrix.matrix,
++ hubp->opp_id);
++ }
++
++ if (plane_state->update_flags.bits.full_update ||
++ plane_state->update_flags.bits.horizontal_mirror_change ||
++ plane_state->update_flags.bits.rotation_change ||
++ plane_state->update_flags.bits.swizzle_change ||
++ plane_state->update_flags.bits.bpp_change) {
++ hubp->funcs->hubp_program_surface_config(
++ hubp,
++ plane_state->format,
++ &plane_state->tiling_info,
++ &size,
++ plane_state->rotation,
++ &plane_state->dcc,
++ plane_state->horizontal_mirror);
++ }
+
+ hubp->power_gated = false;
+
+@@ -2019,8 +2070,7 @@ static void program_all_pipe_in_tree(
+ if (pipe_ctx->plane_state->update_flags.bits.full_update)
+ dcn10_enable_plane(dc, pipe_ctx, context);
+
+- if (pipe_ctx->plane_state->update_flags.raw != 0)
+- update_dchubp_dpp(dc, pipe_ctx, context);
++ update_dchubp_dpp(dc, pipe_ctx, context);
+
+ if (cur_pipe_ctx->plane_state != pipe_ctx->plane_state) {
+ dc->hwss.set_input_transfer_func(pipe_ctx, pipe_ctx->plane_state);
+@@ -2181,26 +2231,18 @@ static void dcn10_apply_ctx_for_surface(
+ }
+
+ if (num_planes > 0) {
+- struct dc_stream_state *stream_for_cursor = NULL;
+-
+ program_all_pipe_in_tree(dc, top_pipe_to_program, context);
+
+- for (i = 0; i < dc->res_pool->pipe_count; i++) {
+- struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
+-
+- if (stream == pipe_ctx->stream) {
+- stream_for_cursor = pipe_ctx->stream;
+- break;
+- }
+- }
+-
+ /* TODO: this is a hack w/a for switching from mpo to pipe split */
+- if (stream_for_cursor->cursor_attributes.address.quad_part != 0) {
++ if (stream->cursor_attributes.address.quad_part != 0) {
+ struct dc_cursor_position position = { 0 };
+
+- dc_stream_set_cursor_position(stream_for_cursor, &position);
+- dc_stream_set_cursor_attributes(stream_for_cursor,
+- &stream_for_cursor->cursor_attributes);
++ dc_stream_set_cursor_position(
++ (struct dc_stream_state *)stream,
++ &position);
++ dc_stream_set_cursor_attributes(
++ (struct dc_stream_state *)stream,
++ &stream->cursor_attributes);
+ }
+ }
+
+@@ -2227,7 +2269,7 @@ static void dcn10_apply_ctx_for_surface(
+ dcn10_verify_allow_pstate_change_high(dc);
+ }
+
+- dm_logger_write(dc->ctx->logger, LOG_BANDWIDTH_CALCS,
++/* dm_logger_write(dc->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "\n============== Watermark parameters ==============\n"
+ "a.urgent_ns: %d \n"
+ "a.cstate_enter_plus_exit: %d \n"
+@@ -2273,6 +2315,7 @@ static void dcn10_apply_ctx_for_surface(
+ context->bw.dcn.watermarks.d.cstate_pstate.pstate_change_ns,
+ context->bw.dcn.watermarks.d.pte_meta_urgent_ns
+ );
++*/
+
+ if (dc->debug.sanity_checks)
+ dcn10_verify_allow_pstate_change_high(dc);
+--
+2.7.4
+