aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4081-drm-amd-display-hook-up-notify-watermark-ranges-and-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4081-drm-amd-display-hook-up-notify-watermark-ranges-and-.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4081-drm-amd-display-hook-up-notify-watermark-ranges-and-.patch118
1 files changed, 118 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4081-drm-amd-display-hook-up-notify-watermark-ranges-and-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4081-drm-amd-display-hook-up-notify-watermark-ranges-and-.patch
new file mode 100644
index 00000000..e04489cd
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4081-drm-amd-display-hook-up-notify-watermark-ranges-and-.patch
@@ -0,0 +1,118 @@
+From 8d5223711556b6922e79bdd47ad24fbc7beea733 Mon Sep 17 00:00:00 2001
+From: Eric Yang <Eric.Yang2@amd.com>
+Date: Thu, 22 Aug 2019 11:54:41 -0400
+Subject: [PATCH 4081/4256] drm/amd/display: hook up notify watermark ranges
+ and get clock table
+
+[Why]
+Previously SMU was giving us 0s for the clock table. Now they have valid
+clock table. We should use theirs. Also, need to send SMU watermark
+ranges for selecting optimal watermarks.
+
+Signed-off-by: Eric Yang <Eric.Yang2@amd.com>
+---
+ .../amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c | 44 +++++++++++++++----
+ .../drm/amd/display/dc/dcn21/dcn21_resource.c | 16 +++++--
+ 2 files changed, 48 insertions(+), 12 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 cae6a6f5405d..ba959f04863c 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
+@@ -529,22 +529,48 @@ void build_watermark_ranges(struct clk_bw_params *bw_params, struct pp_smu_wm_ra
+
+ }
+
+-void clk_mgr_helper_populate_bw_params(struct clk_bw_params *bw_params, struct dpm_clocks *clock_table, struct hw_asic_id *asic_id)
++unsigned int find_dcfclk_for_voltage(struct dpm_clocks *clock_table, unsigned int voltage)
+ {
+ int i;
+
++ for (i = 0; i < PP_SMU_NUM_DCFCLK_DPM_LEVELS; i++) {
++ if (clock_table->DcfClocks[i].Vol == voltage)
++ return clock_table->DcfClocks[i].Freq;
++ }
++
++ ASSERT(0);
++ 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)
++{
++ int i, j = 0;
++
+ ASSERT(PP_SMU_NUM_FCLK_DPM_LEVELS <= MAX_NUM_DPM_LVL);
+
+- for (i = 0; i < PP_SMU_NUM_FCLK_DPM_LEVELS; i++) {
+- if (clock_table->FClocks[i].Freq == 0)
++ /* Find lowest DPM, FCLK is filled in reverse order*/
++
++ for (i = PP_SMU_NUM_FCLK_DPM_LEVELS - 1; i >= 0; i--) {
++ if (clock_table->FClocks[i].Freq != 0) {
++ j = i;
+ break;
++ }
++ }
+
+- bw_params->clk_table.entries[i].dcfclk_mhz = clock_table->DcfClocks[i].Freq;
+- bw_params->clk_table.entries[i].fclk_mhz = clock_table->FClocks[i].Freq;
+- bw_params->clk_table.entries[i].memclk_mhz = clock_table->MemClocks[i].Freq;
+- bw_params->clk_table.entries[i].socclk_mhz = clock_table->SocClocks[i].Freq;
+- bw_params->clk_table.entries[i].voltage = clock_table->FClocks[i].Vol;
++ 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.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;
+@@ -553,7 +579,7 @@ void clk_mgr_helper_populate_bw_params(struct clk_bw_params *bw_params, struct d
+ for (i = 0; i < WM_SET_COUNT; i++) {
+ bw_params->wm_table.entries[i].wm_inst = i;
+
+- if (clock_table->FClocks[i].Freq == 0) {
++ if (i >= bw_params->clk_table.num_entries) {
+ bw_params->wm_table.entries[i].valid = false;
+ continue;
+ }
+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 0aa8e8e025e6..06a3d0bcc660 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
+@@ -1334,10 +1334,20 @@ struct pp_smu_funcs *dcn21_pp_smu_create(struct dc_context *ctx)
+ {
+ struct pp_smu_funcs *pp_smu = kzalloc(sizeof(*pp_smu), GFP_KERNEL);
+
+- pp_smu->ctx.ver = PP_SMU_VER_RN;
++ if (!pp_smu)
++ return pp_smu;
+
+- pp_smu->rn_funcs.get_dpm_clock_table = dummy_get_dpm_clock_table;
+- pp_smu->rn_funcs.set_wm_ranges = dummy_set_wm_ranges;
++ if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) {
++ pp_smu->ctx.ver = PP_SMU_VER_RN;
++ pp_smu->rn_funcs.get_dpm_clock_table = dummy_get_dpm_clock_table;
++ pp_smu->rn_funcs.set_wm_ranges = dummy_set_wm_ranges;
++ } else {
++
++ dm_pp_get_funcs(ctx, pp_smu);
++
++ if (pp_smu->ctx.ver != PP_SMU_VER_RN)
++ pp_smu = memset(pp_smu, 0, sizeof(struct pp_smu_funcs));
++ }
+
+ return pp_smu;
+ }
+--
+2.17.1
+