Re: [PATCH] ACPI: PM: s2idle: Run both AMD and Microsoft methods if both are supported

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Sep 1, 2021 at 4:21 PM Mario Limonciello
<mario.limonciello@xxxxxxx> wrote:
>
> It was reported that on "HP ENVY x360" that power LED does not come back,
> certain keys like brightness controls do not work, and the fan never
> spins up, even under load on 5.14 final.
>
> In analysis of the SSDT it's clear that the Microsoft UUID doesn't provide
> functional support, but rather the AMD UUID should be supporting this
> system.
>
> Because this is a gap in the expected logic, we checked back with internal
> team.  The conclusion was that on Windows AMD uPEP *does* run even when
> Microsoft UUID present, but most OEM systems have adopted value of "0x3"
> for supported functions and hence nothing runs.
>
> Henceforth add support for running both Microsoft and AMD methods.  This
> approach will also allow the same logic on Intel systems if desired at a
> future time as well by pulling the evaluation of
> `lps0_dsm_func_mask_microsoft` out of the `if` block for
> `acpi_s2idle_vendor_amd`.
>
> Cc: liaoyuan@xxxxxxxxx
> Link: https://gitlab.freedesktop.org/drm/amd/uploads/9fbcd7ec3a385cc6949c9bacf45dc41b/acpi-f.20.bin
> BugLink: https://gitlab.freedesktop.org/drm/amd/-/issues/1691
> Reported-by: Maxwell Beck <max@xxxxxxx>
> Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx>
> ---
>  drivers/acpi/x86/s2idle.c | 67 +++++++++++++++++++++++----------------
>  1 file changed, 39 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c
> index 3a308461246a..7d1976e5dd8b 100644
> --- a/drivers/acpi/x86/s2idle.c
> +++ b/drivers/acpi/x86/s2idle.c
> @@ -449,25 +449,30 @@ int acpi_s2idle_prepare_late(void)
>         if (pm_debug_messages_on)
>                 lpi_check_constraints();
>
> -       if (lps0_dsm_func_mask_microsoft > 0) {
> +       /* screen off */
> +       if (lps0_dsm_func_mask > 0)
> +               acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
> +                                       ACPI_LPS0_SCREEN_OFF_AMD :
> +                                       ACPI_LPS0_SCREEN_OFF,
> +                                       lps0_dsm_func_mask, lps0_dsm_guid);
> +
> +       if (lps0_dsm_func_mask_microsoft > 0)
>                 acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF,
>                                 lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
> -               acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
> -                               lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
> +
> +       /* lps0 entry */
> +       if (lps0_dsm_func_mask > 0)
> +               acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
> +                                       ACPI_LPS0_ENTRY_AMD :
> +                                       ACPI_LPS0_ENTRY,
> +                                       lps0_dsm_func_mask, lps0_dsm_guid);
> +       if (lps0_dsm_func_mask_microsoft > 0) {
>                 acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY,
>                                 lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
> -       } else if (acpi_s2idle_vendor_amd()) {
> -               acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF_AMD,
> -                               lps0_dsm_func_mask, lps0_dsm_guid);
> -               acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY_AMD,
> -                               lps0_dsm_func_mask, lps0_dsm_guid);
> -       } else {
> -               acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF,
> -                               lps0_dsm_func_mask, lps0_dsm_guid);
> -               acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY,
> -                               lps0_dsm_func_mask, lps0_dsm_guid);
> +               /* modern standby entry */
> +               acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
> +                               lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
>         }
> -
>         return 0;
>  }
>
> @@ -476,24 +481,30 @@ void acpi_s2idle_restore_early(void)
>         if (!lps0_device_handle || sleep_no_lps0)
>                 return;
>
> -       if (lps0_dsm_func_mask_microsoft > 0) {
> -               acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
> -                               lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
> +       /* mdoern standby exit */
> +       if (lps0_dsm_func_mask_microsoft > 0)
>                 acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_EXIT,
>                                 lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
> -               acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON,
> -                               lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
> -       } else if (acpi_s2idle_vendor_amd()) {
> -               acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT_AMD,
> -                               lps0_dsm_func_mask, lps0_dsm_guid);
> -               acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON_AMD,
> -                               lps0_dsm_func_mask, lps0_dsm_guid);
> -       } else {
> +
> +       /* lps0 exit */
> +       if (lps0_dsm_func_mask > 0)
> +               acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
> +                                       ACPI_LPS0_EXIT_AMD :
> +                                       ACPI_LPS0_EXIT,
> +                                       lps0_dsm_func_mask, lps0_dsm_guid);
> +       if (lps0_dsm_func_mask_microsoft > 0)
>                 acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
> -                               lps0_dsm_func_mask, lps0_dsm_guid);
> +                               lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
> +
> +       /* screen on */
> +       if (lps0_dsm_func_mask_microsoft > 0)
>                 acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON,
> -                               lps0_dsm_func_mask, lps0_dsm_guid);
> -       }
> +                               lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
> +       if (lps0_dsm_func_mask > 0)
> +               acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
> +                                       ACPI_LPS0_SCREEN_ON_AMD :
> +                                       ACPI_LPS0_SCREEN_ON,
> +                                       lps0_dsm_func_mask, lps0_dsm_guid);
>  }
>
>  static const struct platform_s2idle_ops acpi_s2idle_ops_lps0 = {
> --

Applied as 5.15-rc1 material with some edits in the new comments added
by this patch (including a typo fix).

Thanks!



[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux