Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

platform/chrome: cros_ec: Expose suspend_timeout_ms in debugfs

In modern Chromebooks, the embedded controller has a mechanism where
it will watch a hardware-controlled line that toggles in suspend, and
wake the system up if an expected sleep transition didn't occur. This
can be very useful for detecting power management issues where the
system appears to suspend, but doesn't actually reach its lowest
expected power states.

Sometimes it's useful in debug and test scenarios to be able to control
the duration of that timeout, or even disable the EC timeout mechanism
altogether. Add a debugfs control to set the timeout to values other
than the EC-defined default, for more convenient debug and
development iteration.

Signed-off-by: Evan Green <evgreen@chromium.org>
Reviewed-by: Prashant Malani <pmalani@chromium.org>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Reviewed-by: Guenter Roeck <groeck@chromium.org>
Link: https://lore.kernel.org/r/20220822144026.v3.1.Idd188ff3f9caddebc17ac357a13005f93333c21f@changeid
[tzungbi: fix one nit in Documentation/ABI/testing/debugfs-cros-ec.]
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>

authored by

Evan Green and committed by
Tzung-Bi Shih
e8bf17d5 8a07b45f

+28 -1
+22
Documentation/ABI/testing/debugfs-cros-ec
··· 54 54 this feature. 55 55 56 56 Output will be in the format: "0x%08x\n". 57 + 58 + What: /sys/kernel/debug/<cros-ec-device>/suspend_timeout_ms 59 + Date: August 2022 60 + KernelVersion: 6.1 61 + Description: 62 + Some ECs have a feature where they will track transitions of 63 + a hardware-controlled sleep line, such as Intel's SLP_S0 line, 64 + in order to detect cases where a system failed to go into deep 65 + sleep states. The suspend_timeout_ms file controls the amount of 66 + time in milliseconds the EC will wait before declaring a sleep 67 + timeout event and attempting to wake the system. 68 + 69 + Supply 0 to use the default value coded into EC firmware. Supply 70 + 65535 (EC_HOST_SLEEP_TIMEOUT_INFINITE) to disable the EC sleep 71 + failure detection mechanism. Values in between 0 and 65535 72 + indicate the number of milliseconds the EC should wait after a 73 + sleep transition before declaring a timeout. This includes both 74 + the duration after a sleep command was received but before the 75 + hardware line changed, as well as the duration between when the 76 + hardware line changed and the kernel sent an EC resume command. 77 + 78 + Output will be in the format: "%u\n".
+2 -1
drivers/platform/chrome/cros_ec.c
··· 115 115 if (ec_dev->host_sleep_v1) { 116 116 buf.u.req1.sleep_event = sleep_event; 117 117 buf.u.req1.suspend_params.sleep_timeout_ms = 118 - EC_HOST_SLEEP_TIMEOUT_DEFAULT; 118 + ec_dev->suspend_timeout_ms; 119 119 120 120 buf.msg.outsize = sizeof(buf.u.req1); 121 121 if ((sleep_event == HOST_SLEEP_EVENT_S3_RESUME) || ··· 188 188 ec_dev->max_passthru = 0; 189 189 ec_dev->ec = NULL; 190 190 ec_dev->pd = NULL; 191 + ec_dev->suspend_timeout_ms = EC_HOST_SLEEP_TIMEOUT_DEFAULT; 191 192 192 193 ec_dev->din = devm_kzalloc(dev, ec_dev->din_size, GFP_KERNEL); 193 194 if (!ec_dev->din)
+3
drivers/platform/chrome/cros_ec_debugfs.c
··· 470 470 debugfs_create_x32("last_resume_result", 0444, debug_info->dir, 471 471 &ec->ec_dev->last_resume_result); 472 472 473 + debugfs_create_u16("suspend_timeout_ms", 0664, debug_info->dir, 474 + &ec->ec_dev->suspend_timeout_ms); 475 + 473 476 ec->debug_info = debug_info; 474 477 475 478 dev_set_drvdata(&pd->dev, ec);
+1
include/linux/platform_data/cros_ec_proto.h
··· 169 169 int event_size; 170 170 u32 host_event_wake_mask; 171 171 u32 last_resume_result; 172 + u16 suspend_timeout_ms; 172 173 ktime_t last_event_time; 173 174 struct notifier_block notifier_ready; 174 175