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