Commit 1f23cadb authored by Evan Quan's avatar Evan Quan Committed by Alex Deucher

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: default avatarEvan Quan <evan.quan@amd.com>
Reviewed-by: default avatarKenneth Feng <kenneth.feng@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 60d435b7
...@@ -51,6 +51,9 @@ ...@@ -51,6 +51,9 @@
#define SMU_FEATURES_HIGH_MASK 0xFFFFFFFF00000000 #define SMU_FEATURES_HIGH_MASK 0xFFFFFFFF00000000
#define SMU_FEATURES_HIGH_SHIFT 32 #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] = { static struct smu_11_0_cmn2aisc_mapping arcturus_message_map[SMU_MSG_MAX_COUNT] = {
MSG_MAP(TestMessage, PPSMC_MSG_TestMessage), MSG_MAP(TestMessage, PPSMC_MSG_TestMessage),
MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion), MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion),
...@@ -565,6 +568,12 @@ static int arcturus_get_clk_table(struct smu_context *smu, ...@@ -565,6 +568,12 @@ static int arcturus_get_clk_table(struct smu_context *smu,
return 0; 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, static int arcturus_print_clk_levels(struct smu_context *smu,
enum smu_clk_type type, char *buf) enum smu_clk_type type, char *buf)
{ {
...@@ -595,8 +604,9 @@ static int arcturus_print_clk_levels(struct smu_context *smu, ...@@ -595,8 +604,9 @@ static int arcturus_print_clk_levels(struct smu_context *smu,
for (i = 0; i < clocks.num_levels; i++) for (i = 0; i < clocks.num_levels; i++)
size += sprintf(buf + size, "%d: %uMhz %s\n", i, size += sprintf(buf + size, "%d: %uMhz %s\n", i,
clocks.data[i].clocks_in_khz / 1000, 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; break;
case SMU_MCLK: case SMU_MCLK:
...@@ -616,8 +626,9 @@ static int arcturus_print_clk_levels(struct smu_context *smu, ...@@ -616,8 +626,9 @@ static int arcturus_print_clk_levels(struct smu_context *smu,
for (i = 0; i < clocks.num_levels; i++) for (i = 0; i < clocks.num_levels; i++)
size += sprintf(buf + size, "%d: %uMhz %s\n", size += sprintf(buf + size, "%d: %uMhz %s\n",
i, clocks.data[i].clocks_in_khz / 1000, 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; break;
case SMU_SOCCLK: case SMU_SOCCLK:
...@@ -637,8 +648,9 @@ static int arcturus_print_clk_levels(struct smu_context *smu, ...@@ -637,8 +648,9 @@ static int arcturus_print_clk_levels(struct smu_context *smu,
for (i = 0; i < clocks.num_levels; i++) for (i = 0; i < clocks.num_levels; i++)
size += sprintf(buf + size, "%d: %uMhz %s\n", size += sprintf(buf + size, "%d: %uMhz %s\n",
i, clocks.data[i].clocks_in_khz / 1000, 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; break;
case SMU_FCLK: case SMU_FCLK:
...@@ -649,11 +661,18 @@ static int arcturus_print_clk_levels(struct smu_context *smu, ...@@ -649,11 +661,18 @@ static int arcturus_print_clk_levels(struct smu_context *smu,
} }
single_dpm_table = &(dpm_table->fclk_table); 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++) for (i = 0; i < single_dpm_table->count; i++)
size += sprintf(buf + size, "%d: %uMhz %s\n", size += sprintf(buf + size, "%d: %uMhz %s\n",
i, single_dpm_table->dpm_levels[i].value, 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; break;
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment