amdgpu/pm: remove code duplication in show_power_cap calls
v3: updated patch to apply to latest code
 v2: reorder to check pointers before calling pm_runtime_* functions
 created generic function and call with enum from
 * amdgpu_hwmon_show_power_cap_max
 * amdgpu_hwmon_show_power_cap
 * amdgpu_hwmon_show_power_cap_default
=== Test ===
AMDGPU_PCI_ADDR=`lspci -nn | grep "VGA\|Display" | cut -d " " -f 1`
AMDGPU_HWMON=`ls -la /sys/class/hwmon | grep $AMDGPU_PCI_ADDR | cut -d " " -f 10`
HWMON_DIR=/sys/class/hwmon/${AMDGPU_HWMON}
cp pp_show_power_cap.txt{,.old}
lspci -nn | grep "VGA\|Display" > pp_show_power_cap.test.log
FILES="
power1_cap
power1_cap_max
power1_cap_default "
for f in $FILES
do
  echo  $f = `cat $HWMON_DIR/$f` >> pp_show_power_cap.test.log
done
Signed-off-by: Darren Powell <darren.powell@amd.com>
Reviewed-by: Kevin Wang <kevin1.wang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
			
			
This commit is contained in:
		
							parent
							
								
									ed50995514
								
							
						
					
					
						commit
						91161b06be
					
				| @ -2902,14 +2902,15 @@ static ssize_t amdgpu_hwmon_show_power_cap_min(struct device *dev, | ||||
| 	return sprintf(buf, "%i\n", 0); | ||||
| } | ||||
| 
 | ||||
| static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev, | ||||
| 					 struct device_attribute *attr, | ||||
| 					 char *buf) | ||||
| 
 | ||||
| static ssize_t amdgpu_hwmon_show_power_cap_generic(struct device *dev, | ||||
| 					struct device_attribute *attr, | ||||
| 					char *buf, | ||||
| 					enum pp_power_limit_level pp_limit_level) | ||||
| { | ||||
| 	struct amdgpu_device *adev = dev_get_drvdata(dev); | ||||
| 	const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; | ||||
| 	enum pp_power_type power_type = to_sensor_dev_attr(attr)->index; | ||||
| 	enum pp_power_limit_level pp_limit_level = PP_PWR_LIMIT_MAX; | ||||
| 	uint32_t limit; | ||||
| 	ssize_t size; | ||||
| 	int r; | ||||
| @ -2919,17 +2920,17 @@ static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev, | ||||
| 	if (adev->in_suspend && !adev->in_runpm) | ||||
| 		return -EPERM; | ||||
| 
 | ||||
| 	if ( !(pp_funcs && pp_funcs->get_power_limit)) | ||||
| 		return -ENODATA; | ||||
| 
 | ||||
| 	r = pm_runtime_get_sync(adev_to_drm(adev)->dev); | ||||
| 	if (r < 0) { | ||||
| 		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); | ||||
| 		return r; | ||||
| 	} | ||||
| 
 | ||||
| 	if (pp_funcs && pp_funcs->get_power_limit) | ||||
| 		r = pp_funcs->get_power_limit(adev->powerplay.pp_handle, &limit, | ||||
| 					      pp_limit_level, power_type); | ||||
| 	else | ||||
| 		r = -ENODATA; | ||||
| 	r = pp_funcs->get_power_limit(adev->powerplay.pp_handle, &limit, | ||||
| 				      pp_limit_level, power_type); | ||||
| 
 | ||||
