static void check_reset_cause(void) { uint32_t status = MEC1322_VBAT_STS; uint32_t flags = 0; uint32_t rst_sts = MEC1322_PCR_CHIP_PWR_RST & (MEC1322_PWR_RST_STS_VCC1 | MEC1322_PWR_RST_STS_VBAT); /* Clear the reset causes now that we've read them */ MEC1322_VBAT_STS |= status; MEC1322_PCR_CHIP_PWR_RST |= rst_sts; /* * BIT[6] determine VCC1 reset */ if (rst_sts & MEC1322_PWR_RST_STS_VCC1) flags |= RESET_FLAG_RESET_PIN; flags |= MEC1322_VBAT_RAM(HIBDATA_INDEX_SAVED_RESET_FLAGS); MEC1322_VBAT_RAM(HIBDATA_INDEX_SAVED_RESET_FLAGS) = 0; if ((status & MEC1322_VBAT_STS_WDT) && !(flags & (RESET_FLAG_SOFT | RESET_FLAG_HARD | RESET_FLAG_HIBERNATE))) flags |= RESET_FLAG_WATCHDOG; system_set_reset_flags(flags); }
void _system_reset(int flags, int wake_from_hibernate) { uint32_t save_flags = 0; /* 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; if (flags & SYSTEM_RESET_LEAVE_AP_OFF) save_flags |= RESET_FLAG_AP_OFF; if (wake_from_hibernate) save_flags |= RESET_FLAG_HIBERNATE; else if (flags & SYSTEM_RESET_HARD) save_flags |= RESET_FLAG_HARD; else save_flags |= RESET_FLAG_SOFT; MEC1322_VBAT_RAM(HIBDATA_INDEX_SAVED_RESET_FLAGS) = save_flags; /* Trigger watchdog in 1ms */ MEC1322_WDG_LOAD = 1; MEC1322_WDG_CTL |= 1; /* Spin and wait for reboot; should never return */ while (1) ; }
static void check_reset_cause(void) { uint32_t status = MEC1322_VBAT_STS; uint32_t flags = 0; /* Clear the reset causes now that we've read them */ MEC1322_VBAT_STS |= status; if (status & (1 << 7) || check_vcc1_por()) flags |= RESET_FLAG_POWER_ON; flags |= MEC1322_VBAT_RAM(HIBDATA_INDEX_SAVED_RESET_FLAGS); MEC1322_VBAT_RAM(HIBDATA_INDEX_SAVED_RESET_FLAGS) = 0; if (status & (1 << 5) && !(flags & (RESET_FLAG_SOFT | RESET_FLAG_HARD | RESET_FLAG_HIBERNATE))) flags |= RESET_FLAG_WATCHDOG; system_set_reset_flags(flags); }
void chip_save_reset_flags(int flags) { MEC1322_VBAT_RAM(HIBDATA_INDEX_SAVED_RESET_FLAGS) = flags; }
void system_set_image_copy(enum system_image_copy_t copy) { MEC1322_VBAT_RAM(MEC1322_IMAGETYPE_IDX) = (copy == SYSTEM_IMAGE_RW) ? SYSTEM_IMAGE_RW : SYSTEM_IMAGE_RO; }
enum system_image_copy_t system_get_shrspi_image_copy(void) { return MEC1322_VBAT_RAM(MEC1322_IMAGETYPE_IDX); }
uint32_t system_get_scratchpad(void) { return MEC1322_VBAT_RAM(HIBDATA_INDEX_SCRATCHPAD); }
int system_set_scratchpad(uint32_t value) { MEC1322_VBAT_RAM(HIBDATA_INDEX_SCRATCHPAD) = value; return EC_SUCCESS; }