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,