Commit f46587bc authored by Darren Powell's avatar Darren Powell Committed by Alex Deucher
Browse files

amdgpu/pm: Powerplay API for smu , changed 6 pm hwmon fan functions to use API



v2: changed error return value of smu_get_fan_control_mode to AMD_FAN_CTRL_NONE
    fixed type in amdgpu_hwmon_get_pwm1_enable() print statement
    fixed indent flagged by checkpatch.pl

Modified Functions
  smu_set_fan_speed_rpm()     - modifed arg0 to match Powerplay API set_fan_speed_rpm
  smu_get_fan_control_mode()  - modifed signature to match Powerplay API get_fan_control_mode
  smu_set_fan_control_mode()  - modifed signature to match Powerplay API set_fan_control_mode
  smu_get_fan_speed_percent() - modifed signature to match Powerplay API get_fan_speed_percent
  smu_set_fan_speed_percent() - modifed signature to match Powerplay API set_fan_speed_percent
  smu_get_fan_speed_rpm()     - modifed arg0 to match Powerplay API get_fan_speed_rpm

Other Changes
  added 6 above smu fan Powerplay functions to swsmu_dpm_funcs
  removed special smu handling of above functions and called through Powerplay API

Signed-off-by: default avatarDarren Powell <darren.powell@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Reviewed-by: default avatarEvan Quan <evan.quan@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent bab0f602
Loading
Loading
Loading
Loading
+31 −64
Original line number Diff line number Diff line
@@ -2509,9 +2509,6 @@ static ssize_t amdgpu_hwmon_get_pwm1_enable(struct device *dev,
		return ret;
	}

	if (is_support_sw_smu(adev)) {
		pwm_mode = smu_get_fan_control_mode(&adev->smu);
	} else {
	if (!adev->powerplay.pp_funcs->get_fan_control_mode) {
		pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
@@ -2519,12 +2516,11 @@ static ssize_t amdgpu_hwmon_get_pwm1_enable(struct device *dev,
	}

	pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
	}

	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);

	return sprintf(buf, "%i\n", pwm_mode);
	return sprintf(buf, "%u\n", pwm_mode);
}

static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev,
@@ -2549,9 +2545,6 @@ static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev,
		return ret;
	}

	if (is_support_sw_smu(adev)) {
		smu_set_fan_control_mode(&adev->smu, value);
	} else {
	if (!adev->powerplay.pp_funcs->set_fan_control_mode) {
		pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
@@ -2559,7 +2552,6 @@ static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev,
	}

	amdgpu_dpm_set_fan_control_mode(adev, value);
	}

	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
