diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3190-drm-amd-powerplay-correct-arcturus-current-clock-lev.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3190-drm-amd-powerplay-correct-arcturus-current-clock-lev.patch | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3190-drm-amd-powerplay-correct-arcturus-current-clock-lev.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3190-drm-amd-powerplay-correct-arcturus-current-clock-lev.patch new file mode 100644 index 00000000..c7344845 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3190-drm-amd-powerplay-correct-arcturus-current-clock-lev.patch @@ -0,0 +1,103 @@ +From 403aba8e48f665aadd567e31b05a902f9a78b0ec Mon Sep 17 00:00:00 2001 +From: Evan Quan <evan.quan@amd.com> +Date: Tue, 23 Jul 2019 20:28:14 +0800 +Subject: [PATCH 3190/4256] drm/amd/powerplay: correct arcturus current clock + level calculation + +There may be 1Mhz delta between target and actual frequency. That +should be taken into consideration for current level check. + +Signed-off-by: Evan Quan <evan.quan@amd.com> +Reviewed-by: Kenneth Feng <kenneth.feng@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/powerplay/arcturus_ppt.c | 35 +++++++++++++++----- + 1 file changed, 27 insertions(+), 8 deletions(-) + +diff --git a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c +index 79fee8ba32ce..ceb9a85bb1c8 100644 +--- a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c ++++ b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c +@@ -51,6 +51,9 @@ + #define SMU_FEATURES_HIGH_MASK 0xFFFFFFFF00000000 + #define SMU_FEATURES_HIGH_SHIFT 32 + ++/* possible frequency drift (1Mhz) */ ++#define EPSILON 1 ++ + static struct smu_11_0_cmn2aisc_mapping arcturus_message_map[SMU_MSG_MAX_COUNT] = { + MSG_MAP(TestMessage, PPSMC_MSG_TestMessage), + MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion), +@@ -567,6 +570,12 @@ static int arcturus_get_clk_table(struct smu_context *smu, + return 0; + } + ++static int arcturus_freqs_in_same_level(int32_t frequency1, ++ int32_t frequency2) ++{ ++ return (abs(frequency1 - frequency2) <= EPSILON); ++} ++ + static int arcturus_print_clk_levels(struct smu_context *smu, + enum smu_clk_type type, char *buf) + { +@@ -597,8 +606,9 @@ static int arcturus_print_clk_levels(struct smu_context *smu, + for (i = 0; i < clocks.num_levels; i++) + size += sprintf(buf + size, "%d: %uMhz %s\n", i, + clocks.data[i].clocks_in_khz / 1000, +- (clocks.data[i].clocks_in_khz == now * 10) +- ? "*" : ""); ++ arcturus_freqs_in_same_level( ++ clocks.data[i].clocks_in_khz / 1000, ++ now / 100) ? "*" : ""); + break; + + case SMU_MCLK: +@@ -618,8 +628,9 @@ static int arcturus_print_clk_levels(struct smu_context *smu, + for (i = 0; i < clocks.num_levels; i++) + size += sprintf(buf + size, "%d: %uMhz %s\n", + i, clocks.data[i].clocks_in_khz / 1000, +- (clocks.data[i].clocks_in_khz == now * 10) +- ? "*" : ""); ++ arcturus_freqs_in_same_level( ++ clocks.data[i].clocks_in_khz / 1000, ++ now / 100) ? "*" : ""); + break; + + case SMU_SOCCLK: +@@ -639,8 +650,9 @@ static int arcturus_print_clk_levels(struct smu_context *smu, + for (i = 0; i < clocks.num_levels; i++) + size += sprintf(buf + size, "%d: %uMhz %s\n", + i, clocks.data[i].clocks_in_khz / 1000, +- (clocks.data[i].clocks_in_khz == now * 10) +- ? "*" : ""); ++ arcturus_freqs_in_same_level( ++ clocks.data[i].clocks_in_khz / 1000, ++ now / 100) ? "*" : ""); + break; + + case SMU_FCLK: +@@ -651,11 +663,18 @@ static int arcturus_print_clk_levels(struct smu_context *smu, + } + + single_dpm_table = &(dpm_table->fclk_table); ++ ret = arcturus_get_clk_table(smu, &clocks, single_dpm_table); ++ if (ret) { ++ pr_err("Attempt to get fclk levels Failed!"); ++ return ret; ++ } ++ + for (i = 0; i < single_dpm_table->count; i++) + size += sprintf(buf + size, "%d: %uMhz %s\n", + i, single_dpm_table->dpm_levels[i].value, +- (single_dpm_table->dpm_levels[i].value == now / 100) +- ? "*" : ""); ++ arcturus_freqs_in_same_level( ++ clocks.data[i].clocks_in_khz / 1000, ++ now / 100) ? "*" : ""); + break; + + default: +-- +2.17.1 + |