Update the reported maximum shader clock to the value which can
be guarded to be achieved on all cards. This is to align with
Window setting.

Signed-off-by: Evan Quan <[email protected]>
Change-Id: I83da5ec931664af36ee6db3cb13ef655db54220e
---
 .../drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c  | 70 ++++++++++++++++++-
 1 file changed, 69 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
index 4adbab62e9dd..5a0593d336be 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
@@ -541,6 +541,23 @@ static int smu_v13_0_0_set_default_dpm_table(struct 
smu_context *smu)
                                                     dpm_table);
                if (ret)
                        return ret;
+
+               /*
+                * Update the reported maximum shader clock to the value
+                * which can be guarded to be achieved on all cards. This
+                * is aligned with Window setting. And considering that value
+                * might be not the peak frequency the card can achieve, it
+                * is normal some real-time clock frequency can overtake this
+                * labelled maximum clock frequency(for example in pp_dpm_sclk
+                * sysfs output).
+                */
+               if (skutable->DriverReportedClocks.GameClockAc &&
+                   (dpm_table->dpm_levels[dpm_table->count - 1].value >
+                   skutable->DriverReportedClocks.GameClockAc)) {
+                       dpm_table->dpm_levels[dpm_table->count - 1].value =
+                               skutable->DriverReportedClocks.GameClockAc;
+                       dpm_table->max = 
skutable->DriverReportedClocks.GameClockAc;
+               }
        } else {
                dpm_table->count = 1;
                dpm_table->dpm_levels[0].value = 
smu->smu_table.boot_values.gfxclk / 100;
@@ -803,6 +820,57 @@ static int smu_v13_0_0_get_smu_metrics_data(struct 
smu_context *smu,
        return ret;
 }
 
+static int smu_v13_0_0_get_dpm_ultimate_freq(struct smu_context *smu,
+                                            enum smu_clk_type clk_type,
+                                            uint32_t *min,
+                                            uint32_t *max)
+{
+       struct smu_13_0_dpm_context *dpm_context =
+               smu->smu_dpm.dpm_context;
+       struct smu_13_0_dpm_table *dpm_table;
+
+       switch (clk_type) {
+       case SMU_MCLK:
+       case SMU_UCLK:
+               /* uclk dpm table */
+               dpm_table = &dpm_context->dpm_tables.uclk_table;
+               break;
+       case SMU_GFXCLK:
+       case SMU_SCLK:
+               /* gfxclk dpm table */
+               dpm_table = &dpm_context->dpm_tables.gfx_table;
+               break;
+       case SMU_SOCCLK:
+               /* socclk dpm table */
+               dpm_table = &dpm_context->dpm_tables.soc_table;
+               break;
+       case SMU_FCLK:
+               /* fclk dpm table */
+               dpm_table = &dpm_context->dpm_tables.fclk_table;
+               break;
+       case SMU_VCLK:
+       case SMU_VCLK1:
+               /* vclk dpm table */
+               dpm_table = &dpm_context->dpm_tables.vclk_table;
+               break;
+       case SMU_DCLK:
+       case SMU_DCLK1:
+               /* dclk dpm table */
+               dpm_table = &dpm_context->dpm_tables.dclk_table;
+               break;
+       default:
+               dev_err(smu->adev->dev, "Unsupported clock type!\n");
+               return -EINVAL;
+       }
+
+       if (min)
+               *min = dpm_table->min;
+       if (max)
+               *max = dpm_table->max;
+
+       return 0;
+}
+
 static int smu_v13_0_0_read_sensor(struct smu_context *smu,
                                   enum amd_pp_sensors sensor,
                                   void *data,
@@ -1908,7 +1976,7 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = 
{
        .get_enabled_mask = smu_cmn_get_enabled_mask,
        .dpm_set_vcn_enable = smu_v13_0_set_vcn_enable,
        .dpm_set_jpeg_enable = smu_v13_0_set_jpeg_enable,
-       .get_dpm_ultimate_freq = smu_v13_0_get_dpm_ultimate_freq,
+       .get_dpm_ultimate_freq = smu_v13_0_0_get_dpm_ultimate_freq,
        .get_vbios_bootup_values = smu_v13_0_get_vbios_bootup_values,
        .read_sensor = smu_v13_0_0_read_sensor,
        .feature_is_enabled = smu_cmn_feature_is_enabled,
-- 
2.34.1

Reply via email to