5 #include "sw/device/silicon_creator/lib/drivers/rstmgr.h"
13 #include "sw/device/lib/base/multibits.h"
14 #include "sw/device/silicon_creator/lib/drivers/otp.h"
16 #ifdef OT_PLATFORM_RV32
21 #include "otp_ctrl_regs.h"
22 #include "rstmgr_regs.h"
30 abs_mmio_read32(kBase + RSTMGR_ALERT_INFO_ATTR_REG_OFFSET),
31 RSTMGR_ALERT_INFO_ATTR_CNT_AVAIL_FIELD);
32 for (uint32_t i = 0; i < info->
length; ++i) {
34 kBase + RSTMGR_ALERT_INFO_CTRL_REG_OFFSET,
36 info->
info[i] = abs_mmio_read32(kBase + RSTMGR_ALERT_INFO_REG_OFFSET);
42 abs_mmio_read32(kBase + RSTMGR_CPU_INFO_ATTR_REG_OFFSET),
43 RSTMGR_CPU_INFO_ATTR_CNT_AVAIL_FIELD);
44 for (uint32_t i = 0; i < info->
length; ++i) {
46 kBase + RSTMGR_CPU_INFO_CTRL_REG_OFFSET,
48 info->
info[i] = abs_mmio_read32(kBase + RSTMGR_CPU_INFO_REG_OFFSET);
52 uint32_t rstmgr_reason_get(
void) {
54 #define REASON_ASSERT(index, expect) \
55 static_assert((index) == (expect), #index " value incorrect.");
57 REASON_ASSERT(kRstmgrReasonPowerOn, RSTMGR_RESET_INFO_POR_BIT);
58 REASON_ASSERT(kRstmgrReasonLowPowerExit,
59 RSTMGR_RESET_INFO_LOW_POWER_EXIT_BIT);
60 REASON_ASSERT(kRstmgrReasonSysrstCtrl,
61 RSTMGR_RESET_INFO_HW_REQ_OFFSET +
62 kTopEarlgreyPowerManagerResetRequestsSysrstCtrlAonRstReq);
64 kRstmgrReasonWatchdog,
65 RSTMGR_RESET_INFO_HW_REQ_OFFSET +
66 kTopEarlgreyPowerManagerResetRequestsAonTimerAonAonTimerRstReq);
70 REASON_ASSERT(kRstmgrReasonEscalation,
71 RSTMGR_RESET_INFO_HW_REQ_OFFSET +
72 kTopEarlgreyPowerManagerResetRequestsLast + 2)
76 ((1 << (kRstmgrReasonLast - RSTMGR_RESET_INFO_HW_REQ_OFFSET + 1)) - 1) ==
77 RSTMGR_RESET_INFO_HW_REQ_MASK,
78 "kRstmgrReasonLast value incorrect.");
82 return abs_mmio_read32(kBase + RSTMGR_RESET_INFO_REG_OFFSET);
85 void rstmgr_reason_clear(uint32_t reasons) {
86 abs_mmio_write32(kBase + RSTMGR_RESET_INFO_REG_OFFSET, reasons);
89 void rstmgr_alert_info_enable(
void) {
90 abs_mmio_write32(kBase + RSTMGR_ALERT_INFO_CTRL_REG_OFFSET, 1);
93 void rstmgr_cpu_info_enable(
void) {
94 abs_mmio_write32(kBase + RSTMGR_CPU_INFO_CTRL_REG_OFFSET, 1);
97 rom_error_t rstmgr_info_en_check(uint32_t reset_reasons) {
100 kOkXorError = kErrorOk ^ kErrorRstmgrBadInit,
105 otp_read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_RSTMGR_INFO_EN_OFFSET);
120 abs_mmio_read32(kBase + RSTMGR_ALERT_INFO_CTRL_REG_OFFSET),
121 RSTMGR_ALERT_INFO_CTRL_EN_BIT)) {
122 alert_info ^= launder32(kByteTrueXorFalse);
126 abs_mmio_read32(kBase + RSTMGR_CPU_INFO_CTRL_REG_OFFSET),
127 RSTMGR_CPU_INFO_CTRL_EN_BIT)) {
128 cpu_info ^= launder32(kByteTrueXorFalse);
135 expected ^= launder32(kOkXorError);
137 uint32_t res = launder32(kErrorRstmgrBadInit);
138 bool low_power_exit =
140 if (launder32(low_power_exit)) {
145 res ^= otp ^ expected;
147 if (launder32(res) == kErrorOk) {
151 return kErrorRstmgrBadInit;
154 void rstmgr_reset(
void) {
155 abs_mmio_write32(kBase + RSTMGR_RESET_REQ_REG_OFFSET, kMultiBitBool4True);
156 #ifdef OT_PLATFORM_RV32