5 #include "sw/device/silicon_creator/lib/drivers/alert.h"
8 #include "sw/device/lib/base/crc32.h"
10 #include "sw/device/silicon_creator/lib/drivers/otp.h"
11 #include "sw/device/silicon_creator/lib/error.h"
13 #include "alert_handler_regs.h"
15 #include "otp_ctrl_regs.h"
21 rom_error_t alert_configure(
size_t index, alert_class_t cls,
22 alert_enable_t enabled) {
23 if (index >= ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT) {
24 return kErrorAlertBadIndex;
30 abs_mmio_write32_shadowed(
31 kBase + ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
32 ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_VALUE_CLASSA);
35 abs_mmio_write32_shadowed(
36 kBase + ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
37 ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_VALUE_CLASSB);
40 abs_mmio_write32_shadowed(
41 kBase + ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
42 ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_VALUE_CLASSC);
45 abs_mmio_write32_shadowed(
46 kBase + ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
47 ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_CLASS_A_0_VALUE_CLASSD);
52 return kErrorAlertBadClass;
56 case kAlertEnableNone:
58 case kAlertEnableLocked:
60 abs_mmio_write32_shadowed(
61 kBase + ALERT_HANDLER_ALERT_EN_SHADOWED_0_REG_OFFSET + index, 1);
62 abs_mmio_write32(kBase + ALERT_HANDLER_ALERT_REGWEN_0_REG_OFFSET + index,
65 case kAlertEnableEnabled:
66 abs_mmio_write32_shadowed(
67 kBase + ALERT_HANDLER_ALERT_EN_SHADOWED_0_REG_OFFSET + index, 1);
70 return kErrorAlertBadEnable;
75 rom_error_t alert_local_configure(
size_t index, alert_class_t cls,
76 alert_enable_t enabled) {
77 if (index >= ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT) {
78 return kErrorAlertBadIndex;
84 abs_mmio_write32_shadowed(
85 kBase + ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
86 ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_VALUE_CLASSA);
89 abs_mmio_write32_shadowed(
90 kBase + ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
91 ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_VALUE_CLASSB);
94 abs_mmio_write32_shadowed(
95 kBase + ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
96 ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_VALUE_CLASSC);
99 abs_mmio_write32_shadowed(
100 kBase + ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET + index,
101 ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_CLASS_LA_0_VALUE_CLASSD);
106 return kErrorAlertBadClass;
110 case kAlertEnableNone:
112 case kAlertEnableLocked:
114 abs_mmio_write32_shadowed(
115 kBase + ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_0_REG_OFFSET + index, 1);
117 kBase + ALERT_HANDLER_LOC_ALERT_REGWEN_0_REG_OFFSET + index, 0);
119 case kAlertEnableEnabled:
120 abs_mmio_write32_shadowed(
121 kBase + ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_0_REG_OFFSET + index, 1);
124 return kErrorAlertBadEnable;
129 rom_error_t alert_class_configure(alert_class_t cls,
136 reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E0_FIELD, 0);
138 reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E1_FIELD, 1);
140 reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E2_FIELD, 2);
142 reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_MAP_E3_FIELD, 3);
149 offset = ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET -
150 ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET;
153 offset = ALERT_HANDLER_CLASSB_CTRL_SHADOWED_REG_OFFSET -
154 ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET;
157 offset = ALERT_HANDLER_CLASSC_CTRL_SHADOWED_REG_OFFSET -
158 ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET;
161 offset = ALERT_HANDLER_CLASSD_CTRL_SHADOWED_REG_OFFSET -
162 ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET;
166 return kErrorAlertBadClass;
169 case kAlertEnableLocked:
171 reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_LOCK_BIT,
true);
173 case kAlertEnableEnabled:
177 case kAlertEnableNone:
180 return kErrorAlertBadEnable;
183 case kAlertEscalatePhase3:
185 reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E3_BIT,
true);
187 case kAlertEscalatePhase2:
189 reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E2_BIT,
true);
191 case kAlertEscalatePhase1:
193 reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E1_BIT,
true);
195 case kAlertEscalatePhase0:
197 reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_E0_BIT,
true);
199 case kAlertEscalateNone:
202 return kErrorAlertBadEscalation;
205 abs_mmio_write32_shadowed(
206 kBase + ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET + offset, reg);
207 abs_mmio_write32_shadowed(
208 kBase + ALERT_HANDLER_CLASSA_ACCUM_THRESH_SHADOWED_REG_OFFSET + offset,
210 abs_mmio_write32_shadowed(
211 kBase + ALERT_HANDLER_CLASSA_TIMEOUT_CYC_SHADOWED_REG_OFFSET + offset,
213 for (
size_t i = 0; i < 4; ++i) {
214 abs_mmio_write32_shadowed(
215 kBase + ALERT_HANDLER_CLASSA_PHASE0_CYC_SHADOWED_REG_OFFSET + offset +
220 if (config->
enabled == kAlertEnableLocked) {
222 abs_mmio_write32(kBase + ALERT_HANDLER_CLASSA_REGWEN_REG_OFFSET + offset,
229 rom_error_t alert_ping_enable(
void) {
231 abs_mmio_write32_shadowed(
232 kBase + ALERT_HANDLER_PING_TIMER_EN_SHADOWED_REG_OFFSET, 1);
233 abs_mmio_write32(kBase + ALERT_HANDLER_PING_TIMER_REGWEN_REG_OFFSET, 0);
243 static void crc32_add_reg(uint32_t *ctx, uint32_t offset) {
244 crc32_add32(ctx, abs_mmio_read32(kBase + offset));
254 static void crc32_add_regs(uint32_t *ctx, uint32_t offset,
size_t num_regs) {
255 for (
size_t i = 0; i < num_regs; ++i, offset +=
sizeof(uint32_t)) {
256 crc32_add_reg(ctx, offset);
260 uint32_t alert_config_crc32(
void) {
264 crc32_add_regs(&ctx, ALERT_HANDLER_ALERT_REGWEN_0_REG_OFFSET,
265 ALERT_HANDLER_ALERT_REGWEN_MULTIREG_COUNT);
266 crc32_add_regs(&ctx, ALERT_HANDLER_ALERT_EN_SHADOWED_0_REG_OFFSET,
267 ALERT_HANDLER_ALERT_EN_SHADOWED_MULTIREG_COUNT);
268 crc32_add_regs(&ctx, ALERT_HANDLER_ALERT_CLASS_SHADOWED_0_REG_OFFSET,
269 ALERT_HANDLER_ALERT_CLASS_SHADOWED_MULTIREG_COUNT);
270 crc32_add_regs(&ctx, ALERT_HANDLER_LOC_ALERT_REGWEN_0_REG_OFFSET,
271 ALERT_HANDLER_LOC_ALERT_REGWEN_MULTIREG_COUNT);
272 crc32_add_regs(&ctx, ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_0_REG_OFFSET,
273 ALERT_HANDLER_LOC_ALERT_EN_SHADOWED_MULTIREG_COUNT);
274 crc32_add_regs(&ctx, ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_0_REG_OFFSET,
275 ALERT_HANDLER_LOC_ALERT_CLASS_SHADOWED_MULTIREG_COUNT);
277 for (
size_t class = 0;
class < ALERT_HANDLER_PARAM_N_CLASSES; ++
class) {
279 kClassStep = ALERT_HANDLER_CLASSB_REGWEN_REG_OFFSET -
280 ALERT_HANDLER_CLASSA_REGWEN_REG_OFFSET,
282 uint32_t classOffset = kClassStep *
class;
284 crc32_add_reg(&ctx, classOffset + ALERT_HANDLER_CLASSA_REGWEN_REG_OFFSET);
286 classOffset + ALERT_HANDLER_CLASSA_CTRL_SHADOWED_REG_OFFSET);
289 classOffset + ALERT_HANDLER_CLASSA_ACCUM_THRESH_SHADOWED_REG_OFFSET);
292 classOffset + ALERT_HANDLER_CLASSA_TIMEOUT_CYC_SHADOWED_REG_OFFSET);
295 &ctx, classOffset + ALERT_HANDLER_CLASSA_PHASE0_CYC_SHADOWED_REG_OFFSET,
296 ALERT_HANDLER_PARAM_N_PHASES);
299 return crc32_finish(&ctx);
302 rom_error_t alert_config_check(lifecycle_state_t lc_state) {
303 uint32_t crc32 = alert_config_crc32();
304 rom_error_t res = lc_state ^ crc32;
305 switch (launder32(lc_state)) {
309 kMask = kLcStateTest ^ kErrorOk,
311 res ^= crc32 ^ kMask;
316 otp_read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ALERT_DIGEST_PROD_OFFSET);
318 case kLcStateProdEnd:
321 OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ALERT_DIGEST_PROD_END_OFFSET);
326 otp_read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ALERT_DIGEST_DEV_OFFSET);
331 otp_read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_ALERT_DIGEST_RMA_OFFSET);
336 if (launder32(res) != kErrorOk) {
337 return kErrorAlertBadCrc32;