30 #if defined(OPENTITAN_IS_EARLGREY)
31 #include "dt/dt_adc_ctrl.h"
32 #include "dt/dt_entropy_src.h"
33 #include "dt/dt_flash_ctrl.h"
34 #include "dt/dt_keymgr.h"
35 #include "dt/dt_pattgen.h"
36 #include "dt/dt_pwm.h"
37 #include "dt/dt_sensor_ctrl.h"
38 #include "dt/dt_sysrst_ctrl.h"
39 #include "dt/dt_usbdev.h"
42 #include "flash_ctrl_regs.h"
43 #elif defined(OPENTITAN_IS_DARJEELING)
44 #include "dt/dt_keymgr_dpe.h"
46 #error "all_escalation_resets_test does not support this top"
49 #include "dt/dt_aes.h"
50 #include "dt/dt_alert_handler.h"
51 #include "dt/dt_aon_timer.h"
52 #include "dt/dt_api.h"
53 #include "dt/dt_clkmgr.h"
54 #include "dt/dt_csrng.h"
55 #include "dt/dt_edn.h"
56 #include "dt/dt_gpio.h"
57 #include "dt/dt_hmac.h"
58 #include "dt/dt_i2c.h"
59 #include "dt/dt_kmac.h"
60 #include "dt/dt_lc_ctrl.h"
61 #include "dt/dt_otbn.h"
62 #include "dt/dt_otp_ctrl.h"
63 #include "dt/dt_pinmux.h"
64 #include "dt/dt_pwrmgr.h"
65 #include "dt/dt_rom_ctrl.h"
66 #include "dt/dt_rstmgr.h"
67 #include "dt/dt_rv_core_ibex.h"
68 #include "dt/dt_rv_dm.h"
69 #include "dt/dt_rv_plic.h"
70 #include "dt/dt_rv_timer.h"
71 #include "dt/dt_spi_device.h"
72 #include "dt/dt_spi_host.h"
73 #include "dt/dt_sram_ctrl.h"
88 #include "sw/device/lib/dif/dif_rv_core_ibex.h"
92 #include "sw/device/lib/runtime/irq.h"
94 #include "sw/device/lib/testing/alert_handler_testutils.h"
95 #include "sw/device/lib/testing/aon_timer_testutils.h"
96 #include "sw/device/lib/testing/rand_testutils.h"
97 #include "sw/device/lib/testing/ret_sram_testutils.h"
98 #include "sw/device/lib/testing/rstmgr_testutils.h"
99 #include "sw/device/lib/testing/rv_plic_testutils.h"
100 #include "sw/device/lib/testing/test_framework/FreeRTOSConfig.h"
101 #include "sw/device/lib/testing/test_framework/check.h"
104 #include "alert_handler_regs.h"
106 OTTF_DEFINE_TEST_CONFIG();
109 static volatile const uint8_t kExpectedAlertNumber = 0;
112 static volatile bool load_access_exception_seen =
false;
115 static volatile bool alert_irq_seen =
false;
118 typedef void (*FaultCheckerFunction)(bool,
const char *inst,
const char *type);
121 FaultCheckerFunction
function;
136 static volatile uint32_t reset_count;
160 kEscalationPhase0Micros = 200,
162 kEscalationPhase1Micros = 200,
164 kEscalationPhase2Micros = 200,
166 kEscalationPhase3Micros = 200,
171 kWdogBarkMicros = 450,
172 kWdogBiteMicros = 500,
179 kWdogBarkMicros < kWdogBiteMicros &&
180 kWdogBarkMicros > (kEscalationPhase0Micros + kEscalationPhase1Micros),
181 "The wdog bite shall after the NMI phase when lc_escalate_en is asserted");
186 static uint32_t kSramRetStart;
192 #if defined(OPENTITAN_IS_EARLGREY)
194 dt_flash_ctrl_t kFlashCtrlDt = (dt_flash_ctrl_t)0;
195 static_assert(kDtFlashCtrlCount >= 1,
"This test requires a Flash Ctrl");
196 static dif_rom_ctrl_t rom_ctrl;
197 static dt_rom_ctrl_t kRomCtrlDt = (dt_rom_ctrl_t)0;
198 static_assert(kDtRomCtrlCount >= 1,
"This test requires a ROM CTRL");
200 static const char *flash_fatal_check =
"flash_fatal_check";
201 #elif defined(OPENTITAN_IS_DARJEELING)
202 static dif_sram_ctrl_t sram_ctrl_mbox;
203 static dt_sram_ctrl_t kSramCtrlMboxDt = kDtSramCtrlMbox;
204 static dif_rom_ctrl_t rom_ctrl0;
205 static dif_rom_ctrl_t rom_ctrl1;
206 static dt_rom_ctrl_t kRomCtrl0Dt = kDtRomCtrl0;
207 static dt_rom_ctrl_t kRomCtrl1Dt = kDtRomCtrl1;
209 #error "all_escalation_resets_test does not support this top"
213 static const uint32_t kPlicTarget = 0;
215 static dif_aes_t aes;
216 static dif_alert_handler_t alert_handler;
217 static dif_aon_timer_t aon_timer;
218 static dif_clkmgr_t clkmgr;
219 static dif_kmac_t kmac;
220 static dif_lc_ctrl_t lc_ctrl;
221 static dif_otp_ctrl_t otp_ctrl;
222 static dif_pwrmgr_t pwrmgr;
223 static dif_rstmgr_t rstmgr;
224 static dif_rv_core_ibex_t rv_core_ibex;
225 static dif_rv_plic_t plic;
226 static dif_sram_ctrl_t sram_ctrl_main;
227 static dif_sram_ctrl_t sram_ctrl_ret;
229 static dt_aes_t kAesDt = (dt_aes_t)0;
230 static_assert(kDtAesCount >= 1,
"This test requires an AES");
231 static dt_alert_handler_t kAlertHandlerDt = (dt_alert_handler_t)0;
232 static_assert(kDtAlertHandlerCount >= 1,
"This test needs an Alert Handler");
233 static dt_aon_timer_t kAonTimerDt = kDtAonTimerAon;
234 static dt_clkmgr_t kClkmgrDt = kDtClkmgrAon;
235 static dt_kmac_t kKmacDt = (dt_kmac_t)0;
236 static_assert(kDtKmacCount >= 1,
"This test requires a KMAC instance");
237 static dt_lc_ctrl_t kLcCtrlDt = (dt_lc_ctrl_t)0;
238 static_assert(kDtLcCtrlCount >= 1,
"This test requries a LC CTRL");
239 static dt_otp_ctrl_t kOtpCtrlDt = (dt_otp_ctrl_t)0;
240 static_assert(kDtOtpCtrlCount >= 1,
"This test requires an OTP CTRL");
241 static dt_pwrmgr_t kPwrmgrDt = kDtPwrmgrAon;
242 static dt_rstmgr_t kRstmgrDt = kDtRstmgrAon;
243 static dt_rv_core_ibex_t kRvCoreIbexDt = (dt_rv_core_ibex_t)0;
244 static_assert(kDtRvCoreIbexCount >= 1,
"This test requires an Ibex core");
245 static dt_rv_plic_t kRvPlicDt = (dt_rv_plic_t)0;
246 static_assert(kDtRvPlicCount >= 1,
"This test requries an RV PLIC instance");
247 static dt_sram_ctrl_t kSramCtrlMainDt = kDtSramCtrlMain;
248 static dt_sram_ctrl_t kSramCtrlRetAonDt = kDtSramCtrlRetAon;
250 static const char *sparse_fsm_check =
"prim_sparse_fsm_flop";
251 static const char *we_check =
"prim_reg_we_check";
252 static const char *rst_cnsty_check =
"rst_cnsty_check";
253 static const char *sw_alert_check =
"sw_fatal_alert_check";
260 uint32_t function_addr = (uint32_t)(
fault_checker->function);
263 CHECK_STATUS_OK(ret_sram_testutils_scratch_write(0, 1, &function_addr));
264 CHECK_STATUS_OK(ret_sram_testutils_scratch_write(1, 1, &ip_inst_addr));
265 CHECK_STATUS_OK(ret_sram_testutils_scratch_write(2, 1, &type_addr));
269 CHECK_STATUS_OK(ret_sram_testutils_scratch_read(
271 CHECK_STATUS_OK(ret_sram_testutils_scratch_read(
273 CHECK_STATUS_OK(ret_sram_testutils_scratch_read(
278 #if defined(OPENTITAN_IS_EARLGREY)
279 static const char *adc_ctrl_inst_name =
"adc_ctrl";
280 static const char *entropy_src_inst_name =
"entropy_src";
281 static const char *flash_ctrl_inst_name =
"flash_ctrl";
282 static const char *i2c1_inst_name =
"i2c1";
283 static const char *i2c2_inst_name =
"i2c2";
284 static const char *keymgr_inst_name =
"keymgr";
285 static const char *pattgen_inst_name =
"pattgen";
286 static const char *pwm_inst_name =
"pwm";
287 static const char *rom_ctrl_inst_name =
"rom_ctrl";
288 static const char *sensor_ctrl_inst_name =
"sensor_ctrl";
289 static const char *spi_host1_inst_name =
"spi_host1";
290 static const char *sysrst_ctrl_inst_name =
"sysrst_ctrl";
291 static const char *uart1_inst_name =
"uart1";
292 static const char *uart2_inst_name =
"uart2";
293 static const char *uart3_inst_name =
"uart3";
294 static const char *usbdev_inst_name =
"usbdev";
295 #elif defined(OPENTITAN_IS_DARJEELING)
296 static const char *keymgr_dpe_inst_name =
"keymgr_dpe";
297 static const char *sram_ctrl_mbox_inst_name =
"sram_ctrl_mbox";
298 static const char *rom_ctrl0_inst_name =
"rom_ctrl0";
299 static const char *rom_ctrl1_inst_name =
"rom_ctrl1";
301 #error "all_escalation_resets_test does not support this top"
304 static const char *aes_inst_name =
"aes";
305 static const char *aon_timer_inst_name =
"aon_timer";
306 static const char *clkmgr_inst_name =
"clkmgr";
307 static const char *csrng_inst_name =
"csrng";
308 static const char *edn0_inst_name =
"edn0";
309 static const char *edn1_inst_name =
"edn1";
310 static const char *gpio_inst_name =
"gpio";
311 static const char *hmac_inst_name =
"hmac";
312 static const char *i2c0_inst_name =
"i2c0";
313 static const char *kmac_inst_name =
"kmac";
315 static const char *lc_ctrl_inst_name =
"lc_ctrl";
316 static const char *otbn_inst_name =
"otbn";
317 static const char *otp_ctrl_inst_name =
"otp_ctrl";
318 static const char *pinmux_inst_name =
"pinmux";
319 static const char *pwrmgr_inst_name =
"pwrmgr";
320 static const char *rstmgr_inst_name =
"rstmgr";
322 static const char *rv_core_ibex_inst_name =
"rv_core_ibex";
323 static const char *rv_dm_inst_name =
"rv_dm";
324 static const char *rv_plic_inst_name =
"rv_plic";
325 static const char *rv_timer_inst_name =
"rv_timer";
326 static const char *spi_host0_inst_name =
"spi_host0";
327 static const char *spi_device_inst_name =
"spi_device";
328 static const char *sram_ctrl_main_inst_name =
"sram_ctrl_main";
329 static const char *sram_ctrl_ret_inst_name =
"sram_ctrl_ret";
330 static const char *uart0_inst_name =
"uart0";
336 static void trivial_fault_checker(
bool enable,
const char *ip_inst,
338 CHECK(enable == enable);
341 static void generic_rom_ctrl_fault_checker(
bool enable,
const char *ip_inst,
343 dif_rom_ctrl_t *dif) {
346 uint32_t expected_codes =
350 CHECK(codes == expected_codes,
"For %s got codes 0x%x, expected 0x%x",
351 ip_inst, codes, expected_codes);
354 static void generic_sram_ctrl_fault_checker(
const dif_sram_ctrl_t *sram_ctrl,
355 bool enable,
const char *ip_inst,
360 CHECK(codes == expected_codes,
"For %s got codes 0x%x, expected 0x%x",
361 ip_inst, codes, expected_codes);
365 #if defined(OPENTITAN_IS_EARLGREY)
366 static void flash_ctrl_fault_checker(
bool enable,
const char *ip_inst,
373 CHECK(fault_code == enable,
"For %s got codes 0x%x, expected 0x%x", ip_inst,
377 static void flash_ctrl_prim_fault_checker(
bool enable,
const char *ip_inst,
383 "For flash memory_properties err exp 1 get 0");
384 CHECK(faults.
read_error == 0,
"For flash read err exp 1 get 0");
386 CHECK(faults.
prog_type_error == 0,
"For flash prog_type err exp 1 get 0");
387 CHECK(faults.
host_gnt_error == 0,
"For flash host_gnt err exp 1 get 0");
388 CHECK(faults.
host_gnt_error == 0,
"For flash host_gnt err exp 1 get 0");
390 "For flash register_integrity err exp 1 get 0");
392 "For flash phy_integrity err exp 1 get 0");
394 "For flash lifecycle_manager err exp 1 get 0");
396 "For flash shadow_storage err exp 1 get 0");
413 static void keymgr_fault_checker(
bool enable,
const char *ip_inst,
416 LOG_INFO(
"Expected alert %d keymgr fault check is yet unimplemented",
417 kDtKeymgrAlertFatalFaultErr);
418 trivial_fault_checker(enable, ip_inst, type);
421 static void rom_ctrl_fault_checker(
bool enable,
const char *ip_inst,
423 return generic_rom_ctrl_fault_checker(enable, ip_inst, type, &rom_ctrl);
425 #elif defined(OPENTITAN_IS_DARJEELING)
426 static void keymgr_dpe_fault_checker(
bool enable,
const char *ip_inst,
429 LOG_INFO(
"Expected alert %d keymgr_dpe fault check is yet unimplemented",
430 kDtKeymgrDpeAlertFatalFaultErr);
431 trivial_fault_checker(enable, ip_inst, type);
434 static void rom_ctrl0_fault_checker(
bool enable,
const char *ip_inst,
436 return generic_rom_ctrl_fault_checker(enable, ip_inst, type, &rom_ctrl0);
439 static void rom_ctrl1_fault_checker(
bool enable,
const char *ip_inst,
441 return generic_rom_ctrl_fault_checker(enable, ip_inst, type, &rom_ctrl1);
444 static void sram_ctrl_mbox_fault_checker(
bool enable,
const char *ip_inst,
446 generic_sram_ctrl_fault_checker(&sram_ctrl_mbox, enable, ip_inst, type);
449 #error "all_escalation_resets_test does not support this top"
453 static void aes_fault_checker(
bool enable,
const char *ip_inst,
458 CHECK(
status == enable,
"For %s got 0x%x, expected 0x%x", ip_inst,
status,
462 static void clkmgr_fault_checker(
bool enable,
const char *ip_inst,
468 CHECK(codes == expected,
"For %s got codes 0x%x, expected 0x%x", ip_inst,
486 static void hmac_fault_checker(
bool enable,
const char *ip_inst,
489 LOG_INFO(
"Expected alert %d hmac fault check is yet unimplemented",
490 kDtHmacAlertFatalFault);
491 trivial_fault_checker(enable, ip_inst, type);
494 static void kmac_fault_checker(
bool enable,
const char *ip_inst,
498 uint32_t expected = enable ? 1 : 0;
500 CHECK(
status.faults == expected,
"For %s got codes 0x%x, expected 0x%x",
501 ip_inst,
status.faults, expected);
505 static void lc_ctrl_fault_checker(
bool enable,
const char *ip_inst,
513 uint32_t relevant_status =
status & mask;
514 uint32_t bus_integ_error =
516 uint32_t state_error =
518 uint32_t expected_status =
519 enable ? (type == we_check ? bus_integ_error : state_error) : 0;
520 CHECK(relevant_status == expected_status,
521 "For %s got codes 0x%x, expected 0x%x", ip_inst, relevant_status,
540 static void otbn_fault_checker(
bool enable,
const char *ip_inst,
543 LOG_INFO(
"Expected alert %d otbn fault check is yet unimplemented",
545 trivial_fault_checker(enable, ip_inst, type);
548 static void otp_ctrl_fault_checker(
bool enable,
const char *ip_inst,
552 uint32_t expected_codes;
553 uint32_t relevant_codes;
554 uint32_t relevant_mask =
559 relevant_codes =
status.codes & relevant_mask;
563 expected_codes = enable ? (1 << exp_err) : 0;
564 CHECK(relevant_codes == expected_codes,
565 "For %s got codes 0x%x, expected 0x%x", ip_inst, relevant_codes,
570 static void otp_ctrl_prim_fault_checker(
bool enable,
const char *ip_inst,
574 uint32_t expected_codes;
577 CHECK(
status.codes == expected_codes,
"For %s got codes 0x%x, expected 0x%x",
578 ip_inst,
status.codes, expected_codes);
581 static void pwrmgr_fault_checker(
bool enable,
const char *ip_inst,
587 CHECK(codes == expected_codes,
"For %s got codes 0x%x, expected 0x%x",
588 ip_inst, codes, expected_codes);
591 static void rstmgr_fault_checker(
bool enable,
const char *ip_inst,
596 uint32_t fault_code = (type == we_check)
599 uint32_t expected_codes = enable ? fault_code : 0;
600 CHECK(codes == expected_codes,
"For %s got codes 0x%x, expected 0x%x",
601 ip_inst, codes, expected_codes);
604 static void rv_core_ibex_fault_checker(
bool enable,
const char *ip_inst,
606 dif_rv_core_ibex_error_status_t codes;
607 CHECK_DIF_OK(dif_rv_core_ibex_get_error_status(&rv_core_ibex, &codes));
611 uint32_t expected_codes =
612 (type == we_check) && enable
613 ? kDifRvCoreIbexErrorStatusRegisterTransmissionIntegrity
616 CHECK(codes == expected_codes,
"For %s got codes 0x%x, expected 0x%x",
617 ip_inst, codes, expected_codes);
629 void ottf_load_store_fault_handler(uint32_t *exc_info) {
630 LOG_INFO(
"At load access error handler");
633 CHECK(mtval == kSramRetStart,
"Unexpected mtval: expected 0x%x, got 0x%x",
634 kSramRetStart, mtval);
636 load_access_exception_seen =
true;
638 LOG_INFO(
"Load access error handler exiting");
641 static void sram_ctrl_main_fault_checker(
bool enable,
const char *ip_inst,
643 generic_sram_ctrl_fault_checker(&sram_ctrl_main, enable, ip_inst, type);
646 static void sram_ctrl_ret_fault_checker(
bool enable,
const char *ip_inst,
648 generic_sram_ctrl_fault_checker(&sram_ctrl_ret, enable, ip_inst, type);
658 void ottf_external_isr(uint32_t *exc_info) {
665 uint32_t interrupt_count = 0;
667 ret_sram_testutils_counter_get(kCounterInterrupt, &interrupt_count));
668 if (interrupt_count > kMaxInterrupts) {
670 CHECK(
false,
"For %s, reset count %d got too many interrupts (%d)",
673 CHECK_STATUS_OK(ret_sram_testutils_counter_increment(kCounterInterrupt));
677 dt_instance_id_t peripheral_id = dt_plic_id_to_instance_id(irq_id);
679 if (peripheral_id == dt_aon_timer_instance_id(kDtAonTimerAon)) {
680 dt_aon_timer_irq_t irq =
681 dt_aon_timer_irq_from_plic_id(kDtAonTimerAon, irq_id);
684 CHECK(
false,
"Unexpected aon timer interrupt %d", irq);
685 }
else if (peripheral_id == dt_alert_handler_instance_id(kAlertHandlerDt)) {
697 dt_alert_handler_irq_t irq =
698 dt_alert_handler_irq_from_plic_id(kAlertHandlerDt, irq_id);
699 CHECK_DIF_OK(dif_alert_handler_irq_set_enabled(&alert_handler, irq,
712 alert_irq_seen =
true;
720 void ottf_external_nmi_handler(uint32_t *exc_info) {
723 uint32_t nmi_count = 0;
724 CHECK_STATUS_OK(ret_sram_testutils_counter_get(kCounterNmi, &nmi_count));
725 if (nmi_count <= kMaxInterrupts) {
726 CHECK_STATUS_OK(ret_sram_testutils_counter_increment(kCounterNmi));
731 CHECK_DIF_OK(dif_rv_core_ibex_get_nmi_state(
734 "Alert handler NMI state not expected:\n\t"
735 "alert_enable:%x\n\talert_raised:%x\n",
738 "Watchdog NMI state not expected:\n\t"
739 "wdog_enabled:%x\n\twdog_barked:%x\n",
745 alert_class_to_use, &state));
749 bool is_cause =
false;
751 &alert_handler, kExpectedAlertNumber, &is_cause));
756 kExpectedAlertNumber));
762 static void init_peripherals(
void) {
763 #if defined(OPENTITAN_IS_EARLGREY)
766 CHECK_DIF_OK(dif_rom_ctrl_init_from_dt(kRomCtrlDt, &rom_ctrl));
767 #elif defined(OPENTITAN_IS_DARJEELING)
768 CHECK_DIF_OK(dif_rom_ctrl_init_from_dt(kRomCtrl0Dt, &rom_ctrl0));
769 CHECK_DIF_OK(dif_rom_ctrl_init_from_dt(kRomCtrl1Dt, &rom_ctrl1));
770 CHECK_DIF_OK(dif_sram_ctrl_init_from_dt(kSramCtrlMboxDt, &sram_ctrl_mbox));
772 #error "all_escalation_resets_test does not support this top"
775 CHECK_DIF_OK(dif_aes_init_from_dt(kAesDt, &aes));
776 CHECK_DIF_OK(dif_alert_handler_init_from_dt(kAlertHandlerDt, &alert_handler));
777 CHECK_DIF_OK(dif_aon_timer_init_from_dt(kAonTimerDt, &aon_timer));
778 CHECK_DIF_OK(dif_clkmgr_init_from_dt(kClkmgrDt, &clkmgr));
779 CHECK_DIF_OK(dif_kmac_init_from_dt(kKmacDt, &kmac));
780 CHECK_DIF_OK(dif_lc_ctrl_init_from_dt(kLcCtrlDt, &lc_ctrl));
781 CHECK_DIF_OK(dif_otp_ctrl_init_from_dt(kOtpCtrlDt, &otp_ctrl));
782 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
783 CHECK_DIF_OK(dif_rstmgr_init_from_dt(kRstmgrDt, &rstmgr));
784 CHECK_DIF_OK(dif_rv_core_ibex_init_from_dt(kRvCoreIbexDt, &rv_core_ibex));
785 CHECK_DIF_OK(dif_rv_plic_init_from_dt(kRvPlicDt, &plic));
786 CHECK_DIF_OK(dif_sram_ctrl_init_from_dt(kSramCtrlMainDt, &sram_ctrl_main));
787 CHECK_DIF_OK(dif_sram_ctrl_init_from_dt(kSramCtrlRetAonDt, &sram_ctrl_ret));
795 static void alert_handler_config(
void) {
797 kDifAlertHandlerClassA, kDifAlertHandlerClassD);
801 uint32_t cycles[4] = {0};
802 CHECK_STATUS_OK(alert_handler_testutils_get_cycles_from_us(
803 kEscalationPhase0Micros, &cycles[0]));
804 CHECK_STATUS_OK(alert_handler_testutils_get_cycles_from_us(
805 kEscalationPhase1Micros, &cycles[1]));
806 CHECK_STATUS_OK(alert_handler_testutils_get_cycles_from_us(
807 kEscalationPhase2Micros, &cycles[2]));
808 CHECK_STATUS_OK(alert_handler_testutils_get_cycles_from_us(
809 kEscalationPhase3Micros, &cycles[3]));
813 .signal = 0xFFFFFFFF,
814 .duration_cycles = cycles[0]},
817 .duration_cycles = cycles[1]},
820 .duration_cycles = cycles[2]},
823 .duration_cycles = cycles[3]}};
828 uint32_t deadline_cycles = 0;
829 uint16_t threshold = 0;
830 LOG_INFO(
"Configuring class %d with %d cycles and %d occurrences",
831 alert_class_to_use, deadline_cycles, threshold);
834 .accumulator_threshold = threshold,
835 .irq_deadline_cycles = deadline_cycles,
836 .escalation_phases = esc_phases,
837 .escalation_phases_len =
ARRAYSIZE(esc_phases),
844 .alert_classes = alert_classes,
847 .class_configs = class_config,
852 CHECK_STATUS_OK(alert_handler_testutils_configure_all(&alert_handler, config,
857 CHECK_DIF_OK(dif_alert_handler_irq_set_enabled(
859 CHECK_DIF_OK(dif_alert_handler_irq_set_enabled(
861 CHECK_DIF_OK(dif_alert_handler_irq_set_enabled(
863 CHECK_DIF_OK(dif_alert_handler_irq_set_enabled(
867 static void set_aon_timers(
const dif_aon_timer_t *aon_timer) {
868 uint32_t bark_cycles = 0;
869 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(kWdogBarkMicros,
871 uint32_t bite_cycles = 0;
872 CHECK_STATUS_OK(aon_timer_testutils_get_aon_cycles_32_from_us(kWdogBiteMicros,
876 "Wdog will bark after %u us (%u cycles) and bite after %u us (%u cycles)",
877 (uint32_t)kWdogBarkMicros, bark_cycles, (uint32_t)kWdogBiteMicros,
882 aon_timer_testutils_watchdog_config(aon_timer, bark_cycles, bite_cycles,
890 #if defined(OPENTITAN_IS_EARLGREY)
891 checkers[dt_adc_ctrl_alert_to_alert_id(kDtAdcCtrlAon,
892 kDtAdcCtrlAlertFatalFault)] =
893 (
fault_checker_t){trivial_fault_checker, adc_ctrl_inst_name, we_check};
895 checkers[dt_entropy_src_alert_to_alert_id((dt_entropy_src_t)0,
896 kDtEntropySrcAlertFatalAlert)] =
897 (
fault_checker_t){trivial_fault_checker, entropy_src_inst_name, we_check};
898 static_assert(kDtEntropySrcCount >= 1,
"This test needs an entropy src");
900 checkers[dt_flash_ctrl_alert_to_alert_id(
902 flash_ctrl_fault_checker, flash_ctrl_inst_name, flash_fatal_check};
903 checkers[dt_flash_ctrl_alert_to_alert_id(
905 flash_ctrl_fault_checker, flash_ctrl_inst_name, flash_fatal_check};
906 checkers[dt_flash_ctrl_alert_to_alert_id(
907 kFlashCtrlDt, kDtFlashCtrlAlertFatalPrimFlashAlert)] = (
fault_checker_t){
908 flash_ctrl_prim_fault_checker, flash_ctrl_inst_name, flash_fatal_check};
910 checkers[dt_i2c_alert_to_alert_id((dt_i2c_t)1, kDtI2cAlertFatalFault)] =
912 checkers[dt_i2c_alert_to_alert_id((dt_i2c_t)2, kDtI2cAlertFatalFault)] =
914 static_assert(kDtI2cCount >= 3,
"This test needs 3 I2C instances");
916 checkers[dt_keymgr_alert_to_alert_id((dt_keymgr_t)0,
917 kDtKeymgrAlertFatalFaultErr)] =
919 static_assert(kDtKeymgrCount >= 1,
"This test needs a keymgr");
921 checkers[dt_pattgen_alert_to_alert_id((dt_pattgen_t)0,
922 kDtPattgenAlertFatalFault)] =
924 static_assert(kDtPattgenCount >= 1,
"This test needs a pattgen instance");
926 checkers[dt_pwm_alert_to_alert_id(kDtPwmAon, kDtPwmAlertFatalFault)] =
929 checkers[dt_rom_ctrl_alert_to_alert_id(kRomCtrlDt, kDtRomCtrlAlertFatal)] =
930 (
fault_checker_t){rom_ctrl_fault_checker, rom_ctrl_inst_name, we_check};
932 checkers[dt_sensor_ctrl_alert_to_alert_id(kDtSensorCtrlAon,
933 kDtSensorCtrlAlertFatalAlert)] =
934 (
fault_checker_t){trivial_fault_checker, sensor_ctrl_inst_name, we_check};
936 checkers[dt_spi_host_alert_to_alert_id((dt_spi_host_t)1,
937 kDtSpiHostAlertFatalFault)] =
938 (
fault_checker_t){trivial_fault_checker, spi_host1_inst_name, we_check};
939 static_assert(kDtSpiHostCount >= 2,
"This test needs 2 SPI Host instances");
941 checkers[dt_sysrst_ctrl_alert_to_alert_id(kDtSysrstCtrlAon,
942 kDtSysrstCtrlAlertFatalFault)] =
943 (
fault_checker_t){trivial_fault_checker, sysrst_ctrl_inst_name, we_check};
945 checkers[dt_uart_alert_to_alert_id((dt_uart_t)1, kDtUartAlertFatalFault)] =
947 checkers[dt_uart_alert_to_alert_id((dt_uart_t)2, kDtUartAlertFatalFault)] =
949 checkers[dt_uart_alert_to_alert_id((dt_uart_t)3, kDtUartAlertFatalFault)] =
951 static_assert(kDtUartCount >= 4,
"This test needs 4 UART instances");
953 checkers[dt_usbdev_alert_to_alert_id((dt_usbdev_t)0,
954 kDtUsbdevAlertFatalFault)] =
956 static_assert(kDtUsbdevCount >= 1,
"This test needs a USB Device");
957 #elif defined(OPENTITAN_IS_DARJEELING)
958 checkers[dt_keymgr_dpe_alert_to_alert_id(
959 (dt_keymgr_dpe_t)0, kDtKeymgrDpeAlertFatalFaultErr)] = (
fault_checker_t){
960 keymgr_dpe_fault_checker, keymgr_dpe_inst_name, we_check};
961 static_assert(kDtKeymgrDpeCount >= 1,
"This test needs a keymgr_dpe");
963 checkers[dt_sram_ctrl_alert_to_alert_id(
965 sram_ctrl_mbox_fault_checker, sram_ctrl_mbox_inst_name, we_check};
967 checkers[dt_rom_ctrl_alert_to_alert_id(kRomCtrl0Dt, kDtRomCtrlAlertFatal)] =
968 (
fault_checker_t){rom_ctrl0_fault_checker, rom_ctrl0_inst_name, we_check};
969 checkers[dt_rom_ctrl_alert_to_alert_id(kRomCtrl1Dt, kDtRomCtrlAlertFatal)] =
970 (
fault_checker_t){rom_ctrl1_fault_checker, rom_ctrl1_inst_name, we_check};
972 #error "all_escalation_resets_test does not support this top"
975 checkers[dt_aes_alert_to_alert_id(kAesDt, kDtAesAlertFatalFault)] =
978 checkers[dt_aon_timer_alert_to_alert_id(kAonTimerDt,
979 kDtAonTimerAlertFatalFault)] =
980 (
fault_checker_t){trivial_fault_checker, aon_timer_inst_name, we_check};
982 checkers[dt_clkmgr_alert_to_alert_id(kClkmgrDt, kDtClkmgrAlertFatalFault)] =
985 checkers[dt_csrng_alert_to_alert_id((dt_csrng_t)0, kDtCsrngAlertFatalAlert)] =
987 static_assert(kDtCsrngCount >= 1,
"This test needs a CSRNG instance");
989 checkers[dt_edn_alert_to_alert_id((dt_edn_t)0, kDtEdnAlertFatalAlert)] =
991 checkers[dt_edn_alert_to_alert_id((dt_edn_t)1, kDtEdnAlertFatalAlert)] =
993 static_assert(kDtEdnCount >= 2,
"This test needs 2 EDN instances");
995 checkers[dt_gpio_alert_to_alert_id((dt_gpio_t)0, kDtGpioAlertFatalFault)] =
997 static_assert(kDtGpioCount >= 1,
"This test needs 1 GPIO instance");
999 checkers[dt_hmac_alert_to_alert_id((dt_hmac_t)0, kDtHmacAlertFatalFault)] =
1001 static_assert(kDtHmacCount >= 1,
"This test needs 1 HMAC instance");
1003 checkers[dt_i2c_alert_to_alert_id((dt_i2c_t)0, kDtI2cAlertFatalFault)] =
1005 static_assert(kDtI2cCount >= 1,
"This test needs at least 1 I2C instance");
1007 checkers[dt_kmac_alert_to_alert_id(kKmacDt, kDtKmacAlertFatalFaultErr)] =
1012 checkers[dt_lc_ctrl_alert_to_alert_id(
1014 lc_ctrl_fault_checker, lc_ctrl_inst_name, sparse_fsm_check};
1015 checkers[dt_lc_ctrl_alert_to_alert_id(kLcCtrlDt,
1016 kDtLcCtrlAlertFatalBusIntegError)] =
1017 (
fault_checker_t){lc_ctrl_fault_checker, lc_ctrl_inst_name, we_check};
1019 checkers[dt_otbn_alert_to_alert_id((dt_otbn_t)0, kDtOtbnAlertFatal)] =
1021 static_assert(kDtOtbnCount >= 1,
"This test needs at least 1 OTBN instance");
1027 checkers[dt_otp_ctrl_alert_to_alert_id(
1029 otp_ctrl_fault_checker, otp_ctrl_inst_name, sparse_fsm_check};
1030 checkers[dt_otp_ctrl_alert_to_alert_id(
1032 otp_ctrl_prim_fault_checker, otp_ctrl_inst_name, sparse_fsm_check};
1033 checkers[dt_otp_ctrl_alert_to_alert_id(
1035 otp_ctrl_fault_checker, otp_ctrl_inst_name, sparse_fsm_check};
1036 checkers[dt_otp_ctrl_alert_to_alert_id(kOtpCtrlDt,
1037 kDtOtpCtrlAlertFatalBusIntegError)] =
1038 (
fault_checker_t){otp_ctrl_fault_checker, otp_ctrl_inst_name, we_check};
1040 checkers[dt_pinmux_alert_to_alert_id(kDtPinmuxAon,
1041 kDtPinmuxAlertFatalFault)] =
1044 checkers[dt_pwrmgr_alert_to_alert_id(kPwrmgrDt, kDtPwrmgrAlertFatalFault)] =
1047 checkers[dt_rstmgr_alert_to_alert_id(
1049 rstmgr_fault_checker, rstmgr_inst_name, rst_cnsty_check};
1050 checkers[dt_rstmgr_alert_to_alert_id(kRstmgrDt, kDtRstmgrAlertFatalFault)] =
1053 checkers[dt_rv_core_ibex_alert_to_alert_id(
1055 rv_core_ibex_fault_checker, rv_core_ibex_inst_name, sw_alert_check};
1056 checkers[dt_rv_core_ibex_alert_to_alert_id(
1058 rv_core_ibex_fault_checker, rv_core_ibex_inst_name, we_check};
1060 checkers[dt_rv_dm_alert_to_alert_id((dt_rv_dm_t)0, kDtRvDmAlertFatalFault)] =
1062 static_assert(kDtRvDmCount >= 1,
"This test needs an RV DM");
1064 checkers[dt_rv_plic_alert_to_alert_id(kRvPlicDt, kDtRvPlicAlertFatalFault)] =
1065 (
fault_checker_t){trivial_fault_checker, rv_plic_inst_name, we_check};
1067 checkers[dt_rv_timer_alert_to_alert_id((dt_rv_timer_t)0,
1068 kDtRvTimerAlertFatalFault)] =
1069 (
fault_checker_t){trivial_fault_checker, rv_timer_inst_name, we_check};
1070 static_assert(kDtRvTimerCount >= 1,
"This test needs a RV Timer");
1072 checkers[dt_spi_device_alert_to_alert_id((dt_spi_device_t)0,
1073 kDtSpiDeviceAlertFatalFault)] =
1074 (
fault_checker_t){trivial_fault_checker, spi_device_inst_name, we_check};
1075 static_assert(kDtSpiDeviceCount >= 1,
"This test needs a SPI Device");
1077 checkers[dt_spi_host_alert_to_alert_id((dt_spi_host_t)0,
1078 kDtSpiHostAlertFatalFault)] =
1079 (
fault_checker_t){trivial_fault_checker, spi_host0_inst_name, we_check};
1080 static_assert(kDtSpiHostCount >= 1,
"This test needs at leasst 1 SPI Host");
1082 checkers[dt_sram_ctrl_alert_to_alert_id(
1084 sram_ctrl_main_fault_checker, sram_ctrl_main_inst_name, we_check};
1085 checkers[dt_sram_ctrl_alert_to_alert_id(
1087 sram_ctrl_ret_fault_checker, sram_ctrl_ret_inst_name, we_check};
1089 checkers[dt_uart_alert_to_alert_id((dt_uart_t)0, kDtUartAlertFatalFault)] =
1091 static_assert(kDtUartCount >= 1,
"This test needs at least 1 UART instance");
1097 static void execute_test(
const dif_aon_timer_t *aon_timer) {
1098 alert_handler_config();
1104 CHECK(kExpectedAlertNumber < kDtAlertCount,
1105 "Expected alert number larger than the number of alerts?");
1107 if (fc.function == NULL || fc.ip_inst == NULL || fc.type == NULL) {
1118 dif_rv_core_ibex_enable_nmi(&rv_core_ibex, kDifRvCoreIbexNmiSourceAlert));
1120 dif_rv_core_ibex_enable_nmi(&rv_core_ibex, kDifRvCoreIbexNmiSourceWdog));
1122 set_aon_timers(aon_timer);
1124 LOG_INFO(
"Expected alert is %d for %s", kExpectedAlertNumber,
1129 LOG_INFO(
"Ready for fault injection");
1131 if (kExpectedAlertNumber ==
1132 dt_rv_core_ibex_alert_to_alert_id(kRvCoreIbexDt,
1133 kDtRvCoreIbexAlertFatalSwErr)) {
1134 CHECK_DIF_OK(dif_rv_core_ibex_trigger_sw_fatal_err_alert(&rv_core_ibex));
1135 LOG_INFO(
"Software fatal alert triggered");
1140 if (kExpectedAlertNumber == dt_otp_ctrl_alert_to_alert_id(
1141 kOtpCtrlDt, kDtOtpCtrlAlertFatalMacroError)) {
1144 LOG_INFO(
"OTP_CTRL error inject done");
1147 #if defined(OPENTITAN_IS_EARLGREY)
1149 if (kExpectedAlertNumber == dt_flash_ctrl_alert_to_alert_id(
1150 kFlashCtrlDt, kDtFlashCtrlAlertFatalErr)) {
1153 kNumTestBytes = kNumTestWords *
sizeof(uint32_t),
1155 uint32_t host_data[kNumTestWords];
1159 dt_flash_ctrl_reg_block(kFlashCtrlDt, kDtFlashCtrlRegBlockMem)),
1160 FLASH_CTRL_PARAM_BYTES_PER_BANK, &host_data, kNumTestBytes);
1162 #elif defined(OPENTITAN_IS_DARJEELING)
1165 #error "all_escalation_resets_test does not support this top"
1171 if (kExpectedAlertNumber ==
1172 dt_sram_ctrl_alert_to_alert_id(kSramCtrlRetAonDt,
1173 kDtSramCtrlAlertFatalError)) {
1174 LOG_INFO(
"Check that the retention SRAM blocks accesses");
1175 uint32_t data = *((uint32_t *)kSramRetStart);
1176 LOG_INFO(
"Read from address 0x%0x with expected error gets 0x%x",
1177 kSramRetStart, data);
1178 CHECK(load_access_exception_seen,
1179 "We expect this access to trigger a load access exception");
1183 CHECK(
false,
"This should not be reached");
1186 void check_alert_dump(
void) {
1194 LOG_INFO(
"DUMP SIZE %d", seg_size);
1195 for (
int i = 0; i < seg_size; i++) {
1196 LOG_INFO(
"DUMP:%d: 0x%x", i, dump[i]);
1199 CHECK(seg_size <= INT_MAX,
"seg_size must fit in int");
1201 alert_handler_testutils_info_parse(dump, (
int)seg_size, &actual_info));
1202 LOG_INFO(
"The alert info crash dump:");
1203 alert_handler_testutils_info_dump(&actual_info);
1205 for (
int i = 0; i < ALERT_HANDLER_PARAM_N_ALERTS; ++i) {
1206 if (i == kExpectedAlertNumber) {
1207 CHECK(actual_info.alert_cause[i],
"Expected alert cause %d to be set", i);
1211 if (actual_info.alert_cause[i]) {
1212 LOG_INFO(
"Unexpected alert cause %d, may be triggered by %d", i,
1213 kExpectedAlertNumber);
1222 dt_sram_ctrl_reg_block(kDtSramCtrlRetAon, kDtSramCtrlRegBlockRam);
1225 irq_global_ctrl(
true);
1226 irq_external_ctrl(
true);
1230 ret_sram_testutils_init();
1233 rv_plic_testutils_irq_range_enable(
1235 dt_aon_timer_irq_to_plic_id(kAonTimerDt, kDtAonTimerIrqWkupTimerExpired),
1236 dt_aon_timer_irq_to_plic_id(kAonTimerDt, kDtAonTimerIrqWdogTimerBark));
1237 rv_plic_testutils_irq_range_enable(
1239 dt_alert_handler_irq_to_plic_id(kAlertHandlerDt,
1240 kDtAlertHandlerIrqClassa),
1241 dt_alert_handler_irq_to_plic_id(kAlertHandlerDt,
1242 kDtAlertHandlerIrqClassd));
1246 rst_info = rstmgr_testutils_reason_get();
1247 rstmgr_testutils_reason_clear();
1251 "Wrong reset reason %02X", rst_info);
1254 LOG_INFO(
"Booting for the first time, starting test");
1257 CHECK_STATUS_OK(ret_sram_testutils_counter_clear(kCounterReset));
1258 CHECK_STATUS_OK(ret_sram_testutils_counter_clear(kCounterInterrupt));
1259 CHECK_STATUS_OK(ret_sram_testutils_counter_clear(kCounterNmi));
1260 execute_test(&aon_timer);
1264 CHECK_STATUS_OK(ret_sram_testutils_counter_get(kCounterReset,
1265 (uint32_t *)&reset_count));
1266 LOG_INFO(
"Reset counter value: %u", reset_count);
1267 if (reset_count > kMaxResets) {
1268 CHECK(
false,
"Ip %d Got too many resets (%d)",
fault_checker.ip_inst,
1273 CHECK_STATUS_OK(ret_sram_testutils_counter_increment(kCounterReset));
1277 LOG_INFO(
"Booting due to escalation reset");
1279 uint32_t interrupt_count = 0;
1281 ret_sram_testutils_counter_get(kCounterInterrupt, &interrupt_count));
1282 uint32_t nmi_count = 0;
1283 CHECK_STATUS_OK(ret_sram_testutils_counter_get(kCounterNmi, &nmi_count));
1285 LOG_INFO(
"Interrupt count %d", interrupt_count);
1286 LOG_INFO(
"NMI count %d", nmi_count);
1288 #if defined(OPENTITAN_IS_EARLGREY)
1293 if (kExpectedAlertNumber ==
1294 dt_flash_ctrl_alert_to_alert_id(kFlashCtrlDt,
1295 kDtFlashCtrlAlertFatalStdErr) ||
1296 kExpectedAlertNumber ==
1297 dt_sram_ctrl_alert_to_alert_id(kSramCtrlMainDt,
1298 kDtSramCtrlAlertFatalError) ||
1299 kExpectedAlertNumber == dt_lc_ctrl_alert_to_alert_id(
1300 kLcCtrlDt, kDtLcCtrlAlertFatalStateError) ||
1301 kExpectedAlertNumber ==
1302 dt_otp_ctrl_alert_to_alert_id(kOtpCtrlDt,
1303 kDtOtpCtrlAlertFatalMacroError) ||
1304 kExpectedAlertNumber ==
1305 dt_otp_ctrl_alert_to_alert_id(kOtpCtrlDt,
1306 kDtOtpCtrlAlertFatalCheckError)) {
1307 CHECK(interrupt_count == 0,
1308 "Expected regular ISR should not run for flash_ctrl, lc_ctrl fatal "
1309 "state, or sram_ctrl_main faults");
1310 CHECK(nmi_count == 0,
1311 "Expected nmi should not run for flash_ctrl, lc_ctrl fatal state, "
1312 "or sram_ctrl_main faults");
1314 CHECK(interrupt_count == 1,
"Expected exactly one regular interrupt");
1315 CHECK(nmi_count > 0,
"Expected at least one nmi");
1317 #elif defined(OPENTITAN_IS_DARJEELING)
1321 if (kExpectedAlertNumber ==
1322 dt_sram_ctrl_alert_to_alert_id(kSramCtrlMainDt,
1323 kDtSramCtrlAlertFatalError) ||
1324 kExpectedAlertNumber == dt_lc_ctrl_alert_to_alert_id(
1325 kLcCtrlDt, kDtLcCtrlAlertFatalStateError) ||
1326 kExpectedAlertNumber ==
1327 dt_otp_ctrl_alert_to_alert_id(kOtpCtrlDt,
1328 kDtOtpCtrlAlertFatalMacroError) ||
1329 kExpectedAlertNumber ==
1330 dt_otp_ctrl_alert_to_alert_id(kOtpCtrlDt,
1331 kDtOtpCtrlAlertFatalCheckError)) {
1332 CHECK(interrupt_count == 0,
1333 "Expected regular ISR should not run for lc_ctrl fatal state, "
1334 "or sram_ctrl_main faults");
1335 CHECK(nmi_count == 0,
1336 "Expected nmi should not run for lc_ctrl fatal state, or "
1337 "sram_ctrl_main faults");
1339 CHECK(interrupt_count == 1,
"Expected exactly one regular interrupt");
1340 CHECK(nmi_count > 0,
"Expected at least one nmi");
1343 #error "all_escalation_resets_test does not support this top"
1347 bool is_cause =
true;
1349 &alert_handler, kExpectedAlertNumber, &is_cause));
1358 LOG_ERROR(
"Unexpected rst_info=0x%x", rst_info);