<html 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:DengXian;
        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:Aptos;
        panose-1:2 11 0 4 2 2 2 2 2 4;}
@font-face
        {font-family:"\@DengXian";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="en-CN" link="#467886" vlink="#96607D" style="word-wrap:break-word">
<p style="font-family:Calibri;font-size:10pt;color:#0000FF;margin:5pt;font-style:normal;font-weight:normal;text-decoration:none;" align="Left">
[AMD Official Use Only - AMD Internal Distribution Only]<br>
</p>
<br>
<div>
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">> Please keep in mind that this is not the only scenario addressed by the<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">> driver - for ex: a resume sequence is executed after a device reset.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">> This patch itself introduces unwanted sequences for other commonly used<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">> usecases. Please rework on the series without breaking existing usecases.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">> <o:p>
</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">> Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">> Lijo<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">Hi
<a id="OWAAMBAFCD4633AA3514C9B5BCB5E58BDD327" href="mailto:Lijo.Lazar@amd.com"><span style="font-family:"Aptos",sans-serif;text-decoration:none">@Lazar, Lijo</span></a>, Thank you for the feedback.
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">I also think the new code should be inside a check so that new code is executed only on resume with different VF and do not break existing usecases. Following is the implementation
 of this approach I can think of. <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">- introduce new field `prev_physical_node_id ` in `struct amdgpu_xgmi `. update the fields on resume.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">- put new code inside code block `if (prev_physical_node_id  != physical_node_id )`<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">Is this approach acceptable? If not, can you suggest a better approach?
<a id="OWAAM57DEDBE5638C4240A750A18A148939F0" href="mailto:Lijo.Lazar@amd.com"><span style="font-family:"Aptos",sans-serif;text-decoration:none">@Lazar, Lijo</span></a>
<a id="OWAAM10C90ABE505E85408A10A63A9A44DFE8" href="mailto:Christian.Koenig@amd.com">
<span style="font-family:"Aptos",sans-serif;text-decoration:none">@Koenig, Christian</span></a> Thank you!<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">Regards<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Aptos",sans-serif">Sam<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Aptos",sans-serif"><o:p> </o:p></span></p>
<div id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="font-size:12.0pt;font-family:"Aptos",sans-serif;color:black">From:
</span></b><span style="font-size:12.0pt;font-family:"Aptos",sans-serif;color:black">Lazar, Lijo <Lijo.Lazar@amd.com><br>
<b>Date: </b>Tuesday, May 6, 2025 at 19:55<br>
<b>To: </b>Zhang, GuoQing (Sam) <GuoQing.Zhang@amd.com>, amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org><br>
<b>Cc: </b>Zhao, Victor <Victor.Zhao@amd.com>, Chang, HaiJun <HaiJun.Chang@amd.com>, Koenig, Christian <Christian.Koenig@amd.com>, Deucher, Alexander <Alexander.Deucher@amd.com>, Zhang, Owen(SRDC) <Owen.Zhang2@amd.com>, Ma, Qing (Mark) <Qing.Ma@amd.com>, Jiang
 Liu <gerry@linux.alibaba.com><br>
<b>Subject: </b>Re: [PATCH v3 1/7] drm/amdgpu: update XGMI physical node id and GMC configs on resume<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
<br>
On 5/6/2025 3:06 PM, Samuel Zhang wrote:<br>
> For virtual machine with vGPUs in SRIOV single device mode and XGMI<br>
> is enabled, XGMI physical node ids may change when waking up from<br>
> hiberation with different vGPU devices. So update XGMI physical node<br>
> ids on resume.<br>
> <br>
<br>
Please keep in mind that this is not the only scenario addressed by the<br>
driver - for ex: a resume sequence is executed after a device reset.<br>
This patch itself introduces unwanted sequences for other commonly used<br>
usecases. Please rework on the series without breaking existing usecases.<br>
<br>
Thanks,<br>
Lijo<br>
<br>
> Update GPU memory controller configuration on resume if XGMI physical<br>
> node ids are changed.<br>
> <br>
> Signed-off-by: Jiang Liu <gerry@linux.alibaba.com><br>
> Signed-off-by: Samuel Zhang <guoqing.zhang@amd.com><br>
> ---<br>
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 24 ++++++++++++++++++++++<br>
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c    |  3 +--<br>
>  drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c      |  4 ++++<br>
>  3 files changed, 29 insertions(+), 2 deletions(-)<br>
> <br>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
> index d477a901af84..e795af5067e5 100644<br>
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
> @@ -5040,6 +5040,27 @@ int amdgpu_device_suspend(struct drm_device *dev, bool notify_clients)<br>
>        return 0;<br>
>  }<br>
>  <br>
> +static int amdgpu_device_update_xgmi_info(struct amdgpu_device *adev)<br>
> +{<br>
> +     int r;<br>
> +     unsigned int prev_physical_node_id;<br>
> +<br>
> +     /* Get xgmi info again for sriov to detect device changes */<br>
> +     if (amdgpu_sriov_vf(adev) &&<br>
> +         !(adev->flags & AMD_IS_APU) &&<br>
> +         adev->gmc.xgmi.supported &&<br>
> +         !adev->gmc.xgmi.connected_to_cpu) {<br>
> +             prev_physical_node_id = adev->gmc.xgmi.physical_node_id;<br>
> +             r = adev->gfxhub.funcs->get_xgmi_info(adev);<br>
> +             if (r)<br>
> +                     return r;<br>
> +<br>
> +             dev_info(adev->dev, "xgmi node, old id %d, new id %d\n",<br>
> +                     prev_physical_node_id, adev->gmc.xgmi.physical_node_id);<br>
> +     }<br>
> +     return 0;<br>
> +}<br>
> +<br>
>  /**<br>
>   * amdgpu_device_resume - initiate device resume<br>
>   *<br>
> @@ -5059,6 +5080,9 @@ int amdgpu_device_resume(struct drm_device *dev, bool notify_clients)<br>
>                r = amdgpu_virt_request_full_gpu(adev, true);<br>
>                if (r)<br>
>                        return r;<br>
> +             r = amdgpu_device_update_xgmi_info(adev);<br>
> +             if (r)<br>
> +                     return r;<br>
>        }<br>
>  <br>
>        if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)<br>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c<br>
> index d1fa5e8e3937..a2abddf3c110 100644<br>
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c<br>
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c<br>
> @@ -1298,8 +1298,7 @@ int amdgpu_gmc_get_nps_memranges(struct amdgpu_device *adev,<br>
>        if (!mem_ranges || !exp_ranges)<br>
>                return -EINVAL;<br>
>  <br>
> -     refresh = (adev->init_lvl->level != AMDGPU_INIT_LEVEL_MINIMAL_XGMI) &&<br>
> -               (adev->gmc.reset_flags & AMDGPU_GMC_INIT_RESET_NPS);<br>
> +     refresh = true;<br>
>        ret = amdgpu_discovery_get_nps_info(adev, &nps_type, &ranges,<br>
>                                            &range_cnt, refresh);<br>
>  <br>
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c<br>
> index 59385da80185..1eb451a3743b 100644<br>
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c<br>
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c<br>
> @@ -2533,6 +2533,10 @@ static int gmc_v9_0_resume(struct amdgpu_ip_block *ip_block)<br>
>        struct amdgpu_device *adev = ip_block->adev;<br>
>        int r;<br>
>  <br>
> +     r = gmc_v9_0_mc_init(adev);<br>
> +     if (r)<br>
> +             return r;<br>
> +<br>
>        /* If a reset is done for NPS mode switch, read the memory range<br>
>         * information again.<br>
>         */</p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>