cortex_a : optimize apb read/write access.
[openocd.git] / src / target / arm_adi_v5.h
index d207fd9cd54d001a9eca26223c8c45f180b45716..bab3292a17f3a88878e4ac09ef35d7305fedc9a9 100644 (file)
@@ -20,6 +20,7 @@
  *   Free Software Foundation, Inc.,                                       *
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
+
 #ifndef ARM_ADI_V5_H
 #define ARM_ADI_V5_H
 
 
 #include "arm_jtag.h"
 
-/* JTAG instructions/registers for JTAG-DP and SWJ-DP */
-#define JTAG_DP_ABORT          0x8
+/* FIXME remove these JTAG-specific decls when mem_ap_read_buf_u32()
+ * is no longer JTAG-specific
+ */
 #define JTAG_DP_DPACC          0xA
 #define JTAG_DP_APACC          0xB
-#define JTAG_DP_IDCODE         0xE
-
-/* three-bit ACK values for DPACC and APACC reads */
-#define JTAG_ACK_OK_FAULT      0x2
-#define JTAG_ACK_WAIT          0x1
 
 /* three-bit ACK values for SWD access (sent LSB first) */
 #define SWD_ACK_OK             0x4
@@ -63,6 +60,9 @@
 #define DP_SELECT              0x8             /* JTAG: r/w; SWD: write */
 #define DP_RDBUFF              0xC             /* read-only */
 
+#define WCR_TO_TRN(wcr) (1 + (3 & ((wcr)) >> 8))       /* 1..4 clocks */
+#define WCR_TO_PRESCALE(wcr) (7 & ((wcr)))             /* impl defined */
+
 /* Fields of the DP's AP ABORT register */
 #define DAPABORT               (1 << 0)
 #define STKCMPCLR              (1 << 1)        /* SWD-only */
  * as part of setting up a debug session (if all the dual-role JTAG/SWD
  * signals are available).
  */
