Skip to content

Commit fa20964

Browse files
superm1rafaeljw
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 <[email protected]> Signed-off-by: Mario Limonciello <[email protected]> [ rjw: Edits of the new comments ] Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent 6f1e8b1 commit fa20964

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
@@ -449,25 +449,30 @@ int acpi_s2idle_prepare_late(void)
449449
if (pm_debug_messages_on)
450450
lpi_check_constraints();
451451

452-
if (lps0_dsm_func_mask_microsoft > 0) {
452+
/* Screen off */
453+
if (lps0_dsm_func_mask > 0)
454+
acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
455+
ACPI_LPS0_SCREEN_OFF_AMD :
456+
ACPI_LPS0_SCREEN_OFF,
457+
lps0_dsm_func_mask, lps0_dsm_guid);
458+
459+
if (lps0_dsm_func_mask_microsoft > 0)
453460
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF,
454461
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
455-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
456-
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
462+
463+
/* LPS0 entry */
464+
if (lps0_dsm_func_mask > 0)
465+
acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
466+
ACPI_LPS0_ENTRY_AMD :
467+
ACPI_LPS0_ENTRY,
468+
lps0_dsm_func_mask, lps0_dsm_guid);
469+
if (lps0_dsm_func_mask_microsoft > 0) {
457470
acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY,
458471
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
459-
} else if (acpi_s2idle_vendor_amd()) {
460-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF_AMD,
461-
lps0_dsm_func_mask, lps0_dsm_guid);
462-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY_AMD,
463-
lps0_dsm_func_mask, lps0_dsm_guid);
464-
} else {
465-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF,
466-
lps0_dsm_func_mask, lps0_dsm_guid);
467-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY,
468-
lps0_dsm_func_mask, lps0_dsm_guid);
472+
/* modern standby entry */
473+
acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
474+
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
469475
}
470-
471476
return 0;
472477
}
473478

@@ -476,24 +481,30 @@ void acpi_s2idle_restore_early(void)
476481
if (!lps0_device_handle || sleep_no_lps0)
477482
return;
478483

479-
if (lps0_dsm_func_mask_microsoft > 0) {
480-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
481-
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
484+
/* Modern standby exit */
485+
if (lps0_dsm_func_mask_microsoft > 0)
482486
acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_EXIT,
483487
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
484-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON,
485-
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
486-
} else if (acpi_s2idle_vendor_amd()) {
487-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT_AMD,
488-
lps0_dsm_func_mask, lps0_dsm_guid);
489-
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON_AMD,
490-
lps0_dsm_func_mask, lps0_dsm_guid);
491-
} else {
488+
489+
/* LPS0 exit */
490+
if (lps0_dsm_func_mask > 0)
491+
acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
492+
ACPI_LPS0_EXIT_AMD :
493+
ACPI_LPS0_EXIT,
494+
lps0_dsm_func_mask, lps0_dsm_guid);
495+
if (lps0_dsm_func_mask_microsoft > 0)
492496
acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
493-
lps0_dsm_func_mask, lps0_dsm_guid);
497+
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
498+
499+
/* Screen on */
500+
if (lps0_dsm_func_mask_microsoft > 0)
494501
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON,
495-
lps0_dsm_func_mask, lps0_dsm_guid);
496-
}
502+
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
503+
if (lps0_dsm_func_mask > 0)
504+
acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
505+
ACPI_LPS0_SCREEN_ON_AMD :
506+
ACPI_LPS0_SCREEN_ON,
507+
lps0_dsm_func_mask, lps0_dsm_guid);
497508
}
498509

499510
static const struct platform_s2idle_ops acpi_s2idle_ops_lps0 = {

0 commit comments

Comments
 (0)