diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4752-drm-amd-display-replace-clocks_value-struct-with-dc_.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4752-drm-amd-display-replace-clocks_value-struct-with-dc_.patch | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4752-drm-amd-display-replace-clocks_value-struct-with-dc_.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4752-drm-amd-display-replace-clocks_value-struct-with-dc_.patch new file mode 100644 index 00000000..ef7a4525 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4752-drm-amd-display-replace-clocks_value-struct-with-dc_.patch @@ -0,0 +1,378 @@ +From 2debb6972a470ed43081814f6f9161dd32ce7916 Mon Sep 17 00:00:00 2001 +From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> +Date: Wed, 23 May 2018 13:16:50 -0400 +Subject: [PATCH 4752/5725] drm/amd/display: replace clocks_value struct with + dc_clocks + +This will avoid structs with duplicate information. Also +removes pixel clock voltage request. This has no effect since +pixel clock does not affect dcn voltage and this function only +matters for dcn. + +Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@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> +--- + drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c | 34 ++++++++-------- + drivers/gpu/drm/amd/display/dc/core/dc_link.c | 8 ++-- + drivers/gpu/drm/amd/display/dc/dc.h | 5 +++ + drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c | 46 ++++++++-------------- + .../amd/display/dc/dce110/dce110_hw_sequencer.c | 18 +-------- + drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h | 2 +- + .../gpu/drm/amd/display/dc/inc/hw/display_clock.h | 22 ++--------- + 7 files changed, 49 insertions(+), 86 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c +index 49a4ea4..d8a3165 100644 +--- a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c ++++ b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c +@@ -1145,10 +1145,10 @@ static unsigned int dcn_find_normalized_clock_vdd_Level( + + switch (clocks_type) { + case DM_PP_CLOCK_TYPE_DISPLAY_CLK: +- if (clocks_in_khz > dc->dcn_soc->max_dispclk_vmax0p9*1000) { ++ /*if (clocks_in_khz > dc->dcn_soc->max_dispclk_vmax0p9*1000) { + vdd_level = dcn_bw_v_max0p91; +- BREAK_TO_DEBUGGER(); +- } else if (clocks_in_khz > dc->dcn_soc->max_dispclk_vnom0p8*1000) { ++ //BREAK_TO_DEBUGGER(); ++ } else*/ if (clocks_in_khz > dc->dcn_soc->max_dispclk_vnom0p8*1000) { + vdd_level = dcn_bw_v_max0p9; + } else if (clocks_in_khz > dc->dcn_soc->max_dispclk_vmid0p72*1000) { + vdd_level = dcn_bw_v_nom0p8; +@@ -1158,10 +1158,10 @@ static unsigned int dcn_find_normalized_clock_vdd_Level( + vdd_level = dcn_bw_v_min0p65; + break; + case DM_PP_CLOCK_TYPE_DISPLAYPHYCLK: +- if (clocks_in_khz > dc->dcn_soc->phyclkv_max0p9*1000) { ++ /*if (clocks_in_khz > dc->dcn_soc->phyclkv_max0p9*1000) { + vdd_level = dcn_bw_v_max0p91; + BREAK_TO_DEBUGGER(); +- } else if (clocks_in_khz > dc->dcn_soc->phyclkv_nom0p8*1000) { ++ } else*/ if (clocks_in_khz > dc->dcn_soc->phyclkv_nom0p8*1000) { + vdd_level = dcn_bw_v_max0p9; + } else if (clocks_in_khz > dc->dcn_soc->phyclkv_mid0p72*1000) { + vdd_level = dcn_bw_v_nom0p8; +@@ -1172,10 +1172,10 @@ static unsigned int dcn_find_normalized_clock_vdd_Level( + break; + + case DM_PP_CLOCK_TYPE_DPPCLK: +- if (clocks_in_khz > dc->dcn_soc->max_dppclk_vmax0p9*1000) { ++ /*if (clocks_in_khz > dc->dcn_soc->max_dppclk_vmax0p9*1000) { + vdd_level = dcn_bw_v_max0p91; + BREAK_TO_DEBUGGER(); +- } else if (clocks_in_khz > dc->dcn_soc->max_dppclk_vnom0p8*1000) { ++ } else*/ if (clocks_in_khz > dc->dcn_soc->max_dppclk_vnom0p8*1000) { + vdd_level = dcn_bw_v_max0p9; + } else if (clocks_in_khz > dc->dcn_soc->max_dppclk_vmid0p72*1000) { + vdd_level = dcn_bw_v_nom0p8; +@@ -1189,10 +1189,10 @@ static unsigned int dcn_find_normalized_clock_vdd_Level( + { + unsigned factor = (ddr4_dram_factor_single_Channel * dc->dcn_soc->number_of_channels); + +- if (clocks_in_khz > dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9*1000000/factor) { ++ /*if (clocks_in_khz > dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9*1000000/factor) { + vdd_level = dcn_bw_v_max0p91; + BREAK_TO_DEBUGGER(); +- } else if (clocks_in_khz > dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8*1000000/factor) { ++ } else */if (clocks_in_khz > dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8*1000000/factor) { + vdd_level = dcn_bw_v_max0p9; + } else if (clocks_in_khz > dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72*1000000/factor) { + vdd_level = dcn_bw_v_nom0p8; +@@ -1204,10 +1204,10 @@ static unsigned int dcn_find_normalized_clock_vdd_Level( + break; + + case DM_PP_CLOCK_TYPE_DCFCLK: +- if (clocks_in_khz > dc->dcn_soc->dcfclkv_max0p9*1000) { ++ /*if (clocks_in_khz > dc->dcn_soc->dcfclkv_max0p9*1000) { + vdd_level = dcn_bw_v_max0p91; + BREAK_TO_DEBUGGER(); +- } else if (clocks_in_khz > dc->dcn_soc->dcfclkv_nom0p8*1000) { ++ } else */if (clocks_in_khz > dc->dcn_soc->dcfclkv_nom0p8*1000) { + vdd_level = dcn_bw_v_max0p9; + } else if (clocks_in_khz > dc->dcn_soc->dcfclkv_mid0p72*1000) { + vdd_level = dcn_bw_v_nom0p8; +@@ -1225,27 +1225,27 @@ static unsigned int dcn_find_normalized_clock_vdd_Level( + + unsigned int dcn_find_dcfclk_suits_all( + const struct dc *dc, +- struct clocks_value *clocks) ++ struct dc_clocks *clocks) + { + unsigned vdd_level, vdd_level_temp; + unsigned dcf_clk; + + /*find a common supported voltage level*/ + vdd_level = dcn_find_normalized_clock_vdd_Level( +- dc, DM_PP_CLOCK_TYPE_DISPLAY_CLK, clocks->dispclk_in_khz); ++ dc, DM_PP_CLOCK_TYPE_DISPLAY_CLK, clocks->dispclk_khz); + vdd_level_temp = dcn_find_normalized_clock_vdd_Level( +- dc, DM_PP_CLOCK_TYPE_DISPLAYPHYCLK, clocks->phyclk_in_khz); ++ dc, DM_PP_CLOCK_TYPE_DISPLAYPHYCLK, clocks->phyclk_khz); + + vdd_level = dcn_bw_max(vdd_level, vdd_level_temp); + vdd_level_temp = dcn_find_normalized_clock_vdd_Level( +- dc, DM_PP_CLOCK_TYPE_DPPCLK, clocks->dppclk_in_khz); ++ dc, DM_PP_CLOCK_TYPE_DPPCLK, clocks->dppclk_khz); + vdd_level = dcn_bw_max(vdd_level, vdd_level_temp); + + vdd_level_temp = dcn_find_normalized_clock_vdd_Level( +- dc, DM_PP_CLOCK_TYPE_MEMORY_CLK, clocks->dcfclock_in_khz); ++ dc, DM_PP_CLOCK_TYPE_MEMORY_CLK, clocks->fclk_khz); + vdd_level = dcn_bw_max(vdd_level, vdd_level_temp); + vdd_level_temp = dcn_find_normalized_clock_vdd_Level( +- dc, DM_PP_CLOCK_TYPE_DCFCLK, clocks->dcfclock_in_khz); ++ dc, DM_PP_CLOCK_TYPE_DCFCLK, clocks->dcfclk_khz); + + /*find that level conresponding dcfclk*/ + vdd_level = dcn_bw_max(vdd_level, vdd_level_temp); +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +index 53f9db9..af9e0db 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +@@ -1290,15 +1290,13 @@ static enum dc_status enable_link_dp( + state->dis_clk, DM_PP_CLOCKS_STATE_NOMINAL); + } else { + uint32_t dp_phyclk_in_khz; +- const struct clocks_value clocks_value = +- state->dis_clk->cur_clocks_value; ++ const struct dc_clocks clocks_value = ++ state->dis_clk->clks; + + /* 27mhz = 27000000hz= 27000khz */ + dp_phyclk_in_khz = link_settings.link_rate * 27000; + +- if (((clocks_value.max_non_dp_phyclk_in_khz != 0) && +- (dp_phyclk_in_khz > clocks_value.max_non_dp_phyclk_in_khz)) || +- (dp_phyclk_in_khz > clocks_value.max_dp_phyclk_in_khz)) { ++ if (dp_phyclk_in_khz > clocks_value.phyclk_khz) { + state->dis_clk->funcs->apply_clock_voltage_request( + state->dis_clk, + DM_PP_CLOCK_TYPE_DISPLAYPHYCLK, +diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h +index 56c1e2b..3471485 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc.h ++++ b/drivers/gpu/drm/amd/display/dc/dc.h +@@ -187,6 +187,10 @@ enum wm_report_mode { + WM_REPORT_OVERRIDE = 1, + }; + ++/* ++ * For any clocks that may differ per pipe ++ * only the max is stored in this structure ++ */ + struct dc_clocks { + int dispclk_khz; + int max_supported_dppclk_khz; +@@ -195,6 +199,7 @@ struct dc_clocks { + int socclk_khz; + int dcfclk_deep_sleep_khz; + int fclk_khz; ++ int phyclk_khz; + }; + + struct dc_debug { +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c +index 8a581c6..b749a20 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c +@@ -560,11 +560,9 @@ static bool dce_apply_clock_voltage_request( + + switch (clocks_type) { + case DM_PP_CLOCK_TYPE_DISPLAY_CLK: +- case DM_PP_CLOCK_TYPE_PIXELCLK: + case DM_PP_CLOCK_TYPE_DISPLAYPHYCLK: + break; + default: +- BREAK_TO_DEBUGGER(); + return false; + } + +@@ -575,31 +573,22 @@ static bool dce_apply_clock_voltage_request( + if (pre_mode_set) { + switch (clocks_type) { + case DM_PP_CLOCK_TYPE_DISPLAY_CLK: +- if (clocks_in_khz > clk->cur_clocks_value.dispclk_in_khz) { +- clk->cur_clocks_value.dispclk_notify_pplib_done = true; ++ if (clocks_in_khz > clk->clks.dispclk_khz) { ++ clk->dispclk_notify_pplib_done = true; + send_request = true; + } else +- clk->cur_clocks_value.dispclk_notify_pplib_done = false; ++ clk->dispclk_notify_pplib_done = false; + /* no matter incrase or decrase clock, update current clock value */ +- clk->cur_clocks_value.dispclk_in_khz = clocks_in_khz; +- break; +- case DM_PP_CLOCK_TYPE_PIXELCLK: +- if (clocks_in_khz > clk->cur_clocks_value.max_pixelclk_in_khz) { +- clk->cur_clocks_value.pixelclk_notify_pplib_done = true; +- send_request = true; +- } else +- clk->cur_clocks_value.pixelclk_notify_pplib_done = false; +- /* no matter incrase or decrase clock, update current clock value */ +- clk->cur_clocks_value.max_pixelclk_in_khz = clocks_in_khz; ++ clk->clks.dispclk_khz = clocks_in_khz; + break; + case DM_PP_CLOCK_TYPE_DISPLAYPHYCLK: +- if (clocks_in_khz > clk->cur_clocks_value.max_non_dp_phyclk_in_khz) { +- clk->cur_clocks_value.phyclk_notigy_pplib_done = true; ++ if (clocks_in_khz > clk->clks.phyclk_khz) { ++ clk->phyclk_notify_pplib_done = true; + send_request = true; + } else +- clk->cur_clocks_value.phyclk_notigy_pplib_done = false; ++ clk->phyclk_notify_pplib_done = false; + /* no matter incrase or decrase clock, update current clock value */ +- clk->cur_clocks_value.max_non_dp_phyclk_in_khz = clocks_in_khz; ++ clk->clks.phyclk_khz = clocks_in_khz; + break; + default: + ASSERT(0); +@@ -609,16 +598,14 @@ static bool dce_apply_clock_voltage_request( + } else { + switch (clocks_type) { + case DM_PP_CLOCK_TYPE_DISPLAY_CLK: +- if (!clk->cur_clocks_value.dispclk_notify_pplib_done) +- send_request = true; +- break; +- case DM_PP_CLOCK_TYPE_PIXELCLK: +- if (!clk->cur_clocks_value.pixelclk_notify_pplib_done) ++ if (!clk->dispclk_notify_pplib_done) + send_request = true; ++ clk->dispclk_notify_pplib_done = true; + break; + case DM_PP_CLOCK_TYPE_DISPLAYPHYCLK: +- if (!clk->cur_clocks_value.phyclk_notigy_pplib_done) ++ if (!clk->phyclk_notify_pplib_done) + send_request = true; ++ clk->phyclk_notify_pplib_done = true; + break; + default: + ASSERT(0); +@@ -627,20 +614,21 @@ static bool dce_apply_clock_voltage_request( + } + if (send_request) { + #if defined(CONFIG_DRM_AMD_DC_DCN1_0) +- if (clk->ctx->dce_version >= DCN_VERSION_1_0) { ++ if (clk->ctx->dce_version >= DCN_VERSION_1_0 ++ ) { + struct dc *core_dc = clk->ctx->dc; + /*use dcfclk request voltage*/ + clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DCFCLK; + clock_voltage_req.clocks_in_khz = +- dcn_find_dcfclk_suits_all(core_dc, &clk->cur_clocks_value); ++ dcn_find_dcfclk_suits_all(core_dc, &clk->clks); + } + #endif + dm_pp_apply_clock_for_voltage_request( + clk->ctx, &clock_voltage_req); + } + if (update_dp_phyclk && (clocks_in_khz > +- clk->cur_clocks_value.max_dp_phyclk_in_khz)) +- clk->cur_clocks_value.max_dp_phyclk_in_khz = clocks_in_khz; ++ clk->clks.phyclk_khz)) ++ clk->clks.phyclk_khz = clocks_in_khz; + + return true; + } +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 57d8113..e540172 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 +@@ -1800,21 +1800,14 @@ static void apply_min_clocks( + context->dis_clk->funcs->apply_clock_voltage_request( + context->dis_clk, + DM_PP_CLOCK_TYPE_DISPLAY_CLK, +- context->dis_clk->cur_clocks_value.dispclk_in_khz, +- pre_mode_set, +- false); +- +- context->dis_clk->funcs->apply_clock_voltage_request( +- context->dis_clk, +- DM_PP_CLOCK_TYPE_PIXELCLK, +- context->dis_clk->cur_clocks_value.max_pixelclk_in_khz, ++ context->dis_clk->clks.dispclk_khz, + pre_mode_set, + false); + + context->dis_clk->funcs->apply_clock_voltage_request( + context->dis_clk, + DM_PP_CLOCK_TYPE_DISPLAYPHYCLK, +- context->dis_clk->cur_clocks_value.max_non_dp_phyclk_in_khz, ++ context->dis_clk->clks.phyclk_khz, + pre_mode_set, + false); + return; +@@ -1843,13 +1836,6 @@ static void apply_min_clocks( + + context->dis_clk->funcs->apply_clock_voltage_request( + context->dis_clk, +- DM_PP_CLOCK_TYPE_PIXELCLK, +- req_clocks.pixel_clk_khz, +- pre_mode_set, +- false); +- +- context->dis_clk->funcs->apply_clock_voltage_request( +- context->dis_clk, + DM_PP_CLOCK_TYPE_DISPLAYPHYCLK, + req_clocks.pixel_clk_khz, + pre_mode_set, +diff --git a/drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h b/drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h +index 132d18d..ddbb673 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h +@@ -625,7 +625,7 @@ bool dcn_validate_bandwidth( + + unsigned int dcn_find_dcfclk_suits_all( + const struct dc *dc, +- struct clocks_value *clocks); ++ struct dc_clocks *clocks); + + void dcn_bw_update_from_pplib(struct dc *dc); + void dcn_bw_notify_pplib_of_wm_ranges(struct dc *dc); +diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/display_clock.h b/drivers/gpu/drm/amd/display/dc/inc/hw/display_clock.h +index f5f69cd..6b9ca55 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/hw/display_clock.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/display_clock.h +@@ -27,23 +27,7 @@ + #define __DISPLAY_CLOCK_H__ + + #include "dm_services_types.h" +- +- +-struct clocks_value { +- int dispclk_in_khz; +- int max_pixelclk_in_khz; +- int max_non_dp_phyclk_in_khz; +- int max_dp_phyclk_in_khz; +- bool dispclk_notify_pplib_done; +- bool pixelclk_notify_pplib_done; +- bool phyclk_notigy_pplib_done; +- int dcfclock_in_khz; +- int dppclk_in_khz; +- int mclk_in_khz; +- int phyclk_in_khz; +- int common_vdd_level; +-}; +- ++#include "dc.h" + + /* Structure containing all state-dependent clocks + * (dependent on "enum clocks_state") */ +@@ -56,9 +40,11 @@ struct display_clock { + struct dc_context *ctx; + const struct display_clock_funcs *funcs; + ++ bool dispclk_notify_pplib_done; ++ bool phyclk_notify_pplib_done; + enum dm_pp_clocks_state max_clks_state; + enum dm_pp_clocks_state cur_min_clks_state; +- struct clocks_value cur_clocks_value; ++ struct dc_clocks clks; + }; + + struct display_clock_funcs { +-- +2.7.4 + |