Merge tag 'io_uring-5.15-2021-09-11' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / drivers / acpi / x86 / s2idle.c
index 1c50780..bd92b54 100644 (file)
@@ -378,19 +378,25 @@ static int lps0_device_attach(struct acpi_device *adev,
                 * 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 = 0;
+               rev_id = strcmp(hid, "AMDI0007") ? 0 : 2;
                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, rev_id,
+                                       ACPI_LPS0_DSM_UUID_MICROSOFT, 0,
                                        &lps0_dsm_guid_microsoft);
                if (lps0_dsm_func_mask > 0x3 && (!strcmp(hid, "AMD0004") ||
                                                 !strcmp(hid, "AMDI0005"))) {
                        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")) {
+                       lps0_dsm_func_mask_microsoft = -EINVAL;
+                       acpi_handle_debug(adev->handle, "_DSM Using AMD method\n");
                }
        } else {
                rev_id = 1;
@@ -443,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);
-               acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_EXIT,
-                               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);
-       } 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);
+               /* modern standby entry */
+               acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
+                               lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
        }
-
        return 0;
 }
 
@@ -470,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,
+       /* 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);
-               acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
+
+       /* 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 = {