aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4082-drm-amd-display-add-renoir-specific-watermark-range-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4082-drm-amd-display-add-renoir-specific-watermark-range-.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4082-drm-amd-display-add-renoir-specific-watermark-range-.patch197
1 files changed, 197 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4082-drm-amd-display-add-renoir-specific-watermark-range-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4082-drm-amd-display-add-renoir-specific-watermark-range-.patch
new file mode 100644
index 00000000..a12845eb
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4082-drm-amd-display-add-renoir-specific-watermark-range-.patch
@@ -0,0 +1,197 @@
+From 474da02b714a2fbdb114f50a82a78919fbd377ea Mon Sep 17 00:00:00 2001
+From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Date: Fri, 13 Sep 2019 11:33:27 -0400
+Subject: [PATCH 4082/4256] drm/amd/display: add renoir specific watermark
+ range and clk helper
+
+Doing this allows us to split it for diffrent asics. This design will
+be helpful for future Asciis.
+
+Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+---
+ .../amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c | 23 +++++++------------
+ .../amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.h | 10 ++++++++
+ .../drm/amd/display/dc/dcn21/dcn21_resource.c | 12 +++++-----
+ .../gpu/drm/amd/display/dc/inc/hw/clk_mgr.h | 3 ++-
+ 4 files changed, 26 insertions(+), 22 deletions(-)
+
+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 ba959f04863c..93e46e376bb1 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
+@@ -472,7 +472,7 @@ struct clk_bw_params rn_bw_params = {
+ }
+ };
+
+-void build_watermark_ranges(struct clk_bw_params *bw_params, struct pp_smu_wm_range_sets *ranges)
++void rn_build_watermark_ranges(struct clk_bw_params *bw_params, struct pp_smu_wm_range_sets *ranges)
+ {
+ int i, num_valid_sets;
+
+@@ -529,7 +529,7 @@ void build_watermark_ranges(struct clk_bw_params *bw_params, struct pp_smu_wm_ra
+
+ }
+
+-unsigned int find_dcfclk_for_voltage(struct dpm_clocks *clock_table, unsigned int voltage)
++static unsigned int find_dcfclk_for_voltage(struct dpm_clocks *clock_table, unsigned int voltage)
+ {
+ int i;
+
+@@ -542,7 +542,7 @@ unsigned int find_dcfclk_for_voltage(struct dpm_clocks *clock_table, unsigned in
+ return 0;
+ }
+
+-void clk_mgr_helper_populate_bw_params(struct clk_bw_params *bw_params, struct dpm_clocks *clock_table, struct hw_asic_id *asic_id)
++void rn_clk_mgr_helper_populate_bw_params(struct clk_bw_params *bw_params, struct dpm_clocks *clock_table, struct hw_asic_id *asic_id)
+ {
+ int i, j = 0;
+
+@@ -557,22 +557,15 @@ void clk_mgr_helper_populate_bw_params(struct clk_bw_params *bw_params, struct d
+ }
+ }
+
+- for (i = 0; i < PP_SMU_NUM_FCLK_DPM_LEVELS; i++) {
+- if (j < 0) {
+- /* Invalid entries */
+- bw_params->clk_table.entries[i].fclk_mhz = 0;
+- continue;
+- }
++ bw_params->clk_table.num_entries = j + 1;
++
++ for (i = 0; i < bw_params->clk_table.num_entries; i++, j--) {
+ bw_params->clk_table.entries[i].fclk_mhz = clock_table->FClocks[j].Freq;
+ bw_params->clk_table.entries[i].memclk_mhz = clock_table->MemClocks[j].Freq;
+ bw_params->clk_table.entries[i].voltage = clock_table->FClocks[j].Vol;
+ bw_params->clk_table.entries[i].dcfclk_mhz = find_dcfclk_for_voltage(clock_table, clock_table->FClocks[j].Vol);
+- j--;
+ }
+
+-
+- bw_params->clk_table.num_entries = i;
+-
+ bw_params->vram_type = asic_id->vram_type;
+ bw_params->num_channels = asic_id->vram_width / DDR4_DRAM_WIDTH;
+
+@@ -658,7 +651,7 @@ void rn_clk_mgr_construct(
+
+ if (pp_smu) {
+ pp_smu->rn_funcs.get_dpm_clock_table(&pp_smu->rn_funcs.pp_smu, &clock_table);
+- clk_mgr_helper_populate_bw_params(clk_mgr->base.bw_params, &clock_table, &ctx->asic_id);
++ rn_clk_mgr_helper_populate_bw_params(clk_mgr->base.bw_params, &clock_table, &ctx->asic_id);
+ }
+
+ /*
+@@ -669,7 +662,7 @@ void rn_clk_mgr_construct(
+ if (!debug->disable_pplib_wm_range) {
+ struct pp_smu_wm_range_sets ranges = {0};
+
+- build_watermark_ranges(clk_mgr->base.bw_params, &ranges);
++ rn_build_watermark_ranges(clk_mgr->base.bw_params, &ranges);
+
+ /* Notify PP Lib/SMU which Watermarks to use for which clock ranges */
+ if (pp_smu && pp_smu->rn_funcs.set_wm_ranges)
+diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.h b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.h
+index 958939049add..761bfda970a5 100644
+--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.h
++++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.h
+@@ -26,10 +26,20 @@
+ #ifndef __RN_CLK_MGR_H__
+ #define __RN_CLK_MGR_H__
+
++#include "clk_mgr.h"
++#include "dm_pp_smu.h"
++
+ struct rn_clk_registers {
+ uint32_t CLK1_CLK0_CURRENT_CNT; /* DPREFCLK */
+ };
+
++void rn_build_watermark_ranges(
++ struct clk_bw_params *bw_params,
++ struct pp_smu_wm_range_sets *ranges);
++void rn_clk_mgr_helper_populate_bw_params(
++ struct clk_bw_params *bw_params,
++ struct dpm_clocks *clock_table,
++ struct hw_asic_id *asic_id);
+ void rn_clk_mgr_construct(struct dc_context *ctx,
+ struct clk_mgr_internal *clk_mgr,
+ struct pp_smu_funcs *pp_smu,
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
+index 06a3d0bcc660..9fdfa213b47c 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
+@@ -1278,7 +1278,6 @@ static void update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_param
+ dcn2_1_ip.max_num_otg = pool->base.res_cap->num_timing_generator;
+ dcn2_1_ip.max_num_dpp = pool->base.pipe_count;
+ dcn2_1_soc.num_chans = bw_params->num_channels;
+- dcn2_1_soc.num_states = 0;
+
+ for (i = 0; i < clk_table->num_entries; i++) {
+
+@@ -1288,8 +1287,9 @@ static void update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_param
+ dcn2_1_soc.clock_limits[i].socclk_mhz = clk_table->entries[i].socclk_mhz;
+ /* This is probably wrong, TODO: find correct calculation */
+ dcn2_1_soc.clock_limits[i].dram_speed_mts = clk_table->entries[i].memclk_mhz * 16 / 1000;
+- dcn2_1_soc.num_states++;
+ }
++ dcn2_1_soc.clock_limits[i] = dcn2_1_soc.clock_limits[i - i];
++ dcn2_1_soc.num_states = i;
+ }
+
+ /* Temporary Place holder until we can get them from fuse */
+@@ -1317,20 +1317,20 @@ static struct dpm_clocks dummy_clocks = {
+
+ };
+
+-enum pp_smu_status dummy_set_wm_ranges(struct pp_smu *pp,
++static enum pp_smu_status dummy_set_wm_ranges(struct pp_smu *pp,
+ struct pp_smu_wm_range_sets *ranges)
+ {
+ return PP_SMU_RESULT_OK;
+ }
+
+-enum pp_smu_status dummy_get_dpm_clock_table(struct pp_smu *pp,
++static enum pp_smu_status dummy_get_dpm_clock_table(struct pp_smu *pp,
+ struct dpm_clocks *clock_table)
+ {
+ *clock_table = dummy_clocks;
+ return PP_SMU_RESULT_OK;
+ }
+
+-struct pp_smu_funcs *dcn21_pp_smu_create(struct dc_context *ctx)
++static struct pp_smu_funcs *dcn21_pp_smu_create(struct dc_context *ctx)
+ {
+ struct pp_smu_funcs *pp_smu = kzalloc(sizeof(*pp_smu), GFP_KERNEL);
+
+@@ -1352,7 +1352,7 @@ struct pp_smu_funcs *dcn21_pp_smu_create(struct dc_context *ctx)
+ return pp_smu;
+ }
+
+-void dcn21_pp_smu_destroy(struct pp_smu_funcs **pp_smu)
++static void dcn21_pp_smu_destroy(struct pp_smu_funcs **pp_smu)
+ {
+ if (pp_smu && *pp_smu) {
+ kfree(*pp_smu);
+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 f0f3d42a0b6f..f2e21cb9fbd5 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
+@@ -47,7 +47,7 @@
+ #ifdef CONFIG_DRM_AMD_DC_DCN2_1
+ /* Will these bw structures be ASIC specific? */
+
+-#define MAX_NUM_DPM_LVL 4
++#define MAX_NUM_DPM_LVL 8
+ #define WM_SET_COUNT 4
+
+
+@@ -149,6 +149,7 @@ struct wm_table {
+ struct clk_bw_params {
+ unsigned int vram_type;
+ unsigned int num_channels;
++ unsigned int dispclk_vco_khz;
+ struct clk_limit_table clk_table;
+ struct wm_table wm_table;
+ };
+--
+2.17.1
+