target: add Espressif ESP32-S3 basic support
[openocd.git] / src / target / arm_adi_v5.h
index 7706fc935b31e56936f7a48e71bb01c989dc754a..8fb57470be09c8b639338d6c44469c4476bab3e8 100644 (file)
@@ -86,6 +86,9 @@
 #define DP_DPIDR1_ASIZE_MASK    (0x7F)
 #define DP_DPIDR1_ERRMODE       BIT(7)
 
+/* Fields of register DP_BASEPTR0 */
+#define DP_BASEPTR0_VALID       BIT(0)
+
 /* Fields of the DP's CTRL/STAT register */
 #define CORUNDETECT     (1UL << 0)
 #define SSTICKYORUN     (1UL << 1)
 #define DP_SELECT_DPBANK 0x0000000F
 #define DP_SELECT_INVALID 0x00FFFF00 /* Reserved bits one */
 
-#define DP_APSEL_MAX        (255)
-#define DP_APSEL_INVALID    (-1)
+#define DP_APSEL_MAX        (255) /* for ADIv5 only */
+#define DP_APSEL_INVALID    0xF00 /* more than DP_APSEL_MAX and not ADIv6 aligned 4k */
 
 #define DP_TARGETSEL_INVALID 0xFFFFFFFFU
 #define DP_TARGETSEL_DPID_MASK 0x0FFFFFFFU
@@ -255,9 +258,11 @@ struct adiv5_ap {
        struct adiv5_dap *dap;
 
        /**
-        * Number of this AP.
+        * ADIv5: Number of this AP (0~255)
+        * ADIv6: Base address of this AP (4k aligned)
+        * TODO: to be more coherent, it should be renamed apsel
         */
-       uint8_t ap_num;
+       uint64_t ap_num;
 
        /**
         * Default value for (MEM-AP) AP_REG_CSW register.
@@ -342,13 +347,13 @@ struct adiv5_dap {
        struct adiv5_ap ap[DP_APSEL_MAX + 1];
 
        /* The current manually selected AP by the "dap apsel" command */
-       uint32_t apsel;
+       uint64_t apsel;
 
        /**
         * Cache for DP_SELECT register. A value of DP_SELECT_INVALID
         * indicates no cached value and forces rewrite of the register.
         */
-       uint32_t select;
+       uint64_t select;
 
        /* information about current pending SWjDP-AHBAP transaction */
        uint8_t  ack;
@@ -395,6 +400,9 @@ struct adiv5_dap {
 
        /** Indicates ADI version (5, 6 or 0 for unknown) being used */
        unsigned int adi_version;
+
+       /* ADIv6 only field indicating ROM Table address size */
+       unsigned int asize;
 };
 
 /**
@@ -548,7 +556,7 @@ static inline int dap_queue_ap_read(struct adiv5_ap *ap,
        assert(ap->dap->ops);
        if (ap->refcount == 0) {
                ap->refcount = 1;
-               LOG_ERROR("BUG: refcount AP#%" PRIu8 " used without get", ap->ap_num);
+               LOG_ERROR("BUG: refcount AP#0x%" PRIx64 " used without get", ap->ap_num);
        }
        return ap->dap->ops->queue_ap_read(ap, reg, data);
 }
@@ -568,7 +576,7 @@ static inline int dap_queue_ap_write(struct adiv5_ap *ap,
        assert(ap->dap->ops);
        if (ap->refcount == 0) {
                ap->refcount = 1;
-               LOG_ERROR("BUG: refcount AP#%" PRIu8 " used without get", ap->ap_num);
+               LOG_ERROR("BUG: refcount AP#0x%" PRIx64 " used without get", ap->ap_num);
        }
        return ap->dap->ops->queue_ap_write(ap, reg, data);
 }
@@ -687,16 +695,22 @@ int mem_ap_init(struct adiv5_ap *ap);
 /* Invalidate cached DP select and cached TAR and CSW of all APs */
 void dap_invalidate_cache(struct adiv5_dap *dap);
 
+/* read ADIv6 baseptr register */
+int adiv6_dap_read_baseptr(struct command_invocation *cmd, struct adiv5_dap *dap, target_addr_t *baseptr);
+
+/* test if ap_num is valid, based on current knowledge of dap */
+bool is_ap_num_valid(struct adiv5_dap *dap, uint64_t ap_num);
+
 /* Probe Access Ports to find a particular type. Increment AP refcount */
 int dap_find_get_ap(struct adiv5_dap *dap,
                        enum ap_type type_to_find,
                        struct adiv5_ap **ap_out);
 
 /* Return AP with specified ap_num. Increment AP refcount */
-struct adiv5_ap *dap_get_ap(struct adiv5_dap *dap, unsigned int ap_num);
+struct adiv5_ap *dap_get_ap(struct adiv5_dap *dap, uint64_t ap_num);
 
 /* Return AP with specified ap_num. Increment AP refcount and keep it non-zero */
-struct adiv5_ap *dap_get_config_ap(struct adiv5_dap *dap, unsigned int ap_num);
+struct adiv5_ap *dap_get_config_ap(struct adiv5_dap *dap, uint64_t ap_num);
 
 /* Decrement AP refcount and release the AP when refcount reaches zero */
 int dap_put_ap(struct adiv5_ap *ap);
@@ -732,7 +746,7 @@ extern const struct swd_driver *adiv5_dap_swd_driver(struct adiv5_dap *self);
 extern int dap_cleanup_all(void);
 
 struct adiv5_private_config {
-       int ap_num;
+       uint64_t ap_num;
        struct adiv5_dap *dap;
 };
 
@@ -741,7 +755,7 @@ extern int adiv5_jim_configure(struct target *target, struct jim_getopt_info *go
 
 struct adiv5_mem_ap_spot {
        struct adiv5_dap *dap;
-       int ap_num;
+       uint64_t ap_num;
        uint32_t base;
 };
 

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)