Commit ef5fca9f authored by lyndonli's avatar lyndonli Committed by Alex Deucher
Browse files

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: default avatarlyndonli <Lyndon.Li@amd.com>
Reviewed-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: default avatarKenneth Feng <kenneth.feng@amd.com>
Reviewed-by: default avatarEvan Quan <evan.quan@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 1ec13219
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -168,6 +168,7 @@ struct smu_temperature_range {
	int mem_crit_max;
	int mem_emergency_max;
	int software_shutdown_temp;
	int software_shutdown_temp_offset;
};

struct smu_state_validation_block {
+28 −0
Original line number Diff line number Diff line
@@ -1376,6 +1376,7 @@ static int smu_v13_0_irq_process(struct amdgpu_device *adev,
	 */
	uint32_t ctxid = entry->src_data[0];
	uint32_t data;
	uint32_t high;

	if (client_id == SOC15_IH_CLIENTID_THM) {
		switch (src_id) {
@@ -1432,6 +1433,33 @@ static int smu_v13_0_irq_process(struct amdgpu_device *adev,
					schedule_work(&smu->throttling_logging_work);

				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;
			}
		}
	}
+1 −0
Original line number Diff line number Diff line
@@ -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)*
		SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
	range->software_shutdown_temp = powerplay_table->software_shutdown_temp;
	range->software_shutdown_temp_offset = pptable->SkuTable.FanAbnormalTempLimitOffset;

	return 0;
}