diff options
author | Evgeniy Naydanov <109669442+en-sc@users.noreply.github.com> | 2024-10-18 12:37:31 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-18 12:37:31 +0300 |
commit | bc68bd71a34d1a21e2353f485a77e1aa7e4ac7d3 (patch) | |
tree | 514547d9cef597ab22ed90ba4f848aa7a62e3d3f | |
parent | 417ff401f8253335a28c72165d7526a9cf7a798b (diff) | |
parent | f3ed0ab608639dd50c48124fc22e3dc7f6d8f0ec (diff) | |
download | riscv-openocd-riscv.zip riscv-openocd-riscv.tar.gz riscv-openocd-riscv.tar.bz2 |
target/riscv: check other TAPs in `select_dmi()`
-rw-r--r-- | src/jtag/jtag.h | 1 | ||||
-rw-r--r-- | src/target/riscv/riscv-013.c | 29 |
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) |