[PATCH 3/3] drm/amd/pp: Remove struct pp_gpu_power
Tom St Denis
tstdenis at amd.com
Wed Apr 11 17:25:36 UTC 2018
On 04/11/2018 01:23 PM, Alex Deucher wrote:
> On Wed, Apr 11, 2018 at 2:31 AM, Rex Zhu <Rex.Zhu at amd.com> wrote:
>> This struct can't be used for all asics.
>>
>> Currently smu only calculate average gpu power in real time.
>>
>> for vddc/vddci/max power,
>> we can read them per 1ms through some registers. but
>>
>> 1. the type of return values is not unified.
>> For Vi, return type is uint. For vega, return type is float.
>>
>> 2. need to assign the unit time to calculate the average power.
>>
>> so remove this struct.
>>
>> if user need to know the power on vddc/vddci.
>> we can export them with new common interface/struct.
>>
>
> If Tom and Eric are ok with this:
> Acked-by: Alex Deucher <alexander.deucher at amd.com>
It'll break the sensor reading in umr but that's fairly minor and easy
to fix. I don't really consider the --top output of umr as mission
critical (even though it can be handy). I'm ok with the change.
Once this lands on drm-next I'll upgrade umr to support it.
Cheers,
Tom
>
>> Signed-off-by: Rex Zhu <Rex.Zhu at amd.com>
>> ---
>> drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 7 ++-----
>> drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 22 +++++++--------------
>> drivers/gpu/drm/amd/include/kgd_pp_interface.h | 7 -------
>> drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 23 +++++++++-------------
>> drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 17 +++++++---------
>> drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c | 13 ++++--------
>> 6 files changed, 29 insertions(+), 60 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>> index 487d39e..1e59818 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>> @@ -701,9 +701,6 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
>> }
>> }
>> case AMDGPU_INFO_SENSOR: {
>> - struct pp_gpu_power query = {0};
>> - int query_size = sizeof(query);
>> -
>> if (!adev->pm.dpm_enabled)
>> return -ENOENT;
>>
>> @@ -746,10 +743,10 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
>> /* get average GPU power */
>> if (amdgpu_dpm_read_sensor(adev,
>> AMDGPU_PP_SENSOR_GPU_POWER,
>> - (void *)&query, &query_size)) {
>> + (void *)&ui32, &ui32_size)) {
>> return -EINVAL;
>> }
>> - ui32 = query.average_gpu_power >> 8;
>> + ui32 >>= 8;
>> break;
>> case AMDGPU_INFO_SENSOR_VDDNB:
>> /* get VDDNB in millivolts */
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
>> index e5f60fc..744f105 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
>> @@ -1020,8 +1020,8 @@ static ssize_t amdgpu_hwmon_show_power_avg(struct device *dev,
>> {
>> struct amdgpu_device *adev = dev_get_drvdata(dev);
>> struct drm_device *ddev = adev->ddev;
>> - struct pp_gpu_power query = {0};
>> - int r, size = sizeof(query);
>> + u32 query = 0;
>> + int r, size = sizeof(u32);
>> unsigned uw;
>>
>> /* Can't get power when the card is off */
>> @@ -1041,7 +1041,7 @@ static ssize_t amdgpu_hwmon_show_power_avg(struct device *dev,
>> return r;
>>
>> /* convert to microwatts */
>> - uw = (query.average_gpu_power >> 8) * 1000000;
>> + uw = (query >> 8) * 1000000 + (query & 0xff) * 1000;
>>
>> return snprintf(buf, PAGE_SIZE, "%u\n", uw);
>> }
>> @@ -1752,7 +1752,7 @@ void amdgpu_pm_compute_clocks(struct amdgpu_device *adev)
>> static int amdgpu_debugfs_pm_info_pp(struct seq_file *m, struct amdgpu_device *adev)
>> {
>> uint32_t value;
>> - struct pp_gpu_power query = {0};
>> + uint32_t query = 0;
>> int size;
>>
>> /* sanity check PP is enabled */
>> @@ -1775,17 +1775,9 @@ static int amdgpu_debugfs_pm_info_pp(struct seq_file *m, struct amdgpu_device *a
>> seq_printf(m, "\t%u mV (VDDGFX)\n", value);
>> if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_VDDNB, (void *)&value, &size))
>> seq_printf(m, "\t%u mV (VDDNB)\n", value);
>> - size = sizeof(query);
>> - if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_POWER, (void *)&query, &size)) {
>> - seq_printf(m, "\t%u.%u W (VDDC)\n", query.vddc_power >> 8,
>> - query.vddc_power & 0xff);
>> - seq_printf(m, "\t%u.%u W (VDDCI)\n", query.vddci_power >> 8,
>> - query.vddci_power & 0xff);
>> - seq_printf(m, "\t%u.%u W (max GPU)\n", query.max_gpu_power >> 8,
>> - query.max_gpu_power & 0xff);
>> - seq_printf(m, "\t%u.%u W (average GPU)\n", query.average_gpu_power >> 8,
>> - query.average_gpu_power & 0xff);
>> - }
>> + size = sizeof(uint32_t);
>> + if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_POWER, (void *)&query, &size))
>> + seq_printf(m, "\t%u.%u W (average GPU)\n", query >> 8, query & 0xff);
>> size = sizeof(value);
>> seq_printf(m, "\n");
>>
>> diff --git a/drivers/gpu/drm/amd/include/kgd_pp_interface.h b/drivers/gpu/drm/amd/include/kgd_pp_interface.h
>> index 5c840c0..1bec907 100644
>> --- a/drivers/gpu/drm/amd/include/kgd_pp_interface.h
>> +++ b/drivers/gpu/drm/amd/include/kgd_pp_interface.h
>> @@ -149,13 +149,6 @@ struct pp_states_info {
>> uint32_t states[16];
>> };
>>
>> -struct pp_gpu_power {
>> - uint32_t vddc_power;
>> - uint32_t vddci_power;
>> - uint32_t max_gpu_power;
>> - uint32_t average_gpu_power;
>> -};
>> -
>> #define PP_GROUP_MASK 0xF0000000
>> #define PP_GROUP_SHIFT 28
>>
>> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
>> index 20f5a6f..494c1ff 100644
>> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
>> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
>> @@ -3356,36 +3356,34 @@ static int smu7_get_pp_table_entry(struct pp_hwmgr *hwmgr,
>> return 0;
>> }
>>
>> -static int smu7_get_gpu_power(struct pp_hwmgr *hwmgr,
>> - struct pp_gpu_power *query)
>> +static int smu7_get_gpu_power(struct pp_hwmgr *hwmgr, u32 *query)
>> {
>> int i;
>> + u32 tmp = 0;
>>
>> if (!query)
>> return -EINVAL;
>>
>> -
>> - memset(query, 0, sizeof *query);
>> -
>> smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetCurrPkgPwr, 0);
>> - query->average_gpu_power = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0);
>> + tmp = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0);
>>
>> - if (query->average_gpu_power != 0)
>> + if (tmp != 0)
>> return 0;
>>
>> smum_send_msg_to_smc(hwmgr, PPSMC_MSG_PmStatusLogStart);
>> cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
>> ixSMU_PM_STATUS_94, 0);
>>
>> - for (i = 0; i < 20; i++) {
>> + for (i = 0; i < 10; i++) {
>> mdelay(1);
>> smum_send_msg_to_smc(hwmgr, PPSMC_MSG_PmStatusLogSample);
>> - query->average_gpu_power = cgs_read_ind_register(hwmgr->device,
>> + tmp = cgs_read_ind_register(hwmgr->device,
>> CGS_IND_REG__SMC,
>> ixSMU_PM_STATUS_94);
>> - if (query->average_gpu_power != 0)
>> + if (tmp != 0)
>> break;
>> }
>> + *query = tmp;
>>
>> return 0;
>> }
>> @@ -3438,10 +3436,7 @@ static int smu7_read_sensor(struct pp_hwmgr *hwmgr, int idx,
>> *size = 4;
>> return 0;
>> case AMDGPU_PP_SENSOR_GPU_POWER:
>> - if (*size < sizeof(struct pp_gpu_power))
>> - return -EINVAL;
>> - *size = sizeof(struct pp_gpu_power);
>> - return smu7_get_gpu_power(hwmgr, (struct pp_gpu_power *)value);
>> + return smu7_get_gpu_power(hwmgr, (uint32_t *)value);
>> case AMDGPU_PP_SENSOR_VDDGFX:
>> if ((data->vr_config & 0xff) == 0x2)
>> val_vid = PHM_READ_INDIRECT_FIELD(hwmgr->device,
>> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
>> index 127c550..0bbc564 100644
>> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
>> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
>> @@ -3781,16 +3781,18 @@ static uint32_t vega10_dpm_get_mclk(struct pp_hwmgr *hwmgr, bool low)
>> }
>>
>> static int vega10_get_gpu_power(struct pp_hwmgr *hwmgr,
>> - struct pp_gpu_power *query)
>> + uint32_t *query)
>> {
>> uint32_t value;
>>
>> + if (!query)
>> + return -EINVAL;
>> +
>> smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetCurrPkgPwr);
>> value = smum_get_argument(hwmgr);
>>
>> - /* power value is an integer */
>> - memset(query, 0, sizeof *query);
>> - query->average_gpu_power = value << 8;
>> + /* SMC returning actual watts, keep consistent with legacy asics, low 8 bit as 8 fractional bits */
>> + *query = value << 8;
>>
>> return 0;
>> }
>> @@ -3840,12 +3842,7 @@ static int vega10_read_sensor(struct pp_hwmgr *hwmgr, int idx,
>> *size = 4;
>> break;
>> case AMDGPU_PP_SENSOR_GPU_POWER:
>> - if (*size < sizeof(struct pp_gpu_power))
>> - ret = -EINVAL;
>> - else {
>> - *size = sizeof(struct pp_gpu_power);
>> - ret = vega10_get_gpu_power(hwmgr, (struct pp_gpu_power *)value);
>> - }
>> + ret = vega10_get_gpu_power(hwmgr, (uint32_t *)value);
>> break;
>> case AMDGPU_PP_SENSOR_VDDGFX:
>> val_vid = (RREG32_SOC15(SMUIO, 0, mmSMUSVI0_PLANE0_CURRENTVID) &
>> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
>> index 3e1ed0a..782e209 100644
>> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
>> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
>> @@ -1113,8 +1113,7 @@ static uint32_t vega12_dpm_get_mclk(struct pp_hwmgr *hwmgr, bool low)
>> return (mem_clk * 100);
>> }
>>
>> -static int vega12_get_gpu_power(struct pp_hwmgr *hwmgr,
>> - struct pp_gpu_power *query)
>> +static int vega12_get_gpu_power(struct pp_hwmgr *hwmgr, uint32_t *query)
>> {
>> #if 0
>> uint32_t value;
>> @@ -1126,7 +1125,7 @@ static int vega12_get_gpu_power(struct pp_hwmgr *hwmgr,
>>
>> vega12_read_arg_from_smc(hwmgr, &value);
>> /* power value is an integer */
>> - query->average_gpu_power = value << 8;
>> + *query = value << 8;
>> #endif
>> return 0;
>> }
>> @@ -1235,12 +1234,8 @@ static int vega12_read_sensor(struct pp_hwmgr *hwmgr, int idx,
>> *size = 4;
>> break;
>> case AMDGPU_PP_SENSOR_GPU_POWER:
>> - if (*size < sizeof(struct pp_gpu_power))
>> - ret = -EINVAL;
>> - else {
>> - *size = sizeof(struct pp_gpu_power);
>> - ret = vega12_get_gpu_power(hwmgr, (struct pp_gpu_power *)value);
>> - }
>> + ret = vega12_get_gpu_power(hwmgr, (uint32_t *)value);
>> +
>> break;
>> default:
>> ret = -EINVAL;
>> --
>> 1.9.1
>>
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list