aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3932-drm-amd-display-Implementing-new-bandwidth-registers.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3932-drm-amd-display-Implementing-new-bandwidth-registers.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3932-drm-amd-display-Implementing-new-bandwidth-registers.patch234
1 files changed, 234 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3932-drm-amd-display-Implementing-new-bandwidth-registers.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3932-drm-amd-display-Implementing-new-bandwidth-registers.patch
new file mode 100644
index 00000000..ba03f287
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3932-drm-amd-display-Implementing-new-bandwidth-registers.patch
@@ -0,0 +1,234 @@
+From 1bc31aa558d3388c6983032fc1a09ac7304e57ff Mon Sep 17 00:00:00 2001
+From: Mikita Lipski <mikita.lipski@amd.com>
+Date: Wed, 21 Feb 2018 16:57:10 -0500
+Subject: [PATCH 3932/4131] drm/amd/display: Implementing new bandwidth
+ registers for DCE120
+
+Registers are added and defined.
+Programmed to default values.
+Stutter level watermark register is being set to calculated value.
+Urgent level registers are programmed to the same as urgency.
+The programming of the registers is not expected to have any
+functional difference in performance.
+
+Signed-off-by: Mikita Lipski <mikita.lipski@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Acked-by: Harry Wentland <harry.wentland@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c | 58 +++++++++++++++-------
+ drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.h | 9 ++++
+ .../amd/display/dc/dce110/dce110_hw_sequencer.c | 3 ++
+ .../drm/amd/display/dc/dce110/dce110_mem_input_v.c | 1 +
+ drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h | 1 +
+ 5 files changed, 55 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c
+index 0790f25..04fc86bb 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c
++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c
+@@ -174,6 +174,25 @@ static void program_urgency_watermark(
+ URGENCY_HIGH_WATERMARK, urgency_high_wm);
+ }
+
++static void dce120_program_urgency_watermark(
++ struct dce_mem_input *dce_mi,
++ uint32_t wm_select,
++ uint32_t urgency_low_wm,
++ uint32_t urgency_high_wm)
++{
++ REG_UPDATE(DPG_WATERMARK_MASK_CONTROL,
++ URGENCY_WATERMARK_MASK, wm_select);
++
++ REG_SET_2(DPG_PIPE_URGENCY_CONTROL, 0,
++ URGENCY_LOW_WATERMARK, urgency_low_wm,
++ URGENCY_HIGH_WATERMARK, urgency_high_wm);
++
++ REG_SET_2(DPG_PIPE_URGENT_LEVEL_CONTROL, 0,
++ URGENT_LEVEL_LOW_WATERMARK, urgency_low_wm,
++ URGENT_LEVEL_HIGH_WATERMARK, urgency_high_wm);
++
++}
++
+ static void program_nbp_watermark(
+ struct dce_mem_input *dce_mi,
+ uint32_t wm_select,
+@@ -209,23 +228,27 @@ static void program_nbp_watermark(
+ static void program_stutter_watermark(
+ struct dce_mem_input *dce_mi,
+ uint32_t wm_select,
+- uint32_t stutter_mark)
++ uint32_t stutter_mark,
++ uint32_t stutter_entry)
+ {
+ REG_UPDATE(DPG_WATERMARK_MASK_CONTROL,
+ STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK, wm_select);
+
+ if (REG(DPG_PIPE_STUTTER_CONTROL2))
+- REG_UPDATE(DPG_PIPE_STUTTER_CONTROL2,
+- STUTTER_EXIT_SELF_REFRESH_WATERMARK, stutter_mark);
++ REG_UPDATE_2(DPG_PIPE_STUTTER_CONTROL2,
++ STUTTER_EXIT_SELF_REFRESH_WATERMARK, stutter_mark,
++ STUTTER_ENTER_SELF_REFRESH_WATERMARK, stutter_entry);
+ else
+- REG_UPDATE(DPG_PIPE_STUTTER_CONTROL,
+- STUTTER_EXIT_SELF_REFRESH_WATERMARK, stutter_mark);
++ REG_UPDATE_2(DPG_PIPE_STUTTER_CONTROL,
++ STUTTER_EXIT_SELF_REFRESH_WATERMARK, stutter_mark,
++ STUTTER_ENTER_SELF_REFRESH_WATERMARK, stutter_entry);
+ }
+
+ static void dce_mi_program_display_marks(
+ struct mem_input *mi,
+ struct dce_watermarks nbp,
+- struct dce_watermarks stutter,
++ struct dce_watermarks stutter_exit,
++ struct dce_watermarks stutter_enter,
+ struct dce_watermarks urgent,
+ uint32_t total_dest_line_time_ns)
+ {
+@@ -243,26 +266,27 @@ static void dce_mi_program_display_marks(
+ program_nbp_watermark(dce_mi, 2, nbp.a_mark); /* set a */
+ program_nbp_watermark(dce_mi, 1, nbp.d_mark); /* set d */
+
+- program_stutter_watermark(dce_mi, 2, stutter.a_mark); /* set a */
+- program_stutter_watermark(dce_mi, 1, stutter.d_mark); /* set d */
++ program_stutter_watermark(dce_mi, 2, stutter_exit.a_mark, stutter_enter.a_mark); /* set a */
++ program_stutter_watermark(dce_mi, 1, stutter_exit.d_mark, stutter_enter.d_mark); /* set d */
+ }
+
+ static void dce120_mi_program_display_marks(struct mem_input *mi,
+ struct dce_watermarks nbp,
+- struct dce_watermarks stutter,
++ struct dce_watermarks stutter_exit,
++ struct dce_watermarks stutter_entry,
+ struct dce_watermarks urgent,
+ uint32_t total_dest_line_time_ns)
+ {
+ struct dce_mem_input *dce_mi = TO_DCE_MEM_INPUT(mi);
+ uint32_t stutter_en = mi->ctx->dc->debug.disable_stutter ? 0 : 1;
+
+- program_urgency_watermark(dce_mi, 0, /* set a */
++ dce120_program_urgency_watermark(dce_mi, 0, /* set a */
+ urgent.a_mark, total_dest_line_time_ns);
+- program_urgency_watermark(dce_mi, 1, /* set b */
++ dce120_program_urgency_watermark(dce_mi, 1, /* set b */
+ urgent.b_mark, total_dest_line_time_ns);
+- program_urgency_watermark(dce_mi, 2, /* set c */
++ dce120_program_urgency_watermark(dce_mi, 2, /* set c */
+ urgent.c_mark, total_dest_line_time_ns);
+- program_urgency_watermark(dce_mi, 3, /* set d */
++ dce120_program_urgency_watermark(dce_mi, 3, /* set d */
+ urgent.d_mark, total_dest_line_time_ns);
+
+ REG_UPDATE_2(DPG_PIPE_STUTTER_CONTROL,
+@@ -273,10 +297,10 @@ static void dce120_mi_program_display_marks(struct mem_input *mi,
+ program_nbp_watermark(dce_mi, 2, nbp.c_mark); /* set c */
+ program_nbp_watermark(dce_mi, 3, nbp.d_mark); /* set d */
+
+- program_stutter_watermark(dce_mi, 0, stutter.a_mark); /* set a */
+- program_stutter_watermark(dce_mi, 1, stutter.b_mark); /* set b */
+- program_stutter_watermark(dce_mi, 2, stutter.c_mark); /* set c */
+- program_stutter_watermark(dce_mi, 3, stutter.d_mark); /* set d */
++ program_stutter_watermark(dce_mi, 0, stutter_exit.a_mark, stutter_entry.a_mark); /* set a */
++ program_stutter_watermark(dce_mi, 1, stutter_exit.b_mark, stutter_entry.b_mark); /* set b */
++ program_stutter_watermark(dce_mi, 2, stutter_exit.c_mark, stutter_entry.c_mark); /* set c */
++ program_stutter_watermark(dce_mi, 3, stutter_exit.d_mark, stutter_entry.d_mark); /* set d */
+ }
+
+ static void program_tiling(
+diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.h b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.h
+index 05d39c0..e877e73 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.h
++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.h
+@@ -106,6 +106,7 @@ struct dce_mem_input_registers {
+ uint32_t DPG_PIPE_ARBITRATION_CONTROL1;
+ uint32_t DPG_WATERMARK_MASK_CONTROL;
+ uint32_t DPG_PIPE_URGENCY_CONTROL;
++ uint32_t DPG_PIPE_URGENT_LEVEL_CONTROL;
+ uint32_t DPG_PIPE_NB_PSTATE_CHANGE_CONTROL;
+ uint32_t DPG_PIPE_LOW_POWER_CONTROL;
+ uint32_t DPG_PIPE_STUTTER_CONTROL;
+@@ -213,6 +214,11 @@ struct dce_mem_input_registers {
+
+ #define MI_DCE12_DMIF_PG_MASK_SH_LIST(mask_sh, blk)\
+ SFB(blk, DPG_PIPE_STUTTER_CONTROL2, STUTTER_EXIT_SELF_REFRESH_WATERMARK, mask_sh),\
++ SFB(blk, DPG_PIPE_STUTTER_CONTROL2, STUTTER_ENTER_SELF_REFRESH_WATERMARK, mask_sh),\
++ SFB(blk, DPG_PIPE_URGENT_LEVEL_CONTROL, URGENT_LEVEL_LOW_WATERMARK, mask_sh),\
++ SFB(blk, DPG_PIPE_URGENT_LEVEL_CONTROL, URGENT_LEVEL_HIGH_WATERMARK, mask_sh),\
++ SFB(blk, DPG_PIPE_URGENCY_CONTROL, URGENCY_LOW_WATERMARK, mask_sh),\
++ SFB(blk, DPG_PIPE_URGENCY_CONTROL, URGENCY_HIGH_WATERMARK, mask_sh),\
+ SFB(blk, DPG_WATERMARK_MASK_CONTROL, PSTATE_CHANGE_WATERMARK_MASK, mask_sh),\
+ SFB(blk, DPG_PIPE_LOW_POWER_CONTROL, PSTATE_CHANGE_ENABLE, mask_sh),\
+ SFB(blk, DPG_PIPE_LOW_POWER_CONTROL, PSTATE_CHANGE_URGENT_DURING_REQUEST, mask_sh),\
+@@ -286,6 +292,8 @@ struct dce_mem_input_registers {
+ type STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK; \
+ type URGENCY_LOW_WATERMARK; \
+ type URGENCY_HIGH_WATERMARK; \
++ type URGENT_LEVEL_LOW_WATERMARK;\
++ type URGENT_LEVEL_HIGH_WATERMARK;\
+ type NB_PSTATE_CHANGE_ENABLE; \
+ type NB_PSTATE_CHANGE_URGENT_DURING_REQUEST; \
+ type NB_PSTATE_CHANGE_NOT_SELF_REFRESH_DURING_REQUEST; \
+@@ -297,6 +305,7 @@ struct dce_mem_input_registers {
+ type STUTTER_ENABLE; \
+ type STUTTER_IGNORE_FBC; \
+ type STUTTER_EXIT_SELF_REFRESH_WATERMARK; \
++ type STUTTER_ENTER_SELF_REFRESH_WATERMARK; \
+ type DMIF_BUFFERS_ALLOCATED; \
+ type DMIF_BUFFERS_ALLOCATION_COMPLETED; \
+ type ENABLE; /* MC_HUB_RDREQ_DMIF_LIMIT */\
+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 30dd62f..daa4673 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
+@@ -1539,6 +1539,7 @@ static void dce110_set_displaymarks(
+ pipe_ctx->plane_res.mi,
+ context->bw.dce.nbp_state_change_wm_ns[num_pipes],
+ context->bw.dce.stutter_exit_wm_ns[num_pipes],
++ context->bw.dce.stutter_entry_wm_ns[num_pipes],
+ context->bw.dce.urgent_wm_ns[num_pipes],
+ total_dest_line_time_ns);
+ if (i == underlay_idx) {
+@@ -1564,6 +1565,7 @@ static void set_safe_displaymarks(
+ MAX_WATERMARK, MAX_WATERMARK, MAX_WATERMARK, MAX_WATERMARK };
+ struct dce_watermarks nbp_marks = {
+ SAFE_NBP_MARK, SAFE_NBP_MARK, SAFE_NBP_MARK, SAFE_NBP_MARK };
++ struct dce_watermarks min_marks = { 0, 0, 0, 0};
+
+ for (i = 0; i < MAX_PIPES; i++) {
+ if (res_ctx->pipe_ctx[i].stream == NULL || res_ctx->pipe_ctx[i].plane_res.mi == NULL)
+@@ -1573,6 +1575,7 @@ static void set_safe_displaymarks(
+ res_ctx->pipe_ctx[i].plane_res.mi,
+ nbp_marks,
+ max_marks,
++ min_marks,
+ max_marks,
+ MAX_WATERMARK);
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.c
+index 7bab8c6..0564c8e 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.c
++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.c
+@@ -923,6 +923,7 @@ void dce_mem_input_v_program_display_marks(
+ struct mem_input *mem_input,
+ struct dce_watermarks nbp,
+ struct dce_watermarks stutter,
++ struct dce_watermarks stutter_enter,
+ struct dce_watermarks urgent,
+ uint32_t total_dest_line_time_ns)
+ {
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h b/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h
+index 3e1e7e6..47f1dc5 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h
+@@ -104,6 +104,7 @@ struct mem_input_funcs {
+ struct mem_input *mem_input,
+ struct dce_watermarks nbp,
+ struct dce_watermarks stutter,
++ struct dce_watermarks stutter_enter,
+ struct dce_watermarks urgent,
+ uint32_t total_dest_line_time_ns);
+
+--
+2.7.4
+