aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3227-drm-amd-pp-Add-update_avfs-call-when-set_power_state.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3227-drm-amd-pp-Add-update_avfs-call-when-set_power_state.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3227-drm-amd-pp-Add-update_avfs-call-when-set_power_state.patch137
1 files changed, 137 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3227-drm-amd-pp-Add-update_avfs-call-when-set_power_state.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3227-drm-amd-pp-Add-update_avfs-call-when-set_power_state.patch
new file mode 100644
index 00000000..f487c604
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3227-drm-amd-pp-Add-update_avfs-call-when-set_power_state.patch
@@ -0,0 +1,137 @@
+From e2faef0bfd1359b63bb363b88ac79a48a1382e7e Mon Sep 17 00:00:00 2001
+From: Rex Zhu <Rex.Zhu@amd.com>
+Date: Tue, 2 Jan 2018 15:20:55 +0800
+Subject: [PATCH 3227/4131] drm/amd/pp: Add update_avfs call when
+ set_power_state
+
+when Overdrive voltage, need to disable AVFS.
+when OverDriv engine clock, need to recalculate
+AVFS voltage by disable/enable avfs feature.
+
+Change-Id: Ie07babaae8957211e36cf5e51767810b33a1b853
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 85 ++++++++++++++++--------
+ 1 file changed, 57 insertions(+), 28 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+index 63463e6..77e28e1 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+@@ -91,7 +91,6 @@ enum DPM_EVENT_SRC {
+ DPM_EVENT_SRC_DIGITAL_OR_EXTERNAL = 4
+ };
+
+-static int smu7_avfs_control(struct pp_hwmgr *hwmgr, bool enable);
+ static const unsigned long PhwVIslands_Magic = (unsigned long)(PHM_VIslands_Magic);
+ static int smu7_force_clock_level(struct pp_hwmgr *hwmgr,
+ enum pp_clock_type type, uint32_t mask);
+@@ -1351,6 +1350,58 @@ static int smu7_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
+ return 0;
+ }
+
++static int smu7_avfs_control(struct pp_hwmgr *hwmgr, bool enable)
++{
++ struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
++
++ if (smu_data == NULL)
++ return -EINVAL;
++
++ if (smu_data->avfs.avfs_btc_status == AVFS_BTC_NOTSUPPORTED)
++ return 0;
++
++ if (enable) {
++ if (!PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device,
++ CGS_IND_REG__SMC, FEATURE_STATUS, AVS_ON)) {
++ PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(
++ hwmgr, PPSMC_MSG_EnableAvfs),
++ "Failed to enable AVFS!",
++ return -EINVAL);
++ }
++ } else if (PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device,
++ CGS_IND_REG__SMC, FEATURE_STATUS, AVS_ON)) {
++ PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(
++ hwmgr, PPSMC_MSG_DisableAvfs),
++ "Failed to disable AVFS!",
++ return -EINVAL);
++ }
++
++ return 0;
++}
++
++static int smu7_update_avfs(struct pp_hwmgr *hwmgr)
++{
++ struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
++ struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
++
++ if (smu_data == NULL)
++ return -EINVAL;
++
++ if (smu_data->avfs.avfs_btc_status == AVFS_BTC_NOTSUPPORTED)
++ return 0;
++
++ if (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_VDDC) {
++ smu7_avfs_control(hwmgr, false);
++ } else if (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_SCLK) {
++ smu7_avfs_control(hwmgr, false);
++ smu7_avfs_control(hwmgr, true);
++ } else {
++ smu7_avfs_control(hwmgr, true);
++ }
++
++ return 0;
++}
++
+ int smu7_disable_dpm_tasks(struct pp_hwmgr *hwmgr)
+ {
+ int tmp_result, result = 0;
+@@ -3845,6 +3896,11 @@ static int smu7_set_power_state_tasks(struct pp_hwmgr *hwmgr, const void *input)
+ "Failed to populate and upload SCLK MCLK DPM levels!",
+ result = tmp_result);
+
++ tmp_result = smu7_update_avfs(hwmgr);
++ PP_ASSERT_WITH_CODE((0 == tmp_result),
++ "Failed to update avfs voltages!",
++ result = tmp_result);
++
+ tmp_result = smu7_generate_dpm_level_enable_mask(hwmgr, input);
+ PP_ASSERT_WITH_CODE((0 == tmp_result),
+ "Failed to generate DPM level enabled mask!",
+@@ -4622,33 +4678,6 @@ static int smu7_set_power_profile_state(struct pp_hwmgr *hwmgr,
+ return result;
+ }
+
+-static int smu7_avfs_control(struct pp_hwmgr *hwmgr, bool enable)
+-{
+- struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
+-
+- if (smu_data == NULL)
+- return -EINVAL;
+-
+- if (smu_data->avfs.avfs_btc_status == AVFS_BTC_NOTSUPPORTED)
+- return 0;
+-
+- if (enable) {
+- if (!PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device,
+- CGS_IND_REG__SMC, FEATURE_STATUS, AVS_ON))
+- PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(
+- hwmgr, PPSMC_MSG_EnableAvfs),
+- "Failed to enable AVFS!",
+- return -EINVAL);
+- } else if (PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device,
+- CGS_IND_REG__SMC, FEATURE_STATUS, AVS_ON))
+- PP_ASSERT_WITH_CODE(!smum_send_msg_to_smc(
+- hwmgr, PPSMC_MSG_DisableAvfs),
+- "Failed to disable AVFS!",
+- return -EINVAL);
+-
+- return 0;
+-}
+-
+ static int smu7_notify_cac_buffer_info(struct pp_hwmgr *hwmgr,
+ uint32_t virtual_addr_low,
+ uint32_t virtual_addr_hi,
+--
+2.7.4
+