summaryrefslogtreecommitdiff
path: root/chip/g/system.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/g/system.c')
-rw-r--r--chip/g/system.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/chip/g/system.c b/chip/g/system.c
index ad553168c5..47b3848146 100644
--- a/chip/g/system.c
+++ b/chip/g/system.c
@@ -12,6 +12,7 @@
#include "registers.h"
#include "signed_header.h"
#include "system.h"
+#include "system_chip.h"
#include "task.h"
#include "version.h"
@@ -95,6 +96,13 @@ void system_reset(int flags)
#ifdef BOARD_CR50
/*
+ * Decrement the retry counter on manually triggered reboots. We were
+ * able to process the console command, therefore we're probably okay.
+ */
+ if (flags & SYSTEM_RESET_MANUALLY_TRIGGERED)
+ system_decrement_retry_counter();
+
+ /*
* On CR50 we want every reset be hard reset, causing the entire
* chromebook to reboot: we don't want the TPM reset while the AP
* stays up.
@@ -336,6 +344,17 @@ void system_clear_retry_counter(void)
GWRITE_FIELD(PMU, LONG_LIFE_SCRATCH_WR_EN, REG0, 0);
}
+void system_decrement_retry_counter(void)
+{
+ uint32_t val = GREG32(PMU, LONG_LIFE_SCRATCH0);
+
+ if (val != 0) {
+ GWRITE_FIELD(PMU, LONG_LIFE_SCRATCH_WR_EN, REG0, 1);
+ GREG32(PMU, LONG_LIFE_SCRATCH0) = val - 1;
+ GWRITE_FIELD(PMU, LONG_LIFE_SCRATCH_WR_EN, REG0, 0);
+ }
+}
+
/*
* Check which of the two cr50 RW images is newer, return true if the first
* image is no older than the second one.