5 #include "sw/device/silicon_creator/rom/bootstrap.h"
10 #include "gtest/gtest.h"
11 #include "sw/device/lib/base/mock_abs_mmio.h"
13 #include "sw/device/silicon_creator/lib/bootstrap_unittest_util.h"
14 #include "sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.h"
15 #include "sw/device/silicon_creator/lib/drivers/mock_otp.h"
16 #include "sw/device/silicon_creator/lib/drivers/mock_rstmgr.h"
17 #include "sw/device/silicon_creator/lib/drivers/mock_spi_device.h"
18 #include "sw/device/silicon_creator/testing/rom_test.h"
20 #include "flash_ctrl_regs.h"
21 #include "gpio_regs.h"
23 #include "otp_ctrl_regs.h"
25 namespace bootstrap_unittest {
29 using bootstrap_unittest_util::ChipEraseCmd;
30 using bootstrap_unittest_util::PageProgramCmd;
31 using bootstrap_unittest_util::ResetCmd;
32 using bootstrap_unittest_util::SectorEraseCmd;
34 using ::testing::NotNull;
35 using ::testing::Return;
37 MATCHER_P(HasBytes, bytes,
"") {
38 return std::memcmp(arg, bytes.data(), bytes.size()) == 0;
43 read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_BOOTSTRAP_DIS_OFFSET))
51 read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_BOOTSTRAP_DIS_OFFSET))
58 read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_BOOTSTRAP_DIS_OFFSET))
66 ExpectBootstrapRequestCheck(
true);
67 EXPECT_CALL(spi_device_, Init());
68 EXPECT_CALL(spi_device_, CmdGet(NotNull()))
69 .WillOnce(Return(kErrorSpiDevicePayloadOverflow));
71 EXPECT_EQ(bootstrap(), kErrorSpiDevicePayloadOverflow);
76 ExpectBootstrapRequestCheck(
true);
77 EXPECT_CALL(spi_device_, Init());
78 ExpectSpiCmd(ChipEraseCmd());
79 ExpectSpiFlashStatusGet(
true);
80 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
82 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorOk);
83 EXPECT_CALL(spi_device_, FlashStatusClear());
85 EXPECT_CALL(spi_device_, CmdGet(NotNull()))
86 .WillOnce(Return(kErrorSpiDevicePayloadOverflow));
88 EXPECT_EQ(bootstrap(), kErrorSpiDevicePayloadOverflow);
93 ExpectBootstrapRequestCheck(
true);
94 EXPECT_CALL(spi_device_, Init());
95 ExpectSpiCmd(ChipEraseCmd());
96 ExpectSpiFlashStatusGet(
true);
97 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
99 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorOk);
100 EXPECT_CALL(spi_device_, FlashStatusClear());
102 auto cmd = PageProgramCmd(0, 16);
104 ExpectSpiFlashStatusGet(
true);
106 std::vector<uint8_t> flash_bytes(cmd.payload,
107 cmd.payload + cmd.payload_byte_count);
109 ExpectFlashCtrlWriteEnable();
110 EXPECT_CALL(flash_ctrl_, DataWrite(0, 4, HasBytes(flash_bytes)))
111 .WillOnce(Return(kErrorOk));
112 ExpectFlashCtrlAllDisable();
114 EXPECT_CALL(spi_device_, FlashStatusClear());
116 ExpectSpiCmd(ResetCmd());
117 EXPECT_CALL(rstmgr_, Reset());
119 EXPECT_EQ(bootstrap(), kErrorUnknown);
124 ExpectBootstrapRequestCheck(
true);
125 EXPECT_CALL(spi_device_, Init());
126 ExpectSpiCmd(ChipEraseCmd());
127 ExpectSpiFlashStatusGet(
true);
128 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
130 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorOk);
131 EXPECT_CALL(spi_device_, FlashStatusClear());
133 auto cmd = PageProgramCmd(0, 17);
135 ExpectSpiFlashStatusGet(
true);
137 std::vector<uint8_t> flash_bytes(cmd.payload,
138 cmd.payload + cmd.payload_byte_count);
139 for (
size_t i = 0; i < 7; ++i) {
140 flash_bytes.push_back(0xff);
143 ExpectFlashCtrlWriteEnable();
144 EXPECT_CALL(flash_ctrl_, DataWrite(cmd.address, 6, HasBytes(flash_bytes)))
145 .WillOnce(Return(kErrorOk));
146 ExpectFlashCtrlAllDisable();
148 EXPECT_CALL(spi_device_, FlashStatusClear());
150 ExpectSpiCmd(ResetCmd());
151 EXPECT_CALL(rstmgr_, Reset());
153 EXPECT_EQ(bootstrap(), kErrorUnknown);
158 ExpectBootstrapRequestCheck(
true);
159 EXPECT_CALL(spi_device_, Init());
160 ExpectSpiCmd(ChipEraseCmd());
161 ExpectSpiFlashStatusGet(
true);
162 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
164 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorOk);
165 EXPECT_CALL(spi_device_, FlashStatusClear());
167 auto cmd = PageProgramCmd(0xfff0, 256);
169 ExpectSpiFlashStatusGet(
true);
171 std::vector<uint8_t> flash_bytes_0(cmd.payload, cmd.payload + 16);
172 std::vector<uint8_t> flash_bytes_1(cmd.payload + 16,
173 cmd.payload + cmd.payload_byte_count);
175 ExpectFlashCtrlWriteEnable();
176 EXPECT_CALL(flash_ctrl_, DataWrite(0xfff0, 4, HasBytes(flash_bytes_0)))
177 .WillOnce(Return(kErrorOk));
178 EXPECT_CALL(flash_ctrl_, DataWrite(0xff00, 60, HasBytes(flash_bytes_1)))
179 .WillOnce(Return(kErrorOk));
180 ExpectFlashCtrlAllDisable();
182 EXPECT_CALL(spi_device_, FlashStatusClear());
184 ExpectSpiCmd(ResetCmd());
185 EXPECT_CALL(rstmgr_, Reset());
187 EXPECT_EQ(bootstrap(), kErrorUnknown);
192 ExpectBootstrapRequestCheck(
true);
193 EXPECT_CALL(spi_device_, Init());
194 ExpectSpiCmd(ChipEraseCmd());
195 ExpectSpiFlashStatusGet(
true);
196 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
198 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorOk);
199 EXPECT_CALL(spi_device_, FlashStatusClear());
201 auto cmd = PageProgramCmd(816, 8);
203 ExpectSpiFlashStatusGet(
true);
205 std::vector<uint8_t> flash_bytes(cmd.payload,
206 cmd.payload + cmd.payload_byte_count);
208 ExpectFlashCtrlWriteEnable();
209 EXPECT_CALL(flash_ctrl_, DataWrite(816, 2, HasBytes(flash_bytes)))
210 .WillOnce(Return(kErrorOk));
211 ExpectFlashCtrlAllDisable();
213 EXPECT_CALL(spi_device_, FlashStatusClear());
215 ExpectSpiCmd(ResetCmd());
216 EXPECT_CALL(rstmgr_, Reset());
218 EXPECT_EQ(bootstrap(), kErrorUnknown);
223 ExpectBootstrapRequestCheck(
true);
224 EXPECT_CALL(spi_device_, Init());
225 ExpectSpiCmd(SectorEraseCmd(0));
226 ExpectSpiFlashStatusGet(
true);
227 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
229 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorOk);
230 EXPECT_CALL(spi_device_, FlashStatusClear());
232 auto cmd = PageProgramCmd(0, 16);
234 ExpectSpiFlashStatusGet(
true);
236 std::vector<uint8_t> flash_bytes(cmd.payload,
237 cmd.payload + cmd.payload_byte_count);
239 ExpectFlashCtrlWriteEnable();
240 EXPECT_CALL(flash_ctrl_,
241 DataWrite(cmd.address, cmd.payload_byte_count /
sizeof(uint32_t),
242 HasBytes(flash_bytes)))
243 .WillOnce(Return(kErrorOk));
244 ExpectFlashCtrlAllDisable();
246 EXPECT_CALL(spi_device_, FlashStatusClear());
248 ExpectSpiCmd(ResetCmd());
249 EXPECT_CALL(rstmgr_, Reset());
251 EXPECT_EQ(bootstrap(), kErrorUnknown);
256 ExpectBootstrapRequestCheck(
true);
257 EXPECT_CALL(spi_device_, Init());
258 ExpectSpiCmd(ChipEraseCmd());
259 ExpectSpiFlashStatusGet(
true);
260 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
262 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorOk);
263 EXPECT_CALL(spi_device_, FlashStatusClear());
265 auto cmd = PageProgramCmd(0, 16);
267 ExpectSpiFlashStatusGet(
true);
269 std::vector<uint8_t> flash_bytes(cmd.payload,
270 cmd.payload + cmd.payload_byte_count);
272 ExpectFlashCtrlWriteEnable();
273 EXPECT_CALL(flash_ctrl_,
274 DataWrite(cmd.address, cmd.payload_byte_count /
sizeof(uint32_t),
275 HasBytes(flash_bytes)))
276 .WillOnce(Return(kErrorOk));
277 ExpectFlashCtrlAllDisable();
279 EXPECT_CALL(spi_device_, FlashStatusClear());
281 ExpectSpiCmd(ChipEraseCmd());
282 ExpectSpiFlashStatusGet(
true);
283 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
284 EXPECT_CALL(spi_device_, FlashStatusClear());
286 ExpectSpiCmd(SectorEraseCmd(0));
287 ExpectSpiFlashStatusGet(
true);
288 ExpectFlashCtrlSectorErase(kErrorOk, kErrorOk, 0);
289 EXPECT_CALL(spi_device_, FlashStatusClear());
292 ExpectSpiCmd(ResetCmd());
293 EXPECT_CALL(rstmgr_, Reset());
295 EXPECT_EQ(bootstrap(), kErrorUnknown);
300 ExpectBootstrapRequestCheck(
true);
301 EXPECT_CALL(spi_device_, Init());
302 ExpectSpiCmd(ChipEraseCmd());
303 ExpectSpiFlashStatusGet(
true);
304 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
306 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorOk);
307 EXPECT_CALL(spi_device_, FlashStatusClear());
309 ExpectSpiCmd(SectorEraseCmd(5));
310 ExpectSpiFlashStatusGet(
true);
311 ExpectFlashCtrlSectorErase(kErrorOk, kErrorOk, 0);
312 EXPECT_CALL(spi_device_, FlashStatusClear());
314 ExpectSpiCmd(SectorEraseCmd(4096));
315 ExpectSpiFlashStatusGet(
true);
316 ExpectFlashCtrlSectorErase(kErrorOk, kErrorOk, 4096);
317 EXPECT_CALL(spi_device_, FlashStatusClear());
319 ExpectSpiCmd(SectorEraseCmd(8195));
320 ExpectSpiFlashStatusGet(
true);
321 ExpectFlashCtrlSectorErase(kErrorOk, kErrorOk, 8192);
322 EXPECT_CALL(spi_device_, FlashStatusClear());
324 ExpectSpiCmd(ResetCmd());
325 EXPECT_CALL(rstmgr_, Reset());
327 EXPECT_EQ(bootstrap(), kErrorUnknown);
332 ExpectBootstrapRequestCheck(
true);
333 EXPECT_CALL(spi_device_, Init());
334 ExpectSpiCmd(ChipEraseCmd());
335 ExpectSpiFlashStatusGet(
false);
336 ExpectSpiCmd(ResetCmd());
337 ExpectSpiFlashStatusGet(
true);
338 EXPECT_CALL(spi_device_, FlashStatusClear());
339 ExpectSpiCmd(ChipEraseCmd());
340 ExpectSpiFlashStatusGet(
true);
341 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
343 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorOk);
344 EXPECT_CALL(spi_device_, FlashStatusClear());
346 ExpectSpiCmd(SectorEraseCmd(0));
347 ExpectSpiFlashStatusGet(
false);
348 ExpectSpiCmd(ChipEraseCmd());
349 ExpectSpiFlashStatusGet(
false);
350 ExpectSpiCmd(PageProgramCmd(0, 16));
351 ExpectSpiFlashStatusGet(
false);
353 ExpectSpiCmd(ResetCmd());
354 EXPECT_CALL(rstmgr_, Reset());
356 EXPECT_EQ(bootstrap(), kErrorUnknown);
360 ExpectBootstrapRequestCheck(
true);
361 EXPECT_CALL(spi_device_, Init());
362 ExpectSpiCmd(ChipEraseCmd());
363 ExpectSpiFlashStatusGet(
true);
364 ExpectFlashCtrlChipErase(kErrorUnknown, kErrorOk);
366 EXPECT_EQ(bootstrap(), kErrorUnknown);
370 ExpectBootstrapRequestCheck(
true);
371 EXPECT_CALL(spi_device_, Init());
372 ExpectSpiCmd(ChipEraseCmd());
373 ExpectSpiFlashStatusGet(
true);
374 ExpectFlashCtrlChipErase(kErrorOk, kErrorUnknown);
376 EXPECT_EQ(bootstrap(), kErrorUnknown);
381 ExpectBootstrapRequestCheck(
true);
382 EXPECT_CALL(spi_device_, Init());
383 ExpectSpiCmd(ChipEraseCmd());
384 ExpectSpiFlashStatusGet(
true);
385 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
387 ExpectFlashCtrlEraseVerify(kErrorUnknown, kErrorOk);
389 EXPECT_EQ(bootstrap(), kErrorUnknown);
394 ExpectBootstrapRequestCheck(
true);
395 EXPECT_CALL(spi_device_, Init());
396 ExpectSpiCmd(ChipEraseCmd());
397 ExpectSpiFlashStatusGet(
true);
398 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
400 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorUnknown);
402 EXPECT_EQ(bootstrap(), kErrorUnknown);
407 ExpectBootstrapRequestCheck(
true);
408 EXPECT_CALL(spi_device_, Init());
409 ExpectSpiCmd(ChipEraseCmd());
410 ExpectSpiFlashStatusGet(
true);
411 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
413 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorOk);
414 EXPECT_CALL(spi_device_, FlashStatusClear());
416 auto cmd = PageProgramCmd(0, 16);
418 ExpectSpiFlashStatusGet(
true);
420 std::vector<uint8_t> flash_bytes(cmd.payload,
421 cmd.payload + cmd.payload_byte_count);
423 ExpectFlashCtrlWriteEnable();
424 EXPECT_CALL(flash_ctrl_,
425 DataWrite(cmd.address, cmd.payload_byte_count /
sizeof(uint32_t),
426 HasBytes(flash_bytes)))
427 .WillOnce(Return(kErrorUnknown));
428 ExpectFlashCtrlAllDisable();
430 EXPECT_EQ(bootstrap(), kErrorUnknown);
435 ExpectBootstrapRequestCheck(
true);
436 EXPECT_CALL(spi_device_, Init());
437 ExpectSpiCmd(ChipEraseCmd());
438 ExpectSpiFlashStatusGet(
true);
439 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
441 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorOk);
442 EXPECT_CALL(spi_device_, FlashStatusClear());
444 auto cmd = PageProgramCmd(0xf0, 16);
446 ExpectSpiFlashStatusGet(
true);
448 std::vector<uint8_t> flash_bytes(cmd.payload,
449 cmd.payload + cmd.payload_byte_count);
451 ExpectFlashCtrlWriteEnable();
452 EXPECT_CALL(flash_ctrl_, DataWrite(0xf0, 4, HasBytes(flash_bytes)))
453 .WillOnce(Return(kErrorUnknown));
454 ExpectFlashCtrlAllDisable();
456 EXPECT_EQ(bootstrap(), kErrorUnknown);
461 ExpectBootstrapRequestCheck(
true);
462 EXPECT_CALL(spi_device_, Init());
463 ExpectSpiCmd(ChipEraseCmd());
464 ExpectSpiFlashStatusGet(
true);
465 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
467 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorOk);
468 EXPECT_CALL(spi_device_, FlashStatusClear());
470 auto page_program_cmd = PageProgramCmd(3, 16);
471 ExpectSpiCmd(page_program_cmd);
472 ExpectSpiFlashStatusGet(
true);
474 EXPECT_EQ(bootstrap(), kErrorBootstrapProgramAddress);
479 ExpectBootstrapRequestCheck(
true);
480 EXPECT_CALL(spi_device_, Init());
481 ExpectSpiCmd(ChipEraseCmd());
482 ExpectSpiFlashStatusGet(
true);
483 ExpectFlashCtrlChipErase(kErrorOk, kErrorOk);
485 ExpectFlashCtrlEraseVerify(kErrorOk, kErrorOk);
486 EXPECT_CALL(spi_device_, FlashStatusClear());
488 ExpectSpiCmd(SectorEraseCmd(FLASH_CTRL_PARAM_BYTES_PER_BANK *
489 FLASH_CTRL_PARAM_REG_NUM_BANKS));
490 ExpectSpiFlashStatusGet(
true);
492 EXPECT_EQ(bootstrap(), kErrorBootstrapEraseAddress);
496 ExpectBootstrapRequestCheck(
false);
498 EXPECT_EQ(bootstrap(), kErrorBootstrapNotRequested);