target/xtensa: virtualize XDM registers 43/7143/5
authorIan Thompson <ianst@cadence.com>
Wed, 24 Aug 2022 13:51:51 +0000 (06:51 -0700)
committerAntonio Borneo <borneo.antonio@gmail.com>
Thu, 8 Sep 2022 09:32:23 +0000 (09:32 +0000)
Use indirect enum IDs to access XDM registers in preparation for supporting both NAR (JTAG) and APB (DAP).  No new clang static analysis warnings.

Signed-off-by: Ian Thompson <ianst@cadence.com>
Change-Id: I0b742fe4661ff3cf609454b8650493d141a1e1ff
Reviewed-on: https://review.openocd.org/c/openocd/+/7143
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
src/target/xtensa/xtensa.c
src/target/xtensa/xtensa.h
src/target/xtensa/xtensa_debug_module.c
src/target/xtensa/xtensa_debug_module.h

index 2fd2c7ca5775ba47af7a111cc779f81f8c7697f5..a90cd146841d5f5f25fe86919e8bf1a62984c43d 100644 (file)
@@ -493,7 +493,7 @@ static void xtensa_mark_register_dirty(struct xtensa *xtensa, enum xtensa_reg_id
 
 static void xtensa_queue_exec_ins(struct xtensa *xtensa, uint32_t ins)
 {
-       xtensa_queue_dbg_reg_write(xtensa, NARADR_DIR0EXEC, ins);
+       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DIR0EXEC, ins);
 }
 
 static void xtensa_queue_exec_ins_wide(struct xtensa *xtensa, uint8_t *ops, uint8_t oplen)
@@ -506,9 +506,9 @@ static void xtensa_queue_exec_ins_wide(struct xtensa *xtensa, uint8_t *ops, uint
                else
                        memcpy(opsw, ops, oplen);
                for (int32_t i = oplenw - 1; i > 0; i--)
-                       xtensa_queue_dbg_reg_write(xtensa, NARADR_DIR0 + i, opsw[i]);
+                       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DIR0 + i, opsw[i]);
                /* Write DIR0EXEC last */
-               xtensa_queue_dbg_reg_write(xtensa, NARADR_DIR0EXEC, opsw[0]);
+               xtensa_queue_dbg_reg_write(xtensa, XDMREG_DIR0EXEC, opsw[0]);
        }
 }
 
@@ -529,8 +529,8 @@ int xtensa_window_state_save(struct target *target, uint32_t *woe)
                /* Save PS (LX) and disable window overflow exceptions prior to AR save */
                xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_PS, XT_REG_A3));
                xtensa_queue_exec_ins(xtensa, XT_INS_WSR(xtensa, XT_SR_DDR, XT_REG_A3));
-               xtensa_queue_dbg_reg_read(xtensa, NARADR_DDR, woe_buf);
-               int res = jtag_execute_queue();
+               xtensa_queue_dbg_reg_read(xtensa, XDMREG_DDR, woe_buf);
+               int res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
                if (res != ERROR_OK) {
                        LOG_ERROR("Failed to read PS (%d)!", res);
                        return res;
@@ -539,7 +539,7 @@ int xtensa_window_state_save(struct target *target, uint32_t *woe)
                *woe = buf_get_u32(woe_buf, 0, 32);
                woe_dis = *woe & ~XT_PS_WOE_MSK;
                LOG_DEBUG("Clearing PS.WOE (0x%08" PRIx32 " -> 0x%08" PRIx32 ")", *woe, woe_dis);
-               xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, woe_dis);
+               xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, woe_dis);
                xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
                xtensa_queue_exec_ins(xtensa, XT_INS_WSR(xtensa, XT_SR_PS, XT_REG_A3));
        }
@@ -552,7 +552,7 @@ void xtensa_window_state_restore(struct target *target, uint32_t woe)
        struct xtensa *xtensa = target_to_xtensa(target);
        if (xtensa->core_config->windowed) {
                /* Restore window overflow exception state */
-               xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, woe);
+               xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, woe);
                xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
                xtensa_queue_exec_ins(xtensa, XT_INS_WSR(xtensa, XT_SR_PS, XT_REG_A3));
                LOG_DEBUG("Restored PS.WOE (0x%08" PRIx32 ")", woe);
@@ -614,7 +614,7 @@ static int xtensa_write_dirty_registers(struct target *target)
                                        reg_list[i].name,
                                        rlist[ridx].reg_num,
                                        regval);
-                               xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, regval);
+                               xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, regval);
                                xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
                                if (reg_list[i].exist) {
                                        unsigned int reg_num = rlist[ridx].reg_num;
@@ -641,7 +641,7 @@ static int xtensa_write_dirty_registers(struct target *target)
        if (delay_cpenable) {
                regval = xtensa_reg_get(target, XT_REG_IDX_CPENABLE);
                LOG_TARGET_DEBUG(target, "Writing back reg cpenable (224) val %08" PRIX32, regval);
-               xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, regval);
+               xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, regval);
                xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
                xtensa_queue_exec_ins(xtensa, XT_INS_WSR(xtensa,
                                xtensa_regs[XT_REG_IDX_CPENABLE].reg_num,
@@ -653,8 +653,8 @@ static int xtensa_write_dirty_registers(struct target *target)
        if (preserve_a3) {
                /* Save (windowed) A3 for scratch use */
                xtensa_queue_exec_ins(xtensa, XT_INS_WSR(xtensa, XT_SR_DDR, XT_REG_A3));
-               xtensa_queue_dbg_reg_read(xtensa, NARADR_DDR, a3_buf);
-               res = jtag_execute_queue();
+               xtensa_queue_dbg_reg_read(xtensa, XDMREG_DDR, a3_buf);
+               res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
                if (res != ERROR_OK)
                        return res;
                xtensa_core_status_check(target);
@@ -705,7 +705,7 @@ static int xtensa_write_dirty_registers(struct target *target)
                                xtensa_regs[XT_REG_IDX_A0 + i].name,
                                regval,
                                xtensa_regs[XT_REG_IDX_A0 + i].reg_num);
-                       xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, regval);
+                       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, regval);
                        xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, i));
                        reg_list[XT_REG_IDX_A0 + i].dirty = false;
                        if (i == 3) {
@@ -733,7 +733,7 @@ static int xtensa_write_dirty_registers(struct target *target)
                                                        xtensa_regs[realadr].name,
                                                        regval,
                                                        xtensa_regs[realadr].reg_num);
-                                               xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, regval);
+                                               xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, regval);
                                                xtensa_queue_exec_ins(xtensa,
                                                        XT_INS_RSR(xtensa, XT_SR_DDR,
                                                                xtensa_regs[XT_REG_IDX_AR0 + i].reg_num));
@@ -757,11 +757,11 @@ static int xtensa_write_dirty_registers(struct target *target)
        }
 
        if (preserve_a3) {
-               xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, a3);
+               xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, a3);
                xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
        }
 
-       res = jtag_execute_queue();
+       res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
        xtensa_core_status_check(target);
 
        return res;
@@ -785,11 +785,11 @@ int xtensa_examine(struct target *target)
                return ERROR_FAIL;
        }
 
-       xtensa_queue_pwr_reg_write(xtensa, DMREG_PWRCTL, cmd);
-       xtensa_queue_pwr_reg_write(xtensa, DMREG_PWRCTL, cmd | PWRCTL_JTAGDEBUGUSE);
+       xtensa_queue_pwr_reg_write(xtensa, XDMREG_PWRCTL, cmd);
+       xtensa_queue_pwr_reg_write(xtensa, XDMREG_PWRCTL, cmd | PWRCTL_JTAGDEBUGUSE);
        xtensa_dm_queue_enable(&xtensa->dbg_mod);
        xtensa_dm_queue_tdi_idle(&xtensa->dbg_mod);
-       int res = jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
        if (res != ERROR_OK)
                return res;
        if (!xtensa_dm_is_online(&xtensa->dbg_mod)) {
@@ -810,11 +810,11 @@ int xtensa_wakeup(struct target *target)
 
        if (xtensa->reset_asserted)
                cmd |= PWRCTL_CORERESET;
-       xtensa_queue_pwr_reg_write(xtensa, DMREG_PWRCTL, cmd);
+       xtensa_queue_pwr_reg_write(xtensa, XDMREG_PWRCTL, cmd);
        /* TODO: can we join this with the write above? */
-       xtensa_queue_pwr_reg_write(xtensa, DMREG_PWRCTL, cmd | PWRCTL_JTAGDEBUGUSE);
+       xtensa_queue_pwr_reg_write(xtensa, XDMREG_PWRCTL, cmd | PWRCTL_JTAGDEBUGUSE);
        xtensa_dm_queue_tdi_idle(&xtensa->dbg_mod);
-       return jtag_execute_queue();
+       return xtensa_dm_queue_execute(&xtensa->dbg_mod);
 }
 
 int xtensa_smpbreak_write(struct xtensa *xtensa, uint32_t set)
@@ -825,11 +825,11 @@ int xtensa_smpbreak_write(struct xtensa *xtensa, uint32_t set)
                OCDDCR_DEBUGMODEOUTEN | OCDDCR_ENABLEOCD);
 
        LOG_TARGET_DEBUG(xtensa->target, "write smpbreak set=0x%" PRIx32 " clear=0x%" PRIx32, set, clear);
-       xtensa_queue_dbg_reg_write(xtensa, NARADR_DCRSET, set | OCDDCR_ENABLEOCD);
-       xtensa_queue_dbg_reg_write(xtensa, NARADR_DCRCLR, clear);
-       xtensa_queue_dbg_reg_write(xtensa, NARADR_DSR, dsr_data);
+       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DCRSET, set | OCDDCR_ENABLEOCD);
+       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DCRCLR, clear);
+       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DSR, dsr_data);
        xtensa_dm_queue_tdi_idle(&xtensa->dbg_mod);
-       return jtag_execute_queue();
+       return xtensa_dm_queue_execute(&xtensa->dbg_mod);
 }
 
 int xtensa_smpbreak_set(struct target *target, uint32_t set)
@@ -848,9 +848,9 @@ int xtensa_smpbreak_read(struct xtensa *xtensa, uint32_t *val)
 {
        uint8_t dcr_buf[sizeof(uint32_t)];
 
-       xtensa_queue_dbg_reg_read(xtensa, NARADR_DCRSET, dcr_buf);
+       xtensa_queue_dbg_reg_read(xtensa, XDMREG_DCRSET, dcr_buf);
        xtensa_dm_queue_tdi_idle(&xtensa->dbg_mod);
-       int res = jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
        *val = buf_get_u32(dcr_buf, 0, 32);
 
        return res;
@@ -958,11 +958,11 @@ int xtensa_assert_reset(struct target *target)
        LOG_TARGET_DEBUG(target, "target_number=%i, begin", target->target_number);
        target->state = TARGET_RESET;
        xtensa_queue_pwr_reg_write(xtensa,
-               DMREG_PWRCTL,
-               PWRCTL_JTAGDEBUGUSE | PWRCTL_DEBUGWAKEUP | PWRCTL_MEMWAKEUP | PWRCTL_COREWAKEUP |
-               PWRCTL_CORERESET);
+               XDMREG_PWRCTL,
+               PWRCTL_JTAGDEBUGUSE | PWRCTL_DEBUGWAKEUP | PWRCTL_MEMWAKEUP |
+               PWRCTL_COREWAKEUP | PWRCTL_CORERESET);
        xtensa_dm_queue_tdi_idle(&xtensa->dbg_mod);
-       int res = jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
        if (res != ERROR_OK)
                return res;
        xtensa->reset_asserted = true;
@@ -976,13 +976,14 @@ int xtensa_deassert_reset(struct target *target)
        LOG_TARGET_DEBUG(target, "halt=%d", target->reset_halt);
        if (target->reset_halt)
                xtensa_queue_dbg_reg_write(xtensa,
-                       NARADR_DCRSET,
+                       XDMREG_DCRSET,
                        OCDDCR_ENABLEOCD | OCDDCR_DEBUGINTERRUPT);
        xtensa_queue_pwr_reg_write(xtensa,
-               DMREG_PWRCTL,
-               PWRCTL_JTAGDEBUGUSE | PWRCTL_DEBUGWAKEUP | PWRCTL_MEMWAKEUP | PWRCTL_COREWAKEUP);
+               XDMREG_PWRCTL,
+               PWRCTL_JTAGDEBUGUSE | PWRCTL_DEBUGWAKEUP | PWRCTL_MEMWAKEUP |
+               PWRCTL_COREWAKEUP);
        xtensa_dm_queue_tdi_idle(&xtensa->dbg_mod);
-       int res = jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
        if (res != ERROR_OK)
                return res;
        target->state = TARGET_RUNNING;
@@ -1022,7 +1023,7 @@ int xtensa_fetch_all_regs(struct target *target)
 
        /* Save (windowed) A3 so cache matches physical AR3; A3 usable as scratch */
        xtensa_queue_exec_ins(xtensa, XT_INS_WSR(xtensa, XT_SR_DDR, XT_REG_A3));
-       xtensa_queue_dbg_reg_read(xtensa, NARADR_DDR, a3_buf);
+       xtensa_queue_dbg_reg_read(xtensa, XDMREG_DDR, a3_buf);
        int res = xtensa_window_state_save(target, &woe);
        if (res != ERROR_OK)
                goto xtensa_fetch_all_regs_done;
@@ -1038,10 +1039,10 @@ int xtensa_fetch_all_regs(struct target *target)
                        if (i + j < xtensa->core_config->aregs_num) {
                                xtensa_queue_exec_ins(xtensa,
                                        XT_INS_WSR(xtensa, XT_SR_DDR, xtensa_regs[XT_REG_IDX_AR0 + i].reg_num));
-                               xtensa_queue_dbg_reg_read(xtensa, NARADR_DDR,
+                               xtensa_queue_dbg_reg_read(xtensa, XDMREG_DDR,
                                        regvals[XT_REG_IDX_AR0 + i + j].buf);
                                if (debug_dsrs)
-                                       xtensa_queue_dbg_reg_read(xtensa, NARADR_DSR,
+                                       xtensa_queue_dbg_reg_read(xtensa, XDMREG_DSR,
                                                dsrs[XT_REG_IDX_AR0 + i + j].buf);
                        }
                }
@@ -1057,9 +1058,9 @@ int xtensa_fetch_all_regs(struct target *target)
                /* As the very first thing after AREGS, go grab CPENABLE */
                xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, xtensa_regs[XT_REG_IDX_CPENABLE].reg_num, XT_REG_A3));
                xtensa_queue_exec_ins(xtensa, XT_INS_WSR(xtensa, XT_SR_DDR, XT_REG_A3));
-               xtensa_queue_dbg_reg_read(xtensa, NARADR_DDR, regvals[XT_REG_IDX_CPENABLE].buf);
+               xtensa_queue_dbg_reg_read(xtensa, XDMREG_DDR, regvals[XT_REG_IDX_CPENABLE].buf);
        }
-       res = jtag_execute_queue();
+       res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
        if (res != ERROR_OK) {
                LOG_ERROR("Failed to read ARs (%d)!", res);
                goto xtensa_fetch_all_regs_done;
@@ -1072,7 +1073,7 @@ int xtensa_fetch_all_regs(struct target *target)
                cpenable = buf_get_u32(regvals[XT_REG_IDX_CPENABLE].buf, 0, 32);
 
                /* Enable all coprocessors (by setting all bits in CPENABLE) so we can read FP and user registers. */
-               xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, 0xffffffff);
+               xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, 0xffffffff);
                xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
                xtensa_queue_exec_ins(xtensa, XT_INS_WSR(xtensa, xtensa_regs[XT_REG_IDX_CPENABLE].reg_num, XT_REG_A3));
 
@@ -1111,14 +1112,14 @@ int xtensa_fetch_all_regs(struct target *target)
                        }
                        if (reg_fetched) {
                                xtensa_queue_exec_ins(xtensa, XT_INS_WSR(xtensa, XT_SR_DDR, XT_REG_A3));
-                               xtensa_queue_dbg_reg_read(xtensa, NARADR_DDR, regvals[i].buf);
+                               xtensa_queue_dbg_reg_read(xtensa, XDMREG_DDR, regvals[i].buf);
                                if (debug_dsrs)
-                                       xtensa_queue_dbg_reg_read(xtensa, NARADR_DSR, dsrs[i].buf);
+                                       xtensa_queue_dbg_reg_read(xtensa, XDMREG_DSR, dsrs[i].buf);
                        }
                }
        }
        /* Ok, send the whole mess to the CPU. */
-       res = jtag_execute_queue();
+       res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
        if (res != ERROR_OK) {
                LOG_ERROR("Failed to fetch AR regs!");
                goto xtensa_fetch_all_regs_done;
@@ -1305,9 +1306,9 @@ int xtensa_halt(struct target *target)
        }
        LOG_TARGET_DEBUG(target, "Core status 0x%" PRIx32, xtensa_dm_core_status_get(&xtensa->dbg_mod));
        if (!xtensa_is_stopped(target)) {
-               xtensa_queue_dbg_reg_write(xtensa, NARADR_DCRSET, OCDDCR_ENABLEOCD | OCDDCR_DEBUGINTERRUPT);
+               xtensa_queue_dbg_reg_write(xtensa, XDMREG_DCRSET, OCDDCR_ENABLEOCD | OCDDCR_DEBUGINTERRUPT);
                xtensa_dm_queue_tdi_idle(&xtensa->dbg_mod);
-               res = jtag_execute_queue();
+               res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
                if (res != ERROR_OK)
                        LOG_TARGET_ERROR(target, "Failed to set OCDDCR_DEBUGINTERRUPT. Can't halt.");
        }
@@ -1381,7 +1382,7 @@ int xtensa_do_resume(struct target *target)
        LOG_TARGET_DEBUG(target, "start");
 
        xtensa_queue_exec_ins(xtensa, XT_INS_RFDO(xtensa));
-       int res = jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
        if (res != ERROR_OK) {
                LOG_TARGET_ERROR(target, "Failed to exec RFDO %d!", res);
                return res;
@@ -1741,26 +1742,26 @@ int xtensa_read_memory(struct target *target, target_addr_t address, uint32_t si
        /* We're going to use A3 here */
        xtensa_mark_register_dirty(xtensa, XT_REG_IDX_A3);
        /* Write start address to A3 */
-       xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, addrstart_al);
+       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, addrstart_al);
        xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
        /* Now we can safely read data from addrstart_al up to addrend_al into albuff */
        if (xtensa->probe_lsddr32p != 0) {
                xtensa_queue_exec_ins(xtensa, XT_INS_LDDR32P(xtensa, XT_REG_A3));
                for (unsigned int i = 0; adr != addrend_al; i += sizeof(uint32_t), adr += sizeof(uint32_t))
                        xtensa_queue_dbg_reg_read(xtensa,
-                               (adr + sizeof(uint32_t) == addrend_al) ? NARADR_DDR : NARADR_DDREXEC,
+                               (adr + sizeof(uint32_t) == addrend_al) ? XDMREG_DDR : XDMREG_DDREXEC,
                                &albuff[i]);
        } else {
                xtensa_mark_register_dirty(xtensa, XT_REG_IDX_A4);
                for (unsigned int i = 0; adr != addrend_al; i += sizeof(uint32_t), adr += sizeof(uint32_t)) {
                        xtensa_queue_exec_ins(xtensa, XT_INS_L32I(xtensa, XT_REG_A3, XT_REG_A4, 0));
                        xtensa_queue_exec_ins(xtensa, XT_INS_WSR(xtensa, XT_SR_DDR, XT_REG_A4));
-                       xtensa_queue_dbg_reg_read(xtensa, NARADR_DDR, &albuff[i]);
-                       xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, adr + sizeof(uint32_t));
+                       xtensa_queue_dbg_reg_read(xtensa, XDMREG_DDR, &albuff[i]);
+                       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, adr + sizeof(uint32_t));
                        xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
                }
        }
-       int res = jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
        if (res == ERROR_OK) {
                bool prev_suppress = xtensa->suppress_dsr_errors;
                xtensa->suppress_dsr_errors = true;
@@ -1856,7 +1857,7 @@ int xtensa_write_memory(struct target *target,
        if (fill_head_tail) {
                /* See if we need to read the first and/or last word. */
                if (address & 3) {
-                       xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, addrstart_al);
+                       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, addrstart_al);
                        xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
                        if (xtensa->probe_lsddr32p == 1) {
                                xtensa_queue_exec_ins(xtensa, XT_INS_LDDR32P(xtensa, XT_REG_A3));
@@ -1864,10 +1865,10 @@ int xtensa_write_memory(struct target *target,
                                xtensa_queue_exec_ins(xtensa, XT_INS_L32I(xtensa, XT_REG_A3, XT_REG_A3, 0));
                                xtensa_queue_exec_ins(xtensa, XT_INS_WSR(xtensa, XT_SR_DDR, XT_REG_A3));
                        }
-                       xtensa_queue_dbg_reg_read(xtensa, NARADR_DDR, &albuff[0]);
+                       xtensa_queue_dbg_reg_read(xtensa, XDMREG_DDR, &albuff[0]);
                }
                if ((address + (size * count)) & 3) {
-                       xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, addrend_al - 4);
+                       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, addrend_al - 4);
                        xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
                        if (xtensa->probe_lsddr32p == 1) {
                                xtensa_queue_exec_ins(xtensa, XT_INS_LDDR32P(xtensa, XT_REG_A3));
@@ -1875,11 +1876,11 @@ int xtensa_write_memory(struct target *target,
                                xtensa_queue_exec_ins(xtensa, XT_INS_L32I(xtensa, XT_REG_A3, XT_REG_A3, 0));
                                xtensa_queue_exec_ins(xtensa, XT_INS_WSR(xtensa, XT_SR_DDR, XT_REG_A3));
                        }
-                       xtensa_queue_dbg_reg_read(xtensa, NARADR_DDR,
+                       xtensa_queue_dbg_reg_read(xtensa, XDMREG_DDR,
                                &albuff[addrend_al - addrstart_al - 4]);
                }
                /* Grab bytes */
-               res = jtag_execute_queue();
+               res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
                if (res != ERROR_OK) {
                        LOG_ERROR("Error issuing unaligned memory write context instruction(s): %d", res);
                        if (albuff != buffer)
@@ -1911,30 +1912,30 @@ int xtensa_write_memory(struct target *target,
                buf_bswap32(albuff, fill_head_tail ? albuff : buffer, addrend_al - addrstart_al);
 
        /* Write start address to A3 */
-       xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, addrstart_al);
+       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, addrstart_al);
        xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
        /* Write the aligned buffer */
        if (xtensa->probe_lsddr32p != 0) {
                for (unsigned int i = 0; adr != addrend_al; i += sizeof(uint32_t), adr += sizeof(uint32_t)) {
                        if (i == 0) {
-                               xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, buf_get_u32(&albuff[i], 0, 32));
+                               xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, buf_get_u32(&albuff[i], 0, 32));
                                xtensa_queue_exec_ins(xtensa, XT_INS_SDDR32P(xtensa, XT_REG_A3));
                        } else {
-                               xtensa_queue_dbg_reg_write(xtensa, NARADR_DDREXEC, buf_get_u32(&albuff[i], 0, 32));
+                               xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDREXEC, buf_get_u32(&albuff[i], 0, 32));
                        }
                }
        } else {
                xtensa_mark_register_dirty(xtensa, XT_REG_IDX_A4);
                for (unsigned int i = 0; adr != addrend_al; i += sizeof(uint32_t), adr += sizeof(uint32_t)) {
-                       xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, buf_get_u32(&albuff[i], 0, 32));
+                       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, buf_get_u32(&albuff[i], 0, 32));
                        xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A4));
                        xtensa_queue_exec_ins(xtensa, XT_INS_S32I(xtensa, XT_REG_A3, XT_REG_A4, 0));
-                       xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, adr + sizeof(uint32_t));
+                       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, adr + sizeof(uint32_t));
                        xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
                }
        }
 
-       res = jtag_execute_queue();
+       res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
        if (res == ERROR_OK) {
                bool prev_suppress = xtensa->suppress_dsr_errors;
                xtensa->suppress_dsr_errors = true;
@@ -1967,7 +1968,7 @@ int xtensa_write_memory(struct target *target,
                        while ((adr + off) < addrend_al) {
                                if (off == 0) {
                                        /* Write start address to A3 */
-                                       xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, adr);
+                                       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, adr);
                                        xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
                                }
                                if (issue_ihi)
@@ -1983,7 +1984,7 @@ int xtensa_write_memory(struct target *target,
                        }
 
                        /* Execute cache WB/INV instructions */
-                       res = jtag_execute_queue();
+                       res = xtensa_dm_queue_execute(&xtensa->dbg_mod);
                        xtensa_core_status_check(target);
                        if (res != ERROR_OK)
                                LOG_TARGET_ERROR(target,
@@ -2013,7 +2014,8 @@ int xtensa_poll(struct target *target)
 {
        struct xtensa *xtensa = target_to_xtensa(target);
 
-       int res = xtensa_dm_power_status_read(&xtensa->dbg_mod, PWRSTAT_DEBUGWASRESET | PWRSTAT_COREWASRESET);
+       int res = xtensa_dm_power_status_read(&xtensa->dbg_mod, PWRSTAT_DEBUGWASRESET |
+               PWRSTAT_COREWASRESET);
        if (xtensa->dbg_mod.power_status.stat != xtensa->dbg_mod.power_status.stath)
                LOG_TARGET_DEBUG(target, "PWRSTAT: read 0x%08" PRIx32 ", clear 0x%08lx, reread 0x%08" PRIx32,
                        xtensa->dbg_mod.power_status.stat,
@@ -2141,7 +2143,7 @@ static int xtensa_update_instruction(struct target *target, target_addr_t addres
                xtensa_mark_register_dirty(xtensa, XT_REG_IDX_A3);
 
                /* Write start address to A3 and invalidate */
-               xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, address);
+               xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, address);
                xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
                LOG_TARGET_DEBUG(target, "DHWBI, IHI for address "TARGET_ADDR_FMT, address);
                if (issue_dhwbi) {
@@ -2164,7 +2166,7 @@ static int xtensa_update_instruction(struct target *target, target_addr_t addres
                }
 
                /* Execute invalidate instructions */
-               ret = jtag_execute_queue();
+               ret = xtensa_dm_queue_execute(&xtensa->dbg_mod);
                xtensa_core_status_check(target);
                if (ret != ERROR_OK) {
                        LOG_ERROR("Error issuing cache invaldate instruction(s): %d", ret);
@@ -2181,7 +2183,7 @@ static int xtensa_update_instruction(struct target *target, target_addr_t addres
 
        if (issue_dhwbi) {
                /* Flush dcache so instruction propagates.  A3 may be corrupted during memory write */
-               xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, address);
+               xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, address);
                xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
                xtensa_queue_exec_ins(xtensa, XT_INS_DHWB(xtensa, XT_REG_A3, 0));
                LOG_DEBUG("DHWB dcache line for address "TARGET_ADDR_FMT, address);
@@ -2191,7 +2193,7 @@ static int xtensa_update_instruction(struct target *target, target_addr_t addres
                }
 
                /* Execute invalidate instructions */
-               ret = jtag_execute_queue();
+               ret = xtensa_dm_queue_execute(&xtensa->dbg_mod);
                xtensa_core_status_check(target);
        }
 
@@ -2658,15 +2660,15 @@ static int xtensa_gdbqc_qxtreg(struct target *target, const char *packet, char *
                }
        }
        xtensa_reg_val_t orig_a4 = xtensa_reg_get(target, XT_REG_IDX_A4);
-       xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, xtensa->spill_loc);
+       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, xtensa->spill_loc);
        xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A4));
 
        int32_t tieop_status = xtensa_gdbqc_parse_exec_tie_ops(target, delim);
 
        /* Restore a4 but not yet spill memory.  Execute it all... */
-       xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, orig_a4);
+       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, orig_a4);
        xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A4));
-       status = jtag_execute_queue();
+       status = xtensa_dm_queue_execute(&xtensa->dbg_mod);
        if (status != ERROR_OK) {
                LOG_TARGET_ERROR(target, "TIE queue execute: %d\n", status);
                tieop_status = status;
@@ -2944,13 +2946,13 @@ void xtensa_target_deinit(struct target *target)
        LOG_DEBUG("start");
 
        if (target_was_examined(target)) {
-               int ret = xtensa_queue_dbg_reg_write(xtensa, NARADR_DCRCLR, OCDDCR_ENABLEOCD);
+               int ret = xtensa_queue_dbg_reg_write(xtensa, XDMREG_DCRCLR, OCDDCR_ENABLEOCD);
                if (ret != ERROR_OK) {
                        LOG_ERROR("Failed to queue OCDDCR_ENABLEOCD clear operation!");
                        return;
                }
                xtensa_dm_queue_tdi_idle(&xtensa->dbg_mod);
-               ret = jtag_execute_queue();
+               ret = xtensa_dm_queue_execute(&xtensa->dbg_mod);
                if (ret != ERROR_OK) {
                        LOG_ERROR("Failed to clear OCDDCR_ENABLEOCD!");
                        return;
@@ -3013,17 +3015,17 @@ COMMAND_HELPER(xtensa_cmd_exe_do, struct target *target)
        xtensa_reg_val_t exccause = xtensa_reg_get(target, XT_REG_IDX_EXCCAUSE);
        xtensa_reg_val_t cpenable = xtensa_reg_get(target, XT_REG_IDX_CPENABLE);
        xtensa_reg_val_t a3 = xtensa_reg_get(target, XT_REG_IDX_A3);
-       xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, 0xffffffff);
+       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, 0xffffffff);
        xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
        xtensa_queue_exec_ins(xtensa, XT_INS_WSR(xtensa,
                        xtensa_regs[XT_REG_IDX_CPENABLE].reg_num, XT_REG_A3));
-       xtensa_queue_dbg_reg_write(xtensa, NARADR_DDR, a3);
+       xtensa_queue_dbg_reg_write(xtensa, XDMREG_DDR, a3);
        xtensa_queue_exec_ins(xtensa, XT_INS_RSR(xtensa, XT_SR_DDR, XT_REG_A3));
 
        /* Queue instruction list and execute everything */
        LOG_TARGET_DEBUG(target, "execute stub: %s", CMD_ARGV[0]);
        xtensa_queue_exec_ins_wide(xtensa, ops, oplen); /* Handles endian-swap */
-       status = jtag_execute_queue();
+       status = xtensa_dm_queue_execute(&xtensa->dbg_mod);
        if (status != ERROR_OK)
                LOG_TARGET_ERROR(target, "TIE queue execute: %d\n", status);
        status = xtensa_core_status_check(target);
@@ -3346,8 +3348,9 @@ COMMAND_HELPER(xtensa_cmd_xtreg_do, struct xtensa *xtensa)
                        return ERROR_FAIL;
                }
                return ERROR_OK;
-       } else if (CMD_ARGC != 2)
+       } else if (CMD_ARGC != 2) {
                return ERROR_COMMAND_SYNTAX_ERROR;
+       }
 
        /* "xtregfmt contiguous" must be specified prior to the first "xtreg" definition
         * if general register (g-packet) requests or contiguous register maps are supported */
@@ -3471,7 +3474,7 @@ COMMAND_HELPER(xtensa_cmd_xtregfmt_do, struct xtensa *xtensa)
                                unsigned int numgregs = strtoul(CMD_ARGV[1], NULL, 0);
                                if ((numgregs <= 0) ||
                                        ((numgregs > xtensa->total_regs_num) &&
-                                               (xtensa->total_regs_num > 0))) {
+                                       (xtensa->total_regs_num > 0))) {
                                        LOG_ERROR("xtregfmt: if specified, numgregs (%d) must be <= numregs (%d)",
                                                numgregs, xtensa->total_regs_num);
                                        return ERROR_COMMAND_SYNTAX_ERROR;
index fd03f07f85375ff10dcf57eab806063e5d4158bb..4d98f3a36a1540cc16f452722d1f40bc487cf307 100644 (file)
@@ -273,24 +273,24 @@ static inline bool xtensa_data_addr_valid(struct target *target, uint32_t addr)
        return false;
 }
 
-static inline int xtensa_queue_dbg_reg_read(struct xtensa *xtensa, unsigned int reg, uint8_t *data)
+static inline int xtensa_queue_dbg_reg_read(struct xtensa *xtensa, enum xtensa_dm_reg reg, uint8_t *data)
 {
        struct xtensa_debug_module *dm = &xtensa->dbg_mod;
 
        if (!xtensa->core_config->trace.enabled &&
-               (reg <= NARADR_MEMADDREND || (reg >= NARADR_PMG && reg <= NARADR_PMSTAT7))) {
+               (reg <= XDMREG_MEMADDREND || (reg >= XDMREG_PMG && reg <= XDMREG_PMSTAT7))) {
                LOG_ERROR("Can not access %u reg when Trace Port option disabled!", reg);
                return ERROR_FAIL;
        }
        return dm->dbg_ops->queue_reg_read(dm, reg, data);
 }
 