-struct adiv5_dap
-{
+struct adiv5_dap {
        const struct dap_ops *ops;
 
        struct arm_jtag *jtag_info;
        /* Control config */
        uint32_t dp_ctrl_stat;
 
+       uint32_t apsel;
+
        /**
         * Cache for DP_SELECT bits identifying the current AP.  A DAP may
         * connect to multiple APs, such as one MEM-AP for general access,
         * another reserved for accessing debug modules, and a JTAG-DP.
         * "-1" indicates no cached value.
         */
-       uint32_t apsel;
+       uint32_t ap_current;
 
        /**
         * Cache for DP_SELECT bits identifying the current four-word AP
@@ -180,9 +181,9 @@ struct adiv5_dap
         * MEM-AP access before we try to read its status (and/or result).
         */
        uint32_t        memaccess_tck;
+
        /* Size of TAR autoincrement block, ARM ADI Specification requires at least 10 bits */
        uint32_t tar_autoincr_block;
-
 };
 
 /**
@@ -215,6 +216,7 @@ struct dap_ops {
        /** AP register write. */
        int (*queue_ap_write)(struct adiv5_dap *dap, unsigned reg,
                        uint32_t data);
+
        /** AP operation abort. */
        int (*queue_ap_abort)(struct adiv5_dap *dap, uint8_t *ack);
 
@@ -236,6 +238,7 @@ struct dap_ops {
 static inline int dap_queue_idcode_read(struct adiv5_dap *dap,
                uint8_t *ack, uint32_t *data)
 {
+       assert(dap->ops != NULL);
        return dap->ops->queue_idcode_read(dap, ack, data);
 }
 
@@ -247,13 +250,14 @@ static inline int dap_queue_idcode_read(struct adiv5_dap *dap,
  * @param dap The DAP used for reading.
  * @param reg The two-bit number of the DP register being read.
  * @param data Pointer saying where to store the register's value
- *     (in host endianness).
+ * (in host endianness).
  *
  * @return ERROR_OK for success, else a fault code.
  */
 static inline int dap_queue_dp_read(struct adiv5_dap *dap,
                unsigned reg, uint32_t *data)
 {
+       assert(dap->ops != NULL);
        return dap->ops->queue_dp_read(dap, reg, data);
 }
 
@@ -271,6 +275,7 @@ static inline int dap_queue_dp_read(struct adiv5_dap *dap,
 static inline int dap_queue_dp_write(struct adiv5_dap *dap,
                unsigned reg, uint32_t data)
 {
+       assert(dap->ops != NULL);
        return dap->ops->queue_dp_write(dap, reg, data);
 }
 
@@ -280,13 +285,14 @@ static inline int dap_queue_dp_write(struct adiv5_dap *dap,
  * @param dap The DAP used for reading.
  * @param reg The number of the AP register being read.
  * @param data Pointer saying where to store the register's value
- *     (in host endianness).
+ * (in host endianness).
  *
  * @return ERROR_OK for success, else a fault code.
  */
 static inline int dap_queue_ap_read(struct adiv5_dap *dap,
                unsigned reg, uint32_t *data)
 {
+       assert(dap->ops != NULL);
        return dap->ops->queue_ap_read(dap, reg, data);
 }
 
@@ -302,6 +308,7 @@ static inline int dap_queue_ap_read(struct adiv5_dap *dap,
 static inline int dap_queue_ap_write(struct adiv5_dap *dap,
                unsigned reg, uint32_t data)
 {
+       assert(dap->ops != NULL);
        return dap->ops->queue_ap_write(dap, reg, data);
 }
 
@@ -318,6 +325,7 @@ static inline int dap_queue_ap_write(struct adiv5_dap *dap,
  */
 static inline int dap_queue_ap_abort(struct adiv5_dap *dap, uint8_t *ack)
 {
+       assert(dap->ops != NULL);
        return dap->ops->queue_ap_abort(dap, ack);
 }
 
@@ -333,17 +341,18 @@ static inline int dap_queue_ap_abort(struct adiv5_dap *dap, uint8_t *ack)
  */
 static inline int dap_run(struct adiv5_dap *dap)
 {
+       assert(dap->ops != NULL);
        return dap->ops->run(dap);
 }
 
 /** Accessor for currently selected DAP-AP number (0..255) */
 static inline uint8_t dap_ap_get_select(struct adiv5_dap *swjdp)
 {
-       return (uint8_t)(swjdp ->apsel >> 24);
+       return (uint8_t)(swjdp->ap_current >> 24);
 }
 
 /* AP selection applies to future AP transactions */
-void dap_ap_select(struct adiv5_dap *dap,uint8_t apsel);
+void dap_ap_select(struct adiv5_dap *dap, uint8_t ap);
 
 /* Queued AP transactions */
 int dap_setup_accessport(struct adiv5_dap *swjdp,
@@ -365,18 +374,58 @@ int mem_ap_read_buf_u8(struct adiv5_dap *swjdp,
 int mem_ap_read_buf_u16(struct adiv5_dap *swjdp,
                uint8_t *buffer, int count, uint32_t address);
 int mem_ap_read_buf_u32(struct adiv5_dap *swjdp,
-               uint8_t *buffer, int count, uint32_t address);
+               uint8_t *buffer, int count, uint32_t address, bool addr_incr);
 
 int mem_ap_write_buf_u8(struct adiv5_dap *swjdp,
-               uint8_t *buffer, int count, uint32_t address);
+               const uint8_t *buffer, int count, uint32_t address);
 int mem_ap_write_buf_u16(struct adiv5_dap *swjdp,
-               uint8_t *buffer, int count, uint32_t address);
+               const uint8_t *buffer, int count, uint32_t address);
 int mem_ap_write_buf_u32(struct adiv5_dap *swjdp,
+               const uint8_t *buffer, int count, uint32_t address, bool addr_incr);
+
+/* Queued MEM-AP memory mapped single word transfers with selection of ap */
+int mem_ap_sel_read_u32(struct adiv5_dap *swjdp, uint8_t ap,
+               uint32_t address, uint32_t *value);
+int mem_ap_sel_write_u32(struct adiv5_dap *swjdp, uint8_t ap,
+               uint32_t address, uint32_t value);
+
+/* Synchronous MEM-AP memory mapped single word transfers with selection of ap */
+int mem_ap_sel_read_atomic_u32(struct adiv5_dap *swjdp, uint8_t ap,
+               uint32_t address, uint32_t *value);
+int mem_ap_sel_write_atomic_u32(struct adiv5_dap *swjdp, uint8_t ap,
+               uint32_t address, uint32_t value);
+
+/* Non incrementing buffer functions for accessing fifos */
+int mem_ap_sel_read_buf_u32_noincr(struct adiv5_dap *swjdp, uint8_t ap,
                uint8_t *buffer, int count, uint32_t address);
+int mem_ap_sel_write_buf_u32_noincr(struct adiv5_dap *swjdp, uint8_t ap,
+               const uint8_t *buffer, int count, uint32_t address);
+
+/* MEM-AP memory mapped bus block transfers with selection of ap */
+int mem_ap_sel_read_buf_u8(struct adiv5_dap *swjdp, uint8_t ap,
+               uint8_t *buffer, int count, uint32_t address);
+int mem_ap_sel_read_buf_u16(struct adiv5_dap *swjdp, uint8_t ap,
+               uint8_t *buffer, int count, uint32_t address);
+int mem_ap_sel_read_buf_u32(struct adiv5_dap *swjdp, uint8_t ap,
+               uint8_t *buffer, int count, uint32_t address);
+
+int mem_ap_sel_write_buf_u8(struct adiv5_dap *swjdp, uint8_t ap,
+               const uint8_t *buffer, int count, uint32_t address);
+int mem_ap_sel_write_buf_u16(struct adiv5_dap *swjdp, uint8_t ap,
+               const uint8_t *buffer, int count, uint32_t address);
+int mem_ap_sel_write_buf_u32(struct adiv5_dap *swjdp, uint8_t ap,
+               const uint8_t *buffer, int count, uint32_t address);
 
 /* Initialisation of the debug system, power domains and registers */
 int ahbap_debugport_init(struct adiv5_dap *swjdp);
 
+/* Probe the AP for ROM Table location */
+int dap_get_debugbase(struct adiv5_dap *dap, int ap,
+                       uint32_t *dbgbase, uint32_t *apid);
+
+/* Lookup CoreSight component */
+int dap_lookup_cs_component(struct adiv5_dap *dap, int ap,
+                       uint32_t dbgbase, uint8_t type, uint32_t *addr);
 
 struct target;
 

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)