5 #include "dt/dt_adc_ctrl.h"
13 #include "sw/device/lib/runtime/irq.h"
15 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
16 #include "sw/device/lib/testing/pwrmgr_testutils.h"
17 #include "sw/device/lib/testing/rand_testutils.h"
18 #include "sw/device/lib/testing/rstmgr_testutils.h"
19 #include "sw/device/lib/testing/test_framework/check.h"
22 OTTF_DEFINE_TEST_CONFIG();
24 static dif_rv_plic_t plic;
25 static dif_aon_timer_t aon;
26 static dif_rv_core_ibex_t rv_core_ibex;
32 static const dt_adc_ctrl_t kAdcCtrlDt = 0;
33 static_assert(kDtAdcCtrlCount == 1,
"this test expects a adc_ctrl");
34 static const dt_rstmgr_t kRstmgrDt = 0;
35 static_assert(kDtRstmgrCount == 1,
"this test expects a rstmgr");
36 static const dt_pwrmgr_t kPwrmgrDt = 0;
37 static_assert(kDtPwrmgrCount == 1,
"this test expects a pwrmgr");
38 static const dt_aon_timer_t kAonTimerDt = 0;
39 static_assert(kDtAonTimerCount == 1,
"this test expects an aon_timer");
40 static const dt_rv_plic_t kRvPlicDt = 0;
41 static_assert(kDtRvPlicCount == 1,
"this test expects exactly one rv_plic");
42 static const dt_rv_core_ibex_t kRvCoreIbexDt = 0;
43 static_assert(kDtRvCoreIbexCount == 1,
44 "this test expects exactly one rv_core_ibex");
45 static const dt_flash_ctrl_t kFlashCtrlDt = 0;
46 static_assert(kDtFlashCtrlCount >= 1,
47 "this test expects at least one flash_ctrl");
49 static volatile bool irq_serviced =
false;
53 kRegionBasePageIndex = 256,
64 bool ottf_handle_irq(uint32_t *exc_info, dt_instance_id_t devid,
66 if (devid == dt_aon_timer_instance_id(kAonTimerDt) &&
67 irq_id == dt_aon_timer_irq_to_plic_id(kAonTimerDt,
68 kDtAonTimerIrqWdogTimerBark)) {
70 dif_aon_timer_irq_acknowledge(&aon, kDtAonTimerIrqWdogTimerBark));
83 void ottf_external_nmi_handler(
void) {
88 CHECK_DIF_OK(dif_aon_timer_irq_is_pending(&aon, kDifAonTimerIrqWdogTimerBark,
93 dif_aon_timer_irq_acknowledge(&aon, kDifAonTimerIrqWdogTimerBark));
95 CHECK_DIF_OK(dif_rv_core_ibex_clear_nmi_state(&rv_core_ibex,
96 kDifRvCoreIbexNmiSourceAll));
99 static void enable_irqs(
void) {
102 dt_aon_timer_irq_to_plic_id(kAonTimerDt, kDtAonTimerIrqWdogTimerBark);
109 irq_global_ctrl(
true);
110 irq_external_ctrl(
true);
118 CHECK_DIF_OK(dif_rv_plic_init_from_dt(kRvPlicDt, &plic));
120 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
121 CHECK_DIF_OK(dif_rstmgr_init_from_dt(kRstmgrDt, &rstmgr));
122 CHECK_DIF_OK(dif_aon_timer_init_from_dt(kAonTimerDt, &aon));
123 CHECK_DIF_OK(dif_rv_core_ibex_init_from_dt(kRvCoreIbexDt, &rv_core_ibex));
129 kDtAdcCtrlWakeupWkupReq, &wakeup_sources));
134 kDtAonTimerResetReqAonTimer, &reset_sources));
141 rstmgr_reset_info = rstmgr_testutils_reason_get();
143 uint32_t address = 0;
144 CHECK_STATUS_OK(flash_ctrl_testutils_data_region_setup(
145 &flash, kRegionBasePageIndex, kFlashDataRegion, kRegionSize, &address));
150 uint32_t data[kNumWords];
151 for (
int i = 0; i < kNumWords; ++i) {
152 data[i] = rand_testutils_gen32();
157 CHECK_STATUS_OK(flash_ctrl_testutils_erase_and_write_page(
158 &flash, address, kPartitionId, data, kDifFlashCtrlPartitionTypeData,
160 uint32_t readback_data[kNumWords];
161 CHECK_STATUS_OK(flash_ctrl_testutils_read(
162 &flash, address, kPartitionId, readback_data,
163 kDifFlashCtrlPartitionTypeData, kNumWords, 0));
164 CHECK_ARRAYS_EQ(data, readback_data, kNumWords);
170 pwrmgr_testutils_enable_low_power(&pwrmgr, wakeup_sources, 0));
176 uint32_t bark_th = kAONBarkTh;
177 uint32_t bite_th = kAONBiteTh;
182 bite_th = 4 * bark_th;
190 .byte_address = address,
192 .partition_type = kDifFlashCtrlPartitionTypeData,
193 .partition_id = kPartitionId,
209 "Unexpected wakeup reason: types=%x, srcs=%x", reason.
types,
214 CHECK_STATUS_OK(flash_ctrl_testutils_wait_transaction_end(&flash));
216 CHECK_STATUS_OK(flash_ctrl_testutils_read(
217 &flash, address, kPartitionId, readback_data,
218 kDifFlashCtrlPartitionTypeData, kNumWords, 0));
219 uint32_t expected_data[kNumWords];
220 memset(expected_data, 0xff,
sizeof(expected_data));
221 CHECK_ARRAYS_EQ(readback_data, expected_data, kNumWords);
223 rstmgr_testutils_reason_clear();
225 LOG_ERROR(
"Unexepected reset type detected. Reset info = %08x",