On 11/26/2023 17:05, Luke D. Jones wrote:
ASUS have worked around an issue in XInput where it doesn't support USB
selective suspend, which causes suspend issues in Windows. They worked
around this by adjusting the MCU firmware to disable the USB0 hub when
the screen is switched off during the Microsoft DSM suspend path in ACPI.
The issue we have with this however is one of timing - the call the tells
the MCU to this isn't able to complete before suspend is done so we call
this in a prepare() and add a small msleep() to ensure it is done. This
must be done before the screen is switched off to prevent a variety of
possible races.
Right now the way that Linux handles the LPS0 calls is that they're all back to back. Luke did try to inject a delay after the LPS0 calls were done but before it went to sleep but this wasn't sufficient.
Another "potential" way to solve this problem from Linux may be to actually glue the LPS0 screen off call to when DRM actually has eDP turned off.
Making such a change would essentially push back the "screen off" LPS0 command to when the user has run 'systemctl suspend' (or an action that did this) because the compositor usually turns it off with DPMS at this time.
Do you mean add the TODO to a line in this patch?
This is a much bigger change though and *much more ripe for breakage*.
So I think in may be worth leaving a TODO comment to look into doing that in the future.
If that ever happens; it's possible that this change could be reverted too.
Further to this the MCU powersave option must also be disabled as it can
cause a number of issues such as:
- unreliable resume connection of N-Key
- complete loss of N-Key if the power is plugged in while suspended
Disabling the powersave option prevents this.
Without this the MCU is unable to initialise itself correctly on resume.
initialize
Signed-off-by: Luke D. Jones <luke@xxxxxxxxxx>
I think it would be good to add a Closes: tag to the AMD Gitlab issue that this was discussed within as well as any other public references you know about.
Additionally as Phoenix APU support goes back as far as kernel 6.1 and this is well contained to only run on the ROG I suggest to CC stable so that people can use the ROG on that LTS kernel or later.
---
-SNIP-
@@ -4701,6 +4749,8 @@ static const struct dev_pm_ops asus_pm_ops = {
.thaw = asus_hotk_thaw,
.restore = asus_hotk_restore,
.resume = asus_hotk_resume,
+ .resume_early = asus_hotk_resume_early,
+ .prepare = asus_hotk_prepare,
Have you experimented with only using the prepare() call or only the resume_early() call? Are both really needed?
};
/* Registration ***************************************************************/
diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h
index 63e630276499..ab1c7deff118 100644
--- a/include/linux/platform_data/x86/asus-wmi.h
+++ b/include/linux/platform_data/x86/asus-wmi.h
@@ -114,6 +114,9 @@
/* Charging mode - 1=Barrel, 2=USB */
#define ASUS_WMI_DEVID_CHARGE_MODE 0x0012006C
+/* MCU powersave mode */
+#define ASUS_WMI_DEVID_MCU_POWERSAVE 0x001200E2
+
/* epu is connected? 1 == true */
#define ASUS_WMI_DEVID_EGPU_CONNECTED 0x00090018
/* egpu on/off */