5 #include "sw/device/tests/clkmgr_off_trans_impl.h"
17 #include "sw/device/lib/dif/dif_rv_core_ibex.h"
19 #include "sw/device/lib/testing/aon_timer_testutils.h"
20 #include "sw/device/lib/testing/rstmgr_testutils.h"
21 #include "sw/device/lib/testing/test_framework/check.h"
25 #include "hmac_regs.h"
26 #include "kmac_regs.h"
27 #include "otbn_regs.h"
29 static_assert(kDtAesCount >= 1,
"This test requires at least one AES instance");
30 static_assert(kDtAonTimerCount >= 1,
31 "This test requires at least one AON Timer instance");
32 static_assert(kDtClkmgrCount >= 1,
33 "This test requires at least one Clkmgr instance");
34 static_assert(kDtHmacCount >= 1,
35 "This test requires at least one HMAC instance");
36 static_assert(kDtKmacCount >= 1,
37 "This test requires at least one KMAC instance");
38 static_assert(kDtOtbnCount >= 1,
39 "This test requires at least one OTBN instance");
40 static_assert(kDtPwrmgrCount == 1,
"this test expects exactly one pwrmgr");
41 static_assert(kDtRstmgrCount >= 1,
42 "This test requires at least one Rstmgr instance");
44 static const dt_aes_t kTestAes = (dt_aes_t)0;
45 static const dt_aon_timer_t kAonTimerDt = (dt_aon_timer_t)0;
46 static const dt_clkmgr_t kClkmgrDt = (dt_clkmgr_t)0;
47 static const dt_hmac_t kTestHmac = (dt_hmac_t)0;
48 static const dt_kmac_t kTestKmac = (dt_kmac_t)0;
49 static const dt_otbn_t kTestOtbn = (dt_otbn_t)0;
50 static const dt_pwrmgr_t kPwrmgrDt = (dt_pwrmgr_t)0;
51 static const dt_rstmgr_t kRstmgrDt = (dt_rstmgr_t)0;
58 OTTF_DEFINE_TEST_CONFIG();
60 static dif_aon_timer_t aon_timer;
63 static dif_hmac_t hmac;
64 static dif_kmac_t kmac;
65 static dif_otbn_t otbn;
98 enum { kPcSpread = 8 * 4 };
100 inline uint32_t addr_as_offset(
mmio_region_t base, uint32_t offset) {
101 return (uint32_t)base.base + offset;
117 CHECK_DIF_OK(dif_aes_alert_force(&aes, kDifAesAlertRecovCtrlUpdateErr));
121 dif_hmac_irq_state_snapshot_t snapshot;
122 CHECK_DIF_OK(dif_hmac_irq_get_state(&hmac, &snapshot));
140 static void test_hintable_clocks_off(
const dif_clkmgr_t *clkmgr,
142 void (*crash_fn)(void) = NULL;
155 for (test_trans_block_t block = kTestTransFirst; block < kTestTransCount;
157 if (info[block].clock == clock) {
158 LOG_INFO(
"Hintable clock controls IP block '%s'", info[block].name);
168 uint32_t bite_us = 20;
169 uint32_t bite_cycles = 0;
171 aon_timer_testutils_get_aon_cycles_32_from_us(bite_us, &bite_cycles));
172 LOG_INFO(
"Setting bite reset for %u us (%u cycles)", bite_us, bite_cycles);
173 CHECK_STATUS_OK(aon_timer_testutils_watchdog_config(&aon_timer, UINT32_MAX,
174 bite_cycles,
false));
177 LOG_ERROR(
"Access to disabled unit should freeze and cause a reset");
180 bool execute_off_trans_test(test_trans_block_t block) {
185 CHECK_DIF_OK(dif_rstmgr_init_from_dt(kRstmgrDt, &rstmgr));
186 CHECK_DIF_OK(dif_clkmgr_init_from_dt(kClkmgrDt, &clkmgr));
187 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
190 CHECK_DIF_OK(dif_aon_timer_init_from_dt(kAonTimerDt, &aon_timer));
197 for (test_trans_block_t trans = kTestTransFirst; trans < kTestTransCount;
199 dt_instance_id_t inst = (dt_instance_id_t)0;
203 CHECK_DIF_OK(dif_aes_init_from_dt(kTestAes, &aes));
204 inst = dt_aes_instance_id(kTestAes);
205 info[trans].
name =
"aes";
207 addr_as_offset(aes.base_addr, AES_ALERT_TEST_REG_OFFSET);
213 CHECK_DIF_OK(dif_hmac_init_from_dt(kTestHmac, &hmac));
214 inst = dt_hmac_instance_id(kTestHmac);
215 info[trans].
name =
"hmac";
217 addr_as_offset(hmac.base_addr, HMAC_INTR_STATE_REG_OFFSET);
223 CHECK_DIF_OK(dif_kmac_init_from_dt(kTestKmac, &kmac));
224 inst = dt_kmac_instance_id(kTestKmac);
225 info[trans].
name =
"kmac";
227 addr_as_offset(kmac.base_addr, KMAC_STATUS_REG_OFFSET);
233 CHECK_DIF_OK(dif_otbn_init_from_dt(kTestOtbn, &otbn));
234 inst = dt_otbn_instance_id(kTestOtbn);
235 info[trans].
name =
"otbn";
237 addr_as_offset(otbn.base_addr, OTBN_ERR_BITS_REG_OFFSET);
242 LOG_ERROR(
"Invalid/unrecognised IP block type (%d)", trans);
262 kDtAonTimerResetReqAonTimer, &reset_sources));
265 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
267 test_hintable_clocks_off(&clkmgr, clock);
270 LOG_ERROR(
"This is unreachable since a reset should have been triggered");
272 }
else if (UNWRAP(rstmgr_testutils_is_reset_info(
273 &rstmgr, kDifRstmgrResetInfoWatchdog))) {
275 LOG_INFO(
"Got an expected watchdog reset when reading for clock %d", clock);
285 CHECK(crash_dump.fault_state.mdaa == info[block].csr_offset);
290 CHECK(crash_dump.fault_state.mcpc >=
291 (uintptr_t)info[block].crash_function &&
292 crash_dump.fault_state.mcpc <=
293 (uintptr_t)info[block].crash_function + kPcSpread);
298 reset_info = rstmgr_testutils_reason_get();
299 LOG_ERROR(
"Unexpected reset_info 0x%x", reset_info);