resolve the issue where some freq frequencies cannot be set correctly
due to insufficient floating-point precision.

Signed-off-by: Yang Wang <[email protected]>
---
 drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h   | 1 +
 drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c | 2 ++
 2 files changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h 
b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h
index 613d4d36f32f..b453e6efc7c9 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h
@@ -56,6 +56,7 @@ extern const int decoded_link_width[8];
 
 #define DECODE_GEN_SPEED(gen_speed_idx)                
(decoded_link_speed[gen_speed_idx])
 #define DECODE_LANE_WIDTH(lane_width_idx)      
(decoded_link_width[lane_width_idx])
+#define SMU_V14_SOFT_FREQ_ROUND(x)     ((x) + 1)
 
 struct smu_14_0_max_sustainable_clocks {
        uint32_t display_clock;
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c
index f85ba23f9d99..beb4f9f730bd 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c
@@ -1177,6 +1177,7 @@ int smu_v14_0_set_soft_freq_limited_range(struct 
smu_context *smu,
                return clk_id;
 
        if (max > 0) {
+               max = SMU_V14_SOFT_FREQ_ROUND(max);
                if (automatic)
                        param = (uint32_t)((clk_id << 16) | 0xffff);
                else
@@ -1188,6 +1189,7 @@ int smu_v14_0_set_soft_freq_limited_range(struct 
smu_context *smu,
        }
 
        if (min > 0) {
+               min = SMU_V14_SOFT_FREQ_ROUND(min);
                if (automatic)
                        param = (uint32_t)((clk_id << 16) | 0);
                else
-- 
2.34.1

Reply via email to