@@ -2599,11 +2591,7 @@ static ssize_t amdgpu_hwmon_set_pwm1(struct device *dev,
		return err;
	}

	if (is_support_sw_smu(adev))
		pwm_mode = smu_get_fan_control_mode(&adev->smu);
	else
	pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);

	if (pwm_mode != AMD_FAN_CTRL_MANUAL) {
		pr_info("manual fan speed control should be enabled first\n");
		pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
@@ -2620,9 +2608,7 @@ static ssize_t amdgpu_hwmon_set_pwm1(struct device *dev,

	value = (value * 100) / 255;

	if (is_support_sw_smu(adev))
		err = smu_set_fan_speed_percent(&adev->smu, value);
	else if (adev->powerplay.pp_funcs->set_fan_speed_percent)
	if (adev->powerplay.pp_funcs->set_fan_speed_percent)
		err = amdgpu_dpm_set_fan_speed_percent(adev, value);
	else
		err = -EINVAL;
@@ -2653,9 +2639,7 @@ static ssize_t amdgpu_hwmon_get_pwm1(struct device *dev,
		return err;
	}

	if (is_support_sw_smu(adev))
		err = smu_get_fan_speed_percent(&adev->smu, &speed);
	else if (adev->powerplay.pp_funcs->get_fan_speed_percent)
	if (adev->powerplay.pp_funcs->get_fan_speed_percent)
		err = amdgpu_dpm_get_fan_speed_percent(adev, &speed);
	else
		err = -EINVAL;
@@ -2688,9 +2672,7 @@ static ssize_t amdgpu_hwmon_get_fan1_input(struct device *dev,
		return err;
	}

	if (is_support_sw_smu(adev))
		err = smu_get_fan_speed_rpm(&adev->smu, &speed);
	else if (adev->powerplay.pp_funcs->get_fan_speed_rpm)
	if (adev->powerplay.pp_funcs->get_fan_speed_rpm)
		err = amdgpu_dpm_get_fan_speed_rpm(adev, &speed);
	else
		err = -EINVAL;
@@ -2781,9 +2763,7 @@ static ssize_t amdgpu_hwmon_get_fan1_target(struct device *dev,
		return err;
	}

	if (is_support_sw_smu(adev))
		err = smu_get_fan_speed_rpm(&adev->smu, &rpm);
	else if (adev->powerplay.pp_funcs->get_fan_speed_rpm)
	if (adev->powerplay.pp_funcs->get_fan_speed_rpm)
		err = amdgpu_dpm_get_fan_speed_rpm(adev, &rpm);
	else
		err = -EINVAL;
@@ -2815,9 +2795,6 @@ static ssize_t amdgpu_hwmon_set_fan1_target(struct device *dev,
		return err;
	}

	if (is_support_sw_smu(adev))
		pwm_mode = smu_get_fan_control_mode(&adev->smu);
	else
	pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);

	if (pwm_mode != AMD_FAN_CTRL_MANUAL) {
@@ -2833,9 +2810,7 @@ static ssize_t amdgpu_hwmon_set_fan1_target(struct device *dev,
		return err;
	}

	if (is_support_sw_smu(adev))
		err = smu_set_fan_speed_rpm(&adev->smu, value);
	else if (adev->powerplay.pp_funcs->set_fan_speed_rpm)
	if (adev->powerplay.pp_funcs->set_fan_speed_rpm)
		err = amdgpu_dpm_set_fan_speed_rpm(adev, value);
	else
		err = -EINVAL;
@@ -2866,9 +2841,6 @@ static ssize_t amdgpu_hwmon_get_fan1_enable(struct device *dev,
		return ret;
	}

	if (is_support_sw_smu(adev)) {
		pwm_mode = smu_get_fan_control_mode(&adev->smu);
	} else {
	if (!adev->powerplay.pp_funcs->get_fan_control_mode) {
		pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
@@ -2876,7 +2848,6 @@ static ssize_t amdgpu_hwmon_get_fan1_enable(struct device *dev,
	}

	pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
	}

	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
@@ -2914,16 +2885,12 @@ static ssize_t amdgpu_hwmon_set_fan1_enable(struct device *dev,
		return err;
	}

	if (is_support_sw_smu(adev)) {
		smu_set_fan_control_mode(&adev->smu, pwm_mode);
	} else {
	if (!adev->powerplay.pp_funcs->set_fan_control_mode) {
		pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
		return -EINVAL;
	}
	amdgpu_dpm_set_fan_control_mode(adev, pwm_mode);
	}

	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
+6 −5
Original line number Diff line number Diff line
@@ -1230,7 +1230,7 @@ int smu_check_fw_status(struct smu_context *smu);

int smu_set_gfx_cgpg(struct smu_context *smu, bool enabled);

int smu_set_fan_speed_rpm(struct smu_context *smu, uint32_t speed);
int smu_set_fan_speed_rpm(void *handle, uint32_t speed);

int smu_get_power_limit(struct smu_context *smu,
			uint32_t *limit,
@@ -1252,11 +1252,12 @@ int smu_set_power_profile_mode(struct smu_context *smu,
			       long *param,
			       uint32_t param_size,
			       bool lock_needed);
int smu_get_fan_control_mode(struct smu_context *smu);
u32 smu_get_fan_control_mode(void *handle);
int smu_set_fan_control_mode(struct smu_context *smu, int value);
int smu_get_fan_speed_percent(struct smu_context *smu, uint32_t *speed);
int smu_set_fan_speed_percent(struct smu_context *smu, uint32_t speed);
int smu_get_fan_speed_rpm(struct smu_context *smu, uint32_t *speed);
void smu_pp_set_fan_control_mode(void *handle, u32 value);
int smu_get_fan_speed_percent(void *handle, u32 *speed);
int smu_set_fan_speed_percent(void *handle, u32 speed);
int smu_get_fan_speed_rpm(void *handle, uint32_t *speed);

int smu_set_deep_sleep_dcefclk(struct smu_context *smu, int clk);

+26 −8
Original line number Diff line number Diff line
@@ -2029,8 +2029,9 @@ int smu_set_gfx_cgpg(struct smu_context *smu, bool enabled)
	return ret;
}

int smu_set_fan_speed_rpm(struct smu_context *smu, uint32_t speed)
int smu_set_fan_speed_rpm(void *handle, uint32_t speed)
{
	struct smu_context *smu = handle;
	u32 percent;
	int ret = 0;

@@ -2265,12 +2266,13 @@ int smu_set_power_profile_mode(struct smu_context *smu,
}


int smu_get_fan_control_mode(struct smu_context *smu)
u32 smu_get_fan_control_mode(void *handle)
{
	int ret = 0;
	struct smu_context *smu = handle;
	u32 ret = 0;

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

	mutex_lock(&smu->mutex);

@@ -2307,8 +2309,16 @@ int smu_set_fan_control_mode(struct smu_context *smu, int value)
	return ret;
}

int smu_get_fan_speed_percent(struct smu_context *smu, uint32_t *speed)
void smu_pp_set_fan_control_mode(void *handle, u32 value) {
	struct smu_context *smu = handle;

	smu_set_fan_control_mode(smu, value);
}


int smu_get_fan_speed_percent(void *handle, u32 *speed)
{
	struct smu_context *smu = handle;
	int ret = 0;
	uint32_t percent;

@@ -2330,8 +2340,9 @@ int smu_get_fan_speed_percent(struct smu_context *smu, uint32_t *speed)
	return ret;
}

int smu_set_fan_speed_percent(struct smu_context *smu, uint32_t speed)
int smu_set_fan_speed_percent(void *handle, u32 speed)
{
	struct smu_context *smu = handle;
	int ret = 0;

	if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)
@@ -2352,8 +2363,9 @@ int smu_set_fan_speed_percent(struct smu_context *smu, uint32_t speed)
	return ret;
}

int smu_get_fan_speed_rpm(struct smu_context *smu, uint32_t *speed)
int smu_get_fan_speed_rpm(void *handle, uint32_t *speed)
{
	struct smu_context *smu = handle;
	int ret = 0;
	u32 percent;

@@ -2738,7 +2750,13 @@ int smu_gfx_state_change_set(struct smu_context *smu, uint32_t state)

static const struct amd_pm_funcs swsmu_pm_funcs = {
	/* export for sysfs */
	.set_fan_control_mode  = smu_pp_set_fan_control_mode,
	.get_fan_control_mode  = smu_get_fan_control_mode,
	.set_fan_speed_percent = smu_set_fan_speed_percent,
	.get_fan_speed_percent = smu_get_fan_speed_percent,
	.get_performance_level = smu_get_performance_level,
	.get_fan_speed_rpm     = smu_get_fan_speed_rpm,
	.set_fan_speed_rpm     = smu_set_fan_speed_rpm,
	.switch_power_profile  = smu_switch_power_profile,
	/* export to amdgpu */
	.set_mp1_state         = smu_set_mp1_state,