drm/amdgpu: add the fan abnormal detection feature
Update the SW CTF limit from existing register when there's a fan failure detected via SMU interrupt. Signed-off-by: lyndonli <Lyndon.Li@amd.com> Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com> Reviewed-by: Kenneth Feng <kenneth.feng@amd.com> Reviewed-by: Evan Quan <evan.quan@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
1ec13219a1
commit
ef5fca9f72
@ -168,6 +168,7 @@ struct smu_temperature_range {
|
|||||||
int mem_crit_max;
|
int mem_crit_max;
|
||||||
int mem_emergency_max;
|
int mem_emergency_max;
|
||||||
int software_shutdown_temp;
|
int software_shutdown_temp;
|
||||||
|
int software_shutdown_temp_offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct smu_state_validation_block {
|
struct smu_state_validation_block {
|
||||||
|
@ -1376,6 +1376,7 @@ static int smu_v13_0_irq_process(struct amdgpu_device *adev,
|
|||||||
*/
|
*/
|
||||||
uint32_t ctxid = entry->src_data[0];
|
uint32_t ctxid = entry->src_data[0];
|
||||||
uint32_t data;
|
uint32_t data;
|
||||||
|
uint32_t high;
|
||||||
|
|
||||||
if (client_id == SOC15_IH_CLIENTID_THM) {
|
if (client_id == SOC15_IH_CLIENTID_THM) {
|
||||||
switch (src_id) {
|
switch (src_id) {
|
||||||
@ -1432,6 +1433,33 @@ static int smu_v13_0_irq_process(struct amdgpu_device *adev,
|
|||||||
schedule_work(&smu->throttling_logging_work);
|
schedule_work(&smu->throttling_logging_work);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
case 0x8:
|
||||||
|
high = smu->thermal_range.software_shutdown_temp +
|
||||||
|
smu->thermal_range.software_shutdown_temp_offset;
|
||||||
|
high = min(SMU_THERMAL_MAXIMUM_ALERT_TEMP, high);
|
||||||
|
dev_emerg(adev->dev, "Reduce soft CTF limit to %d (by an offset %d)\n",
|
||||||
|
high,
|
||||||
|
smu->thermal_range.software_shutdown_temp_offset);
|
||||||
|
|
||||||
|
data = RREG32_SOC15(THM, 0, regTHM_THERMAL_INT_CTRL);
|
||||||
|
data = REG_SET_FIELD(data, THM_THERMAL_INT_CTRL,
|
||||||
|
DIG_THERM_INTH,
|
||||||
|
(high & 0xff));
|
||||||
|
data = data & (~THM_THERMAL_INT_CTRL__THERM_TRIGGER_MASK_MASK);
|
||||||
|
WREG32_SOC15(THM, 0, regTHM_THERMAL_INT_CTRL, data);
|
||||||
|
break;
|
||||||
|
case 0x9:
|
||||||
|
high = min(SMU_THERMAL_MAXIMUM_ALERT_TEMP,
|
||||||
|
smu->thermal_range.software_shutdown_temp);
|
||||||
|
dev_emerg(adev->dev, "Recover soft CTF limit to %d\n", high);
|
||||||
|
|
||||||
|
data = RREG32_SOC15(THM, 0, regTHM_THERMAL_INT_CTRL);
|
||||||
|
data = REG_SET_FIELD(data, THM_THERMAL_INT_CTRL,
|
||||||
|
DIG_THERM_INTH,
|
||||||
|
(high & 0xff));
|
||||||
|
data = data & (~THM_THERMAL_INT_CTRL__THERM_TRIGGER_MASK_MASK);
|
||||||
|
WREG32_SOC15(THM, 0, regTHM_THERMAL_INT_CTRL, data);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1223,6 +1223,7 @@ static int smu_v13_0_7_get_thermal_temperature_range(struct smu_context *smu,
|
|||||||
range->mem_emergency_max = (pptable->SkuTable.TemperatureLimit[TEMP_MEM] + CTF_OFFSET_MEM)*
|
range->mem_emergency_max = (pptable->SkuTable.TemperatureLimit[TEMP_MEM] + CTF_OFFSET_MEM)*
|
||||||
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
|
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
|
||||||
range->software_shutdown_temp = powerplay_table->software_shutdown_temp;
|
range->software_shutdown_temp = powerplay_table->software_shutdown_temp;
|
||||||
|
range->software_shutdown_temp_offset = pptable->SkuTable.FanAbnormalTempLimitOffset;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user