aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3477-drm-amd-powerplay-correct-SW-smu11-thermal-range-set.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3477-drm-amd-powerplay-correct-SW-smu11-thermal-range-set.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3477-drm-amd-powerplay-correct-SW-smu11-thermal-range-set.patch220
1 files changed, 220 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3477-drm-amd-powerplay-correct-SW-smu11-thermal-range-set.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3477-drm-amd-powerplay-correct-SW-smu11-thermal-range-set.patch
new file mode 100644
index 00000000..37b73f64
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3477-drm-amd-powerplay-correct-SW-smu11-thermal-range-set.patch
@@ -0,0 +1,220 @@
+From 493b140ed92cbdec7f7476b9d5fa5f9c82c2d5eb Mon Sep 17 00:00:00 2001
+From: Evan Quan <evan.quan@amd.com>
+Date: Fri, 16 Aug 2019 17:11:46 +0800
+Subject: [PATCH 3477/4256] drm/amd/powerplay: correct SW smu11 thermal range
+ settings
+
+Problems with current settings:
+1. The min value was overrided to 0 on Vega20 & Navi10. While
+ the expected should be -273.15 C.
+2. The thermal min/max threshold was output in wrong unit on
+ Navi10 & Arcturus. As TEMP_RANGE_MIN/MAX is already in
+ millicelsius. And "*1000" in smu_v11_0_start_thermal_control
+ makes the output wrongly.
+
+Change-Id: I2f1866edd1baf264f521310343f492eaede26c33
+Signed-off-by: Evan Quan <evan.quan@amd.com>
+Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/arcturus_ppt.c | 10 ----
+ drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h | 6 +++
+ drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 5 +-
+ drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 51 +++++++------------
+ drivers/gpu/drm/amd/powerplay/vega20_ppt.c | 20 +++++---
+ 5 files changed, 38 insertions(+), 54 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
+index 0eb85702f7ed..58fc5d0c126b 100644
+--- a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
+@@ -878,23 +878,14 @@ static int arcturus_force_clk_levels(struct smu_context *smu,
+ return ret;
+ }
+
+-static const struct smu_temperature_range arcturus_thermal_policy[] =
+-{
+- {-273150, 99000, 99000, -273150, 99000, 99000, -273150, 99000, 99000},
+- { 120000, 120000, 120000, 120000, 120000, 120000, 120000, 120000, 120000},
+-};
+-
+ static int arcturus_get_thermal_temperature_range(struct smu_context *smu,
+ struct smu_temperature_range *range)
+ {
+-
+ PPTable_t *pptable = smu->smu_table.driver_pptable;
+
+ if (!range)
+ return -EINVAL;
+
+- memcpy(range, &arcturus_thermal_policy[0], sizeof(struct smu_temperature_range));
+-
+ range->max = pptable->TedgeLimit *
+ SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+ range->edge_emergency_max = (pptable->TedgeLimit + CTF_OFFSET_EDGE) *
+@@ -908,7 +899,6 @@ static int arcturus_get_thermal_temperature_range(struct smu_context *smu,
+ range->mem_emergency_max = (pptable->TmemLimit + CTF_OFFSET_HBM)*
+ SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+
+-
+ return 0;
+ }
+
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
+index 0a22fa48ff5a..59b2045e37e4 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
+@@ -64,6 +64,12 @@
+ #define WORKLOAD_MAP(profile, workload) \
+ [profile] = {1, (workload)}
+
++static const struct smu_temperature_range smu11_thermal_policy[] =
++{
++ {-273150, 99000, 99000, -273150, 99000, 99000, -273150, 99000, 99000},
++ { 120000, 120000, 120000, 120000, 120000, 120000, 120000, 120000, 120000},
++};
++
+ struct smu_11_0_cmn2aisc_mapping {
+ int valid_mapping;
+ int map_to;
+diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+index 920156e9fb9d..2d908afbf525 100644
+--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+@@ -1503,9 +1503,8 @@ static int navi10_get_thermal_temperature_range(struct smu_context *smu,
+ if (!range || !powerplay_table)
+ return -EINVAL;
+
+- /* The unit is temperature */
+- range->min = 0;
+- range->max = powerplay_table->software_shutdown_temp;
++ range->max = powerplay_table->software_shutdown_temp *
++ SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+
+ return 0;
+ }
+diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+index 16d7768dca9b..f5efe8b5e96c 100644
+--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
++++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+@@ -1127,23 +1127,17 @@ static int smu_v11_0_get_current_clk_freq(struct smu_context *smu,
+ }
+
+ static int smu_v11_0_set_thermal_range(struct smu_context *smu,
+- struct smu_temperature_range *range)
++ struct smu_temperature_range range)
+ {
+ struct amdgpu_device *adev = smu->adev;
+ int low = SMU_THERMAL_MINIMUM_ALERT_TEMP;
+ int high = SMU_THERMAL_MAXIMUM_ALERT_TEMP;
+ uint32_t val;
+
+- if (!range)
+- return -EINVAL;
+-
+- if (low < range->min)
+- low = range->min;
+- if (high > range->max)
+- high = range->max;
+-
+- low = max(SMU_THERMAL_MINIMUM_ALERT_TEMP, range->min);
+- high = min(SMU_THERMAL_MAXIMUM_ALERT_TEMP, range->max);
++ low = max(SMU_THERMAL_MINIMUM_ALERT_TEMP,
++ range.min / SMU_TEMPERATURE_UNITS_PER_CENTIGRADES);
++ high = min(SMU_THERMAL_MAXIMUM_ALERT_TEMP,
++ range.max / SMU_TEMPERATURE_UNITS_PER_CENTIGRADES);
+
+ if (low > high)
+ return -EINVAL;
+@@ -1179,27 +1173,20 @@ static int smu_v11_0_enable_thermal_alert(struct smu_context *smu)
+ static int smu_v11_0_start_thermal_control(struct smu_context *smu)
+ {
+ int ret = 0;
+- struct smu_temperature_range range = {
+- TEMP_RANGE_MIN,
+- TEMP_RANGE_MAX,
+- TEMP_RANGE_MAX,
+- TEMP_RANGE_MIN,
+- TEMP_RANGE_MAX,
+- TEMP_RANGE_MAX,
+- TEMP_RANGE_MIN,
+- TEMP_RANGE_MAX,
+- TEMP_RANGE_MAX};
++ struct smu_temperature_range range;
+ struct amdgpu_device *adev = smu->adev;
+
+ if (!smu->pm_enabled)
+ return ret;
+
++ memcpy(&range, &smu11_thermal_policy[0], sizeof(struct smu_temperature_range));
++
+ ret = smu_get_thermal_temperature_range(smu, &range);
+ if (ret)
+ return ret;
+
+ if (smu->smu_table.thermal_controller_type) {
+- ret = smu_v11_0_set_thermal_range(smu, &range);
++ ret = smu_v11_0_set_thermal_range(smu, range);
+ if (ret)
+ return ret;
+
+@@ -1212,17 +1199,15 @@ static int smu_v11_0_start_thermal_control(struct smu_context *smu)
+ return ret;
+ }
+
+- adev->pm.dpm.thermal.min_temp = range.min * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+- adev->pm.dpm.thermal.max_temp = range.max * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+- adev->pm.dpm.thermal.max_edge_emergency_temp = range.edge_emergency_max * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+- adev->pm.dpm.thermal.min_hotspot_temp = range.hotspot_min * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+- adev->pm.dpm.thermal.max_hotspot_crit_temp = range.hotspot_crit_max * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+- adev->pm.dpm.thermal.max_hotspot_emergency_temp = range.hotspot_emergency_max * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+- adev->pm.dpm.thermal.min_mem_temp = range.mem_min * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+- adev->pm.dpm.thermal.max_mem_crit_temp = range.mem_crit_max * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+- adev->pm.dpm.thermal.max_mem_emergency_temp = range.mem_emergency_max * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+- adev->pm.dpm.thermal.min_temp = range.min * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+- adev->pm.dpm.thermal.max_temp = range.max * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
++ adev->pm.dpm.thermal.min_temp = range.min;
++ adev->pm.dpm.thermal.max_temp = range.max;
++ adev->pm.dpm.thermal.max_edge_emergency_temp = range.edge_emergency_max;
++ adev->pm.dpm.thermal.min_hotspot_temp = range.hotspot_min;
++ adev->pm.dpm.thermal.max_hotspot_crit_temp = range.hotspot_crit_max;
++ adev->pm.dpm.thermal.max_hotspot_emergency_temp = range.hotspot_emergency_max;
++ adev->pm.dpm.thermal.min_mem_temp = range.mem_min;
++ adev->pm.dpm.thermal.max_mem_crit_temp = range.mem_crit_max;
++ adev->pm.dpm.thermal.max_mem_emergency_temp = range.mem_emergency_max;
+
+ return ret;
+ }
+diff --git a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
+index acf075393c13..e14363182691 100644
+--- a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
+@@ -3113,14 +3113,18 @@ static int vega20_get_thermal_temperature_range(struct smu_context *smu,
+ if (!range || !powerplay_table)
+ return -EINVAL;
+
+- /* The unit is temperature */
+- range->min = 0;
+- range->max = powerplay_table->usSoftwareShutdownTemp;
+- range->edge_emergency_max = (pptable->TedgeLimit + CTF_OFFSET_EDGE);
+- range->hotspot_crit_max = pptable->ThotspotLimit;
+- range->hotspot_emergency_max = (pptable->ThotspotLimit + CTF_OFFSET_HOTSPOT);
+- range->mem_crit_max = pptable->ThbmLimit;
+- range->mem_emergency_max = (pptable->ThbmLimit + CTF_OFFSET_HBM);
++ range->max = powerplay_table->usSoftwareShutdownTemp *
++ SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
++ range->edge_emergency_max = (pptable->TedgeLimit + CTF_OFFSET_EDGE) *
++ SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
++ range->hotspot_crit_max = pptable->ThotspotLimit *
++ SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
++ range->hotspot_emergency_max = (pptable->ThotspotLimit + CTF_OFFSET_HOTSPOT) *
++ SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
++ range->mem_crit_max = pptable->ThbmLimit *
++ SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
++ range->mem_emergency_max = (pptable->ThbmLimit + CTF_OFFSET_HBM) *
++ SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
+
+
+ return 0;
+--
+2.17.1
+