| 	if (!r) | ||||
| 		size = sysfs_emit(buf, "%u\n", limit * 1000000); | ||||
| @ -2942,85 +2943,31 @@ static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev, | ||||
| 	return size; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev, | ||||
| 					 struct device_attribute *attr, | ||||
| 					 char *buf) | ||||
| { | ||||
| 	return amdgpu_hwmon_show_power_cap_generic(dev, attr, buf, PP_PWR_LIMIT_MAX); | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| static ssize_t amdgpu_hwmon_show_power_cap(struct device *dev, | ||||
| 					 struct device_attribute *attr, | ||||
| 					 char *buf) | ||||
| { | ||||
| 	struct amdgpu_device *adev = dev_get_drvdata(dev); | ||||
| 	const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; | ||||
| 	enum pp_power_type power_type = to_sensor_dev_attr(attr)->index; | ||||
| 	enum pp_power_limit_level pp_limit_level = PP_PWR_LIMIT_CURRENT; | ||||
| 	uint32_t limit; | ||||
| 	ssize_t size; | ||||
| 	int r; | ||||
| 	return amdgpu_hwmon_show_power_cap_generic(dev, attr, buf, PP_PWR_LIMIT_CURRENT); | ||||
| 
 | ||||
| 	if (amdgpu_in_reset(adev)) | ||||
| 		return -EPERM; | ||||
| 	if (adev->in_suspend && !adev->in_runpm) | ||||
| 		return -EPERM; | ||||
| 
 | ||||
| 	r = pm_runtime_get_sync(adev_to_drm(adev)->dev); | ||||
| 	if (r < 0) { | ||||
| 		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); | ||||
| 		return r; | ||||
| 	} | ||||
| 
 | ||||
| 	if (pp_funcs && pp_funcs->get_power_limit) | ||||
| 		r = pp_funcs->get_power_limit(adev->powerplay.pp_handle, &limit, | ||||
| 					      pp_limit_level, power_type); | ||||
| 	else | ||||
| 		r = -ENODATA; | ||||
| 
 | ||||
| 	if (!r) | ||||
| 		size = sysfs_emit(buf, "%u\n", limit * 1000000); | ||||
| 	else | ||||
| 		size = sysfs_emit(buf, "\n"); | ||||
| 
 | ||||
| 	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); | ||||
| 	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); | ||||
| 
 | ||||
| 	return size; | ||||
| } | ||||
| 
 | ||||
| static ssize_t amdgpu_hwmon_show_power_cap_default(struct device *dev, | ||||
| 					 struct device_attribute *attr, | ||||
| 					 char *buf) | ||||
| { | ||||
| 	struct amdgpu_device *adev = dev_get_drvdata(dev); | ||||
| 	const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; | ||||
| 	enum pp_power_type power_type = to_sensor_dev_attr(attr)->index; | ||||
| 	enum pp_power_limit_level pp_limit_level = PP_PWR_LIMIT_DEFAULT; | ||||
| 	uint32_t limit; | ||||
| 	ssize_t size; | ||||
| 	int r; | ||||
| 	return amdgpu_hwmon_show_power_cap_generic(dev, attr, buf, PP_PWR_LIMIT_DEFAULT); | ||||
| 
 | ||||
| 	if (amdgpu_in_reset(adev)) | ||||
| 		return -EPERM; | ||||
| 	if (adev->in_suspend && !adev->in_runpm) | ||||
| 		return -EPERM; | ||||
| 
 | ||||
| 	r = pm_runtime_get_sync(adev_to_drm(adev)->dev); | ||||
| 	if (r < 0) { | ||||
| 		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); | ||||
| 		return r; | ||||
| 	} | ||||
| 
 | ||||
| 	if (pp_funcs && pp_funcs->get_power_limit) | ||||
| 		r = pp_funcs->get_power_limit(adev->powerplay.pp_handle, &limit, | ||||
| 					      pp_limit_level, power_type); | ||||
| 	else | ||||
| 		r = -ENODATA; | ||||
| 
 | ||||
| 	if (!r) | ||||
| 		size = sysfs_emit(buf, "%u\n", limit * 1000000); | ||||
| 	else | ||||
| 		size = sysfs_emit(buf, "\n"); | ||||
| 
 | ||||
| 	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); | ||||
| 	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); | ||||
| 
 | ||||
| 	return size; | ||||
| } | ||||
| 
 | ||||
| static ssize_t amdgpu_hwmon_show_power_label(struct device *dev, | ||||
| 					 struct device_attribute *attr, | ||||
| 					 char *buf) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user