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,
101 kDifPwrmgrResetRequestSourceTwo,
103 LOG_INFO(
"Testing peripheral clock %d, with unit %s", clock,
108 uint32_t bite_cycles = 0;
110 aon_timer_testutils_get_aon_cycles_32_from_us(bite_us, &bite_cycles));
111 LOG_INFO(
"Setting bite reset for %u us (%u cycles)", bite_us, bite_cycles);
115 LOG_INFO(
"CSR access was okay before disabling the clock");
118 CHECK_STATUS_OK(aon_timer_testutils_watchdog_config(&aon_timer, UINT32_MAX,
119 bite_cycles,
false));
134 CHECK_DIF_OK(dif_rstmgr_init(
137 CHECK_DIF_OK(dif_clkmgr_init(
140 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
143 CHECK_DIF_OK(dif_aon_timer_init(
147 CHECK_DIF_OK(dif_uart_init(
149 CHECK_DIF_OK(dif_spi_host_init(
151 CHECK_DIF_OK(dif_spi_host_init(
153 CHECK_DIF_OK(dif_usbdev_init(
157 ret_sram_testutils_init();
162 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
166 uint32_t prev_value = 0;
168 CHECK_STATUS_OK(ret_sram_testutils_counter_clear(0));
169 for (
int i = 0; i < 20; ++i) {
170 CHECK_STATUS_OK(ret_sram_testutils_counter_increment(0));
171 CHECK_STATUS_OK(ret_sram_testutils_counter_get(0, &value));
172 CHECK(value == prev_value + 1);
175 CHECK_STATUS_OK(ret_sram_testutils_counter_clear(0));
176 CHECK_STATUS_OK(ret_sram_testutils_counter_get(0, &value));
178 test_gateable_clocks_off(&clkmgr, &pwrmgr, clock);
181 LOG_ERROR(
"This is unreachable since a reset should have been triggered");
183 }
else if (UNWRAP(rstmgr_testutils_is_reset_info(
184 &rstmgr, kDifRstmgrResetInfoWatchdog))) {
186 CHECK_STATUS_OK(ret_sram_testutils_counter_get(0, &clock));
187 LOG_INFO(
"Got an expected watchdog reset when reading for clock %d", clock);
199 CHECK(size_read == actual_size);
200 uint32_t expected_hung_address =
peri_context[clock].address;
201 CHECK(crash_dump.fault_state.mdaa == expected_hung_address,
202 "Unexpected hung address for clock %d, via peripheral %s", clock,
206 uint32_t crash_function = (uint32_t)
peri_context[clock].csr_access;
207 CHECK(crash_dump.fault_state.mcpc >= crash_function &&
208 crash_dump.fault_state.mcpc <= crash_function + kPcSpread,
209 "The crash PC 0x%x is too far from the expected 0x%x",
210 crash_dump.fault_state.mcpc, crash_function);
212 LOG_INFO(
"Expectations are okay for clock %d, with peripheral %s", clock,
214 CHECK_STATUS_OK(ret_sram_testutils_counter_increment(0));
216 if (clock < kTopEarlgreyGateableClocksLast) {
217 CHECK_STATUS_OK(ret_sram_testutils_counter_get(0, &clock));
218 LOG_INFO(
"Next clock to test %d", clock);
220 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
222 test_gateable_clocks_off(&clkmgr, &pwrmgr, clock);
225 LOG_ERROR(
"This is unreachable since a reset should have been triggered");
232 reset_info = rstmgr_testutils_reason_get();
233 LOG_ERROR(
"Unexpected reset_info 0x%x", reset_info);