12 #include "sw/device/lib/runtime/irq.h"
14 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
15 #include "sw/device/lib/testing/pwrmgr_testutils.h"
16 #include "sw/device/lib/testing/rand_testutils.h"
17 #include "sw/device/lib/testing/rstmgr_testutils.h"
18 #include "sw/device/lib/testing/test_framework/check.h"
22 #include "sw/device/lib/testing/autogen/isr_testutils.h"
24 OTTF_DEFINE_TEST_CONFIG();
26 static dif_rv_plic_t plic;
27 static dif_aon_timer_t aon;
28 static dif_rv_core_ibex_t rv_core_ibex;
30 static plic_isr_ctx_t plic_ctx = {
35 static aon_timer_isr_ctx_t aon_timer_ctx = {
37 .plic_aon_timer_start_irq_id =
43 static dif_aon_timer_irq_t irq_serviced;
47 kRegionBasePageIndex = 256,
58 void ottf_external_isr(uint32_t *exc_info) {
59 isr_testutils_aon_timer_isr(plic_ctx, aon_timer_ctx, &peripheral_serviced,
68 void ottf_external_nmi_handler(
void) {
73 CHECK_DIF_OK(dif_aon_timer_irq_is_pending(&aon, kDifAonTimerIrqWdogTimerBark,
78 dif_aon_timer_irq_acknowledge(&aon, kDifAonTimerIrqWdogTimerBark));
80 CHECK_DIF_OK(dif_rv_core_ibex_clear_nmi_state(&rv_core_ibex,
81 kDifRvCoreIbexNmiSourceAll));
84 static void enable_irqs(
void) {
95 irq_global_ctrl(
true);
96 irq_external_ctrl(
true);
104 CHECK_DIF_OK(dif_rv_plic_init(
108 CHECK_DIF_OK(dif_pwrmgr_init(
110 CHECK_DIF_OK(dif_rstmgr_init(
112 CHECK_DIF_OK(dif_aon_timer_init(
114 CHECK_DIF_OK(dif_rv_core_ibex_init(
121 kDifPwrmgrResetRequestSourceTwo,
125 rstmgr_reset_info = rstmgr_testutils_reason_get();
127 uint32_t address = 0;
128 CHECK_STATUS_OK(flash_ctrl_testutils_data_region_setup(
129 &flash, kRegionBasePageIndex, kFlashDataRegion, kRegionSize, &address));
134 uint32_t data[kNumWords];
135 for (
int i = 0; i < kNumWords; ++i) {
136 data[i] = rand_testutils_gen32();
141 CHECK_STATUS_OK(flash_ctrl_testutils_erase_and_write_page(
142 &flash, address, kPartitionId, data, kDifFlashCtrlPartitionTypeData,
144 uint32_t readback_data[kNumWords];
145 CHECK_STATUS_OK(flash_ctrl_testutils_read(
146 &flash, address, kPartitionId, readback_data,
147 kDifFlashCtrlPartitionTypeData, kNumWords, 0));
148 CHECK_ARRAYS_EQ(data, readback_data, kNumWords);
153 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
154 &pwrmgr, kDifPwrmgrWakeupRequestSourceTwo, 0));
158 uint32_t bark_th = kAONBarkTh;
159 uint32_t bite_th = kAONBiteTh;
164 bite_th = 4 * bark_th;
172 .byte_address = address,
174 .partition_type = kDifFlashCtrlPartitionTypeData,
175 .partition_id = kPartitionId,
188 rstmgr_reset_info = rstmgr_testutils_reason_get();
191 CHECK(irq_serviced == kDifAonTimerIrqWdogTimerBark);
193 CHECK_STATUS_OK(flash_ctrl_testutils_wait_transaction_end(&flash));
195 CHECK_STATUS_OK(flash_ctrl_testutils_read(
196 &flash, address, kPartitionId, readback_data,
197 kDifFlashCtrlPartitionTypeData, kNumWords, 0));
198 uint32_t expected_data[kNumWords];
199 memset(expected_data, 0xff,
sizeof(expected_data));
200 CHECK_ARRAYS_EQ(readback_data, expected_data, kNumWords);
202 rstmgr_testutils_reason_clear();
204 LOG_ERROR(
"Unexepected reset type detected. Reset info = %08x",