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

drm/amd/pm: correct the checks for fan attributes support



On functionality unsupported, -EOPNOTSUPP will be returned. And we rely
on that to determine the fan attributes support.

Fixes: 79c65f3f ("drm/amd/pm: do not expose power implementation details to amdgpu_pm.c")

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 54c73b51
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -315,8 +315,8 @@ struct amd_pm_funcs {
				void  *rps,
				bool  *equal);
/* export for sysfs */
	void (*set_fan_control_mode)(void *handle, u32 mode);
	u32 (*get_fan_control_mode)(void *handle);
	int (*set_fan_control_mode)(void *handle, u32 mode);
	int (*get_fan_control_mode)(void *handle, u32 *fan_mode);
	int (*set_fan_speed_pwm)(void *handle, u32 speed);
	int (*get_fan_speed_pwm)(void *handle, u32 *speed);
	int (*force_clock_level)(void *handle, enum pp_clock_type type, uint32_t mask);
+12 −9
Original line number Diff line number Diff line
@@ -1087,15 +1087,17 @@ int amdgpu_dpm_get_fan_control_mode(struct amdgpu_device *adev,
				    uint32_t *fan_mode)
{
	const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
	int ret = 0;

	if (!pp_funcs->get_fan_control_mode)
		return -EOPNOTSUPP;

	mutex_lock(&adev->pm.mutex);
	*fan_mode = pp_funcs->get_fan_control_mode(adev->powerplay.pp_handle);
	ret = pp_funcs->get_fan_control_mode(adev->powerplay.pp_handle,
					     fan_mode);
	mutex_unlock(&adev->pm.mutex);

	return 0;
	return ret;
}

