From 4e4c7b4ac27b2f6128b817573ba21cf5ccb78870 Mon Sep 17 00:00:00 2001 From: "Guilherme G. Piccoli" Date: Thu, 2 Nov 2023 16:28:35 -0300 Subject: (NOT-FOR-UPSTREAM) PM: suspend: Disable s2idle on Steam Deck Jupiter platform doesn't support s2idle - system appears to sleep and never wakeup again. So, disable it based on DMI checking for platforms named "Valve Jupiter". Signed-off-by: Guilherme G. Piccoli (cherry picked from commit 3956de585667cfd9f91a3ee8af34f6c0d44f4381) --- kernel/power/suspend.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index fa3bf161d13f..e614b865a099 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "power.h" @@ -60,6 +61,7 @@ static DECLARE_SWAIT_QUEUE_HEAD(s2idle_wait_head); enum s2idle_states __read_mostly s2idle_state; static DEFINE_RAW_SPINLOCK(s2idle_lock); +static bool s2idle_unsupported; /** * pm_suspend_default_s2idle - Check if suspend-to-idle is the default suspend. @@ -174,6 +176,8 @@ static bool valid_state(suspend_state_t state) void __init pm_states_init(void) { + const char *sys_vendor, *product_name; + /* "mem" and "freeze" are always present in /sys/power/state. */ pm_states[PM_SUSPEND_MEM] = pm_labels[PM_SUSPEND_MEM]; pm_states[PM_SUSPEND_TO_IDLE] = pm_labels[PM_SUSPEND_TO_IDLE]; @@ -182,6 +186,20 @@ void __init pm_states_init(void) * initialize mem_sleep_states[] accordingly here. */ mem_sleep_states[PM_SUSPEND_TO_IDLE] = mem_sleep_labels[PM_SUSPEND_TO_IDLE]; + + /* + * Identify here if we're running on Steam Deck - if so, we shouldn't + * support s2idle mem_sleep mode, since this mode doesn't work on Deck. + */ + + sys_vendor = dmi_get_system_info(DMI_SYS_VENDOR); + product_name = dmi_get_system_info(DMI_PRODUCT_NAME); + + if (sys_vendor && (!strncmp("Valve", sys_vendor, 5)) && + product_name && (!strncmp("Jupiter", product_name, 7))) { + s2idle_unsupported = true; + pr_info("Steam Deck quirk - no s2idle allowed!\n"); + } } static int __init mem_sleep_default_setup(char *str) @@ -562,6 +580,10 @@ static int enter_state(suspend_state_t state) return -EAGAIN; } #endif + if (s2idle_unsupported) { + pr_info("s2idle sleep is not supported\n"); + return -EINVAL; + } } else if (!valid_state(state)) { return -EINVAL; } -- cgit 1.4.1