Fix "unused variable" warnings (errors) detected with GCC 4.7.0 - trivial fixes
[fw/openocd] / src / target / arm_adi_v5.c
index b4f49e75fbe6e86eb0909d5a59e9e38dc9c010ab..f8a2e2278fc33c000e8ce798f04e4846a1dfe769 100644 (file)
@@ -5,7 +5,7 @@
  *   Copyright (C) 2008 by Spencer Oliver                                  *
  *   spen@spen-soft.co.uk                                                  *
  *                                                                         *
- *   Copyright (C) 2009 by Oyvind Harboe                                   *
+ *   Copyright (C) 2009-2010 by Oyvind Harboe                              *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   Copyright (C) 2009-2010 by David Brownell                             *
@@ -100,13 +100,13 @@ static uint32_t max_tar_block_size(uint32_t tar_autoincr_block, uint32_t address
  * @param apsel Number of the AP to (implicitly) use with further
  *     transactions.  This normally identifies a MEM-AP.
  */
-void dap_ap_select(struct adiv5_dap *dap,uint8_t apsel)
+void dap_ap_select(struct adiv5_dap *dap,uint8_t ap)
 {
-       uint32_t select_apsel = (apsel << 24) & 0xFF000000;
+       uint32_t new_ap = (ap << 24) & 0xFF000000;
 
-       if (select_apsel != dap->apsel)
+       if (new_ap != dap->ap_current)
        {
-               dap->apsel = select_apsel;
+               dap->ap_current = new_ap;
                /* Switching AP invalidates cached values.
                 * Values MUST BE UPDATED BEFORE AP ACCESS.
                 */
@@ -270,11 +270,11 @@ int mem_ap_write_atomic_u32(struct adiv5_dap *dap, uint32_t address,
 * Write a buffer in target order (little endian)                             *
 *                                                                            *
 *****************************************************************************/
-int mem_ap_write_buf_u32(struct adiv5_dap *dap, uint8_t *buffer, int count, uint32_t address)
+int mem_ap_write_buf_u32(struct adiv5_dap *dap, const uint8_t *buffer, int count, uint32_t address)
 {
        int wcount, blocksize, writecount, errorcount = 0, retval = ERROR_OK;
        uint32_t adr = address;
-       uint8_t* pBuffer = buffer;
+       const uint8_t* pBuffer = buffer;
 
        count >>= 2;
        wcount = count;
@@ -309,17 +309,19 @@ int mem_ap_write_buf_u32(struct adiv5_dap *dap, uint8_t *buffer, int count, uint
                if (blocksize == 0)
                        blocksize = 1;
 
-               dap_setup_accessport(dap, CSW_32BIT | CSW_ADDRINC_SINGLE, address);
+               retval = dap_setup_accessport(dap, CSW_32BIT | CSW_ADDRINC_SINGLE, address);
+               if (retval != ERROR_OK)
+                       return retval;
 
                for (writecount = 0; writecount < blocksize; writecount++)
                {
                        retval = dap_queue_ap_write(dap, AP_REG_DRW,
-                               *(uint32_t *) (buffer + 4 * writecount));
+                               *(uint32_t *) ((void *) (buffer + 4 * writecount)));
                        if (retval != ERROR_OK)
                                break;
                }
 
-               if (dap_run(dap) == ERROR_OK)
+               if ((retval = dap_run(dap)) == ERROR_OK)
                {
                        wcount = wcount - blocksize;
                        address = address + 4 * blocksize;
@@ -333,8 +335,7 @@ int mem_ap_write_buf_u32(struct adiv5_dap *dap, uint8_t *buffer, int count, uint
                if (errorcount > 1)
                {
                        LOG_WARNING("Block write error address 0x%" PRIx32 ", wcount 0x%x", address, wcount);
-                       /* REVISIT return the *actual* fault code */
-                       return ERROR_JTAG_DEVICE_ERROR;
+                       return retval;
                }
        }
 
@@ -342,7 +343,7 @@ int mem_ap_write_buf_u32(struct adiv5_dap *dap, uint8_t *buffer, int count, uint
 }
 
 static int mem_ap_write_buf_packed_u16(struct adiv5_dap *dap,
-               uint8_t *buffer, int count, uint32_t address)
+               const uint8_t *buffer, int count, uint32_t address)
 {
        int retval = ERROR_OK;
        int wcount, blocksize, writecount, i;
@@ -363,7 +364,9 @@ static int mem_ap_write_buf_packed_u16(struct adiv5_dap *dap,
                if (blocksize == 0)
                        blocksize = 1;
 
-               dap_setup_accessport(dap, CSW_16BIT | CSW_ADDRINC_PACKED, address);
+               retval = dap_setup_accessport(dap, CSW_16BIT | CSW_ADDRINC_PACKED, address);
+               if (retval != ERROR_OK)
+                       return retval;
                writecount = blocksize;
 
                do
@@ -372,13 +375,14 @@ static int mem_ap_write_buf_packed_u16(struct adiv5_dap *dap,
 
                        if (nbytes < 4)
                        {
-                               if (mem_ap_write_buf_u16(dap, buffer,
-                                               nbytes, address) != ERROR_OK)
+                               retval = mem_ap_write_buf_u16(dap, buffer,
+                                               nbytes, address);
+                               if (retval != ERROR_OK)
                                {
                                        LOG_WARNING("Block write error address "
                                                "0x%" PRIx32 ", count 0x%x",
                                                address, count);
-                                       return ERROR_JTAG_DEVICE_ERROR;
+                                       return retval;
                                }
 
                                address += nbytes >> 1;
@@ -401,13 +405,12 @@ static int mem_ap_write_buf_packed_u16(struct adiv5_dap *dap,
                                if (retval != ERROR_OK)
                                        break;
 
-                               if (dap_run(dap) != ERROR_OK)
+                               if ((retval = dap_run(dap)) != ERROR_OK)
                                {
                                        LOG_WARNING("Block write error address "
                                                "0x%" PRIx32 ", count 0x%x",
                                                address, count);
-                                       /* REVISIT return *actual* fault code */
-                                       return ERROR_JTAG_DEVICE_ERROR;
+                                       return retval;
                                }
                        }
 
@@ -421,7 +424,7 @@ static int mem_ap_write_buf_packed_u16(struct adiv5_dap *dap,
        return retval;
 }
 
-int mem_ap_write_buf_u16(struct adiv5_dap *dap, uint8_t *buffer, int count, uint32_t address)
+int mem_ap_write_buf_u16(struct adiv5_dap *dap, const uint8_t *buffer, int count, uint32_t address)
 {
        int retval = ERROR_OK;
 
@@ -430,7 +433,9 @@ int mem_ap_write_buf_u16(struct adiv5_dap *dap, uint8_t *buffer, int count, uint
 
        while (count > 0)
        {
-               dap_setup_accessport(dap, CSW_16BIT | CSW_ADDRINC_SINGLE, address);
+               retval = dap_setup_accessport(dap, CSW_16BIT | CSW_ADDRINC_SINGLE, address);
+               if (retval != ERROR_OK)
+                       return retval;
                uint16_t svalue;
                memcpy(&svalue, buffer, sizeof(uint16_t));
                uint32_t outvalue = (uint32_t)svalue << 8 * (address & 0x3);
@@ -451,7 +456,7 @@ int mem_ap_write_buf_u16(struct adiv5_dap *dap, uint8_t *buffer, int count, uint
 }
 
 static int mem_ap_write_buf_packed_u8(struct adiv5_dap *dap,
-               uint8_t *buffer, int count, uint32_t address)
+               const uint8_t *buffer, int count, uint32_t address)
 {
        int retval = ERROR_OK;
        int wcount, blocksize, writecount, i;
@@ -468,7 +473,9 @@ static int mem_ap_write_buf_packed_u8(struct adiv5_dap *dap,
                if (wcount < blocksize)
                        blocksize = wcount;
 
-               dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_PACKED, address);
+               retval = dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_PACKED, address);
+               if (retval != ERROR_OK)
+                       return retval;
                writecount = blocksize;
 
                do
@@ -477,12 +484,13 @@ static int mem_ap_write_buf_packed_u8(struct adiv5_dap *dap,
 
                        if (nbytes < 4)
                        {
-                               if (mem_ap_write_buf_u8(dap, buffer, nbytes, address) != ERROR_OK)
+                               retval = mem_ap_write_buf_u8(dap, buffer, nbytes, address);
+                               if (retval != ERROR_OK)
                                {
                                        LOG_WARNING("Block write error address "
                                                "0x%" PRIx32 ", count 0x%x",
                                                address, count);
-                                       return ERROR_JTAG_DEVICE_ERROR;
+                                       return retval;
                                }
 
                                address += nbytes;
@@ -505,13 +513,12 @@ static int mem_ap_write_buf_packed_u8(struct adiv5_dap *dap,
                                if (retval != ERROR_OK)
                                        break;
 
-                               if (dap_run(dap) != ERROR_OK)
+                               if ((retval = dap_run(dap)) != ERROR_OK)
                                {
                                        LOG_WARNING("Block write error address "
                                                "0x%" PRIx32 ", count 0x%x",
                                                address, count);
-                                       /* REVISIT return *actual* fault code */
-                                       return ERROR_JTAG_DEVICE_ERROR;
+                                       return retval;
                                }
                        }
 
@@ -525,7 +532,7 @@ static int mem_ap_write_buf_packed_u8(struct adiv5_dap *dap,
        return retval;
 }
 
-int mem_ap_write_buf_u8(struct adiv5_dap *dap, uint8_t *buffer, int count, uint32_t address)
+int mem_ap_write_buf_u8(struct adiv5_dap *dap, const uint8_t *buffer, int count, uint32_t address)
 {
        int retval = ERROR_OK;
 
@@ -534,7 +541,9 @@ int mem_ap_write_buf_u8(struct adiv5_dap *dap, uint8_t *buffer, int count, uint3
 
        while (count > 0)
        {
-               dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_SINGLE, address);
+               retval = dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_SINGLE, address);
+               if (retval != ERROR_OK)
+                       return retval;
                uint32_t outvalue = (uint32_t)*buffer << 8 * (address & 0x3);
                retval = dap_queue_ap_write(dap, AP_REG_DRW, outvalue);
                if (retval != ERROR_OK)
@@ -592,8 +601,10 @@ int mem_ap_read_buf_u32(struct adiv5_dap *dap, uint8_t *buffer,
                if (blocksize == 0)
                        blocksize = 1;
 
-               dap_setup_accessport(dap, CSW_32BIT | CSW_ADDRINC_SINGLE,
+               retval = dap_setup_accessport(dap, CSW_32BIT | CSW_ADDRINC_SINGLE,
                                address);
+               if (retval != ERROR_OK)
+                       return retval;
 
                /* FIXME remove these three calls to adi_jtag_dp_scan(),
                 * so this routine becomes transport-neutral.  Be careful
@@ -686,7 +697,9 @@ static int mem_ap_read_buf_packed_u16(struct adiv5_dap *dap,
                if (wcount < blocksize)
                        blocksize = wcount;
 
-               dap_setup_accessport(dap, CSW_16BIT | CSW_ADDRINC_PACKED, address);
+               retval = dap_setup_accessport(dap, CSW_16BIT | CSW_ADDRINC_PACKED, address);
+               if (retval != ERROR_OK)
+                       return retval;
 
                /* handle unaligned data at 4k boundary */
                if (blocksize == 0)
@@ -696,11 +709,12 @@ static int mem_ap_read_buf_packed_u16(struct adiv5_dap *dap,
                do
                {
                        retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue);
-                       if (dap_run(dap) != ERROR_OK)
+                       if (retval != ERROR_OK)
+                               return retval;
+                       if ((retval = dap_run(dap)) != ERROR_OK)
                        {
                                LOG_WARNING("Block read error address 0x%" PRIx32 ", count 0x%x", address, count);
-                               /* REVISIT return the *actual* fault code */
-                               return ERROR_JTAG_DEVICE_ERROR;
+                               return retval;
                        }
 
                        nbytes = MIN((readcount << 1), 4);
@@ -739,7 +753,9 @@ int mem_ap_read_buf_u16(struct adiv5_dap *dap, uint8_t *buffer,
 
        while (count > 0)
        {
-               dap_setup_accessport(dap, CSW_16BIT | CSW_ADDRINC_SINGLE, address);
+               retval = dap_setup_accessport(dap, CSW_16BIT | CSW_ADDRINC_SINGLE, address);
+               if (retval != ERROR_OK)
+                       return retval;
                retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue);
                if (retval != ERROR_OK)
                        break;
@@ -795,17 +811,20 @@ static int mem_ap_read_buf_packed_u8(struct adiv5_dap *dap,
                if (wcount < blocksize)
                        blocksize = wcount;
 
-               dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_PACKED, address);
+               retval = dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_PACKED, address);
+               if (retval != ERROR_OK)
+                       return retval;
                readcount = blocksize;
 
                do
                {
                        retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue);
-                       if (dap_run(dap) != ERROR_OK)
+                       if (retval != ERROR_OK)
+                               return retval;
+                       if ((retval = dap_run(dap)) != ERROR_OK)
                        {
                                LOG_WARNING("Block read error address 0x%" PRIx32 ", count 0x%x", address, count);
-                               /* REVISIT return the *actual* fault code */
-                               return ERROR_JTAG_DEVICE_ERROR;
+                               return retval;
                        }
 
                        nbytes = MIN(readcount, 4);
@@ -844,8 +863,12 @@ int mem_ap_read_buf_u8(struct adiv5_dap *dap, uint8_t *buffer,
 
        while (count > 0)
        {
-               dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_SINGLE, address);
+               retval = dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_SINGLE, address);
+               if (retval != ERROR_OK)
+                       return retval;
                retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue);
+               if (retval != ERROR_OK)
+                       return retval;
                retval = dap_run(dap);
                if (retval != ERROR_OK)
                        break;
@@ -859,6 +882,80 @@ int mem_ap_read_buf_u8(struct adiv5_dap *dap, uint8_t *buffer,
        return retval;
 }
 
+/*--------------------------------------------------------------------*/
+/*          Wrapping function with selection of AP                    */
+/*--------------------------------------------------------------------*/
+int mem_ap_sel_read_u32(struct adiv5_dap *swjdp, uint8_t ap,
+               uint32_t address, uint32_t *value)
+{
+       dap_ap_select(swjdp, ap);
+       return mem_ap_read_u32(swjdp, address, value);
+}
+
+int mem_ap_sel_write_u32(struct adiv5_dap *swjdp, uint8_t ap,
+               uint32_t address, uint32_t value)
+{
+       dap_ap_select(swjdp, ap);
+       return mem_ap_write_u32(swjdp, address, value);
+}
+
+int mem_ap_sel_read_atomic_u32(struct adiv5_dap *swjdp, uint8_t ap,
+               uint32_t address, uint32_t *value)
+{
+       dap_ap_select(swjdp, ap);
+       return mem_ap_read_atomic_u32(swjdp, address, value);
+}
+
+int mem_ap_sel_write_atomic_u32(struct adiv5_dap *swjdp, uint8_t ap,
+               uint32_t address, uint32_t value)
+{
+       dap_ap_select(swjdp, ap);
+       return mem_ap_write_atomic_u32(swjdp, address, value);
+}
+
+int mem_ap_sel_read_buf_u8(struct adiv5_dap *swjdp, uint8_t ap,
+               uint8_t *buffer, int count, uint32_t address)
+{
+       dap_ap_select(swjdp, ap);
+       return mem_ap_read_buf_u8(swjdp, buffer, count, address);
+}
+
+int mem_ap_sel_read_buf_u16(struct adiv5_dap *swjdp, uint8_t ap,
+               uint8_t *buffer, int count, uint32_t address)
+{
+       dap_ap_select(swjdp, ap);
+       return mem_ap_read_buf_u16(swjdp, buffer, count, address);
+}
+
+int mem_ap_sel_read_buf_u32(struct adiv5_dap *swjdp, uint8_t ap,
+               uint8_t *buffer, int count, uint32_t address)
+{
+       dap_ap_select(swjdp, ap);
+       return mem_ap_read_buf_u32(swjdp, buffer, count, address);
+}
+
+int mem_ap_sel_write_buf_u8(struct adiv5_dap *swjdp, uint8_t ap,
+               const uint8_t *buffer, int count, uint32_t address)
+{
+       dap_ap_select(swjdp, ap);
+       return mem_ap_write_buf_u8(swjdp, buffer, count, address);
+}
+
+int mem_ap_sel_write_buf_u16(struct adiv5_dap *swjdp, uint8_t ap,
+               const uint8_t *buffer, int count, uint32_t address)
+{
+       dap_ap_select(swjdp, ap);
+       return mem_ap_write_buf_u16(swjdp, buffer, count, address);
+}
+
+int mem_ap_sel_write_buf_u32(struct adiv5_dap *swjdp, uint8_t ap,
+               const uint8_t *buffer, int count, uint32_t address)
+{
+       dap_ap_select(swjdp, ap);
+       return mem_ap_write_buf_u32(swjdp, buffer, count, address);
+}
+
+
 /*--------------------------------------------------------------------------*/
 
 
@@ -883,15 +980,18 @@ extern const struct dap_ops jtag_dp_ops;
  */
 int ahbap_debugport_init(struct adiv5_dap *dap)
 {
-       uint32_t idreg, romaddr, dummy;
        uint32_t ctrlstat;
        int cnt = 0;
        int retval;
 
        LOG_DEBUG(" ");
 
-       /* JTAG-DP or SWJ-DP, in JTAG mode */
-       dap->ops = &jtag_dp_ops;
+       /* JTAG-DP or SWJ-DP, in JTAG mode
+        * ... for SWD mode this is patched as part
+        * of link switchover
+        */
+       if (!dap->ops)
+               dap->ops = &jtag_dp_ops;
 
        /* Default MEM-AP setup.
         *
@@ -899,12 +999,12 @@ int ahbap_debugport_init(struct adiv5_dap *dap)
         * Should we probe, or take a hint from the caller?
         * Presumably we can ignore the possibility of multiple APs.
         */
-       dap->apsel = !0;
+       dap->ap_current = !0;
        dap_ap_select(dap, 0);
 
        /* DP initialization */
 
-       retval = dap_queue_dp_read(dap, DP_CTRL_STAT, &dummy);
+       retval = dap_queue_dp_read(dap, DP_CTRL_STAT, NULL);
        if (retval != ERROR_OK)
                return retval;
 
@@ -912,7 +1012,7 @@ int ahbap_debugport_init(struct adiv5_dap *dap)
        if (retval != ERROR_OK)
                return retval;
 
-       retval = dap_queue_dp_read(dap, DP_CTRL_STAT, &dummy);
+       retval = dap_queue_dp_read(dap, DP_CTRL_STAT, NULL);
        if (retval != ERROR_OK)
                return retval;
 
@@ -950,7 +1050,7 @@ int ahbap_debugport_init(struct adiv5_dap *dap)
                alive_sleep(10);
        }
 
-       retval = dap_queue_dp_read(dap, DP_CTRL_STAT, &dummy);
+       retval = dap_queue_dp_read(dap, DP_CTRL_STAT, NULL);
        if (retval != ERROR_OK)
                return retval;
        /* With debug power on we can activate OVERRUN checking */
@@ -958,26 +1058,10 @@ int ahbap_debugport_init(struct adiv5_dap *dap)
        retval = dap_queue_dp_write(dap, DP_CTRL_STAT, dap->dp_ctrl_stat);
        if (retval != ERROR_OK)
                return retval;
-       retval = dap_queue_dp_read(dap, DP_CTRL_STAT, &dummy);
+       retval = dap_queue_dp_read(dap, DP_CTRL_STAT, NULL);
        if (retval != ERROR_OK)
                return retval;
 
-       /*
-        * REVISIT this isn't actually *initializing* anything in an AP,
-        * and doesn't care if it's a MEM-AP at all (much less AHB-AP).
-        * Should it?  If the ROM address is valid, is this the right
-        * place to scan the table and do any topology detection?
-        */
-       retval = dap_queue_ap_read(dap, AP_REG_IDR, &idreg);
-       retval = dap_queue_ap_read(dap, AP_REG_BASE, &romaddr);
-
-       if ((retval = dap_run(dap)) != ERROR_OK)
-               return retval;
-
-       LOG_DEBUG("MEM-AP #%" PRId32 " ID Register 0x%" PRIx32
-               ", Debug ROM Address 0x%" PRIx32,
-               dap->apsel, idreg, romaddr);
-
        return ERROR_OK;
 }
 
@@ -999,27 +1083,107 @@ is_dap_cid_ok(uint32_t cid3, uint32_t cid2, uint32_t cid1, uint32_t cid0)
                        && ((cid1 & 0x0f) == 0) && cid0 == 0x0d;
 }
 
-static int dap_info_command(struct command_context *cmd_ctx,
-               struct adiv5_dap *dap, int apsel)
+int dap_get_debugbase(struct adiv5_dap *dap, int ap,
+                       uint32_t *out_dbgbase, uint32_t *out_apid)
 {
+       uint32_t ap_old;
        int retval;
        uint32_t dbgbase, apid;
-       int romtable_present = 0;
-       uint8_t mem_ap;
-       uint32_t apselold;
 
        /* AP address is in bits 31:24 of DP_SELECT */
-       if (apsel >= 256)
+       if (ap >= 256)
                return ERROR_INVALID_ARGUMENTS;
 
-       apselold = dap->apsel;
-       dap_ap_select(dap, apsel);
+       ap_old = dap->ap_current;
+       dap_ap_select(dap, ap);
+
        retval = dap_queue_ap_read(dap, AP_REG_BASE, &dbgbase);
+       if (retval != ERROR_OK)
+               return retval;
        retval = dap_queue_ap_read(dap, AP_REG_IDR, &apid);
+       if (retval != ERROR_OK)
+               return retval;
        retval = dap_run(dap);
        if (retval != ERROR_OK)
                return retval;
 
+       /* Excavate the device ID code */
+       struct jtag_tap *tap = dap->jtag_info->tap;
+       while (tap != NULL) {
+               if (tap->hasidcode)
+                       break;
+               tap = tap->next_tap;
+       }
+       if (tap == NULL || !tap->hasidcode)
+               return ERROR_OK;
+
+       dap_ap_select(dap, ap_old);
+
+       /* The asignment happens only here to prevent modification of these
+        * values before they are certain. */
+       *out_dbgbase = dbgbase;
+       *out_apid = apid;
+
+       return ERROR_OK;
+}
+
+int dap_lookup_cs_component(struct adiv5_dap *dap, int ap,
+                       uint32_t dbgbase, uint8_t type, uint32_t *addr)
+{
+       uint32_t ap_old;
+       uint32_t romentry, entry_offset = 0, component_base, devtype;
+       int retval = ERROR_FAIL;
+
+       if (ap >= 256)
+               return ERROR_INVALID_ARGUMENTS;
+
+       ap_old = dap->ap_current;
+       dap_ap_select(dap, ap);
+
+       do
+       {
+               retval = mem_ap_read_atomic_u32(dap, (dbgbase&0xFFFFF000) |
+                                               entry_offset, &romentry);
+               if (retval != ERROR_OK)
+                       return retval;
+
+               component_base = (dbgbase & 0xFFFFF000)
+                       + (romentry & 0xFFFFF000);
+
+               if (romentry & 0x1) {
+                       retval = mem_ap_read_atomic_u32(dap,
+                                       (component_base & 0xfffff000) | 0xfcc,
+                                       &devtype);
+                       if ((devtype & 0xff) == type) {
+                               *addr = component_base;
+                               retval = ERROR_OK;
+                               break;
+                       }
+               }
+               entry_offset += 4;
+       } while (romentry > 0);
+
+       dap_ap_select(dap, ap_old);
+
+       return retval;
+}
+
+static int dap_info_command(struct command_context *cmd_ctx,
+               struct adiv5_dap *dap, int ap)
+{
+       int retval;
+       uint32_t dbgbase, apid;
+       int romtable_present = 0;
+       uint8_t mem_ap;
+       uint32_t ap_old;
+
+       retval = dap_get_debugbase(dap, ap, &dbgbase, &apid);
+       if (retval != ERROR_OK)
+               return retval;
+
+       ap_old = dap->ap_current;
+       dap_ap_select(dap, ap);
+
        /* Now we read ROM table ID registers, ref. ARM IHI 0029B sec  */
        mem_ap = ((apid&0x10000) && ((apid&0x0F) != 0));
        command_print(cmd_ctx, "AP ID register 0x%8.8" PRIx32, apid);
@@ -1050,7 +1214,7 @@ static int dap_info_command(struct command_context *cmd_ctx,
        }
        else
        {
-               command_print(cmd_ctx, "No AP found at this apsel 0x%x", apsel);
+               command_print(cmd_ctx, "No AP found at this ap 0x%x", ap);
        }
 
        romtable_present = ((mem_ap) && (dbgbase != 0xFFFFFFFF));
@@ -1066,21 +1230,32 @@ static int dap_info_command(struct command_context *cmd_ctx,
                        command_print(cmd_ctx, "\tROM table in legacy format");
 
                /* Now we read ROM table ID registers, ref. ARM IHI 0029B sec  */
-               mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFF0, &cid0);
-               mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFF4, &cid1);
-               mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFF8, &cid2);
-               mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFFC, &cid3);
-               mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFCC, &memtype);
+               retval = mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFF0, &cid0);
+               if (retval != ERROR_OK)
+                       return retval;
+               retval = mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFF4, &cid1);
+               if (retval != ERROR_OK)
+                       return retval;
+               retval = mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFF8, &cid2);
+               if (retval != ERROR_OK)
+                       return retval;
+               retval = mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFFC, &cid3);
+               if (retval != ERROR_OK)
+                       return retval;
+               retval = mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFCC, &memtype);
+               if (retval != ERROR_OK)
+                       return retval;
                retval = dap_run(dap);
                if (retval != ERROR_OK)
                        return retval;
 
                if (!is_dap_cid_ok(cid3, cid2, cid1, cid0))
-                       command_print(cmd_ctx, "\tCID3 0x%2.2" PRIx32
-                                       ", CID2 0x%2.2" PRIx32
-                                       ", CID1 0x%2.2" PRIx32
-                                       ", CID0 0x%2.2" PRIx32,
-                                       cid3, cid2, cid1, cid0);
+                       command_print(cmd_ctx, "\tCID3 0x%2.2x"
+                                       ", CID2 0x%2.2x"
+                                       ", CID1 0x%2.2x"
+                                       ", CID0 0x%2.2x",
+                                       (unsigned) cid3, (unsigned)cid2,
+                                       (unsigned) cid1, (unsigned) cid0);
                if (memtype & 0x01)
                        command_print(cmd_ctx, "\tMEMTYPE system memory present on bus");
                else
@@ -1091,41 +1266,78 @@ static int dap_info_command(struct command_context *cmd_ctx,
                entry_offset = 0;
                do
                {
-                       mem_ap_read_atomic_u32(dap, (dbgbase&0xFFFFF000) | entry_offset, &romentry);
+                       retval = mem_ap_read_atomic_u32(dap, (dbgbase&0xFFFFF000) | entry_offset, &romentry);
+                       if (retval != ERROR_OK)
+                               return retval;
                        command_print(cmd_ctx, "\tROMTABLE[0x%x] = 0x%" PRIx32 "",entry_offset,romentry);
                        if (romentry&0x01)
                        {
                                uint32_t c_cid0, c_cid1, c_cid2, c_cid3;
                                uint32_t c_pid0, c_pid1, c_pid2, c_pid3, c_pid4;
-                               uint32_t component_start, component_base;
+                               uint32_t component_base;
                                unsigned part_num;
                                char *type, *full;
 
-                               component_base = (uint32_t)((dbgbase & 0xFFFFF000)
-                                               + (int)(romentry & 0xFFFFF000));
-                               mem_ap_read_atomic_u32(dap,
-                                               (component_base & 0xFFFFF000) | 0xFE0, &c_pid0);
-                               mem_ap_read_atomic_u32(dap,
-                                               (component_base & 0xFFFFF000) | 0xFE4, &c_pid1);
-                               mem_ap_read_atomic_u32(dap,
-                                               (component_base & 0xFFFFF000) | 0xFE8, &c_pid2);
-                               mem_ap_read_atomic_u32(dap,
-                                               (component_base & 0xFFFFF000) | 0xFEC, &c_pid3);
-                               mem_ap_read_atomic_u32(dap,
-                                               (component_base & 0xFFFFF000) | 0xFD0, &c_pid4);
-                               mem_ap_read_atomic_u32(dap,
-                                               (component_base & 0xFFFFF000) | 0xFF0, &c_cid0);
-                               mem_ap_read_atomic_u32(dap,
-                                               (component_base & 0xFFFFF000) | 0xFF4, &c_cid1);
-                               mem_ap_read_atomic_u32(dap,
-                                               (component_base & 0xFFFFF000) | 0xFF8, &c_cid2);
-                               mem_ap_read_atomic_u32(dap,
-                                               (component_base & 0xFFFFF000) | 0xFFC, &c_cid3);
-                               component_start = component_base - 0x1000*(c_pid4 >> 4);
-
-                               command_print(cmd_ctx, "\t\tComponent base address 0x%" PRIx32
-                                               ", start address 0x%" PRIx32,
-                                               component_base, component_start);
+                               component_base = (dbgbase & 0xFFFFF000)
+                                               + (romentry & 0xFFFFF000);
+
+                               /* IDs are in last 4K section */
+
+
+                               retval = mem_ap_read_atomic_u32(dap,
+                                       component_base + 0xFE0, &c_pid0);
+                               if (retval != ERROR_OK)
+                                       return retval;
+                               c_pid0 &= 0xff;
+                               retval = mem_ap_read_atomic_u32(dap,
+                                       component_base + 0xFE4, &c_pid1);
+                               if (retval != ERROR_OK)
+                                       return retval;
+                               c_pid1 &= 0xff;
+                               retval = mem_ap_read_atomic_u32(dap,
+                                       component_base + 0xFE8, &c_pid2);
+                               if (retval != ERROR_OK)
+                                       return retval;
+                               c_pid2 &= 0xff;
+                               retval = mem_ap_read_atomic_u32(dap,
+                                       component_base + 0xFEC, &c_pid3);
+                               if (retval != ERROR_OK)
+                                       return retval;
+                               c_pid3 &= 0xff;
+                               retval = mem_ap_read_atomic_u32(dap,
+                                       component_base + 0xFD0, &c_pid4);
+                               if (retval != ERROR_OK)
+                                       return retval;
+                               c_pid4 &= 0xff;
+
+                               retval = mem_ap_read_atomic_u32(dap,
+                                       component_base + 0xFF0, &c_cid0);
+                               if (retval != ERROR_OK)
+                                       return retval;
+                               c_cid0 &= 0xff;
+                               retval = mem_ap_read_atomic_u32(dap,
+                                       component_base + 0xFF4, &c_cid1);
+                               if (retval != ERROR_OK)
+                                       return retval;
+                               c_cid1 &= 0xff;
+                               retval = mem_ap_read_atomic_u32(dap,
+                                       component_base + 0xFF8, &c_cid2);
+                               if (retval != ERROR_OK)
+                                       return retval;
+                               c_cid2 &= 0xff;
+                               retval = mem_ap_read_atomic_u32(dap,
+                                       component_base + 0xFFC, &c_cid3);
+                               if (retval != ERROR_OK)
+                                       return retval;
+                               c_cid3 &= 0xff;
+
+
+                               command_print(cmd_ctx,
+                               "\t\tComponent base address 0x%" PRIx32
+                                       ", start address 0x%" PRIx32,
+                                               component_base,
+                               /* component may take multiple 4K pages */
+                               component_base - 0x1000*(c_pid4 >> 4));
                                command_print(cmd_ctx, "\t\tComponent class is 0x%x, %s",
                                                (int) (c_cid1 >> 4) & 0xf,
                                                /* See ARM IHI 0029B Table 3-3 */
@@ -1137,9 +1349,11 @@ static int dap_info_command(struct command_context *cmd_ctx,
                                        unsigned minor;
                                        char *major = "Reserved", *subtype = "Reserved";
 
-                                       mem_ap_read_atomic_u32(dap,
+                                       retval = mem_ap_read_atomic_u32(dap,
                                                        (component_base & 0xfffff000) | 0xfcc,
                                                        &devtype);
+                                       if (retval != ERROR_OK)
+                                               return retval;
                                        minor = (devtype >> 4) & 0x0f;
                                        switch (devtype & 0x0f) {
                                        case 0:
@@ -1243,23 +1457,28 @@ static int dap_info_command(struct command_context *cmd_ctx,
                                }
 
                                if (!is_dap_cid_ok(cid3, cid2, cid1, cid0))
-                                       command_print(cmd_ctx, "\t\tCID3 0x%2.2" PRIx32
-                                                       ", CID2 0x%2.2" PRIx32
-                                                       ", CID1 0x%2.2" PRIx32
-                                                       ", CID0 0x%2.2" PRIx32,
-                                                       c_cid3, c_cid2, c_cid1, c_cid0);
-                               command_print(cmd_ctx, "\t\tPeripheral ID[4..0] = hex "
-                                               "%2.2x %2.2x %2.2x %2.2x %2.2x",
-                                               (int) c_pid4,
-                                               (int) c_pid3, (int) c_pid2,
-                                               (int) c_pid1, (int) c_pid0);
+                                       command_print(cmd_ctx,
+                                                     "\t\tCID3 0%2.2x"
+                                                       ", CID2 0%2.2x"
+                                                       ", CID1 0%2.2x"
+                                                       ", CID0 0%2.2x",
+                                                       (int) c_cid3,
+                                                       (int) c_cid2,
+                                                       (int)c_cid1,
+                                                       (int)c_cid0);
+                               command_print(cmd_ctx,
+                               "\t\tPeripheral ID[4..0] = hex "
+                               "%2.2x %2.2x %2.2x %2.2x %2.2x",
+                               (int) c_pid4, (int) c_pid3, (int) c_pid2,
+                               (int) c_pid1, (int) c_pid0);
 
                                /* Part number interpretations are from Cortex
                                 * core specs, the CoreSight components TRM
-                                * (ARM DDI 0314H), and ETM specs; also from
-                                * chip observation (e.g. TI SDTI).
+                                * (ARM DDI 0314H), CoreSight System Design
+                                * Guide (ARM DGI 0012D) and ETM specs; also
+                                * from chip observation (e.g. TI SDTI).
                                 */
-                               part_num = c_pid0 & 0xff;
+                               part_num = (c_pid0 & 0xff);
                                part_num |= (c_pid1 & 0x0f) << 8;
                                switch (part_num) {
                                case 0x000:
@@ -1327,6 +1546,10 @@ static int dap_info_command(struct command_context *cmd_ctx,
                                        type = "Cortex-M3 ETM";
                                        full = "(Embedded Trace)";
                                        break;
+                               case 0x930:
+                                       type = "Cortex-R4 ETM";
+                                       full = "(Embedded Trace)";
+                                       break;
                                case 0xc08:
                                        type = "Cortex-A8 Debug";
                                        full = "(Debug Unit)";
@@ -1353,7 +1576,7 @@ static int dap_info_command(struct command_context *cmd_ctx,
        {
                command_print(cmd_ctx, "\tNo ROM table present");
        }
-       dap_ap_select(dap, apselold);
+       dap_ap_select(dap, ap_old);
 
        return ERROR_OK;
 }
@@ -1385,10 +1608,9 @@ COMMAND_HANDLER(dap_baseaddr_command)
        struct arm *arm = target_to_arm(target);
        struct adiv5_dap *dap = arm->dap;
 
-       uint32_t apsel, apselsave, baseaddr;
+       uint32_t apsel, baseaddr;
        int retval;
 
-       apselsave = dap->apsel;
        switch (CMD_ARGC) {
        case 0:
                apsel = dap->apsel;
@@ -1403,8 +1625,7 @@ COMMAND_HANDLER(dap_baseaddr_command)
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       if (apselsave != apsel)
-               dap_ap_select(dap, apsel);
+       dap_ap_select(dap, apsel);
 
        /* NOTE:  assumes we're talking to a MEM-AP, which
         * has a base address.  There are other kinds of AP,
@@ -1412,15 +1633,14 @@ COMMAND_HANDLER(dap_baseaddr_command)
         * use the ID register to verify it's a MEM-AP.
         */
        retval = dap_queue_ap_read(dap, AP_REG_BASE, &baseaddr);
+       if (retval != ERROR_OK)
+               return retval;
        retval = dap_run(dap);
        if (retval != ERROR_OK)
                return retval;
 
        command_print(CMD_CTX, "0x%8.8" PRIx32, baseaddr);
 
-       if (apselsave != apsel)
-               dap_ap_select(dap, apselsave);
-
        return retval;
 }
 
@@ -1473,8 +1693,12 @@ COMMAND_HANDLER(dap_apsel_command)
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
+       dap->apsel = apsel;
        dap_ap_select(dap, apsel);
+
        retval = dap_queue_ap_read(dap, AP_REG_IDR, &apid);
+       if (retval != ERROR_OK)
+               return retval;
        retval = dap_run(dap);
        if (retval != ERROR_OK)
                return retval;
@@ -1491,10 +1715,9 @@ COMMAND_HANDLER(dap_apid_command)
        struct arm *arm = target_to_arm(target);
        struct adiv5_dap *dap = arm->dap;
 
-       uint32_t apsel, apselsave, apid;
+       uint32_t apsel, apid;
        int retval;
 
-       apselsave = dap->apsel;
        switch (CMD_ARGC) {
        case 0:
                apsel = dap->apsel;
@@ -1509,17 +1732,16 @@ COMMAND_HANDLER(dap_apid_command)
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       if (apselsave != apsel)
-               dap_ap_select(dap, apsel);
+       dap_ap_select(dap, apsel);
 
        retval = dap_queue_ap_read(dap, AP_REG_IDR, &apid);
+       if (retval != ERROR_OK)
+               return retval;
        retval = dap_run(dap);
        if (retval != ERROR_OK)
                return retval;
 
        command_print(CMD_CTX, "0x%8.8" PRIx32, apid);
-       if (apselsave != apsel)
-               dap_ap_select(dap, apselsave);
 
        return retval;
 }