aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@lowrisc.org>2023-05-17 12:09:32 +0100
committerTomas Vanek <vanekt@fbl.cz>2023-05-25 16:19:12 +0000
commit5924d9f30cd68333d37caa7ac8cad43f036148dc (patch)
tree3b4d23bc81620dc9cc51c089a978f97a2da7079a
parent4defa3b1e323b7f7287d8e046b2c97ad4a749f87 (diff)
downloadriscv-openocd-5924d9f30cd68333d37caa7ac8cad43f036148dc.zip
riscv-openocd-5924d9f30cd68333d37caa7ac8cad43f036148dc.tar.gz
riscv-openocd-5924d9f30cd68333d37caa7ac8cad43f036148dc.tar.bz2
target/riscv-013: clear sticky error when DMI operation fails
When a DMI operation does not succeed (either because of a timeout or an error), the specification says that the error in the `op` field is sticky and needs to cleared by writing `dmireset` in `dtmcs`. This is already done for timeouts in increase_dmi_busy_delay but not for errors. Change-Id: I7c5f27a5cf145511a1a8b64a45a586521e1cbe41 Signed-off-by: Amaury Pouly <amaury.pouly@lowrisc.org> Reviewed-on: https://review.openocd.org/c/openocd/+/7688 Tested-by: jenkins Reviewed-by: Tim Newsome <tim@sifive.com> Reviewed-by: Jan Matyas <jan.matyas@codasip.com>
-rw-r--r--src/target/riscv/riscv-013.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c
index 4e6c8dc..2f4a8fe 100644
--- a/src/target/riscv/riscv-013.c
+++ b/src/target/riscv/riscv-013.c
@@ -598,6 +598,7 @@ static int dmi_op_timeout(struct target *target, uint32_t *data_in,
break;
} else {
LOG_ERROR("failed %s at 0x%x, status=%d", op_name, address, status);
+ dtmcontrol_scan(target, DTM_DTMCS_DMIRESET);
return ERROR_FAIL;
}
if (time(NULL) - start > timeout_sec)
@@ -630,6 +631,7 @@ static int dmi_op_timeout(struct target *target, uint32_t *data_in,
LOG_ERROR("Failed %s (NOP) at 0x%x; status=%d", op_name, address,
status);
}
+ dtmcontrol_scan(target, DTM_DTMCS_DMIRESET);
return ERROR_FAIL;
}
if (time(NULL) - start > timeout_sec)