drm/amd/powerplay: correct SW smu11 thermal range settings
authorEvan Quan <evan.quan@amd.com>
Fri, 16 Aug 2019 09:11:46 +0000 (17:11 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 22 Aug 2019 03:17:49 +0000 (22:17 -0500)
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.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
drivers/gpu/drm/amd/powerplay/navi10_ppt.c
drivers/gpu/drm/amd/powerplay/smu_v11_0.c
drivers/gpu/drm/amd/powerplay/vega20_ppt.c

index 049f36ed97bb90e3417cbde51ea96f5c761f32e2..715b1822db618ab961fe5d03e9928f9b01222415 100644 (file)
@@ -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;
 }
 
index ca76e302bc66cac4a99a030b1e76a1d4274787f4..5bda8539447acfddf0c3451180cff45ed10ca3b4 100644 (file)
 #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;
index 3f9f68d900168b9ba202faa3382518d425dfff9c..d7e25f5113f141b210b5ff54e7d67ec3c2681b0c 100644 (file)
@@ -1504,9 +1504,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;
 }
index f5d163b3777c8a8e19421e1577c0f27e1e80de25..5ff0ad439cdc09bd34b4218cc1088df3684a16f0 100644 (file)
@@ -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;
 }
index a23c16ceef74b9621514417ec4c12575bc8fa422..7ab93f27b15ebfcbc7c1501881da0d3a491040ce 100644 (file)
@@ -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;