Skip to content

Commit 5b5c939

Browse files
superm1crawfxrd
authored andcommitted
ACPI: PM: s2idle: Run both AMD and Microsoft methods if both are supported
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>
1 parent eecbf13 commit 5b5c939

File tree

1 file changed

+39
-28
lines changed

1 file changed

+39
-28
lines changed

drivers/acpi/x86/s2idle.c

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -443,25 +443,30 @@ int acpi_s2idle_prepare_late(void)
443443
if (pm_debug_messages_on)
444444
lpi_check_constraints();
445445

446-
if (lps0_dsm_func_mask_microsoft > 0) {
446+
/* Screen off */
447+
if (lps0_dsm_func_mask > 0)
448+
acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
449+
ACPI_LPS0_SCREEN_OFF_AMD :
450+
ACPI_LPS0_SCREEN_OFF,
451+
lps0_dsm_func_mask, lps0_dsm_guid);
452+
453+
if (lps0_dsm_func_mask_microsoft > 0)
447454
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF,
448455
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
449-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
450-
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
456+
457+
/* LPS0 entry */
458+
if (lps0_dsm_func_mask > 0)
459+
acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
460+
ACPI_LPS0_ENTRY_AMD :
461+
ACPI_LPS0_ENTRY,
462+
lps0_dsm_func_mask, lps0_dsm_guid);
463+
if (lps0_dsm_func_mask_microsoft > 0) {
451464
acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY,
452465
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
453-
} else if (acpi_s2idle_vendor_amd()) {
454-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF_AMD,
455-
lps0_dsm_func_mask, lps0_dsm_guid);
456-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY_AMD,
457-
lps0_dsm_func_mask, lps0_dsm_guid);
458-
} else {
459-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF,
460-
lps0_dsm_func_mask, lps0_dsm_guid);
461-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY,
462-
lps0_dsm_func_mask, lps0_dsm_guid);
466+
/* modern standby entry */
467+
acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
468+
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
463469
}
464-
465470
return 0;
466471
}
467472

@@ -470,24 +475,30 @@ void acpi_s2idle_restore_early(void)
470475
if (!lps0_device_handle || sleep_no_lps0)
471476
return;
472477

473-
if (lps0_dsm_func_mask_microsoft > 0) {
474-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
475-
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
478+
/* Modern standby exit */
479+
if (lps0_dsm_func_mask_microsoft > 0)
476480
acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_EXIT,
477481
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
478-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON,
479-
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
480-
} else if (acpi_s2idle_vendor_amd()) {
481-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT_AMD,
482-
lps0_dsm_func_mask, lps0_dsm_guid);
483-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON_AMD,
484-
lps0_dsm_func_mask, lps0_dsm_guid);
485-
} else {
482+
483+
/* LPS0 exit */
484+
if (lps0_dsm_func_mask > 0)
485+
acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
486+
ACPI_LPS0_EXIT_AMD :
487+
ACPI_LPS0_EXIT,
488+
lps0_dsm_func_mask, lps0_dsm_guid);
489+
if (lps0_dsm_func_mask_microsoft > 0)
486490
acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
487-
lps0_dsm_func_mask, lps0_dsm_guid);
491+
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
492+
493+
/* Screen on */
494+
if (lps0_dsm_func_mask_microsoft > 0)
488495
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON,
489-
lps0_dsm_func_mask, lps0_dsm_guid);
490-
}
496+
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
497+
if (lps0_dsm_func_mask > 0)
498+
acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
499+
ACPI_LPS0_SCREEN_ON_AMD :
500+
ACPI_LPS0_SCREEN_ON,
501+
lps0_dsm_func_mask, lps0_dsm_guid);
491502
}
492503

493504
static const struct platform_s2idle_ops acpi_s2idle_ops_lps0 = {

0 commit comments

Comments
 (0)