Commit d9ca7567 authored by Evan Quan's avatar Evan Quan Committed by Alex Deucher
Browse files

drm/amd/pm: correct the fan speed RPM retrieving



The relationship "PWM = RPM / smu->fan_max_rpm" between fan speed
PWM and RPM is not true for SMU11 ASICs. So, we need a new way to
retrieving the fan speed RPM.

Signed-off-by: default avatarEvan Quan <evan.quan@amd.com>
Reviewed-by: default avatarLijo Lazar <lijo.lazar@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent fb1f667e
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -38,6 +38,9 @@
#define mmCG_TACH_CTRL                                                                                 0x006a
#define mmCG_TACH_CTRL_BASE_IDX                                                                        0

#define mmCG_TACH_STATUS                                                                               0x006b
#define mmCG_TACH_STATUS_BASE_IDX                                                                      0

#define mmTHM_THERMAL_INT_ENA                                                                          0x000a
#define mmTHM_THERMAL_INT_ENA_BASE_IDX                                                                 0
#define mmTHM_THERMAL_INT_CTRL                                                                         0x000b
+5 −0
Original line number Diff line number Diff line
@@ -729,6 +729,11 @@ struct pptable_funcs {
	 */
	int (*get_fan_speed_percent)(struct smu_context *smu, uint32_t *speed);

	/**
	 * @get_fan_speed_rpm: Get the current fan speed in rpm.
	 */
	int (*get_fan_speed_rpm)(struct smu_context *smu, uint32_t *speed);

	/**
	 * @set_watermarks_table: Configure and upload the watermarks tables to
	 *                        the SMU.
+3 −0
Original line number Diff line number Diff line
@@ -230,6 +230,9 @@ int smu_v11_0_set_fan_speed_rpm(struct smu_context *smu,
int smu_v11_0_get_fan_speed_percent(struct smu_context *smu,
				    uint32_t *speed);

int smu_v11_0_get_fan_speed_rpm(struct smu_context *smu,
				uint32_t *speed);

int smu_v11_0_set_xgmi_pstate(struct smu_context *smu,
				     uint32_t pstate);

+2 −5
Original line number Diff line number Diff line
@@ -2639,17 +2639,14 @@ static int smu_get_fan_speed_rpm(void *handle, uint32_t *speed)
{
	struct smu_context *smu = handle;
	int ret = 0;
	u32 percent;

	if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)
		return -EOPNOTSUPP;

	mutex_lock(&smu->mutex);

	if (smu->ppt_funcs->get_fan_speed_percent) {
		ret = smu->ppt_funcs->get_fan_speed_percent(smu, &percent);
		*speed = percent * smu->fan_max_rpm / 100;
	}
	if (smu->ppt_funcs->get_fan_speed_rpm)
		ret = smu->ppt_funcs->get_fan_speed_rpm(smu, speed);

	mutex_unlock(&smu->mutex);

+24 −0
Original line number Diff line number Diff line
@@ -1162,6 +1162,29 @@ static int arcturus_read_sensor(struct smu_context *smu,
	return ret;
}

static int arcturus_get_fan_speed_rpm(struct smu_context *smu,
				      uint32_t *speed)
{
	int ret = 0;

	if (!speed)
		return -EINVAL;

	switch (smu_v11_0_get_fan_control_mode(smu)) {
	case AMD_FAN_CTRL_AUTO:
		ret = arcturus_get_smu_metrics_data(smu,
						    METRICS_CURR_FANSPEED,
						    speed);
		break;
	default:
		ret = smu_v11_0_get_fan_speed_rpm(smu,
						  speed);
		break;
	}

	return ret;
}

static int arcturus_get_fan_parameters(struct smu_context *smu)
{
	PPTable_t *pptable = smu->smu_table.driver_pptable;
@@ -2248,6 +2271,7 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
	.force_clk_levels = arcturus_force_clk_levels,
	.read_sensor = arcturus_read_sensor,
	.get_fan_speed_percent = smu_v11_0_get_fan_speed_percent,
	.get_fan_speed_rpm = arcturus_get_fan_speed_rpm,
	.get_power_profile_mode = arcturus_get_power_profile_mode,
	.set_power_profile_mode = arcturus_set_power_profile_mode,
	.set_performance_level = arcturus_set_performance_level,
Loading