<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<div id="divtagdefaultwrapper" dir="ltr" style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;">
<p style="margin-top:0; margin-bottom:0">Hi Evan,</p>
<p style="margin-top:0; margin-bottom:0"><br>
</p>
<p style="margin-top:0; margin-bottom:0"><span style="font-size:12pt">1.</span><span style="font-size:12pt"> </span><span style="font-size:12pt">the other clock type also will check dpm fine grained support.</span></p>
<div><span style="font-size:12pt"></span></div>
<p></p>
<p style="margin-top:0; margin-bottom:0"><span style="font-size:12pt">2. i will change code to v2 to avoid below case<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:14.6667px"></span></span></p>
<p style="margin-top:0; margin-bottom:0"><span style="font-size:12pt"><span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:14.6667px">    0: 300M *</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:14.6667px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:14.6667px">    1: 300M</span><br style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:14.6667px">
<span style="color:rgb(33,33,33); font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont; font-size:14.6667px">     2: 1800M</span></span></p>
<p style="margin-top:0; margin-bottom:0"><br>
</p>
<p style="margin-top:0; margin-bottom:0">Best Regards,</p>
<p style="margin-top:0; margin-bottom:0">Kevin</p>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Quan, Evan<br>
<b>Sent:</b> Thursday, July 18, 2019 4:16:22 PM<br>
<b>To:</b> Wang, Kevin(Yang); amd-gfx@lists.freedesktop.org<br>
<b>Cc:</b> Feng, Kenneth; Huang, Ray; Xu, Feifei<br>
<b>Subject:</b> RE: [PATCH] drm/amd/powerplay: change sysfs pp_dpm_xxx format for navi10</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt">
<div class="PlainText">1. Please commonilzie a new API e.g. smu_is_fine_grained_dpm which can be shared for other clocks in future.<br>
2. if the current clock is same as min or max, the output will be a little strange<br>
    0: 300M *<br>
    1: 300M<br>
     2: 1800M<br>
Please check how raven handle this situation.<br>
<br>
Regards,<br>
Evan<br>
> -----Original Message-----<br>
> From: Wang, Kevin(Yang) <Kevin1.Wang@amd.com><br>
> Sent: Thursday, July 18, 2019 4:02 PM<br>
> To: amd-gfx@lists.freedesktop.org<br>
> Cc: Feng, Kenneth <Kenneth.Feng@amd.com>; Quan, Evan<br>
> <Evan.Quan@amd.com>; Huang, Ray <Ray.Huang@amd.com>; Xu, Feifei<br>
> <Feifei.Xu@amd.com>; Wang, Kevin(Yang) <Kevin1.Wang@amd.com><br>
> Subject: [PATCH] drm/amd/powerplay: change sysfs pp_dpm_xxx format for<br>
> navi10<br>
> <br>
> the navi10 gfxclk (sclk) support fine grained DPM,<br>
> so use level 1 to show current dpm freq in sysfs pp_dpm_xxx<br>
> <br>
> Change-Id: Idae2424f8cc91fe94cebe7f3103e112b4f912fbc<br>
> Signed-off-by: Kevin Wang <kevin1.wang@amd.com><br>
> ---<br>
>  drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 41 +++++++++++++++++--<br>
> ---<br>
>  1 file changed, 33 insertions(+), 8 deletions(-)<br>
> <br>
> diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c<br>
> b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c<br>
> index 895a4e592d5a..ef60b92fef6c 100644<br>
> --- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c<br>
> +++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c<br>
> @@ -632,6 +632,10 @@ static int navi10_print_clk_levels(struct smu_context<br>
> *smu,<br>
>  {<br>
>        int i, size = 0, ret = 0;<br>
>        uint32_t cur_value = 0, value = 0, count = 0;<br>
> +     uint32_t freq_values[3] = {0};<br>
> +     uint32_t clk_index = 0, mark_index = 0;<br>
> +     PPTable_t *pptable = smu->smu_table.driver_pptable;<br>
> +     DpmDescriptor_t *dpm_desc = NULL;<br>
> <br>
>        switch (clk_type) {<br>
>        case SMU_GFXCLK:<br>
> @@ -641,25 +645,46 @@ static int navi10_print_clk_levels(struct<br>
> smu_context *smu,<br>
>        case SMU_UCLK:<br>
>        case SMU_FCLK:<br>
>        case SMU_DCEFCLK:<br>
> +             clk_index = smu_clk_get_index(smu, clk_type);<br>
> +             dpm_desc = &pptable->DpmDescriptor[clk_index];<br>
> +<br>
>                ret = smu_get_current_clk_freq(smu, clk_type, &cur_value);<br>
>                if (ret)<br>
>                        return size;<br>
> -             /* 10KHz -> MHz */<br>
> -             cur_value = cur_value / 100;<br>
> -<br>
> -             size += sprintf(buf, "current clk: %uMhz\n", cur_value);<br>
> <br>
>                ret = smu_get_dpm_level_count(smu, clk_type, &count);<br>
>                if (ret)<br>
>                        return size;<br>
> <br>
> -             for (i = 0; i < count; i++) {<br>
> -                     ret = smu_get_dpm_freq_by_index(smu, clk_type, i,<br>
> &value);<br>
> +             /* 0 - Fine grained DPM, 1 - Discrete DPM */<br>
> +             if (dpm_desc->SnapToDiscrete == 1) {<br>
> +                     /* 10KHz -> MHz */<br>
> +                     cur_value = cur_value / 100;<br>
> +                     for (i = 0; i < count; i++) {<br>
> +                             ret = smu_get_dpm_freq_by_index(smu,<br>
> clk_type, i, &value);<br>
> +                             if (ret)<br>
> +                                     return size;<br>
> +<br>
> +                             size += sprintf(buf + size, "%d: %uMhz %s\n",<br>
> i, value,<br>
> +                                             cur_value == value ? "*" : "");<br>
> +                     }<br>
> +             } else {<br>
> +                     ret = smu_get_dpm_freq_by_index(smu, clk_type, 0,<br>
> &freq_values[0]);<br>
> +                     if (ret)<br>
> +                             return size;<br>
> +                     ret = smu_get_dpm_freq_by_index(smu, clk_type,<br>
> count - 1, &freq_values[2]);<br>
>                        if (ret)<br>
>                                return size;<br>
> <br>
> -                     size += sprintf(buf + size, "%d: %uMhz %s\n", i, value,<br>
> -                                     cur_value == value ? "*" : "");<br>
> +                     freq_values[1] = cur_value / 100;<br>
> +                     mark_index = cur_value == freq_values[0] ? 0 :<br>
> +                                  cur_value == freq_values[2] ? 2 : 1;<br>
> +<br>
> +                     for (i = 0; i < 3; i++) {<br>
> +                             size += sprintf(buf + size, "%d: %uMhz %s\n",<br>
> i, freq_values[i],<br>
> +                                             i == mark_index ? "*" : "");<br>
> +                     }<br>
> +<br>
>                }<br>
>                break;<br>
>        default:<br>
> --<br>
> 2.22.0<br>
<br>
</div>
</span></font></div>
</div>
</body>
</html>