diff mbox series

ACPI: x86: Adjust Microsoft LPS0 _DSM handling sequence

Message ID 20230601233953.1332-1-mario.limonciello@amd.com
State Accepted
Commit f198478cfdc8105a1c8d8945918904f0498d19be
Headers show
Series ACPI: x86: Adjust Microsoft LPS0 _DSM handling sequence | expand

Commit Message

Mario Limonciello June 1, 2023, 11:39 p.m. UTC
In Windows the Microsoft _DSM doesn't call functions 3->5->7 for suspend
and 8->6->4 for resume like Linux currently does.

Rather it calls 3->7->5 for suspend and 6->8->4 for resume.
Align this calling order for Linux as well.

Link: https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-states
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
 drivers/acpi/x86/s2idle.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

Comments

David E. Box June 2, 2023, 1:31 a.m. UTC | #1
On Thu, 2023-06-01 at 18:39 -0500, Mario Limonciello wrote:
> In Windows the Microsoft _DSM doesn't call functions 3->5->7 for suspend
> and 8->6->4 for resume like Linux currently does.
> 
> Rather it calls 3->7->5 for suspend and 6->8->4 for resume.
> Align this calling order for Linux as well.
> 
> Link:
> https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-states

I didn't catch the ordering in the link. Was there any issue that prompted this
change?

David

> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
> ---
>  drivers/acpi/x86/s2idle.c | 14 +++++++-------
>  1 file changed, 7 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c
> index e499c60c4579..7214197c15a0 100644
> --- a/drivers/acpi/x86/s2idle.c
> +++ b/drivers/acpi/x86/s2idle.c
> @@ -485,11 +485,11 @@ int acpi_s2idle_prepare_late(void)
>                                         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);
>                 /* modern standby entry */
>                 acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
>                                 lps0_dsm_func_mask_microsoft,
> lps0_dsm_guid_microsoft);
> +               acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY,
> +                               lps0_dsm_func_mask_microsoft,
> lps0_dsm_guid_microsoft);
>         }
>  
>         list_for_each_entry(handler, &lps0_s2idle_devops_head, list_node) {
> @@ -524,11 +524,6 @@ void acpi_s2idle_restore_early(void)
>                 if (handler->restore)
>                         handler->restore();
>  
> -       /* 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);
> -
>         /* LPS0 exit */
>         if (lps0_dsm_func_mask > 0)
>                 acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
> @@ -539,6 +534,11 @@ void acpi_s2idle_restore_early(void)
>                 acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
>                                 lps0_dsm_func_mask_microsoft,
> lps0_dsm_guid_microsoft);
>  
> +       /* 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);
> +
>         /* Screen on */
>         if (lps0_dsm_func_mask_microsoft > 0)
>                 acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON,
David E. Box June 2, 2023, 3:06 a.m. UTC | #2
On Thu, 2023-06-01 at 20:46 -0500, Limonciello, Mario wrote:
> 
> On 6/1/2023 8:31 PM, David E. Box wrote:
> > On Thu, 2023-06-01 at 18:39 -0500, Mario Limonciello wrote:
> > > In Windows the Microsoft _DSM doesn't call functions 3->5->7 for suspend
> > > and 8->6->4 for resume like Linux currently does.
> > > 
> > > Rather it calls 3->7->5 for suspend and 6->8->4 for resume.
> > > Align this calling order for Linux as well.
> > > 
> > > Link:
> > > https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-states
> > I didn't catch the ordering in the link.
> 
> Yeah it's tough to interpret from the link, because the picture at the 
> bottom
> is missing annotations.
> 
> Basically if you look at the picture the blue part is the screen on/off.
> 
> The green part is "modern standby" and then the little "humps" are LPS0 
> enter/exit.
> 
> > Was there any issue that prompted this
> > change?
> 
> 
> We were debugging an unrelated problem and noticed the difference 
> comparing the
> 
> BIOS debugging log from Windows and Linux.
> 
> If an OEM depends on this call order in that code used in LPS0 phase 
> requires
> changes from MS phase I could hypothesize this fixes it.
> 
> 
> > David
> 
> BTW - is there interest in supporting the Microsoft _DSM GUID for Intel 
> side too?
> 
> It's an incongruity today that we run both AMD GUID and Microsoft GUID 
> for AMD systems
> but only run Intel GUID for Intel systems.

