aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3190-drm-amd-powerplay-correct-arcturus-current-clock-lev.patch
diff options
context:
space:
mode:
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.patch103
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
+