-static inline int xtensa_queue_dbg_reg_write(struct xtensa *xtensa, unsigned int reg, uint32_t data)
+static inline int xtensa_queue_dbg_reg_write(struct xtensa *xtensa, enum xtensa_dm_reg reg, uint32_t data)
 {
        struct xtensa_debug_module *dm = &xtensa->dbg_mod;
 
        if (!xtensa->core_config->trace.enabled &&
-               (reg <= NARADR_MEMADDREND || (reg >= NARADR_PMG && reg <= NARADR_PMSTAT7))) {
+               (reg <= XDMREG_MEMADDREND || (reg >= XDMREG_PMG && reg <= XDMREG_PMSTAT7))) {
                LOG_ERROR("Can not access %u reg when Trace Port option disabled!", reg);
                return ERROR_FAIL;
        }
index a7de1ad5c9550a39b130a8f6b7cff0318c8b434e..7f8a75bc66b78e96cf234f126afaf61a38fbea80 100644 (file)
@@ -1,7 +1,8 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later */
 
 /***************************************************************************
- *   Generic Xtensa debug module API for OpenOCD                           *
+ *   Xtensa Debug Module (XDM) Support for OpenOCD                         *
+ *   Copyright (C) 2020-2022 Cadence Design Systems, Inc.                  *
  *   Copyright (C) 2019 Espressif Systems Ltd.                             *
  ***************************************************************************/
 
 #define TAPINS_IDCODE_LEN       32
 #define TAPINS_BYPASS_LEN       1
 
+/* Table of debug register offsets for Nexus and APB space */
+static const struct xtensa_dm_reg_offsets xdm_regs[XDMREG_NUM] =
+       XTENSA_DM_REG_OFFSETS;
 
 static void xtensa_dm_add_set_ir(struct xtensa_debug_module *dm, uint8_t value)
 {
        struct scan_field field;
-       uint8_t t[4] = { 0 };
+       uint8_t t[4] = { 0, 0, 0, 0 };
 
        memset(&field, 0, sizeof(field));
        field.num_bits = dm->tap->ir_length;
@@ -67,76 +71,65 @@ int xtensa_dm_init(struct xtensa_debug_module *dm, const struct xtensa_debug_mod
 
 int xtensa_dm_queue_enable(struct xtensa_debug_module *dm)
 {
-       return dm->dbg_ops->queue_reg_write(dm, NARADR_DCRSET, OCDDCR_ENABLEOCD);
+       return dm->dbg_ops->queue_reg_write(dm, XDMREG_DCRSET, OCDDCR_ENABLEOCD);
 }
 
-int xtensa_dm_queue_reg_read(struct xtensa_debug_module *dm, unsigned int reg, uint8_t *value)
+int xtensa_dm_queue_reg_read(struct xtensa_debug_module *dm, enum xtensa_dm_reg reg, uint8_t *value)
 {
-       uint8_t regdata = (reg << 1) | 0;
-       uint8_t dummy[4] = { 0, 0, 0, 0 };
-
-       if (reg > NARADR_MAX) {
+       if (reg >= XDMREG_NUM) {
                LOG_ERROR("Invalid DBG reg ID %d!", reg);
                return ERROR_FAIL;
        }
+       uint8_t regdata = (xdm_regs[reg].nar << 1) | 0;
+       uint8_t dummy[4] = { 0, 0, 0, 0 };
        xtensa_dm_add_set_ir(dm, TAPINS_NARSEL);
        xtensa_dm_add_dr_scan(dm, TAPINS_NARSEL_ADRLEN, &regdata, NULL, TAP_IDLE);
        xtensa_dm_add_dr_scan(dm, TAPINS_NARSEL_DATALEN, dummy, value, TAP_IDLE);
        return ERROR_OK;
 }
 
-int xtensa_dm_queue_reg_write(struct xtensa_debug_module *dm, unsigned int reg, uint32_t value)
+int xtensa_dm_queue_reg_write(struct xtensa_debug_module *dm, enum xtensa_dm_reg reg, uint32_t value)
 {
-       uint8_t regdata = (reg << 1) | 1;
-       uint8_t valdata[] = { value, value >> 8, value >> 16, value >> 24 };
-
-       if (reg > NARADR_MAX) {
+       if (reg >= XDMREG_NUM) {
                LOG_ERROR("Invalid DBG reg ID %d!", reg);
                return ERROR_FAIL;
        }
+       uint8_t regdata = (xdm_regs[reg].nar << 1) | 1;
+       uint8_t valdata[] = { value, value >> 8, value >> 16, value >> 24 };
        xtensa_dm_add_set_ir(dm, TAPINS_NARSEL);
        xtensa_dm_add_dr_scan(dm, TAPINS_NARSEL_ADRLEN, &regdata, NULL, TAP_IDLE);
        xtensa_dm_add_dr_scan(dm, TAPINS_NARSEL_DATALEN, valdata, NULL, TAP_IDLE);
        return ERROR_OK;
 }
 
-int xtensa_dm_queue_pwr_reg_read(struct xtensa_debug_module *dm, unsigned int reg, uint8_t *data, uint8_t clear)
+int xtensa_dm_queue_pwr_reg_read(struct xtensa_debug_module *dm,
+       enum xtensa_dm_pwr_reg reg,
+       uint8_t *data,
+       uint32_t clear)
 {
-       uint8_t value_clr = clear;
-       uint8_t tap_insn;
-       int tap_insn_sz;
-
-       if (reg == DMREG_PWRCTL) {
-               tap_insn = TAPINS_PWRCTL;
-               tap_insn_sz = TAPINS_PWRCTL_LEN;
-       } else if (reg == DMREG_PWRSTAT) {
-               tap_insn = TAPINS_PWRSTAT;
-               tap_insn_sz = TAPINS_PWRSTAT_LEN;
-       } else {
+       if (reg >= XDMREG_PWRNUM) {
                LOG_ERROR("Invalid PWR reg ID %d!", reg);
                return ERROR_FAIL;
        }
+       uint8_t value_clr = (uint8_t)clear;
+       uint8_t tap_insn = (reg == XDMREG_PWRCTL) ? TAPINS_PWRCTL : TAPINS_PWRSTAT;
+       int tap_insn_sz = (reg == XDMREG_PWRCTL) ? TAPINS_PWRCTL_LEN : TAPINS_PWRSTAT_LEN;
        xtensa_dm_add_set_ir(dm, tap_insn);
        xtensa_dm_add_dr_scan(dm, tap_insn_sz, &value_clr, data, TAP_IDLE);
        return ERROR_OK;
 }
 
-int xtensa_dm_queue_pwr_reg_write(struct xtensa_debug_module *dm, unsigned int reg, uint8_t data)
+int xtensa_dm_queue_pwr_reg_write(struct xtensa_debug_module *dm,
+       enum xtensa_dm_pwr_reg reg,
+       uint32_t data)
 {
-       uint8_t value = data;
-       uint8_t tap_insn;
-       int tap_insn_sz;
-
-       if (reg == DMREG_PWRCTL) {
-               tap_insn = TAPINS_PWRCTL;
-               tap_insn_sz = TAPINS_PWRCTL_LEN;
-       } else if (reg == DMREG_PWRSTAT) {
-               tap_insn = TAPINS_PWRSTAT;
-               tap_insn_sz = TAPINS_PWRSTAT_LEN;
-       } else {
+       if (reg >= XDMREG_PWRNUM) {
                LOG_ERROR("Invalid PWR reg ID %d!", reg);
                return ERROR_FAIL;
        }
+       uint8_t tap_insn = (reg == XDMREG_PWRCTL) ? TAPINS_PWRCTL : TAPINS_PWRSTAT;
+       int tap_insn_sz = (reg == XDMREG_PWRCTL) ? TAPINS_PWRCTL_LEN : TAPINS_PWRSTAT_LEN;
+       uint8_t value = (uint8_t)data;
        xtensa_dm_add_set_ir(dm, tap_insn);
        xtensa_dm_add_dr_scan(dm, tap_insn_sz, &value, NULL, TAP_IDLE);
        return ERROR_OK;
@@ -146,9 +139,9 @@ int xtensa_dm_device_id_read(struct xtensa_debug_module *dm)
 {
        uint8_t id_buf[sizeof(uint32_t)];
 
-       dm->dbg_ops->queue_reg_read(dm, NARADR_OCDID, id_buf);
+       dm->dbg_ops->queue_reg_read(dm, XDMREG_OCDID, id_buf);
        xtensa_dm_queue_tdi_idle(dm);
-       int res = jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(dm);
        if (res != ERROR_OK)
                return res;
        dm->device_id = buf_get_u32(id_buf, 0, 32);
@@ -157,16 +150,22 @@ int xtensa_dm_device_id_read(struct xtensa_debug_module *dm)
 
 int xtensa_dm_power_status_read(struct xtensa_debug_module *dm, uint32_t clear)
 {
-       /* uint8_t id_buf[sizeof(uint32_t)]; */
+       uint8_t stat_buf[sizeof(uint32_t)];
+       uint8_t stath_buf[sizeof(uint32_t)];
 
        /* TODO: JTAG does not work when PWRCTL_JTAGDEBUGUSE is not set.
-        * It is set in xtensa_examine(), need to move reading of NARADR_OCDID out of this function */
-       /* dm->dbg_ops->queue_reg_read(dm, NARADR_OCDID, id_buf);
+        * It is set in xtensa_examine(), need to move reading of XDMREG_OCDID out of this function */
+       /* dm->dbg_ops->queue_reg_read(dm, XDMREG_OCDID, id_buf);
         *Read reset state */
-       dm->pwr_ops->queue_reg_read(dm, DMREG_PWRSTAT, &dm->power_status.stat, clear);
-       dm->pwr_ops->queue_reg_read(dm, DMREG_PWRSTAT, &dm->power_status.stath, clear);
+       dm->pwr_ops->queue_reg_read(dm, XDMREG_PWRSTAT, stat_buf, clear);
+       dm->pwr_ops->queue_reg_read(dm, XDMREG_PWRSTAT, stath_buf, clear);
        xtensa_dm_queue_tdi_idle(dm);
-       return jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(dm);
+       if (res != ERROR_OK)
+               return res;
+       dm->power_status.stat = buf_get_u32(stat_buf, 0, 32);
+       dm->power_status.stath = buf_get_u32(stath_buf, 0, 32);
+       return res;
 }
 
 int xtensa_dm_core_status_read(struct xtensa_debug_module *dm)
@@ -174,9 +173,9 @@ int xtensa_dm_core_status_read(struct xtensa_debug_module *dm)
        uint8_t dsr_buf[sizeof(uint32_t)];
 
        xtensa_dm_queue_enable(dm);
-       dm->dbg_ops->queue_reg_read(dm, NARADR_DSR, dsr_buf);
+       dm->dbg_ops->queue_reg_read(dm, XDMREG_DSR, dsr_buf);
        xtensa_dm_queue_tdi_idle(dm);
-       int res = jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(dm);
        if (res != ERROR_OK)
                return res;
        dm->core_status.dsr = buf_get_u32(dsr_buf, 0, 32);
@@ -185,37 +184,37 @@ int xtensa_dm_core_status_read(struct xtensa_debug_module *dm)
 
 int xtensa_dm_core_status_clear(struct xtensa_debug_module *dm, xtensa_dsr_t bits)
 {
-       dm->dbg_ops->queue_reg_write(dm, NARADR_DSR, bits);
+       dm->dbg_ops->queue_reg_write(dm, XDMREG_DSR, bits);
        xtensa_dm_queue_tdi_idle(dm);
-       return jtag_execute_queue();
+       return xtensa_dm_queue_execute(dm);
 }
 
 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. */
-       dm->dbg_ops->queue_reg_write(dm, NARADR_TRAXCTRL, 0);
+       dm->dbg_ops->queue_reg_write(dm, XDMREG_TRAXCTRL, 0);
        xtensa_dm_queue_tdi_idle(dm);
-       int res = jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(dm);
        if (res != ERROR_OK)
                return res;
 
        /*Set up parameters */
-       dm->dbg_ops->queue_reg_write(dm, NARADR_TRAXADDR, 0);
+       dm->dbg_ops->queue_reg_write(dm, XDMREG_TRAXADDR, 0);
        if (cfg->stopmask != XTENSA_STOPMASK_DISABLED) {
-               dm->dbg_ops->queue_reg_write(dm, NARADR_PCMATCHCTRL,
+               dm->dbg_ops->queue_reg_write(dm, XDMREG_PCMATCHCTRL,
                        (cfg->stopmask << PCMATCHCTRL_PCML_SHIFT));
-               dm->dbg_ops->queue_reg_write(dm, NARADR_TRIGGERPC, cfg->stoppc);
+               dm->dbg_ops->queue_reg_write(dm, XDMREG_TRIGGERPC, cfg->stoppc);
        }
-       dm->dbg_ops->queue_reg_write(dm, NARADR_DELAYCNT, cfg->after);
+       dm->dbg_ops->queue_reg_write(dm, XDMREG_DELAYCNT, cfg->after);
        /*Options are mostly hardcoded for now. ToDo: make this more configurable. */
        dm->dbg_ops->queue_reg_write(
                dm,
-               NARADR_TRAXCTRL,
+               XDMREG_TRAXCTRL,
                TRAXCTRL_TREN |
                ((cfg->stopmask != XTENSA_STOPMASK_DISABLED) ? TRAXCTRL_PCMEN : 0) | TRAXCTRL_TMEN |
                (cfg->after_is_words ? 0 : TRAXCTRL_CNTU) | (0 << TRAXCTRL_SMPER_SHIFT) | TRAXCTRL_PTOWS);
        xtensa_dm_queue_tdi_idle(dm);
-       return jtag_execute_queue();
+       return xtensa_dm_queue_execute(dm);
 }
 
 int xtensa_dm_trace_stop(struct xtensa_debug_module *dm, bool pto_enable)
@@ -224,9 +223,9 @@ int xtensa_dm_trace_stop(struct xtensa_debug_module *dm, bool pto_enable)
        uint32_t traxctl;
        struct xtensa_trace_status trace_status;
 
-       dm->dbg_ops->queue_reg_read(dm, NARADR_TRAXCTRL, traxctl_buf);
+       dm->dbg_ops->queue_reg_read(dm, XDMREG_TRAXCTRL, traxctl_buf);
        xtensa_dm_queue_tdi_idle(dm);
-       int res = jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(dm);
        if (res != ERROR_OK)
                return res;
        traxctl = buf_get_u32(traxctl_buf, 0, 32);
@@ -234,9 +233,9 @@ int xtensa_dm_trace_stop(struct xtensa_debug_module *dm, bool pto_enable)
        if (!pto_enable)
                traxctl &= ~(TRAXCTRL_PTOWS | TRAXCTRL_PTOWT);
 
-       dm->dbg_ops->queue_reg_write(dm, NARADR_TRAXCTRL, traxctl | TRAXCTRL_TRSTP);
+       dm->dbg_ops->queue_reg_write(dm, XDMREG_TRAXCTRL, traxctl | TRAXCTRL_TRSTP);
        xtensa_dm_queue_tdi_idle(dm);
-       res = jtag_execute_queue();
+       res = xtensa_dm_queue_execute(dm);
        if (res != ERROR_OK)
                return res;
 
@@ -256,9 +255,9 @@ int xtensa_dm_trace_status_read(struct xtensa_debug_module *dm, struct xtensa_tr
 {
        uint8_t traxstat_buf[sizeof(uint32_t)];
 
-       dm->dbg_ops->queue_reg_read(dm, NARADR_TRAXSTAT, traxstat_buf);
+       dm->dbg_ops->queue_reg_read(dm, XDMREG_TRAXSTAT, traxstat_buf);
        xtensa_dm_queue_tdi_idle(dm);
-       int res = jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(dm);
        if (res == ERROR_OK && status)
                status->stat = buf_get_u32(traxstat_buf, 0, 32);
        return res;
@@ -274,12 +273,12 @@ int xtensa_dm_trace_config_read(struct xtensa_debug_module *dm, struct xtensa_tr
        if (!config)
                return ERROR_FAIL;
 
-       dm->dbg_ops->queue_reg_read(dm, NARADR_TRAXCTRL, traxctl_buf);
-       dm->dbg_ops->queue_reg_read(dm, NARADR_MEMADDRSTART, memadrstart_buf);
-       dm->dbg_ops->queue_reg_read(dm, NARADR_MEMADDREND, memadrend_buf);
-       dm->dbg_ops->queue_reg_read(dm, NARADR_TRAXADDR, adr_buf);
+       dm->dbg_ops->queue_reg_read(dm, XDMREG_TRAXCTRL, traxctl_buf);
+       dm->dbg_ops->queue_reg_read(dm, XDMREG_MEMADDRSTART, memadrstart_buf);
+       dm->dbg_ops->queue_reg_read(dm, XDMREG_MEMADDREND, memadrend_buf);
+       dm->dbg_ops->queue_reg_read(dm, XDMREG_TRAXADDR, adr_buf);
        xtensa_dm_queue_tdi_idle(dm);
-       int res = jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(dm);
        if (res == ERROR_OK) {
                config->ctrl = buf_get_u32(traxctl_buf, 0, 32);
                config->memaddr_start = buf_get_u32(memadrstart_buf, 0, 32);
@@ -295,9 +294,9 @@ int xtensa_dm_trace_data_read(struct xtensa_debug_module *dm, uint8_t *dest, uin
                return ERROR_FAIL;
 
        for (unsigned int i = 0; i < size / 4; i++)
-               dm->dbg_ops->queue_reg_read(dm, NARADR_TRAXDATA, &dest[i * 4]);
+               dm->dbg_ops->queue_reg_read(dm, XDMREG_TRAXDATA, &dest[i * 4]);
        xtensa_dm_queue_tdi_idle(dm);
-       return jtag_execute_queue();
+       return xtensa_dm_queue_execute(dm);
 }
 
 int xtensa_dm_perfmon_enable(struct xtensa_debug_module *dm, int counter_id,
@@ -313,13 +312,13 @@ int xtensa_dm_perfmon_enable(struct xtensa_debug_module *dm, int counter_id,
                (config->kernelcnt << 3);
 
        /* enable performance monitor */
-       dm->dbg_ops->queue_reg_write(dm, NARADR_PMG, 0x1);
+       dm->dbg_ops->queue_reg_write(dm, XDMREG_PMG, 0x1);
        /* reset counter */
-       dm->dbg_ops->queue_reg_write(dm, NARADR_PM0 + counter_id, 0);
-       dm->dbg_ops->queue_reg_write(dm, NARADR_PMCTRL0 + counter_id, pmctrl);
-       dm->dbg_ops->queue_reg_read(dm, NARADR_PMSTAT0 + counter_id, pmstat_buf);
+       dm->dbg_ops->queue_reg_write(dm, XDMREG_PM0 + counter_id, 0);
+       dm->dbg_ops->queue_reg_write(dm, XDMREG_PMCTRL0 + counter_id, pmctrl);
+       dm->dbg_ops->queue_reg_read(dm, XDMREG_PMSTAT0 + counter_id, pmstat_buf);
        xtensa_dm_queue_tdi_idle(dm);
-       return jtag_execute_queue();
+       return xtensa_dm_queue_execute(dm);
 }
 
 int xtensa_dm_perfmon_dump(struct xtensa_debug_module *dm, int counter_id,
@@ -328,10 +327,10 @@ int xtensa_dm_perfmon_dump(struct xtensa_debug_module *dm, int counter_id,
        uint8_t pmstat_buf[4];
        uint8_t pmcount_buf[4];
 
-       dm->dbg_ops->queue_reg_read(dm, NARADR_PMSTAT0 + counter_id, pmstat_buf);
-       dm->dbg_ops->queue_reg_read(dm, NARADR_PM0 + counter_id, pmcount_buf);
+       dm->dbg_ops->queue_reg_read(dm, XDMREG_PMSTAT0 + counter_id, pmstat_buf);
+       dm->dbg_ops->queue_reg_read(dm, XDMREG_PM0 + counter_id, pmcount_buf);
        xtensa_dm_queue_tdi_idle(dm);
-       int res = jtag_execute_queue();
+       int res = xtensa_dm_queue_execute(dm);
        if (res == ERROR_OK) {
                uint32_t stat = buf_get_u32(pmstat_buf, 0, 32);
                uint64_t result = buf_get_u32(pmcount_buf, 0, 32);
index 189a6c97a8e3f6514d3e05a98225944c1751af20..b4bb88682371b76faddb9ecf4c57099222ce0992 100644 (file)
@@ -1,7 +1,8 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later */
 
 /***************************************************************************
- *   Xtensa debug module API                                               *
+ *   Xtensa Debug Module (XDM) Support for OpenOCD                         *
+ *   Copyright (C) 2020-2022 Cadence Design Systems, Inc.                  *
  *   Copyright (C) 2019 Espressif Systems Ltd.                             *
  *   Derived from original ESP8266 target.                                 *
  *   Author: Angus Gratton gus@projectgus.com                              *
 #include <target/target.h>
 
 /* Virtual IDs for using with xtensa_power_ops API */
-#define DMREG_PWRCTL       0x00
-#define DMREG_PWRSTAT      0x01
+enum xtensa_dm_pwr_reg {
+       XDMREG_PWRCTL = 0x00,
+       XDMREG_PWRSTAT,
+       XDMREG_PWRNUM
+};
+
+/* Debug Module Power Register offsets within APB */
+struct xtensa_dm_pwr_reg_offsets {
+       uint16_t apb;
+};
+
+/* Debug Module Power Register offset structure; must include XDMREG_PWRNUM entries */
+#define XTENSA_DM_PWR_REG_OFFSETS      {                               \
+       /* Power/Reset Registers */                                             \
+       { .apb = 0x3020 },              /* XDMREG_PWRCTL */             \
+       { .apb = 0x3024 },              /* XDMREG_PWRSTAT */    \
+}
 
 /*
  From the manual:
 #define PWRSTAT_DEBUGDOMAINON   BIT(2)
 #define PWRSTAT_MEMDOMAINON     BIT(1)
 #define PWRSTAT_COREDOMAINON    BIT(0)
+/* Virtual IDs for using with xtensa_debug_ops API */
+enum xtensa_dm_reg {
+       /* TRAX Registers */
+       XDMREG_TRAXID = 0x00,
+       XDMREG_TRAXCTRL,
+       XDMREG_TRAXSTAT,
+       XDMREG_TRAXDATA,
+       XDMREG_TRAXADDR,
+       XDMREG_TRIGGERPC,
+       XDMREG_PCMATCHCTRL,
+       XDMREG_DELAYCNT,
+       XDMREG_MEMADDRSTART,
+       XDMREG_MEMADDREND,
+
+       /* Performance Monitor Registers */
+       XDMREG_PMG,
+       XDMREG_INTPC,
+       XDMREG_PM0,
+       XDMREG_PM1,
+       XDMREG_PM2,
+       XDMREG_PM3,
+       XDMREG_PM4,
+       XDMREG_PM5,
+       XDMREG_PM6,
+       XDMREG_PM7,
+       XDMREG_PMCTRL0,
+       XDMREG_PMCTRL1,
+       XDMREG_PMCTRL2,
+       XDMREG_PMCTRL3,
+       XDMREG_PMCTRL4,
+       XDMREG_PMCTRL5,
+       XDMREG_PMCTRL6,
+       XDMREG_PMCTRL7,
+       XDMREG_PMSTAT0,
+       XDMREG_PMSTAT1,
+       XDMREG_PMSTAT2,
+       XDMREG_PMSTAT3,
+       XDMREG_PMSTAT4,
+       XDMREG_PMSTAT5,
+       XDMREG_PMSTAT6,
+       XDMREG_PMSTAT7,
+
+       /* OCD Registers */
+       XDMREG_OCDID,
+       XDMREG_DCRCLR,
+       XDMREG_DCRSET,
+       XDMREG_DSR,
+       XDMREG_DDR,
+       XDMREG_DDREXEC,
+       XDMREG_DIR0EXEC,
+       XDMREG_DIR0,
+       XDMREG_DIR1,
+       XDMREG_DIR2,
+       XDMREG_DIR3,
+       XDMREG_DIR4,
+       XDMREG_DIR5,
+       XDMREG_DIR6,
+       XDMREG_DIR7,
+
+       /* Misc Registers */
+       XDMREG_ERISTAT,
+
+       /* CoreSight Registers */
+       XDMREG_ITCTRL,
+       XDMREG_CLAIMSET,
+       XDMREG_CLAIMCLR,
+       XDMREG_LOCKACCESS,
+       XDMREG_LOCKSTATUS,
+       XDMREG_AUTHSTATUS,
+       XDMREG_DEVID,
+       XDMREG_DEVTYPE,
+       XDMREG_PERID4,
+       XDMREG_PERID5,
+       XDMREG_PERID6,
+       XDMREG_PERID7,
+       XDMREG_PERID0,
+       XDMREG_PERID1,
+       XDMREG_PERID2,
+       XDMREG_PERID3,
+       XDMREG_COMPID0,
+       XDMREG_COMPID1,
+       XDMREG_COMPID2,
+       XDMREG_COMPID3,
+
+       XDMREG_NUM
+};
 
-/* *** NAR addresses (also used as IDs for debug registers in xtensa_debug_ops API) ***
- *TRAX registers */
-#define NARADR_TRAXID       0x00
-#define NARADR_TRAXCTRL     0x01
-#define NARADR_TRAXSTAT     0x02
-#define NARADR_TRAXDATA     0x03
-#define NARADR_TRAXADDR     0x04
-#define NARADR_TRIGGERPC    0x05
-#define NARADR_PCMATCHCTRL  0x06
-#define NARADR_DELAYCNT     0x07
-#define NARADR_MEMADDRSTART 0x08
-#define NARADR_MEMADDREND   0x09
-/*Performance monitor registers */
-#define NARADR_PMG          0x20
-#define NARADR_INTPC        0x24
-#define NARADR_PM0          0x28
-/*... */
-#define NARADR_PM7          0x2F
-#define NARADR_PMCTRL0      0x30
-/*... */
-#define NARADR_PMCTRL7      0x37
-#define NARADR_PMSTAT0      0x38
-/*... */
-#define NARADR_PMSTAT7      0x3F
-/*OCD registers */
-#define NARADR_OCDID        0x40
-#define NARADR_DCRCLR       0x42
-#define NARADR_DCRSET       0x43
-#define NARADR_DSR          0x44
-#define NARADR_DDR          0x45
-#define NARADR_DDREXEC      0x46
-#define NARADR_DIR0EXEC     0x47
-#define NARADR_DIR0         0x48
-#define NARADR_DIR1         0x49
-/*... */
-#define NARADR_DIR7         0x4F
-/*Misc registers */
-#define NARADR_PWRCTL       0x58
-#define NARADR_PWRSTAT      0x59
-#define NARADR_ERISTAT      0x5A
-/*CoreSight registers */
-#define NARADR_ITCTRL       0x60
-#define NARADR_CLAIMSET     0x68
-#define NARADR_CLAIMCLR     0x69
-#define NARADR_LOCKACCESS   0x6c
-#define NARADR_LOCKSTATUS   0x6d
-#define NARADR_AUTHSTATUS   0x6e
-#define NARADR_DEVID        0x72
-#define NARADR_DEVTYPE      0x73
-#define NARADR_PERID4       0x74
-/*... */
-#define NARADR_PERID7       0x77
-#define NARADR_PERID0       0x78
-/*... */
-#define NARADR_PERID3       0x7b
-#define NARADR_COMPID0      0x7c
-/*... */
-#define NARADR_COMPID3      0x7f
-#define NARADR_MAX          NARADR_COMPID3
-
-/*OCD registers, bit definitions */
+/* Debug Module Register offsets within Nexus (NAR) or APB */
+struct xtensa_dm_reg_offsets {
+       uint8_t  nar;
+       uint16_t apb;
+};
+
+/* Debug Module Register offset structure; must include XDMREG_NUM entries */
+#define XTENSA_DM_REG_OFFSETS  {                                                               \
+       /* TRAX Registers */                                                                            \
+       { .nar = 0x00, .apb = 0x0000 }, /* XDMREG_TRAXID */                     \
+       { .nar = 0x01, .apb = 0x0004 }, /* XDMREG_TRAXCTRL */           \
+       { .nar = 0x02, .apb = 0x0008 }, /* XDMREG_TRAXSTAT */           \
+       { .nar = 0x03, .apb = 0x000c }, /* XDMREG_TRAXDATA */           \
+       { .nar = 0x04, .apb = 0x0010 }, /* XDMREG_TRAXADDR */           \
+       { .nar = 0x05, .apb = 0x0014 }, /* XDMREG_TRIGGERPC */          \
+       { .nar = 0x06, .apb = 0x0018 }, /* XDMREG_PCMATCHCTRL */        \
+       { .nar = 0x07, .apb = 0x001c }, /* XDMREG_DELAYCNT */           \
+       { .nar = 0x08, .apb = 0x0020 }, /* XDMREG_MEMADDRSTART */       \
+       { .nar = 0x09, .apb = 0x0024 }, /* XDMREG_MEMADDREND */         \
+                                                                                                                               \
+       /* Performance Monitor Registers */                                                     \
+       { .nar = 0x20, .apb = 0x1000 }, /* XDMREG_PMG */                        \
+       { .nar = 0x24, .apb = 0x1010 }, /* XDMREG_INTPC */                      \
+       { .nar = 0x28, .apb = 0x1080 }, /* XDMREG_PM0 */                        \
+       { .nar = 0x29, .apb = 0x1084 }, /* XDMREG_PM1 */                        \
+       { .nar = 0x2a, .apb = 0x1088 }, /* XDMREG_PM2 */                        \
+       { .nar = 0x2b, .apb = 0x108c }, /* XDMREG_PM3 */                        \
+       { .nar = 0x2c, .apb = 0x1090 }, /* XDMREG_PM4 */                        \
+       { .nar = 0x2d, .apb = 0x1094 }, /* XDMREG_PM5 */                        \
+       { .nar = 0x2e, .apb = 0x1098 }, /* XDMREG_PM6 */                        \
+       { .nar = 0x2f, .apb = 0x109c }, /* XDMREG_PM7 */                        \
+       { .nar = 0x30, .apb = 0x1100 }, /* XDMREG_PMCTRL0 */            \
+       { .nar = 0x31, .apb = 0x1104 }, /* XDMREG_PMCTRL1 */            \
+       { .nar = 0x32, .apb = 0x1108 }, /* XDMREG_PMCTRL2 */            \
+       { .nar = 0x33, .apb = 0x110c }, /* XDMREG_PMCTRL3 */            \
+       { .nar = 0x34, .apb = 0x1110 }, /* XDMREG_PMCTRL4 */            \
+       { .nar = 0x35, .apb = 0x1114 }, /* XDMREG_PMCTRL5 */            \
+       { .nar = 0x36, .apb = 0x1118 }, /* XDMREG_PMCTRL6 */            \
+       { .nar = 0x37, .apb = 0x111c }, /* XDMREG_PMCTRL7 */            \
+       { .nar = 0x38, .apb = 0x1180 }, /* XDMREG_PMSTAT0 */            \
+       { .nar = 0x39, .apb = 0x1184 }, /* XDMREG_PMSTAT1 */            \
+       { .nar = 0x3a, .apb = 0x1188 }, /* XDMREG_PMSTAT2 */            \
+       { .nar = 0x3b, .apb = 0x118c }, /* XDMREG_PMSTAT3 */            \
+       { .nar = 0x3c, .apb = 0x1190 }, /* XDMREG_PMSTAT4 */            \
+       { .nar = 0x3d, .apb = 0x1194 }, /* XDMREG_PMSTAT5 */            \
+       { .nar = 0x3e, .apb = 0x1198 }, /* XDMREG_PMSTAT6 */            \
+       { .nar = 0x3f, .apb = 0x119c }, /* XDMREG_PMSTAT7 */            \
+                                                                                                                               \
+       /* OCD Registers */                                                                                     \
+       { .nar = 0x40, .apb = 0x2000 }, /* XDMREG_OCDID */                      \
+       { .nar = 0x42, .apb = 0x2008 }, /* XDMREG_DCRCLR */                     \
+       { .nar = 0x43, .apb = 0x200c }, /* XDMREG_DCRSET */                     \
+       { .nar = 0x44, .apb = 0x2010 }, /* XDMREG_DSR */                        \
+       { .nar = 0x45, .apb = 0x2014 }, /* XDMREG_DDR */                        \
+       { .nar = 0x46, .apb = 0x2018 }, /* XDMREG_DDREXEC */            \
+       { .nar = 0x47, .apb = 0x201c }, /* XDMREG_DIR0EXEC */           \
+       { .nar = 0x48, .apb = 0x2020 }, /* XDMREG_DIR0 */                       \
+       { .nar = 0x49, .apb = 0x2024 }, /* XDMREG_DIR1 */                       \
+       { .nar = 0x4a, .apb = 0x2028 }, /* XDMREG_DIR2 */                       \
+       { .nar = 0x4b, .apb = 0x202c }, /* XDMREG_DIR3 */                       \
+       { .nar = 0x4c, .apb = 0x2030 }, /* XDMREG_DIR4 */                       \
+       { .nar = 0x4d, .apb = 0x2034 }, /* XDMREG_DIR5 */                       \
+       { .nar = 0x4e, .apb = 0x2038 }, /* XDMREG_DIR6 */                       \
+       { .nar = 0x4f, .apb = 0x203c }, /* XDMREG_DIR7 */                       \
+                                                                                                                               \
+       /* Misc Registers */                                                                            \
+       { .nar = 0x5a, .apb = 0x3028 }, /* XDMREG_ERISTAT */            \
+                                                                                                                               \
+       /* CoreSight Registers */                                                                       \
+       { .nar = 0x60, .apb = 0x3f00 }, /* XDMREG_ITCTRL */                     \
+       { .nar = 0x68, .apb = 0x3fa0 }, /* XDMREG_CLAIMSET */           \
+       { .nar = 0x69, .apb = 0x3fa4 }, /* XDMREG_CLAIMCLR */           \
+       { .nar = 0x6c, .apb = 0x3fb0 }, /* XDMREG_LOCKACCESS */         \
+       { .nar = 0x6d, .apb = 0x3fb4 }, /* XDMREG_LOCKSTATUS */         \
+       { .nar = 0x6e, .apb = 0x3fb8 }, /* XDMREG_AUTHSTATUS */         \
+       { .nar = 0x72, .apb = 0x3fc8 }, /* XDMREG_DEVID */                      \
+       { .nar = 0x73, .apb = 0x3fcc }, /* XDMREG_DEVTYPE */            \
+       { .nar = 0x74, .apb = 0x3fd0 }, /* XDMREG_PERID4 */                     \
+       { .nar = 0x75, .apb = 0x3fd4 }, /* XDMREG_PERID5 */                     \
+       { .nar = 0x76, .apb = 0x3fd8 }, /* XDMREG_PERID6 */                     \
+       { .nar = 0x77, .apb = 0x3fdc }, /* XDMREG_PERID7 */                     \
+       { .nar = 0x78, .apb = 0x3fe0 }, /* XDMREG_PERID0 */                     \
+       { .nar = 0x79, .apb = 0x3fe4 }, /* XDMREG_PERID1 */                     \
+       { .nar = 0x7a, .apb = 0x3fe8 }, /* XDMREG_PERID2 */                     \
+       { .nar = 0x7b, .apb = 0x3fec }, /* XDMREG_PERID3 */                     \
+       { .nar = 0x7c, .apb = 0x3ff0 }, /* XDMREG_COMPID0 */            \
+       { .nar = 0x7d, .apb = 0x3ff4 }, /* XDMREG_COMPID1 */            \
+       { .nar = 0x7e, .apb = 0x3ff8 }, /* XDMREG_COMPID2 */            \
+       { .nar = 0x7f, .apb = 0x3ffc }, /* XDMREG_COMPID3 */            \
+}
+
+#define XTENSA_DM_APB_MASK          (0x3fff)
+
+/* OCD registers, bit definitions */
 #define OCDDCR_ENABLEOCD            BIT(0)
 #define OCDDCR_DEBUGINTERRUPT       BIT(1)
 #define OCDDCR_INTERRUPTALLCONDS    BIT(2)
 #define TRAXCTRL_CTIEN              BIT(5)     /* Cross-trigger enable */
 #define TRAXCTRL_TMEN               BIT(7)     /* Tracemem Enable. Always set. */
 #define TRAXCTRL_CNTU               BIT(9)     /* Post-stop-trigger countdown units; selects when DelayCount-- happens.
-                                                *0 - every 32-bit word written to tracemem, 1 - every cpu instruction */
+                                                                                        * 0 - every 32-bit word written to tracemem, 1 - every cpu instruction */
 #define TRAXCTRL_TSEN               BIT(11)    /* Undocumented/deprecated? */
 #define TRAXCTRL_SMPER_SHIFT        12         /* Send sync every 2^(9-smper) messages. 7=reserved, 0=no sync msg */
 #define TRAXCTRL_SMPER_MASK         0x07       /* Synchronization message period */
 #define PCMATCHCTRL_PCML_SHIFT      0          /* Amount of lower bits to ignore in pc trigger register */
 #define PCMATCHCTRL_PCML_MASK       0x1F
 #define PCMATCHCTRL_PCMS            BIT(31)    /* PC Match Sense, 0-match when procs PC is in-range, 1-match when
-                                                *out-of-range */
+                                                                                        * out-of-range */
 
 #define XTENSA_MAX_PERF_COUNTERS    2
 #define XTENSA_MAX_PERF_SELECT      32
@@ -202,20 +337,24 @@ struct xtensa_debug_ops {
        /** enable operation */
        int (*queue_enable)(struct xtensa_debug_module *dm);
        /** register read. */
-       int (*queue_reg_read)(struct xtensa_debug_module *dm, unsigned int reg, uint8_t *data);
+       int (*queue_reg_read)(struct xtensa_debug_module *dm, enum xtensa_dm_reg reg, uint8_t *data);
        /** register write. */
-       int (*queue_reg_write)(struct xtensa_debug_module *dm, unsigned int reg, uint32_t data);
+       int (*queue_reg_write)(struct xtensa_debug_module *dm, enum xtensa_dm_reg reg, uint32_t data);
 };
 
+/* Xtensa power registers are 8 bits wide on JTAG interfaces but 32 bits wide
+ * when accessed via APB/DAP.  In order to use DAP queuing APIs (for optimal
+ * performance), the XDM power register APIs take 32-bit register params.
+ */
 struct xtensa_power_ops {
        /** register read. */
-       int (*queue_reg_read)(struct xtensa_debug_module *dm, unsigned int reg, uint8_t *data,
-               uint8_t clear);
+       int (*queue_reg_read)(struct xtensa_debug_module *dm, enum xtensa_dm_pwr_reg reg, uint8_t *data,
+               uint32_t clear);
        /** register write. */
-       int (*queue_reg_write)(struct xtensa_debug_module *dm, unsigned int reg, uint8_t data);
+       int (*queue_reg_write)(struct xtensa_debug_module *dm, enum xtensa_dm_pwr_reg reg, uint32_t data);
 };
 
-typedef uint8_t xtensa_pwrstat_t;
+typedef uint32_t xtensa_pwrstat_t;
 typedef uint32_t xtensa_ocdid_t;
 typedef uint32_t xtensa_dsr_t;
 typedef uint32_t xtensa_traxstat_t;
@@ -288,10 +427,20 @@ struct xtensa_debug_module {
 
 int xtensa_dm_init(struct xtensa_debug_module *dm, const struct xtensa_debug_module_config *cfg);
 int xtensa_dm_queue_enable(struct xtensa_debug_module *dm);
-int xtensa_dm_queue_reg_read(struct xtensa_debug_module *dm, unsigned int reg, uint8_t *value);
-int xtensa_dm_queue_reg_write(struct xtensa_debug_module *dm, unsigned int reg, uint32_t value);
-int xtensa_dm_queue_pwr_reg_read(struct xtensa_debug_module *dm, unsigned int reg, uint8_t *data, uint8_t clear);
-int xtensa_dm_queue_pwr_reg_write(struct xtensa_debug_module *dm, unsigned int reg, uint8_t data);
+int xtensa_dm_queue_reg_read(struct xtensa_debug_module *dm, enum xtensa_dm_reg reg, uint8_t *value);
+int xtensa_dm_queue_reg_write(struct xtensa_debug_module *dm, enum xtensa_dm_reg reg, uint32_t value);
+int xtensa_dm_queue_pwr_reg_read(struct xtensa_debug_module *dm,
+       enum xtensa_dm_pwr_reg reg,
+       uint8_t *data,
+       uint32_t clear);
+int xtensa_dm_queue_pwr_reg_write(struct xtensa_debug_module *dm,
+       enum xtensa_dm_pwr_reg reg,
+       uint32_t data);
+
+static inline int xtensa_dm_queue_execute(struct xtensa_debug_module *dm)
+{
+       return jtag_execute_queue();
+}
 
 static inline void xtensa_dm_queue_tdi_idle(struct xtensa_debug_module *dm)
 {
@@ -338,7 +487,7 @@ static inline bool xtensa_dm_is_online(struct xtensa_debug_module *dm)
        int res = xtensa_dm_device_id_read(dm);
        if (res != ERROR_OK)
                return false;
-       return (dm->device_id != 0xffffffff && dm->device_id != 0);
+       return dm->device_id != 0xffffffff && dm->device_id != 0;
 }
 
 static inline bool xtensa_dm_tap_was_reset(struct xtensa_debug_module *dm)

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)