Bug 218750
Summary: | Regression: S0ix sleep broken on 13th Gen Lenovo laptops | ||
---|---|---|---|
Product: | ACPI | Reporter: | Mark Pearson (mpearson-lenovo) |
Component: | Power-Sleep-Wake | Assignee: | acpi_power-sleep-wake |
Status: | RESOLVED PATCH_ALREADY_AVAILABLE | ||
Severity: | blocking | CC: | jwrdegoede, mario.limonciello, rjw |
Priority: | P3 | ||
Hardware: | Intel | ||
OS: | Linux | ||
Kernel Version: | Subsystem: | ||
Regression: | No | Bisected commit-id: | |
Attachments: | ACPI dump |
Description
Mark Pearson
2024-04-19 17:49:06 UTC
I think you should attach an acpidump from an affected system. Something notable about that commit that is different between Intel and AMD is the Intel case avoids evaluation of the same DSM with multiple UUIDs. Depending upon what the firmware actually does in the different cases perhaps that's the root of why this commit causes issues. You could try to change it to behave like the way AMD does and let it evaluate both Microsoft and Intel paths if both are present instead of prioritizing to see if this theory has any legs. Created attachment 306196 [details]
ACPI dump
Thanks Mario for the suggestion.
acpidump attached
Yup, try this. If that works I'd say, go ahead and post a patch for Rafael to review. It's better than a revert. diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c index cd84af23f7ea..3da2f075711e 100644 --- a/drivers/acpi/x86/s2idle.c +++ b/drivers/acpi/x86/s2idle.c @@ -488,21 +488,6 @@ static int lps0_device_attach(struct acpi_device *adev, rev_id = 1; lps0_dsm_func_mask = validate_dsm(adev->handle, ACPI_LPS0_DSM_UUID, rev_id, &lps0_dsm_guid); - if (lps0_dsm_func_mask > 0 && lps0_dsm_func_mask_microsoft > 0) { - unsigned int func_mask; - - /* - * Avoid evaluating the same _DSM function for two - * different UUIDs and prioritize the MSFT one. - */ - func_mask = lps0_dsm_func_mask & lps0_dsm_func_mask_microsoft; - if (func_mask) { - acpi_handle_info(adev->handle, - "Duplicate LPS0 _DSM functions (mask: 0x%x)\n", - func_mask); - lps0_dsm_func_mask &= ~func_mask; - } - } } if (lps0_dsm_func_mask < 0 && lps0_dsm_func_mask_microsoft < 0) |