<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=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:SimSun;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:SimSun;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
{font-family:"\@SimSun";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:SimSun;
color:black;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
{mso-style-priority:99;
mso-style-link:"Plain Text Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.5pt;
font-family:"Calibri","sans-serif";
color:windowtext;}
p
{mso-style-priority:99;
mso-margin-top-alt:auto;
margin-right:0cm;
mso-margin-bottom-alt:auto;
margin-left:0cm;
font-size:12.0pt;
font-family:SimSun;
color:black;}
pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:SimSun;
color:black;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
{mso-style-priority:99;
mso-style-link:"Balloon Text Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:8.0pt;
font-family:SimSun;
color:black;}
span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:"Courier New";
color:black;}
span.BalloonTextChar
{mso-style-name:"Balloon Text Char";
mso-style-priority:99;
mso-style-link:"Balloon Text";
font-family:SimSun;
color:black;}
span.EmailStyle22
{mso-style-type:personal-reply;
font-family:"Calibri","sans-serif";
color:#1F497D;}
span.PlainTextChar
{mso-style-name:"Plain Text Char";
mso-style-priority:99;
mso-style-link:"Plain Text";
font-family:"Calibri","sans-serif";}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
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 bgcolor="white" lang="ZH-CN" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi Christian,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">I mean patch 5 can be changed as
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">static struct amd_vce_state* pp_dpm_get_vce_clock_table(void *handle, int num)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> PP_CHECK((struct pp_instance *)handle);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> hwmgr = ((struct pp_instance *)handle)->hwmgr;<o:p></o:p></span></p>
<pre style="text-indent:18.0pt"><span lang="EN-US">if (hwmgr && num < hwmgr->num_vce_state_tables)<o:p></o:p></span></pre>
<pre style="text-indent:18.0pt"><span lang="EN-US"> return &hwmgr->vce_states[i];<o:p></o:p></span></pre>
<p class="MsoNormal"><span lang="EN-US"> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> Return NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">}</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">And in Patch6.
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ case AMDGPU_INFO_VCE_CLOCK_TABLE: {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ struct drm_amdgpu_info_vce_clock_table vce_clk_table = {};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"> <span style="color:#C00000">
struct amd_vce_state* vce_state;</span><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<pre><span lang="EN-US">+ for (i = 0; i < AMDGPU_VCE_CLOCK_TABLE_ENTRIES; i++) {<o:p></o:p></span></pre>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"> <span style="color:#C00000">vce_state</span> = amdgpu_dpm_get_vce_clock_table(adev,
<span style="color:#C00000">i</span>);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US" style="color:#C00000"> If (vce_state) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US" style="font-family:"Courier New";color:#C00000"> </span><span lang="EN-US" style="color:#C00000"> vce_clk_table.entries[i].sclk = vce_state->sclk;<br>
</span><span lang="EN-US" style="font-family:"Courier New";color:#C00000"> </span><span lang="EN-US" style="color:#C00000"> vce_clk_table.entries[i].mclk = vce_state->mclk;<br>
</span><span lang="EN-US" style="font-family:"Courier New";color:#C00000"> </span><span lang="EN-US" style="color:#C00000"> vce_clk_table.entries[i].eclk = vce_state->evclk;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US" style="color:#C00000"> } else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US" style="color:#C00000"> vce_clk_table.num_of_entries = i; //if UMD driver need to check number of vce state.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US" style="color:#C00000"> break;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US" style="color:#C00000"> }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"> }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ return copy_to_user(out, &vce_clk_table,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ min((size_t)size, sizeof(vce_clk_table))) ? -EFAULT : 0;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">Best Regards<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:"Calibri","sans-serif";color:#1F497D">Rex<o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext"> amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org]
<b>On Behalf Of </b>Christian König<br>
<b>Sent:</b> Wednesday, October 12, 2016 4:53 PM<br>
<b>To:</b> Zhu, Rex; Alex Deucher; amd-gfx list; Fang, Peter; Zhang, Boyuan<br>
<b>Cc:</b> Deucher, Alexander<br>
<b>Subject:</b> Re: [PATCH 5/6] drm/amdgpu/powerplay: add an implementation for get_vce_clock_table<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal"><span lang="EN-US">Hi Rex,<br>
<br>
the problem with this approach is that you need to copy the entries from one structure to another, like we have below:<br>
<br>
> + vce_clk_table.entries[i].sclk = hwmgr->vce_states[i].sclk;<br>
> + vce_clk_table.entries[i].mclk = hwmgr->vce_states[i].mclk;<br>
> + vce_clk_table.entries[i].eclk = hwmgr->vce_states[i].evclk;<br>
<br>
This is not seen as good coding practice and usually isn't allowed upstream because it creates two representations in the kernel for the same thing.<br>
<br>
Regards,<br>
Christian.<br>
<br>
Am 12.10.2016 um 10:34 schrieb Zhu, Rex:<o:p></o:p></span></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><span lang="EN-US">Hi Alex,<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US">In Patch1, I moved struct amdgpu_vce_states to amd_shared.h from amdgpu.h. So in powerplay, we used same vce state definition.<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US">So the define of static struct drm_amdgpu_info_vce_clock_table pp_dpm_get_vce_clock_table(void *handle)<o:p></o:p></span></pre>
<pre><span lang="EN-US">Can change to <o:p></o:p></span></pre>
<pre><span lang="EN-US">static struct amd_vce_state pp_dpm_get_vce_clock_table(void *handle, int num);<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US">and can move those codes to Patch6.<o:p></o:p></span></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><span lang="EN-US">+ vce_clk_table.entries[i].sclk = hwmgr->vce_states[i].sclk;<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ vce_clk_table.entries[i].mclk = hwmgr->vce_states[i].mclk;<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ vce_clk_table.entries[i].eclk = hwmgr->vce_states[i].evclk;<o:p></o:p></span></pre>
</blockquote>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US">So in powerplay and dpm, we don't need to visit struct drm_amdgpu_info_vce_clock_table.<o:p></o:p></span></pre>
<pre><span lang="EN-US"> <o:p></o:p></span></pre>
<pre><span lang="EN-US">In Patch2, add numer of vce_states in struct dpm. If it is useful to UMD driver. We can notify UMD by add a member in struct drm_amdgpu_info_vce_clock_table.<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US">Best Regards<o:p></o:p></span></pre>
<pre><span lang="EN-US">Rex<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US">-----Original Message-----<o:p></o:p></span></pre>
<pre><span lang="EN-US">From: Alex Deucher [<a href="mailto:alexdeucher@gmail.com">mailto:alexdeucher@gmail.com</a>] <o:p></o:p></span></pre>
<pre><span lang="EN-US">Sent: Wednesday, October 12, 2016 4:07 AM<o:p></o:p></span></pre>
<pre><span lang="EN-US">To: amd-gfx list; Fang, Peter; Zhang, Boyuan; Zhu, Rex<o:p></o:p></span></pre>
<pre><span lang="EN-US">Cc: Deucher, Alexander<o:p></o:p></span></pre>
<pre><span lang="EN-US">Subject: Re: [PATCH 5/6] drm/amdgpu/powerplay: add an implementation for get_vce_clock_table<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US">Rex what is your opinion on exposing the amdgpu drm structure through to powerplay? We could do an intermediate interface, but that just seems like extra hoops to jump through for pretty questionable gain.<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US">Alex<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US">On Fri, Oct 7, 2016 at 2:28 PM, Alex Deucher <a href="mailto:alexdeucher@gmail.com"><alexdeucher@gmail.com></a> wrote:<o:p></o:p></span></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><span lang="EN-US">Used by the powerplay dpm code.<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US">Signed-off-by: Alex Deucher <a href="mailto:alexander.deucher@amd.com"><alexander.deucher@amd.com></a><o:p></o:p></span></pre>
<pre><span lang="EN-US">---<o:p></o:p></span></pre>
<pre><span lang="EN-US"> drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 24 <o:p></o:p></span></pre>
<pre><span lang="EN-US">++++++++++++++++++++++++<o:p></o:p></span></pre>
<pre><span lang="EN-US"> 1 file changed, 24 insertions(+)<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US">diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c <o:p></o:p></span></pre>
<pre><span lang="EN-US">b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c<o:p></o:p></span></pre>
<pre><span lang="EN-US">index bb8a345..8eee390 100644<o:p></o:p></span></pre>
<pre><span lang="EN-US">--- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c<o:p></o:p></span></pre>
<pre><span lang="EN-US">+++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c<o:p></o:p></span></pre>
<pre><span lang="EN-US">@@ -30,6 +30,7 @@<o:p></o:p></span></pre>
<pre><span lang="EN-US"> #include "power_state.h"<o:p></o:p></span></pre>
<pre><span lang="EN-US"> #include "eventmanager.h"<o:p></o:p></span></pre>
<pre><span lang="EN-US"> #include "pp_debug.h"<o:p></o:p></span></pre>
<pre><span lang="EN-US">+#include "drm/amdgpu_drm.h"<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US"> #define PP_CHECK(handle) \<o:p></o:p></span></pre>
<pre><span lang="EN-US">@@ -821,6 +822,28 @@ static int pp_dpm_read_sensor(void *handle, int idx, int32_t *value)<o:p></o:p></span></pre>
<pre><span lang="EN-US"> return hwmgr->hwmgr_func->read_sensor(hwmgr, idx, value); }<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US">+static struct drm_amdgpu_info_vce_clock_table <o:p></o:p></span></pre>
<pre><span lang="EN-US">+pp_dpm_get_vce_clock_table(void *handle) {<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ struct drm_amdgpu_info_vce_clock_table vce_clk_table = {};<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ struct pp_hwmgr *hwmgr;<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ unsigned i;<o:p></o:p></span></pre>
<pre><span lang="EN-US">+<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ if (handle) {<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ hwmgr = ((struct pp_instance *)handle)->hwmgr;<o:p></o:p></span></pre>
<pre><span lang="EN-US">+<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ if (hwmgr) {<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ for (i = 0; i < AMDGPU_VCE_CLOCK_TABLE_ENTRIES; i++) {<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ vce_clk_table.entries[i].sclk = hwmgr->vce_states[i].sclk;<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ vce_clk_table.entries[i].mclk = hwmgr->vce_states[i].mclk;<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ vce_clk_table.entries[i].eclk = hwmgr->vce_states[i].evclk;<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ }<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ }<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ }<o:p></o:p></span></pre>
<pre><span lang="EN-US">+<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ return vce_clk_table;<o:p></o:p></span></pre>
<pre><span lang="EN-US">+}<o:p></o:p></span></pre>
<pre><span lang="EN-US">+<o:p></o:p></span></pre>
<pre><span lang="EN-US"> const struct amd_powerplay_funcs pp_dpm_funcs = {<o:p></o:p></span></pre>
<pre><span lang="EN-US"> .get_temperature = pp_dpm_get_temperature,<o:p></o:p></span></pre>
<pre><span lang="EN-US"> .load_firmware = pp_dpm_load_fw, @@ -847,6 +870,7 @@ const <o:p></o:p></span></pre>
<pre><span lang="EN-US">struct amd_powerplay_funcs pp_dpm_funcs = {<o:p></o:p></span></pre>
<pre><span lang="EN-US"> .get_mclk_od = pp_dpm_get_mclk_od,<o:p></o:p></span></pre>
<pre><span lang="EN-US"> .set_mclk_od = pp_dpm_set_mclk_od,<o:p></o:p></span></pre>
<pre><span lang="EN-US"> .read_sensor = pp_dpm_read_sensor,<o:p></o:p></span></pre>
<pre><span lang="EN-US">+ .get_vce_clock_table = pp_dpm_get_vce_clock_table,<o:p></o:p></span></pre>
<pre><span lang="EN-US"> };<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US"> static int amd_pp_instance_init(struct amd_pp_init *pp_init,<o:p></o:p></span></pre>
<pre><span lang="EN-US">--<o:p></o:p></span></pre>
<pre><span lang="EN-US">2.5.5<o:p></o:p></span></pre>
<pre><span lang="EN-US"><o:p> </o:p></span></pre>
<p class="MsoNormal"><span lang="EN-US"><br>
<br>
<br>
<o:p></o:p></span></p>
<pre><span lang="EN-US">_______________________________________________<o:p></o:p></span></pre>
<pre><span lang="EN-US">amd-gfx mailing list<o:p></o:p></span></pre>
<pre><span lang="EN-US"><a href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a><o:p></o:p></span></pre>
<pre><span lang="EN-US"><a href="https://lists.freedesktop.org/mailman/listinfo/amd-gfx">https://lists.freedesktop.org/mailman/listinfo/amd-gfx</a><o:p></o:p></span></pre>
</blockquote>
</blockquote>
<p><span lang="EN-US"><o:p> </o:p></span></p>
</div>
</body>
</html>