riscv: Retry failed memory reads
This commit is contained in:
parent
98420e377a
commit
c61b3efe9a
|
@ -1830,6 +1830,7 @@ static int read_memory(struct target *target, uint32_t address,
|
||||||
{
|
{
|
||||||
select_dmi(target);
|
select_dmi(target);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
abstract_write_register(target, S0, xlen(target), address);
|
abstract_write_register(target, S0, xlen(target), address);
|
||||||
|
|
||||||
program_t *program = program_new();
|
program_t *program = program_new();
|
||||||
|
@ -1888,13 +1889,22 @@ static int read_memory(struct target *target, uint32_t address,
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
dmi_write(target, DMI_ABSTRACTAUTO, 0);
|
||||||
dmi_write(target, DMI_ABSTRACTCS, DMI_ABSTRACTCS_CMDERR);
|
dmi_write(target, DMI_ABSTRACTCS, DMI_ABSTRACTCS_CMDERR);
|
||||||
abstractcs = dmi_read(target, DMI_ABSTRACTCS);
|
abstractcs = dmi_read(target, DMI_ABSTRACTCS);
|
||||||
if (get_field(abstractcs, DMI_ABSTRACTCS_CMDERR)) {
|
unsigned cmderr = get_field(abstractcs, DMI_ABSTRACTCS_CMDERR);
|
||||||
// TODO: retry with more delay?
|
if (cmderr == CMDERR_BUSY) {
|
||||||
|
dmi_write(target, DMI_ABSTRACTCS, 0);
|
||||||
|
increase_ac_busy_delay(target);
|
||||||
|
} else if (cmderr) {
|
||||||
|
LOG_ERROR("cmderr=%d", get_field(abstractcs, DMI_ABSTRACTCS_CMDERR));
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
|
} else {
|
||||||
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
// Should not get here.
|
||||||
|
assert(0);
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue