9 #include "sw/device/lib/runtime/irq.h"
11 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
12 #include "sw/device/lib/testing/lc_ctrl_testutils.h"
13 #include "sw/device/lib/testing/rv_plic_testutils.h"
14 #include "sw/device/lib/testing/test_framework/check.h"
18 #include "lc_ctrl_regs.h"
19 #include "sw/device/lib/testing/autogen/isr_testutils.h"
21 OTTF_DEFINE_TEST_CONFIG();
23 static dif_lc_ctrl_t lc_ctrl;
24 static dif_rv_plic_t plic0;
26 static dif_flash_ctrl_t flash_ctrl;
28 static plic_isr_ctx_t plic_ctx = {
33 static flash_ctrl_isr_ctx_t flash_ctx = {
34 .flash_ctrl = &flash_ctrl,
42 kFlashInfoPageIdCreatorSecret = 1,
43 kFlashInfoPageIdOwnerSecret = 2,
44 kFlashInfoPageIdIsoPart = 3,
49 static const uint32_t kRandomData1[kInfoSize] = {
50 0xb295d21b, 0xecdfbdcd, 0x67e7ab2d, 0x6f660b08, 0x273bf65c, 0xe80f1695,
51 0x586b80db, 0xc3dba27e, 0xdc124c5d, 0xb01ccd52, 0x815713e1, 0x31a141b2,
52 0x2124be3b, 0x299a6f2a, 0x1f2a4741, 0x1a073cc0,
55 static const uint32_t kRandomData2[kInfoSize] = {
56 0x69e705a0, 0x65c2ec6b, 0x04b0b634, 0x59313526, 0x1858aee1, 0xd49f3ba9,
57 0x230bcd38, 0xc1eb6b3e, 0x68c15e3b, 0x024d02a9, 0x0b062ae4, 0x334dd155,
58 0x53fdbf8a, 0x3792f1e2, 0xee317161, 0x33b19bf3,
61 static const uint32_t kRandomData3[kInfoSize] = {
62 0x2b78dbf5, 0x3e6e5a00, 0xbf82c6d5, 0x68d8e33f, 0x9c524bbc, 0xac5beeef,
63 0x1287ca5a, 0x12b61419, 0x872e709f, 0xf91b7c0c, 0x18312a1f, 0x325cef9a,
64 0x19fefa95, 0x4ceb421b, 0xa57d74c4, 0xaf1d723d,
67 static volatile bool expected_irqs[kNumIRQs];
68 static volatile bool fired_irqs[kNumIRQs];
75 void ottf_external_isr(uint32_t *exc_info) {
77 dif_flash_ctrl_irq_t irq_serviced;
79 isr_testutils_flash_ctrl_isr(plic_ctx, flash_ctx,
true, &peripheral_serviced,
82 "Interurpt from unexpected peripheral: %d", peripheral_serviced);
83 fired_irqs[irq_serviced] =
true;
89 static void clear_irq_variables(
void) {
90 for (
int i = 0; i < kNumIRQs; ++i) {
91 expected_irqs[i] =
false;
92 fired_irqs[i] =
false;
99 static void flash_ctrl_init_with_event_irqs(
mmio_region_t base_addr,
101 dif_flash_ctrl_t *flash_ctrl) {
102 CHECK_DIF_OK(dif_flash_ctrl_init(base_addr, flash_ctrl));
105 for (dif_flash_ctrl_irq_t i = 0; i < kNumIRQs; ++i) {
107 CHECK_DIF_OK(dif_flash_ctrl_irq_get_type(
108 flash_ctrl, kDifFlashCtrlIrqProgEmpty + i, &type));
110 CHECK_DIF_OK(dif_flash_ctrl_irq_set_enabled(
114 clear_irq_variables();
120 static void compare_and_clear_irq_variables(
void) {
121 for (
int i = 0; i < kNumIRQs; ++i) {
122 CHECK(expected_irqs[i] == fired_irqs[i],
"expected IRQ mismatch = %d", i);
124 clear_irq_variables();
132 static void test_info_part(uint32_t partition_number,
const uint32_t *test_data,
133 bool write_allowed,
bool read_allowed) {
134 uint32_t address = 0;
135 CHECK_STATUS_OK(flash_ctrl_testutils_info_region_setup(
136 &flash_state, partition_number, kFlashInfoBank, kPartitionId, &address));
140 clear_irq_variables();
145 expected_irqs[kDifFlashCtrlIrqOpDone] =
true;
146 CHECK_STATUS_OK(flash_ctrl_testutils_erase_page(
147 &flash_state, address, kPartitionId, kDifFlashCtrlPartitionTypeInfo));
148 compare_and_clear_irq_variables();
150 LOG_INFO(
"partition:%1d erase done", partition_number);
151 expected_irqs[kDifFlashCtrlIrqOpDone] =
true;
152 expected_irqs[kDifFlashCtrlIrqProgEmpty] =
true;
153 expected_irqs[kDifFlashCtrlIrqProgLvl] =
true;
158 CHECK_DIF_OK(dif_flash_ctrl_irq_set_enabled(
160 CHECK_DIF_OK(dif_flash_ctrl_irq_set_enabled(
162 CHECK_STATUS_OK(flash_ctrl_testutils_write(
163 &flash_state, address, kPartitionId, test_data,
164 kDifFlashCtrlPartitionTypeInfo, kInfoSize));
165 compare_and_clear_irq_variables();
166 LOG_INFO(
"partition:%1d write done", partition_number);
168 CHECK_STATUS_NOT_OK(flash_ctrl_testutils_write(
169 &flash_state, address, kPartitionId, test_data,
170 kDifFlashCtrlPartitionTypeInfo, kInfoSize));
171 LOG_INFO(
"partition:%1d write not allowed", partition_number);
176 uint32_t readback_data[kInfoSize];
178 expected_irqs[kDifFlashCtrlIrqOpDone] =
true;
179 expected_irqs[kDifFlashCtrlIrqRdLvl] =
true;
180 expected_irqs[kDifFlashCtrlIrqRdFull] =
true;
184 CHECK_DIF_OK(dif_flash_ctrl_irq_set_enabled(
186 CHECK_DIF_OK(dif_flash_ctrl_irq_set_enabled(
188 CHECK_STATUS_OK(flash_ctrl_testutils_read(
189 &flash_state, address, kPartitionId, readback_data,
190 kDifFlashCtrlPartitionTypeInfo, kInfoSize, 1));
191 compare_and_clear_irq_variables();
192 CHECK_ARRAYS_EQ(readback_data, test_data, kInfoSize);
193 LOG_INFO(
"partition:%1d read done", partition_number);
195 CHECK_STATUS_NOT_OK(flash_ctrl_testutils_read(
196 &flash_state, address, kPartitionId, readback_data,
197 kDifFlashCtrlPartitionTypeInfo, kInfoSize, 1));
198 LOG_INFO(
"partition:%1d read not allowed", partition_number);
203 CHECK_DIF_OK(dif_lc_ctrl_init(
205 CHECK_DIF_OK(dif_rv_plic_init(
208 flash_ctrl_init_with_event_irqs(
210 &flash_state, &flash_ctrl);
211 rv_plic_testutils_irq_range_enable(&plic0, plic_ctx.hart_id,
216 irq_global_ctrl(
true);
217 irq_external_ctrl(
true);
221 bool personalized =
false;
224 mmio_region_read32(lc_ctrl.base_addr, LC_CTRL_LC_ID_STATE_REG_OFFSET);
229 LOG_INFO(
"test: personalized : %d", personalized);
236 CHECK_STATUS_OK(lc_ctrl_testutils_lc_state_log(&lc_state));
240 test_info_part(kFlashInfoPageIdCreatorSecret, kRandomData1,
242 test_info_part(kFlashInfoPageIdOwnerSecret, kRandomData2,
244 test_info_part(kFlashInfoPageIdIsoPart, kRandomData3, 1,
248 test_info_part(kFlashInfoPageIdCreatorSecret, kRandomData1,
251 test_info_part(kFlashInfoPageIdOwnerSecret, kRandomData2,
253 test_info_part(kFlashInfoPageIdIsoPart, kRandomData3, 1,
258 test_info_part(kFlashInfoPageIdCreatorSecret, kRandomData1,
261 test_info_part(kFlashInfoPageIdOwnerSecret, kRandomData2,
263 test_info_part(kFlashInfoPageIdIsoPart, kRandomData3, 1,
267 test_info_part(kFlashInfoPageIdCreatorSecret, kRandomData1,
269 test_info_part(kFlashInfoPageIdOwnerSecret, kRandomData2,
271 test_info_part(kFlashInfoPageIdIsoPart, kRandomData3, 1,
275 LOG_ERROR(
"Unexpected lc state 0x%x", lc_state);