<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body>
<p style="font-family:Arial;font-size:10pt;color:#0000FF;margin:5pt;" align="Left">
[AMD Official Use Only - General]<br>
</p>
<br>
<div>
<div style=""><br>
</div>
<div id="ms-outlook-mobile-signature" dir="auto">
<div dir="auto"><br>
<div dir="auto" style="font-size: medium; color: rgb(0, 0, 0);">The notifier block is embedded in smu context of a device. If there are 4 devices and 3 of them are interested, they register using the notifier block within their smu context. Notifier is called
 in a chain and when received they use the container_of to get the smu context and communicate with the respective device's FW on the actions to do.</div>
<div dir="auto" style="font-size: medium; color: rgb(0, 0, 0);"><br>
</div>
<div dir="auto" style="font-size: medium; color: rgb(0, 0, 0);">BTW, I don't know why dGPU PMFW would be interested in SMT change. On AMD APU + dGPU we already have things like smartshift and it will take care if communicated to APU alone.<br>
</div>
<div dir="auto" style="font-size: medium; color: rgb(0, 0, 0);"><br>
</div>
</div>
Thanks,<br>
Lijo</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Limonciello, Mario <Mario.Limonciello@amd.com><br>
<b>Sent:</b> Friday, March 24, 2023 11:19:55 PM<br>
<b>To:</b> Lazar, Lijo <Lijo.Lazar@amd.com>; Yang, WenYou <WenYou.Yang@amd.com>; Deucher, Alexander <Alexander.Deucher@amd.com>; Koenig, Christian <Christian.Koenig@amd.com>; Pan, Xinhui <Xinhui.Pan@amd.com><br>
<b>Cc:</b> Li, Ying <YING.LI@amd.com>; Liu, Kun <Kun.Liu2@amd.com>; Liang, Richard qi <Richardqi.Liang@amd.com>; amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org><br>
<b>Subject:</b> RE: [v1,2/3] drm/amd/pm: send the SMT-enable message to pmfw</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">[AMD Official Use Only - General]<br>
<br>
<br>
<br>
> -----Original Message-----<br>
> From: Lazar, Lijo <Lijo.Lazar@amd.com><br>
> Sent: Thursday, March 23, 2023 21:29<br>
> To: Limonciello, Mario <Mario.Limonciello@amd.com>; Yang, WenYou<br>
> <WenYou.Yang@amd.com>; Deucher, Alexander<br>
> <Alexander.Deucher@amd.com>; Koenig, Christian<br>
> <Christian.Koenig@amd.com>; Pan, Xinhui <Xinhui.Pan@amd.com><br>
> Cc: Li, Ying <YING.LI@amd.com>; Liu, Kun <Kun.Liu2@amd.com>; Liang,<br>
> Richard qi <Richardqi.Liang@amd.com>; amd-gfx@lists.freedesktop.org<br>
> Subject: Re: [v1,2/3] drm/amd/pm: send the SMT-enable message to pmfw<br>
> <br>
> <br>
> <br>
> On 3/23/2023 11:36 PM, Limonciello, Mario wrote:<br>
> > On 3/23/2023 12:41, Limonciello, Mario wrote:<br>
> >> On 3/22/2023 00:48, Wenyou Yang wrote:<br>
> >>> When the CPU SMT status change in the fly, sent the SMT-enable<br>
> >>> message to pmfw to notify it that the SMT status changed.<br>
> >>><br>
> >>> Signed-off-by: Wenyou Yang <WenYou.Yang@amd.com><br>
> >>> ---<br>
> >>>   drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c     | 41<br>
> +++++++++++++++++++<br>
> >>>   drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h |  5 +++<br>
> >>>   2 files changed, 46 insertions(+)<br>
> >>><br>
> >>> diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c<br>
> >>> b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c<br>
> >>> index b5d64749990e..5cd85a9d149d 100644<br>
> >>> --- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c<br>
> >>> +++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c<br>
> >>> @@ -22,6 +22,7 @@<br>
> >>>   #define SWSMU_CODE_LAYER_L1<br>
> >>> +#include <linux/cpu.h><br>
> >>>   #include <linux/firmware.h><br>
> >>>   #include <linux/pci.h><br>
> >>> @@ -69,6 +70,14 @@ static int smu_set_fan_speed_rpm(void *handle,<br>
> >>> uint32_t speed);<br>
> >>>   static int smu_set_gfx_cgpg(struct smu_context *smu, bool enabled);<br>
> >>>   static int smu_set_mp1_state(void *handle, enum pp_mp1_state<br>
> >>> mp1_state);<br>
> >>> +static int smt_notifier_callback(struct notifier_block *nb, unsigned<br>
> >>> long action, void *data);<br>
> >>> +<br>
> >>> +extern struct raw_notifier_head smt_notifier_head;<br>
> >>> +<br>
> >>> +static struct notifier_block smt_notifier = {<br>
> >>> +    .notifier_call = smt_notifier_callback,<br>
> >>> +};<br>
> >>> +<br>
> >>>   static int smu_sys_get_pp_feature_mask(void *handle,<br>
> >>>                          char *buf)<br>
> >>>   {<br>
> >>> @@ -625,6 +634,8 @@ static int smu_set_funcs(struct amdgpu_device<br>
> *adev)<br>
> >>>       return 0;<br>
> >>>   }<br>
> >>> +static struct smu_context *current_smu;<br>
> >>> +<br>
> >>>   static int smu_early_init(void *handle)<br>
> >>>   {<br>
> >>>       struct amdgpu_device *adev = (struct amdgpu_device *)handle;<br>
> >>> @@ -645,6 +656,7 @@ static int smu_early_init(void *handle)<br>
> >>>       mutex_init(&smu->message_lock);<br>
> >>>       adev->powerplay.pp_handle = smu;<br>
> >>> +    current_smu = smu;<br>
> ><br>
> > Although this series is intended for the Van Gogh case right now, I<br>
> > dont't think this would scale well for multiple GPUs in a system.<br>
> ><br>
> > I think that instead you may want to move the notifier callback to be a<br>
> > level "higher" in amdgpu.  Perhaps amdgpu_device.c?  Then when that<br>
> > notifier call is received you'll want to walk through the PCI device<br>
> > space to find any GPUs that are bound with AMDGPU a series of<br>
> > wrappers/calls that end up calling smu_set_cpu_smt_enable with the<br>
> > approriate arguments.<br>
> ><br>
> <br>
> This is not required when the notifier is registered only within Vangogh<br>
> ppt function. Then follow Evan's suggestion of keeping the notifier<br>
> block inside smu. From the notifier block, it can find the smu block and<br>
> then call cpu_smt_enable/disable. That way notifier callback comes only<br>
> once even with multiple dGPUs + Vangogh and processed for the<br>
> corresponding smu.<br>
> <br>
> This notifier doesn't need to be registered for platforms only with<br>
> dGPUs or APUs which don't need this.<br>
<br>
They don't right now, but I was thinking how this could scale to other<br>
APUs or dGPUs if they are interested in adding support for this message<br>
too.<br>
<br>
> <br>
> Thanks,<br>
> Lijo<br>
> <br>
> ><br>
> >>>       adev->powerplay.pp_funcs = &swsmu_pm_funcs;<br>
> >>>       r = smu_set_funcs(adev);<br>
> >>> @@ -1105,6 +1117,8 @@ static int smu_sw_init(void *handle)<br>
> >>>       if (!smu->ppt_funcs->get_fan_control_mode)<br>
> >>>           smu->adev->pm.no_fan = true;<br>
> >>> +    raw_notifier_chain_register(&smt_notifier_head, &smt_notifier);<br>
> >>> +<br>
> >>>       return 0;<br>
> >>>   }<br>
> >>> @@ -1122,6 +1136,8 @@ static int smu_sw_fini(void *handle)<br>
> >>>       smu_fini_microcode(smu);<br>
> >>> +    raw_notifier_chain_unregister(&smt_notifier_head, &smt_notifier);<br>
> >>> +<br>
> >>>       return 0;<br>
> >>>   }<br>
> >>> @@ -3241,3 +3257,28 @@ int smu_send_hbm_bad_channel_flag(struct<br>
> >>> smu_context *smu, uint32_t size)<br>
> >>>       return ret;<br>
> >>>   }<br>
> >>> +<br>
> >>> +static int smu_set_cpu_smt_enable(struct smu_context *smu, bool<br>
> enable)<br>
> >>> +{<br>
> >>> +    int ret = -EINVAL;<br>
> >>> +<br>
> >>> +    if (smu->ppt_funcs && smu->ppt_funcs->set_cpu_smt_enable)<br>
> >>> +        ret = smu->ppt_funcs->set_cpu_smt_enable(smu, enable);<br>
> >>> +<br>
> >>> +    return ret;<br>
> >>> +}<br>
> >>> +<br>
> >>> +static int smt_notifier_callback(struct notifier_block *nb,<br>
> >>> +                 unsigned long action, void *data)<br>
> >>> +{<br>
> >>> +    struct smu_context *smu = current_smu;<br>
> >>> +    int ret = NOTIFY_OK;<br>
> >><br>
> >> This initialization is pointless, it's clobbered in the next line.<br>
> >><br>
> >>> +<br>
> >>> +    ret = (action == SMT_ENABLED) ?<br>
> >>> +                smu_set_cpu_smt_enable(smu, true) :<br>
> >>> +                smu_set_cpu_smt_enable(smu, false);<br>
> >><br>
> >> How about this instead, it should be more readable:<br>
> >><br>
> >>      ret = smu_set_cpu_smt_enable(smu, action == SMT_ENABLED);<br>
> >><br>
> >>> +    if (ret)<br>
> >>> +        ret = NOTIFY_BAD;<br>
> >>> +<br>
> >>> +    return ret;<br>
> >><br>
> >> How about instead:<br>
> >><br>
> >>      dev_dbg(adev->dev, "failed to %sable SMT: %d\n", action ==<br>
> >> SMT_ENABLED ? "en" : "dis", ret);<br>
> >><br>
> >>      return ret ? NOTIFY_BAD : NOTIFY_OK;<br>
> >><br>
> >>> +}<br>
> >>> diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h<br>
> >>> b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h<br>
> >>> index 09469c750a96..7c6594bba796 100644<br>
> >>> --- a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h<br>
> >>> +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h<br>
> >>> @@ -1354,6 +1354,11 @@ struct pptable_funcs {<br>
> >>>        * @init_pptable_microcode: Prepare the pptable microcode to<br>
> >>> upload via PSP<br>
> >>>        */<br>
> >>>       int (*init_pptable_microcode)(struct smu_context *smu);<br>
> >>> +<br>
> >>> +    /**<br>
> >>> +     * @set_cpu_smt_enable: Set the CPU SMT status<br>
> >>> +     */<br>
> >>> +    int (*set_cpu_smt_enable)(struct smu_context *smu, bool enable);<br>
> >>>   };<br>
> >>>   typedef enum {<br>
> >><br>
> ><br>
</div>
</span></font></div>
</div>
</body>
</html>