diff options
author | Jonathan Brandmeyer <jbrandmeyer@chromium.org> | 2018-07-16 15:02:22 -0600 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-07-26 04:07:41 -0700 |
commit | dda2f778befed39e449d96b471b94d489ed23d60 (patch) | |
tree | fc0db938c092a609fbf47e9758d8f0113e5b0cce /power/mt8183.c | |
parent | 48113728b689870e6aeda6534d36eeffd3b738b3 (diff) | |
download | chrome-ec-dda2f778befed39e449d96b471b94d489ed23d60.tar.gz |
reset: Log the reason for AP resets.
Provides a new EC host command 'uptime info' which gathers up some
information which may be useful for debugging spurious resets on the AP
(was the EC reset recently? Why was the EC reset? If the EC reset the
AP, why did it do so?, etc.). Provide ectool support for the same.
Example results of `ectool uptimeinfo`:
```
localhost ~ # ectool uptimeinfo
EC uptime: 475.368 seconds
AP resets since EC boot: 2
Most recent AP reset causes:
315.903: reset: console command
363.507: reset: keyboard warm reboot
EC reset flags at last EC boot: reset-pin | sysjump
```
BRANCH=none
TEST=Perform some `apreset` commands from the EC console and observe
their side-effects via the `ectool uptimeinfo` command on the AP side.
Test sequences include no-resets through 5 resets, observing that the
ring buffer handling was correct.
BUG=b:110788201, b:79529789
Signed-off-by: Jonathan Brandmeyer <jbrandmeyer@chromium.org>
Change-Id: I0bf29d69de471c64f905ee8aa070b15b4f34f2ba
Reviewed-on: https://chromium-review.googlesource.com/1139028
Commit-Ready: Jonathan Brandmeyer <jbrandmeyer@chromium.org>
Tested-by: Jonathan Brandmeyer <jbrandmeyer@chromium.org>
Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'power/mt8183.c')
-rw-r--r-- | power/mt8183.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/power/mt8183.c b/power/mt8183.c index 7e8d5ba57b..13a76532a2 100644 --- a/power/mt8183.c +++ b/power/mt8183.c @@ -89,9 +89,10 @@ static const struct power_seq_op s3s5_power_seq[] = { static int forcing_shutdown; -void chipset_force_shutdown(void) +void chipset_force_shutdown(enum chipset_shutdown_reason reason) { - CPRINTS("%s()", __func__); + CPRINTS("%s(%d)", __func__, reason); + report_ap_reset(reason); /* * Force power off. This condition will reset once the state machine @@ -100,12 +101,18 @@ void chipset_force_shutdown(void) forcing_shutdown = 1; task_wake(TASK_ID_CHIPSET); } -DECLARE_DEFERRED(chipset_force_shutdown); + +void chipset_force_shutdown_button(void) +{ + chipset_force_shutdown(CHIPSET_SHUTDOWN_BUTTON); +} +DECLARE_DEFERRED(chipset_force_shutdown_button); /* If chipset needs to be reset, EC also reboots to RO. */ -void chipset_reset(void) +void chipset_reset(enum chipset_reset_reason reason) { - CPRINTS("%s", __func__); + CPRINTS("%s: %d", __func__, reason); + report_ap_reset(reason); cflush(); system_reset(SYSTEM_RESET_HARD); @@ -214,7 +221,7 @@ enum power_state power_handle_state(enum power_state state) * after debounce (32 ms), minus PMIC_EN_PULSE_MS above. * It would be good to avoid another _EN pulse above. */ - chipset_reset(); + chipset_reset(CHIPSET_RESET_INIT); } /* Wait for PMIC to bring up rails. */ @@ -238,7 +245,7 @@ enum power_state power_handle_state(enum power_state state) power_seq_run(s3s0_power_seq, ARRAY_SIZE(s3s0_power_seq)); if (power_wait_signals(IN_PGOOD_S0)) { - chipset_force_shutdown(); + chipset_force_shutdown(CHIPSET_SHUTDOWN_WAIT); return POWER_S0S3; } @@ -277,7 +284,8 @@ enum power_state power_handle_state(enum power_state state) */ if (power_button_is_pressed()) { forcing_shutdown = 1; - hook_call_deferred(&chipset_force_shutdown_data, -1); + hook_call_deferred(&chipset_force_shutdown_button_data, + -1); } return POWER_S3; @@ -306,11 +314,11 @@ static void power_button_changed(void) chipset_exit_hard_off(); /* Delayed power down from S0/S3, cancel on PB release */ - hook_call_deferred(&chipset_force_shutdown_data, + hook_call_deferred(&chipset_force_shutdown_button_data, FORCED_SHUTDOWN_DELAY); } else { /* Power button released, cancel deferred shutdown */ - hook_call_deferred(&chipset_force_shutdown_data, -1); + hook_call_deferred(&chipset_force_shutdown_button_data, -1); } } DECLARE_HOOK(HOOK_POWER_BUTTON_CHANGE, power_button_changed, HOOK_PRIO_DEFAULT); |