11 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
12 #include "sw/device/lib/testing/rand_testutils.h"
13 #include "sw/device/lib/testing/test_framework/check.h"
17 #include "otp_ctrl_regs.h"
25 #define FLASH_CTRL_OTP_FIELD_SCRAMBLING \
26 (bitfield_field32_t) { .mask = UINT8_MAX, .index = CHAR_BIT * 0 }
27 #define FLASH_CTRL_OTP_FIELD_ECC \
28 (bitfield_field32_t) { .mask = UINT8_MAX, .index = CHAR_BIT * 1 }
29 #define FLASH_CTRL_OTP_FIELD_HE \
30 (bitfield_field32_t) { .mask = UINT8_MAX, .index = CHAR_BIT * 2 }
32 OTTF_DEFINE_TEST_CONFIG();
35 kFlashInfoPageIdCreatorSecret = 1,
36 kFlashInfoPageIdOwnerSecret = 2,
37 kFlashInfoPageIdIsoPart = 3,
41 kRegionBaseBank0Page0Index = 0,
51 static uint32_t test_data[kDataSize];
53 static uint32_t flash_bank_0_data_region;
54 static uint32_t flash_bank_1_data_region;
55 static uint32_t flash_bank_1_page_index;
56 static uint32_t flash_bank_1_page_index_last;
61 static void read_and_check_host_if(uint32_t addr,
const uint32_t *check_data) {
64 uint32_t host_data[kDataSize];
65 for (
int i = 0; i < kDataSize; ++i) {
67 mmio_region_read32(flash_addr, i * (ptrdiff_t)
sizeof(uint32_t));
69 CHECK_ARRAYS_EQ(host_data, check_data, kDataSize);
77 static void do_info_partition_test(uint32_t partition_number) {
79 CHECK_STATUS_OK(flash_ctrl_testutils_info_region_setup(
80 &flash_state, partition_number, kFlashInfoBank, kPartitionId, &address));
82 for (
int i = 0; i < kDataSize; ++i) {
83 test_data[i] = rand_testutils_gen32();
86 CHECK_STATUS_OK(flash_ctrl_testutils_erase_page(
87 &flash_state, address, kPartitionId, kDifFlashCtrlPartitionTypeInfo));
89 flash_ctrl_testutils_write(&flash_state, address, kPartitionId, test_data,
90 kDifFlashCtrlPartitionTypeInfo, kDataSize));
92 uint32_t readback_data[kDataSize];
93 CHECK_STATUS_OK(flash_ctrl_testutils_read(
94 &flash_state, address, kPartitionId, readback_data,
95 kDifFlashCtrlPartitionTypeInfo, kDataSize, 0));
97 CHECK_ARRAYS_EQ(readback_data, test_data, kDataSize);
105 static void do_data_partition_test(uint32_t bank_number) {
106 if (bank_number == 0) {
109 uint32_t address = 0;
110 uint32_t otp_val = abs_mmio_read32(
112 OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET +
113 OTP_CTRL_PARAM_CREATOR_SW_CFG_FLASH_DATA_DEFAULT_CFG_OFFSET);
121 .erase_en = kMultiBitBool4True,
122 .prog_en = kMultiBitBool4True,
123 .rd_en = kMultiBitBool4True};
125 CHECK_STATUS_OK(flash_ctrl_testutils_data_region_setup_properties(
126 &flash_state, kRegionBaseBank0Page0Index, flash_bank_0_data_region,
127 kRegionSize, region_properties, &address));
129 uint32_t readback_data[kDataSize];
130 CHECK_STATUS_OK(flash_ctrl_testutils_read(
131 &flash_state, address, kPartitionId, readback_data,
132 kDifFlashCtrlPartitionTypeData, kDataSize, 0));
134 read_and_check_host_if(kRegionBaseBank0Page0Index, readback_data);
135 }
else if (bank_number == 1) {
136 for (
int i = 0; i < 2; ++i) {
137 uint32_t page_index =
138 (i == 0) ? flash_bank_1_page_index : flash_bank_1_page_index_last;
139 for (
int j = 0; j < kDataSize; ++j) {
140 test_data[i] = rand_testutils_gen32();
142 uint32_t address = 0;
143 CHECK_STATUS_OK(flash_ctrl_testutils_data_region_setup(
144 &flash_state, page_index, flash_bank_1_data_region, kRegionSize,
146 CHECK_STATUS_OK(flash_ctrl_testutils_erase_page(
147 &flash_state, address, kPartitionId, kDifFlashCtrlPartitionTypeData));
148 CHECK_STATUS_OK(flash_ctrl_testutils_write(
149 &flash_state, address, kPartitionId, test_data,
150 kDifFlashCtrlPartitionTypeData, kDataSize));
152 uint32_t readback_data[kDataSize];
153 CHECK_STATUS_OK(flash_ctrl_testutils_read(
154 &flash_state, address, kPartitionId, readback_data,
155 kDifFlashCtrlPartitionTypeData, kDataSize, 1));
156 read_and_check_host_if(kPageSize * page_index, test_data);
157 CHECK_ARRAYS_EQ(readback_data, test_data, kDataSize);
160 LOG_ERROR(
"Unexpected bank number, only 0 and 1 are valid.");
171 flash_bank_0_data_region = 0;
172 flash_bank_1_page_index = flash_info.
data_pages;
176 flash_bank_0_data_region = 2;
179 flash_bank_1_page_index = flash_info.
data_pages + 0x20;
181 flash_bank_1_data_region = flash_bank_0_data_region + 1;
182 flash_bank_1_page_index_last = flash_info.
data_pages * 2 - 1;
185 CHECK_DIF_OK(dif_clkmgr_init(
194 for (
int i = 0; i < kNumLoops; ++i) {
196 do_info_partition_test(kFlashInfoPageIdCreatorSecret);
197 do_info_partition_test(kFlashInfoPageIdOwnerSecret);
198 do_info_partition_test(kFlashInfoPageIdIsoPart);
199 do_data_partition_test(kFlashDataBank0);
201 do_data_partition_test(kFlashDataBank1);