From 837f9ed52af820b23e456868eb9a8c85e7a0f165 Mon Sep 17 00:00:00 2001 From: Greg Savin <43152568+SiFiveGregS@users.noreply.github.com> Date: Fri, 5 Apr 2019 15:26:21 -0700 Subject: [PATCH] Moved some functions to riscv.c from the version-specific files. --- src/target/riscv/riscv-011.c | 6 ++ src/target/riscv/riscv-013.c | 97 -------------------------------- src/target/riscv/riscv.c | 104 ++++++++++++++++++++++++++++++++++- src/target/riscv/riscv.h | 5 ++ 4 files changed, 114 insertions(+), 98 deletions(-) diff --git a/src/target/riscv/riscv-011.c b/src/target/riscv/riscv-011.c index aad5b8bfb..fc425be2c 100644 --- a/src/target/riscv/riscv-011.c +++ b/src/target/riscv/riscv-011.c @@ -281,6 +281,12 @@ static uint32_t dtmcontrol_scan(struct target *target, uint32_t out) uint8_t in_value[4]; uint8_t out_value[4]; +#if BUILD_RISCV_ARTY_BSCAN == 1 + if (target->bscan_tunnel_ir_width != 0) { + return dtmcontrol_scan_via_bscan(target, out); + } +#endif + buf_set_u32(out_value, 0, 32, out); jtag_add_ir_scan(target->tap, &select_dtmcontrol, TAP_IDLE); diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c index ef3724061..b77b9f84d 100644 --- a/src/target/riscv/riscv-013.c +++ b/src/target/riscv/riscv-013.c @@ -404,103 +404,6 @@ static void dump_field(int idle, const struct scan_field *field) /*** Utility functions. ***/ -#if BUILD_RISCV_ARTY_BSCAN == 1 - -uint8_t bscan_zero[4] = {0}; -uint8_t bscan_one[4] = {1}; - - -static void select_dmi_via_bscan(struct target *target) -{ - jtag_add_ir_scan(target->tap, &select_user4, TAP_IDLE); - jtag_add_dr_scan(target->tap, bscan_tunneled_select_dmi_num_fields, bscan_tunneled_select_dmi, TAP_IDLE); -} - - -static uint32_t dtmcontrol_scan_via_bscan(struct target *target, uint32_t out) -{ - /* jtag_add_ir_scan(target->tap, &select_dtmcontrol, TAP_IDLE); */ - - /* On BSCAN TAP: Select IR=USER4, issue tunneled IR scan via BSCAN TAP's DR */ - uint8_t tunneled_ir_width[4] = {target->bscan_tunnel_ir_width}; - uint8_t tunneled_dr_width[4] = {32}; - uint8_t out_0[4] = {out & 0x1}; - uint8_t out_31_1[4]; - uint8_t in_value[4]; - - buf_set_u32(out_31_1, 0, 32, (out >> 1)); - - struct scan_field tunneled_ir[] = { - { - .num_bits = 1, - .out_value = bscan_zero, - .in_value = NULL, - }, - { - .num_bits = 7, - .out_value = tunneled_ir_width, - .in_value = NULL, - }, - { - .num_bits = target->bscan_tunnel_ir_width, - .out_value = ir_dtmcontrol, - .in_value = NULL, - }, - { - .num_bits = 3, - .out_value = bscan_zero, - .in_value = NULL, - } - - }; - struct scan_field tunneled_dr[] = { - { - .num_bits = 1, - .out_value = bscan_one, - .in_value = NULL, - }, - { - .num_bits = 7, - .out_value = tunneled_dr_width, - .in_value = NULL, - }, - /* for BSCAN tunnel, there is a one-TCK skew between shift in and shift out, so splitting the DR payload into 2 fields */ - { - .num_bits = 1, - .out_value = out_0, - .in_value = NULL, - }, - { - .num_bits = 32, - .out_value = out_31_1, - .in_value = in_value, - }, - { - .num_bits = 3, - .out_value = bscan_zero, - .in_value = NULL, - } - }; - - jtag_add_ir_scan(target->tap, &select_user4, TAP_IDLE); - jtag_add_dr_scan(target->tap, DIM(tunneled_ir), tunneled_ir, TAP_IDLE); - jtag_add_dr_scan(target->tap, DIM(tunneled_dr), tunneled_dr, TAP_IDLE); - select_dmi_via_bscan(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(in_value, 0, 32); - LOG_DEBUG("DTMCS: 0x%x -> 0x%x", out, in); - - return in; -} - -#endif - static void select_dmi(struct target *target) { #if BUILD_RISCV_ARTY_BSCAN == 1 diff --git a/src/target/riscv/riscv.c b/src/target/riscv/riscv.c index 38365f9db..749b533fb 100644 --- a/src/target/riscv/riscv.c +++ b/src/target/riscv/riscv.c @@ -172,6 +172,9 @@ struct scan_field select_idcode = { #if BUILD_RISCV_ARTY_BSCAN == 1 +uint8_t bscan_zero[4] = {0}; +uint8_t bscan_one[4] = {1}; + uint8_t ir_user4[4] = {0x23}; struct scan_field select_user4 = { .in_value = NULL, @@ -179,7 +182,6 @@ struct scan_field select_user4 = { }; -static uint8_t bscan_zero[4]; uint8_t bscan_tunneled_ir_width[4] = {5}; /* overridden by assignment in riscv_init_target */ struct scan_field _bscan_tunneled_select_dmi[] = { { @@ -237,6 +239,99 @@ range_t *expose_csr; range_t *expose_custom; static int riscv_resume_go_all_harts(struct target *target); +#if BUILD_RISCV_ARTY_BSCAN == 1 + +void select_dmi_via_bscan(struct target *target) +{ + jtag_add_ir_scan(target->tap, &select_user4, TAP_IDLE); + jtag_add_dr_scan(target->tap, bscan_tunneled_select_dmi_num_fields, bscan_tunneled_select_dmi, TAP_IDLE); +} + + +uint32_t dtmcontrol_scan_via_bscan(struct target *target, uint32_t out) +{ + /* jtag_add_ir_scan(target->tap, &select_dtmcontrol, TAP_IDLE); */ + + /* On BSCAN TAP: Select IR=USER4, issue tunneled IR scan via BSCAN TAP's DR */ + uint8_t tunneled_ir_width[4] = {target->bscan_tunnel_ir_width}; + uint8_t tunneled_dr_width[4] = {32}; + uint8_t out_0[4] = {out & 0x1}; + uint8_t out_31_1[4]; + uint8_t in_value[4]; + + buf_set_u32(out_31_1, 0, 32, (out >> 1)); + + struct scan_field tunneled_ir[] = { + { + .num_bits = 1, + .out_value = bscan_zero, + .in_value = NULL, + }, + { + .num_bits = 7, + .out_value = tunneled_ir_width, + .in_value = NULL, + }, + { + .num_bits = target->bscan_tunnel_ir_width, + .out_value = ir_dtmcontrol, + .in_value = NULL, + }, + { + .num_bits = 3, + .out_value = bscan_zero, + .in_value = NULL, + } + + }; + struct scan_field tunneled_dr[] = { + { + .num_bits = 1, + .out_value = bscan_one, + .in_value = NULL, + }, + { + .num_bits = 7, + .out_value = tunneled_dr_width, + .in_value = NULL, + }, + /* for BSCAN tunnel, there is a one-TCK skew between shift in and shift out, so splitting the DR payload into 2 fields */ + { + .num_bits = 1, + .out_value = out_0, + .in_value = NULL, + }, + { + .num_bits = 32, + .out_value = out_31_1, + .in_value = in_value, + }, + { + .num_bits = 3, + .out_value = bscan_zero, + .in_value = NULL, + } + }; + + jtag_add_ir_scan(target->tap, &select_user4, TAP_IDLE); + jtag_add_dr_scan(target->tap, DIM(tunneled_ir), tunneled_ir, TAP_IDLE); + jtag_add_dr_scan(target->tap, DIM(tunneled_dr), tunneled_dr, TAP_IDLE); + select_dmi_via_bscan(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(in_value, 0, 32); + LOG_DEBUG("DTMCS: 0x%x -> 0x%x", out, in); + + return in; +} + +#endif + static uint32_t dtmcontrol_scan(struct target *target, uint32_t out) { @@ -244,6 +339,13 @@ static uint32_t dtmcontrol_scan(struct target *target, uint32_t out) uint8_t in_value[4]; uint8_t out_value[4]; +#if BUILD_RISCV_ARTY_BSCAN == 1 + if (target->bscan_tunnel_ir_width != 0) { + return dtmcontrol_scan_via_bscan(target, out); + } +#endif + + buf_set_u32(out_value, 0, 32, out); jtag_add_ir_scan(target->tap, &select_dtmcontrol, TAP_IDLE); diff --git a/src/target/riscv/riscv.h b/src/target/riscv/riscv.h index d14f7f764..ba742635d 100644 --- a/src/target/riscv/riscv.h +++ b/src/target/riscv/riscv.h @@ -169,6 +169,11 @@ extern struct scan_field select_idcode; extern struct scan_field select_user4; extern struct scan_field *bscan_tunneled_select_dmi; extern uint32_t bscan_tunneled_select_dmi_num_fields; +extern uint8_t bscan_zero[4]; +extern uint8_t bscan_one[4]; + +uint32_t dtmcontrol_scan_via_bscan(struct target *target, uint32_t out); +void select_dmi_via_bscan(struct target *target); #endif /*** OpenOCD Interface */