From 7821e089e8f8d7ec06df41a2e4ca7453f0c1af79 Mon Sep 17 00:00:00 2001 From: Dmytro Laktyushkin Date: Tue, 8 Mar 2016 17:35:27 -0500 Subject: [PATCH 0891/1110] drm/amd/dal: Use fine-grained watermarks for support new ASICs Signed-off-by: Dmytro Laktyushkin Acked-by: Harry Wentland Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/dal/dc/calcs/bandwidth_calcs.c | 89 +++++++++++++++++++--- .../drm/amd/dal/dc/dce110/dce110_hw_sequencer.c | 6 +- .../gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c | 13 ++-- drivers/gpu/drm/amd/dal/dc/inc/bandwidth_calcs.h | 2 + drivers/gpu/drm/amd/dal/dc/inc/hw/mem_input.h | 3 +- 5 files changed, 94 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/drm/amd/dal/dc/calcs/bandwidth_calcs.c b/drivers/gpu/drm/amd/dal/dc/calcs/bandwidth_calcs.c index 52557db..c64efe6 100644 --- a/drivers/gpu/drm/amd/dal/dc/calcs/bandwidth_calcs.c +++ b/drivers/gpu/drm/amd/dal/dc/calcs/bandwidth_calcs.c @@ -3879,6 +3879,41 @@ bool bw_calcs(struct dc_context *ctx, const struct bw_calcs_dceip *dceip, bw_mul(high_yclk, bw_int_to_fixed(1000))); /* units: nanosecond, 16bit storage. */ + calcs_output->nbp_state_change_wm_ns[0].a_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + nbp_state_change_watermark[4], bw_int_to_fixed(1000))); + calcs_output->nbp_state_change_wm_ns[1].a_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + nbp_state_change_watermark[5], bw_int_to_fixed(1000))); + calcs_output->nbp_state_change_wm_ns[2].a_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + nbp_state_change_watermark[6], bw_int_to_fixed(1000))); + + calcs_output->stutter_exit_wm_ns[0].a_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + stutter_exit_watermark[4], bw_int_to_fixed(1000))); + calcs_output->stutter_exit_wm_ns[1].a_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + stutter_exit_watermark[5], bw_int_to_fixed(1000))); + calcs_output->stutter_exit_wm_ns[2].a_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + stutter_exit_watermark[6], bw_int_to_fixed(1000))); + + calcs_output->urgent_wm_ns[0].a_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + urgent_watermark[4], bw_int_to_fixed(1000))); + calcs_output->urgent_wm_ns[1].a_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + urgent_watermark[5], bw_int_to_fixed(1000))); + calcs_output->urgent_wm_ns[2].a_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + urgent_watermark[6], bw_int_to_fixed(1000))); + + /*TODO check correctness*/ + ((struct bw_calcs_vbios *)vbios)->low_sclk = mid_sclk; + calculate_bandwidth(dceip, vbios, bw_data_internal, + bw_results_internal); + calcs_output->nbp_state_change_wm_ns[0].b_mark = bw_fixed_to_int(bw_mul(bw_results_internal-> nbp_state_change_watermark[4],bw_int_to_fixed(1000))); @@ -3909,6 +3944,42 @@ bool bw_calcs(struct dc_context *ctx, const struct bw_calcs_dceip *dceip, bw_fixed_to_int(bw_mul(bw_results_internal-> urgent_watermark[6], bw_int_to_fixed(1000))); + /*TODO check correctness*/ + ((struct bw_calcs_vbios *)vbios)->low_sclk = low_sclk; + ((struct bw_calcs_vbios *)vbios)->low_yclk = mid_yclk; + calculate_bandwidth(dceip, vbios, bw_data_internal, + bw_results_internal); + + calcs_output->nbp_state_change_wm_ns[0].c_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + nbp_state_change_watermark[4], bw_int_to_fixed(1000))); + calcs_output->nbp_state_change_wm_ns[1].c_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + nbp_state_change_watermark[5], bw_int_to_fixed(1000))); + calcs_output->nbp_state_change_wm_ns[2].c_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + nbp_state_change_watermark[6], bw_int_to_fixed(1000))); + + calcs_output->stutter_exit_wm_ns[0].c_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + stutter_exit_watermark[4], bw_int_to_fixed(1000))); + calcs_output->stutter_exit_wm_ns[1].c_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + stutter_exit_watermark[5], bw_int_to_fixed(1000))); + calcs_output->stutter_exit_wm_ns[2].c_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + stutter_exit_watermark[6], bw_int_to_fixed(1000))); + + calcs_output->urgent_wm_ns[0].c_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + urgent_watermark[4], bw_int_to_fixed(1000))); + calcs_output->urgent_wm_ns[1].c_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + urgent_watermark[5], bw_int_to_fixed(1000))); + calcs_output->urgent_wm_ns[2].c_mark = + bw_fixed_to_int(bw_mul(bw_results_internal-> + urgent_watermark[6], bw_int_to_fixed(1000))); + ((struct bw_calcs_vbios *)vbios)->low_yclk = high_yclk; ((struct bw_calcs_vbios *)vbios)->mid_yclk = high_yclk; ((struct bw_calcs_vbios *)vbios)->low_sclk = high_sclk; @@ -3917,33 +3988,33 @@ bool bw_calcs(struct dc_context *ctx, const struct bw_calcs_dceip *dceip, calculate_bandwidth(dceip, vbios, bw_data_internal, bw_results_internal); - calcs_output->nbp_state_change_wm_ns[0].a_mark = + calcs_output->nbp_state_change_wm_ns[0].d_mark = bw_fixed_to_int(bw_mul(bw_results_internal-> nbp_state_change_watermark[4], bw_int_to_fixed(1000))); - calcs_output->nbp_state_change_wm_ns[1].a_mark = + calcs_output->nbp_state_change_wm_ns[1].d_mark = bw_fixed_to_int(bw_mul(bw_results_internal-> nbp_state_change_watermark[5], bw_int_to_fixed(1000))); - calcs_output->nbp_state_change_wm_ns[2].a_mark = + calcs_output->nbp_state_change_wm_ns[2].d_mark = bw_fixed_to_int(bw_mul(bw_results_internal-> nbp_state_change_watermark[6], bw_int_to_fixed(1000))); - calcs_output->stutter_exit_wm_ns[0].a_mark = + calcs_output->stutter_exit_wm_ns[0].d_mark = bw_fixed_to_int(bw_mul(bw_results_internal-> stutter_exit_watermark[4], bw_int_to_fixed(1000))); - calcs_output->stutter_exit_wm_ns[1].a_mark = + calcs_output->stutter_exit_wm_ns[1].d_mark = bw_fixed_to_int(bw_mul(bw_results_internal-> stutter_exit_watermark[5], bw_int_to_fixed(1000))); - calcs_output->stutter_exit_wm_ns[2].a_mark = + calcs_output->stutter_exit_wm_ns[2].d_mark = bw_fixed_to_int(bw_mul(bw_results_internal-> stutter_exit_watermark[6], bw_int_to_fixed(1000))); - calcs_output->urgent_wm_ns[0].a_mark = + calcs_output->urgent_wm_ns[0].d_mark = bw_fixed_to_int(bw_mul(bw_results_internal-> urgent_watermark[4], bw_int_to_fixed(1000))); - calcs_output->urgent_wm_ns[1].a_mark = + calcs_output->urgent_wm_ns[1].d_mark = bw_fixed_to_int(bw_mul(bw_results_internal-> urgent_watermark[5], bw_int_to_fixed(1000))); - calcs_output->urgent_wm_ns[2].a_mark = + calcs_output->urgent_wm_ns[2].d_mark = bw_fixed_to_int(bw_mul(bw_results_internal-> urgent_watermark[6], bw_int_to_fixed(1000))); diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c index defaac4..80faa98 100644 --- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c +++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c @@ -1172,8 +1172,10 @@ static void set_displaymarks( static void set_safe_displaymarks(struct resource_context *res_ctx) { uint8_t i; - struct bw_watermarks max_marks = { MAX_WATERMARK, MAX_WATERMARK }; - struct bw_watermarks nbp_marks = { SAFE_NBP_MARK, SAFE_NBP_MARK }; + struct bw_watermarks max_marks = { + MAX_WATERMARK, MAX_WATERMARK, MAX_WATERMARK, MAX_WATERMARK }; + struct bw_watermarks nbp_marks = { + SAFE_NBP_MARK, SAFE_NBP_MARK, SAFE_NBP_MARK, SAFE_NBP_MARK }; for (i = 0; i < MAX_PIPES; i++) { if (res_ctx->pipe_ctx[i].stream == NULL) diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c index e7fc5bd..6f3ca2d 100644 --- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c +++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c @@ -32,7 +32,6 @@ #include "include/logger_interface.h" #include "adapter_service_interface.h" -#include "inc/bandwidth_calcs.h" #include "dce110_mem_input.h" @@ -442,7 +441,7 @@ static void program_urgency_watermark( set_reg_field_value( urgency_cntl, - marks_low.a_mark, + marks_low.d_mark, DPG_PIPE_URGENCY_CONTROL, URGENCY_LOW_WATERMARK); @@ -464,7 +463,7 @@ static void program_urgency_watermark( urgency_cntl = dm_read_reg(ctx, urgency_addr); set_reg_field_value(urgency_cntl, - marks_low.b_mark, + marks_low.a_mark, DPG_PIPE_URGENCY_CONTROL, URGENCY_LOW_WATERMARK); @@ -509,7 +508,7 @@ static void program_stutter_watermark( /*Write watermark set A*/ set_reg_field_value(stutter_cntl, - marks.a_mark, + marks.d_mark, DPG_PIPE_STUTTER_CONTROL, STUTTER_EXIT_SELF_REFRESH_WATERMARK); dm_write_reg(ctx, stutter_addr, stutter_cntl); @@ -534,7 +533,7 @@ static void program_stutter_watermark( /*Write watermark set B*/ set_reg_field_value(stutter_cntl, - marks.b_mark, + marks.a_mark, DPG_PIPE_STUTTER_CONTROL, STUTTER_EXIT_SELF_REFRESH_WATERMARK); dm_write_reg(ctx, stutter_addr, stutter_cntl); @@ -580,7 +579,7 @@ static void program_nbp_watermark( value = dm_read_reg(ctx, addr); set_reg_field_value( value, - marks.a_mark, + marks.d_mark, DPG_PIPE_NB_PSTATE_CHANGE_CONTROL, NB_PSTATE_CHANGE_WATERMARK); dm_write_reg(ctx, addr, value); @@ -618,7 +617,7 @@ static void program_nbp_watermark( value = dm_read_reg(ctx, addr); set_reg_field_value( value, - marks.b_mark, + marks.a_mark, DPG_PIPE_NB_PSTATE_CHANGE_CONTROL, NB_PSTATE_CHANGE_WATERMARK); dm_write_reg(ctx, addr, value); diff --git a/drivers/gpu/drm/amd/dal/dc/inc/bandwidth_calcs.h b/drivers/gpu/drm/amd/dal/dc/inc/bandwidth_calcs.h index ff1ea09..023efd3 100644 --- a/drivers/gpu/drm/amd/dal/dc/inc/bandwidth_calcs.h +++ b/drivers/gpu/drm/amd/dal/dc/inc/bandwidth_calcs.h @@ -465,6 +465,8 @@ struct bw_calcs_results { struct bw_watermarks { uint32_t a_mark; uint32_t b_mark; + uint32_t c_mark; + uint32_t d_mark; }; struct bw_calcs_output { diff --git a/drivers/gpu/drm/amd/dal/dc/inc/hw/mem_input.h b/drivers/gpu/drm/amd/dal/dc/inc/hw/mem_input.h index 3829694..6d7412c 100644 --- a/drivers/gpu/drm/amd/dal/dc/inc/hw/mem_input.h +++ b/drivers/gpu/drm/amd/dal/dc/inc/hw/mem_input.h @@ -25,8 +25,9 @@ #ifndef __DAL_MEM_INPUT_H__ #define __DAL_MEM_INPUT_H__ -#include "include/grph_object_id.h" #include "dc.h" +#include "include/grph_object_id.h" +#include "inc/bandwidth_calcs.h" struct mem_input { struct mem_input_funcs *funcs; -- 2.7.4