5 #include "sw/device/silicon_creator/lib/shutdown.h"
16 #include "sw/device/lib/base/multibits.h"
18 #include "sw/device/silicon_creator/lib/chip_info.h"
19 #include "sw/device/silicon_creator/lib/drivers/alert.h"
20 #include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
21 #include "sw/device/silicon_creator/lib/drivers/otp.h"
22 #include "sw/device/silicon_creator/lib/drivers/retention_sram.h"
23 #include "sw/device/silicon_creator/lib/epmp_defs.h"
24 #include "sw/device/silicon_creator/lib/stack_utilization.h"
26 #include "alert_handler_regs.h"
27 #include "flash_ctrl_regs.h"
29 #include "keymgr_regs.h"
30 #include "lc_ctrl_regs.h"
31 #include "otp_ctrl_regs.h"
32 #include "rstmgr_regs.h"
33 #include "rv_core_ibex_regs.h"
34 #include "sram_ctrl_regs.h"
35 #include "uart_regs.h"
37 static_assert(ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT <=
38 OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ALERT_CLASSIFICATION_SIZE / 4,
39 "More alerts than alert classification OTP words!");
41 ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT <=
42 OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_LOCAL_ALERT_CLASSIFICATION_SIZE / 4,
43 "More local alerts than local alert classification OTP words!");
47 #ifndef OT_PLATFORM_RV32
54 #define SHUTDOWN_FUNC(modifiers_, name_) \
58 #define SHUTDOWN_FUNC(modifiers_, name_) \
60 static modifiers_ void name_
67 static size_t clsindex(alert_class_t cls) {
82 rom_error_t shutdown_init(lifecycle_state_t lc_state) {
93 uint32_t lc_shift_masked;
94 switch (launder32(lc_state)) {
102 lc_shift = kLcShiftProd;
105 lc_shift_masked = launder32(kLcShiftProd) ^ kLcStateProd;
107 case kLcStateProdEnd:
109 lc_shift = kLcShiftProdEnd;
110 lc_shift_masked = launder32(kLcShiftProdEnd) ^ kLcStateProdEnd;
114 lc_shift = kLcShiftDev;
115 lc_shift_masked = launder32(kLcShiftDev) ^ kLcStateDev;
119 lc_shift = kLcShiftRma;
120 lc_shift_masked = launder32(kLcShiftRma) ^ kLcStateRma;
130 rom_error_t error = kErrorOk;
131 uint32_t class_enable =
132 otp_read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ALERT_CLASS_EN_OFFSET);
133 uint32_t class_escalate =
134 otp_read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ALERT_ESCALATION_OFFSET);
135 alert_enable_t enable[ALERT_CLASSES];
136 alert_escalate_t escalate[ALERT_CLASSES];
137 for (i = 0; launder32(i) < ALERT_CLASSES; ++i) {
143 if (i != ALERT_CLASSES) {
144 error = kErrorUnknown;
149 for (i = 0; launder32(i) < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
152 otp_read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ALERT_CLASSIFICATION_OFFSET +
153 i *
sizeof(uint32_t));
156 rom_error_t e = alert_configure(i, cls, enable[clsindex(cls)]);
163 if (i != ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT) {
164 error = kErrorUnknown;
170 launder32(i) < ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
172 uint32_t value = otp_read32(
173 OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_LOCAL_ALERT_CLASSIFICATION_OFFSET +
174 i *
sizeof(uint32_t));
177 rom_error_t e = alert_local_configure(i, cls, enable[clsindex(cls)]);
184 if (i != ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT) {
185 error = kErrorUnknown;
189 if ((lc_shift_masked ^ lc_state) != lc_shift) {
190 error = kErrorUnknown;
194 const alert_class_t kClasses[] = {
201 for (i = 0; launder32(i) < ALERT_CLASSES; ++i) {
205 otp_read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ALERT_ACCUM_THRESH_OFFSET +
206 i *
sizeof(uint32_t));
208 otp_read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ALERT_TIMEOUT_CYCLES_OFFSET +
209 i *
sizeof(uint32_t));
213 OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ALERT_PHASE_CYCLES_OFFSET +
217 error = kErrorUnknown;
220 rom_error_t e = alert_class_configure(kClasses[i], &config);
227 if (i != ALERT_CLASSES) {
228 error = kErrorUnknown;
240 static uint32_t shutdown_redact_inline(rom_error_t reason,
241 shutdown_error_redact_t severity) {
242 uint32_t redacted = (uint32_t)reason;
243 if (reason == kErrorOk) {
247 case kShutdownErrorRedactModule:
250 case kShutdownErrorRedactError:
253 case kShutdownErrorRedactNone:
255 case kShutdownErrorRedactAll:
258 redacted = kErrorUnknown;
263 uint32_t shutdown_redact(rom_error_t reason, shutdown_error_redact_t severity) {
264 return shutdown_redact_inline(reason, severity);
274 static shutdown_error_redact_t shutdown_redact_policy_inline(
275 uint32_t raw_state) {
277 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED0:
278 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED1:
279 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED2:
280 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED3:
281 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED4:
282 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED5:
283 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED6:
284 case LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED7:
285 case LC_CTRL_LC_STATE_STATE_VALUE_RMA:
287 return kShutdownErrorRedactNone;
288 case LC_CTRL_LC_STATE_STATE_VALUE_DEV:
289 case LC_CTRL_LC_STATE_STATE_VALUE_PROD:
290 case LC_CTRL_LC_STATE_STATE_VALUE_PROD_END:
292 return (shutdown_error_redact_t)abs_mmio_read32(
294 OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET +
295 OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ERROR_REPORTING_OFFSET);
298 return kShutdownErrorRedactAll;
302 shutdown_error_redact_t shutdown_redact_policy(
void) {
310 LC_CTRL_LC_STATE_REG_OFFSET),
311 LC_CTRL_LC_STATE_STATE_FIELD);
312 return shutdown_redact_policy_inline(raw_state);
326 kErrorMsgLen = kHexStrLen + 6,
334 kUartFifoSize = UART_PARAM_TX_FIFO_DEPTH,
338 static void shutdown_tx_wait(
void) {
339 #ifdef OT_PLATFORM_RV32
341 static_assert(kErrorMsgLen <= kUartFifoSize,
342 "Total message length must be less than TX FIFO size.");
349 UART_STATUS_TXIDLE_BIT);
365 static void shutdown_print(shutdown_log_prefix_t prefix, uint32_t val) {
367 abs_mmio_write32(kUartBase + UART_WDATA_REG_OFFSET, prefix);
368 abs_mmio_write32(kUartBase + UART_WDATA_REG_OFFSET, prefix >> 8);
369 abs_mmio_write32(kUartBase + UART_WDATA_REG_OFFSET, prefix >> 16);
370 abs_mmio_write32(kUartBase + UART_WDATA_REG_OFFSET, prefix >> 24);
373 const char kHexTable[16] =
"0123456789abcdef";
376 for (
size_t i = 0; i < launder32(kHexStrLen); ++i) {
379 abs_mmio_write32(kUartBase + UART_WDATA_REG_OFFSET, kHexTable[nibble]);
382 abs_mmio_write32(kUartBase + UART_WDATA_REG_OFFSET,
'\r');
383 abs_mmio_write32(kUartBase + UART_WDATA_REG_OFFSET,
'\n');
387 SHUTDOWN_FUNC(NO_MODIFIERS, shutdown_report_error(rom_error_t reason)) {
390 LC_CTRL_LC_STATE_REG_OFFSET),
391 LC_CTRL_LC_STATE_STATE_FIELD);
395 shutdown_error_redact_t policy = shutdown_redact_policy_inline(raw_state);
399 uint32_t redacted_error = shutdown_redact_inline(reason, policy);
408 abs_mmio_write32(kUartBase + UART_FIFO_CTRL_REG_OFFSET,
410 uint32_t uart_ctrl_reg = abs_mmio_read32(kUartBase + UART_CTRL_REG_OFFSET);
412 abs_mmio_write32(kUartBase + UART_CTRL_REG_OFFSET, uart_ctrl_reg);
416 shutdown_print(kShutdownLogPrefixBootFault, redacted_error);
417 shutdown_print(kShutdownLogPrefixLifecycle, raw_state);
418 shutdown_print(kShutdownLogPrefixVersion,
422 SHUTDOWN_FUNC(NO_MODIFIERS, shutdown_software_escalate(
void)) {
426 abs_mmio_write32(kBase + RV_CORE_IBEX_SW_FATAL_ERR_REG_OFFSET, 0);
429 SHUTDOWN_FUNC(NO_MODIFIERS, shutdown_keymgr_kill(
void)) {
435 KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE);
437 KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_DISABLE);
438 abs_mmio_write32_shadowed(kBase + KEYMGR_CONTROL_SHADOWED_REG_OFFSET, reg);
440 abs_mmio_write32(kBase + KEYMGR_START_REG_OFFSET, 1);
441 abs_mmio_write32(kBase + KEYMGR_SIDELOAD_CLEAR_REG_OFFSET, 1);
444 SHUTDOWN_FUNC(NO_MODIFIERS, shutdown_reset(
void)) {
446 abs_mmio_write32(kBase + RSTMGR_RESET_REQ_REG_OFFSET, kMultiBitBool4True);
449 SHUTDOWN_FUNC(NO_MODIFIERS, shutdown_flash_kill(
void)) {
452 abs_mmio_write32(kBase + FLASH_CTRL_DIS_REG_OFFSET, 0);
455 SHUTDOWN_FUNC(noreturn, shutdown_hang(
void)) {
466 abs_mmio_write32(kSramCtrlBase + SRAM_CTRL_EXEC_EN_OFFSET, 0);
467 abs_mmio_write32(kSramCtrlBase + SRAM_CTRL_EXEC_REGWEN_REG_OFFSET, 0);
470 #ifdef OT_PLATFORM_RV32
472 ".L_shutdown_hang_asm_start:"
474 "sw %[kSramRenewKey], %[kSramCtrlCtrlReg](%[kSramCtrlBase]);"
476 "sw %[kMultiBitBool4True], %[kRstmgrResetReqReg](%[kRstmgrBase]);"
483 "la t0, .L_shutdown_hang_asm_start;"
486 "la t0, .L_shutdown_hang_asm_end;"
489 "csrw pmpaddr2, %[kNapotEntireAddressSpace];"
490 "csrw pmpcfg0, %[kPmpCfg0];"
491 "csrw pmpcfg1, zero;"
492 "csrw pmpcfg2, zero;"
493 "csrw pmpcfg3, zero;"
494 "csrw %[kMSecCfgReg], %[kMSecCfgVal];"
497 "wfi; wfi; wfi; wfi; j .L_shutdown_hang_asm_start;"
498 "wfi; wfi; j .L_shutdown_hang_asm_start;"
499 "wfi; j .L_shutdown_hang_asm_start;"
500 ".L_shutdown_hang_asm_end:"
502 : [kSramRenewKey]
"r"(1 << SRAM_CTRL_CTRL_RENEW_SCR_KEY_BIT),
503 [kSramCtrlCtrlReg]
"I"(SRAM_CTRL_CTRL_REG_OFFSET),
504 [kSramCtrlBase]
"r"(kSramCtrlBase),
505 [kMultiBitBool4True]
"r"(kMultiBitBool4True),
506 [kRstmgrResetReqReg]
"I"(RSTMGR_RESET_REQ_REG_OFFSET),
507 [kRstmgrBase]
"r"(kRstmgrBase),
508 [kNapotEntireAddressSpace]
"r"(0x7fffffff),
509 [kPmpCfg0]
"r"((EPMP_CFG_A_TOR | EPMP_CFG_LRX) << 8 |
510 (EPMP_CFG_A_NAPOT | EPMP_CFG_L) << 16),
511 [kMSecCfgReg]
"I"(EPMP_MSECCFG), [kMSecCfgVal]
"r"(EPMP_MSECCFG_MMWP));
516 #ifdef OT_PLATFORM_RV32
521 __attribute__((section(
".shutdown")))
523 void shutdown_finalize(rom_error_t reason) {
524 shutdown_report_error(reason);
526 stack_utilization_print();
527 shutdown_software_escalate();
528 shutdown_keymgr_kill();
531 shutdown_flash_kill();