mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-23 05:03:52 +07:00
drm/amd/powerplay: add callback function of get_thermal_temperature_range
1. the thermal temperature is asic related data, move the code logic to xxx_ppt.c. 2. replace data structure PP_TemperatureRange with smu_temperature_range. 3. change temperature uint from temp*1000 to temp (temperature uint). Signed-off-by: Kevin Wang <kevin1.wang@amd.com> Signed-off-by: Kenneth Feng <kenneth.feng@amd.com> Acked-by: Huang Rui <ray.huang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
95ccc15508
commit
7a81637105
@ -439,7 +439,6 @@ struct smu_table_context
|
||||
struct smu_table *tables;
|
||||
uint32_t table_count;
|
||||
struct smu_table memory_pool;
|
||||
uint16_t software_shutdown_temp;
|
||||
uint8_t thermal_controller_type;
|
||||
uint16_t TDPODLimit;
|
||||
|
||||
|
@ -1639,6 +1639,22 @@ static int navi10_set_performance_level(struct smu_context *smu, enum amd_dpm_fo
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int navi10_get_thermal_temperature_range(struct smu_context *smu,
|
||||
struct smu_temperature_range *range)
|
||||
{
|
||||
struct smu_table_context *table_context = &smu->smu_table;
|
||||
struct smu_11_0_powerplay_table *powerplay_table = table_context->power_play_table;
|
||||
|
||||
if (!range || !powerplay_table)
|
||||
return -EINVAL;
|
||||
|
||||
/* The unit is temperature */
|
||||
range->min = 0;
|
||||
range->max = powerplay_table->software_shutdown_temp;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct pptable_funcs navi10_ppt_funcs = {
|
||||
.tables_init = navi10_tables_init,
|
||||
.alloc_dpm_context = navi10_allocate_dpm_context,
|
||||
@ -1676,6 +1692,7 @@ static const struct pptable_funcs navi10_ppt_funcs = {
|
||||
.get_ppfeature_status = navi10_get_ppfeature_status,
|
||||
.set_ppfeature_status = navi10_set_ppfeature_status,
|
||||
.set_performance_level = navi10_set_performance_level,
|
||||
.get_thermal_temperature_range = navi10_get_thermal_temperature_range,
|
||||
};
|
||||
|
||||
void navi10_set_ppt_funcs(struct smu_context *smu)
|
||||
|
@ -1150,10 +1150,8 @@ static int smu_v11_0_set_thermal_range(struct smu_context *smu,
|
||||
struct smu_temperature_range *range)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
int low = SMU_THERMAL_MINIMUM_ALERT_TEMP *
|
||||
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
|
||||
int high = SMU_THERMAL_MAXIMUM_ALERT_TEMP *
|
||||
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
|
||||
int low = SMU_THERMAL_MINIMUM_ALERT_TEMP;
|
||||
int high = SMU_THERMAL_MAXIMUM_ALERT_TEMP;
|
||||
uint32_t val;
|
||||
|
||||
if (!range)
|
||||
@ -1164,6 +1162,9 @@ static int smu_v11_0_set_thermal_range(struct smu_context *smu,
|
||||
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);
|
||||
|
||||
if (low > high)
|
||||
return -EINVAL;
|
||||
|
||||
@ -1172,8 +1173,8 @@ static int smu_v11_0_set_thermal_range(struct smu_context *smu,
|
||||
val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_IH_HW_ENA, 1);
|
||||
val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_INTH_MASK, 0);
|
||||
val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_INTL_MASK, 0);
|
||||
val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTH, (high / SMU_TEMPERATURE_UNITS_PER_CENTIGRADES));
|
||||
val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTL, (low / SMU_TEMPERATURE_UNITS_PER_CENTIGRADES));
|
||||
val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTH, (high & 0xff));
|
||||
val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTL, (low & 0xff));
|
||||
val = val & (~THM_THERMAL_INT_CTRL__THERM_TRIGGER_MASK_MASK);
|
||||
|
||||
WREG32_SOC15(THM, 0, mmTHM_THERMAL_INT_CTRL, val);
|
||||
@ -1212,7 +1213,10 @@ static int smu_v11_0_start_thermal_control(struct smu_context *smu)
|
||||
|
||||
if (!smu->pm_enabled)
|
||||
return ret;
|
||||
|
||||
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);
|
||||
@ -1237,6 +1241,8 @@ static int smu_v11_0_start_thermal_control(struct smu_context *smu)
|
||||
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.min_temp = range.min * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
|
||||
adev->pm.dpm.thermal.max_temp = range.max * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -463,7 +463,6 @@ static int vega20_store_powerplay_table(struct smu_context *smu)
|
||||
memcpy(table_context->driver_pptable, &powerplay_table->smcPPTable,
|
||||
sizeof(PPTable_t));
|
||||
|
||||
table_context->software_shutdown_temp = powerplay_table->usSoftwareShutdownTemp;
|
||||
table_context->thermal_controller_type = powerplay_table->ucThermalControllerType;
|
||||
table_context->TDPODLimit = le32_to_cpu(powerplay_table->OverDrive8Table.ODSettingsMax[ATOM_VEGA20_ODSETTING_POWERPERCENTAGE]);
|
||||
|
||||
@ -3252,35 +3251,24 @@ static int vega20_set_watermarks_table(struct smu_context *smu,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct smu_temperature_range vega20_thermal_policy[] =
|
||||
{
|
||||
{-273150, 99000, 99000, -273150, 99000, 99000, -273150, 99000, 99000},
|
||||
{ 120000, 120000, 120000, 120000, 120000, 120000, 120000, 120000, 120000},
|
||||
};
|
||||
|
||||
static int vega20_get_thermal_temperature_range(struct smu_context *smu,
|
||||
struct smu_temperature_range *range)
|
||||
{
|
||||
|
||||
struct smu_table_context *table_context = &smu->smu_table;
|
||||
ATOM_Vega20_POWERPLAYTABLE *powerplay_table = table_context->power_play_table;
|
||||
PPTable_t *pptable = smu->smu_table.driver_pptable;
|
||||
|
||||
if (!range)
|
||||
if (!range || !powerplay_table)
|
||||
return -EINVAL;
|
||||
|
||||
memcpy(range, &vega20_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) *
|
||||
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;
|
||||
/* 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);
|
||||
|
||||
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user