[PATCH 05/13] drm/amd/powerplay: retrieve all clock ranges on startup

Alex Deucher alexdeucher at gmail.com
Tue Jun 19 15:03:26 UTC 2018


On Tue, Jun 19, 2018 at 3:38 AM, Evan Quan <evan.quan at amd.com> wrote:
> So that we do not need to use PPSMC_MSG_GetMin/MaxDpmFreq to
> get the clock ranges on runtime. Since that causes some problems.
>
> Change-Id: Ia0d6390c976749538b35c8ffde5d1e661b4944c0
> Signed-off-by: Evan Quan <evan.quan at amd.com>
> ---
>  drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c | 69 +++++++++++++++++-----
>  drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h |  8 +++
>  2 files changed, 61 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
> index bc976e1..ea530af 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
> @@ -856,6 +856,48 @@ static int vega12_power_control_set_level(struct pp_hwmgr *hwmgr)
>         return result;
>  }
>
> +static int vega12_get_all_clock_ranges_helper(struct pp_hwmgr *hwmgr,
> +               PPCLK_e clkid, struct vega12_clock_range *clock)
> +{
> +       /* AC Max */
> +       PP_ASSERT_WITH_CODE(
> +               smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetMaxDpmFreq, (clkid << 16)) == 0,
> +               "[GetClockRanges] Failed to get max ac clock from SMC!",
> +               return -1);


Please use a proper error code here (e.g., -EINVAL) rather than -1.

> +       vega12_read_arg_from_smc(hwmgr, &(clock->ACMax));
> +
> +       /* AC Min */
> +       PP_ASSERT_WITH_CODE(
> +               smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetMinDpmFreq, (clkid << 16)) == 0,
> +               "[GetClockRanges] Failed to get min ac clock from SMC!",
> +               return -1);

Same here.

> +       vega12_read_arg_from_smc(hwmgr, &(clock->ACMin));
> +
> +       /* DC Max */
> +       PP_ASSERT_WITH_CODE(
> +               smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetDcModeMaxDpmFreq, (clkid << 16)) == 0,
> +               "[GetClockRanges] Failed to get max dc clock from SMC!",
> +               return -1);

and here.

> +       vega12_read_arg_from_smc(hwmgr, &(clock->DCMax));
> +
> +       return 0;
> +}
> +
> +static int vega12_get_all_clock_ranges(struct pp_hwmgr *hwmgr)
> +{
> +       struct vega12_hwmgr *data =
> +                       (struct vega12_hwmgr *)(hwmgr->backend);
> +       uint32_t i;
> +
> +       for (i = 0; i < PPCLK_COUNT; i++)
> +               PP_ASSERT_WITH_CODE(!vega12_get_all_clock_ranges_helper(hwmgr,
> +                                       i, &(data->clk_range[i])),
> +                               "Failed to get clk range from SMC!",
> +                               return -1);


And here.  With those fixed:
Acked-by: Alex Deucher <alexander.deucher at amd.com>

> +
> +       return 0;
> +}
> +
>  static int vega12_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
>  {
>         int tmp_result, result = 0;
> @@ -883,6 +925,11 @@ static int vega12_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
>                         "Failed to power control set level!",
>                         result = tmp_result);
>
> +       result = vega12_get_all_clock_ranges(hwmgr);
> +       PP_ASSERT_WITH_CODE(!result,
> +                       "Failed to get all clock ranges!",
> +                       return result);
> +
>         result = vega12_odn_initialize_default_settings(hwmgr);
>         PP_ASSERT_WITH_CODE(!result,
>                         "Failed to power control set level!",
> @@ -1472,24 +1519,14 @@ static int vega12_get_clock_ranges(struct pp_hwmgr *hwmgr,
>                 PPCLK_e clock_select,
>                 bool max)
>  {
> -       int result;
> -       *clock = 0;
> +       struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend);
>
> -       if (max) {
> -                PP_ASSERT_WITH_CODE(
> -                       smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetMaxDpmFreq, (clock_select << 16)) == 0,
> -                       "[GetClockRanges] Failed to get max clock from SMC!",
> -                       return -1);
> -               result = vega12_read_arg_from_smc(hwmgr, clock);
> -       } else {
> -               PP_ASSERT_WITH_CODE(
> -                       smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetMinDpmFreq, (clock_select << 16)) == 0,
> -                       "[GetClockRanges] Failed to get min clock from SMC!",
> -                       return -1);
> -               result = vega12_read_arg_from_smc(hwmgr, clock);
> -       }
> +       if (max)
> +               *clock = data->clk_range[clock_select].ACMax;
> +       else
> +               *clock = data->clk_range[clock_select].ACMin;
>
> -       return result;
> +       return 0;
>  }
>
>  static int vega12_get_sclks(struct pp_hwmgr *hwmgr,
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h
> index 49b38df..e18c083 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h
> @@ -304,6 +304,12 @@ struct vega12_odn_fan_table {
>         bool            force_fan_pwm;
>  };
>
> +struct vega12_clock_range {
> +       uint32_t        ACMax;
> +       uint32_t        ACMin;
> +       uint32_t        DCMax;
> +};
> +
>  struct vega12_hwmgr {
>         struct vega12_dpm_table          dpm_table;
>         struct vega12_dpm_table          golden_dpm_table;
> @@ -385,6 +391,8 @@ struct vega12_hwmgr {
>         uint32_t                       smu_version;
>         struct smu_features            smu_features[GNLD_FEATURES_MAX];
>         struct vega12_smc_state_table  smc_state_table;
> +
> +       struct vega12_clock_range      clk_range[PPCLK_COUNT];
>  };
>
>  #define VEGA12_DPM2_NEAR_TDP_DEC                      10
> --
> 2.7.4
>
> _______________________________________________
> 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