flash/nor/rp2040: fix flash erase timeout
SPI flash erase often takes longer than the fixed timeout 3 seconds. Introduce a configurable timeout_ms parameter to rp2040_call_rom_func(). Compute the erase timeout from the number of blocks to be erased. While on it make the timeouts shorter for connect flash, flush cache and enter/exit xip (1 second is enough). Change-Id: I552bfa317ee17064de3a54ec2f0c63e84ba87222 Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: https://review.openocd.org/c/openocd/+/7214 Tested-by: jenkins Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-by: Jonathan Bell <jonathan@raspberrypi.com>
This commit is contained in:
parent
84d73d0225
commit
53611d8055
|
@ -87,7 +87,7 @@ static uint32_t rp2040_lookup_symbol(struct target *target, uint32_t tag, uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rp2040_call_rom_func(struct target *target, struct rp2040_flash_bank *priv,
|
static int rp2040_call_rom_func(struct target *target, struct rp2040_flash_bank *priv,
|
||||||
uint16_t func_offset, uint32_t argdata[], unsigned int n_args)
|
uint16_t func_offset, uint32_t argdata[], unsigned int n_args, int timeout_ms)
|
||||||
{
|
{
|
||||||
char *regnames[4] = { "r0", "r1", "r2", "r3" };
|
char *regnames[4] = { "r0", "r1", "r2", "r3" };
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ static int rp2040_call_rom_func(struct target *target, struct rp2040_flash_bank
|
||||||
0, NULL, /* No memory arguments */
|
0, NULL, /* No memory arguments */
|
||||||
n_args + 1, args, /* User arguments + r7 */
|
n_args + 1, args, /* User arguments + r7 */
|
||||||
priv->jump_debug_trampoline, priv->jump_debug_trampoline_end,
|
priv->jump_debug_trampoline, priv->jump_debug_trampoline_end,
|
||||||
3000, /* 3s timeout */
|
timeout_ms,
|
||||||
&alg_info
|
&alg_info
|
||||||
);
|
);
|
||||||
for (unsigned int i = 0; i < n_args + 2; ++i)
|
for (unsigned int i = 0; i < n_args + 2; ++i)
|
||||||
|
@ -153,14 +153,14 @@ static int rp2040_finalize_stack_free(struct flash_bank *bank)
|
||||||
* chip select following a rp2040_flash_exit_xip().
|
* chip select following a rp2040_flash_exit_xip().
|
||||||
*/
|
*/
|
||||||
LOG_DEBUG("Flushing flash cache after write behind");
|
LOG_DEBUG("Flushing flash cache after write behind");
|
||||||
int err = rp2040_call_rom_func(target, priv, priv->jump_flush_cache, NULL, 0);
|
int err = rp2040_call_rom_func(target, priv, priv->jump_flush_cache, NULL, 0, 1000);
|
||||||
if (err != ERROR_OK) {
|
if (err != ERROR_OK) {
|
||||||
LOG_ERROR("Failed to flush flash cache");
|
LOG_ERROR("Failed to flush flash cache");
|
||||||
/* Intentionally continue after error and try to setup xip anyway */
|
/* Intentionally continue after error and try to setup xip anyway */
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEBUG("Configuring SSI for execute-in-place");
|
LOG_DEBUG("Configuring SSI for execute-in-place");
|
||||||
err = rp2040_call_rom_func(target, priv, priv->jump_enter_cmd_xip, NULL, 0);
|
err = rp2040_call_rom_func(target, priv, priv->jump_enter_cmd_xip, NULL, 0, 1000);
|
||||||
if (err != ERROR_OK)
|
if (err != ERROR_OK)
|
||||||
LOG_ERROR("Failed to set SSI to XIP mode");
|
LOG_ERROR("Failed to set SSI to XIP mode");
|
||||||
|
|
||||||
|
@ -189,14 +189,14 @@ static int rp2040_stack_grab_and_prep(struct flash_bank *bank)
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEBUG("Connecting internal flash");
|
LOG_DEBUG("Connecting internal flash");
|
||||||
err = rp2040_call_rom_func(target, priv, priv->jump_connect_internal_flash, NULL, 0);
|
err = rp2040_call_rom_func(target, priv, priv->jump_connect_internal_flash, NULL, 0, 1000);
|
||||||
if (err != ERROR_OK) {
|
if (err != ERROR_OK) {
|
||||||
LOG_ERROR("Failed to connect internal flash");
|
LOG_ERROR("Failed to connect internal flash");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEBUG("Kicking flash out of XIP mode");
|
LOG_DEBUG("Kicking flash out of XIP mode");
|
||||||
err = rp2040_call_rom_func(target, priv, priv->jump_flash_exit_xip, NULL, 0);
|
err = rp2040_call_rom_func(target, priv, priv->jump_flash_exit_xip, NULL, 0, 1000);
|
||||||
if (err != ERROR_OK) {
|
if (err != ERROR_OK) {
|
||||||
LOG_ERROR("Failed to exit flash XIP mode");
|
LOG_ERROR("Failed to exit flash XIP mode");
|
||||||
return err;
|
return err;
|
||||||
|
@ -243,7 +243,8 @@ static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *buffer, ui
|
||||||
bounce->address, /* data */
|
bounce->address, /* data */
|
||||||
write_size /* count */
|
write_size /* count */
|
||||||
};
|
};
|
||||||
err = rp2040_call_rom_func(target, priv, priv->jump_flash_range_program, args, ARRAY_SIZE(args));
|
err = rp2040_call_rom_func(target, priv, priv->jump_flash_range_program,
|
||||||
|
args, ARRAY_SIZE(args), 3000);
|
||||||
if (err != ERROR_OK) {
|
if (err != ERROR_OK) {
|
||||||
LOG_ERROR("Failed to invoke flash programming code on target");
|
LOG_ERROR("Failed to invoke flash programming code on target");
|
||||||
break;
|
break;
|
||||||
|
@ -292,7 +293,9 @@ static int rp2040_flash_erase(struct flash_bank *bank, unsigned int first, unsig
|
||||||
an optional larger "block" (size and command provided in args).
|
an optional larger "block" (size and command provided in args).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
err = rp2040_call_rom_func(bank->target, priv, priv->jump_flash_range_erase, args, ARRAY_SIZE(args));
|
int timeout_ms = 2000 * (last - first) + 1000;
|
||||||
|
err = rp2040_call_rom_func(bank->target, priv, priv->jump_flash_range_erase,
|
||||||
|
args, ARRAY_SIZE(args), timeout_ms);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
rp2040_finalize_stack_free(bank);
|
rp2040_finalize_stack_free(bank);
|
||||||
|
|
Loading…
Reference in New Issue