diff options
Diffstat (limited to 'SOURCES/v3-1-7-acpi-x86-s2idle-Move-_HID-handling-for-AMD-systems-into-structures.patch')
-rw-r--r-- | SOURCES/v3-1-7-acpi-x86-s2idle-Move-_HID-handling-for-AMD-systems-into-structures.patch | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/SOURCES/v3-1-7-acpi-x86-s2idle-Move-_HID-handling-for-AMD-systems-into-structures.patch b/SOURCES/v3-1-7-acpi-x86-s2idle-Move-_HID-handling-for-AMD-systems-into-structures.patch new file mode 100644 index 0000000..70be906 --- /dev/null +++ b/SOURCES/v3-1-7-acpi-x86-s2idle-Move-_HID-handling-for-AMD-systems-into-structures.patch @@ -0,0 +1,298 @@ +--- + drivers/acpi/x86/s2idle.c | 63 ++++++++++++++++++++++++++++----------- + 1 file changed, 46 insertions(+), 17 deletions(-) + +diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c +index f9ac12b778e6..a7757551f750 100644 +--- a/drivers/acpi/x86/s2idle.c ++++ b/drivers/acpi/x86/s2idle.c +@@ -363,6 +363,39 @@ static int validate_dsm(acpi_handle handle, const char *uuid, int rev, guid_t *d + return ret; + } + ++struct amd_lps0_hid_device_data { ++ const unsigned int rev_id; ++ const bool check_off_by_one; ++ const bool prefer_amd_guid; ++}; ++ ++static const struct amd_lps0_hid_device_data amd_picasso = { ++ .rev_id = 0, ++ .check_off_by_one = true, ++ .prefer_amd_guid = false, ++}; ++ ++static const struct amd_lps0_hid_device_data amd_cezanne = { ++ .rev_id = 0, ++ .check_off_by_one = false, ++ .prefer_amd_guid = false, ++}; ++ ++static const struct amd_lps0_hid_device_data amd_rembrandt = { ++ .rev_id = 2, ++ .check_off_by_one = false, ++ .prefer_amd_guid = true, ++}; ++ ++static const struct acpi_device_id amd_hid_ids[] = { ++ {"AMD0004", (kernel_ulong_t)&amd_picasso, }, ++ {"AMD0005", (kernel_ulong_t)&amd_picasso, }, ++ {"AMDI0005", (kernel_ulong_t)&amd_picasso, }, ++ {"AMDI0006", (kernel_ulong_t)&amd_cezanne, }, ++ {"AMDI0007", (kernel_ulong_t)&amd_rembrandt, }, ++ {} ++}; ++ + static int lps0_device_attach(struct acpi_device *adev, + const struct acpi_device_id *not_used) + { +@@ -452,31 +452,27 @@ + return 0; + + if (acpi_s2idle_vendor_amd()) { +- /* AMD0004, AMD0005, AMDI0005: +- * - Should use rev_id 0x0 +- * - function mask > 0x3: Should use AMD method, but has off by one bug +- * - function mask = 0x3: Should use Microsoft method +- * AMDI0006: +- * - should use rev_id 0x0 +- * - function mask = 0x3: Should use Microsoft method +- * AMDI0007: +- * - Should use rev_id 0x2 +- * - Should only use AMD method +- */ +- const char *hid = acpi_device_hid(adev); +- rev_id = strcmp(hid, "AMDI0007") ? 0 : 2; ++ static const struct acpi_device_id *dev_id; ++ const struct amd_lps0_hid_device_data *data; ++ ++ for (dev_id = &amd_hid_ids[0]; dev_id->id[0]; dev_id++) ++ if (acpi_dev_hid_uid_match(adev, dev_id->id, NULL)) ++ break; ++ if (dev_id != NULL) ++ data = (const struct amd_lps0_hid_device_data *) dev_id->driver_data; ++ else ++ return 0; ++ rev_id = data->rev_id; + lps0_dsm_func_mask = validate_dsm(adev->handle, + ACPI_LPS0_DSM_UUID_AMD, rev_id, &lps0_dsm_guid); + lps0_dsm_func_mask_microsoft = validate_dsm(adev->handle, + ACPI_LPS0_DSM_UUID_MICROSOFT, 0, + &lps0_dsm_guid_microsoft); +- if (lps0_dsm_func_mask > 0x3 && (!strcmp(hid, "AMD0004") || +- !strcmp(hid, "AMD0005") || +- !strcmp(hid, "AMDI0005"))) { ++ if (lps0_dsm_func_mask > 0x3 && data->check_off_by_one) { + lps0_dsm_func_mask = (lps0_dsm_func_mask << 1) | 0x1; + acpi_handle_debug(adev->handle, "_DSM UUID %s: Adjusted function mask: 0x%x\n", + ACPI_LPS0_DSM_UUID_AMD, lps0_dsm_func_mask); +- } else if (lps0_dsm_func_mask_microsoft > 0 && !strcmp(hid, "AMDI0007")) { ++ } else if (lps0_dsm_func_mask_microsoft > 0 && data->prefer_amd_guid) { + lps0_dsm_func_mask_microsoft = -EINVAL; + acpi_handle_debug(adev->handle, "_DSM Using AMD method\n"); + } +-- +2.34.1 + + --- + drivers/acpi/x86/s2idle.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c +index a7757551f750..a8256e5a0e8a 100644 +--- a/drivers/acpi/x86/s2idle.c ++++ b/drivers/acpi/x86/s2idle.c +@@ -461,7 +461,7 @@ + if (dev_id != NULL) + data = (const struct amd_lps0_hid_device_data *) dev_id->driver_data; + else +- return 0; ++ data = &amd_rembrandt; + rev_id = data->rev_id; + lps0_dsm_func_mask = validate_dsm(adev->handle, + ACPI_LPS0_DSM_UUID_AMD, rev_id, &lps0_dsm_guid); +-- +2.34.1 + + --- + drivers/acpi/x86/s2idle.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c +index a8256e5a0e8a..a9b0f2b54a1c 100644 +--- a/drivers/acpi/x86/s2idle.c ++++ b/drivers/acpi/x86/s2idle.c +@@ -27,6 +27,10 @@ static bool sleep_no_lps0 __read_mostly; + module_param(sleep_no_lps0, bool, 0644); + MODULE_PARM_DESC(sleep_no_lps0, "Do not use the special LPS0 device interface"); + ++static bool prefer_microsoft_guid __read_mostly; ++module_param(prefer_microsoft_guid, bool, 0644); ++MODULE_PARM_DESC(prefer_microsoft_guid, "Prefer selecting Microsoft GUID for LPS0 device"); ++ + static const struct acpi_device_id lps0_device_ids[] = { + {"PNP0D80", }, + {"", }, +@@ -451,6 +451,9 @@ + if (!(acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0)) + return 0; + ++ lps0_dsm_func_mask_microsoft = validate_dsm(adev->handle, ++ ACPI_LPS0_DSM_UUID_MICROSOFT, 0, ++ &lps0_dsm_guid_microsoft); + if (acpi_s2idle_vendor_amd()) { + static const struct acpi_device_id *dev_id; + const struct amd_lps0_hid_device_data *data; +@@ -468,14 +468,11 @@ + rev_id = data->rev_id; + lps0_dsm_func_mask = validate_dsm(adev->handle, + ACPI_LPS0_DSM_UUID_AMD, rev_id, &lps0_dsm_guid); +- lps0_dsm_func_mask_microsoft = validate_dsm(adev->handle, +- ACPI_LPS0_DSM_UUID_MICROSOFT, 0, +- &lps0_dsm_guid_microsoft); + if (lps0_dsm_func_mask > 0x3 && data->check_off_by_one) { + lps0_dsm_func_mask = (lps0_dsm_func_mask << 1) | 0x1; + acpi_handle_debug(adev->handle, "_DSM UUID %s: Adjusted function mask: 0x%x\n", + ACPI_LPS0_DSM_UUID_AMD, lps0_dsm_func_mask); +- } else if (lps0_dsm_func_mask_microsoft > 0 && data->prefer_amd_guid) { ++ } else if (lps0_dsm_func_mask_microsoft > 0 && data->prefer_amd_guid && !prefer_microsoft_guid) { + lps0_dsm_func_mask_microsoft = -EINVAL; + acpi_handle_debug(adev->handle, "_DSM Using AMD method\n"); + } +@@ -433,7 +436,8 @@ 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); +- lps0_dsm_func_mask_microsoft = -EINVAL; ++ if (!prefer_microsoft_guid) ++ lps0_dsm_func_mask_microsoft = -EINVAL; + } + + if (lps0_dsm_func_mask < 0 && lps0_dsm_func_mask_microsoft < 0) +-- +2.34.1 + + --- +v1->v2: + * Fixup for __init +--- + drivers/acpi/x86/s2idle.c | 26 +++++++++++++++++++++++++- + 1 file changed, 25 insertions(+), 1 deletion(-) + +diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c +index a9b0f2b54a1c..9ee734e0c3c5 100644 +--- a/drivers/acpi/x86/s2idle.c ++++ b/drivers/acpi/x86/s2idle.c +@@ -17,6 +17,7 @@ + + #include <linux/acpi.h> + #include <linux/device.h> ++#include <linux/dmi.h> + #include <linux/suspend.h> + + #include "../sleep.h" +@@ -400,6 +401,28 @@ static const struct acpi_device_id amd_hid_ids[] = { + {} + }; + ++static int lps0_prefer_microsoft(const struct dmi_system_id *id) ++{ ++ pr_debug("Preferring Microsoft GUID.\n"); ++ prefer_microsoft_guid = true; ++ return 0; ++} ++ ++static const struct dmi_system_id s2idle_dmi_table[] __initconst = { ++ { ++ /* ++ * ASUS TUF Gaming A17 FA707RE ++ * https://bugzilla.kernel.org/show_bug.cgi?id=216101 ++ */ ++ .callback = lps0_prefer_microsoft, ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "ASUS TUF Gaming A17"), ++ }, ++ }, ++ {} ++}; ++ + static int lps0_device_attach(struct acpi_device *adev, + const struct acpi_device_id *not_used) + { +@@ -566,8 +589,9 @@ static const struct platform_s2idle_ops acpi_s2idle_ops_lps0 = { + .end = acpi_s2idle_end, + }; + +-void acpi_s2idle_setup(void) ++void __init acpi_s2idle_setup(void) + { ++ dmi_check_system(s2idle_dmi_table); + acpi_scan_add_handler(&lps0_handler); + s2idle_set_ops(&acpi_s2idle_ops_lps0); + } +-- +2.34.1 + + --- +v1->v2: + * New patch +--- + drivers/acpi/x86/s2idle.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c +index 9ee734e0c3c5..4bdc7133d2ea 100644 +--- a/drivers/acpi/x86/s2idle.c ++++ b/drivers/acpi/x86/s2idle.c +@@ -420,6 +420,14 @@ static const struct dmi_system_id s2idle_dmi_table[] __initconst = { + DMI_MATCH(DMI_PRODUCT_NAME, "ASUS TUF Gaming A17"), + }, + }, ++ { ++ /* ASUS ROG Zephyrus G14 (2022) */ ++ .callback = lps0_prefer_microsoft, ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "ROG Zephyrus G14 GA402"), ++ }, ++ }, + {} + }; + +-- +2.34.1 + + --- +v1->v2: + * New patch +--- + drivers/acpi/x86/s2idle.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c +index 4bdc7133d2ea..8475a3915812 100644 +--- a/drivers/acpi/x86/s2idle.c ++++ b/drivers/acpi/x86/s2idle.c +@@ -428,6 +428,17 @@ static const struct dmi_system_id s2idle_dmi_table[] __initconst = { + DMI_MATCH(DMI_PRODUCT_NAME, "ROG Zephyrus G14 GA402"), + }, + }, ++ { ++ /* ++ * Lenovo Slim 7 Pro X 14ARH7 ++ * https://bugzilla.kernel.org/show_bug.cgi?id=216473 ++ */ ++ .callback = lps0_prefer_microsoft, ++ .matches = { ++ DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "82V2"), ++ }, ++ }, + {} + }; + +-- +2.34.1 + +
\ No newline at end of file |