xtensa: update XDM register map for TRAX support
- Include additional debug module registers - Add translation function for DM reg addr -> ID - Add DM read/write commands Signed-off-by: ianst <ianst@cadence.com> Change-Id: If95419d24a9f27a40fa695c8c15326cdfd127ef1 Reviewed-on: https://review.openocd.org/c/openocd/+/7973 Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com> Tested-by: jenkins
This commit is contained in:
@@ -34,6 +34,16 @@ static const struct xtensa_dm_pwr_reg_offsets xdm_pwr_regs[XDMREG_PWRNUM] =
|
||||
static const struct xtensa_dm_reg_offsets xdm_regs[XDMREG_NUM] =
|
||||
XTENSA_DM_REG_OFFSETS;
|
||||
|
||||
static enum xtensa_dm_reg xtensa_dm_regaddr_to_id(uint32_t addr)
|
||||
{
|
||||
enum xtensa_dm_reg id;
|
||||
uint32_t addr_masked = (addr & (XTENSA_DM_APB_ALIGN - 1));
|
||||
for (id = XDMREG_TRAXID; id < XDMREG_NUM; id++)
|
||||
if (xdm_regs[id].apb == addr_masked)
|
||||
break;
|
||||
return id;
|
||||
}
|
||||
|
||||
static void xtensa_dm_add_set_ir(struct xtensa_debug_module *dm, uint8_t value)
|
||||
{
|
||||
struct scan_field field;
|
||||
@@ -285,6 +295,34 @@ int xtensa_dm_core_status_clear(struct xtensa_debug_module *dm, xtensa_dsr_t bit
|
||||
return xtensa_dm_queue_execute(dm);
|
||||
}
|
||||
|
||||
int xtensa_dm_read(struct xtensa_debug_module *dm, uint32_t addr, uint32_t *val)
|
||||
{
|
||||
enum xtensa_dm_reg reg = xtensa_dm_regaddr_to_id(addr);
|
||||
uint8_t buf[sizeof(uint32_t)];
|
||||
if (reg < XDMREG_NUM) {
|
||||
xtensa_dm_queue_enable(dm);
|
||||
dm->dbg_ops->queue_reg_read(dm, reg, buf);
|
||||
xtensa_dm_queue_tdi_idle(dm);
|
||||
int res = xtensa_dm_queue_execute(dm);
|
||||
if (res == ERROR_OK && val)
|
||||
*val = buf_get_u32(buf, 0, 32);
|
||||
return res;
|
||||
}
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
|
||||
int xtensa_dm_write(struct xtensa_debug_module *dm, uint32_t addr, uint32_t val)
|
||||
{
|
||||
enum xtensa_dm_reg reg = xtensa_dm_regaddr_to_id(addr);
|
||||
if (reg < XDMREG_NUM) {
|
||||
xtensa_dm_queue_enable(dm);
|
||||
dm->dbg_ops->queue_reg_write(dm, reg, val);
|
||||
xtensa_dm_queue_tdi_idle(dm);
|
||||
return xtensa_dm_queue_execute(dm);
|
||||
}
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
|
||||
int xtensa_dm_trace_start(struct xtensa_debug_module *dm, struct xtensa_trace_start_config *cfg)
|
||||
{
|
||||
/*Turn off trace unit so we can start a new trace. */
|
||||
|
||||
Reference in New Issue
Block a user