mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
60d435b73d
commit
1f23cadbe0
|
@ -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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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:
|
||||||
|
|
Loading…
Reference in New Issue