[PATCH 4/6] drm/amd/powerplay: support SMU metrics table on Vega12

Alex Deucher alexdeucher at gmail.com
Fri Apr 19 15:11:36 UTC 2019


On Thu, Apr 18, 2019 at 5:03 AM Evan Quan <evan.quan at amd.com> wrote:
>
> That should provide some necessary sensor information.
>
> Change-Id: I898371cef06795c5369a14c4dd3fe8717959d81a
> Signed-off-by: Evan Quan <evan.quan at amd.com>

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  .../drm/amd/powerplay/hwmgr/vega12_hwmgr.c    | 21 +++++++++++++++++++
>  .../drm/amd/powerplay/hwmgr/vega12_hwmgr.h    |  3 +++
>  .../drm/amd/powerplay/smumgr/vega12_smumgr.c  | 21 +++++++++++++++++++
>  3 files changed, 45 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
> index a283046347c9..695ac2875540 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
> @@ -1237,6 +1237,27 @@ static uint32_t vega12_dpm_get_mclk(struct pp_hwmgr *hwmgr, bool low)
>         return (mem_clk * 100);
>  }
>
> +static int vega12_get_metrics_table(struct pp_hwmgr *hwmgr, SmuMetrics_t *metrics_table)
> +{
> +       struct vega12_hwmgr *data =
> +                       (struct vega12_hwmgr *)(hwmgr->backend);
> +       int ret = 0;
> +
> +       if (!data->metrics_time || time_after(jiffies, data->metrics_time + HZ / 2)) {
> +               ret = smum_smc_table_manager(hwmgr, (uint8_t *)metrics_table,
> +                               TABLE_SMU_METRICS, true);
> +               if (ret) {
> +                       pr_info("Failed to export SMU metrics table!\n");
> +                       return ret;
> +               }
> +               memcpy(&data->metrics_table, metrics_table, sizeof(SmuMetrics_t));
> +               data->metrics_time = jiffies;
> +       } else
> +               memcpy(metrics_table, &data->metrics_table, sizeof(SmuMetrics_t));
> +
> +       return ret;
> +}
> +
>  static int vega12_get_gpu_power(struct pp_hwmgr *hwmgr, uint32_t *query)
>  {
>  #if 0
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h
> index b3e424d28994..73875399666a 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h
> @@ -396,6 +396,9 @@ struct vega12_hwmgr {
>
>         /* ---- Gfxoff ---- */
>         bool                           gfxoff_controlled_by_driver;
> +
> +       unsigned long                  metrics_time;
> +       SmuMetrics_t                   metrics_table;
>  };
>
>  #define VEGA12_DPM2_NEAR_TDP_DEC                      10
> diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/vega12_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/vega12_smumgr.c
> index ddb801517667..1eaf0fa28ef7 100644
> --- a/drivers/gpu/drm/amd/powerplay/smumgr/vega12_smumgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/smumgr/vega12_smumgr.c
> @@ -287,8 +287,26 @@ static int vega12_smu_init(struct pp_hwmgr *hwmgr)
>         priv->smu_tables.entry[TABLE_OVERDRIVE].version = 0x01;
>         priv->smu_tables.entry[TABLE_OVERDRIVE].size = sizeof(OverDriveTable_t);
>
> +       /* allocate space for SMU_METRICS table */
> +       ret = amdgpu_bo_create_kernel((struct amdgpu_device *)hwmgr->adev,
> +                                     sizeof(SmuMetrics_t),
> +                                     PAGE_SIZE,
> +                                     AMDGPU_GEM_DOMAIN_VRAM,
> +                                     &priv->smu_tables.entry[TABLE_SMU_METRICS].handle,
> +                                     &priv->smu_tables.entry[TABLE_SMU_METRICS].mc_addr,
> +                                     &priv->smu_tables.entry[TABLE_SMU_METRICS].table);
> +       if (ret)
> +               goto err4;
> +
> +       priv->smu_tables.entry[TABLE_SMU_METRICS].version = 0x01;
> +       priv->smu_tables.entry[TABLE_SMU_METRICS].size = sizeof(SmuMetrics_t);
> +
>         return 0;
>
> +err4:
> +       amdgpu_bo_free_kernel(&priv->smu_tables.entry[TABLE_OVERDRIVE].handle,
> +                               &priv->smu_tables.entry[TABLE_OVERDRIVE].mc_addr,
> +                               &priv->smu_tables.entry[TABLE_OVERDRIVE].table);
>  err3:
>         amdgpu_bo_free_kernel(&priv->smu_tables.entry[TABLE_AVFS_FUSE_OVERRIDE].handle,
>                                 &priv->smu_tables.entry[TABLE_AVFS_FUSE_OVERRIDE].mc_addr,
> @@ -334,6 +352,9 @@ static int vega12_smu_fini(struct pp_hwmgr *hwmgr)
>                 amdgpu_bo_free_kernel(&priv->smu_tables.entry[TABLE_OVERDRIVE].handle,
>                                       &priv->smu_tables.entry[TABLE_OVERDRIVE].mc_addr,
>                                       &priv->smu_tables.entry[TABLE_OVERDRIVE].table);
> +               amdgpu_bo_free_kernel(&priv->smu_tables.entry[TABLE_SMU_METRICS].handle,
> +                                     &priv->smu_tables.entry[TABLE_SMU_METRICS].mc_addr,
> +                                     &priv->smu_tables.entry[TABLE_SMU_METRICS].table);
>                 kfree(hwmgr->smu_backend);
>                 hwmgr->smu_backend = NULL;
>         }
> --
> 2.21.0
>
> _______________________________________________
> 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