Commit 04bec521 authored by Darren Powell's avatar Darren Powell Committed by Alex Deucher

amdgpu/pm: modify Powerplay API get_power_limit to use new pp_power enums

 updated {amd_pm_funcs}->get_power_limit() signature
 rewrote pp_get_power_limit to use new enums
 pp_get_power_limit now returns -EOPNOTSUPP for unknown power limit
 update calls to {amd_pm_funcs}->get_power_limit()

* Test Notes
* testing hardware was NAVI10 (tests SMU path)
** needs testing on VANGOGH
** needs testing on SMU < 11
** ie, one of
 TOPAZ, FIJI, TONGA, POLARIS10, POLARIS11, POLARIS12, VEGAM, CARRIZO,
 STONEY, VEGA10, VEGA12,VEGA20, RAVEN, BONAIRE, HAWAII

* 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 11`
 HWMON_DIR=/sys/class/hwmon/${AMDGPU_HWMON}

 lspci -nn | grep "VGA\|Display" ; \
 echo "=== power1 cap ===" ; cat $HWMON_DIR/power1_cap ;           \
 echo "=== power1 cap max ===" ; cat $HWMON_DIR/power1_cap_max ;   \
 echo "=== power1 cap def ===" ; cat $HWMON_DIR/power1_cap_default
Signed-off-by: default avatarDarren Powell <darren.powell@amd.com>
Reviewed-by: default avatarLijo Lazar <lijo.lazar@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent a40a020d
...@@ -307,8 +307,9 @@ struct amd_pm_funcs { ...@@ -307,8 +307,9 @@ struct amd_pm_funcs {
uint32_t block_type, bool gate); uint32_t block_type, bool gate);
int (*set_clockgating_by_smu)(void *handle, uint32_t msg_id); int (*set_clockgating_by_smu)(void *handle, uint32_t msg_id);
int (*set_power_limit)(void *handle, uint32_t n); int (*set_power_limit)(void *handle, uint32_t n);
int (*get_power_limit)(void *handle, uint32_t *limit, uint32_t *max_limit, int (*get_power_limit)(void *handle, uint32_t *limit,
bool default_limit); enum pp_power_limit_level pp_limit_level,
enum pp_power_type power_type);
int (*get_power_profile_mode)(void *handle, char *buf); int (*get_power_profile_mode)(void *handle, char *buf);
int (*set_power_profile_mode)(void *handle, long *input, uint32_t size); int (*set_power_profile_mode)(void *handle, long *input, uint32_t size);
int (*set_fine_grain_clk_vol)(void *handle, uint32_t type, long *input, uint32_t size); int (*set_fine_grain_clk_vol)(void *handle, uint32_t type, long *input, uint32_t size);
......
...@@ -2908,8 +2908,8 @@ static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev, ...@@ -2908,8 +2908,8 @@ static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev,
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;
uint32_t max_limit = 0;
ssize_t size; ssize_t size;
int r; int r;
...@@ -2925,12 +2925,13 @@ static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev, ...@@ -2925,12 +2925,13 @@ static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev,
} }
if (is_support_sw_smu(adev)) { if (is_support_sw_smu(adev)) {
smu_get_power_limit(&adev->smu, &limit, PP_PWR_LIMIT_MAX, power_type); smu_get_power_limit(&adev->smu, &limit,
pp_limit_level, power_type);
size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 1000000); size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 1000000);
} else if (pp_funcs && pp_funcs->get_power_limit) { } else if (pp_funcs && pp_funcs->get_power_limit) {
pp_funcs->get_power_limit(adev->powerplay.pp_handle, pp_funcs->get_power_limit(adev->powerplay.pp_handle, &limit,
&limit, &max_limit, true); pp_limit_level, power_type);
size = snprintf(buf, PAGE_SIZE, "%u\n", max_limit * 1000000); size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 1000000);
} else { } else {
size = snprintf(buf, PAGE_SIZE, "\n"); size = snprintf(buf, PAGE_SIZE, "\n");
} }
...@@ -2948,6 +2949,7 @@ static ssize_t amdgpu_hwmon_show_power_cap(struct device *dev, ...@@ -2948,6 +2949,7 @@ static ssize_t amdgpu_hwmon_show_power_cap(struct device *dev,
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_CURRENT;
uint32_t limit; uint32_t limit;
ssize_t size; ssize_t size;
int r; int r;
...@@ -2964,11 +2966,12 @@ static ssize_t amdgpu_hwmon_show_power_cap(struct device *dev, ...@@ -2964,11 +2966,12 @@ static ssize_t amdgpu_hwmon_show_power_cap(struct device *dev,
} }
if (is_support_sw_smu(adev)) { if (is_support_sw_smu(adev)) {
smu_get_power_limit(&adev->smu, &limit, PP_PWR_LIMIT_CURRENT, power_type); smu_get_power_limit(&adev->smu, &limit,
pp_limit_level, power_type);
size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 1000000); size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 1000000);
} else if (pp_funcs && pp_funcs->get_power_limit) { } else if (pp_funcs && pp_funcs->get_power_limit) {
pp_funcs->get_power_limit(adev->powerplay.pp_handle, pp_funcs->get_power_limit(adev->powerplay.pp_handle, &limit,
&limit, NULL, false); pp_limit_level, power_type);
size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 1000000); size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 1000000);
} else { } else {
size = snprintf(buf, PAGE_SIZE, "\n"); size = snprintf(buf, PAGE_SIZE, "\n");
...@@ -2987,6 +2990,7 @@ static ssize_t amdgpu_hwmon_show_power_cap_default(struct device *dev, ...@@ -2987,6 +2990,7 @@ static ssize_t amdgpu_hwmon_show_power_cap_default(struct device *dev,
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_DEFAULT;
uint32_t limit; uint32_t limit;
ssize_t size; ssize_t size;
int r; int r;
...@@ -3003,11 +3007,12 @@ static ssize_t amdgpu_hwmon_show_power_cap_default(struct device *dev, ...@@ -3003,11 +3007,12 @@ static ssize_t amdgpu_hwmon_show_power_cap_default(struct device *dev,
} }
if (is_support_sw_smu(adev)) { if (is_support_sw_smu(adev)) {
smu_get_power_limit(&adev->smu, &limit, PP_PWR_LIMIT_DEFAULT, power_type); smu_get_power_limit(&adev->smu, &limit,
pp_limit_level, power_type);
size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 1000000); size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 1000000);
} else if (pp_funcs && pp_funcs->get_power_limit) { } else if (pp_funcs && pp_funcs->get_power_limit) {
pp_funcs->get_power_limit(adev->powerplay.pp_handle, pp_funcs->get_power_limit(adev->powerplay.pp_handle, &limit,
&limit, NULL, true); pp_limit_level, power_type);
size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 1000000); size = snprintf(buf, PAGE_SIZE, "%u\n", limit * 1000000);
} else { } else {
size = snprintf(buf, PAGE_SIZE, "\n"); size = snprintf(buf, PAGE_SIZE, "\n");
......
...@@ -1035,31 +1035,42 @@ static int pp_set_power_limit(void *handle, uint32_t limit) ...@@ -1035,31 +1035,42 @@ static int pp_set_power_limit(void *handle, uint32_t limit)
} }
static int pp_get_power_limit(void *handle, uint32_t *limit, static int pp_get_power_limit(void *handle, uint32_t *limit,
uint32_t *max_limit, bool default_limit) enum pp_power_limit_level pp_limit_level,
enum pp_power_type power_type)
{ {
struct pp_hwmgr *hwmgr = handle; struct pp_hwmgr *hwmgr = handle;
int ret = 0;
if (!hwmgr || !hwmgr->pm_en ||!limit) if (!hwmgr || !hwmgr->pm_en ||!limit)
return -EINVAL; return -EINVAL;
if (power_type != PP_PWR_TYPE_SUSTAINED)
return -EOPNOTSUPP;
mutex_lock(&hwmgr->smu_lock); mutex_lock(&hwmgr->smu_lock);
if (default_limit) { switch (pp_limit_level) {
case PP_PWR_LIMIT_CURRENT:
*limit = hwmgr->power_limit;
break;
case PP_PWR_LIMIT_DEFAULT:
*limit = hwmgr->default_power_limit;
break;
case PP_PWR_LIMIT_MAX:
*limit = hwmgr->default_power_limit; *limit = hwmgr->default_power_limit;
if (max_limit) {
*max_limit = *limit;
if (hwmgr->od_enabled) { if (hwmgr->od_enabled) {
*max_limit *= (100 + hwmgr->platform_descriptor.TDPODLimit); *limit *= (100 + hwmgr->platform_descriptor.TDPODLimit);
*max_limit /= 100; *limit /= 100;
}
} }
break;
default:
ret = -EOPNOTSUPP;
break;
} }
else
*limit = hwmgr->power_limit;
mutex_unlock(&hwmgr->smu_lock); mutex_unlock(&hwmgr->smu_lock);
return 0; return ret;
} }
static int pp_display_configuration_change(void *handle, static int pp_display_configuration_change(void *handle,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment