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:
ianst
2023-11-09 07:28:50 -08:00
committed by Antonio Borneo
parent 9ebc2a6519
commit f8096ce687
4 changed files with 123 additions and 0 deletions

View File

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