Preparation for coming optimization which eliminates the influence of
GPU temperature momentary fluctuation.

Signed-off-by: Evan Quan <evan.q...@amd.com>
---
 drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h                |  2 ++
 .../gpu/drm/amd/pm/powerplay/hwmgr/hardwaremanager.c   |  4 +++-
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c    |  2 ++
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c  | 10 ++++++++++
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_hwmgr.c  |  4 ++++
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c  |  4 ++++
 drivers/gpu/drm/amd/pm/powerplay/inc/power_state.h     |  1 +
 7 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h 
b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
index a9161f3da8b5..7faad759a6cc 100644
--- a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
+++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
@@ -90,6 +90,8 @@ struct amdgpu_dpm_thermal {
        int                max_mem_crit_temp;
        /* memory max emergency(shutdown) temp */
        int                max_mem_emergency_temp;
+       /* SWCTF threshold */
+       int                sw_ctf_threshold;
        /* was last interrupt low to high or high to low */
        bool               high_to_low;
        /* interrupt source */
diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/hardwaremanager.c 
b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/hardwaremanager.c
index 981dc8c7112d..90452b66e107 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/hardwaremanager.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/hardwaremanager.c
@@ -241,7 +241,8 @@ int phm_start_thermal_controller(struct pp_hwmgr *hwmgr)
                TEMP_RANGE_MAX,
                TEMP_RANGE_MIN,
                TEMP_RANGE_MAX,
-               TEMP_RANGE_MAX};
+               TEMP_RANGE_MAX,
+               0};
        struct amdgpu_device *adev = hwmgr->adev;
 
        if (!hwmgr->not_vf)
@@ -265,6 +266,7 @@ int phm_start_thermal_controller(struct pp_hwmgr *hwmgr)
        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;
+       adev->pm.dpm.thermal.sw_ctf_threshold = range.sw_ctf_threshold;
 
        return ret;
 }
diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c 
b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
index d82767866ac1..6d887ead2967 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
@@ -5433,6 +5433,8 @@ static int smu7_get_thermal_temperature_range(struct 
pp_hwmgr *hwmgr,
                thermal_data->max = 
data->thermal_temp_setting.temperature_shutdown *
                        PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
 
+       thermal_data->sw_ctf_threshold = thermal_data->max;
+
        return 0;
 }
 
diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c 
b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
index 6f5161738bf8..d8cd23438b76 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
@@ -5242,6 +5242,9 @@ static int vega10_get_thermal_temperature_range(struct 
pp_hwmgr *hwmgr,
 {
        struct vega10_hwmgr *data = hwmgr->backend;
        PPTable_t *pp_table = &(data->smc_state_table.pp_table);
+       struct phm_ppt_v2_information *pp_table_info =
+               (struct phm_ppt_v2_information *)(hwmgr->pptable);
+       struct phm_tdp_table *tdp_table = pp_table_info->tdp_table;
 
        memcpy(thermal_data, &SMU7ThermalWithDelayPolicy[0], sizeof(struct 
PP_TemperatureRange));
 
@@ -5258,6 +5261,13 @@ static int vega10_get_thermal_temperature_range(struct 
pp_hwmgr *hwmgr,
        thermal_data->mem_emergency_max = (pp_table->ThbmLimit + 
CTF_OFFSET_HBM)*
                PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
 
+       if (tdp_table->usSoftwareShutdownTemp > pp_table->ThotspotLimit &&
+           tdp_table->usSoftwareShutdownTemp < 
VEGA10_THERMAL_MAXIMUM_ALERT_TEMP)
+               thermal_data->sw_ctf_threshold = 
tdp_table->usSoftwareShutdownTemp;
+       else
+               thermal_data->sw_ctf_threshold = 
VEGA10_THERMAL_MAXIMUM_ALERT_TEMP;
+       thermal_data->sw_ctf_threshold *= PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
+
        return 0;
 }
 
diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_hwmgr.c 
b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_hwmgr.c
index 33f31461ea6c..1069eaaae2f8 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_hwmgr.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_hwmgr.c
@@ -2764,6 +2764,8 @@ static int vega12_notify_cac_buffer_info(struct pp_hwmgr 
*hwmgr,
 static int vega12_get_thermal_temperature_range(struct pp_hwmgr *hwmgr,
                struct PP_TemperatureRange *thermal_data)
 {
+       struct phm_ppt_v3_information *pptable_information =
+               (struct phm_ppt_v3_information *)hwmgr->pptable;
        struct vega12_hwmgr *data =
                        (struct vega12_hwmgr *)(hwmgr->backend);
        PPTable_t *pp_table = &(data->smc_state_table.pp_table);
@@ -2782,6 +2784,8 @@ static int vega12_get_thermal_temperature_range(struct 
pp_hwmgr *hwmgr,
                PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
        thermal_data->mem_emergency_max = (pp_table->ThbmLimit + 
CTF_OFFSET_HBM)*
                PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
+       thermal_data->sw_ctf_threshold = 
pptable_information->us_software_shutdown_temp *
+               PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
 
        return 0;
 }
diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c 
b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c
index 2a5abac81b4a..ff77a3683efd 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c
@@ -4207,6 +4207,8 @@ static int vega20_notify_cac_buffer_info(struct pp_hwmgr 
*hwmgr,
 static int vega20_get_thermal_temperature_range(struct pp_hwmgr *hwmgr,
                struct PP_TemperatureRange *thermal_data)
 {
+       struct phm_ppt_v3_information *pptable_information =
+               (struct phm_ppt_v3_information *)hwmgr->pptable;
        struct vega20_hwmgr *data =
                        (struct vega20_hwmgr *)(hwmgr->backend);
        PPTable_t *pp_table = &(data->smc_state_table.pp_table);
@@ -4225,6 +4227,8 @@ static int vega20_get_thermal_temperature_range(struct 
pp_hwmgr *hwmgr,
                PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
        thermal_data->mem_emergency_max = (pp_table->ThbmLimit + 
CTF_OFFSET_HBM)*
                PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
+       thermal_data->sw_ctf_threshold = 
pptable_information->us_software_shutdown_temp *
+               PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
 
        return 0;
 }
diff --git a/drivers/gpu/drm/amd/pm/powerplay/inc/power_state.h 
b/drivers/gpu/drm/amd/pm/powerplay/inc/power_state.h
index a5f2227a3971..0ffc2347829d 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/inc/power_state.h
+++ b/drivers/gpu/drm/amd/pm/powerplay/inc/power_state.h
@@ -131,6 +131,7 @@ struct PP_TemperatureRange {
        int mem_min;
        int mem_crit_max;
        int mem_emergency_max;
+       int sw_ctf_threshold;
 };
 
 struct PP_StateValidationBlock {
-- 
2.34.1

Reply via email to