12 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
13 #include "sw/device/lib/testing/test_framework/check.h"
17 #include "flash_ctrl_regs.h"
23 OTTF_DEFINE_TEST_CONFIG();
29 kUnusedDataPartitionParam = 0,
32 kFlashBytesPerPage = FLASH_CTRL_PARAM_BYTES_PER_PAGE,
36 kRomExtPageCount = CHIP_ROM_EXT_SIZE_MAX / kFlashBytesPerPage,
40 kBank1StartPageNum = 256 + kRomExtPageCount,
46 FLASH_CTRL_PARAM_BYTES_PER_WORD ==
sizeof(uint64_t),
47 "This test expects the flash word to be sizeof(uint64_t) bytes long.");
59 static void flash_word_write_verify(uintptr_t address,
60 uint64_t expected_value) {
61 size_t kWordSize =
sizeof(uint64_t) /
sizeof(uint32_t);
62 uint32_t tmp[2] = {(uint32_t)expected_value,
63 (uint32_t)(expected_value >> 32)};
64 CHECK_STATUS_OK(flash_ctrl_testutils_write(
65 &flash, address, kUnusedDataPartitionParam, tmp,
66 kDifFlashCtrlPartitionTypeData, kWordSize));
70 flash_ctrl_testutils_read(&flash, address, kUnusedDataPartitionParam,
71 tmp2, kDifFlashCtrlPartitionTypeData, kWordSize,
74 memcpy(&got_value, tmp2,
sizeof(uint64_t));
75 CHECK(expected_value == got_value);
78 static void flash_ctrl_write_clear_test(
79 uint32_t mp_region_index,
84 &flash, mp_region_index, mp_properties));
88 uintptr_t start_addr = (uintptr_t)(mp_properties.
base * kFlashBytesPerPage);
89 CHECK_STATUS_OK(flash_ctrl_testutils_erase_page(
90 &flash, start_addr, kUnusedDataPartitionParam,
91 kDifFlashCtrlPartitionTypeData));
93 const uint64_t kExpectedValues[] = {
94 UINT64_MAX, UINT64_MAX - 1, 0, 0xa5a5a5a594949494, 0xaaaaaaaaaaaaaaaa,
97 for (
size_t i = 0; i <
ARRAYSIZE(kExpectedValues); ++i) {
98 flash_word_write_verify(start_addr +
sizeof(uint64_t) * i,
100 flash_word_write_verify(start_addr, 0);
111 CHECK_STATUS_OK(flash_ctrl_testutils_default_region_access(
112 &flash,
true,
true,
true,
113 false,
false,
false));
116 LOG_INFO(
"ECC enabled with high endurance disabled.");
117 flash_ctrl_write_clear_test(0,
119 .base = kBank1StartPageNum,
122 .rd_en = kMultiBitBool4True,
123 .prog_en = kMultiBitBool4True,
124 .erase_en = kMultiBitBool4True,
125 .scramble_en = kMultiBitBool4False,
126 .ecc_en = kMultiBitBool4True,
127 .high_endurance_en = kMultiBitBool4False,
130 LOG_INFO(
"ECC enabled with high endurance enabled.");
131 flash_ctrl_write_clear_test(1,
133 .base = kBank1StartPageNum + 1,
136 .rd_en = kMultiBitBool4True,
137 .prog_en = kMultiBitBool4True,
138 .erase_en = kMultiBitBool4True,
139 .scramble_en = kMultiBitBool4False,
140 .ecc_en = kMultiBitBool4True,
141 .high_endurance_en = kMultiBitBool4True,