mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 06:02:05 +00:00
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>
This commit is contained in:
parent
6f1e8b12ee
commit
fa209644a7
@ -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);
|
||||
|
||||
/* 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);
|
||||
/* modern standby entry */
|
||||
acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
|
||||
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
/* 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_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_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 {
|
||||
acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
|
||||
lps0_dsm_func_mask, lps0_dsm_guid);
|
||||
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON,
|
||||
lps0_dsm_func_mask, lps0_dsm_guid);
|
||||
}
|
||||
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 = {
|
||||
|
Loading…
Reference in New Issue
Block a user