aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMegan Wachs <megan@sifive.com>2017-03-15 17:23:21 -0700
committerMegan Wachs <megan@sifive.com>2017-03-15 17:23:21 -0700
commita70e6286200f33f842e14bc2fed027c7b268826c (patch)
tree29f0d35a15131bb1d8177c71313198e24f9068e2 /src
parentbb39d3b17e7f312c88ac43e0a563c782b134df5d (diff)
downloadriscv-openocd-a70e6286200f33f842e14bc2fed027c7b268826c.zip
riscv-openocd-a70e6286200f33f842e14bc2fed027c7b268826c.tar.gz
riscv-openocd-a70e6286200f33f842e14bc2fed027c7b268826c.tar.bz2
riscv-v13: wait for idle in read_memory
read_memory was doing autoexec-initialized commands, but wasn't using ac_busy_delay to add delay or wait between the commands. This isn't the optimal solution, but the whole read_memory sequence needs to be made more efficient anyway, so this was the quick and dirty solution.
Diffstat (limited to 'src')
-rw-r--r--src/target/riscv/riscv-013.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c
index 774e6d3..6aac4fd 100644
--- a/src/target/riscv/riscv-013.c
+++ b/src/target/riscv/riscv-013.c
@@ -1865,7 +1865,7 @@ static int read_memory(struct target *target, uint32_t address,
return ERROR_FAIL;
}
dmi_write(target, DMI_ABSTRACTCS, DMI_ABSTRACTCS_AUTOEXEC0 | DMI_ABSTRACTCS_CMDERR);
-
+ uint32_t abstractcs;
for (uint32_t i = 0; i < count; i++) {
uint32_t value = dmi_read(target, DMI_DATA0);
switch (size) {
@@ -1885,9 +1885,16 @@ static int read_memory(struct target *target, uint32_t address,
default:
return ERROR_FAIL;
}
- }
+ // The above dmi_read started an abstract command. If we just
+ // immediately read here, we'll probably get a busy error. Wait for idle first,
+ // or otherwise take ac_command_busy into account (this defeats the purpose
+ // of autoexec, this whole code needs optimization).
+ if (wait_for_idle(target, &abstractcs) != ERROR_OK) {
+ return ERROR_FAIL;
+ }
+ }
dmi_write(target, DMI_ABSTRACTCS, DMI_ABSTRACTCS_CMDERR);
- uint32_t abstractcs = dmi_read(target, DMI_ABSTRACTCS);
+ abstractcs = dmi_read(target, DMI_ABSTRACTCS);
if (get_field(abstractcs, DMI_ABSTRACTCS_CMDERR)) {
// TODO: retry with more delay?
return ERROR_FAIL;