[PATCH 3/3] drm/amd/pp: Remove struct pp_gpu_power

Eric Huang jinhuieric.huang at amd.com
Wed Apr 11 17:40:00 UTC 2018


I am OK with this change.

Regards,
Eric

On 2018-04-11 01:25 PM, Tom St Denis wrote:
>
>
> 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
> _______________________________________________
> 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