13 #include "sw/device/lib/runtime/irq.h"
15 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
16 #include "sw/device/lib/testing/otp_ctrl_testutils.h"
17 #include "sw/device/lib/testing/rand_testutils.h"
18 #include "sw/device/lib/testing/test_framework/check.h"
20 #include "sw/device/lib/testing/test_framework/status.h"
22 #include "flash_ctrl_regs.h"
24 #include "otp_ctrl_regs.h"
26 static dif_rstmgr_t rstmgr;
27 static dif_otp_ctrl_t otp_ctrl;
31 kFlashWordSize = FLASH_CTRL_PARAM_BYTES_PER_WORD,
32 kFlashPageSize = FLASH_CTRL_PARAM_BYTES_PER_PAGE,
34 kFlashMpRegions = FLASH_CTRL_PARAM_NUM_REGIONS
37 OTTF_DEFINE_TEST_CONFIG();
47 uint32_t exp_data_addr = (uint32_t)&kIsoPartExpData;
48 uint32_t base_page = (exp_data_addr - kFlashStartAddr) / kFlashPageSize;
50 .
rd_en = kMultiBitBool4True,
51 .prog_en = kMultiBitBool4False,
52 .erase_en = kMultiBitBool4False,
53 .scramble_en = kMultiBitBool4False,
54 .ecc_en = kMultiBitBool4False,
55 .high_endurance_en = kMultiBitBool4False};
57 CHECK_STATUS_OK(flash_ctrl_testutils_data_region_setup_properties(
58 flash_ctrl, base_page, kFlashMpRegions - 1,
62 CHECK((exp_data_addr >= (addr + kFlashStartAddr)) &&
63 (exp_data_addr < (addr + kFlashPageSize + kFlashStartAddr)));
67 .
rd_en = kMultiBitBool4True,
68 .prog_en = kMultiBitBool4False,
69 .erase_en = kMultiBitBool4False,
70 .scramble_en = kMultiBitBool4False,
71 .ecc_en = kMultiBitBool4False,
72 .high_endurance_en = kMultiBitBool4False};
74 CHECK_STATUS_OK(flash_ctrl_testutils_info_region_setup_properties(
76 0, 0, iso_page, &addr));
78 uint32_t read_data[16];
79 CHECK_STATUS_OK(flash_ctrl_testutils_read(
80 flash_ctrl, addr, 0, read_data,
81 kDifFlashCtrlPartitionTypeInfo,
ARRAYSIZE(read_data), 0));
83 CHECK_ARRAYS_EQ(kIsoPartExpData, read_data,
ARRAYSIZE(read_data),
84 "Isolated info page data mismatch.");
88 CHECK_DIF_OK(dif_rstmgr_init(
91 CHECK_DIF_OK(dif_otp_ctrl_init(
98 bool secret1_locked =
false;
102 if (!secret1_locked) {
103 LOG_INFO(
"Powered up for the first time, program and lock otp");
106 check_iso_data(&flash_ctrl);
109 rand_testutils_reseed();
114 kFlashAddrKeyOffset = OTP_CTRL_PARAM_FLASH_ADDR_KEY_SEED_OFFSET -
115 OTP_CTRL_PARAM_SECRET1_OFFSET,
116 kFlashDataKeyOffset = OTP_CTRL_PARAM_FLASH_DATA_KEY_SEED_OFFSET -
117 OTP_CTRL_PARAM_SECRET1_OFFSET,
118 kSramDataKeyOffset = OTP_CTRL_PARAM_SRAM_DATA_KEY_SEED_OFFSET -
119 OTP_CTRL_PARAM_SECRET1_OFFSET
122 for (uint32_t i = 0; i < OTP_CTRL_PARAM_FLASH_ADDR_KEY_SEED_SIZE;
123 i += kFlashWordSize) {
125 (uint64_t)rand_testutils_gen32() << 32 | rand_testutils_gen32();
129 kFlashAddrKeyOffset + i, val));
130 CHECK_STATUS_OK(otp_ctrl_testutils_wait_for_dai(&otp_ctrl));
133 for (uint32_t i = 0; i < OTP_CTRL_PARAM_FLASH_DATA_KEY_SEED_SIZE;
134 i += kFlashWordSize) {
136 (uint64_t)rand_testutils_gen32() << 32 | rand_testutils_gen32();
140 kFlashDataKeyOffset + i, val));
141 CHECK_STATUS_OK(otp_ctrl_testutils_wait_for_dai(&otp_ctrl));
144 for (uint32_t i = 0; i < OTP_CTRL_PARAM_SRAM_DATA_KEY_SEED_SIZE;
145 i += kFlashWordSize) {
147 (uint64_t)rand_testutils_gen32() << 32 | rand_testutils_gen32();
151 CHECK_STATUS_OK(otp_ctrl_testutils_wait_for_dai(&otp_ctrl));
155 CHECK_STATUS_OK(otp_ctrl_testutils_lock_partition(
159 uint32_t otp_val = 0;
161 otp_val, FLASH_CTRL_DEFAULT_REGION_SCRAMBLE_EN_FIELD,
165 (OTP_CTRL_PARAM_CREATOR_SW_CFG_FLASH_DATA_DEFAULT_CFG_OFFSET -
166 OTP_CTRL_PARAM_CREATOR_SW_CFG_OFFSET),
168 CHECK_STATUS_OK(otp_ctrl_testutils_wait_for_dai(&otp_ctrl));
177 CHECK(
status.codes == 1 << OTP_CTRL_STATUS_DAI_IDLE_BIT);
180 LOG_INFO(
"Completed first phase, wait for reset");
184 }
else if (secret1_locked) {
186 check_iso_data(&flash_ctrl);