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

Alex Deucher alexdeucher at gmail.com
Wed Apr 11 17:23:45 UTC 2018


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>

> 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