Moved some functions to riscv.c from the version-specific files.
This commit is contained in:
parent
38e7bdbaa3
commit
837f9ed52a
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue