<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<p class="msipheader251902e5" align="Left" style="margin:0"><span style="font-size:10.0pt;font-family:Arial;color:#317100">[AMD Public Use]</span></p>
<br>
<div class="WordSection1">
<p class="MsoNormal">When GFXCLK range is updated in manual/determinism mode, show the<o:p></o:p></p>
<p class="MsoNormal">updated min/max clock range.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Signed-off-by: Lijo Lazar <a href="mailto:lijo.lazar@amd.com">
lijo.lazar@amd.com</a><o:p></o:p></p>
<p class="MsoNormal">---<o:p></o:p></p>
<p class="MsoNormal">.../drm/amd/pm/swsmu/smu13/aldebaran_ppt.c | 52 +++++++++++++++----<o:p></o:p></p>
<p class="MsoNormal">1 file changed, 41 insertions(+), 11 deletions(-)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c<o:p></o:p></p>
<p class="MsoNormal">index ddbb9a23a0af..abe80226a0ee 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c<o:p></o:p></p>
<p class="MsoNormal">+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c<o:p></o:p></p>
<p class="MsoNormal">@@ -78,6 +78,8 @@<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> #define smnPCIE_ESM_CTRL 0x111003D0<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+#define CLOCK_VALID (1 << 31)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">static const struct cmn2asic_msg_mapping aldebaran_message_map[SMU_MSG_MAX_COUNT] = {<o:p></o:p></p>
<p class="MsoNormal"> MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 0),<o:p></o:p></p>
<p class="MsoNormal"> MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion, 1),<o:p></o:p></p>
<p class="MsoNormal">@@ -670,6 +672,7 @@ static int aldebaran_print_clk_levels(struct smu_context *smu,<o:p></o:p></p>
<p class="MsoNormal"> struct smu_13_0_dpm_context *dpm_context = NULL;<o:p></o:p></p>
<p class="MsoNormal"> uint32_t display_levels;<o:p></o:p></p>
<p class="MsoNormal"> uint32_t freq_values[3] = {0};<o:p></o:p></p>
<p class="MsoNormal">+ uint32_t min_clk, max_clk;<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> if (amdgpu_ras_intr_triggered())<o:p></o:p></p>
<p class="MsoNormal"> return snprintf(buf, PAGE_SIZE, "unavailable\n");<o:p></o:p></p>
<p class="MsoNormal">@@ -697,12 +700,20 @@ static int aldebaran_print_clk_levels(struct smu_context *smu,<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> display_levels = clocks.num_levels;<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+ min_clk = smu->gfx_actual_hard_min_freq & CLOCK_VALID ?<o:p></o:p></p>
<p class="MsoNormal">+ smu->gfx_actual_hard_min_freq & ~CLOCK_VALID :<o:p></o:p></p>
<p class="MsoNormal">+ single_dpm_table->dpm_levels[0].value;<o:p></o:p></p>
<p class="MsoNormal">+ max_clk = smu->gfx_actual_soft_max_freq & CLOCK_VALID ?<o:p></o:p></p>
<p class="MsoNormal">+ smu->gfx_actual_soft_max_freq & ~CLOCK_VALID :<o:p></o:p></p>
<p class="MsoNormal">+ single_dpm_table->dpm_levels[1].value;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ freq_values[0] = min_clk;<o:p></o:p></p>
<p class="MsoNormal">+ freq_values[1] = max_clk;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal"> /* fine-grained dpm has only 2 levels */<o:p></o:p></p>
<p class="MsoNormal">- if (now > single_dpm_table->dpm_levels[0].value &&<o:p></o:p></p>
<p class="MsoNormal">- now < single_dpm_table->dpm_levels[1].value) {<o:p></o:p></p>
<p class="MsoNormal">+ if (now > min_clk && now < max_clk) {<o:p></o:p></p>
<p class="MsoNormal"> display_levels = clocks.num_levels + 1;<o:p></o:p></p>
<p class="MsoNormal">- freq_values[0] = single_dpm_table->dpm_levels[0].value;<o:p></o:p></p>
<p class="MsoNormal">- freq_values[2] = single_dpm_table->dpm_levels[1].value;<o:p></o:p></p>
<p class="MsoNormal">+ freq_values[2] = max_clk;<o:p></o:p></p>
<p class="MsoNormal"> freq_values[1] = now;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -712,12 +723,15 @@ static int aldebaran_print_clk_levels(struct smu_context *smu,<o:p></o:p></p>
<p class="MsoNormal"> */<o:p></o:p></p>
<p class="MsoNormal"> if (display_levels == clocks.num_levels) {<o:p></o:p></p>
<p class="MsoNormal"> for (i = 0; i < clocks.num_levels; i++)<o:p></o:p></p>
<p class="MsoNormal">- size += sprintf(buf + size, "%d: %uMhz %s\n", i,<o:p></o:p></p>
<p class="MsoNormal">- clocks.data[i].clocks_in_khz / 1000,<o:p></o:p></p>
<p class="MsoNormal">- (clocks.num_levels == 1) ? "*" :<o:p></o:p></p>
<p class="MsoNormal">+ size += sprintf(<o:p></o:p></p>
<p class="MsoNormal">+ buf + size, "%d: %uMhz %s\n", i,<o:p></o:p></p>
<p class="MsoNormal">+ freq_values[i],<o:p></o:p></p>
<p class="MsoNormal">+ (clocks.num_levels == 1) ?<o:p></o:p></p>
<p class="MsoNormal">+ "*" :<o:p></o:p></p>
<p class="MsoNormal"> (aldebaran_freqs_in_same_level(<o:p></o:p></p>
<p class="MsoNormal">- clocks.data[i].clocks_in_khz / 1000,<o:p></o:p></p>
<p class="MsoNormal">- now) ? "*" : ""));<o:p></o:p></p>
<p class="MsoNormal">+ freq_values[i], now) ?<o:p></o:p></p>
<p class="MsoNormal">+ "*" :<o:p></o:p></p>
<p class="MsoNormal">+ ""));<o:p></o:p></p>
<p class="MsoNormal"> } else {<o:p></o:p></p>
<p class="MsoNormal"> for (i = 0; i < display_levels; i++)<o:p></o:p></p>
<p class="MsoNormal"> size += sprintf(buf + size, "%d: %uMhz %s\n", i,<o:p></o:p></p>
<p class="MsoNormal">@@ -1117,6 +1131,9 @@ static int aldebaran_set_performance_level(struct smu_context *smu,<o:p></o:p></p>
<p class="MsoNormal"> && (level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM))<o:p></o:p></p>
<p class="MsoNormal"> smu_cmn_send_smc_msg(smu, SMU_MSG_DisableDeterminism, NULL);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+ /* Reset user min/max gfx clock */<o:p></o:p></p>
<p class="MsoNormal">+ smu->gfx_actual_hard_min_freq = 0;<o:p></o:p></p>
<p class="MsoNormal">+ smu->gfx_actual_soft_max_freq = 0;<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> switch (level) {<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -1158,7 +1175,14 @@ static int aldebaran_set_soft_freq_limited_range(struct smu_context *smu,<o:p></o:p></p>
<p class="MsoNormal"> if (smu_dpm->dpm_level == AMD_DPM_FORCED_LEVEL_MANUAL) {<o:p></o:p></p>
<p class="MsoNormal"> min_clk = max(min, dpm_context->dpm_tables.gfx_table.min);<o:p></o:p></p>
<p class="MsoNormal"> max_clk = min(max, dpm_context->dpm_tables.gfx_table.max);<o:p></o:p></p>
<p class="MsoNormal">- return smu_v13_0_set_soft_freq_limited_range(smu, SMU_GFXCLK, min_clk, max_clk);<o:p></o:p></p>
<p class="MsoNormal">+ ret = smu_v13_0_set_soft_freq_limited_range(smu, SMU_GFXCLK,<o:p></o:p></p>
<p class="MsoNormal">+ min_clk, max_clk);<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ if (!ret) {<o:p></o:p></p>
<p class="MsoNormal">+ smu->gfx_actual_hard_min_freq = min_clk | CLOCK_VALID;<o:p></o:p></p>
<p class="MsoNormal">+ smu->gfx_actual_soft_max_freq = max_clk | CLOCK_VALID;<o:p></o:p></p>
<p class="MsoNormal">+ }<o:p></o:p></p>
<p class="MsoNormal">+ return ret;<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> if (smu_dpm->dpm_level == AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM) {<o:p></o:p></p>
<p class="MsoNormal">@@ -1178,9 +1202,15 @@ static int aldebaran_set_soft_freq_limited_range(struct smu_context *smu,<o:p></o:p></p>
<p class="MsoNormal"> ret = smu_cmn_send_smc_msg_with_param(smu,<o:p></o:p></p>
<p class="MsoNormal"> SMU_MSG_EnableDeterminism,<o:p></o:p></p>
<p class="MsoNormal"> max, NULL);<o:p></o:p></p>
<p class="MsoNormal">- if (ret)<o:p></o:p></p>
<p class="MsoNormal">+ if (ret) {<o:p></o:p></p>
<p class="MsoNormal"> dev_err(adev->dev,<o:p></o:p></p>
<p class="MsoNormal"> "Failed to enable determinism at GFX clock %d MHz\n", max);<o:p></o:p></p>
<p class="MsoNormal">+ } else {<o:p></o:p></p>
<p class="MsoNormal">+ smu->gfx_actual_hard_min_freq =<o:p></o:p></p>
<p class="MsoNormal">+ min_clk | CLOCK_VALID;<o:p></o:p></p>
<p class="MsoNormal">+ smu->gfx_actual_soft_max_freq =<o:p></o:p></p>
<p class="MsoNormal">+ max | CLOCK_VALID;<o:p></o:p></p>
<p class="MsoNormal">+ }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">-- <o:p></o:p></p>
<p class="MsoNormal">2.17.1<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>