summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Collyer <scollyer@google.com>2017-08-21 09:02:48 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-11-15 16:07:26 -0800
commit071142fe688c05ef1ffd54057409995f12504c1d (patch)
tree7e59643f583ac231ec1dfd7f93e6b85d8235b331
parent6c92b0fcd08d00134f66d879d75a55d1cede5822 (diff)
downloadchrome-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.c29
-rw-r--r--common/system.c28
-rw-r--r--include/system.h12
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.