aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Naydanov <109669442+en-sc@users.noreply.github.com>2024-10-18 12:37:31 +0300
committerGitHub <noreply@github.com>2024-10-18 12:37:31 +0300
commitbc68bd71a34d1a21e2353f485a77e1aa7e4ac7d3 (patch)
tree514547d9cef597ab22ed90ba4f848aa7a62e3d3f
parent417ff401f8253335a28c72165d7526a9cf7a798b (diff)
parentf3ed0ab608639dd50c48124fc22e3dc7f6d8f0ec (diff)
downloadriscv-openocd-riscv.zip
riscv-openocd-riscv.tar.gz
riscv-openocd-riscv.tar.bz2
Merge pull request #1146 from en-sc/en-sc/select-dmi-bypassHEADlatestriscv
target/riscv: check other TAPs in `select_dmi()`
-rw-r--r--src/jtag/jtag.h1
-rw-r--r--src/target/riscv/riscv-013.c29
2 files changed, 26 insertions, 4 deletions
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index b9d37b3..6ba118f 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -151,6 +151,7 @@ const char *jtag_tap_name(const struct jtag_tap *tap);
struct jtag_tap *jtag_tap_by_string(const char *dotted_name);
struct jtag_tap *jtag_tap_by_jim_obj(Jim_Interp *interp, Jim_Obj *obj);
struct jtag_tap *jtag_tap_by_position(unsigned int abs_position);
+/* FIXME: "jtag_tap_next_enabled()" should accept a const pointer. */
struct jtag_tap *jtag_tap_next_enabled(struct jtag_tap *p);
unsigned int jtag_tap_count_enabled(void);
unsigned int jtag_tap_count(void);
diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c
index 0c1a658..85125c9 100644
--- a/src/target/riscv/riscv-013.c
+++ b/src/target/riscv/riscv-013.c
@@ -357,10 +357,31 @@ static void select_dmi(struct target *target)
select_dmi_via_bscan(target);
return;
}
- if (buf_eq(target->tap->cur_instr, select_dbus.out_value,
- target->tap->ir_length))
- return;
- jtag_add_ir_scan(target->tap, &select_dbus, TAP_IDLE);
+ if (!target->tap->enabled)
+ LOG_TARGET_ERROR(target, "BUG: Target's TAP '%s' is disabled!",
+ jtag_tap_name(target->tap));
+
+ bool need_ir_scan = false;
+ /* FIXME: make "tap" a const pointer. */
+ for (struct jtag_tap *tap = jtag_tap_next_enabled(NULL);
+ tap; tap = jtag_tap_next_enabled(tap)) {
+ if (tap != target->tap) {
+ /* Different TAP than ours - check if it is in bypass */
+ if (!tap->bypass) {
+ need_ir_scan = true;
+ break;
+ }
+ } else {
+ /* Our TAP - check if the correct instruction is already loaded */
+ if (!buf_eq(target->tap->cur_instr, select_dbus.out_value, target->tap->ir_length)) {
+ need_ir_scan = true;
+ break;
+ }
+ }
+ }
+
+ if (need_ir_scan)
+ jtag_add_ir_scan(target->tap, &select_dbus, TAP_IDLE);
}
static int increase_dmi_busy_delay(struct target *target)