ACPI: x86: s2idle: Add module parameter to prefer Microsoft GUID
authorMario Limonciello <mario.limonciello@amd.com>
Wed, 21 Sep 2022 20:40:50 +0000 (15:40 -0500)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sun, 25 Sep 2022 15:44:55 +0000 (17:44 +0200)
OEMs have made some mistakes in the past for the AMD GUID support
and not populated the method properly.  To add an escape hatch for
this problem introduce a module parameter that can force using
the Microsoft GUID.

This is intentionally introduced to both Intel and AMD codepaths
to allow using the parameter as a debugging tactic on either.

Reviewed-by: Philipp Zabel <philipp.zabel@gmail.com>
Tested-by: Philipp Zabel <philipp.zabel@gmail.com> # GA402RJ
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/x86/s2idle.c

index 2c5931d..725d2a6 100644 (file)
@@ -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_dsm_guid __read_mostly;
+module_param(prefer_microsoft_dsm_guid, bool, 0644);
+MODULE_PARM_DESC(prefer_microsoft_dsm_guid, "Prefer using Microsoft GUID in LPS0 device _DSM evaluation");
+
 static const struct acpi_device_id lps0_device_ids[] = {
        {"PNP0D80", },
        {"", },
@@ -402,6 +406,9 @@ static int lps0_device_attach(struct acpi_device *adev,
        if (lps0_device_handle)
                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;
@@ -416,16 +423,12 @@ static int lps0_device_attach(struct acpi_device *adev,
                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 &&
-                               (!strcmp(hid, "AMDI0007") ||
-                                !strcmp(hid, "AMDI0008"))) {
+                               !prefer_microsoft_dsm_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_dsm_guid)
+                       lps0_dsm_func_mask_microsoft = -EINVAL;
        }
 
        if (lps0_dsm_func_mask < 0 && lps0_dsm_func_mask_microsoft < 0)