amdgpu/pm: Powerplay API for smu , changed 6 pm hwmon fan functions to use API
authorDarren Powell <darren.powell@amd.com>
Sat, 31 Oct 2020 02:46:24 +0000 (22:46 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 26 Feb 2021 22:17:04 +0000 (17:17 -0500)
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: Darren Powell <darren.powell@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/amdgpu_pm.c
drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c

index fd04c4d..b8848dc 100644 (file)
@@ -2509,22 +2509,18 @@ 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);
-                       return -EINVAL;
-               }
-
-               pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
+       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);
+               return -EINVAL;
        }
 
+       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,18 +2545,14 @@ 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);
-                       return -EINVAL;
-               }
-
-               amdgpu_dpm_set_fan_control_mode(adev, value);
+       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, 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);
-
+       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,10 +2795,7 @@ 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);
+       pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
 
        if (pwm_mode != AMD_FAN_CTRL_MANUAL) {
                pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
@@ -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,18 +2841,14 @@ 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);
-                       return -EINVAL;
-               }
-
-               pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
+       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);
+               return -EINVAL;
        }
 
+       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);
+       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);
index 55e1188..126a9c5 100644 (file)
@@ -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);
 
index ef1dfd1..b7fe56b 100644 (file)
@@ -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);
 
@@ -2287,7 +2289,7 @@ int smu_set_fan_control_mode(struct smu_context *smu, int value)
        int ret = 0;
 
        if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)
-               return -EOPNOTSUPP;
+               return  -EOPNOTSUPP;
 
        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,