There hasn't been a need yet. Rafael have you look at it?

David

> 
> > 
> > > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
> > > ---
> > >   drivers/acpi/x86/s2idle.c | 14 +++++++-------
> > >   1 file changed, 7 insertions(+), 7 deletions(-)
> > > 
> > > diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c
> > > index e499c60c4579..7214197c15a0 100644
> > > --- a/drivers/acpi/x86/s2idle.c
> > > +++ b/drivers/acpi/x86/s2idle.c
> > > @@ -485,11 +485,11 @@ int acpi_s2idle_prepare_late(void)
> > >                                          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);
> > >                  /* modern standby entry */
> > >                  acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
> > >                                  lps0_dsm_func_mask_microsoft,
> > > lps0_dsm_guid_microsoft);
> > > +               acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY,
> > > +                               lps0_dsm_func_mask_microsoft,
> > > lps0_dsm_guid_microsoft);
> > >          }
> > >   
> > >          list_for_each_entry(handler, &lps0_s2idle_devops_head, list_node)
> > > {
> > > @@ -524,11 +524,6 @@ void acpi_s2idle_restore_early(void)
> > >                  if (handler->restore)
> > >                          handler->restore();
> > >   
> > > -       /* 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);
> > > -
> > >          /* LPS0 exit */
> > >          if (lps0_dsm_func_mask > 0)
> > >                  acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
> > > @@ -539,6 +534,11 @@ void acpi_s2idle_restore_early(void)
> > >                  acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
> > >                                  lps0_dsm_func_mask_microsoft,
> > > lps0_dsm_guid_microsoft);
> > >   
> > > +       /* 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);
> > > +
> > >          /* Screen on */
> > >          if (lps0_dsm_func_mask_microsoft > 0)
> > >                  acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON,
Mario Limonciello June 2, 2023, 4:17 a.m. UTC | #3
On 6/1/2023 10:06 PM, David E. Box wrote:
> On Thu, 2023-06-01 at 20:46 -0500, Limonciello, Mario wrote:
>> On 6/1/2023 8:31 PM, David E. Box wrote:
>>> On Thu, 2023-06-01 at 18:39 -0500, Mario Limonciello wrote:
>>>> In Windows the Microsoft _DSM doesn't call functions 3->5->7 for suspend
>>>> and 8->6->4 for resume like Linux currently does.
>>>>
>>>> Rather it calls 3->7->5 for suspend and 6->8->4 for resume.
>>>> Align this calling order for Linux as well.
>>>>
>>>> Link:
>>>> https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-states
>>> I didn't catch the ordering in the link.
>> Yeah it's tough to interpret from the link, because the picture at the
>> bottom
>> is missing annotations.
>>
>> Basically if you look at the picture the blue part is the screen on/off.
>>
>> The green part is "modern standby" and then the little "humps" are LPS0
>> enter/exit.
>>
>>> Was there any issue that prompted this
>>> change?
>>
>> We were debugging an unrelated problem and noticed the difference
>> comparing the
>>
>> BIOS debugging log from Windows and Linux.
>>
>> If an OEM depends on this call order in that code used in LPS0 phase
>> requires
>> changes from MS phase I could hypothesize this fixes it.
>>
>>
>>> David
>> BTW - is there interest in supporting the Microsoft _DSM GUID for Intel
>> side too?
>>
>> It's an incongruity today that we run both AMD GUID and Microsoft GUID
>> for AMD systems
>> but only run Intel GUID for Intel systems.
> There hasn't been a need yet. Rafael have you look at it?
>
> David

AFAICT from Linux side it should be a one line patch to drop:

         lps0_dsm_func_mask_microsoft = -EINVAL;

