13 #include "gtest/gtest.h"
15 #include "sw/device/lib/base/mock_mmio.h"
18 #include "alert_handler_regs.h"
20 namespace dif_alert_handler_unittest {
22 using ::mock_mmio::LeInt;
23 using ::mock_mmio::MmioTest;
24 using ::mock_mmio::MockDevice;
26 using ::testing::Return;
33 static_assert(ALERT_HANDLER_PARAM_N_ALERTS == 65,
34 "The number of alerts have changed.");
36 constexpr
int kAlerts = ALERT_HANDLER_PARAM_N_ALERTS;
37 constexpr
int kLocalAlerts = ALERT_HANDLER_PARAM_N_LOC_ALERT;
38 constexpr
int kClasses = ALERT_HANDLER_PARAM_N_CLASSES;
39 constexpr
int kEscSignals = ALERT_HANDLER_PARAM_N_ESC_SEV;
43 dif_alert_handler_t alert_handler_ = {.base_addr = dev().region()};
47 public testing::WithParamInterface<
48 std::tuple<int, dif_alert_handler_class_t>> {};
64 &alert_handler_, 0, kDifAlertHandlerClassA,
static_cast<dif_toggle_t>(2),
72 TEST_F(AlertConfigTest, Locked) {
73 EXPECT_READ32(ALERT_HANDLER_ALERT_REGWEN_0_REG_OFFSET, 0);
79 EXPECT_READ32(ALERT_HANDLER_ALERT_REGWEN_0_REG_OFFSET +
80 (kAlerts - 1) *
sizeof(uint32_t),
83 &alert_handler_, kAlerts - 1, kDifAlertHandlerClassD,
88 TEST_P(AlertConfigTest, EnableOnly) {
93 ALERT_HANDLER_ALERT_REGWEN_0_REG_OFFSET + alert *
sizeof(uint32_t),
94 ALERT_HANDLER_ALERT_REGWEN_0_REG_RESVAL);
95 EXPECT_WRITE32_SHADOWED(
96 ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET +
97 alert *
sizeof(uint32_t),
98 {{ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_OFFSET, alert_class}});
99 EXPECT_WRITE32_SHADOWED(
100 ALERT_HANDLER_ALERT_EN_SHADOWED_0_REG_OFFSET + alert *
sizeof(uint32_t),
101 {{ALERT_HANDLER_ALERT_EN_SHADOWED_0_EN_A_0_BIT,
true}});
108 TEST_P(AlertConfigTest, EnableAndLock) {
113 ALERT_HANDLER_ALERT_REGWEN_0_REG_OFFSET + alert *
sizeof(uint32_t),
114 ALERT_HANDLER_ALERT_REGWEN_0_REG_RESVAL);
115 EXPECT_WRITE32_SHADOWED(
116 ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET +
117 alert *
sizeof(uint32_t),
118 {{ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_OFFSET, alert_class}});
119 EXPECT_WRITE32_SHADOWED(
120 ALERT_HANDLER_ALERT_EN_SHADOWED_0_REG_OFFSET + alert *
sizeof(uint32_t),
121 {{ALERT_HANDLER_ALERT_EN_SHADOWED_0_EN_A_0_BIT,
true}});
123 ALERT_HANDLER_ALERT_REGWEN_0_REG_OFFSET + alert *
sizeof(uint32_t), 0);
130 INSTANTIATE_TEST_SUITE_P(
131 AllAlertsAndClasses, AlertConfigTest,
132 testing::Combine(testing::Range(0, kAlerts),
133 testing::Values(kDifAlertHandlerClassA,
134 kDifAlertHandlerClassB,
135 kDifAlertHandlerClassC,
136 kDifAlertHandlerClassD)));
140 public testing::WithParamInterface<std::tuple<
141 dif_alert_handler_local_alert_t, dif_alert_handler_class_t>> {};
145 nullptr, kDifAlertHandlerLocalAlertBusIntegrityFail,
154 &alert_handler_, kDifAlertHandlerLocalAlertAlertPingFail,
159 &alert_handler_, kDifAlertHandlerLocalAlertAlertPingFail,
164 &alert_handler_, kDifAlertHandlerLocalAlertAlertPingFail,
168 TEST_F(LocalAlertConfigTest, Locked) {
169 EXPECT_READ32(ALERT_HANDLER_LOC_ALERT_REGWEN_0_REG_OFFSET, 0);
171 &alert_handler_, kDifAlertHandlerLocalAlertAlertPingFail,
175 EXPECT_READ32(ALERT_HANDLER_LOC_ALERT_REGWEN_6_REG_OFFSET, 0);
177 &alert_handler_, kDifAlertHandlerLocalAlertShadowedStorageError,
182 TEST_P(LocalAlertConfigTest, EnableOnly) {
186 EXPECT_READ32(ALERT_HANDLER_LOC_ALERT_REGWEN_0_REG_OFFSET +
187 static_cast<uint32_t
>(local_alert) *
sizeof(uint32_t),
188 ALERT_HANDLER_LOC_ALERT_REGWEN_0_REG_RESVAL);
189 EXPECT_WRITE32_SHADOWED(
190 ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET +
191 static_cast<uint32_t
>(local_alert) *
sizeof(uint32_t),
192 {{ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_OFFSET,
194 EXPECT_WRITE32_SHADOWED(
195 ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_0_REG_OFFSET +
196 static_cast<uint32_t
>(local_alert) *
sizeof(uint32_t),
197 {{ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_0_EN_LA_0_BIT,
true}});
204 TEST_P(LocalAlertConfigTest, EnableAndLock) {
208 EXPECT_READ32(ALERT_HANDLER_LOC_ALERT_REGWEN_0_REG_OFFSET +
209 static_cast<uint32_t
>(local_alert) *
sizeof(uint32_t),
210 ALERT_HANDLER_LOC_ALERT_REGWEN_0_REG_RESVAL);
211 EXPECT_WRITE32_SHADOWED(
212 ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET +
213 static_cast<uint32_t
>(local_alert) *
sizeof(uint32_t),
214 {{ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_OFFSET,
216 EXPECT_WRITE32_SHADOWED(
217 ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_0_REG_OFFSET +
218 static_cast<uint32_t
>(local_alert) *
sizeof(uint32_t),
219 {{ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_0_EN_LA_0_BIT,
true}});
220 EXPECT_WRITE32(ALERT_HANDLER_LOC_ALERT_REGWEN_0_REG_OFFSET +
221 static_cast<uint32_t
>(local_alert) *
sizeof(uint32_t),
229 INSTANTIATE_TEST_SUITE_P(
230 AllLocalAlertsAndClasses, LocalAlertConfigTest,
232 testing::Values(kDifAlertHandlerLocalAlertAlertPingFail,
233 kDifAlertHandlerLocalAlertEscalationPingFail,
234 kDifAlertHandlerLocalAlertAlertIntegrityFail,
235 kDifAlertHandlerLocalAlertEscalationIntegrityFail,
236 kDifAlertHandlerLocalAlertBusIntegrityFail,
237 kDifAlertHandlerLocalAlertShadowedUpdateError,
238 kDifAlertHandlerLocalAlertShadowedStorageError),
239 testing::Values(kDifAlertHandlerClassA, kDifAlertHandlerClassB,
240 kDifAlertHandlerClassC, kDifAlertHandlerClassD)));
247 .accumulator_threshold = 10,
248 .irq_deadline_cycles = 10000,
249 .escalation_phases =
nullptr,
250 .escalation_phases_len = 0,
271 TEST_F(ClassConfigTest, BadConfig) {
274 .accumulator_threshold = 10,
275 .irq_deadline_cycles = 10000,
276 .escalation_phases =
nullptr,
277 .escalation_phases_len = 0,
282 .duration_cycles = 10000};
315 TEST_F(ClassConfigTest, BadEscPhaseConfig) {
316 std::vector<dif_alert_handler_escalation_phase_t> esc_phases = {
319 .duration_cycles = 5000},
322 .duration_cycles = 1000},
326 .accumulator_threshold = 10,
327 .irq_deadline_cycles = 10000,
328 .escalation_phases = esc_phases.data(),
329 .escalation_phases_len = 1,
341 esc_phases[0].signal = kEscSignals;
345 esc_phases[0].signal = 0;
348 TEST_F(ClassConfigTest, Locked) {
351 .accumulator_threshold = 10,
352 .irq_deadline_cycles = 10000,
353 .escalation_phases =
nullptr,
354 .escalation_phases_len = 0,
358 EXPECT_READ32(ALERT_HANDLER_CLASSC_REGWEN_REG_OFFSET, 0);
360 &alert_handler_, kDifAlertHandlerClassC, config,
365 TEST_F(ClassConfigTest, EnableOnly) {
366 std::vector<dif_alert_handler_escalation_phase_t> esc_phases = {
369 .duration_cycles = 5000},
372 .duration_cycles = 1000},
376 .accumulator_threshold = 10,
377 .irq_deadline_cycles = 10000,
378 .escalation_phases = esc_phases.data(),
379 .escalation_phases_len = esc_phases.size(),
383 EXPECT_READ32(ALERT_HANDLER_CLASSC_REGWEN_REG_OFFSET, 1);
385 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_CLASSC_PHASE0_CYC_SHADOWED_REG_OFFSET,
386 esc_phases[0].duration_cycles);
387 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_CLASSC_PHASE2_CYC_SHADOWED_REG_OFFSET,
388 esc_phases[1].duration_cycles);
390 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_CLASSC_ACCUM_THRESH_SHADOWED_REG_OFFSET,
393 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_CLASSC_TIMEOUT_CYC_SHADOWED_REG_OFFSET,
396 EXPECT_WRITE32_SHADOWED(
397 ALERT_HANDLER_CLASSC_CRASHDUMP_TRIGGER_SHADOWED_REG_OFFSET, 1);
399 uint32_t ctrl_reg = 0;
401 ALERT_HANDLER_CLASSC_CTRL_SHADOWED_EN_BIT, 1);
403 ctrl_reg, ALERT_HANDLER_CLASSC_CTRL_SHADOWED_EN_E3_BIT, 1);
405 ctrl_reg, ALERT_HANDLER_CLASSC_CTRL_SHADOWED_EN_E1_BIT, 1);
407 ctrl_reg, ALERT_HANDLER_CLASSC_CTRL_SHADOWED_MAP_E3_FIELD, 0);
409 ctrl_reg, ALERT_HANDLER_CLASSC_CTRL_SHADOWED_MAP_E1_FIELD, 2);
410 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_CLASSC_CTRL_SHADOWED_REG_OFFSET,
418 TEST_F(ClassConfigTest, EnableAndLock) {
419 std::vector<dif_alert_handler_escalation_phase_t> esc_phases = {
422 .duration_cycles = 5000},
425 .duration_cycles = 1000},
429 .accumulator_threshold = 10,
430 .irq_deadline_cycles = 10000,
431 .escalation_phases = esc_phases.data(),
432 .escalation_phases_len = esc_phases.size(),
436 EXPECT_READ32(ALERT_HANDLER_CLASSC_REGWEN_REG_OFFSET, 1);
438 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_CLASSC_PHASE0_CYC_SHADOWED_REG_OFFSET,
439 esc_phases[0].duration_cycles);
440 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_CLASSC_PHASE2_CYC_SHADOWED_REG_OFFSET,
441 esc_phases[1].duration_cycles);
443 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_CLASSC_ACCUM_THRESH_SHADOWED_REG_OFFSET,
446 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_CLASSC_TIMEOUT_CYC_SHADOWED_REG_OFFSET,
449 EXPECT_WRITE32_SHADOWED(
450 ALERT_HANDLER_CLASSC_CRASHDUMP_TRIGGER_SHADOWED_REG_OFFSET, 1);
452 uint32_t ctrl_reg = 0;
454 ALERT_HANDLER_CLASSC_CTRL_SHADOWED_EN_BIT, 1);
456 ctrl_reg, ALERT_HANDLER_CLASSC_CTRL_SHADOWED_LOCK_BIT, 1);
458 ctrl_reg, ALERT_HANDLER_CLASSC_CTRL_SHADOWED_EN_E1_BIT, 1);
460 ctrl_reg, ALERT_HANDLER_CLASSC_CTRL_SHADOWED_EN_E3_BIT, 1);
462 ctrl_reg, ALERT_HANDLER_CLASSC_CTRL_SHADOWED_MAP_E1_FIELD, 0);
464 ctrl_reg, ALERT_HANDLER_CLASSC_CTRL_SHADOWED_MAP_E3_FIELD, 2);
465 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_CLASSC_CTRL_SHADOWED_REG_OFFSET,
468 EXPECT_WRITE32(ALERT_HANDLER_CLASSC_REGWEN_REG_OFFSET, 0);
488 TEST_F(PingTimerConfigTest, TimeoutTooBig) {
489 uint32_t ping_timeout =
490 ALERT_HANDLER_PING_TIMEOUT_CYC_SHADOWED_PING_TIMEOUT_CYC_SHADOWED_MASK +
497 TEST_F(PingTimerConfigTest, Locked) {
498 EXPECT_READ32(ALERT_HANDLER_PING_TIMER_REGWEN_REG_OFFSET, 0);
505 TEST_F(PingTimerConfigTest, ConfigureAndEnable) {
506 uint32_t ping_timeout = 5000;
508 EXPECT_READ32(ALERT_HANDLER_PING_TIMER_REGWEN_REG_OFFSET, 1);
509 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_PING_TIMEOUT_CYC_SHADOWED_REG_OFFSET,
511 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET, 1);
517 TEST_F(PingTimerConfigTest, ConfigureEnableAndLock) {
518 uint32_t ping_timeout = 5000;
520 EXPECT_READ32(ALERT_HANDLER_PING_TIMER_REGWEN_REG_OFFSET, 1);
521 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_PING_TIMEOUT_CYC_SHADOWED_REG_OFFSET,
523 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET, 1);
524 EXPECT_WRITE32(ALERT_HANDLER_PING_TIMER_REGWEN_REG_OFFSET, 0);
540 TEST_F(PingTimerSetEnabledTest, Locked) {
541 EXPECT_READ32(ALERT_HANDLER_PING_TIMER_REGWEN_REG_OFFSET, 0);
548 TEST_F(PingTimerSetEnabledTest, SetEnabled) {
549 EXPECT_READ32(ALERT_HANDLER_PING_TIMER_REGWEN_REG_OFFSET, 1);
550 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET, 1);
556 TEST_F(PingTimerSetEnabledTest, SetEnabledAndLock) {
557 EXPECT_READ32(ALERT_HANDLER_PING_TIMER_REGWEN_REG_OFFSET, 1);
558 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET, 1);
559 EXPECT_WRITE32(ALERT_HANDLER_PING_TIMER_REGWEN_REG_OFFSET, 0);
566 public testing::WithParamInterface<int> {};
570 bool is_locked =
true;
572 ptrdiff_t regwen_offset =
573 ALERT_HANDLER_ALERT_REGWEN_0_REG_OFFSET + alert *
sizeof(uint32_t);
574 EXPECT_READ32(regwen_offset, ALERT_HANDLER_ALERT_REGWEN_0_REG_RESVAL);
577 EXPECT_FALSE(is_locked);
580 EXPECT_READ32(regwen_offset, 0);
583 EXPECT_TRUE(is_locked);
586 INSTANTIATE_TEST_SUITE_P(AllAlertsLockedAndUnlocked, AlertLockTest,
587 testing::Range(0, kAlerts));
589 TEST_P(AlertLockTest, LockAlert) {
592 ptrdiff_t regwen_offset =
593 ALERT_HANDLER_ALERT_REGWEN_0_REG_OFFSET + alert *
sizeof(uint32_t);
594 EXPECT_WRITE32(regwen_offset, 0);
598 INSTANTIATE_TEST_SUITE_P(LockAllAlerts, AlertLockTest,
599 testing::Range(0, kAlerts));
601 TEST_F(AlertLockTest, BadArgs) {
615 public testing::WithParamInterface<dif_alert_handler_local_alert_t> {};
619 bool is_locked =
true;
621 EXPECT_READ32(ALERT_HANDLER_LOC_ALERT_REGWEN_0_REG_OFFSET +
622 static_cast<uint32_t
>(local_alert) *
sizeof(uint32_t),
623 ALERT_HANDLER_LOC_ALERT_REGWEN_0_REG_RESVAL);
625 &alert_handler_, local_alert, &is_locked));
626 EXPECT_FALSE(is_locked);
629 EXPECT_READ32(ALERT_HANDLER_LOC_ALERT_REGWEN_0_REG_OFFSET +
630 static_cast<uint32_t
>(local_alert) *
sizeof(uint32_t),
633 &alert_handler_, local_alert, &is_locked));
634 EXPECT_TRUE(is_locked);
637 INSTANTIATE_TEST_SUITE_P(
638 AllLocalAlertsLockedAndUnlocked, LocalAlertLockTest,
639 testing::Values(kDifAlertHandlerLocalAlertAlertPingFail,
640 kDifAlertHandlerLocalAlertEscalationPingFail,
641 kDifAlertHandlerLocalAlertAlertIntegrityFail,
642 kDifAlertHandlerLocalAlertEscalationIntegrityFail,
643 kDifAlertHandlerLocalAlertBusIntegrityFail,
644 kDifAlertHandlerLocalAlertShadowedUpdateError,
645 kDifAlertHandlerLocalAlertShadowedStorageError));
647 TEST_P(LocalAlertLockTest, LockLocalAlert) {
650 EXPECT_WRITE32(ALERT_HANDLER_LOC_ALERT_REGWEN_0_REG_OFFSET +
651 static_cast<uint32_t
>(local_alert) *
sizeof(uint32_t),
657 INSTANTIATE_TEST_SUITE_P(
658 LockAllLocalAlerts, LocalAlertLockTest,
659 testing::Values(kDifAlertHandlerLocalAlertAlertPingFail,
660 kDifAlertHandlerLocalAlertEscalationPingFail,
661 kDifAlertHandlerLocalAlertAlertIntegrityFail,
662 kDifAlertHandlerLocalAlertEscalationIntegrityFail,
663 kDifAlertHandlerLocalAlertBusIntegrityFail,
664 kDifAlertHandlerLocalAlertShadowedUpdateError,
665 kDifAlertHandlerLocalAlertShadowedStorageError));
667 TEST_F(LocalAlertLockTest, BadArgs) {
670 nullptr, kDifAlertHandlerLocalAlertShadowedStorageError, &is_locked));
675 &alert_handler_, kDifAlertHandlerLocalAlertAlertPingFail,
nullptr));
678 nullptr, kDifAlertHandlerLocalAlertAlertPingFail));
685 public testing::WithParamInterface<
686 std::tuple<dif_alert_handler_class_t, uint32_t>> {};
688 static std::vector<std::tuple<dif_alert_handler_class_t, uint32_t>>
690 std::tuple<dif_alert_handler_class_t, uint32_t>{
691 kDifAlertHandlerClassA, ALERT_HANDLER_CLASSA_REGWEN_REG_OFFSET},
692 std::tuple<dif_alert_handler_class_t, uint32_t>{
693 kDifAlertHandlerClassB, ALERT_HANDLER_CLASSB_REGWEN_REG_OFFSET},
694 std::tuple<dif_alert_handler_class_t, uint32_t>{
695 kDifAlertHandlerClassC, ALERT_HANDLER_CLASSC_REGWEN_REG_OFFSET},
696 std::tuple<dif_alert_handler_class_t, uint32_t>{
697 kDifAlertHandlerClassD, ALERT_HANDLER_CLASSD_REGWEN_REG_OFFSET}};
699 TEST_P(ClassLockTest, IsClassLocked) {
701 uint32_t regwen_offset = std::get<1>(GetParam());
702 bool is_locked =
true;
704 EXPECT_READ32(regwen_offset, ALERT_HANDLER_CLASSA_REGWEN_REG_RESVAL);
707 EXPECT_FALSE(is_locked);
710 EXPECT_READ32(regwen_offset, 0);
713 EXPECT_TRUE(is_locked);
716 INSTANTIATE_TEST_SUITE_P(AllClassesLockedAndUnlocked, ClassLockTest,
717 testing::ValuesIn(class_regwen_pairs));
719 TEST_P(ClassLockTest, LockClass) {
721 uint32_t regwen_offset = std::get<1>(GetParam());
723 EXPECT_WRITE32(regwen_offset, 0);
727 INSTANTIATE_TEST_SUITE_P(LockAllClasses, ClassLockTest,
728 testing::ValuesIn(class_regwen_pairs));
730 TEST_F(ClassLockTest, BadArgs) {
733 nullptr, kDifAlertHandlerClassA, &is_locked));
738 &alert_handler_, kDifAlertHandlerClassD,
nullptr));
751 EXPECT_READ32(ALERT_HANDLER_PING_TIMER_REGWEN_REG_OFFSET, 1);
755 EXPECT_READ32(ALERT_HANDLER_PING_TIMER_REGWEN_REG_OFFSET, 0);
760 TEST_F(PingTimerLockTest, LockPingTimer) {
761 EXPECT_WRITE32(ALERT_HANDLER_PING_TIMER_REGWEN_REG_OFFSET, 0);
765 TEST_F(PingTimerLockTest, NullArgs) {
775 public testing::WithParamInterface<int> {};
781 ptrdiff_t cause_offset =
782 ALERT_HANDLER_ALERT_CAUSE_0_REG_OFFSET + alert *
sizeof(uint32_t);
784 EXPECT_READ32(cause_offset, 0x1);
787 EXPECT_TRUE(is_cause);
789 EXPECT_READ32(cause_offset, 0x0);
792 EXPECT_FALSE(is_cause);
795 INSTANTIATE_TEST_SUITE_P(AllCauses, AlertCauseTest, testing::Range(0, kAlerts));
797 TEST_P(AlertCauseTest, Ack) {
800 ptrdiff_t cause_offset =
801 ALERT_HANDLER_ALERT_CAUSE_0_REG_OFFSET + alert *
sizeof(uint32_t);
802 EXPECT_WRITE32(cause_offset, 0x1);
806 INSTANTIATE_TEST_SUITE_P(AllAcks, AlertCauseTest, testing::Range(0, kAlerts));
808 TEST_F(AlertCauseTest, BadAlert) {
816 TEST_F(AlertCauseTest, NullArgs) {
826 public testing::WithParamInterface<dif_alert_handler_local_alert_t> {};
832 EXPECT_READ32(ALERT_HANDLER_LOC_ALERT_CAUSE_0_REG_OFFSET +
833 static_cast<uint32_t
>(local_alert) *
sizeof(uint32_t),
836 local_alert, &is_cause));
837 EXPECT_TRUE(is_cause);
839 EXPECT_READ32(ALERT_HANDLER_LOC_ALERT_CAUSE_0_REG_OFFSET +
840 static_cast<uint32_t
>(local_alert) *
sizeof(uint32_t),
843 local_alert, &is_cause));
844 EXPECT_FALSE(is_cause);
847 INSTANTIATE_TEST_SUITE_P(
848 AllCauses, LocalAlertCauseTest,
849 testing::Values(kDifAlertHandlerLocalAlertAlertPingFail,
850 kDifAlertHandlerLocalAlertEscalationPingFail,
851 kDifAlertHandlerLocalAlertAlertIntegrityFail,
852 kDifAlertHandlerLocalAlertEscalationIntegrityFail,
853 kDifAlertHandlerLocalAlertBusIntegrityFail,
854 kDifAlertHandlerLocalAlertShadowedUpdateError,
855 kDifAlertHandlerLocalAlertShadowedStorageError));
857 TEST_P(LocalAlertCauseTest, Ack) {
860 EXPECT_WRITE32(ALERT_HANDLER_LOC_ALERT_CAUSE_0_REG_OFFSET +
861 static_cast<uint32_t
>(local_alert) *
sizeof(uint32_t),
867 INSTANTIATE_TEST_SUITE_P(
868 AllAcks, LocalAlertCauseTest,
869 testing::Values(kDifAlertHandlerLocalAlertAlertPingFail,
870 kDifAlertHandlerLocalAlertEscalationPingFail,
871 kDifAlertHandlerLocalAlertAlertIntegrityFail,
872 kDifAlertHandlerLocalAlertEscalationIntegrityFail,
873 kDifAlertHandlerLocalAlertBusIntegrityFail,
874 kDifAlertHandlerLocalAlertShadowedUpdateError,
875 kDifAlertHandlerLocalAlertShadowedStorageError));
877 TEST_F(LocalAlertCauseTest, BadLocalAlert) {
887 TEST_F(LocalAlertCauseTest, NullArgs) {
890 nullptr, kDifAlertHandlerLocalAlertEscalationPingFail, &is_cause));
892 &alert_handler_, kDifAlertHandlerLocalAlertEscalationPingFail,
nullptr));
894 nullptr, kDifAlertHandlerLocalAlertEscalationIntegrityFail));
902 EXPECT_READ32(ALERT_HANDLER_CLASSB_CLR_REGWEN_REG_OFFSET,
true);
904 &alert_handler_, kDifAlertHandlerClassB, &can_clear));
905 EXPECT_TRUE(can_clear);
907 EXPECT_READ32(ALERT_HANDLER_CLASSA_CLR_REGWEN_REG_OFFSET,
false);
909 &alert_handler_, kDifAlertHandlerClassA, &can_clear));
910 EXPECT_FALSE(can_clear);
913 TEST_F(EscalationTest, Disable) {
914 EXPECT_WRITE32(ALERT_HANDLER_CLASSC_CLR_REGWEN_REG_OFFSET, 0);
916 &alert_handler_, kDifAlertHandlerClassC));
919 TEST_F(EscalationTest, Clear) {
920 EXPECT_WRITE32_SHADOWED(ALERT_HANDLER_CLASSD_CLR_SHADOWED_REG_OFFSET,
true);
922 kDifAlertHandlerClassD));
925 TEST_F(EscalationTest, NullArgs) {
929 nullptr, kDifAlertHandlerClassB, &can_clear));
931 &alert_handler_, kDifAlertHandlerClassB,
nullptr));
933 nullptr, kDifAlertHandlerClassC));
942 EXPECT_READ32(ALERT_HANDLER_CLASSB_ACCUM_CNT_REG_OFFSET, 0xaaaa);
944 &alert_handler_, kDifAlertHandlerClassB, &num_alerts));
945 EXPECT_EQ(num_alerts, 0xaaaa);
948 TEST_F(GetterTest, GetCycles) {
950 EXPECT_READ32(ALERT_HANDLER_CLASSD_ESC_CNT_REG_OFFSET, 0xaaaaaaaa);
952 &alert_handler_, kDifAlertHandlerClassD, &cycles));
953 EXPECT_EQ(cycles, 0xaaaaaaaa);
956 TEST_F(GetterTest, GetState) {
959 EXPECT_READ32(ALERT_HANDLER_CLASSC_STATE_REG_OFFSET,
960 ALERT_HANDLER_CLASSA_STATE_CLASSA_STATE_VALUE_TIMEOUT);
962 &alert_handler_, kDifAlertHandlerClassC, &state));
965 EXPECT_READ32(ALERT_HANDLER_CLASSA_STATE_REG_OFFSET,
966 ALERT_HANDLER_CLASSA_STATE_CLASSA_STATE_VALUE_PHASE2);
968 &alert_handler_, kDifAlertHandlerClassA, &state));
972 TEST_F(GetterTest, NullArgs) {
975 nullptr, kDifAlertHandlerClassB, &alerts));
977 &alert_handler_, kDifAlertHandlerClassB,
nullptr));
981 nullptr, kDifAlertHandlerClassB, &cycles));
983 &alert_handler_, kDifAlertHandlerClassB,
nullptr));
987 nullptr, kDifAlertHandlerClassC, &state));
989 &alert_handler_, kDifAlertHandlerClassC,
nullptr));