[alert_handler] Make critical alert handler CSRs shadowed regs
This also aligns the DV environment, the DIF and ROM drivers.
Signed-off-by: Michael Schaffner <msf@opentitan.org>
diff --git a/sw/device/lib/dif/dif_alert_handler.c b/sw/device/lib/dif/dif_alert_handler.c
index 94ec214..840e5d4 100644
--- a/sw/device/lib/dif/dif_alert_handler.c
+++ b/sw/device/lib/dif/dif_alert_handler.c
@@ -50,10 +50,11 @@
return false;
}
- uint32_t enable_reg = mmio_region_read32(handler->params.base_addr,
- ALERT_HANDLER_ALERT_EN_0_REG_OFFSET);
- uint32_t alerts_reg = mmio_region_read32(
- handler->params.base_addr, ALERT_HANDLER_ALERT_CLASS_0_REG_OFFSET);
+ uint32_t enable_reg = mmio_region_read32(
+ handler->params.base_addr, ALERT_HANDLER_ALERT_EN_SHADOWED_0_REG_OFFSET);
+ uint32_t alerts_reg =
+ mmio_region_read32(handler->params.base_addr,
+ ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET);
for (int i = 0; i < class->alerts_len; ++i) {
if (class->alerts[i] >= handler->params.alert_count) {
@@ -67,16 +68,20 @@
uint32_t classification;
switch (class->alert_class) {
case kDifAlertHandlerClassA:
- classification = ALERT_HANDLER_ALERT_CLASS_0_CLASS_A_0_VALUE_CLASSA;
+ classification =
+ ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_VALUE_CLASSA;
break;
case kDifAlertHandlerClassB:
- classification = ALERT_HANDLER_ALERT_CLASS_0_CLASS_A_0_VALUE_CLASSB;
+ classification =
+ ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_VALUE_CLASSB;
break;
case kDifAlertHandlerClassC:
- classification = ALERT_HANDLER_ALERT_CLASS_0_CLASS_A_0_VALUE_CLASSC;
+ classification =
+ ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_VALUE_CLASSC;
break;
case kDifAlertHandlerClassD:
- classification = ALERT_HANDLER_ALERT_CLASS_0_CLASS_A_0_VALUE_CLASSD;
+ classification =
+ ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_VALUE_CLASSD;
break;
default:
return false;
@@ -84,23 +89,25 @@
// TODO: Currently, we assume all fields are of equal width.
// See: #3826
- uint32_t field_width =
- bitfield_popcount32(ALERT_HANDLER_ALERT_CLASS_0_CLASS_A_0_MASK);
+ uint32_t field_width = bitfield_popcount32(
+ ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_MASK);
uint32_t field_offset = field_width * class->alerts[i];
alerts_reg = bitfield_field32_write(
alerts_reg,
(bitfield_field32_t){
- .mask = ALERT_HANDLER_ALERT_CLASS_0_CLASS_A_0_MASK,
+ .mask = ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_MASK,
.index = field_offset,
},
classification);
}
- mmio_region_write32(handler->params.base_addr,
- ALERT_HANDLER_ALERT_EN_0_REG_OFFSET, enable_reg);
- mmio_region_write32(handler->params.base_addr,
- ALERT_HANDLER_ALERT_CLASS_0_REG_OFFSET, alerts_reg);
+ mmio_region_write32_shadowed(handler->params.base_addr,
+ ALERT_HANDLER_ALERT_EN_SHADOWED_0_REG_OFFSET,
+ enable_reg);
+ mmio_region_write32_shadowed(handler->params.base_addr,
+ ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET,
+ alerts_reg);
return true;
}
@@ -116,29 +123,31 @@
return false;
}
- uint32_t enable_reg = mmio_region_read32(
- handler->params.base_addr, ALERT_HANDLER_LOC_ALERT_EN_0_REG_OFFSET);
- uint32_t alerts_reg = mmio_region_read32(
- handler->params.base_addr, ALERT_HANDLER_LOC_ALERT_CLASS_0_REG_OFFSET);
+ uint32_t enable_reg =
+ mmio_region_read32(handler->params.base_addr,
+ ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_0_REG_OFFSET);
+ uint32_t alerts_reg =
+ mmio_region_read32(handler->params.base_addr,
+ ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET);
for (int i = 0; i < class->local_alerts_len; ++i) {
uint32_t classification;
switch (class->alert_class) {
case kDifAlertHandlerClassA:
classification =
- ALERT_HANDLER_LOC_ALERT_CLASS_0_CLASS_LA_0_VALUE_CLASSA;
+ ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_VALUE_CLASSA;
break;
case kDifAlertHandlerClassB:
classification =
- ALERT_HANDLER_LOC_ALERT_CLASS_0_CLASS_LA_0_VALUE_CLASSB;
+ ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_VALUE_CLASSB;
break;
case kDifAlertHandlerClassC:
classification =
- ALERT_HANDLER_LOC_ALERT_CLASS_0_CLASS_LA_0_VALUE_CLASSC;
+ ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_VALUE_CLASSC;
break;
case kDifAlertHandlerClassD:
classification =
- ALERT_HANDLER_LOC_ALERT_CLASS_0_CLASS_LA_0_VALUE_CLASSD;
+ ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_VALUE_CLASSD;
break;
default:
return false;
@@ -148,20 +157,28 @@
bitfield_field32_t field;
switch (class->local_alerts[i]) {
case kDifAlertHandlerLocalAlertAlertPingFail:
- enable_bit = ALERT_HANDLER_LOC_ALERT_EN_0_EN_LA_0_BIT;
- field = ALERT_HANDLER_LOC_ALERT_CLASS_0_CLASS_LA_0_FIELD;
+ enable_bit = ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_0_EN_LA_0_BIT;
+ field = ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_FIELD;
break;
case kDifAlertHandlerLocalAlertEscalationPingFail:
- enable_bit = ALERT_HANDLER_LOC_ALERT_EN_1_EN_LA_1_BIT;
- field = ALERT_HANDLER_LOC_ALERT_CLASS_1_CLASS_LA_1_FIELD;
+ enable_bit = ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_1_EN_LA_1_BIT;
+ field = ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_1_CLASS_LA_1_FIELD;
break;
case kDifAlertHandlerLocalAlertAlertIntegrityFail:
- enable_bit = ALERT_HANDLER_LOC_ALERT_EN_2_EN_LA_2_BIT;
- field = ALERT_HANDLER_LOC_ALERT_CLASS_2_CLASS_LA_2_FIELD;
+ enable_bit = ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_2_EN_LA_2_BIT;
+ field = ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_2_CLASS_LA_2_FIELD;
break;
case kDifAlertHandlerLocalAlertEscalationIntegrityFail:
- enable_bit = ALERT_HANDLER_LOC_ALERT_EN_3_EN_LA_3_BIT;
- field = ALERT_HANDLER_LOC_ALERT_CLASS_3_CLASS_LA_3_FIELD;
+ enable_bit = ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_3_EN_LA_3_BIT;
+ field = ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_3_CLASS_LA_3_FIELD;
+ break;
+ case kDifAlertHandlerLocalAlertShadowedUpdateError:
+ enable_bit = ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_4_EN_LA_4_BIT;
+ field = ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_4_CLASS_LA_4_FIELD;
+ break;
+ case kDifAlertHandlerLocalAlertShadowedStorageError:
+ enable_bit = ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_4_EN_LA_4_BIT;
+ field = ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_4_CLASS_LA_4_FIELD;
break;
default:
return false;
@@ -171,10 +188,12 @@
alerts_reg = bitfield_field32_write(alerts_reg, field, classification);
}
- mmio_region_write32(handler->params.base_addr,
- ALERT_HANDLER_LOC_ALERT_EN_0_REG_OFFSET, enable_reg);
- mmio_region_write32(handler->params.base_addr,
- ALERT_HANDLER_LOC_ALERT_CLASS_0_REG_OFFSET, alerts_reg);
+ mmio_region_write32_shadowed(handler->params.base_addr,
+ ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_0_REG_OFFSET,
+ enable_reg);
+ mmio_region_write32_shadowed(
+ handler->params.base_addr,
+ ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET, alerts_reg);
return true;
}
@@ -207,16 +226,16 @@
ptrdiff_t reg_offset;
switch (class->alert_class) {
case kDifAlertHandlerClassA:
- reg_offset = ALERT_HANDLER_CLASSA_CTRL_REG_OFFSET;
+ reg_offset = ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET;
break;
case kDifAlertHandlerClassB:
- reg_offset = ALERT_HANDLER_CLASSB_CTRL_REG_OFFSET;
+ reg_offset = ALERT_HANDLER_CLASSB_CTRL_SHADOWED_REG_OFFSET;
break;
case kDifAlertHandlerClassC:
- reg_offset = ALERT_HANDLER_CLASSC_CTRL_REG_OFFSET;
+ reg_offset = ALERT_HANDLER_CLASSC_CTRL_SHADOWED_REG_OFFSET;
break;
case kDifAlertHandlerClassD:
- reg_offset = ALERT_HANDLER_CLASSD_CTRL_REG_OFFSET;
+ reg_offset = ALERT_HANDLER_CLASSD_CTRL_SHADOWED_REG_OFFSET;
break;
default:
return false;
@@ -236,16 +255,17 @@
&use_escalation_protocol)) {
return false;
}
- ctrl_reg = bitfield_bit32_write(ctrl_reg, ALERT_HANDLER_CLASSA_CTRL_EN_BIT,
- use_escalation_protocol);
+ ctrl_reg =
+ bitfield_bit32_write(ctrl_reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_BIT,
+ use_escalation_protocol);
// Configure the escalation protocol auto-lock flag.
bool automatic_locking;
if (!toggle_to_bool(class->automatic_locking, &automatic_locking)) {
return false;
}
- ctrl_reg = bitfield_bit32_write(ctrl_reg, ALERT_HANDLER_CLASSA_CTRL_LOCK_BIT,
- automatic_locking);
+ ctrl_reg = bitfield_bit32_write(
+ ctrl_reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_LOCK_BIT, automatic_locking);
if (class->phase_signals == NULL && class->phase_signals_len != 0) {
return false;
@@ -262,20 +282,20 @@
bitfield_field32_t map_field;
switch (class->phase_signals[i].phase) {
case kDifAlertHandlerClassStatePhase0:
- enable_bit = ALERT_HANDLER_CLASSA_CTRL_EN_E0_BIT;
- map_field = ALERT_HANDLER_CLASSA_CTRL_MAP_E0_FIELD;
+ enable_bit = ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E0_BIT;
+ map_field = ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E0_FIELD;
break;
case kDifAlertHandlerClassStatePhase1:
- enable_bit = ALERT_HANDLER_CLASSA_CTRL_EN_E1_BIT;
- map_field = ALERT_HANDLER_CLASSA_CTRL_MAP_E1_FIELD;
+ enable_bit = ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E1_BIT;
+ map_field = ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E1_FIELD;
break;
case kDifAlertHandlerClassStatePhase2:
- enable_bit = ALERT_HANDLER_CLASSA_CTRL_EN_E2_BIT;
- map_field = ALERT_HANDLER_CLASSA_CTRL_MAP_E2_FIELD;
+ enable_bit = ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E2_BIT;
+ map_field = ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E2_FIELD;
break;
case kDifAlertHandlerClassStatePhase3:
- enable_bit = ALERT_HANDLER_CLASSA_CTRL_EN_E3_BIT;
- map_field = ALERT_HANDLER_CLASSA_CTRL_MAP_E3_FIELD;
+ enable_bit = ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E3_BIT;
+ map_field = ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E3_FIELD;
break;
default:
return false;
@@ -286,49 +306,49 @@
class->phase_signals[i].signal);
}
- mmio_region_write32(handler->params.base_addr, reg_offset, ctrl_reg);
+ mmio_region_write32_shadowed(handler->params.base_addr, reg_offset, ctrl_reg);
// Configure the class accumulator threshold.
ptrdiff_t acc_offset;
switch (class->alert_class) {
case kDifAlertHandlerClassA:
- acc_offset = ALERT_HANDLER_CLASSA_ACCUM_THRESH_REG_OFFSET;
+ acc_offset = ALERT_HANDLER_CLASSA_ACCUM_THRESH_SHADOWED_REG_OFFSET;
break;
case kDifAlertHandlerClassB:
- acc_offset = ALERT_HANDLER_CLASSB_ACCUM_THRESH_REG_OFFSET;
+ acc_offset = ALERT_HANDLER_CLASSB_ACCUM_THRESH_SHADOWED_REG_OFFSET;
break;
case kDifAlertHandlerClassC:
- acc_offset = ALERT_HANDLER_CLASSC_ACCUM_THRESH_REG_OFFSET;
+ acc_offset = ALERT_HANDLER_CLASSC_ACCUM_THRESH_SHADOWED_REG_OFFSET;
break;
case kDifAlertHandlerClassD:
- acc_offset = ALERT_HANDLER_CLASSD_ACCUM_THRESH_REG_OFFSET;
+ acc_offset = ALERT_HANDLER_CLASSD_ACCUM_THRESH_SHADOWED_REG_OFFSET;
break;
default:
return false;
}
- mmio_region_write32(handler->params.base_addr, acc_offset,
- class->accumulator_threshold);
+ mmio_region_write32_shadowed(handler->params.base_addr, acc_offset,
+ class->accumulator_threshold);
// Configure the class IRQ deadline.
ptrdiff_t deadline_offset;
switch (class->alert_class) {
case kDifAlertHandlerClassA:
- deadline_offset = ALERT_HANDLER_CLASSA_TIMEOUT_CYC_REG_OFFSET;
+ deadline_offset = ALERT_HANDLER_CLASSA_TIMEOUT_CYC_SHADOWED_REG_OFFSET;
break;
case kDifAlertHandlerClassB:
- deadline_offset = ALERT_HANDLER_CLASSB_TIMEOUT_CYC_REG_OFFSET;
+ deadline_offset = ALERT_HANDLER_CLASSB_TIMEOUT_CYC_SHADOWED_REG_OFFSET;
break;
case kDifAlertHandlerClassC:
- deadline_offset = ALERT_HANDLER_CLASSC_TIMEOUT_CYC_REG_OFFSET;
+ deadline_offset = ALERT_HANDLER_CLASSC_TIMEOUT_CYC_SHADOWED_REG_OFFSET;
break;
case kDifAlertHandlerClassD:
- deadline_offset = ALERT_HANDLER_CLASSD_TIMEOUT_CYC_REG_OFFSET;
+ deadline_offset = ALERT_HANDLER_CLASSD_TIMEOUT_CYC_SHADOWED_REG_OFFSET;
break;
default:
return false;
}
- mmio_region_write32(handler->params.base_addr, deadline_offset,
- class->irq_deadline_cycles);
+ mmio_region_write32_shadowed(handler->params.base_addr, deadline_offset,
+ class->irq_deadline_cycles);
return true;
}
@@ -347,38 +367,37 @@
for (int i = 0; i < class->phase_durations_len; ++i) {
// To save on writing a fairly ridiculous `if` chain, we use a lookup table
// that leverages the numeric values of enum constants.
- static const ptrdiff_t
- kRegOffsets[ALERT_HANDLER_PARAM_N_CLASSES]
- [ALERT_HANDLER_PARAM_N_PHASES] = {
- [kDifAlertHandlerClassA] =
- {
- ALERT_HANDLER_CLASSA_PHASE0_CYC_REG_OFFSET,
- ALERT_HANDLER_CLASSA_PHASE1_CYC_REG_OFFSET,
- ALERT_HANDLER_CLASSA_PHASE2_CYC_REG_OFFSET,
- ALERT_HANDLER_CLASSA_PHASE3_CYC_REG_OFFSET,
- },
- [kDifAlertHandlerClassB] =
- {
- ALERT_HANDLER_CLASSB_PHASE0_CYC_REG_OFFSET,
- ALERT_HANDLER_CLASSB_PHASE1_CYC_REG_OFFSET,
- ALERT_HANDLER_CLASSB_PHASE2_CYC_REG_OFFSET,
- ALERT_HANDLER_CLASSB_PHASE3_CYC_REG_OFFSET,
- },
- [kDifAlertHandlerClassC] =
- {
- ALERT_HANDLER_CLASSC_PHASE0_CYC_REG_OFFSET,
- ALERT_HANDLER_CLASSC_PHASE1_CYC_REG_OFFSET,
- ALERT_HANDLER_CLASSC_PHASE2_CYC_REG_OFFSET,
- ALERT_HANDLER_CLASSC_PHASE3_CYC_REG_OFFSET,
- },
- [kDifAlertHandlerClassD] =
- {
- ALERT_HANDLER_CLASSD_PHASE0_CYC_REG_OFFSET,
- ALERT_HANDLER_CLASSD_PHASE1_CYC_REG_OFFSET,
- ALERT_HANDLER_CLASSD_PHASE2_CYC_REG_OFFSET,
- ALERT_HANDLER_CLASSD_PHASE3_CYC_REG_OFFSET,
- },
- };
+ static const ptrdiff_t kRegOffsets
+ [ALERT_HANDLER_PARAM_N_CLASSES][ALERT_HANDLER_PARAM_N_PHASES] = {
+ [kDifAlertHandlerClassA] =
+ {
+ ALERT_HANDLER_CLASSA_PHASE0_CYC_SHADOWED_REG_OFFSET,
+ ALERT_HANDLER_CLASSA_PHASE1_CYC_SHADOWED_REG_OFFSET,
+ ALERT_HANDLER_CLASSA_PHASE2_CYC_SHADOWED_REG_OFFSET,
+ ALERT_HANDLER_CLASSA_PHASE3_CYC_SHADOWED_REG_OFFSET,
+ },
+ [kDifAlertHandlerClassB] =
+ {
+ ALERT_HANDLER_CLASSB_PHASE0_CYC_SHADOWED_REG_OFFSET,
+ ALERT_HANDLER_CLASSB_PHASE1_CYC_SHADOWED_REG_OFFSET,
+ ALERT_HANDLER_CLASSB_PHASE2_CYC_SHADOWED_REG_OFFSET,
+ ALERT_HANDLER_CLASSB_PHASE3_CYC_SHADOWED_REG_OFFSET,
+ },
+ [kDifAlertHandlerClassC] =
+ {
+ ALERT_HANDLER_CLASSC_PHASE0_CYC_SHADOWED_REG_OFFSET,
+ ALERT_HANDLER_CLASSC_PHASE1_CYC_SHADOWED_REG_OFFSET,
+ ALERT_HANDLER_CLASSC_PHASE2_CYC_SHADOWED_REG_OFFSET,
+ ALERT_HANDLER_CLASSC_PHASE3_CYC_SHADOWED_REG_OFFSET,
+ },
+ [kDifAlertHandlerClassD] =
+ {
+ ALERT_HANDLER_CLASSD_PHASE0_CYC_SHADOWED_REG_OFFSET,
+ ALERT_HANDLER_CLASSD_PHASE1_CYC_SHADOWED_REG_OFFSET,
+ ALERT_HANDLER_CLASSD_PHASE2_CYC_SHADOWED_REG_OFFSET,
+ ALERT_HANDLER_CLASSD_PHASE3_CYC_SHADOWED_REG_OFFSET,
+ },
+ };
if (class->alert_class >= ALERT_HANDLER_PARAM_N_CLASSES) {
return false;
@@ -394,8 +413,8 @@
kRegOffsets[class->alert_class]
[phase - kDifAlertHandlerClassStatePhase0];
- mmio_region_write32(handler->params.base_addr, reg_offset,
- class->phase_durations[i].cycles);
+ mmio_region_write32_shadowed(handler->params.base_addr, reg_offset,
+ class->phase_durations[i].cycles);
}
return true;
@@ -409,7 +428,7 @@
// Check that the provided ping timeout actually fits in the timeout register,
// which is smaller than a native word length.
if (config.ping_timeout >
- ALERT_HANDLER_PING_TIMEOUT_CYC_PING_TIMEOUT_CYC_MASK) {
+ ALERT_HANDLER_PING_TIMEOUT_CYC_SHADOWED_PING_TIMEOUT_CYC_SHADOWED_MASK) {
return kDifAlertHandlerConfigBadArg;
}
if (config.classes == NULL && config.classes_len != 0) {
@@ -442,11 +461,12 @@
}
uint32_t ping_timeout_reg = bitfield_field32_write(
- 0, ALERT_HANDLER_PING_TIMEOUT_CYC_PING_TIMEOUT_CYC_FIELD,
+ 0,
+ ALERT_HANDLER_PING_TIMEOUT_CYC_SHADOWED_PING_TIMEOUT_CYC_SHADOWED_FIELD,
config.ping_timeout);
- mmio_region_write32(handler->params.base_addr,
- ALERT_HANDLER_PING_TIMEOUT_CYC_REG_OFFSET,
- ping_timeout_reg);
+ mmio_region_write32_shadowed(
+ handler->params.base_addr,
+ ALERT_HANDLER_PING_TIMEOUT_CYC_SHADOWED_REG_OFFSET, ping_timeout_reg);
return kDifAlertHandlerConfigOk;
}
@@ -458,9 +478,10 @@
}
uint32_t reg = bitfield_bit32_write(
- 1, ALERT_HANDLER_PING_TIMER_EN_PING_TIMER_EN_BIT, true);
- mmio_region_write32(handler->params.base_addr,
- ALERT_HANDLER_PING_TIMER_EN_REG_OFFSET, reg);
+ 1, ALERT_HANDLER_PING_TIMER_EN_SHADOWED_PING_TIMER_EN_SHADOWED_BIT, true);
+ mmio_region_write32_shadowed(handler->params.base_addr,
+ ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET,
+ reg);
return kDifAlertHandlerOk;
}
@@ -471,10 +492,11 @@
return kDifAlertHandlerBadArg;
}
- uint32_t reg = mmio_region_read32(handler->params.base_addr,
- ALERT_HANDLER_PING_TIMER_EN_REG_OFFSET);
- *is_locked =
- bitfield_bit32_read(reg, ALERT_HANDLER_PING_TIMER_EN_PING_TIMER_EN_BIT);
+ uint32_t reg =
+ mmio_region_read32(handler->params.base_addr,
+ ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET);
+ *is_locked = bitfield_bit32_read(
+ reg, ALERT_HANDLER_PING_TIMER_EN_SHADOWED_PING_TIMER_EN_SHADOWED_BIT);
return kDifAlertHandlerOk;
}
@@ -679,6 +701,12 @@
case kDifAlertHandlerLocalAlertEscalationIntegrityFail:
*index = ALERT_HANDLER_LOC_ALERT_CAUSE_3_LA_3_BIT;
break;
+ case kDifAlertHandlerLocalAlertShadowedUpdateError:
+ *index = ALERT_HANDLER_LOC_ALERT_CAUSE_4_LA_4_BIT;
+ break;
+ case kDifAlertHandlerLocalAlertShadowedStorageError:
+ *index = ALERT_HANDLER_LOC_ALERT_CAUSE_5_LA_5_BIT;
+ break;
default:
return false;
}
diff --git a/sw/device/lib/dif/dif_alert_handler.h b/sw/device/lib/dif/dif_alert_handler.h
index 3cec0a9..8079a0b 100644
--- a/sw/device/lib/dif/dif_alert_handler.h
+++ b/sw/device/lib/dif/dif_alert_handler.h
@@ -186,6 +186,8 @@
kDifAlertHandlerLocalAlertEscalationPingFail,
kDifAlertHandlerLocalAlertAlertIntegrityFail,
kDifAlertHandlerLocalAlertEscalationIntegrityFail,
+ kDifAlertHandlerLocalAlertShadowedUpdateError,
+ kDifAlertHandlerLocalAlertShadowedStorageError,
} dif_alert_handler_local_alert_t;
/**
diff --git a/sw/device/lib/dif/dif_alert_handler_unittest.cc b/sw/device/lib/dif/dif_alert_handler_unittest.cc
index e342389..a352dd6 100644
--- a/sw/device/lib/dif/dif_alert_handler_unittest.cc
+++ b/sw/device/lib/dif/dif_alert_handler_unittest.cc
@@ -98,7 +98,7 @@
.ping_timeout = 0,
};
- EXPECT_READ32(ALERT_HANDLER_PING_TIMER_EN_REG_OFFSET, 1);
+ EXPECT_READ32(ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET, 1);
EXPECT_EQ(dif_alert_handler_configure(&handler_, config),
kDifAlertHandlerConfigLocked);
@@ -109,12 +109,15 @@
.ping_timeout = 50,
};
- EXPECT_READ32(ALERT_HANDLER_PING_TIMER_EN_REG_OFFSET,
- {{ALERT_HANDLER_PING_TIMER_EN_PING_TIMER_EN_BIT, false}});
+ EXPECT_READ32(
+ ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET,
+ {{ALERT_HANDLER_PING_TIMER_EN_SHADOWED_PING_TIMER_EN_SHADOWED_BIT,
+ false}});
- EXPECT_WRITE32(
- ALERT_HANDLER_PING_TIMEOUT_CYC_REG_OFFSET,
- {{ALERT_HANDLER_PING_TIMEOUT_CYC_PING_TIMEOUT_CYC_OFFSET, 50}});
+ EXPECT_WRITE32_SHADOWED(
+ ALERT_HANDLER_PING_TIMEOUT_CYC_SHADOWED_REG_OFFSET,
+ {{ALERT_HANDLER_PING_TIMEOUT_CYC_SHADOWED_PING_TIMEOUT_CYC_SHADOWED_OFFSET,
+ 50}});
EXPECT_EQ(dif_alert_handler_configure(&handler_, config),
kDifAlertHandlerConfigOk);
@@ -122,7 +125,9 @@
TEST_F(ConfigTest, TimeoutTooBig) {
dif_alert_handler_config_t config = {
- .ping_timeout = ALERT_HANDLER_PING_TIMEOUT_CYC_PING_TIMEOUT_CYC_MASK + 1,
+ .ping_timeout =
+ ALERT_HANDLER_PING_TIMEOUT_CYC_SHADOWED_PING_TIMEOUT_CYC_SHADOWED_MASK +
+ 1,
};
EXPECT_EQ(dif_alert_handler_configure(&handler_, config),
@@ -207,8 +212,9 @@
// .classes_len = classes.size(),
// };
-// EXPECT_READ32(ALERT_HANDLER_PING_TIMER_EN_REG_OFFSET,
-// {{ALERT_HANDLER_PING_TIMER_EN_PING_TIMER_EN_BIT, true}});
+// EXPECT_READ32(ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET,
+// {{ALERT_HANDLER_PING_TIMER_EN_SHADOWED_PING_TIMER_EN_SHADOWED_BIT,
+// true}});
// // Unfortunately, we can't use EXPECT_MASK for these reads and writes,
// // since there are not sequenced exactly.
@@ -318,8 +324,9 @@
// EXPECT_WRITE32(ALERT_HANDLER_CLASSB_PHASE3_CYC_REG_OFFSET, 150000);
// EXPECT_WRITE32(
-// ALERT_HANDLER_PING_TIMEOUT_CYC_REG_OFFSET,
-// {{ALERT_HANDLER_PING_TIMEOUT_CYC_PING_TIMEOUT_CYC_OFFSET, 50}});
+// ALERT_HANDLER_PING_TIMEOUT_CYC_SHADOWED_REG_OFFSET,
+// {{ALERT_HANDLER_PING_TIMEOUT_CYC_SHADOWED_PING_TIMEOUT_CYC_SHADOWED_OFFSET,
+// 50}});
// EXPECT_EQ(dif_alert_handler_configure(&handler_, config),
// kDifAlertHandlerConfigOk);
@@ -571,20 +578,26 @@
TEST_F(LockTest, IsLocked) {
bool flag;
- EXPECT_READ32(ALERT_HANDLER_PING_TIMER_EN_REG_OFFSET,
- {{ALERT_HANDLER_PING_TIMER_EN_PING_TIMER_EN_BIT, false}});
+ EXPECT_READ32(
+ ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET,
+ {{ALERT_HANDLER_PING_TIMER_EN_SHADOWED_PING_TIMER_EN_SHADOWED_BIT,
+ false}});
EXPECT_EQ(dif_alert_handler_is_locked(&handler_, &flag), kDifAlertHandlerOk);
EXPECT_FALSE(flag);
- EXPECT_READ32(ALERT_HANDLER_PING_TIMER_EN_REG_OFFSET,
- {{ALERT_HANDLER_PING_TIMER_EN_PING_TIMER_EN_BIT, true}});
+ EXPECT_READ32(
+ ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET,
+ {{ALERT_HANDLER_PING_TIMER_EN_SHADOWED_PING_TIMER_EN_SHADOWED_BIT,
+ true}});
EXPECT_EQ(dif_alert_handler_is_locked(&handler_, &flag), kDifAlertHandlerOk);
EXPECT_TRUE(flag);
}
TEST_F(LockTest, Lock) {
- EXPECT_WRITE32(ALERT_HANDLER_PING_TIMER_EN_REG_OFFSET,
- {{ALERT_HANDLER_PING_TIMER_EN_PING_TIMER_EN_BIT, true}});
+ EXPECT_WRITE32_SHADOWED(
+ ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET,
+ {{ALERT_HANDLER_PING_TIMER_EN_SHADOWED_PING_TIMER_EN_SHADOWED_BIT,
+ true}});
EXPECT_EQ(dif_alert_handler_lock(&handler_), kDifAlertHandlerOk);
}
diff --git a/sw/device/silicon_creator/lib/drivers/alert.c b/sw/device/silicon_creator/lib/drivers/alert.c
index 0ff4881..63aa050 100644
--- a/sw/device/silicon_creator/lib/drivers/alert.c
+++ b/sw/device/silicon_creator/lib/drivers/alert.c
@@ -17,27 +17,31 @@
rom_error_t alert_configure(size_t index, alert_class_t cls,
alert_enable_t enabled) {
- if (index >= ALERT_HANDLER_ALERT_CLASS_MULTIREG_COUNT) {
+ if (index >= ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT) {
return kErrorAlertBadIndex;
}
index *= 4;
switch (cls) {
case kAlertClassA:
- abs_mmio_write32(kBase + ALERT_HANDLER_ALERT_CLASS_0_REG_OFFSET + index,
- ALERT_HANDLER_ALERT_CLASS_0_CLASS_A_0_VALUE_CLASSA);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
+ ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_VALUE_CLASSA);
break;
case kAlertClassB:
- abs_mmio_write32(kBase + ALERT_HANDLER_ALERT_CLASS_0_REG_OFFSET + index,
- ALERT_HANDLER_ALERT_CLASS_0_CLASS_A_0_VALUE_CLASSB);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
+ ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_VALUE_CLASSB);
break;
case kAlertClassC:
- abs_mmio_write32(kBase + ALERT_HANDLER_ALERT_CLASS_0_REG_OFFSET + index,
- ALERT_HANDLER_ALERT_CLASS_0_CLASS_A_0_VALUE_CLASSC);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
+ ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_VALUE_CLASSC);
break;
case kAlertClassD:
- abs_mmio_write32(kBase + ALERT_HANDLER_ALERT_CLASS_0_REG_OFFSET + index,
- ALERT_HANDLER_ALERT_CLASS_0_CLASS_A_0_VALUE_CLASSD);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
+ ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_VALUE_CLASSD);
break;
case kAlertClassX:
return kErrorOk;
@@ -50,12 +54,14 @@
break;
case kAlertEnableLocked:
// Enable, then lock.
- abs_mmio_write32(kBase + ALERT_HANDLER_ALERT_EN_0_REG_OFFSET + index, 1);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_ALERT_EN_SHADOWED_0_REG_OFFSET + index, 1);
abs_mmio_write32(kBase + ALERT_HANDLER_ALERT_REGWEN_0_REG_OFFSET + index,
0);
break;
case kAlertEnableEnabled:
- abs_mmio_write32(kBase + ALERT_HANDLER_ALERT_EN_0_REG_OFFSET + index, 1);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_ALERT_EN_SHADOWED_0_REG_OFFSET + index, 1);
break;
default:
return kErrorAlertBadEnable;
@@ -66,31 +72,31 @@
rom_error_t alert_local_configure(size_t index, alert_class_t cls,
alert_enable_t enabled) {
- if (index >= ALERT_HANDLER_LOC_ALERT_CLASS_MULTIREG_COUNT) {
+ if (index >= ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT) {
return kErrorAlertBadIndex;
}
index *= 4;
switch (cls) {
case kAlertClassA:
- abs_mmio_write32(
- kBase + ALERT_HANDLER_LOC_ALERT_CLASS_0_REG_OFFSET + index,
- ALERT_HANDLER_LOC_ALERT_CLASS_0_CLASS_LA_0_VALUE_CLASSA);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
+ ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_VALUE_CLASSA);
break;
case kAlertClassB:
- abs_mmio_write32(
- kBase + ALERT_HANDLER_LOC_ALERT_CLASS_0_REG_OFFSET + index,
- ALERT_HANDLER_LOC_ALERT_CLASS_0_CLASS_LA_0_VALUE_CLASSB);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
+ ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_VALUE_CLASSB);
break;
case kAlertClassC:
- abs_mmio_write32(
- kBase + ALERT_HANDLER_LOC_ALERT_CLASS_0_REG_OFFSET + index,
- ALERT_HANDLER_LOC_ALERT_CLASS_0_CLASS_LA_0_VALUE_CLASSC);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
+ ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_VALUE_CLASSC);
break;
case kAlertClassD:
- abs_mmio_write32(
- kBase + ALERT_HANDLER_LOC_ALERT_CLASS_0_REG_OFFSET + index,
- ALERT_HANDLER_LOC_ALERT_CLASS_0_CLASS_LA_0_VALUE_CLASSD);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
+ ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_VALUE_CLASSD);
break;
case kAlertClassX:
return kErrorOk;
@@ -103,14 +109,14 @@
break;
case kAlertEnableLocked:
// Enable, then lock.
- abs_mmio_write32(kBase + ALERT_HANDLER_LOC_ALERT_EN_0_REG_OFFSET + index,
- 1);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_0_REG_OFFSET + index, 1);
abs_mmio_write32(
kBase + ALERT_HANDLER_LOC_ALERT_REGWEN_0_REG_OFFSET + index, 0);
break;
case kAlertEnableEnabled:
- abs_mmio_write32(kBase + ALERT_HANDLER_LOC_ALERT_EN_0_REG_OFFSET + index,
- 1);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_0_REG_OFFSET + index, 1);
break;
default:
return kErrorAlertBadEnable;
@@ -125,30 +131,34 @@
uint32_t reg = 0;
// Each escalation signal should be asserted in its corresponding phase.
- reg = bitfield_field32_write(reg, ALERT_HANDLER_CLASSA_CTRL_MAP_E0_FIELD, 0);
- reg = bitfield_field32_write(reg, ALERT_HANDLER_CLASSA_CTRL_MAP_E1_FIELD, 1);
- reg = bitfield_field32_write(reg, ALERT_HANDLER_CLASSA_CTRL_MAP_E2_FIELD, 2);
- reg = bitfield_field32_write(reg, ALERT_HANDLER_CLASSA_CTRL_MAP_E3_FIELD, 3);
+ reg = bitfield_field32_write(
+ reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E0_FIELD, 0);
+ reg = bitfield_field32_write(
+ reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E1_FIELD, 1);
+ reg = bitfield_field32_write(
+ reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E2_FIELD, 2);
+ reg = bitfield_field32_write(
+ reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E3_FIELD, 3);
// All of the alert class register blocks are identical but at different
// offsets. We'll treat everything like Class A, but add in the offset
// to the other classes.
switch (cls) {
case kAlertClassA:
- offset = ALERT_HANDLER_CLASSA_CTRL_REG_OFFSET -
- ALERT_HANDLER_CLASSA_CTRL_REG_OFFSET;
+ offset = ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET -
+ ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET;
break;
case kAlertClassB:
- offset = ALERT_HANDLER_CLASSB_CTRL_REG_OFFSET -
- ALERT_HANDLER_CLASSA_CTRL_REG_OFFSET;
+ offset = ALERT_HANDLER_CLASSB_CTRL_SHADOWED_REG_OFFSET -
+ ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET;
break;
case kAlertClassC:
- offset = ALERT_HANDLER_CLASSC_CTRL_REG_OFFSET -
- ALERT_HANDLER_CLASSA_CTRL_REG_OFFSET;
+ offset = ALERT_HANDLER_CLASSC_CTRL_SHADOWED_REG_OFFSET -
+ ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET;
break;
case kAlertClassD:
- offset = ALERT_HANDLER_CLASSD_CTRL_REG_OFFSET -
- ALERT_HANDLER_CLASSA_CTRL_REG_OFFSET;
+ offset = ALERT_HANDLER_CLASSD_CTRL_SHADOWED_REG_OFFSET -
+ ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET;
break;
case kAlertClassX:
default:
@@ -156,10 +166,12 @@
}
switch (config->enabled) {
case kAlertEnableLocked:
- reg = bitfield_bit32_write(reg, ALERT_HANDLER_CLASSA_CTRL_LOCK_BIT, true);
+ reg = bitfield_bit32_write(
+ reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_LOCK_BIT, true);
FALLTHROUGH_INTENDED;
case kAlertEnableEnabled:
- reg = bitfield_bit32_write(reg, ALERT_HANDLER_CLASSA_CTRL_EN_BIT, true);
+ reg = bitfield_bit32_write(reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_BIT,
+ true);
FALLTHROUGH_INTENDED;
case kAlertEnableNone:
break;
@@ -168,20 +180,20 @@
}
switch (config->escalation) {
case kAlertEscalatePhase3:
- reg =
- bitfield_bit32_write(reg, ALERT_HANDLER_CLASSA_CTRL_EN_E3_BIT, true);
+ reg = bitfield_bit32_write(
+ reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E3_BIT, true);
FALLTHROUGH_INTENDED;
case kAlertEscalatePhase2:
- reg =
- bitfield_bit32_write(reg, ALERT_HANDLER_CLASSA_CTRL_EN_E2_BIT, true);
+ reg = bitfield_bit32_write(
+ reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E2_BIT, true);
FALLTHROUGH_INTENDED;
case kAlertEscalatePhase1:
- reg =
- bitfield_bit32_write(reg, ALERT_HANDLER_CLASSA_CTRL_EN_E1_BIT, true);
+ reg = bitfield_bit32_write(
+ reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E1_BIT, true);
FALLTHROUGH_INTENDED;
case kAlertEscalatePhase0:
- reg =
- bitfield_bit32_write(reg, ALERT_HANDLER_CLASSA_CTRL_EN_E0_BIT, true);
+ reg = bitfield_bit32_write(
+ reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E0_BIT, true);
FALLTHROUGH_INTENDED;
case kAlertEscalateNone:
break;
@@ -189,15 +201,18 @@
return kErrorAlertBadEscalation;
}
- abs_mmio_write32(kBase + ALERT_HANDLER_CLASSA_CTRL_REG_OFFSET + offset, reg);
- abs_mmio_write32(
- kBase + ALERT_HANDLER_CLASSA_ACCUM_THRESH_REG_OFFSET + offset,
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET + offset, reg);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_CLASSA_ACCUM_THRESH_SHADOWED_REG_OFFSET + offset,
config->accum_threshold);
- abs_mmio_write32(kBase + ALERT_HANDLER_CLASSA_TIMEOUT_CYC_REG_OFFSET + offset,
- config->timeout_cycles);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_CLASSA_TIMEOUT_CYC_SHADOWED_REG_OFFSET + offset,
+ config->timeout_cycles);
for (size_t i = 0; i < 4; ++i) {
- abs_mmio_write32(
- kBase + ALERT_HANDLER_CLASSA_PHASE0_CYC_REG_OFFSET + offset + i * 4,
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_CLASSA_PHASE0_CYC_SHADOWED_REG_OFFSET + offset +
+ i * 4,
config->phase_cycles[i]);
}
if (config->enabled == kAlertEnableLocked) {
@@ -210,7 +225,8 @@
rom_error_t alert_ping_enable(void) {
// Enable the ping timer, then lock it.
- abs_mmio_write32(kBase + ALERT_HANDLER_PING_TIMER_EN_REG_OFFSET, 1);
+ abs_mmio_write32_shadowed(
+ kBase + ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET, 1);
abs_mmio_write32(kBase + ALERT_HANDLER_PING_TIMER_REGWEN_REG_OFFSET, 0);
return kErrorOk;
}
diff --git a/sw/device/silicon_creator/lib/drivers/alert_unittest.cc b/sw/device/silicon_creator/lib/drivers/alert_unittest.cc
index 0f37e9c..64607cb 100644
--- a/sw/device/silicon_creator/lib/drivers/alert_unittest.cc
+++ b/sw/device/silicon_creator/lib/drivers/alert_unittest.cc
@@ -23,7 +23,7 @@
class InitTest : public AlertTest {};
TEST_F(InitTest, AlertConfigureAlertBadIndex) {
- EXPECT_EQ(alert_configure(ALERT_HANDLER_ALERT_CLASS_MULTIREG_COUNT,
+ EXPECT_EQ(alert_configure(ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT,
kAlertClassA, kAlertEnableNone),
kErrorAlertBadIndex);
}
@@ -36,7 +36,8 @@
TEST_F(InitTest, AlertConfigureAlertBadEnable) {
// We expect the alert to get configured as class A, but then to
// experience an error when evaluating the enable parameter.
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_ALERT_CLASS_0_REG_OFFSET, 0);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET, 0);
EXPECT_EQ(alert_configure(0, kAlertClassA, (alert_enable_t)-1),
kErrorAlertBadEnable);
}
@@ -50,58 +51,70 @@
}
TEST_F(InitTest, AlertConfigure0AsClassA) {
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_ALERT_CLASS_0_REG_OFFSET, 0);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_ALERT_EN_0_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET, 0);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_ALERT_EN_SHADOWED_0_REG_OFFSET, 1);
EXPECT_EQ(alert_configure(0, kAlertClassA, kAlertEnableEnabled), kErrorOk);
}
TEST_F(InitTest, LocalAlertConfigure0AsClassA) {
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_LOC_ALERT_CLASS_0_REG_OFFSET,
- 0);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_LOC_ALERT_EN_0_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET, 0);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_0_REG_OFFSET, 1);
EXPECT_EQ(alert_local_configure(0, kAlertClassA, kAlertEnableEnabled),
kErrorOk);
}
TEST_F(InitTest, AlertConfigure1AsClassB) {
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_ALERT_CLASS_1_REG_OFFSET, 1);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_ALERT_EN_1_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_ALERT_CLASS_SHADOWED_1_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_ALERT_EN_SHADOWED_1_REG_OFFSET, 1);
EXPECT_EQ(alert_configure(1, kAlertClassB, kAlertEnableEnabled), kErrorOk);
}
TEST_F(InitTest, LocalAlertConfigure1AsClassB) {
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_LOC_ALERT_CLASS_1_REG_OFFSET,
- 1);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_LOC_ALERT_EN_1_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_1_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_1_REG_OFFSET, 1);
EXPECT_EQ(alert_local_configure(1, kAlertClassB, kAlertEnableEnabled),
kErrorOk);
}
TEST_F(InitTest, AlertConfigure2AsClassC) {
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_ALERT_CLASS_2_REG_OFFSET, 2);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_ALERT_EN_2_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_ALERT_CLASS_SHADOWED_2_REG_OFFSET, 2);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_ALERT_EN_SHADOWED_2_REG_OFFSET, 1);
EXPECT_EQ(alert_configure(2, kAlertClassC, kAlertEnableEnabled), kErrorOk);
}
TEST_F(InitTest, LocalAlertConfigure2AsClassC) {
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_LOC_ALERT_CLASS_2_REG_OFFSET,
- 2);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_LOC_ALERT_EN_2_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_2_REG_OFFSET, 2);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_2_REG_OFFSET, 1);
EXPECT_EQ(alert_local_configure(2, kAlertClassC, kAlertEnableEnabled),
kErrorOk);
}
TEST_F(InitTest, AlertConfigure3AsClassDLocked) {
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_ALERT_CLASS_3_REG_OFFSET, 3);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_ALERT_EN_3_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_ALERT_CLASS_SHADOWED_3_REG_OFFSET, 3);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_ALERT_EN_SHADOWED_3_REG_OFFSET, 1);
EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_ALERT_REGWEN_3_REG_OFFSET, 0);
EXPECT_EQ(alert_configure(3, kAlertClassD, kAlertEnableLocked), kErrorOk);
}
TEST_F(InitTest, LocalAlertConfigure3AsClassDLocked) {
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_LOC_ALERT_CLASS_3_REG_OFFSET,
- 3);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_LOC_ALERT_EN_3_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_3_REG_OFFSET, 3);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_3_REG_OFFSET, 1);
EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_LOC_ALERT_REGWEN_3_REG_OFFSET,
0);
EXPECT_EQ(alert_local_configure(3, kAlertClassD, kAlertEnableLocked),
@@ -121,31 +134,32 @@
.timeout_cycles = 2,
.phase_cycles = {1, 10, 100, 1000},
};
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSA_CTRL_REG_OFFSET,
- {
- {ALERT_HANDLER_CLASSA_CTRL_EN_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_LOCK_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E3_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E2_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E1_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E0_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E0_OFFSET, 0},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E1_OFFSET, 1},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E2_OFFSET, 2},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E3_OFFSET, 3},
- });
- EXPECT_ABS_WRITE32(mmio_,
- base_ + ALERT_HANDLER_CLASSA_ACCUM_THRESH_REG_OFFSET, 1);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSA_TIMEOUT_CYC_REG_OFFSET,
- 2);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSA_PHASE0_CYC_REG_OFFSET,
- 1);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSA_PHASE1_CYC_REG_OFFSET,
- 10);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSA_PHASE2_CYC_REG_OFFSET,
- 100);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSA_PHASE3_CYC_REG_OFFSET,
- 1000);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET,
+ {
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_LOCK_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E3_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E2_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E1_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E0_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E0_OFFSET, 0},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E1_OFFSET, 1},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E2_OFFSET, 2},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E3_OFFSET, 3},
+ });
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSA_ACCUM_THRESH_SHADOWED_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSA_TIMEOUT_CYC_SHADOWED_REG_OFFSET, 2);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSA_PHASE0_CYC_SHADOWED_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSA_PHASE1_CYC_SHADOWED_REG_OFFSET, 10);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSA_PHASE2_CYC_SHADOWED_REG_OFFSET, 100);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSA_PHASE3_CYC_SHADOWED_REG_OFFSET, 1000);
EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSA_REGWEN_REG_OFFSET, 0);
EXPECT_EQ(alert_class_configure(kAlertClassA, &config), kErrorOk);
}
@@ -158,31 +172,32 @@
.timeout_cycles = 2,
.phase_cycles = {1, 10, 100, 1000},
};
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSB_CTRL_REG_OFFSET,
- {
- {ALERT_HANDLER_CLASSA_CTRL_EN_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_LOCK_BIT, false},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E3_BIT, false},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E2_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E1_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E0_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E0_OFFSET, 0},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E1_OFFSET, 1},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E2_OFFSET, 2},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E3_OFFSET, 3},
- });
- EXPECT_ABS_WRITE32(mmio_,
- base_ + ALERT_HANDLER_CLASSB_ACCUM_THRESH_REG_OFFSET, 1);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSB_TIMEOUT_CYC_REG_OFFSET,
- 2);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSB_PHASE0_CYC_REG_OFFSET,
- 1);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSB_PHASE1_CYC_REG_OFFSET,
- 10);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSB_PHASE2_CYC_REG_OFFSET,
- 100);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSB_PHASE3_CYC_REG_OFFSET,
- 1000);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSB_CTRL_SHADOWED_REG_OFFSET,
+ {
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_LOCK_BIT, false},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E3_BIT, false},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E2_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E1_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E0_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E0_OFFSET, 0},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E1_OFFSET, 1},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E2_OFFSET, 2},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E3_OFFSET, 3},
+ });
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSB_ACCUM_THRESH_SHADOWED_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSB_TIMEOUT_CYC_SHADOWED_REG_OFFSET, 2);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSB_PHASE0_CYC_SHADOWED_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSB_PHASE1_CYC_SHADOWED_REG_OFFSET, 10);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSB_PHASE2_CYC_SHADOWED_REG_OFFSET, 100);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSB_PHASE3_CYC_SHADOWED_REG_OFFSET, 1000);
EXPECT_EQ(alert_class_configure(kAlertClassB, &config), kErrorOk);
}
@@ -194,31 +209,32 @@
.timeout_cycles = 2,
.phase_cycles = {1, 10, 100, 1000},
};
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSC_CTRL_REG_OFFSET,
- {
- {ALERT_HANDLER_CLASSA_CTRL_EN_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_LOCK_BIT, false},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E3_BIT, false},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E2_BIT, false},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E1_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E0_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E0_OFFSET, 0},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E1_OFFSET, 1},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E2_OFFSET, 2},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E3_OFFSET, 3},
- });
- EXPECT_ABS_WRITE32(mmio_,
- base_ + ALERT_HANDLER_CLASSC_ACCUM_THRESH_REG_OFFSET, 1);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSC_TIMEOUT_CYC_REG_OFFSET,
- 2);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSC_PHASE0_CYC_REG_OFFSET,
- 1);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSC_PHASE1_CYC_REG_OFFSET,
- 10);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSC_PHASE2_CYC_REG_OFFSET,
- 100);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSC_PHASE3_CYC_REG_OFFSET,
- 1000);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSC_CTRL_SHADOWED_REG_OFFSET,
+ {
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_LOCK_BIT, false},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E3_BIT, false},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E2_BIT, false},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E1_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E0_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E0_OFFSET, 0},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E1_OFFSET, 1},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E2_OFFSET, 2},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E3_OFFSET, 3},
+ });
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSC_ACCUM_THRESH_SHADOWED_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSC_TIMEOUT_CYC_SHADOWED_REG_OFFSET, 2);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSC_PHASE0_CYC_SHADOWED_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSC_PHASE1_CYC_SHADOWED_REG_OFFSET, 10);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSC_PHASE2_CYC_SHADOWED_REG_OFFSET, 100);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSC_PHASE3_CYC_SHADOWED_REG_OFFSET, 1000);
EXPECT_EQ(alert_class_configure(kAlertClassC, &config), kErrorOk);
}
@@ -230,31 +246,32 @@
.timeout_cycles = 2,
.phase_cycles = {1, 10, 100, 1000},
};
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSD_CTRL_REG_OFFSET,
- {
- {ALERT_HANDLER_CLASSA_CTRL_EN_BIT, true},
- {ALERT_HANDLER_CLASSA_CTRL_LOCK_BIT, false},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E3_BIT, false},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E2_BIT, false},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E1_BIT, false},
- {ALERT_HANDLER_CLASSA_CTRL_EN_E0_BIT, false},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E0_OFFSET, 0},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E1_OFFSET, 1},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E2_OFFSET, 2},
- {ALERT_HANDLER_CLASSA_CTRL_MAP_E3_OFFSET, 3},
- });
- EXPECT_ABS_WRITE32(mmio_,
- base_ + ALERT_HANDLER_CLASSD_ACCUM_THRESH_REG_OFFSET, 1);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSD_TIMEOUT_CYC_REG_OFFSET,
- 2);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSD_PHASE0_CYC_REG_OFFSET,
- 1);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSD_PHASE1_CYC_REG_OFFSET,
- 10);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSD_PHASE2_CYC_REG_OFFSET,
- 100);
- EXPECT_ABS_WRITE32(mmio_, base_ + ALERT_HANDLER_CLASSD_PHASE3_CYC_REG_OFFSET,
- 1000);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSD_CTRL_SHADOWED_REG_OFFSET,
+ {
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_BIT, true},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_LOCK_BIT, false},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E3_BIT, false},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E2_BIT, false},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E1_BIT, false},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E0_BIT, false},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E0_OFFSET, 0},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E1_OFFSET, 1},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E2_OFFSET, 2},
+ {ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E3_OFFSET, 3},
+ });
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSD_ACCUM_THRESH_SHADOWED_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSD_TIMEOUT_CYC_SHADOWED_REG_OFFSET, 2);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSD_PHASE0_CYC_SHADOWED_REG_OFFSET, 1);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSD_PHASE1_CYC_SHADOWED_REG_OFFSET, 10);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSD_PHASE2_CYC_SHADOWED_REG_OFFSET, 100);
+ EXPECT_ABS_WRITE32_SHADOWED(
+ mmio_, base_ + ALERT_HANDLER_CLASSD_PHASE3_CYC_SHADOWED_REG_OFFSET, 1000);
EXPECT_EQ(alert_class_configure(kAlertClassD, &config), kErrorOk);
}
diff --git a/sw/device/silicon_creator/lib/shutdown.c b/sw/device/silicon_creator/lib/shutdown.c
index c27df60..afe77a2 100644
--- a/sw/device/silicon_creator/lib/shutdown.c
+++ b/sw/device/silicon_creator/lib/shutdown.c
@@ -22,7 +22,7 @@
#include "otp_ctrl_regs.h"
#include "sram_ctrl_regs.h"
-static_assert(ALERT_HANDLER_ALERT_CLASS_MULTIREG_COUNT <=
+static_assert(ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT <=
OTP_CTRL_PARAM_ROM_ALERT_CLASSIFICATION_SIZE / 4,
"More alerts than alert classification OTP words!");
@@ -110,7 +110,8 @@
// For each alert, read its corresponding OTP word and extract the class
// configuration for the current lifecycle state.
rom_error_t error = kErrorOk;
- for (size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_MULTIREG_COUNT; ++i) {
+ for (size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT;
+ ++i) {
uint32_t value = otp_read32(OTP_CTRL_PARAM_ROM_ALERT_CLASSIFICATION_OFFSET +
i * sizeof(uint32_t));
alert_class_t cls = (alert_class_t)bitfield_field32_read(
diff --git a/sw/device/silicon_creator/lib/shutdown_unittest.cc b/sw/device/silicon_creator/lib/shutdown_unittest.cc
index 73fae00..7a0c96c 100644
--- a/sw/device/silicon_creator/lib/shutdown_unittest.cc
+++ b/sw/device/silicon_creator/lib/shutdown_unittest.cc
@@ -339,7 +339,7 @@
TEST_F(ShutdownTest, InitializeProd) {
SetupOtpReads();
- for(size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_MULTIREG_COUNT; ++i) {
+ for(size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT; ++i) {
const auto &c = kDefaultAlertClassification[i];
alert_class_t cls = c.prod;
alert_enable_t en = RomAlertClassEnable(cls);
@@ -352,7 +352,7 @@
TEST_F(ShutdownTest, InitializeProdWithError) {
SetupOtpReads();
- for(size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_MULTIREG_COUNT; ++i) {
+ for(size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT; ++i) {
const auto &c = kDefaultAlertClassification[i];
alert_class_t cls = c.prod;
alert_enable_t en = RomAlertClassEnable(cls);
@@ -369,7 +369,7 @@
TEST_F(ShutdownTest, InitializeProdEnd) {
SetupOtpReads();
- for(size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_MULTIREG_COUNT; ++i) {
+ for(size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT; ++i) {
const auto &c = kDefaultAlertClassification[i];
alert_class_t cls = c.prodend;
alert_enable_t en = RomAlertClassEnable(cls);
@@ -382,7 +382,7 @@
TEST_F(ShutdownTest, InitializeDev) {
SetupOtpReads();
- for(size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_MULTIREG_COUNT; ++i) {
+ for(size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT; ++i) {
const auto &c = kDefaultAlertClassification[i];
alert_class_t cls = c.dev;
alert_enable_t en = RomAlertClassEnable(cls);
@@ -395,7 +395,7 @@
TEST_F(ShutdownTest, InitializeRma) {
SetupOtpReads();
- for(size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_MULTIREG_COUNT; ++i) {
+ for(size_t i = 0; i < ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT; ++i) {
const auto &c = kDefaultAlertClassification[i];
alert_class_t cls = c.rma;
alert_enable_t en = RomAlertClassEnable(cls);