aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Naydanov <evgeniy.naydanov@syntacore.com>2024-08-12 20:17:33 +0300
committerEvgeniy Naydanov <evgeniy.naydanov@syntacore.com>2024-08-14 20:13:36 +0300
commit4379e843808a35fd4f69b9c71826d16ea150ed08 (patch)
treea1cc98705f311ea8493823f86648de4daa4d2f79
parent9a23c9e67978f77d9166102cefc7b537b714b561 (diff)
downloadriscv-openocd-4379e843808a35fd4f69b9c71826d16ea150ed08.zip
riscv-openocd-4379e843808a35fd4f69b9c71826d16ea150ed08.tar.gz
riscv-openocd-4379e843808a35fd4f69b9c71826d16ea150ed08.tar.bz2
target/riscv: remove duplicate `dtmcontrol_scan()`
Also avoid receiving data if the value is discarded on the call-site. Change-Id: Ied87b551536a00d9fad469b9843cccae1976e6b6 Signed-off-by: Evgeniy Naydanov <evgeniy.naydanov@syntacore.com>
-rw-r--r--src/target/riscv/riscv-011.c32
-rw-r--r--src/target/riscv/riscv-013.c35
-rw-r--r--src/target/riscv/riscv.c30
-rw-r--r--src/target/riscv/riscv.h3
4 files changed, 19 insertions, 81 deletions
diff --git a/src/target/riscv/riscv-011.c b/src/target/riscv/riscv-011.c
index 0715de5..abb1c3b 100644
--- a/src/target/riscv/riscv-011.c
+++ b/src/target/riscv/riscv-011.c
@@ -273,38 +273,6 @@ static uint16_t dram_address(unsigned int index)
return 0x40 + index - 0x10;
}
-static int dtmcontrol_scan(struct target *target, uint32_t out, uint32_t *in_ptr)
-{
- struct scan_field field;
- uint8_t in_value[4];
- uint8_t out_value[4] = { 0 };
-
- buf_set_u32(out_value, 0, 32, out);
-
- jtag_add_ir_scan(target->tap, &select_dtmcontrol, TAP_IDLE);
-
- field.num_bits = 32;
- field.out_value = out_value;
- field.in_value = in_value;
- jtag_add_dr_scan(target->tap, 1, &field, TAP_IDLE);
-
- /* Always return to dbus. */
- jtag_add_ir_scan(target->tap, &select_dbus, TAP_IDLE);
-
- int retval = jtag_execute_queue();
- if (retval != ERROR_OK) {
- LOG_ERROR("failed jtag scan: %d", retval);
- return retval;
- }
-
- uint32_t in = buf_get_u32(field.in_value, 0, 32);
- LOG_DEBUG("DTMCONTROL: 0x%x -> 0x%x", out, in);
-
- if (in_ptr)
- *in_ptr = in;
- return ERROR_OK;
-}
-
static uint32_t idcode_scan(struct target *target)
{
struct scan_field field;
diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c
index ae36a06..ab2f8e4 100644
--- a/src/target/riscv/riscv-013.c
+++ b/src/target/riscv/riscv-013.c
@@ -433,41 +433,6 @@ static void select_dmi(struct target *target)
jtag_add_ir_scan(target->tap, &select_dbus, TAP_IDLE);
}
-static int dtmcontrol_scan(struct target *target, uint32_t out, uint32_t *in_ptr)
-{
- struct scan_field field;
- uint8_t in_value[4];
- uint8_t out_value[4] = { 0 };
-
- if (bscan_tunnel_ir_width != 0)
- return dtmcontrol_scan_via_bscan(target, out, in_ptr);
-
- buf_set_u32(out_value, 0, 32, out);
-
- jtag_add_ir_scan(target->tap, &select_dtmcontrol, TAP_IDLE);
-
- field.num_bits = 32;
- field.out_value = out_value;
- field.in_value = in_value;
- jtag_add_dr_scan(target->tap, 1, &field, TAP_IDLE);
-
- /* Always return to dmi. */
- select_dmi(target);
-
- int retval = jtag_execute_queue();
- if (retval != ERROR_OK) {
- LOG_ERROR("failed jtag scan: %d", retval);
- return retval;
- }
-
- uint32_t in = buf_get_u32(field.in_value, 0, 32);
- LOG_DEBUG("DTMCS: 0x%x -> 0x%x", out, in);
-
- if (in_ptr)
- *in_ptr = in;
- return ERROR_OK;
-}
-
static int increase_dmi_busy_delay(struct target *target)
{
RISCV013_INFO(info);
diff --git a/src/target/riscv/riscv.c b/src/target/riscv/riscv.c
index 267d20d..b49cede 100644
--- a/src/target/riscv/riscv.c
+++ b/src/target/riscv/riscv.c
@@ -383,22 +383,23 @@ int dtmcontrol_scan_via_bscan(struct target *target, uint32_t out, uint32_t *in_
return ERROR_OK;
}
-static int dtmcontrol_scan(struct target *target, uint32_t out, uint32_t *in_ptr)
+/* TODO: rename "dtmcontrol"-> "dtmcs" */
+int dtmcontrol_scan(struct target *target, uint32_t out, uint32_t *in_ptr)
{
- struct scan_field field;
- uint8_t in_value[4];
- uint8_t out_value[4] = { 0 };
+ uint8_t value[4];
if (bscan_tunnel_ir_width != 0)
return dtmcontrol_scan_via_bscan(target, out, in_ptr);
- buf_set_u32(out_value, 0, 32, out);
+ buf_set_u32(value, 0, 32, out);
jtag_add_ir_scan(target->tap, &select_dtmcontrol, TAP_IDLE);
- field.num_bits = 32;
- field.out_value = out_value;
- field.in_value = in_value;
+ struct scan_field field = {
+ .num_bits = 32,
+ .out_value = value,
+ .in_value = in_ptr ? value : NULL
+ };
jtag_add_dr_scan(target->tap, 1, &field, TAP_IDLE);
/* Always return to dbus. */
@@ -406,15 +407,18 @@ static int dtmcontrol_scan(struct target *target, uint32_t out, uint32_t *in_ptr
int retval = jtag_execute_queue();
if (retval != ERROR_OK) {
- LOG_TARGET_ERROR(target, "dtmcontrol scan failed, error code = %d", retval);
+ LOG_TARGET_ERROR(target, "dtmcs scan failed, error code = %d", retval);
return retval;
}
- uint32_t in = buf_get_u32(field.in_value, 0, 32);
- LOG_DEBUG("DTMCONTROL: 0x%x -> 0x%x", out, in);
-
- if (in_ptr)
+ if (in_ptr) {
+ assert(field.in_value);
+ uint32_t in = buf_get_u32(field.in_value, 0, 32);
+ LOG_TARGET_DEBUG(target, "DTMCS: 0x%" PRIx32 " -> 0x%" PRIx32, out, in);
*in_ptr = in;
+ } else {
+ LOG_TARGET_DEBUG(target, "DTMCS: 0x%" PRIx32 " -> ?", out);
+ }
return ERROR_OK;
}
diff --git a/src/target/riscv/riscv.h b/src/target/riscv/riscv.h
index a25aac8..a3973e8 100644
--- a/src/target/riscv/riscv.h
+++ b/src/target/riscv/riscv.h
@@ -362,12 +362,13 @@ extern struct scan_field select_dtmcontrol;
extern struct scan_field select_dbus;
extern struct scan_field select_idcode;
+int dtmcontrol_scan(struct target *target, uint32_t out, uint32_t *in_ptr);
+
extern struct scan_field *bscan_tunneled_select_dmi;
extern uint32_t bscan_tunneled_select_dmi_num_fields;
typedef enum { BSCAN_TUNNEL_NESTED_TAP, BSCAN_TUNNEL_DATA_REGISTER } bscan_tunnel_type_t;
extern int bscan_tunnel_ir_width;
-int dtmcontrol_scan_via_bscan(struct target *target, uint32_t out, uint32_t *in_ptr);
void select_dmi_via_bscan(struct target *target);
/*** OpenOCD Interface */