Re: [PATCH v2 1/5] platform/x86/amd/pmc: Check for intermediate wakeup in function

From: Ilpo Järvinen

Date: Mon May 11 2026 - 08:40:16 EST


On Sat, 9 May 2026, Daniel Gibson wrote:

> This slightly refactors code introduced by the

Avoid starting changelog with "This" or "This patch" but use imperative
tone instead. You can start with "Refactor code ..."

> "pmc: Require at least 2.5 seconds between HW sleep cycles"

Please always use the canonical commit reference format (see
Documentation/process/submitting-patches.rst for detail).

It's on the borderline if the origin of the code even matters that much
but since you're adding the (nice) comment, I guess it is easier to figure
out where that came from by having the reference in place.

> commit
> to allow adding different conditions for that delay later.

later -> in an upcoming change

>
> References: 9f5595d5f03f ("platform/x86/amd: pmc: Require at least 2.5 seconds between HW sleep cycles")

Drop this.

> Signed-off-by: Daniel Gibson <daniel@xxxxxxxxx>
> ---
> drivers/platform/x86/amd/pmc/pmc.c | 17 ++++++++++++++---
> 1 file changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/platform/x86/amd/pmc/pmc.c b/drivers/platform/x86/amd/pmc/pmc.c
> index cae3fcafd4d7..2b9e5730170a 100644
> --- a/drivers/platform/x86/amd/pmc/pmc.c
> +++ b/drivers/platform/x86/amd/pmc/pmc.c
> @@ -598,6 +598,19 @@ static int amd_pmc_verify_czn_rtc(struct amd_pmc_dev *pdev, u32 *arg)
> return rc;
> }
>
> +static bool amd_pmc_intermediate_wakeup_need_delay(struct amd_pmc_dev *pdev)
> +{
> + /*
> + * Starting a new HW sleep cycle right after waking from one
> + * can cause electrical problems triggering the over voltage protection.
> + * That is avoided by delaying the next suspend a bit, see also
> + * https://lore.kernel.org/all/20250414162446.3853194-1-superm1@xxxxxxxxxx/
> + */
> + struct smu_metrics table;
> +
> + return get_metrics_table(pdev, &table) == 0 && table.s0i3_last_entry_status;
> +}
> +
> static void amd_pmc_s2idle_prepare(void)
> {
> struct amd_pmc_dev *pdev = &pmc;
> @@ -632,11 +645,9 @@ static void amd_pmc_s2idle_prepare(void)
> static void amd_pmc_s2idle_check(void)
> {
> struct amd_pmc_dev *pdev = &pmc;
> - struct smu_metrics table;
> int rc;
>
> - /* Avoid triggering OVP */
> - if (!get_metrics_table(pdev, &table) && table.s0i3_last_entry_status)
> + if (amd_pmc_intermediate_wakeup_need_delay(pdev))
> msleep(2500);
>
> /* Dump the IdleMask before we add to the STB */
>

--
i.