12 #include "sw/device/lib/dif/dif_rv_core_ibex.h"
17 #include "sw/device/lib/testing/aon_timer_testutils.h"
18 #include "sw/device/lib/testing/ret_sram_testutils.h"
19 #include "sw/device/lib/testing/rstmgr_testutils.h"
20 #include "sw/device/lib/testing/test_framework/check.h"
24 #include "spi_host_regs.h"
25 #include "uart_regs.h"
26 #include "usbdev_regs.h"
28 static const dt_pwrmgr_t kPwrmgrDt = 0;
29 static_assert(kDtPwrmgrCount == 1,
"this test expects a pwrmgr");
39 OTTF_DEFINE_TEST_CONFIG();
42 const char *peripheral_name;
43 void (*csr_access)(void);
51 enum { kPcSpread = 8 * 4 };
53 static dif_aon_timer_t aon_timer;
54 static dif_spi_host_t spi_host0;
55 static dif_spi_host_t spi_host1;
56 static dif_usbdev_t usbdev;
57 static dif_uart_t uart0;
60 dif_uart_irq_state_snapshot_t snapshot;
61 CHECK_DIF_OK(dif_uart_irq_get_state(&uart0, &snapshot));
64 OT_NOINLINE static void spi_host0_csr_access(
void) {
65 dif_spi_host_irq_state_snapshot_t snapshot;
66 CHECK_DIF_OK(dif_spi_host_irq_get_state(&spi_host0, &snapshot));
69 OT_NOINLINE static void spi_host1_csr_access(
void) {
74 dif_usbdev_irq_state_snapshot_t snapshot;
75 CHECK_DIF_OK(dif_usbdev_irq_get_state(&usbdev, &snapshot));
79 {
"uart0", uart0_csr_access,
81 {
"spi_host1", spi_host1_csr_access,
83 {
"spi_host0", spi_host0_csr_access,
85 {
"usbdev", usbdev_csr_access,
93 static void test_gateable_clocks_off(
const dif_clkmgr_t *clkmgr,
94 const dif_pwrmgr_t *pwrmgr,
103 kDtAonTimerResetReqAonTimer, &reset_sources));
106 LOG_INFO(
"Testing peripheral clock %d, with unit %s", clock,
111 uint32_t bite_cycles = 0;
113 aon_timer_testutils_get_aon_cycles_32_from_us(bite_us, &bite_cycles));
114 LOG_INFO(
"Setting bite reset for %u us (%u cycles)", bite_us, bite_cycles);
118 LOG_INFO(
"CSR access was okay before disabling the clock");
121 CHECK_STATUS_OK(aon_timer_testutils_watchdog_config(&aon_timer, UINT32_MAX,
122 bite_cycles,
false));
137 CHECK_DIF_OK(dif_rstmgr_init(
140 CHECK_DIF_OK(dif_clkmgr_init(
143 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
146 CHECK_DIF_OK(dif_aon_timer_init(
150 CHECK_DIF_OK(dif_uart_init(
152 CHECK_DIF_OK(dif_spi_host_init(
154 CHECK_DIF_OK(dif_spi_host_init(
156 CHECK_DIF_OK(dif_usbdev_init(
160 ret_sram_testutils_init();
165 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
169 uint32_t prev_value = 0;
171 CHECK_STATUS_OK(ret_sram_testutils_counter_clear(0));
172 for (
int i = 0; i < 20; ++i) {
173 CHECK_STATUS_OK(ret_sram_testutils_counter_increment(0));
174 CHECK_STATUS_OK(ret_sram_testutils_counter_get(0, &value));
175 CHECK(value == prev_value + 1);
178 CHECK_STATUS_OK(ret_sram_testutils_counter_clear(0));
179 CHECK_STATUS_OK(ret_sram_testutils_counter_get(0, &value));
181 test_gateable_clocks_off(&clkmgr, &pwrmgr, clock);
184 LOG_ERROR(
"This is unreachable since a reset should have been triggered");
186 }
else if (UNWRAP(rstmgr_testutils_is_reset_info(
187 &rstmgr, kDifRstmgrResetInfoWatchdog))) {
189 CHECK_STATUS_OK(ret_sram_testutils_counter_get(0, &clock));
190 LOG_INFO(
"Got an expected watchdog reset when reading for clock %d", clock);
202 CHECK(size_read == actual_size);
203 uint32_t expected_hung_address =
peri_context[clock].address;
204 CHECK(crash_dump.fault_state.mdaa == expected_hung_address,
205 "Unexpected hung address for clock %d, via peripheral %s", clock,
209 uint32_t crash_function = (uint32_t)
peri_context[clock].csr_access;
210 CHECK(crash_dump.fault_state.mcpc >= crash_function &&
211 crash_dump.fault_state.mcpc <= crash_function + kPcSpread,
212 "The crash PC 0x%x is too far from the expected 0x%x",
213 crash_dump.fault_state.mcpc, crash_function);
215 LOG_INFO(
"Expectations are okay for clock %d, with peripheral %s", clock,
217 CHECK_STATUS_OK(ret_sram_testutils_counter_increment(0));
219 if (clock < kTopEarlgreyGateableClocksLast) {
220 CHECK_STATUS_OK(ret_sram_testutils_counter_get(0, &clock));
221 LOG_INFO(
"Next clock to test %d", clock);
223 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
225 test_gateable_clocks_off(&clkmgr, &pwrmgr, clock);
228 LOG_ERROR(
"This is unreachable since a reset should have been triggered");
235 reset_info = rstmgr_testutils_reason_get();
236 LOG_ERROR(
"Unexpected reset_info 0x%x", reset_info);