]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/pm: Get max/min frequency on aldebaran VF
authorLijo Lazar <lijo.lazar@amd.com>
Sat, 12 Jul 2025 06:40:48 +0000 (12:10 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 16 Jul 2025 20:14:37 +0000 (16:14 -0400)
PMFW interface to get max/min frequencies is not available on aldebaran
VFs. Use data, if available, in DPM tables to get the max/min
frequencies.

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Asad Kamal <asad.kamal@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c

index 6de653d2ed62b3bb9c8132072b9625e550d0789f..c63d2e28954d0468e6fa00a7d816709ee2c863af 100644 (file)
@@ -342,6 +342,61 @@ static int aldebaran_get_allowed_feature_mask(struct smu_context *smu,
        return 0;
 }
 
+static int aldebaran_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;
+       uint32_t min_clk, max_clk;
+
+       if (amdgpu_sriov_vf(smu->adev)) {
+               switch (clk_type) {
+               case SMU_MCLK:
+               case SMU_UCLK:
+                       dpm_table = &dpm_context->dpm_tables.uclk_table;
+                       break;
+               case SMU_GFXCLK:
+               case SMU_SCLK:
+                       dpm_table = &dpm_context->dpm_tables.gfx_table;
+                       break;
+               case SMU_SOCCLK:
+                       dpm_table = &dpm_context->dpm_tables.soc_table;
+                       break;
+               case SMU_FCLK:
+                       dpm_table = &dpm_context->dpm_tables.fclk_table;
+                       break;
+               case SMU_VCLK:
+                       dpm_table = &dpm_context->dpm_tables.vclk_table;
+                       break;
+               case SMU_DCLK:
+                       dpm_table = &dpm_context->dpm_tables.dclk_table;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+
+               min_clk = dpm_table->min;
+               max_clk = dpm_table->max;
+
+               if (min) {
+                       if (!min_clk)
+                               return -ENODATA;
+                       *min = min_clk;
+               }
+               if (max) {
+                       if (!max_clk)
+                               return -ENODATA;
+                       *max = max_clk;
+               }
+
+       } else {
+               return smu_v13_0_get_dpm_ultimate_freq(smu, clk_type, min, max);
+       }
+
+       return 0;
+}
+
 static int aldebaran_set_default_dpm_table(struct smu_context *smu)
 {
        struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
@@ -2081,7 +2136,7 @@ static const struct pptable_funcs aldebaran_ppt_funcs = {
        .set_azalia_d3_pme = smu_v13_0_set_azalia_d3_pme,
        .get_max_sustainable_clocks_by_dc = smu_v13_0_get_max_sustainable_clocks_by_dc,
        .get_bamaco_support = aldebaran_get_bamaco_support,
-       .get_dpm_ultimate_freq = smu_v13_0_get_dpm_ultimate_freq,
+       .get_dpm_ultimate_freq = aldebaran_get_dpm_ultimate_freq,
        .set_soft_freq_limited_range = aldebaran_set_soft_freq_limited_range,
        .od_edit_dpm_table = aldebaran_usr_edit_dpm_table,
        .set_df_cstate = aldebaran_set_df_cstate,