7 #include "sw/device/lib/testing/test_framework/check.h"
10 #include "sw/device/silicon_creator/lib/boot_data.h"
11 #include "sw/device/silicon_creator/lib/drivers/flash_ctrl.h"
12 #include "sw/device/silicon_creator/lib/drivers/otp.h"
14 #include "flash_ctrl_regs.h"
16 #include "otp_ctrl_regs.h"
18 OTTF_DEFINE_TEST_CONFIG();
24 &kFlashCtrlInfoPageBootData0,
25 &kFlashCtrlInfoPageBootData1,
42 .identifier = kBootDataIdentifier,
43 .version = kBootDataVersion2,
44 .is_valid = kBootDataValidEntry,
46 .counter = kBootDataDefaultCounterVal + 1,
47 .min_security_version_rom_ext = 0,
48 .primary_bl0_slot = kBootSlotA,
61 multi_bit_bool_t mubi_perm =
63 for (
size_t i = 0; i <
ARRAYSIZE(kPages); ++i) {
75 static void erase_boot_data_pages(
void) {
77 for (
size_t i = 0; i <
ARRAYSIZE(kPages); ++i) {
78 CHECK(flash_ctrl_info_erase(kPages[i], kFlashCtrlEraseTypePage) == kErrorOk,
79 "Flash page erase failed.");
96 const uint32_t offset = index *
sizeof(
boot_data_t);
97 uint32_t buf[kBootDataNumWords];
100 CHECK(flash_ctrl_info_write(page, offset, kBootDataNumWords, buf) == kErrorOk,
101 "Flash write failed.");
102 CHECK(flash_ctrl_info_read(page, offset, kBootDataNumWords, buf) == kErrorOk,
103 "Flash read failed.");
106 "Flash write failed.");
118 const uint32_t offset = index *
sizeof(
boot_data_t);
119 uint32_t buf[kBootDataNumWords];
121 CHECK(flash_ctrl_info_read(page, offset, kBootDataNumWords, buf) == kErrorOk,
122 "Flash read failed.");
143 invalidated.
is_valid = kBootDataInvalidEntry;
144 for (
size_t i = 0; i < num_entries; ++i) {
145 write_boot_data(page, i, &invalidated);
156 static rom_error_t compare_boot_data(
const boot_data_t *lhs,
159 return kErrorUnknown;
181 return kErrorUnknown;
185 return kErrorUnknown;
189 hmac_sha256((
const char *)
boot_data + kDigestRegionOffset, kDigestRegionSize,
192 return kErrorUnknown;
197 rom_error_t check_test_data_test(
void) {
198 RETURN_IF_ERROR(check_boot_data(&kTestBootData, kTestBootData.
counter));
202 rom_error_t read_empty_default_in_non_prod(
void) {
203 erase_boot_data_pages();
206 RETURN_IF_ERROR(boot_data_read(kLcStateTest, &
boot_data));
207 RETURN_IF_ERROR(check_boot_data(&
boot_data, 5));
211 rom_error_t read_empty_default_in_prod(
void) {
212 erase_boot_data_pages();
214 rom_error_t exp_error = kErrorBootDataNotFound;
216 OTP_CTRL_PARAM_CREATOR_SW_CFG_DEFAULT_BOOT_DATA_IN_PROD_EN_OFFSET);
218 exp_error = kErrorOk;
222 if (boot_data_read(kLcStateProd, &
boot_data) == exp_error) {
225 return kErrorUnknown;
228 rom_error_t read_single_page_0_test(
void) {
229 erase_boot_data_pages();
230 write_boot_data(kPages[0], 0, &kTestBootData);
233 RETURN_IF_ERROR(boot_data_read(kLcStateProd, &
boot_data));
234 RETURN_IF_ERROR(compare_boot_data(&
boot_data, &kTestBootData));
238 rom_error_t read_single_page_1_test(
void) {
239 erase_boot_data_pages();
240 write_boot_data(kPages[1], 0, &kTestBootData);
244 RETURN_IF_ERROR(boot_data_read(kLcStateProd, &
boot_data));
246 RETURN_IF_ERROR(compare_boot_data(&
boot_data, &kTestBootData));
247 if (end - start > UINT32_MAX) {
248 LOG_FATAL(
"boot_data_read() took more than UINT32_MAX cycles");
249 return kErrorUnknown;
251 uint32_t cycles = (uint32_t)(end - start);
252 LOG_INFO(
"boot_data_read() took %u cycles", cycles);
256 rom_error_t read_full_page_0_test(
void) {
257 erase_boot_data_pages();
258 fill_with_invalidated_boot_data(kPages[0], kBootDataEntriesPerPage - 1,
260 write_boot_data(kPages[0], kBootDataEntriesPerPage - 1, &kTestBootData);
261 fill_with_invalidated_boot_data(kPages[1], kBootDataEntriesPerPage,
265 RETURN_IF_ERROR(boot_data_read(kLcStateProd, &
boot_data));
266 RETURN_IF_ERROR(compare_boot_data(&
boot_data, &kTestBootData));
270 rom_error_t read_full_page_1_test(
void) {
271 erase_boot_data_pages();
272 fill_with_invalidated_boot_data(kPages[0], kBootDataEntriesPerPage,
274 fill_with_invalidated_boot_data(kPages[1], kBootDataEntriesPerPage - 1,
276 write_boot_data(kPages[1], kBootDataEntriesPerPage - 1, &kTestBootData);
280 RETURN_IF_ERROR(boot_data_read(kLcStateProd, &
boot_data));
282 RETURN_IF_ERROR(compare_boot_data(&
boot_data, &kTestBootData));
284 CHECK(end - start <= UINT32_MAX,
"Cycle count must fit in uint32_t");
285 uint32_t cycles = (uint32_t)(end - start);
286 LOG_INFO(
"boot_data_read() took %u cycles", cycles);
290 rom_error_t write_empty_test(
void) {
291 erase_boot_data_pages();
292 RETURN_IF_ERROR(boot_data_write(&kTestBootData));
294 RETURN_IF_ERROR(boot_data_read(kLcStateProd, &
boot_data));
295 RETURN_IF_ERROR(compare_boot_data(&kTestBootData, &
boot_data));
299 rom_error_t write_page_switch_test(
void) {
300 erase_boot_data_pages();
303 uint32_t counter_exp = kBootDataDefaultCounterVal;
307 for (
size_t i = 0; i < kBootDataEntriesPerPage + 1; ++i) {
308 RETURN_IF_ERROR(boot_data_write(&kTestBootData));
310 RETURN_IF_ERROR(boot_data_read(kLcStateProd, &boot_data_act));
311 RETURN_IF_ERROR(check_boot_data(&boot_data_act, ++counter_exp));
315 read_boot_data(kPages[0], i - 1, &prev_entry);
316 if (prev_entry.
is_valid != kBootDataInvalidEntry) {
317 LOG_ERROR(
"Previous entry was not invalidated");
318 return kErrorUnknown;
323 read_boot_data(kPages[1], 0, &boot_data_exp);
326 return kErrorUnknown;
331 for (
size_t i = 1; i < kBootDataEntriesPerPage + 1; ++i) {
332 RETURN_IF_ERROR(boot_data_write(&kTestBootData));
334 RETURN_IF_ERROR(boot_data_read(kLcStateProd, &boot_data_act));
335 RETURN_IF_ERROR(check_boot_data(&boot_data_act, ++counter_exp));
338 read_boot_data(kPages[1], i - 1, &prev_entry);
339 if (prev_entry.
is_valid != kBootDataInvalidEntry) {
340 LOG_ERROR(
"Previous entry was not invalidated");
341 return kErrorUnknown;
345 read_boot_data(kPages[0], 0, &boot_data_exp);
348 return kErrorUnknown;
374 return status_ok(result);