aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2022-05-01 15:20:24 +0200
committerTomas Vanek <vanekt@fbl.cz>2022-05-18 09:03:41 +0000
commit7d2ea186cf212c64a8e5b10725e0a2512a137fbe (patch)
treeb8cad6ee1059d448729bf1c0aa47bd7d8551f35b
parent4d1b29313ace5b26687f75fb132c04f91cc1edcb (diff)
downloadriscv-openocd-7d2ea186cf212c64a8e5b10725e0a2512a137fbe.zip
riscv-openocd-7d2ea186cf212c64a8e5b10725e0a2512a137fbe.tar.gz
riscv-openocd-7d2ea186cf212c64a8e5b10725e0a2512a137fbe.tar.bz2
target/riscv: fix 'reset run' after 'reset halt'
'reset halt' does not clear DM_DMCONTROL_HALTREQ at deassert_reset(). If hw reset line is configured e.g. 'reset_config srst_only' the folowing 'reset run' halts: > gd32v.cpu curstate running > reset halt JTAG tap: gd32v.cpu tap/device found: 0x1000563d (mfg: 0x31e ... > gd32v.cpu curstate halted > reset JTAG tap: gd32v.cpu tap/device found: 0x1000563d (mfg: 0x31e ... > gd32v.cpu curstate halted <<<<---- wrong!!! > reset JTAG tap: gd32v.cpu tap/device found: 0x1000563d (mfg: 0x31e ... > gd32v.cpu curstate running Clear DM_DMCONTROL_HALTREQ when acking reset. Change-Id: Iae0454b425e81e64774b9785bb5ba1d4564d940b Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: https://review.openocd.org/c/openocd/+/6961 Tested-by: jenkins Reviewed-by: Tim Newsome <tim@sifive.com>
-rw-r--r--src/target/riscv/riscv-013.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c
index 2b9179d..1b1450a 100644
--- a/src/target/riscv/riscv-013.c
+++ b/src/target/riscv/riscv-013.c
@@ -2397,11 +2397,11 @@ static int deassert_reset(struct target *target)
select_dmi(target);
/* Clear the reset, but make sure haltreq is still set */
- uint32_t control = 0;
- control = set_field(control, DM_DMCONTROL_HALTREQ, target->reset_halt ? 1 : 0);
+ uint32_t control = 0, control_haltreq;
control = set_field(control, DM_DMCONTROL_DMACTIVE, 1);
+ control_haltreq = set_field(control, DM_DMCONTROL_HALTREQ, target->reset_halt ? 1 : 0);
dmi_write(target, DM_DMCONTROL,
- set_hartsel(control, r->current_hartid));
+ set_hartsel(control_haltreq, r->current_hartid));
uint32_t dmstatus;
int dmi_busy_delay = info->dmi_busy_delay;
@@ -2413,7 +2413,7 @@ static int deassert_reset(struct target *target)
if (index != target->coreid)
continue;
dmi_write(target, DM_DMCONTROL,
- set_hartsel(control, index));
+ set_hartsel(control_haltreq, index));
} else {
index = r->current_hartid;
}
@@ -2449,7 +2449,7 @@ static int deassert_reset(struct target *target)
target->state = TARGET_HALTED;
if (get_field(dmstatus, DM_DMSTATUS_ALLHAVERESET)) {
- /* Ack reset. */
+ /* Ack reset and clear DM_DMCONTROL_HALTREQ if previously set */
dmi_write(target, DM_DMCONTROL,
set_hartsel(control, index) |
DM_DMCONTROL_ACKHAVERESET);