12 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
13 #include "sw/device/lib/testing/pinmux_testutils.h"
14 #include "sw/device/lib/testing/test_framework/check.h"
15 #include "sw/device/lib/testing/test_framework/status.h"
19 static dif_uart_t uart0;
23 kFlashInfoPageIdCreatorSecret = 1,
24 kFlashInfoPageIdOwnerSecret = 2,
25 kFlashInfoPageIdIsoPart = 3,
27 kFlashDataRegionZero = 0,
28 kFlashDataRegionOne = 1,
29 kRegionBaseBank0Page0Index = 0,
30 kRegionBaseBank1Page0Index = 256,
35 kNumTestBytes = kNumTestWords *
sizeof(uint32_t),
39 kTestPhaseCheckUnscrambledInit0 = 0,
40 kTestPhaseCheckUnscrambledInit1 = 1,
41 kTestPhaseCheckUnscrambledInit2 = 2,
42 kTestPhaseCheckScrambledInit0 = 3,
43 kTestPhaseCheckScrambledInit1 = 4,
44 kTestPhaseCheckBackdoor0 = 5,
45 kTestPhaseCheckBackdoor1 = 6,
46 kTestPhaseKeymgrPrep = 7,
47 kTestPhaseKeymgrTest0 = 8,
48 kTestPhaseKeymgrTest1 = 9,
53 kAddressBank0Page0Data = 0,
54 kAddressBank1Page0Data = 1,
55 kAddressCreatorSecret = 2,
56 kAddressOwnerSecret = 3,
61 kCreatorSecretDataRetSramAddress = 0,
62 kOwnerSecretDataRetSramAddress =
63 kCreatorSecretDataRetSramAddress + (kNumTestWords *
sizeof(uint32_t)),
64 kIsoPartDataRetSramAddress =
65 kOwnerSecretDataRetSramAddress + (kNumTestWords *
sizeof(uint32_t)),
66 kBank0Page0DataRetSramAddress =
67 kIsoPartDataRetSramAddress + (kNumTestWords *
sizeof(uint32_t)),
68 kBank1Page0DataRetSramAddress =
69 kBank0Page0DataRetSramAddress + (kNumTestWords *
sizeof(uint32_t)),
73 static volatile const uint8_t kTestPhase = 0;
77 static uint32_t kCreatorSecretData[kNumTestWords];
78 static uint32_t kOwnerSecretData[kNumTestWords];
79 static uint32_t kIsoPartData[kNumTestWords];
80 static uint32_t kBank0Page0Data[kNumTestWords];
81 static uint32_t kBank1Page0Data[kNumTestWords];
83 static uint32_t region_addresses[kNumRegions];
85 static void setup_unscrambled_regions(
void) {
86 CHECK_STATUS_OK(flash_ctrl_testutils_data_region_setup(
87 &flash_state, kRegionBaseBank0Page0Index, kFlashDataRegionZero,
88 kRegionSize, ®ion_addresses[kAddressBank0Page0Data]));
89 CHECK_STATUS_OK(flash_ctrl_testutils_data_region_setup(
90 &flash_state, kRegionBaseBank1Page0Index, kFlashDataRegionOne,
91 kRegionSize, ®ion_addresses[kAddressBank1Page0Data]));
92 CHECK_STATUS_OK(flash_ctrl_testutils_info_region_setup(
93 &flash_state, kFlashInfoPageIdCreatorSecret, kFlashInfoBank, kPartitionId,
94 ®ion_addresses[kAddressCreatorSecret]));
95 CHECK_STATUS_OK(flash_ctrl_testutils_info_region_setup(
96 &flash_state, kFlashInfoPageIdOwnerSecret, kFlashInfoBank, kPartitionId,
97 ®ion_addresses[kAddressOwnerSecret]));
99 CHECK_STATUS_OK(flash_ctrl_testutils_info_region_setup(
100 &flash_state, kFlashInfoPageIdIsoPart, kFlashInfoBank, kPartitionId,
101 ®ion_addresses[kAddressIsoPart]));
104 static void setup_scrambled_regions(
void) {
105 CHECK_STATUS_OK(flash_ctrl_testutils_data_region_scrambled_setup(
106 &flash_state, kRegionBaseBank0Page0Index, kFlashDataRegionZero,
107 kRegionSize, ®ion_addresses[kAddressBank0Page0Data]));
108 CHECK_STATUS_OK(flash_ctrl_testutils_data_region_scrambled_setup(
109 &flash_state, kRegionBaseBank1Page0Index, kFlashDataRegionOne,
110 kRegionSize, ®ion_addresses[kAddressBank1Page0Data]));
111 CHECK_STATUS_OK(flash_ctrl_testutils_info_region_scrambled_setup(
112 &flash_state, kFlashInfoPageIdCreatorSecret, kFlashInfoBank, kPartitionId,
113 ®ion_addresses[kAddressCreatorSecret]));
114 CHECK_STATUS_OK(flash_ctrl_testutils_info_region_scrambled_setup(
115 &flash_state, kFlashInfoPageIdOwnerSecret, kFlashInfoBank, kPartitionId,
116 ®ion_addresses[kAddressOwnerSecret]));
117 CHECK_STATUS_OK(flash_ctrl_testutils_info_region_scrambled_setup(
118 &flash_state, kFlashInfoPageIdIsoPart, kFlashInfoBank, kPartitionId,
119 ®ion_addresses[kAddressIsoPart]));
122 static void erase_and_write_regions(
void) {
123 CHECK_STATUS_OK(flash_ctrl_testutils_erase_and_write_page(
124 &flash_state, region_addresses[kAddressBank0Page0Data], kPartitionId,
125 kBank0Page0Data, kDifFlashCtrlPartitionTypeData, kNumTestWords));
126 CHECK_STATUS_OK(flash_ctrl_testutils_erase_and_write_page(
127 &flash_state, region_addresses[kAddressBank1Page0Data], kPartitionId,
128 kBank1Page0Data, kDifFlashCtrlPartitionTypeData, kNumTestWords));
129 CHECK_STATUS_OK(flash_ctrl_testutils_erase_and_write_page(
130 &flash_state, region_addresses[kAddressCreatorSecret], kPartitionId,
131 kCreatorSecretData, kDifFlashCtrlPartitionTypeInfo, kNumTestWords));
132 CHECK_STATUS_OK(flash_ctrl_testutils_erase_and_write_page(
133 &flash_state, region_addresses[kAddressOwnerSecret], kPartitionId,
134 kOwnerSecretData, kDifFlashCtrlPartitionTypeInfo, kNumTestWords));
135 CHECK_STATUS_OK(flash_ctrl_testutils_erase_and_write_page(
136 &flash_state, region_addresses[kAddressIsoPart], kPartitionId,
137 kIsoPartData, kDifFlashCtrlPartitionTypeInfo, kNumTestWords));
140 static void read_and_check_host_if(uint32_t addr,
const uint32_t *check_data) {
141 uint32_t host_data[kNumTestWords];
145 CHECK_ARRAYS_EQ(host_data, check_data, kNumTestWords);
148 static void check_readback_data_match(
void) {
149 uint32_t readback_data[kNumTestWords];
150 CHECK_STATUS_OK(flash_ctrl_testutils_read(
151 &flash_state, region_addresses[kAddressBank0Page0Data], kPartitionId,
152 readback_data, kDifFlashCtrlPartitionTypeData, kNumTestWords, 0));
153 CHECK_ARRAYS_EQ(readback_data, kBank0Page0Data, kNumTestWords);
154 CHECK_STATUS_OK(flash_ctrl_testutils_read(
155 &flash_state, region_addresses[kAddressBank1Page0Data], kPartitionId,
156 readback_data, kDifFlashCtrlPartitionTypeData, kNumTestWords, 0));
157 CHECK_ARRAYS_EQ(readback_data, kBank1Page0Data, kNumTestWords);
158 CHECK_STATUS_OK(flash_ctrl_testutils_read(
159 &flash_state, region_addresses[kAddressCreatorSecret], kPartitionId,
160 readback_data, kDifFlashCtrlPartitionTypeInfo, kNumTestWords, 0));
161 CHECK_ARRAYS_EQ(readback_data, kCreatorSecretData, kNumTestWords);
162 CHECK_STATUS_OK(flash_ctrl_testutils_read(
163 &flash_state, region_addresses[kAddressOwnerSecret], kPartitionId,
164 readback_data, kDifFlashCtrlPartitionTypeInfo, kNumTestWords, 0));
165 CHECK_ARRAYS_EQ(readback_data, kOwnerSecretData, kNumTestWords);
166 CHECK_STATUS_OK(flash_ctrl_testutils_read(
167 &flash_state, region_addresses[kAddressIsoPart], kPartitionId,
168 readback_data, kDifFlashCtrlPartitionTypeInfo, kNumTestWords, 0));
169 CHECK_ARRAYS_EQ(readback_data, kIsoPartData, kNumTestWords);
171 read_and_check_host_if(kRegionBaseBank0Page0Index, kBank0Page0Data);
172 read_and_check_host_if(kPageSize * kRegionBaseBank1Page0Index,
176 static bool transaction_end_check_read_error(
void) {
193 return is_read_error;
196 static void check_readback_fail(
void) {
197 uint32_t readback_data[kNumTestWords];
200 .byte_address = region_addresses[kAddressBank0Page0Data],
202 .partition_type = kDifFlashCtrlPartitionTypeData,
203 .partition_id = kPartitionId,
204 .word_count = kNumTestWords};
208 CHECK(transaction_end_check_read_error());
210 transaction.byte_address = region_addresses[kAddressBank1Page0Data];
214 CHECK(transaction_end_check_read_error());
216 transaction.partition_type = kDifFlashCtrlPartitionTypeInfo;
217 transaction.byte_address = region_addresses[kAddressCreatorSecret];
221 CHECK(transaction_end_check_read_error());
223 transaction.byte_address = region_addresses[kAddressOwnerSecret];
227 CHECK(transaction_end_check_read_error());
229 transaction.byte_address = region_addresses[kAddressIsoPart];
233 CHECK(transaction_end_check_read_error());
236 static void flash_init(
void) {
247 static void check_unscrambled_init(
void) {
248 setup_unscrambled_regions();
249 erase_and_write_regions();
251 check_readback_data_match();
252 test_status_set(kTestStatusInWfi);
256 static void check_scrambled_init(
void) {
257 setup_scrambled_regions();
258 erase_and_write_regions();
259 check_readback_data_match();
261 check_readback_fail();
262 test_status_set(kTestStatusInWfi);
266 static void check_scrambled_backdoor_data(
void) {
267 setup_scrambled_regions();
269 check_readback_data_match();
270 test_status_set(kTestStatusInWfi);
274 bool rom_test_main(
void) {
277 test_status_set(kTestStatusInTest);
279 CHECK_DIF_OK(dif_pinmux_init(
281 pinmux_testutils_init(&pinmux);
286 CHECK_DIF_OK(dif_uart_init(
288 CHECK(
kUartBaudrate <= UINT32_MAX,
"kUartBaudrate must fit in uint32_t");
290 "kClockFreqPeripheralHz must fit in uint32_t");
308 kCreatorSecretDataRetSramAddress,
309 &kCreatorSecretData, kNumTestBytes);
311 kOwnerSecretDataRetSramAddress,
312 &kOwnerSecretData, kNumTestBytes);
314 kIsoPartDataRetSramAddress, &kIsoPartData,
317 kBank0Page0DataRetSramAddress,
318 &kBank0Page0Data, kNumTestBytes);
320 kBank1Page0DataRetSramAddress,
321 &kBank1Page0Data, kNumTestBytes);
327 switch (kTestPhase) {
328 case kTestPhaseCheckUnscrambledInit0:
329 case kTestPhaseCheckUnscrambledInit1:
330 case kTestPhaseCheckUnscrambledInit2:
331 check_unscrambled_init();
333 case kTestPhaseCheckScrambledInit0:
334 case kTestPhaseCheckScrambledInit1:
335 check_scrambled_init();
337 case kTestPhaseCheckBackdoor0:
338 case kTestPhaseCheckBackdoor1:
339 check_scrambled_backdoor_data();
341 case kTestPhaseKeymgrPrep:
342 case kTestPhaseKeymgrTest0:
343 case kTestPhaseKeymgrTest1:
345 test_status_set(kTestStatusInWfi);