diff options
Diffstat (limited to 'chip/g/system.c')
-rw-r--r-- | chip/g/system.c | 19 |
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. |