<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>