aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4682-drm-amd-display-fix-dprefclk-and-ss-percentage-readi.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4682-drm-amd-display-fix-dprefclk-and-ss-percentage-readi.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4682-drm-amd-display-fix-dprefclk-and-ss-percentage-readi.patch103
1 files changed, 103 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4682-drm-amd-display-fix-dprefclk-and-ss-percentage-readi.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4682-drm-amd-display-fix-dprefclk-and-ss-percentage-readi.patch
new file mode 100644
index 00000000..f6319283
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4682-drm-amd-display-fix-dprefclk-and-ss-percentage-readi.patch
@@ -0,0 +1,103 @@
+From 05da4bf83601928e4f9292175592c4cbf74ef0cd Mon Sep 17 00:00:00 2001
+From: Eric Yang <Eric.Yang2@amd.com>
+Date: Sun, 10 Nov 2019 12:08:02 -0500
+Subject: [PATCH 4682/4736] drm/amd/display: fix dprefclk and ss percentage
+ reading on RN
+
+[Why]
+Before was using HW counter value to determine the dprefclk. Which
+take into account ss, but has large variation, not good enough for
+generating audio dto. Also, the bios parser code to get the ss
+percentage was not working.
+
+[How]
+After this change, dprefclk is hard coded, same as on RV. We don't
+expect this to change on Renoir. Modified bios parser code to get
+the right ss percentage.
+
+Change-Id: Ifed07a5d523b213769b6f7ed4f207cf2dc0108cd
+Signed-off-by: Eric Yang <Eric.Yang2@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+Signed-off-by: Rahul Kumar <rahul.kumar1@amd.com>
+---
+ .../gpu/drm/amd/display/dc/bios/bios_parser2.c | 1 +
+ .../amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c | 16 +++-------------
+ drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h | 1 +
+ 3 files changed, 5 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
+index 8b2426f14519..42babd82ce6b 100644
+--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
++++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
+@@ -832,6 +832,7 @@ static enum bp_result bios_parser_get_spread_spectrum_info(
+ case 1:
+ return get_ss_info_v4_1(bp, signal, index, ss_info);
+ case 2:
++ case 3:
+ return get_ss_info_v4_2(bp, signal, index, ss_info);
+ default:
+ break;
+diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
+index 89ed230cdb26..307c8540e36f 100644
+--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
++++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c
+@@ -675,7 +675,6 @@ void rn_clk_mgr_construct(
+ {
+ struct dc_debug_options *debug = &ctx->dc->debug;
+ struct dpm_clocks clock_table = { 0 };
+- struct clk_state_registers_and_bypass s = { 0 };
+
+ clk_mgr->base.ctx = ctx;
+ clk_mgr->base.funcs = &dcn21_funcs;
+@@ -695,7 +694,6 @@ void rn_clk_mgr_construct(
+ if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) {
+ dcn21_funcs.update_clocks = dcn2_update_clocks_fpga;
+ clk_mgr->base.dentist_vco_freq_khz = 3600000;
+- clk_mgr->base.dprefclk_khz = 600000;
+ } else {
+ struct clk_log_info log_info = {0};
+
+@@ -706,24 +704,16 @@ void rn_clk_mgr_construct(
+ if (clk_mgr->base.dentist_vco_freq_khz == 0)
+ clk_mgr->base.dentist_vco_freq_khz = 3600000;
+
+- rn_dump_clk_registers(&s, &clk_mgr->base, &log_info);
+- /* Convert dprefclk units from MHz to KHz */
+- /* Value already divided by 10, some resolution lost */
+- clk_mgr->base.dprefclk_khz = s.dprefclk * 1000;
+-
+- /* in case we don't get a value from the register, use default */
+- if (clk_mgr->base.dprefclk_khz == 0) {
+- ASSERT(clk_mgr->base.dprefclk_khz == 600000);
+- clk_mgr->base.dprefclk_khz = 600000;
+- }
+-
+ if (ctx->dc_bios->integrated_info->memory_type == LpDdr4MemType) {
+ rn_bw_params.wm_table = lpddr4_wm_table;
+ } else {
+ rn_bw_params.wm_table = ddr4_wm_table;
+ }
++ /* Saved clocks configured at boot for debug purposes */
++ rn_dump_clk_registers(&clk_mgr->base.boot_snapshot, &clk_mgr->base, &log_info);
+ }
+
++ clk_mgr->base.dprefclk_khz = 600000;
+ dce_clock_read_ss_info(clk_mgr);
+
+
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h
+index 026e6a2a2c44..c10cb4b54fae 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h
+@@ -196,6 +196,7 @@ struct clk_mgr {
+ int dprefclk_khz; // Used by program pixel clock in clock source funcs, need to figureout where this goes
+ int dentist_vco_freq_khz;
+ #ifdef CONFIG_DRM_AMD_DC_DCN2_1
++ struct clk_state_registers_and_bypass boot_snapshot;
+ struct clk_bw_params *bw_params;
+ #endif
+ };
+--
+2.17.1
+