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:
committed by
Alex Deucher
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);
|
return sprintf(buf, "%i\n", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev,
|
|
||||||
struct device_attribute *attr,
|
static ssize_t amdgpu_hwmon_show_power_cap_generic(struct device *dev,
|
||||||
char *buf)
|
struct device_attribute *attr,
|
||||||
|
char *buf,
|
||||||
|
enum pp_power_limit_level pp_limit_level)
|
||||||
{
|
{
|
||||||
struct amdgpu_device *adev = dev_get_drvdata(dev);
|
struct amdgpu_device *adev = dev_get_drvdata(dev);
|
||||||
const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
|
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_type power_type = to_sensor_dev_attr(attr)->index;
|
||||||
enum pp_power_limit_level pp_limit_level = PP_PWR_LIMIT_MAX;
|
|
||||||
uint32_t limit;
|
uint32_t limit;
|
||||||
ssize_t size;
|
ssize_t size;
|
||||||
int r;
|
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)
|
if (adev->in_suspend && !adev->in_runpm)
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
|
||||||
|
if ( !(pp_funcs && pp_funcs->get_power_limit))
|
||||||
|
return -ENODATA;
|
||||||
|
|
||||||
r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
|
r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
|
pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pp_funcs && pp_funcs->get_power_limit)
|
r = pp_funcs->get_power_limit(adev->powerplay.pp_handle, &limit,
|
||||||
r = pp_funcs->get_power_limit(adev->powerplay.pp_handle, &limit,
|
pp_limit_level, power_type);
|
||||||
pp_limit_level, power_type);
|
|
||||||
else
|
|
||||||
r = -ENODATA;
|
|
||||||
|
|
||||||
if (!r)
|
if (!r)
|
||||||
size = sysfs_emit(buf, "%u\n", limit * 1000000);
|
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;
|
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,
|
static ssize_t amdgpu_hwmon_show_power_cap(struct device *dev,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
struct amdgpu_device *adev = dev_get_drvdata(dev);
|
return amdgpu_hwmon_show_power_cap_generic(dev, attr, buf, PP_PWR_LIMIT_CURRENT);
|
||||||
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;
|
|
||||||
|
|
||||||
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,
|
static ssize_t amdgpu_hwmon_show_power_cap_default(struct device *dev,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
struct amdgpu_device *adev = dev_get_drvdata(dev);
|
return amdgpu_hwmon_show_power_cap_generic(dev, attr, buf, PP_PWR_LIMIT_DEFAULT);
|
||||||
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;
|
|
||||||
|
|
||||||
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,
|
static ssize_t amdgpu_hwmon_show_power_label(struct device *dev,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
|
|||||||
Reference in New Issue
Block a user