int amdgpu_dpm_set_fan_speed_pwm(struct amdgpu_device *adev,
@@ -1105,7 +1107,7 @@ int amdgpu_dpm_set_fan_speed_pwm(struct amdgpu_device *adev,
	int ret = 0;

	if (!pp_funcs->set_fan_speed_pwm)
		return -EINVAL;
		return -EOPNOTSUPP;

	mutex_lock(&adev->pm.mutex);
	ret = pp_funcs->set_fan_speed_pwm(adev->powerplay.pp_handle,
@@ -1122,7 +1124,7 @@ int amdgpu_dpm_get_fan_speed_pwm(struct amdgpu_device *adev,
	int ret = 0;

	if (!pp_funcs->get_fan_speed_pwm)
		return -EINVAL;
		return -EOPNOTSUPP;

	mutex_lock(&adev->pm.mutex);
	ret = pp_funcs->get_fan_speed_pwm(adev->powerplay.pp_handle,
@@ -1139,7 +1141,7 @@ int amdgpu_dpm_get_fan_speed_rpm(struct amdgpu_device *adev,
	int ret = 0;

	if (!pp_funcs->get_fan_speed_rpm)
		return -EINVAL;
		return -EOPNOTSUPP;

	mutex_lock(&adev->pm.mutex);
	ret = pp_funcs->get_fan_speed_rpm(adev->powerplay.pp_handle,
@@ -1156,7 +1158,7 @@ int amdgpu_dpm_set_fan_speed_rpm(struct amdgpu_device *adev,
	int ret = 0;

	if (!pp_funcs->set_fan_speed_rpm)
		return -EINVAL;
		return -EOPNOTSUPP;

	mutex_lock(&adev->pm.mutex);
	ret = pp_funcs->set_fan_speed_rpm(adev->powerplay.pp_handle,
@@ -1170,16 +1172,17 @@ int amdgpu_dpm_set_fan_control_mode(struct amdgpu_device *adev,
				    uint32_t mode)
{
	const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
	int ret = 0;

	if (!pp_funcs->set_fan_control_mode)
		return -EOPNOTSUPP;

	mutex_lock(&adev->pm.mutex);
	pp_funcs->set_fan_control_mode(adev->powerplay.pp_handle,
	ret = pp_funcs->set_fan_control_mode(adev->powerplay.pp_handle,
					     mode);
	mutex_unlock(&adev->pm.mutex);

	return 0;
	return ret;
}

int amdgpu_dpm_get_power_limit(struct amdgpu_device *adev,
+10 −11
Original line number Diff line number Diff line
@@ -3147,7 +3147,6 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,
	struct device *dev = kobj_to_dev(kobj);
	struct amdgpu_device *adev = dev_get_drvdata(dev);
	umode_t effective_mode = attr->mode;
	uint32_t speed = 0;

	/* under multi-vf mode, the hwmon attributes are all not supported */
	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev))
@@ -3213,15 +3212,15 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,
		return 0;

	/* mask fan attributes if we have no bindings for this asic to expose */
	if (((amdgpu_dpm_get_fan_speed_pwm(adev, &speed) == -EINVAL) &&
	if (((amdgpu_dpm_get_fan_speed_pwm(adev, NULL) == -EOPNOTSUPP) &&
	      attr == &sensor_dev_attr_pwm1.dev_attr.attr) || /* can't query fan */
	    ((amdgpu_dpm_get_fan_control_mode(adev, &speed) == -EOPNOTSUPP) &&
	    ((amdgpu_dpm_get_fan_control_mode(adev, NULL) == -EOPNOTSUPP) &&
	     attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr)) /* can't query state */
		effective_mode &= ~S_IRUGO;

	if (((amdgpu_dpm_set_fan_speed_pwm(adev, speed) == -EINVAL) &&
	if (((amdgpu_dpm_set_fan_speed_pwm(adev, U32_MAX) == -EOPNOTSUPP) &&
	      attr == &sensor_dev_attr_pwm1.dev_attr.attr) || /* can't manage fan */
	      ((amdgpu_dpm_set_fan_control_mode(adev, speed) == -EOPNOTSUPP) &&
	      ((amdgpu_dpm_set_fan_control_mode(adev, U32_MAX) == -EOPNOTSUPP) &&
	      attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr)) /* can't manage state */
		effective_mode &= ~S_IWUSR;

@@ -3241,16 +3240,16 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,
		return 0;

	/* hide max/min values if we can't both query and manage the fan */
	if (((amdgpu_dpm_set_fan_speed_pwm(adev, speed) == -EINVAL) &&
	      (amdgpu_dpm_get_fan_speed_pwm(adev, &speed) == -EINVAL) &&
	      (amdgpu_dpm_set_fan_speed_rpm(adev, speed) == -EINVAL) &&
	      (amdgpu_dpm_get_fan_speed_rpm(adev, &speed) == -EINVAL)) &&
	if (((amdgpu_dpm_set_fan_speed_pwm(adev, U32_MAX) == -EOPNOTSUPP) &&
	      (amdgpu_dpm_get_fan_speed_pwm(adev, NULL) == -EOPNOTSUPP) &&
	      (amdgpu_dpm_set_fan_speed_rpm(adev, U32_MAX) == -EOPNOTSUPP) &&
	      (amdgpu_dpm_get_fan_speed_rpm(adev, NULL) == -EOPNOTSUPP)) &&
	    (attr == &sensor_dev_attr_pwm1_max.dev_attr.attr ||
	     attr == &sensor_dev_attr_pwm1_min.dev_attr.attr))
		return 0;

	if ((amdgpu_dpm_set_fan_speed_rpm(adev, speed) == -EINVAL) &&
	     (amdgpu_dpm_get_fan_speed_rpm(adev, &speed) == -EINVAL) &&
	if ((amdgpu_dpm_set_fan_speed_rpm(adev, U32_MAX) == -EOPNOTSUPP) &&
	     (amdgpu_dpm_get_fan_speed_rpm(adev, NULL) == -EOPNOTSUPP) &&
	     (attr == &sensor_dev_attr_fan1_max.dev_attr.attr ||
	     attr == &sensor_dev_attr_fan1_min.dev_attr.attr))
		return 0;
+16 −3
Original line number Diff line number Diff line
@@ -6619,6 +6619,9 @@ static int si_dpm_get_fan_speed_pwm(void *handle,
	u64 tmp64;
	struct amdgpu_device *adev = (struct amdgpu_device *)handle;

	if (!speed)
		return -EINVAL;

	if (adev->pm.no_fan)
		return -ENOENT;

@@ -6669,10 +6672,13 @@ static int si_dpm_set_fan_speed_pwm(void *handle,
	return 0;
}

static void si_dpm_set_fan_control_mode(void *handle, u32 mode)
static int si_dpm_set_fan_control_mode(void *handle, u32 mode)
{
	struct amdgpu_device *adev = (struct amdgpu_device *)handle;

	if (mode == U32_MAX)
		return -EINVAL;

	if (mode) {
		/* stop auto-manage */
		if (adev->pm.dpm.fan.ucode_fan_control)
@@ -6685,19 +6691,26 @@ static void si_dpm_set_fan_control_mode(void *handle, u32 mode)
		else
			si_fan_ctrl_set_default_mode(adev);
	}

	return 0;
}

static u32 si_dpm_get_fan_control_mode(void *handle)
static int si_dpm_get_fan_control_mode(void *handle, u32 *fan_mode)
{
	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
	struct si_power_info *si_pi = si_get_pi(adev);
	u32 tmp;

	if (!fan_mode)
		return -EINVAL;

	if (si_pi->fan_is_controlled_by_smc)
		return 0;

	tmp = RREG32(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK;
	return (tmp >> FDO_PWM_MODE_SHIFT);
	*fan_mode = (tmp >> FDO_PWM_MODE_SHIFT);

	return 0;
}

#if 0
+42 −29
Original line number Diff line number Diff line
@@ -488,38 +488,43 @@ static enum amd_pm_state_type pp_dpm_get_current_power_state(void *handle)
	return pm_type;
}

static void pp_dpm_set_fan_control_mode(void *handle, uint32_t mode)
static int pp_dpm_set_fan_control_mode(void *handle, uint32_t mode)
{
	struct pp_hwmgr *hwmgr = handle;

	if (!hwmgr || !hwmgr->pm_en)
		return;
		return -EOPNOTSUPP;

	if (hwmgr->hwmgr_func->set_fan_control_mode == NULL)
		return -EOPNOTSUPP;

	if (mode == U32_MAX)
		return -EINVAL;

	if (hwmgr->hwmgr_func->set_fan_control_mode == NULL) {
		pr_info_ratelimited("%s was not implemented.\n", __func__);
		return;
	}
	mutex_lock(&hwmgr->smu_lock);
	hwmgr->hwmgr_func->set_fan_control_mode(hwmgr, mode);
	mutex_unlock(&hwmgr->smu_lock);

	return 0;
}

static uint32_t pp_dpm_get_fan_control_mode(void *handle)
static int pp_dpm_get_fan_control_mode(void *handle, uint32_t *fan_mode)
{
	struct pp_hwmgr *hwmgr = handle;
	uint32_t mode = 0;

	if (!hwmgr || !hwmgr->pm_en)
		return 0;
		return -EOPNOTSUPP;

	if (hwmgr->hwmgr_func->get_fan_control_mode == NULL)
		return -EOPNOTSUPP;

	if (!fan_mode)
		return -EINVAL;

	if (hwmgr->hwmgr_func->get_fan_control_mode == NULL) {
		pr_info_ratelimited("%s was not implemented.\n", __func__);
		return 0;
	}
	mutex_lock(&hwmgr->smu_lock);
	mode = hwmgr->hwmgr_func->get_fan_control_mode(hwmgr);
	*fan_mode = hwmgr->hwmgr_func->get_fan_control_mode(hwmgr);
	mutex_unlock(&hwmgr->smu_lock);
	return mode;
	return 0;
}

static int pp_dpm_set_fan_speed_pwm(void *handle, uint32_t speed)
@@ -528,12 +533,14 @@ static int pp_dpm_set_fan_speed_pwm(void *handle, uint32_t speed)
	int ret = 0;

	if (!hwmgr || !hwmgr->pm_en)
		return -EOPNOTSUPP;

	if (hwmgr->hwmgr_func->set_fan_speed_pwm == NULL)
		return -EOPNOTSUPP;

	if (speed == U32_MAX)
		return -EINVAL;

	if (hwmgr->hwmgr_func->set_fan_speed_pwm == NULL) {
		pr_info_ratelimited("%s was not implemented.\n", __func__);
		return 0;
	}
	mutex_lock(&hwmgr->smu_lock);
	ret = hwmgr->hwmgr_func->set_fan_speed_pwm(hwmgr, speed);
	mutex_unlock(&hwmgr->smu_lock);
@@ -546,12 +553,13 @@ static int pp_dpm_get_fan_speed_pwm(void *handle, uint32_t *speed)
	int ret = 0;

	if (!hwmgr || !hwmgr->pm_en)
		return -EINVAL;
		return -EOPNOTSUPP;

	if (hwmgr->hwmgr_func->get_fan_speed_pwm == NULL) {
		pr_info_ratelimited("%s was not implemented.\n", __func__);
		return 0;
	}
	if (hwmgr->hwmgr_func->get_fan_speed_pwm == NULL)
		return -EOPNOTSUPP;

	if (!speed)
		return -EINVAL;

	mutex_lock(&hwmgr->smu_lock);
	ret = hwmgr->hwmgr_func->get_fan_speed_pwm(hwmgr, speed);
@@ -565,9 +573,12 @@ static int pp_dpm_get_fan_speed_rpm(void *handle, uint32_t *rpm)
	int ret = 0;

	if (!hwmgr || !hwmgr->pm_en)
		return -EINVAL;
		return -EOPNOTSUPP;

	if (hwmgr->hwmgr_func->get_fan_speed_rpm == NULL)
		return -EOPNOTSUPP;

	if (!rpm)
		return -EINVAL;

	mutex_lock(&hwmgr->smu_lock);
@@ -582,12 +593,14 @@ static int pp_dpm_set_fan_speed_rpm(void *handle, uint32_t rpm)
	int ret = 0;

	if (!hwmgr || !hwmgr->pm_en)
		return -EOPNOTSUPP;

	if (hwmgr->hwmgr_func->set_fan_speed_rpm == NULL)
		return -EOPNOTSUPP;

	if (rpm == U32_MAX)
		return -EINVAL;

	if (hwmgr->hwmgr_func->set_fan_speed_rpm == NULL) {
		pr_info_ratelimited("%s was not implemented.\n", __func__);
		return 0;
	}
	mutex_lock(&hwmgr->smu_lock);
	ret = hwmgr->hwmgr_func->set_fan_speed_rpm(hwmgr, rpm);
	mutex_unlock(&hwmgr->smu_lock);
Loading