diff options
| author | Evan Quan <[email protected]> | 2023-08-11 18:09:14 +0800 | 
|---|---|---|
| committer | Alex Deucher <[email protected]> | 2023-08-31 17:14:21 -0400 | 
| commit | 47cf6fcb88d2b46018a5dc9b1b369518f5588ae4 (patch) | |
| tree | 4676882cf4024a703417f865e34491d272590b52 /drivers/gpu/drm/amd/pm/amdgpu_pm.c | |
| parent | 983ac45a06aec8987755c921aa53e81e6a69fb78 (diff) | |
drm/amd/pm: add fan acoustic target OD setting support for SMU13
Add SMU13 fan acoustic target OD setting support.
Signed-off-by: Evan Quan <[email protected]>
Reviewed-by: Alex Deucher <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
Diffstat (limited to 'drivers/gpu/drm/amd/pm/amdgpu_pm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/pm/amdgpu_pm.c | 65 | 
1 files changed, 65 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c index 1ec8a8c4016a..0d63d31b05d3 100644 --- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c @@ -3630,6 +3630,63 @@ static umode_t acoustic_limit_threshold_visible(struct amdgpu_device *adev)  	return umode;  } +/** + * DOC: acoustic_target_rpm_threshold + * + * The amdgpu driver provides a sysfs API for checking and adjusting the + * acoustic target in RPM for fan control. + * + * Reading back the file shows you the current setting and the permitted + * ranges if changable. + * + * Writing an integer to the file, change the setting accordingly. + * + * When you have finished the editing, write "c" (commit) to the file to commit + * your changes. + * + * This setting works under auto fan control mode only. It can co-exist with + * other settings which can work also under auto mode. It adjusts the PMFW's + * behavior about the maximum speed in RPM the fan can spin when ASIC + * temperature is not greater than target temperature. Setting via this + * interface will switch the fan control to auto mode implicitly. + */ +static ssize_t acoustic_target_threshold_show(struct kobject *kobj, +					      struct kobj_attribute *attr, +					      char *buf) +{ +	struct od_kobj *container = container_of(kobj, struct od_kobj, kobj); +	struct amdgpu_device *adev = (struct amdgpu_device *)container->priv; + +	return (ssize_t)amdgpu_retrieve_od_settings(adev, OD_ACOUSTIC_TARGET, buf); +} + +static ssize_t acoustic_target_threshold_store(struct kobject *kobj, +					       struct kobj_attribute *attr, +					       const char *buf, +					       size_t count) +{ +	struct od_kobj *container = container_of(kobj, struct od_kobj, kobj); +	struct amdgpu_device *adev = (struct amdgpu_device *)container->priv; + +	return (ssize_t)amdgpu_distribute_custom_od_settings(adev, +							     PP_OD_EDIT_ACOUSTIC_TARGET, +							     buf, +							     count); +} + +static umode_t acoustic_target_threshold_visible(struct amdgpu_device *adev) +{ +	umode_t umode = 0000; + +	if (adev->pm.od_feature_mask & OD_OPS_SUPPORT_ACOUSTIC_TARGET_THRESHOLD_RETRIEVE) +		umode |= S_IRUSR | S_IRGRP | S_IROTH; + +	if (adev->pm.od_feature_mask & OD_OPS_SUPPORT_ACOUSTIC_TARGET_THRESHOLD_SET) +		umode |= S_IWUSR; + +	return umode; +} +  static struct od_feature_set amdgpu_od_set = {  	.containers = {  		[0] = { @@ -3651,6 +3708,14 @@ static struct od_feature_set amdgpu_od_set = {  						.store = acoustic_limit_threshold_store,  					},  				}, +				[2] = { +					.name = "acoustic_target_rpm_threshold", +					.ops = { +						.is_visible = acoustic_target_threshold_visible, +						.show = acoustic_target_threshold_show, +						.store = acoustic_target_threshold_store, +					}, +				},  			},  		},  	},  |