diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0813-drm-amd-display-fix-pipe-interdependent-hubp-program.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0813-drm-amd-display-fix-pipe-interdependent-hubp-program.patch | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0813-drm-amd-display-fix-pipe-interdependent-hubp-program.patch b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0813-drm-amd-display-fix-pipe-interdependent-hubp-program.patch new file mode 100644 index 00000000..8ff8669c --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0813-drm-amd-display-fix-pipe-interdependent-hubp-program.patch @@ -0,0 +1,246 @@ +From f200d901fb1b492ad2b5e77df26978f72af23c03 Mon Sep 17 00:00:00 2001 +From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> +Date: Wed, 31 Oct 2018 07:59:54 -0400 +Subject: [PATCH 0813/2940] drm/amd/display: fix pipe interdependent hubp + programming + +A number of registers need to be updated for all active +pipes wherever any pipe causes a change in watermarks. + +This change separates programming of these registers into +a separate function call that is called for all active pipes +during a bw update. + +Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + .../gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c | 87 +++++++++---------- + .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 30 +++++++ + drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h | 5 ++ + 3 files changed, 78 insertions(+), 44 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c +index 6127fd30899b..345af015d061 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c +@@ -573,19 +573,6 @@ void hubp1_program_deadline( + REFCYC_X_AFTER_SCALER, dlg_attr->refcyc_x_after_scaler, + DST_Y_AFTER_SCALER, dlg_attr->dst_y_after_scaler); + +- if (REG(PREFETCH_SETTINS)) +- REG_SET_2(PREFETCH_SETTINS, 0, +- DST_Y_PREFETCH, dlg_attr->dst_y_prefetch, +- VRATIO_PREFETCH, dlg_attr->vratio_prefetch); +- else +- REG_SET_2(PREFETCH_SETTINGS, 0, +- DST_Y_PREFETCH, dlg_attr->dst_y_prefetch, +- VRATIO_PREFETCH, dlg_attr->vratio_prefetch); +- +- REG_SET_2(VBLANK_PARAMETERS_0, 0, +- DST_Y_PER_VM_VBLANK, dlg_attr->dst_y_per_vm_vblank, +- DST_Y_PER_ROW_VBLANK, dlg_attr->dst_y_per_row_vblank); +- + REG_SET(REF_FREQ_TO_PIX_FREQ, 0, + REF_FREQ_TO_PIX_FREQ, dlg_attr->ref_freq_to_pix_freq); + +@@ -593,9 +580,6 @@ void hubp1_program_deadline( + REG_SET(VBLANK_PARAMETERS_1, 0, + REFCYC_PER_PTE_GROUP_VBLANK_L, dlg_attr->refcyc_per_pte_group_vblank_l); + +- REG_SET(VBLANK_PARAMETERS_3, 0, +- REFCYC_PER_META_CHUNK_VBLANK_L, dlg_attr->refcyc_per_meta_chunk_vblank_l); +- + if (REG(NOM_PARAMETERS_0)) + REG_SET(NOM_PARAMETERS_0, 0, + DST_Y_PER_PTE_ROW_NOM_L, dlg_attr->dst_y_per_pte_row_nom_l); +@@ -610,27 +594,13 @@ void hubp1_program_deadline( + REG_SET(NOM_PARAMETERS_5, 0, + REFCYC_PER_META_CHUNK_NOM_L, dlg_attr->refcyc_per_meta_chunk_nom_l); + +- REG_SET_2(PER_LINE_DELIVERY_PRE, 0, +- REFCYC_PER_LINE_DELIVERY_PRE_L, dlg_attr->refcyc_per_line_delivery_pre_l, +- REFCYC_PER_LINE_DELIVERY_PRE_C, dlg_attr->refcyc_per_line_delivery_pre_c); +- + REG_SET_2(PER_LINE_DELIVERY, 0, + REFCYC_PER_LINE_DELIVERY_L, dlg_attr->refcyc_per_line_delivery_l, + REFCYC_PER_LINE_DELIVERY_C, dlg_attr->refcyc_per_line_delivery_c); + +- if (REG(PREFETCH_SETTINS_C)) +- REG_SET(PREFETCH_SETTINS_C, 0, +- VRATIO_PREFETCH_C, dlg_attr->vratio_prefetch_c); +- else +- REG_SET(PREFETCH_SETTINGS_C, 0, +- VRATIO_PREFETCH_C, dlg_attr->vratio_prefetch_c); +- + REG_SET(VBLANK_PARAMETERS_2, 0, + REFCYC_PER_PTE_GROUP_VBLANK_C, dlg_attr->refcyc_per_pte_group_vblank_c); + +- REG_SET(VBLANK_PARAMETERS_4, 0, +- REFCYC_PER_META_CHUNK_VBLANK_C, dlg_attr->refcyc_per_meta_chunk_vblank_c); +- + if (REG(NOM_PARAMETERS_2)) + REG_SET(NOM_PARAMETERS_2, 0, + DST_Y_PER_PTE_ROW_NOM_C, dlg_attr->dst_y_per_pte_row_nom_c); +@@ -650,10 +620,6 @@ void hubp1_program_deadline( + QoS_LEVEL_LOW_WM, ttu_attr->qos_level_low_wm, + QoS_LEVEL_HIGH_WM, ttu_attr->qos_level_high_wm); + +- REG_SET_2(DCN_GLOBAL_TTU_CNTL, 0, +- MIN_TTU_VBLANK, ttu_attr->min_ttu_vblank, +- QoS_LEVEL_FLIP, ttu_attr->qos_level_flip); +- + /* TTU - per luma/chroma */ + /* Assumed surf0 is luma and 1 is chroma */ + +@@ -662,25 +628,15 @@ void hubp1_program_deadline( + QoS_LEVEL_FIXED, ttu_attr->qos_level_fixed_l, + QoS_RAMP_DISABLE, ttu_attr->qos_ramp_disable_l); + +- REG_SET(DCN_SURF0_TTU_CNTL1, 0, +- REFCYC_PER_REQ_DELIVERY_PRE, +- ttu_attr->refcyc_per_req_delivery_pre_l); +- + REG_SET_3(DCN_SURF1_TTU_CNTL0, 0, + REFCYC_PER_REQ_DELIVERY, ttu_attr->refcyc_per_req_delivery_c, + QoS_LEVEL_FIXED, ttu_attr->qos_level_fixed_c, + QoS_RAMP_DISABLE, ttu_attr->qos_ramp_disable_c); + +- REG_SET(DCN_SURF1_TTU_CNTL1, 0, +- REFCYC_PER_REQ_DELIVERY_PRE, +- ttu_attr->refcyc_per_req_delivery_pre_c); +- + REG_SET_3(DCN_CUR0_TTU_CNTL0, 0, + REFCYC_PER_REQ_DELIVERY, ttu_attr->refcyc_per_req_delivery_cur0, + QoS_LEVEL_FIXED, ttu_attr->qos_level_fixed_cur0, + QoS_RAMP_DISABLE, ttu_attr->qos_ramp_disable_cur0); +- REG_SET(DCN_CUR0_TTU_CNTL1, 0, +- REFCYC_PER_REQ_DELIVERY_PRE, ttu_attr->refcyc_per_req_delivery_pre_cur0); + } + + static void hubp1_setup( +@@ -698,6 +654,48 @@ static void hubp1_setup( + hubp1_vready_workaround(hubp, pipe_dest); + } + ++static void hubp1_setup_interdependent( ++ struct hubp *hubp, ++ struct _vcs_dpi_display_dlg_regs_st *dlg_attr, ++ struct _vcs_dpi_display_ttu_regs_st *ttu_attr) ++{ ++ struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); ++ ++ REG_SET_2(PREFETCH_SETTINS, 0, ++ DST_Y_PREFETCH, dlg_attr->dst_y_prefetch, ++ VRATIO_PREFETCH, dlg_attr->vratio_prefetch); ++ ++ REG_SET(PREFETCH_SETTINS_C, 0, ++ VRATIO_PREFETCH_C, dlg_attr->vratio_prefetch_c); ++ ++ REG_SET_2(VBLANK_PARAMETERS_0, 0, ++ DST_Y_PER_VM_VBLANK, dlg_attr->dst_y_per_vm_vblank, ++ DST_Y_PER_ROW_VBLANK, dlg_attr->dst_y_per_row_vblank); ++ ++ REG_SET(VBLANK_PARAMETERS_3, 0, ++ REFCYC_PER_META_CHUNK_VBLANK_L, dlg_attr->refcyc_per_meta_chunk_vblank_l); ++ ++ REG_SET(VBLANK_PARAMETERS_4, 0, ++ REFCYC_PER_META_CHUNK_VBLANK_C, dlg_attr->refcyc_per_meta_chunk_vblank_c); ++ ++ REG_SET_2(PER_LINE_DELIVERY_PRE, 0, ++ REFCYC_PER_LINE_DELIVERY_PRE_L, dlg_attr->refcyc_per_line_delivery_pre_l, ++ REFCYC_PER_LINE_DELIVERY_PRE_C, dlg_attr->refcyc_per_line_delivery_pre_c); ++ ++ REG_SET(DCN_SURF0_TTU_CNTL1, 0, ++ REFCYC_PER_REQ_DELIVERY_PRE, ++ ttu_attr->refcyc_per_req_delivery_pre_l); ++ REG_SET(DCN_SURF1_TTU_CNTL1, 0, ++ REFCYC_PER_REQ_DELIVERY_PRE, ++ ttu_attr->refcyc_per_req_delivery_pre_c); ++ REG_SET(DCN_CUR0_TTU_CNTL1, 0, ++ REFCYC_PER_REQ_DELIVERY_PRE, ttu_attr->refcyc_per_req_delivery_pre_cur0); ++ ++ REG_SET_2(DCN_GLOBAL_TTU_CNTL, 0, ++ MIN_TTU_VBLANK, ttu_attr->min_ttu_vblank, ++ QoS_LEVEL_FLIP, ttu_attr->qos_level_flip); ++} ++ + bool hubp1_is_flip_pending(struct hubp *hubp) + { + uint32_t flip_pending = 0; +@@ -1186,6 +1184,7 @@ static const struct hubp_funcs dcn10_hubp_funcs = { + hubp1_program_surface_config, + .hubp_is_flip_pending = hubp1_is_flip_pending, + .hubp_setup = hubp1_setup, ++ .hubp_setup_interdependent = hubp1_setup_interdependent, + .hubp_set_vm_system_aperture_settings = hubp1_set_vm_system_aperture_settings, + .hubp_set_vm_context0_settings = hubp1_set_vm_context0_settings, + .set_blank = hubp1_set_blank, +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 a59b89b27583..994c49e81a61 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 +@@ -2067,6 +2067,10 @@ void update_dchubp_dpp( + &pipe_ctx->ttu_regs, + &pipe_ctx->rq_regs, + &pipe_ctx->pipe_dlg_param); ++ hubp->funcs->hubp_setup_interdependent( ++ hubp, ++ &pipe_ctx->dlg_regs, ++ &pipe_ctx->ttu_regs); + } + + size.grph.surface_size = pipe_ctx->plane_res.scl_data.viewport; +@@ -2337,6 +2341,32 @@ static void dcn10_apply_ctx_for_surface( + + dcn10_pipe_control_lock(dc, top_pipe_to_program, false); + ++ if (top_pipe_to_program->plane_state && ++ top_pipe_to_program->plane_state->update_flags.bits.full_update) ++ for (i = 0; i < dc->res_pool->pipe_count; i++) { ++ struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; ++ ++ /* Skip inactive pipes and ones already updated */ ++ if (!pipe_ctx->stream || pipe_ctx->stream == stream) ++ continue; ++ ++ pipe_ctx->stream_res.tg->funcs->lock(pipe_ctx->stream_res.tg); ++ ++ pipe_ctx->plane_res.hubp->funcs->hubp_setup_interdependent( ++ pipe_ctx->plane_res.hubp, ++ &pipe_ctx->dlg_regs, ++ &pipe_ctx->ttu_regs); ++ } ++ ++ for (i = 0; i < dc->res_pool->pipe_count; i++) { ++ struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; ++ ++ if (!pipe_ctx->stream || pipe_ctx->stream == stream) ++ continue; ++ ++ dcn10_pipe_control_lock(dc, pipe_ctx, false); ++ } ++ + if (num_planes == 0) + false_optc_underflow_wa(dc, stream, tg); + +diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h b/drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h +index 8f4f40646b4d..04c6989aac58 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h +@@ -63,6 +63,11 @@ struct hubp_funcs { + struct _vcs_dpi_display_rq_regs_st *rq_regs, + struct _vcs_dpi_display_pipe_dest_params_st *pipe_dest); + ++ void (*hubp_setup_interdependent)( ++ struct hubp *hubp, ++ struct _vcs_dpi_display_dlg_regs_st *dlg_regs, ++ struct _vcs_dpi_display_ttu_regs_st *ttu_regs); ++ + void (*dcc_control)(struct hubp *hubp, bool enable, + bool independent_64b_blks); + void (*mem_program_viewport)( +-- +2.17.1 + |