]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
drm/amdgpu: add lock option for smu_set_soft_freq_range()
authorChengming Gui <Jack.Gui@amd.com>
Fri, 28 Feb 2020 06:54:50 +0000 (14:54 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 5 Mar 2020 05:27:38 +0000 (00:27 -0500)
Add lock_needed param for smu_set_soft_freq_range()

Signed-off-by: Chengming Gui <Jack.Gui@amd.com>
Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
drivers/gpu/drm/amd/powerplay/navi10_ppt.c
drivers/gpu/drm/amd/powerplay/renoir_ppt.c

index 9f6da26be90b8ad1041faa28f391fc3f314397c2..e3398f9c428451051172f8e14124ca06d97a5abe 100644 (file)
@@ -210,7 +210,7 @@ int smu_get_smc_version(struct smu_context *smu, uint32_t *if_version, uint32_t
 }
 
 int smu_set_soft_freq_range(struct smu_context *smu, enum smu_clk_type clk_type,
-                           uint32_t min, uint32_t max)
+                           uint32_t min, uint32_t max, bool lock_needed)
 {
        int ret = 0;
 
@@ -220,7 +220,12 @@ int smu_set_soft_freq_range(struct smu_context *smu, enum smu_clk_type clk_type,
        if (!smu_clk_dpm_is_enabled(smu, clk_type))
                return 0;
 
+       if (lock_needed)
+               mutex_lock(&smu->mutex);
        ret = smu_set_soft_freq_limited_range(smu, clk_type, min, max);
+       if (lock_needed)
+               mutex_unlock(&smu->mutex);
+
        return ret;
 }
 
index d652f920a65aa76be136e333f8b93a7c54157454..c8e72c73c3b6425afcfc66c503f6c5d2dccc6748 100644 (file)
@@ -707,7 +707,7 @@ int smu_get_dpm_level_count(struct smu_context *smu, enum smu_clk_type clk_type,
 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_set_soft_freq_range(struct smu_context *smu, enum smu_clk_type clk_type,
-                           uint32_t min, uint32_t max);
+                           uint32_t min, uint32_t max, bool lock_needed);
 int smu_set_hard_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,
index 04b569dad439f70962fbd73738bc0316df563492..6e41f3c9ff1b8d4c610f4eae66c2f42c7ba689ff 100644 (file)
@@ -970,7 +970,7 @@ static int navi10_force_clk_levels(struct smu_context *smu,
                if (ret)
                        return size;
 
-               ret = smu_set_soft_freq_range(smu, clk_type, min_freq, max_freq);
+               ret = smu_set_soft_freq_range(smu, clk_type, min_freq, max_freq, false);
                if (ret)
                        return size;
                break;
@@ -1094,7 +1094,7 @@ static int navi10_force_dpm_limit_value(struct smu_context *smu, bool highest)
                        return ret;
 
                force_freq = highest ? max_freq : min_freq;
-               ret = smu_set_soft_freq_range(smu, clk_type, force_freq, force_freq);
+               ret = smu_set_soft_freq_range(smu, clk_type, force_freq, force_freq, false);
                if (ret)
                        return ret;
        }
@@ -1120,7 +1120,7 @@ static int navi10_unforce_dpm_levels(struct smu_context *smu)
                if (ret)
                        return ret;
 
-               ret = smu_set_soft_freq_range(smu, clk_type, min_freq, max_freq);
+               ret = smu_set_soft_freq_range(smu, clk_type, min_freq, max_freq, false);
                if (ret)
                        return ret;
        }
@@ -1680,10 +1680,10 @@ static int navi10_set_standard_performance_level(struct smu_context *smu)
                return navi10_set_performance_level(smu, AMD_DPM_FORCED_LEVEL_AUTO);
        }
 
-       ret = smu_set_soft_freq_range(smu, SMU_SCLK, sclk_freq, sclk_freq);
+       ret = smu_set_soft_freq_range(smu, SMU_SCLK, sclk_freq, sclk_freq, false);
        if (ret)
                return ret;
-       ret = smu_set_soft_freq_range(smu, SMU_UCLK, uclk_freq, uclk_freq);
+       ret = smu_set_soft_freq_range(smu, SMU_UCLK, uclk_freq, uclk_freq, false);
        if (ret)
                return ret;
 
@@ -1748,10 +1748,10 @@ static int navi10_set_peak_performance_level(struct smu_context *smu)
        if (ret)
                return ret;
 
-       ret = smu_set_soft_freq_range(smu, SMU_SCLK, sclk_freq, sclk_freq);
+       ret = smu_set_soft_freq_range(smu, SMU_SCLK, sclk_freq, sclk_freq, false);
        if (ret)
                return ret;
-       ret = smu_set_soft_freq_range(smu, SMU_UCLK, uclk_freq, uclk_freq);
+       ret = smu_set_soft_freq_range(smu, SMU_UCLK, uclk_freq, uclk_freq, false);
        if (ret)
                return ret;
 
index 2ad6d8e039bbcdba91ef686e8ae3c44297ef7af4..cca4820afaa6fe529679053ffcc80fd07fedd02c 100644 (file)
@@ -423,7 +423,7 @@ static int renoir_force_dpm_limit_value(struct smu_context *smu, bool highest)
                        return ret;
 
                force_freq = highest ? max_freq : min_freq;
-               ret = smu_set_soft_freq_range(smu, clk_type, force_freq, force_freq);
+               ret = smu_set_soft_freq_range(smu, clk_type, force_freq, force_freq, false);
                if (ret)
                        return ret;
        }
@@ -456,7 +456,7 @@ static int renoir_unforce_dpm_levels(struct smu_context *smu) {
                if (ret)
                        return ret;
 
-               ret = smu_set_soft_freq_range(smu, clk_type, min_freq, max_freq);
+               ret = smu_set_soft_freq_range(smu, clk_type, min_freq, max_freq, false);
                if (ret)
                        return ret;
        }
@@ -704,7 +704,7 @@ static int renoir_set_peak_clock_by_device(struct smu_context *smu)
        if (ret)
                return ret;
 
-       ret = smu_set_soft_freq_range(smu, SMU_SCLK, sclk_freq, sclk_freq);
+       ret = smu_set_soft_freq_range(smu, SMU_SCLK, sclk_freq, sclk_freq, false);
        if (ret)
                return ret;
 
@@ -712,7 +712,7 @@ static int renoir_set_peak_clock_by_device(struct smu_context *smu)
        if (ret)
                return ret;
 
-       ret = smu_set_soft_freq_range(smu, SMU_UCLK, uclk_freq, uclk_freq);
+       ret = smu_set_soft_freq_range(smu, SMU_UCLK, uclk_freq, uclk_freq, false);
        if (ret)
                return ret;