Software APIs
bootstrap_unittest_util.cc
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #include "sw/device/silicon_creator/lib/bootstrap_unittest_util.h"
6 
7 #include <stdint.h>
8 #include <string.h>
9 
11 
12 #include "flash_ctrl_regs.h"
13 #include "gpio_regs.h"
15 #include "otp_ctrl_regs.h"
16 
17 bool operator==(flash_ctrl_perms_t lhs, flash_ctrl_perms_t rhs) {
18  return memcmp(&lhs, &rhs, sizeof(flash_ctrl_perms_t)) == 0;
19 }
20 
21 namespace bootstrap_unittest_util {
22 
23 namespace {
24 using ::testing::DoAll;
25 using ::testing::NotNull;
26 using ::testing::Return;
27 using ::testing::SetArgPointee;
28 } // namespace
29 
31  EXPECT_CALL(otp_,
32  read32(OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_BOOTSTRAP_DIS_OFFSET))
33  .WillOnce(Return(kHardenedBoolFalse));
34  uint32_t pins = SW_STRAP_BOOTSTRAP;
35  if (!requested) {
36  pins = ~pins;
37  }
38  EXPECT_ABS_READ32(TOP_EARLGREY_GPIO_BASE_ADDR + GPIO_DATA_IN_REG_OFFSET,
39  pins);
40 }
41 
43  EXPECT_CALL(spi_device_, CmdGet(NotNull()))
44  .WillOnce(DoAll(SetArgPointee<0>(cmd), Return(kErrorOk)));
45 }
46 
48  EXPECT_CALL(spi_device_, FlashStatusGet())
49  .WillOnce(Return(wel << kSpiDeviceWelBit));
50 }
51 
53  EXPECT_CALL(flash_ctrl_, DataDefaultPermsSet((flash_ctrl_perms_t){
54  .read = kMultiBitBool4False,
55  .write = kMultiBitBool4True,
56  .erase = kMultiBitBool4False,
57  }));
58 }
59 
61  EXPECT_CALL(flash_ctrl_, DataDefaultPermsSet((flash_ctrl_perms_t){
62  .read = kMultiBitBool4False,
63  .write = kMultiBitBool4False,
64  .erase = kMultiBitBool4True,
65  }));
66 }
67 
69  EXPECT_CALL(flash_ctrl_, DataDefaultPermsSet((flash_ctrl_perms_t){
70  .read = kMultiBitBool4False,
71  .write = kMultiBitBool4False,
72  .erase = kMultiBitBool4False,
73  }));
74 }
75 
77  rom_error_t err1) {
78  EXPECT_CALL(flash_ctrl_, BankErasePermsSet(kHardenedBoolTrue));
79  EXPECT_CALL(flash_ctrl_, DataErase(0, kFlashCtrlEraseTypeBank))
80  .WillOnce(Return(err0));
81  EXPECT_CALL(flash_ctrl_, DataErase(FLASH_CTRL_PARAM_BYTES_PER_BANK,
82  kFlashCtrlEraseTypeBank))
83  .WillOnce(Return(err1));
84  EXPECT_CALL(flash_ctrl_, BankErasePermsSet(kHardenedBoolFalse));
85 }
86 
88  rom_error_t err1,
89  uint32_t addr) {
90  EXPECT_CALL(flash_ctrl_, DataDefaultPermsSet((flash_ctrl_perms_t){
91  .read = kMultiBitBool4False,
92  .write = kMultiBitBool4False,
93  .erase = kMultiBitBool4True,
94  }));
95  EXPECT_CALL(flash_ctrl_, DataErase(addr, kFlashCtrlEraseTypePage))
96  .WillOnce(Return(err0));
97  EXPECT_CALL(flash_ctrl_, DataErase(addr + FLASH_CTRL_PARAM_BYTES_PER_PAGE,
98  kFlashCtrlEraseTypePage))
99  .WillOnce(Return(err1));
101 }
102 
104  rom_error_t err1) {
105  EXPECT_CALL(flash_ctrl_, DataEraseVerify(0, kFlashCtrlEraseTypeBank))
106  .WillOnce(Return(err0));
107  EXPECT_CALL(flash_ctrl_, DataEraseVerify(FLASH_CTRL_PARAM_BYTES_PER_BANK,
108  kFlashCtrlEraseTypeBank))
109  .WillOnce(Return(err1));
110 }
111 
112 spi_device_cmd_t ChipEraseCmd() {
113  return {
114  .opcode = kSpiDeviceOpcodeChipErase,
115  .address = kSpiDeviceNoAddress,
116  .payload_byte_count = 0,
117  .payload = {},
118  };
119 }
120 
121 spi_device_cmd_t SectorEraseCmd(uint32_t address) {
122  return {
123  .opcode = kSpiDeviceOpcodeSectorErase,
124  .address = address,
125  .payload_byte_count = 0,
126  .payload = {},
127  };
128 }
129 
130 spi_device_cmd_t PageProgramCmd(uint32_t address, size_t payload_byte_count) {
131  spi_device_cmd_t cmd{
132  .opcode = kSpiDeviceOpcodePageProgram,
133  .address = address,
134  .payload_byte_count = payload_byte_count,
135  };
136  EXPECT_LE(payload_byte_count, kSpiDevicePayloadAreaNumBytes);
137  for (size_t i = 0; i < payload_byte_count; ++i) {
138  cmd.payload[i] = static_cast<uint8_t>(i);
139  }
140 
141  return cmd;
142 }
143 
144 spi_device_cmd_t ResetCmd() {
145  return {
146  .opcode = kSpiDeviceOpcodeReset,
147  .address = kSpiDeviceNoAddress,
148  .payload_byte_count = 0,
149  .payload = {},
150  };
151 }
152 
153 } // namespace bootstrap_unittest_util