Moved some functions to riscv.c from the version-specific files.

This commit is contained in:
Greg Savin 2019-04-05 15:26:21 -07:00
parent 38e7bdbaa3
commit 837f9ed52a
4 changed files with 114 additions and 98 deletions

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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 */