}
 
        if (is_support_sw_smu(adev)) {
-               ret = smu_get_dpm_freq_range(&adev->smu, SMU_SCLK, &min_freq, &max_freq, true);
+               ret = smu_get_dpm_freq_range(&adev->smu, SMU_SCLK, &min_freq, &max_freq);
                if (ret || val > max_freq || val < min_freq)
                        return -EINVAL;
                ret = smu_set_soft_freq_range(&adev->smu, SMU_SCLK, (uint32_t)val, (uint32_t)val);
 
        if (is_support_sw_smu(adev)) {
                ret = smu_get_dpm_freq_range(&adev->smu, SMU_GFXCLK,
                                             low ? &clk_freq : NULL,
-                                            !low ? &clk_freq : NULL,
-                                            true);
+                                            !low ? &clk_freq : NULL);
                if (ret)
                        return 0;
                return clk_freq * 100;
        if (is_support_sw_smu(adev)) {
                ret = smu_get_dpm_freq_range(&adev->smu, SMU_UCLK,
                                             low ? &clk_freq : NULL,
-                                            !low ? &clk_freq : NULL,
-                                            true);
+                                            !low ? &clk_freq : NULL);
                if (ret)
                        return 0;
                return clk_freq * 100;
 
        return ret;
 }
 
-int smu_get_dpm_freq_range(struct smu_context *smu, enum smu_clk_type clk_type,
-                          uint32_t *min, uint32_t *max, bool lock_needed)
+int smu_get_dpm_freq_range(struct smu_context *smu,
+                          enum smu_clk_type clk_type,
+                          uint32_t *min,
+                          uint32_t *max)
 {
-       uint32_t clock_limit;
        int ret = 0;
 
        if (!min && !max)
                return -EINVAL;
 
-       if (lock_needed)
-               mutex_lock(&smu->mutex);
-
-       if (!smu_clk_dpm_is_enabled(smu, clk_type)) {
-               switch (clk_type) {
-               case SMU_MCLK:
-               case SMU_UCLK:
-                       clock_limit = smu->smu_table.boot_values.uclk;
-                       break;
-               case SMU_GFXCLK:
-               case SMU_SCLK:
-                       clock_limit = smu->smu_table.boot_values.gfxclk;
-                       break;
-               case SMU_SOCCLK:
-                       clock_limit = smu->smu_table.boot_values.socclk;
-                       break;
-               default:
-                       clock_limit = 0;
-                       break;
-               }
+       mutex_lock(&smu->mutex);
 
-               /* clock in Mhz unit */
-               if (min)
-                       *min = clock_limit / 100;
-               if (max)
-                       *max = clock_limit / 100;
-       } else {
-               /*
-                * Todo: Use each asic(ASIC_ppt funcs) control the callbacks exposed to the
-                * core driver and then have helpers for stuff that is common(SMU_v11_x | SMU_v12_x funcs).
-                */
-               ret = smu_get_dpm_ultimate_freq(smu, clk_type, min, max);
-       }
+       if (smu->ppt_funcs->get_dpm_ultimate_freq)
+               ret = smu->ppt_funcs->get_dpm_ultimate_freq(smu,
+                                                           clk_type,
+                                                           min,
+                                                           max);
 
-       if (lock_needed)
-               mutex_unlock(&smu->mutex);
+       mutex_unlock(&smu->mutex);
 
        return ret;
 }
 
 int smu_get_dpm_level_count(struct smu_context *smu, enum smu_clk_type clk_type,
                            uint32_t *value);
 int smu_get_dpm_freq_range(struct smu_context *smu, enum smu_clk_type clk_type,
-                          uint32_t *min, uint32_t *max, bool lock_needed);
+                          uint32_t *min, uint32_t *max);
 int smu_set_soft_freq_range(struct smu_context *smu, enum smu_clk_type clk_type,
                            uint32_t min, uint32_t max);
 int smu_get_dpm_level_range(struct smu_context *smu, enum smu_clk_type clk_type,
 
        int ret = 0;
        uint32_t min_sclk_freq = 0, min_mclk_freq = 0;
 
-       ret = smu_get_dpm_freq_range(smu, SMU_SCLK, &min_sclk_freq, NULL, false);
+       ret = smu_v11_0_get_dpm_ultimate_freq(smu, SMU_SCLK, &min_sclk_freq, NULL);
        if (ret)
                return ret;
 
        smu->pstate_sclk = min_sclk_freq * 100;
 
-       ret = smu_get_dpm_freq_range(smu, SMU_MCLK, &min_mclk_freq, NULL, false);
+       ret = smu_v11_0_get_dpm_ultimate_freq(smu, SMU_MCLK, &min_mclk_freq, NULL);
        if (ret)
                return ret;
 
                return ret;
 
        if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_UCLK_BIT)) {
-               ret = smu_get_dpm_freq_range(smu, SMU_UCLK, NULL, &max_freq, false);
+               ret = smu_v11_0_get_dpm_ultimate_freq(smu, SMU_UCLK, NULL, &max_freq);
                if (ret)
                        return ret;
                ret = smu_v11_0_set_hard_freq_limited_range(smu, SMU_UCLK, 0, max_freq);
 
        for (i = 0; i < ARRAY_SIZE(clks); i++) {
                clk_type = clks[i];
-               ret = smu_get_dpm_freq_range(smu, clk_type, &min_freq, &max_freq, false);
+               ret = smu_v11_0_get_dpm_ultimate_freq(smu, clk_type, &min_freq, &max_freq);
                if (ret)
                        return ret;
 
 
        for (i = 0; i < ARRAY_SIZE(clks); i++) {
                clk_type = clks[i];
-               ret = smu_get_dpm_freq_range(smu, clk_type, &min_freq, &max_freq, false);
+               ret = smu_v11_0_get_dpm_ultimate_freq(smu, clk_type, &min_freq, &max_freq);
                if (ret)
                        return ret;
 
 
        case SMU_SCLK:
                /* retirve table returned paramters unit is MHz */
                cur_value = metrics.ClockFrequency[CLOCK_GFXCLK];
-               ret = smu_get_dpm_freq_range(smu, SMU_GFXCLK, &min, &max, false);
+               ret = smu_v12_0_get_dpm_ultimate_freq(smu, SMU_GFXCLK, &min, &max);
                if (!ret) {
                        /* driver only know min/max gfx_clk, Add level 1 for all other gfx clks */
                        if (cur_value  == max)
 
        for (i = 0; i < ARRAY_SIZE(clks); i++) {
                clk_type = clks[i];
-               ret = smu_get_dpm_freq_range(smu, clk_type, &min_freq, &max_freq, false);
+               ret = smu_v12_0_get_dpm_ultimate_freq(smu, clk_type, &min_freq, &max_freq);
                if (ret)
                        return ret;
 
 
                clk_type = clk_feature_map[i].clk_type;
 
-               ret = smu_get_dpm_freq_range(smu, clk_type, &min_freq, &max_freq, false);
+               ret = smu_v12_0_get_dpm_ultimate_freq(smu, clk_type, &min_freq, &max_freq);
                if (ret)
                        return ret;
 
                        return -EINVAL;
                }
 
-               ret = smu_get_dpm_freq_range(smu, SMU_GFXCLK, &min_freq, &max_freq, false);
+               ret = smu_v12_0_get_dpm_ultimate_freq(smu, SMU_GFXCLK, &min_freq, &max_freq);
                if (ret)
                        return ret;
                ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetSoftMaxGfxClk,
        int ret = 0;
        uint32_t sclk_freq = 0, uclk_freq = 0;
 
-       ret = smu_get_dpm_freq_range(smu, SMU_SCLK, NULL, &sclk_freq, false);
+       ret = smu_v12_0_get_dpm_ultimate_freq(smu, SMU_SCLK, NULL, &sclk_freq);
        if (ret)
                return ret;
 
        if (ret)
                return ret;
 
-       ret = smu_get_dpm_freq_range(smu, SMU_UCLK, NULL, &uclk_freq, false);
+       ret = smu_v12_0_get_dpm_ultimate_freq(smu, SMU_UCLK, NULL, &uclk_freq);
        if (ret)
                return ret;
 
 
        int ret = 0;
        uint32_t min_sclk_freq = 0, min_mclk_freq = 0;
 
-       ret = smu_get_dpm_freq_range(smu, SMU_SCLK, &min_sclk_freq, NULL, false);
+       ret = smu_v11_0_get_dpm_ultimate_freq(smu, SMU_SCLK, &min_sclk_freq, NULL);
        if (ret)
                return ret;
 
        smu->pstate_sclk = min_sclk_freq * 100;
 
-       ret = smu_get_dpm_freq_range(smu, SMU_MCLK, &min_mclk_freq, NULL, false);
+       ret = smu_v11_0_get_dpm_ultimate_freq(smu, SMU_MCLK, &min_mclk_freq, NULL);
        if (ret)
                return ret;
 
 #endif
 
        if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_UCLK_BIT)) {
-               ret = smu_get_dpm_freq_range(smu, SMU_UCLK, NULL, &max_freq, false);
+               ret = smu_v11_0_get_dpm_ultimate_freq(smu, SMU_UCLK, NULL, &max_freq);
                if (ret)
                        return ret;
                ret = smu_v11_0_set_hard_freq_limited_range(smu, SMU_UCLK, 0, max_freq);
 
        for (i = 0; i < ARRAY_SIZE(clks); i++) {
                clk_type = clks[i];
-               ret = smu_get_dpm_freq_range(smu, clk_type, &min_freq, &max_freq, false);
+               ret = smu_v11_0_get_dpm_ultimate_freq(smu, clk_type, &min_freq, &max_freq);
                if (ret)
                        return ret;
 
 
        for (i = 0; i < ARRAY_SIZE(clks); i++) {
                clk_type = clks[i];
-               ret = smu_get_dpm_freq_range(smu, clk_type, &min_freq, &max_freq, false);
+               ret = smu_v11_0_get_dpm_ultimate_freq(smu, clk_type, &min_freq, &max_freq);
                if (ret)
                        return ret;
 
 
 {
        int ret = 0, clk_id = 0;
        uint32_t param = 0;
+       uint32_t clock_limit;
+
+       if (!smu_clk_dpm_is_enabled(smu, clk_type)) {
+               switch (clk_type) {
+               case SMU_MCLK:
+               case SMU_UCLK:
+                       clock_limit = smu->smu_table.boot_values.uclk;
+                       break;
+               case SMU_GFXCLK:
+               case SMU_SCLK:
+                       clock_limit = smu->smu_table.boot_values.gfxclk;
+                       break;
+               case SMU_SOCCLK:
+                       clock_limit = smu->smu_table.boot_values.socclk;
+                       break;
+               default:
+                       clock_limit = 0;
+                       break;
+               }
+
+               /* clock in Mhz unit */
+               if (min)
+                       *min = clock_limit / 100;
+               if (max)
+                       *max = clock_limit / 100;
+
+               return 0;
+       }
 
        clk_id = smu_clk_get_index(smu, clk_type);
        if (clk_id < 0) {
 
 {
        int ret = 0;
        uint32_t mclk_mask, soc_mask;
+       uint32_t clock_limit;
+
+       if (!smu_clk_dpm_is_enabled(smu, clk_type)) {
+               switch (clk_type) {
+               case SMU_MCLK:
+               case SMU_UCLK:
+                       clock_limit = smu->smu_table.boot_values.uclk;
+                       break;
+               case SMU_GFXCLK:
+               case SMU_SCLK:
+                       clock_limit = smu->smu_table.boot_values.gfxclk;
+                       break;
+               case SMU_SOCCLK:
+                       clock_limit = smu->smu_table.boot_values.socclk;
+                       break;
+               default:
+                       clock_limit = 0;
+                       break;
+               }
+
+               /* clock in Mhz unit */
+               if (min)
+                       *min = clock_limit / 100;
+               if (max)
+                       *max = clock_limit / 100;
+
+               return 0;
+       }
 
        if (max) {
                ret = smu_get_profiling_clk_mask(smu, AMD_DPM_FORCED_LEVEL_PROFILE_PEAK,