| From 3c0e68e92c784ef48f5775c62bf70a10363bafec Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 1 Sep 2021 09:21:11 -0500 |
| Subject: ACPI: PM: s2idle: Run both AMD and Microsoft methods if both are |
| supported |
| |
| From: Mario Limonciello <mario.limonciello@amd.com> |
| |
| [ Upstream commit fa209644a7124b3f4cf811ced55daef49ae39ac6 ] |
| |
| 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`. |
| |
| 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@ryt.one> |
| Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> |
| [ rjw: Edits of the new comments ] |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| 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..bd92b549fd5a 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); |
| + /* Modern 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 = { |
| -- |
| 2.33.0 |
| |