diff options
author | Scott Collyer <scollyer@google.com> | 2017-08-21 09:02:48 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-11-15 16:07:26 -0800 |
commit | 071142fe688c05ef1ffd54057409995f12504c1d (patch) | |
tree | 7e59643f583ac231ec1dfd7f93e6b85d8235b331 | |
parent | 6c92b0fcd08d00134f66d879d75a55d1cede5822 (diff) | |
download | chrome-ec-071142fe688c05ef1ffd54057409995f12504c1d.tar.gz |
system: Add wait-ext option to ec reboot command
EC_IN_RW signal is used to determine if the switch to dev mode can be
safely made. However, EC_IN_RW needs the EC_RST_L line driven low in
order to be reset. In faft tests that utilize crosEcSoftrecPower
method, EC_RST_L is not being driven by servo to fix other test
failures related to keeping EC and AC reboots in sync.
This CL adds a new argument 'wait-ext' to the EC reboot command.
When this option is used, instead of the EC generating a reset via
it's system watchdog, it will wait 10 seconds for EC_RST_L to be
driven.
BUG=b:64603944
BRANCH=coral
CQ-DEPEND=I086687c3dd7591460099267880d56ab8265d2e4b
TEST=Ran "/usr/bin/test_that --board=coral <ip addr> firmware_DevMode"
mutliple times and verified that it passes. Previoulsy, this test
always fails when the EC is in RW before it starts. Also tested
platform_ServoPowerStateController_USBPluggedin and verified it passed.
Change-Id: I614f9156066d5719601ee43e29c7a064f9bba6e2
Signed-off-by: Scott Collyer <scollyer@google.com>
Reviewed-on: https://chromium-review.googlesource.com/737524
Commit-Ready: Scott Collyer <scollyer@chromium.org>
Tested-by: Scott Collyer <scollyer@chromium.org>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r-- | chip/npcx/system.c | 29 | ||||
-rw-r--r-- | common/system.c | 28 | ||||
-rw-r--r-- | include/system.h | 12 |
3 files changed, 53 insertions, 16 deletions
diff --git a/chip/npcx/system.c b/chip/npcx/system.c index 51c7c6e74a..96879b40e4 100644 --- a/chip/npcx/system.c +++ b/chip/npcx/system.c @@ -21,6 +21,7 @@ #include "task.h" #include "timer.h" #include "util.h" +#include "watchdog.h" /* Delay after writing TTC for value to latch */ #define MTC_TTC_LOAD_DELAY_US 250 @@ -702,28 +703,28 @@ void system_pre_init(void) void system_reset(int flags) { - uint32_t save_flags = 0; + uint32_t save_flags; /* Disable interrupts to avoid task swaps during reboot */ interrupt_disable(); - /* Save current reset reasons if necessary */ - if (flags & SYSTEM_RESET_PRESERVE_FLAGS) - save_flags = system_get_reset_flags() | RESET_FLAG_PRESERVED; - - /* Add in AP off flag into saved flags. */ - if (flags & SYSTEM_RESET_LEAVE_AP_OFF) - save_flags |= RESET_FLAG_AP_OFF; - - /* Save reset flag */ - if (flags & SYSTEM_RESET_HARD) - save_flags |= RESET_FLAG_HARD; - else - save_flags |= RESET_FLAG_SOFT; + /* Get flags to be saved in BBRAM */ + system_encode_save_flags(flags, &save_flags); /* Store flags to battery backed RAM. */ chip_save_reset_flags(save_flags); + /* If WAIT_EXT is set, then allow 10 seconds for external reset */ + if (flags & SYSTEM_RESET_WAIT_EXT) { + int i; + + /* Wait 10 seconds for external reset */ + for (i = 0; i < 1000; i++) { + watchdog_reload(); + udelay(10000); + } + } + /* Ask the watchdog to trigger a hard reboot */ system_watchdog_reset(); diff --git a/common/system.c b/common/system.c index 741cec71f1..928fb1d21a 100644 --- a/common/system.c +++ b/common/system.c @@ -226,6 +226,25 @@ test_mockable uintptr_t system_usable_ram_end(void) return (uintptr_t)jdata - jdata->jump_tag_total; } +void system_encode_save_flags(int reset_flags, uint32_t *save_flags) +{ + *save_flags = 0; + + /* Save current reset reasons if necessary */ + if (reset_flags & SYSTEM_RESET_PRESERVE_FLAGS) + *save_flags = system_get_reset_flags() | RESET_FLAG_PRESERVED; + + /* Add in AP off flag into saved flags. */ + if (reset_flags & SYSTEM_RESET_LEAVE_AP_OFF) + *save_flags |= RESET_FLAG_AP_OFF; + + /* Save reset flag */ + if (reset_flags & (SYSTEM_RESET_HARD | SYSTEM_RESET_WAIT_EXT)) + *save_flags |= RESET_FLAG_HARD; + else + *save_flags |= RESET_FLAG_SOFT; +} + uint32_t system_get_reset_flags(void) { return reset_flags; @@ -1135,20 +1154,25 @@ static int command_reboot(int argc, char **argv) return EC_SUCCESS; } else if (!strcasecmp(argv[i], "preserve")) { flags |= SYSTEM_RESET_PRESERVE_FLAGS; + } else if (!strcasecmp(argv[i], "wait-ext")) { + flags |= SYSTEM_RESET_WAIT_EXT; } else return EC_ERROR_PARAM1 + i - 1; } if (flags & SYSTEM_RESET_HARD) ccputs("Hard-"); - ccputs("Rebooting!\n\n\n"); + if (flags & SYSTEM_RESET_WAIT_EXT) + ccputs("Waiting for ext reset!\n\n\n"); + else + ccputs("Rebooting!\n\n\n"); cflush(); system_reset(flags); return EC_SUCCESS; } DECLARE_CONSOLE_COMMAND(reboot, command_reboot, - "[hard|soft] [preserve] [ap-off] [cancel]", + "[hard|soft] [preserve] [ap-off] [wait-ext] [cancel]", "Reboot the EC"); #ifdef CONFIG_CMD_SYSLOCK diff --git a/include/system.h b/include/system.h index 5587446ff9..f0f934ccf4 100644 --- a/include/system.h +++ b/include/system.h @@ -68,6 +68,14 @@ void system_pre_init(void); void system_common_pre_init(void); /** + * Set up flags that should be saved to battery backed RAM. + * + * @param reset_flags - flags passed into system_reset + * @param *save_flags - flags to be saved in battery backed RAM + */ +void system_encode_save_flags(int reset_flags, uint32_t *save_flags); + +/** * Get the reset flags. * * @return Reset flags (RESET_FLAG_*), or 0 if the cause is unknown. @@ -261,6 +269,10 @@ const char *system_get_build_info(void); * Indicate that this was a manually triggered reset. */ #define SYSTEM_RESET_MANUALLY_TRIGGERED (1 << 3) +/* + * Wait for reset pin to be driven, rather that resetting ourselves. + */ +#define SYSTEM_RESET_WAIT_EXT (1 << 4) /** * Reset the system. |