aboutsummaryrefslogtreecommitdiff
path: root/SOURCES/v3-1-7-acpi-x86-s2idle-Move-_HID-handling-for-AMD-systems-into-structures.patch
diff options
context:
space:
mode:
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.patch298
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