Correct flash_ctrl_data_erase_verify parameter. Need the base address of the flash memory, not the controller registers. Requires plumbing through the bootstrap api's. Bug: 362960646 Bypass-Presubmit-Reason: passes on manual retry Change-Id: I8ee4cd7c8d1d13b30a8210a09b722bcb1652db21
diff --git a/sw/device/lib/testing/test_rom/test_rom.c b/sw/device/lib/testing/test_rom/test_rom.c index 1149a56..4dc5360 100644 --- a/sw/device/lib/testing/test_rom/test_rom.c +++ b/sw/device/lib/testing/test_rom/test_rom.c
@@ -200,8 +200,10 @@ LOG_INFO("Boot strap requested"); const uintptr_t flash_ctrl_addr = TOP_EARLGREY_FLASH_CTRL_CORE_BASE_ADDR; + const uintptr_t flash_mem_addr = TOP_EARLGREY_FLASH_CTRL_MEM_BASE_ADDR; const uintptr_t spi_device_addr = TOP_EARLGREY_SPI_DEVICE_BASE_ADDR; - rom_error_t bootstrap_err = bootstrap(flash_ctrl_addr, spi_device_addr, otp_addr, gpio_addr); + rom_error_t bootstrap_err = bootstrap(flash_ctrl_addr, flash_mem_addr, + spi_device_addr, otp_addr, gpio_addr); if (bootstrap_err != kErrorOk) { LOG_ERROR("Bootstrap failed with status code: %08x", (uint32_t)bootstrap_err);
diff --git a/sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.cc b/sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.cc index 6af61ff..1b101ec 100644 --- a/sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.cc +++ b/sw/device/silicon_creator/lib/drivers/mock_flash_ctrl.cc
@@ -44,7 +44,7 @@ return MockFlashCtrl::Instance().DataErase(addr, erase_type); } -rom_error_t flash_ctrl_data_erase_verify(uintptr_t base_addr, uint32_t addr, +rom_error_t flash_ctrl_data_erase_verify(uintptr_t mem_base_addr, uint32_t addr, flash_ctrl_erase_type_t erase_type) { return MockFlashCtrl::Instance().DataEraseVerify(addr, erase_type); }
diff --git a/sw/device/silicon_creator/rom/bootstrap.c b/sw/device/silicon_creator/rom/bootstrap.c index 4f4ec7c..aa56f96 100644 --- a/sw/device/silicon_creator/rom/bootstrap.c +++ b/sw/device/silicon_creator/rom/bootstrap.c
@@ -260,11 +260,13 @@ * @param state Bootstrap state. * @return Result of the operation. */ -static rom_error_t bootstrap_handle_erase_verify(uintptr_t flash_ctrl_addr, uintptr_t spi_device_addr, bootstrap_state_t *state) { +static rom_error_t bootstrap_handle_erase_verify(uintptr_t flash_mem_addr, + uintptr_t spi_device_addr, + bootstrap_state_t *state) { HARDENED_CHECK_EQ(*state, kBootstrapStateEraseVerify); - rom_error_t err_0 = flash_ctrl_data_erase_verify(flash_ctrl_addr, 0, kFlashCtrlEraseTypeBank); - rom_error_t err_1 = flash_ctrl_data_erase_verify(flash_ctrl_addr, + rom_error_t err_0 = flash_ctrl_data_erase_verify(flash_mem_addr, 0, kFlashCtrlEraseTypeBank); + rom_error_t err_1 = flash_ctrl_data_erase_verify(flash_mem_addr, FLASH_CTRL_PARAM_BYTES_PER_BANK, kFlashCtrlEraseTypeBank); HARDENED_RETURN_IF_ERROR(err_0); HARDENED_RETURN_IF_ERROR(err_1); @@ -356,6 +358,7 @@ // NB: assumes flash_ctrl_init is already called rom_error_t bootstrap(uintptr_t flash_ctrl_addr, + uintptr_t flash_mem_addr, uintptr_t spi_device_addr, uintptr_t otp_addr, uintptr_t gpio_addr) { @@ -378,7 +381,7 @@ break; case kBootstrapStateEraseVerify: HARDENED_CHECK_EQ(state, kBootstrapStateEraseVerify); - error = bootstrap_handle_erase_verify(flash_ctrl_addr, spi_device_addr, &state); + error = bootstrap_handle_erase_verify(flash_mem_addr, spi_device_addr, &state); break; case kBootstrapStateProgram: HARDENED_CHECK_EQ(state, kBootstrapStateProgram);
diff --git a/sw/device/silicon_creator/rom/bootstrap.h b/sw/device/silicon_creator/rom/bootstrap.h index ee9f8cb..f44cf4f 100644 --- a/sw/device/silicon_creator/rom/bootstrap.h +++ b/sw/device/silicon_creator/rom/bootstrap.h
@@ -38,12 +38,15 @@ * This function only returns on error since a successful bootstrap ends with a * chip reset. * + * @param flash_ctrl_addr The base address of the flash controller registers. + * @param flash_mem_addr The base address of the flash memory. + * @param spi_device_addr The base address of the SPI device registers. * @param otp_addr The base address of the OTP memory. * @param gpio_addr The base address of the GPIO registers. - * @param spi_device_addr The base address of the SPI device registers. * @return Result of the operation. */ rom_error_t bootstrap(uintptr_t flash_ctrl_addr, + uintptr_t flash_mem_addr, uintptr_t spi_device_addr, uintptr_t otp_addr, uintptr_t gpio_addr);
diff --git a/sw/device/silicon_creator/rom/bootstrap_unittest.cc b/sw/device/silicon_creator/rom/bootstrap_unittest.cc index 3c00a62..1d014ca 100644 --- a/sw/device/silicon_creator/rom/bootstrap_unittest.cc +++ b/sw/device/silicon_creator/rom/bootstrap_unittest.cc
@@ -33,6 +33,7 @@ kBaseSpiDevice = TOP_EARLGREY_SPI_DEVICE_BASE_ADDR, kBaseGpio = TOP_EARLGREY_GPIO_BASE_ADDR, kBaseFlashCtrl = TOP_EARLGREY_FLASH_CTRL_CORE_BASE_ADDR, + kBaseFlashMem = TOP_EARLGREY_FLASH_CTRL_MEM_BASE_ADDR, }; using ::testing::_; @@ -158,6 +159,7 @@ } const uintptr_t flash_ctrl_addr_ = kBaseFlashCtrl; + const uintptr_t flash_mem_addr_ = kBaseFlashMem; const uintptr_t spi_device_addr_ = kBaseSpiDevice; const uintptr_t gpio_addr_ = kBaseGpio; const uintptr_t otp_addr_ = kBaseOtp; @@ -254,7 +256,7 @@ EXPECT_CALL(spi_device_, CmdGet(NotNull())) .WillOnce(Return(kErrorSpiDevicePayloadOverflow)); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorSpiDevicePayloadOverflow); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorSpiDevicePayloadOverflow); } TEST_F(BootstrapTest, PayloadOverflowProgram) { @@ -271,7 +273,7 @@ EXPECT_CALL(spi_device_, CmdGet(NotNull())) .WillOnce(Return(kErrorSpiDevicePayloadOverflow)); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorSpiDevicePayloadOverflow); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorSpiDevicePayloadOverflow); } TEST_F(BootstrapTest, BootstrapSimple) { @@ -302,7 +304,7 @@ ExpectSpiCmd(ResetCmd()); EXPECT_CALL(rstmgr_, Reset()); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, BootstrapOddPayload) { @@ -336,7 +338,7 @@ ExpectSpiCmd(ResetCmd()); EXPECT_CALL(rstmgr_, Reset()); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, BootstrapMisalignedAddrLongPayload) { @@ -370,7 +372,7 @@ ExpectSpiCmd(ResetCmd()); EXPECT_CALL(rstmgr_, Reset()); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, BootstrapMisalignedAddrShortPayload) { @@ -401,7 +403,7 @@ ExpectSpiCmd(ResetCmd()); EXPECT_CALL(rstmgr_, Reset()); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, BootstrapStartWithSectorErase) { @@ -434,7 +436,7 @@ ExpectSpiCmd(ResetCmd()); EXPECT_CALL(rstmgr_, Reset()); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, BootstrapProgramWithErase) { @@ -478,7 +480,7 @@ ExpectSpiCmd(ResetCmd()); EXPECT_CALL(rstmgr_, Reset()); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, MisalignedEraseAddress) { @@ -510,7 +512,7 @@ ExpectSpiCmd(ResetCmd()); EXPECT_CALL(rstmgr_, Reset()); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, IgnoredCommands) { @@ -539,7 +541,7 @@ ExpectSpiCmd(ResetCmd()); EXPECT_CALL(rstmgr_, Reset()); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, EraseBank0Error) { @@ -549,7 +551,7 @@ ExpectSpiFlashStatusGet(true); ExpectFlashCtrlChipErase(kErrorUnknown, kErrorOk); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, EraseBank1Error) { @@ -559,7 +561,7 @@ ExpectSpiFlashStatusGet(true); ExpectFlashCtrlChipErase(kErrorOk, kErrorUnknown); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, EraseVerifyBank0Error) { @@ -572,7 +574,7 @@ // Verify ExpectFlashCtrlEraseVerify(kErrorUnknown, kErrorOk); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, EraseVerifyBank1Error) { @@ -585,7 +587,7 @@ // Verify ExpectFlashCtrlEraseVerify(kErrorOk, kErrorUnknown); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, DataWriteError) { @@ -613,7 +615,7 @@ .WillOnce(Return(kErrorUnknown)); ExpectFlashCtrlAllDisable(); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, DataWriteErrorMisalignedAddr) { @@ -639,7 +641,7 @@ .WillOnce(Return(kErrorUnknown)); ExpectFlashCtrlAllDisable(); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorUnknown); } TEST_F(BootstrapTest, BadProgramAddress) { @@ -657,7 +659,7 @@ ExpectSpiCmd(page_program_cmd); ExpectSpiFlashStatusGet(true); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorBootstrapProgramAddress); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorBootstrapProgramAddress); } TEST_F(BootstrapTest, BadEraseAddress) { @@ -675,13 +677,13 @@ FLASH_CTRL_PARAM_REG_NUM_BANKS)); ExpectSpiFlashStatusGet(true); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorBootstrapEraseAddress); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorBootstrapEraseAddress); } TEST_F(BootstrapTest, NotRequested) { ExpectBootstrapRequestCheck(false); - EXPECT_EQ(bootstrap(flash_ctrl_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorBootstrapNotRequested); + EXPECT_EQ(bootstrap(flash_ctrl_addr_, flash_mem_addr_, spi_device_addr_, otp_addr_, gpio_addr_), kErrorBootstrapNotRequested); } } // namespace