14 #include "sw/device/lib/dif/dif_rv_core_ibex.h"
19 #include "sw/device/lib/testing/pinmux_testutils.h"
20 #include "sw/device/lib/testing/test_framework/check.h"
21 #include "sw/device/lib/testing/test_framework/status.h"
23 #include "sw/device/silicon_creator/lib/chip_info.h"
24 #include "sw/device/silicon_creator/lib/manifest.h"
26 #ifdef HAS_RETENTION_RAM
27 #include "sw/device/silicon_creator/lib/drivers/retention_sram.h"
31 #ifndef OPENTITAN_IS_DARJEELING
32 #include "sw/device/silicon_creator/rom/bootstrap.h"
36 #include "dt/dt_flash_ctrl.h"
38 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
39 #include "sw/device/silicon_creator/lib/drivers/flash_ctrl.h"
41 #include "flash_ctrl_regs.h"
45 #include "dt/dt_otp_ctrl.h"
47 #include "otp_ctrl_regs.h"
50 #ifdef OPENTITAN_IS_DARJEELING
51 #include "dt/dt_soc_proxy.h"
54 static const dt_pinmux_t kPinmuxDt = kDtPinmuxAon;
55 static const dt_rstmgr_t kRstmgrDt = kDtRstmgrAon;
58 static const dt_flash_ctrl_t kFlashCtrlDt = kDtFlashCtrl;
62 static const dt_uart_t kUart0Dt = kDtUart0;
63 static const dt_rv_core_ibex_t kRvCoreIbexDt = kDtRvCoreIbex;
66 static const dt_otp_ctrl_t kOtpCtrlDt = kDtOtpCtrl;
73 extern char _rom_ext_virtual_start_address[];
74 extern char _rom_ext_virtual_size[];
75 extern char _manifest_address[];
83 typedef void ottf_entry_point(
void);
85 static dif_pinmux_t pinmux;
86 static dif_rstmgr_t rstmgr;
87 static dif_uart_t uart0;
88 static dif_rv_core_ibex_t ibex;
99 return (lma_addr - (uintptr_t)
manifest +
100 (uintptr_t)_rom_ext_virtual_start_address);
106 bool rom_test_main(
void) {
109 const uint32_t otp_ctrl_base = dt_otp_ctrl_primary_reg_block(kOtpCtrlDt);
111 abs_mmio_read32(otp_ctrl_base + OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET +
112 OTP_CTRL_PARAM_CREATOR_SW_CFG_ROM_EXEC_EN_OFFSET);
115 test_status_set(kTestStatusInBootRomHalt);
121 #ifndef OPENTITAN_IS_ENGLISHBREAKFAST
123 uint32_t cpuctrl_csr;
124 CSR_READ(CSR_REG_CPUCTRL, &cpuctrl_csr);
125 uint32_t cpuctrl_otp_val =
126 abs_mmio_read32(otp_ctrl_base + OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET +
127 OTP_CTRL_PARAM_CREATOR_SW_CFG_CPUCTRL_OFFSET);
138 CHECK_DIF_OK(dif_pinmux_init_from_dt(kPinmuxDt, &pinmux));
139 pinmux_testutils_init(&pinmux);
141 CHECK_DIF_OK(dif_rstmgr_init_from_dt(kRstmgrDt, &rstmgr));
144 #ifdef HAS_FLASH_CTRL
147 CHECK_STATUS_OK(flash_ctrl_testutils_wait_for_init(&flash_ctrl));
150 otp_val = abs_mmio_read32(
151 otp_ctrl_base + OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET +
152 OTP_CTRL_PARAM_CREATOR_SW_CFG_FLASH_DATA_DEFAULT_CFG_OFFSET);
156 &flash_ctrl, &default_properties));
159 default_properties.
ecc_en =
164 &flash_ctrl, default_properties));
173 CHECK_DIF_OK(dif_uart_init_from_dt(kUart0Dt, &uart0));
174 CHECK(
kUartBaudrate <= UINT32_MAX,
"kUartBaudrate must fit in uint32_t");
176 "kClockFreqPeripheralHz must fit in uint32_t");
196 #ifdef HAS_RETENTION_RAM
204 volatile uint32_t *creator_last_word =
211 dif_rv_core_ibex_fpga_info_t fpga;
212 CHECK_DIF_OK(dif_rv_core_ibex_init_from_dt(kRvCoreIbexDt, &ibex));
213 CHECK_DIF_OK(dif_rv_core_ibex_read_fpga_info(&ibex, &fpga));
219 #ifndef OPENTITAN_IS_DARJEELING
225 rom_error_t bootstrap_err = bootstrap();
226 if (bootstrap_err != kErrorOk) {
227 LOG_ERROR(
"Bootstrap failed with status code: %08x",
228 (uint32_t)bootstrap_err);
230 test_status_set(kTestStatusFailed);
235 #ifdef OPENTITAN_IS_EARLGREY
242 uintptr_t entry_point = manifest_entry_point_get(
manifest);
248 .size = (size_t)_rom_ext_virtual_size,
250 CHECK_DIF_OK(dif_rv_core_ibex_configure_addr_translation(
251 &ibex, kDifRvCoreIbexAddrTranslationSlot_0,
252 kDifRvCoreIbexAddrTranslationDBus, addr_map));
253 CHECK_DIF_OK(dif_rv_core_ibex_configure_addr_translation(
254 &ibex, kDifRvCoreIbexAddrTranslationSlot_0,
255 kDifRvCoreIbexAddrTranslationIBus, addr_map));
256 CHECK_DIF_OK(dif_rv_core_ibex_enable_addr_translation(
257 &ibex, kDifRvCoreIbexAddrTranslationSlot_0,
258 kDifRvCoreIbexAddrTranslationDBus));
259 CHECK_DIF_OK(dif_rv_core_ibex_enable_addr_translation(
260 &ibex, kDifRvCoreIbexAddrTranslationSlot_0,
261 kDifRvCoreIbexAddrTranslationIBus));
262 entry_point = rom_ext_vma_get(
manifest, entry_point);
267 LOG_INFO(
"Test ROM complete, jumping to flash (addr: %x)!", entry_point);
268 ((ottf_entry_point *)entry_point)();
274 void _boot_start(
void) {
275 test_status_set(kTestStatusInBootRom);
276 test_status_set(rom_test_main() ? kTestStatusPassed : kTestStatusFailed);