aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3152-drm-amdgpu-powerplay-provide-the-interface-to-disabl.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3152-drm-amdgpu-powerplay-provide-the-interface-to-disabl.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3152-drm-amdgpu-powerplay-provide-the-interface-to-disabl.patch156
1 files changed, 156 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3152-drm-amdgpu-powerplay-provide-the-interface-to-disabl.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3152-drm-amdgpu-powerplay-provide-the-interface-to-disabl.patch
new file mode 100644
index 00000000..5261fffe
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3152-drm-amdgpu-powerplay-provide-the-interface-to-disabl.patch
@@ -0,0 +1,156 @@
+From be181b4de5913347626303efc0e6ad704e5fccfc Mon Sep 17 00:00:00 2001
+From: Kenneth Feng <kenneth.feng@amd.com>
+Date: Mon, 29 Jul 2019 17:51:55 +0800
+Subject: [PATCH 3152/4256] drm/amdgpu/powerplay: provide the interface to
+ disable uclk switch for DAL
+
+provide the interface for DAL to disable uclk switch on navi10.
+in this case, the uclk will be fixed to maximum.
+this is a workaround when display configuration causes underflow issue.
+
+Signed-off-by: Kenneth Feng <kenneth.feng@amd.com>
+Reviewed-by: Kevin Wang <kevin1.wang@amd.com>
+Reviewed-by: Evan Quan <evan.quan@amd.com>
+---
+ .../amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c | 14 +++++++++++
+ .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 5 ++++
+ drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 25 +++++++++++++++++++
+ drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 7 ++++++
+ 4 files changed, 51 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
+index 7bc7abcf3db1..583f8fbb9027 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
+@@ -802,6 +802,19 @@ enum pp_smu_status pp_nv_set_hard_min_uclk_by_freq(struct pp_smu *pp, int mhz)
+ return PP_SMU_RESULT_OK;
+ }
+
++enum pp_smu_status pp_nv_set_pstate_handshake_support(
++ struct pp_smu *pp, BOOLEAN pstate_handshake_supported)
++{
++ const struct dc_context *ctx = pp->dm;
++ struct amdgpu_device *adev = ctx->driver_context;
++ struct smu_context *smu = &adev->smu;
++
++ if (smu_display_disable_memory_clock_switch(smu, !pstate_handshake_supported))
++ return PP_SMU_RESULT_FAIL;
++
++ return PP_SMU_RESULT_OK;
++}
++
+ enum pp_smu_status pp_nv_set_voltage_by_freq(struct pp_smu *pp,
+ enum pp_smu_nv_clock_id clock_id, int mhz)
+ {
+@@ -917,6 +930,7 @@ void dm_pp_get_funcs(
+ funcs->nv_funcs.get_maximum_sustainable_clocks = pp_nv_get_maximum_sustainable_clocks;
+ /*todo compare data with window driver */
+ funcs->nv_funcs.get_uclk_dpm_states = pp_nv_get_uclk_dpm_states;
++ funcs->nv_funcs.set_pstate_handshake_support = pp_nv_set_pstate_handshake_support;
+ break;
+ #endif
+ default:
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+index ac9e9d5d8a5c..fcd0db362977 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+@@ -365,6 +365,8 @@ struct smu_context
+ #define WATERMARKS_EXIST (1 << 0)
+ #define WATERMARKS_LOADED (1 << 1)
+ uint32_t watermarks_bitmap;
++ uint32_t hard_min_uclk_req_from_dal;
++ bool disable_uclk_switch;
+
+ uint32_t workload_mask;
+ uint32_t workload_prority[WORKLOAD_POLICY_MAX];
+@@ -446,6 +448,7 @@ struct pptable_funcs {
+ int (*get_uclk_dpm_states)(struct smu_context *smu, uint32_t *clocks_in_khz, uint32_t *num_states);
+ int (*set_default_od_settings)(struct smu_context *smu, bool initialize);
+ int (*set_performance_level)(struct smu_context *smu, enum amd_dpm_forced_level level);
++ int (*display_disable_memory_clock_switch)(struct smu_context *smu, bool disable_memory_clock_switch);
+ };
+
+ struct smu_funcs
+@@ -695,6 +698,8 @@ struct smu_funcs
+ ((smu)->ppt_funcs->get_clock_by_type_with_voltage ? (smu)->ppt_funcs->get_clock_by_type_with_voltage((smu), (type), (clocks)) : 0)
+ #define smu_display_clock_voltage_request(smu, clock_req) \
+ ((smu)->funcs->display_clock_voltage_request ? (smu)->funcs->display_clock_voltage_request((smu), (clock_req)) : 0)
++#define smu_display_disable_memory_clock_switch(smu, disable_memory_clock_switch) \
++ ((smu)->ppt_funcs->display_disable_memory_clock_switch ? (smu)->ppt_funcs->display_disable_memory_clock_switch((smu), (disable_memory_clock_switch)) : -EINVAL)
+ #define smu_get_dal_power_level(smu, clocks) \
+ ((smu)->funcs->get_dal_power_level ? (smu)->funcs->get_dal_power_level((smu), (clocks)) : 0)
+ #define smu_get_perf_level(smu, designation, level) \
+diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+index 9dd96d8b8dd5..7706c8e0cfbe 100644
+--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+@@ -1492,6 +1492,30 @@ static int navi10_get_thermal_temperature_range(struct smu_context *smu,
+ return 0;
+ }
+
++static int navi10_display_disable_memory_clock_switch(struct smu_context *smu,
++ bool disable_memory_clock_switch)
++{
++ int ret = 0;
++ struct smu_11_0_max_sustainable_clocks *max_sustainable_clocks =
++ (struct smu_11_0_max_sustainable_clocks *)
++ smu->smu_table.max_sustainable_clocks;
++ uint32_t min_memory_clock = smu->hard_min_uclk_req_from_dal;
++ uint32_t max_memory_clock = max_sustainable_clocks->uclock;
++
++ if(smu->disable_uclk_switch == disable_memory_clock_switch)
++ return 0;
++
++ if(disable_memory_clock_switch)
++ ret = smu_set_hard_freq_range(smu, SMU_UCLK, max_memory_clock, 0);
++ else
++ ret = smu_set_hard_freq_range(smu, SMU_UCLK, min_memory_clock, 0);
++
++ if(!ret)
++ smu->disable_uclk_switch = disable_memory_clock_switch;
++
++ return ret;
++}
++
+ static const struct pptable_funcs navi10_ppt_funcs = {
+ .tables_init = navi10_tables_init,
+ .alloc_dpm_context = navi10_allocate_dpm_context,
+@@ -1528,6 +1552,7 @@ static const struct pptable_funcs navi10_ppt_funcs = {
+ .get_uclk_dpm_states = navi10_get_uclk_dpm_states,
+ .set_performance_level = navi10_set_performance_level,
+ .get_thermal_temperature_range = navi10_get_thermal_temperature_range,
++ .display_disable_memory_clock_switch = navi10_display_disable_memory_clock_switch,
+ };
+
+ void navi10_set_ppt_funcs(struct smu_context *smu)
+diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+index caf02ea4a481..3457e06a5f70 100644
+--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
++++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+@@ -1310,16 +1310,23 @@ smu_v11_0_display_clock_voltage_request(struct smu_context *smu,
+ if (ret)
+ goto failed;
+
++ if (clk_select == SMU_UCLK && smu->disable_uclk_switch)
++ return 0;
++
+ clk_id = smu_clk_get_index(smu, clk_select);
+ if (clk_id < 0) {
+ ret = -EINVAL;
+ goto failed;
+ }
+
++
+ mutex_lock(&smu->mutex);
+ ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetHardMinByFreq,
+ (clk_id << 16) | clk_freq);
+ mutex_unlock(&smu->mutex);
++
++ if(clk_select == SMU_UCLK)
++ smu->hard_min_uclk_req_from_dal = clk_freq;
+ }
+
+ failed:
+--
+2.17.1
+