>>>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
>>>> ---
>>>>    drivers/acpi/x86/s2idle.c | 14 +++++++-------
>>>>    1 file changed, 7 insertions(+), 7 deletions(-)
>>>>
>>>> diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c
>>>> index e499c60c4579..7214197c15a0 100644
>>>> --- a/drivers/acpi/x86/s2idle.c
>>>> +++ b/drivers/acpi/x86/s2idle.c
>>>> @@ -485,11 +485,11 @@ int acpi_s2idle_prepare_late(void)
>>>>                                           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);
>>>>                   /* modern standby entry */
>>>>                   acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
>>>>                                   lps0_dsm_func_mask_microsoft,
>>>> lps0_dsm_guid_microsoft);
>>>> +               acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY,
>>>> +                               lps0_dsm_func_mask_microsoft,
>>>> lps0_dsm_guid_microsoft);
>>>>           }
>>>>    
>>>>           list_for_each_entry(handler, &lps0_s2idle_devops_head, list_node)
>>>> {
>>>> @@ -524,11 +524,6 @@ void acpi_s2idle_restore_early(void)
>>>>                   if (handler->restore)
>>>>                           handler->restore();
>>>>    
>>>> -       /* 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);
>>>> -
>>>>           /* LPS0 exit */
>>>>           if (lps0_dsm_func_mask > 0)
>>>>                   acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
>>>> @@ -539,6 +534,11 @@ void acpi_s2idle_restore_early(void)
>>>>                   acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
>>>>                                   lps0_dsm_func_mask_microsoft,
>>>> lps0_dsm_guid_microsoft);
>>>>    
>>>> +       /* 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);
>>>> +
>>>>           /* Screen on */
>>>>           if (lps0_dsm_func_mask_microsoft > 0)
>>>>                   acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON,
Rafael J. Wysocki June 5, 2023, 5:24 p.m. UTC | #4
On Fri, Jun 2, 2023 at 1:40 AM Mario Limonciello
<mario.limonciello@amd.com> wrote:
>
> In Windows the Microsoft _DSM doesn't call functions 3->5->7 for suspend
> and 8->6->4 for resume like Linux currently does.
>
> Rather it calls 3->7->5 for suspend and 6->8->4 for resume.
> Align this calling order for Linux as well.
>
> Link: https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-states
> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
> ---
>  drivers/acpi/x86/s2idle.c | 14 +++++++-------
>  1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c
> index e499c60c4579..7214197c15a0 100644
> --- a/drivers/acpi/x86/s2idle.c
> +++ b/drivers/acpi/x86/s2idle.c
> @@ -485,11 +485,11 @@ int acpi_s2idle_prepare_late(void)
>                                         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);
>                 /* modern standby entry */
>                 acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
>                                 lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
> +               acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY,
> +                               lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
>         }
>
>         list_for_each_entry(handler, &lps0_s2idle_devops_head, list_node) {
> @@ -524,11 +524,6 @@ void acpi_s2idle_restore_early(void)
>                 if (handler->restore)
>                         handler->restore();
>
> -       /* 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);
> -
>         /* LPS0 exit */
>         if (lps0_dsm_func_mask > 0)
>                 acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
> @@ -539,6 +534,11 @@ void acpi_s2idle_restore_early(void)
>                 acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
>                                 lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
>
> +       /* 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);
> +
>         /* Screen on */
>         if (lps0_dsm_func_mask_microsoft > 0)
>                 acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON,
> --

Applied as 6.5 material, thanks!
diff mbox series

Patch

diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c
index e499c60c4579..7214197c15a0 100644
--- a/drivers/acpi/x86/s2idle.c
+++ b/drivers/acpi/x86/s2idle.c
@@ -485,11 +485,11 @@  int acpi_s2idle_prepare_late(void)
 					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);
 		/* modern standby entry */
 		acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
 				lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
+		acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY,
+				lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
 	}
 
 	list_for_each_entry(handler, &lps0_s2idle_devops_head, list_node) {
@@ -524,11 +524,6 @@  void acpi_s2idle_restore_early(void)
 		if (handler->restore)
 			handler->restore();
 
-	/* 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);
-
 	/* LPS0 exit */
 	if (lps0_dsm_func_mask > 0)
 		acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
@@ -539,6 +534,11 @@  void acpi_s2idle_restore_early(void)
 		acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
 				lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
 
+	/* 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);
+
 	/* Screen on */
 	if (lps0_dsm_func_mask_microsoft > 0)
 		acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON,