diff options
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.patch | 220 |
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 + |