<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:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" 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 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;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 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:blue;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;}
span.EmailStyle21
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
@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="blue" vlink="purple" style="word-wrap:break-word">
<p style="font-family:Arial;font-size:10pt;color:#0000FF;margin:5pt;font-style:normal;font-weight:normal;text-decoration:none;" align="Left">
[AMD Official Use Only - General]<br>
</p>
<br>
<div>
<div class="WordSection1">
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Zhu, James <James.Zhu@amd.com> <br>
<b>Sent:</b> Wednesday, December 13, 2023 10:41 AM<br>
<b>To:</b> Yat Sin, David <David.YatSin@amd.com>; Zhu, James <James.Zhu@amd.com>; amd-gfx@lists.freedesktop.org<br>
<b>Cc:</b> Kuehling, Felix <Felix.Kuehling@amd.com>; Greathouse, Joseph <Joseph.Greathouse@amd.com><br>
<b>Subject:</b> Re: [PATCH v2 03/23] drm/amdkfd: enable pc sampling query<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p><o:p> </o:p></p>
<div>
<p class="MsoNormal">On 2023-12-12 19:55, Yat Sin, David wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>[AMD Official Use Only - General]<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>-----Original Message-----<o:p></o:p></pre>
<pre>From: Zhu, James <a href="mailto:James.Zhu@amd.com"><James.Zhu@amd.com></a><o:p></o:p></pre>
<pre>Sent: Thursday, December 7, 2023 5:54 PM<o:p></o:p></pre>
<pre>To: <a href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a><o:p></o:p></pre>
<pre>Cc: Kuehling, Felix <a href="mailto:Felix.Kuehling@amd.com"><Felix.Kuehling@amd.com></a>; Greathouse, Joseph<o:p></o:p></pre>
<pre><a href="mailto:Joseph.Greathouse@amd.com"><Joseph.Greathouse@amd.com></a>; Yat Sin, David <a href="mailto:David.YatSin@amd.com"><David.YatSin@amd.com></a>;<o:p></o:p></pre>
<pre>Zhu, James <a href="mailto:James.Zhu@amd.com"><James.Zhu@amd.com></a><o:p></o:p></pre>
<pre>Subject: [PATCH v2 03/23] drm/amdkfd: enable pc sampling query<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>From: David Yat Sin <a href="mailto:david.yatsin@amd.com"><david.yatsin@amd.com></a><o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Enable pc sampling to query system capability.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Co-developed-by: James Zhu <a href="mailto:James.Zhu@amd.com"><James.Zhu@amd.com></a><o:p></o:p></pre>
<pre>Signed-off-by: James Zhu <a href="mailto:James.Zhu@amd.com"><James.Zhu@amd.com></a><o:p></o:p></pre>
<pre>Signed-off-by: David Yat Sin <a href="mailto:david.yatsin@amd.com"><david.yatsin@amd.com></a><o:p></o:p></pre>
<pre>---<o:p></o:p></pre>
<pre> drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c | 54<o:p></o:p></pre>
<pre>+++++++++++++++++++-<o:p></o:p></pre>
<pre> 1 file changed, 53 insertions(+), 1 deletion(-)<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c<o:p></o:p></pre>
<pre>b/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c<o:p></o:p></pre>
<pre>index a7e78ff42d07..49fecbc7013e 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/amd/amdkfd/kfd_pc_sampling.c<o:p></o:p></pre>
<pre>@@ -25,10 +25,62 @@<o:p></o:p></pre>
<pre> #include "amdgpu_amdkfd.h"<o:p></o:p></pre>
<pre> #include "kfd_pc_sampling.h"<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>+struct supported_pc_sample_info {<o:p></o:p></pre>
<pre>+     uint32_t ip_version;<o:p></o:p></pre>
<pre>+     const struct kfd_pc_sample_info *sample_info; };<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+const struct kfd_pc_sample_info sample_info_hosttrap_9_0_0 = {<o:p></o:p></pre>
<pre>+     0, 1, ~0ULL, 0, KFD_IOCTL_PCS_METHOD_HOSTTRAP,<o:p></o:p></pre>
<pre>+KFD_IOCTL_PCS_TYPE_TIME_US };<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+struct supported_pc_sample_info supported_formats[] = {<o:p></o:p></pre>
<pre>+     { IP_VERSION(9, 4, 1), &sample_info_hosttrap_9_0_0 },<o:p></o:p></pre>
<pre>+     { IP_VERSION(9, 4, 2), &sample_info_hosttrap_9_0_0 }, };<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre> static int kfd_pc_sample_query_cap(struct kfd_process_device *pdd,<o:p></o:p></pre>
<pre>                                      struct kfd_ioctl_pc_sample_args<o:p></o:p></pre>
<pre>__user *user_args)  {<o:p></o:p></pre>
<pre>-     return -EINVAL;<o:p></o:p></pre>
<pre>+     uint64_t sample_offset;<o:p></o:p></pre>
<pre>+     int num_method = 0;<o:p></o:p></pre>
<pre>+     int i;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+     for (i = 0; i < ARRAY_SIZE(supported_formats); i++)<o:p></o:p></pre>
<pre>+             if (KFD_GC_VERSION(pdd->dev) ==<o:p></o:p></pre>
<pre>supported_formats[i].ip_version)<o:p></o:p></pre>
<pre>+                     num_method++;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+     if (!num_method) {<o:p></o:p></pre>
<pre>+             pr_debug("PC Sampling not supported on GC_HWIP:0x%x.",<o:p></o:p></pre>
<pre>+                     pdd->dev->adev->ip_versions[GC_HWIP][0]);<o:p></o:p></pre>
<pre>+             return -EOPNOTSUPP;<o:p></o:p></pre>
<pre>+     }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+     if (!user_args->sample_info_ptr) {<o:p></o:p></pre>
</blockquote>
<pre>Should be:<o:p></o:p></pre>
<pre>if (!user_args->sample_info_ptr || !user_args->num_sample_info) {<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>+             user_args->num_sample_info = num_method;<o:p></o:p></pre>
<pre>+             return 0;<o:p></o:p></pre>
<pre>+     }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+     if (user_args->num_sample_info < num_method) {<o:p></o:p></pre>
<pre>+             user_args->num_sample_info = num_method;<o:p></o:p></pre>
<pre>+             pr_debug("Sample info buffer is not large enough, "<o:p></o:p></pre>
<pre>+                      "ASIC requires space for %d kfd_pc_sample_info<o:p></o:p></pre>
<pre>entries.", num_method);<o:p></o:p></pre>
<pre>+             return -ENOSPC;<o:p></o:p></pre>
<pre>+     }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+     sample_offset = user_args->sample_info_ptr;<o:p></o:p></pre>
</blockquote>
<pre><o:p> </o:p></pre>
<pre>If there is another active PC Sampling session that is active, I thought we were planning to have code to<o:p></o:p></pre>
<pre>return a reduced list with only the methods that are compatible with the current active session. Did we<o:p></o:p></pre>
<pre>decide to drop this behavior?<o:p></o:p></pre>
</blockquote>
<p class="MsoNormal">[JZ] Do we have design changed here? I though we allow sharing the same active PC Sampling session between multiple processes.
<br>
<br>
[DavidYS] That was part of the original design.<br>
For example, if you already have an active session that is taking samples at interval of 500ms, and a user does a capabilities query, then the
<br>
capabilities query should only return a range of 500ms, instead of the full interval range.<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Regards,<o:p></o:p></pre>
<pre>David<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>+     for (i = 0; i < ARRAY_SIZE(supported_formats); i++) {<o:p></o:p></pre>
<pre>+             if (KFD_GC_VERSION(pdd->dev) ==<o:p></o:p></pre>
<pre>supported_formats[i].ip_version) {<o:p></o:p></pre>
<pre>+                     int ret = copy_to_user((void __user *) sample_offset,<o:p></o:p></pre>
<pre>+                             supported_formats[i].sample_info,<o:p></o:p></pre>
<pre>sizeof(struct kfd_pc_sample_info));<o:p></o:p></pre>
<pre>+                     if (ret) {<o:p></o:p></pre>
<pre>+                             pr_debug("Failed to copy PC sampling info to<o:p></o:p></pre>
<pre>user.");<o:p></o:p></pre>
<pre>+                             return -EFAULT;<o:p></o:p></pre>
<pre>+                     }<o:p></o:p></pre>
<pre>+                     sample_offset += sizeof(struct kfd_pc_sample_info);<o:p></o:p></pre>
<pre>+             }<o:p></o:p></pre>
<pre>+     }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+     return 0;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> static int kfd_pc_sample_start(struct kfd_process_device *pdd)<o:p></o:p></pre>
<pre>--<o:p></o:p></pre>
<pre>2.25.1<o:p></o:p></pre>
</blockquote>
<pre><o:p> </o:p></pre>
</blockquote>
</div>
</div>
</div>
</body>
</html>