target/arm_cti: use adiv5_jim_mem_ap_spot_configure() 69/5869/4
authorAntonio Borneo <borneo.antonio@gmail.com>
Sat, 17 Oct 2020 14:27:13 +0000 (16:27 +0200)
committerAntonio Borneo <borneo.antonio@gmail.com>
Wed, 4 Nov 2020 17:37:25 +0000 (17:37 +0000)
To avoid code duplication, reorganize the code to replace
cti_configure() with adiv5_jim_mem_ap_spot_configure().

Reorganize 'struct arm_cti_object' and its sub-'struct arm_cti'
moving DAP and mem-AP info in a 'struct adiv5_mem_ap_spot'.
Replace cti_configure() with adiv5_jim_mem_ap_spot_configure().
Deprecate the use of '-ctibase' in favor of '-baseaddr'.

Change-Id: I43740a37c80de67c0f5e4dc79c3400b91a12e9e8
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/5869
Tested-by: jenkins
doc/openocd.texi
src/target/arm_adi_v5.c
src/target/arm_cti.c

index dba2a0afa00e157c0faf1d398e6d6f774120922e..ca10f8c0bec3a031c495f5930a6d57ced384fbc1 100644 (file)
@@ -8593,7 +8593,7 @@ CTI is mandatory for core run control and each core has an individual
 CTI instance attached to it. OpenOCD has limited support for CTI using
 the @emph{cti} group of commands.
 
-@deffn Command {cti create} cti_name @option{-dap} dap_name @option{-ap-num} apn @option{-ctibase} base_address
+@deffn Command {cti create} cti_name @option{-dap} dap_name @option{-ap-num} apn @option{-baseaddr} base_address
 Creates a CTI instance @var{cti_name} on the DAP instance @var{dap_name} on MEM-AP
 @var{apn}. The @var{base_address} must match the base address of the CTI
 on the respective MEM-AP. All arguments are mandatory. This creates a
index 2bccf6be73a262f0049599bfe6d23e84e39e053c..31c14597be2598ea73fc049a8b9233ab37852a76 100644 (file)
@@ -1481,12 +1481,14 @@ enum adiv5_cfg_param {
        CFG_DAP,
        CFG_AP_NUM,
        CFG_BASEADDR,
+       CFG_CTIBASE, /* DEPRECATED */
 };
 
 static const Jim_Nvp nvp_config_opts[] = {
        { .name = "-dap",       .value = CFG_DAP },
        { .name = "-ap-num",    .value = CFG_AP_NUM },
        { .name = "-baseaddr",  .value = CFG_BASEADDR },
+       { .name = "-ctibase",   .value = CFG_CTIBASE }, /* DEPRECATED */
        { .name = NULL, .value = -1 }
 };
 
@@ -1505,7 +1507,7 @@ static int adiv5_jim_spot_configure(Jim_GetOptInfo *goi,
                return JIM_CONTINUE;
 
        /* base_p can be NULL, then '-baseaddr' option is treated as unknown */
-       if (!base_p && n->value == CFG_BASEADDR)
+       if (!base_p && (n->value == CFG_BASEADDR || n->value == CFG_CTIBASE))
                return JIM_CONTINUE;
 
        e = Jim_GetOpt_Obj(goi, NULL);
@@ -1564,6 +1566,9 @@ static int adiv5_jim_spot_configure(Jim_GetOptInfo *goi,
                }
                break;
 
+       case CFG_CTIBASE:
+               LOG_WARNING("DEPRECATED! use \'-baseaddr' not \'-ctibase\'");
+               /* fall through */
        case CFG_BASEADDR:
                if (goi->isconfigure) {
                        jim_wide base;
index 579bacb7740c9c540e708588d938aa3e5ac29106..689e9df9fe75bb8bc1a3a0fca099102bf6dac443 100644 (file)
 #include "helper/command.h"
 
 struct arm_cti {
-       target_addr_t base;
-       struct adiv5_ap *ap;
-};
-
-struct arm_cti_object {
        struct list_head lh;
-       struct arm_cti cti;
-       int ap_num;
        char *name;
+       struct adiv5_mem_ap_spot spot;
 };
 
 static LIST_HEAD(all_cti);
 
 const char *arm_cti_name(struct arm_cti *self)
 {
-       struct arm_cti_object *obj = container_of(self, struct arm_cti_object, cti);
-       return obj->name;
+       return self->name;
 }
 
 struct arm_cti *cti_instance_by_jim_obj(Jim_Interp *interp, Jim_Obj *o)
 {
-       struct arm_cti_object *obj = NULL;
+       struct arm_cti *obj = NULL;
        const char *name;
        bool found = false;
 
@@ -66,16 +59,17 @@ struct arm_cti *cti_instance_by_jim_obj(Jim_Interp *interp, Jim_Obj *o)
        }
 
        if (found)
-               return &obj->cti;
+               return obj;
        return NULL;
 }
 
 static int arm_cti_mod_reg_bits(struct arm_cti *self, unsigned int reg, uint32_t mask, uint32_t value)
 {
+       struct adiv5_ap *ap = dap_ap(self->spot.dap, self->spot.ap_num);
        uint32_t tmp;
 
        /* Read register */
-       int retval = mem_ap_read_atomic_u32(self->ap, self->base + reg, &tmp);
+       int retval = mem_ap_read_atomic_u32(ap, self->spot.base + reg, &tmp);
        if (ERROR_OK != retval)
                return retval;
 
@@ -85,26 +79,28 @@ static int arm_cti_mod_reg_bits(struct arm_cti *self, unsigned int reg, uint32_t
        tmp |= value & mask;
 
        /* write new value */
-       return mem_ap_write_atomic_u32(self->ap, self->base + reg, tmp);
+       return mem_ap_write_atomic_u32(ap, self->spot.base + reg, tmp);
 }
 
 int arm_cti_enable(struct arm_cti *self, bool enable)
 {
+       struct adiv5_ap *ap = dap_ap(self->spot.dap, self->spot.ap_num);
        uint32_t val = enable ? 1 : 0;
 
-       return mem_ap_write_atomic_u32(self->ap, self->base + CTI_CTR, val);
+       return mem_ap_write_atomic_u32(ap, self->spot.base + CTI_CTR, val);
 }
 
 int arm_cti_ack_events(struct arm_cti *self, uint32_t event)
 {
+       struct adiv5_ap *ap = dap_ap(self->spot.dap, self->spot.ap_num);
        int retval;
        uint32_t tmp;
 
-       retval = mem_ap_write_atomic_u32(self->ap, self->base + CTI_INACK, event);
+       retval = mem_ap_write_atomic_u32(ap, self->spot.base + CTI_INACK, event);
        if (retval == ERROR_OK) {
                int64_t then = timeval_ms();
                for (;;) {
-                       retval = mem_ap_read_atomic_u32(self->ap, self->base + CTI_TROUT_STATUS, &tmp);
+                       retval = mem_ap_read_atomic_u32(ap, self->spot.base + CTI_TROUT_STATUS, &tmp);
                        if (retval != ERROR_OK)
                                break;
                        if ((tmp & event) == 0)
@@ -138,15 +134,19 @@ int arm_cti_ungate_channel(struct arm_cti *self, uint32_t channel)
 
 int arm_cti_write_reg(struct arm_cti *self, unsigned int reg, uint32_t value)
 {
-       return mem_ap_write_atomic_u32(self->ap, self->base + reg, value);
+       struct adiv5_ap *ap = dap_ap(self->spot.dap, self->spot.ap_num);
+
+       return mem_ap_write_atomic_u32(ap, self->spot.base + reg, value);
 }
 
 int arm_cti_read_reg(struct arm_cti *self, unsigned int reg, uint32_t *p_value)
 {
+       struct adiv5_ap *ap = dap_ap(self->spot.dap, self->spot.ap_num);
+
        if (p_value == NULL)
                return ERROR_COMMAND_ARGUMENT_INVALID;
 
-       return mem_ap_read_atomic_u32(self->ap, self->base + reg, p_value);
+       return mem_ap_read_atomic_u32(ap, self->spot.base + reg, p_value);
 }
 
 int arm_cti_pulse_channel(struct arm_cti *self, uint32_t channel)
@@ -225,7 +225,7 @@ static int cti_find_reg_offset(const char *name)
 
 int arm_cti_cleanup_all(void)
 {
-       struct arm_cti_object *obj, *tmp;
+       struct arm_cti *obj, *tmp;
 
        list_for_each_entry_safe(obj, tmp, &all_cti, lh) {
                free(obj->name);
@@ -237,16 +237,16 @@ int arm_cti_cleanup_all(void)
 
 COMMAND_HANDLER(handle_cti_dump)
 {
-       struct arm_cti_object *obj = CMD_DATA;
-       struct arm_cti *cti = &obj->cti;
+       struct arm_cti *cti = CMD_DATA;
+       struct adiv5_ap *ap = dap_ap(cti->spot.dap, cti->spot.ap_num);
        int retval = ERROR_OK;
 
        for (int i = 0; (retval == ERROR_OK) && (i < (int)ARRAY_SIZE(cti_names)); i++)
-               retval = mem_ap_read_u32(cti->ap,
-                               cti->base + cti_names[i].offset, cti_names[i].p_val);
+               retval = mem_ap_read_u32(ap,
+                               cti->spot.base + cti_names[i].offset, cti_names[i].p_val);
 
        if (retval == ERROR_OK)
-               retval = dap_run(cti->ap->dap);
+               retval = dap_run(ap->dap);
 
        if (retval != ERROR_OK)
                return JIM_ERR;
@@ -260,8 +260,7 @@ COMMAND_HANDLER(handle_cti_dump)
 
 COMMAND_HANDLER(handle_cti_enable)
 {
-       struct arm_cti_object *obj = CMD_DATA;
-       struct arm_cti *cti = &obj->cti;
+       struct arm_cti *cti = CMD_DATA;
        bool on_off;
 
        if (CMD_ARGC != 1)
@@ -274,8 +273,7 @@ COMMAND_HANDLER(handle_cti_enable)
 
 COMMAND_HANDLER(handle_cti_testmode)
 {
-       struct arm_cti_object *obj = CMD_DATA;
-       struct arm_cti *cti = &obj->cti;
+       struct arm_cti *cti = CMD_DATA;
        bool on_off;
 
        if (CMD_ARGC != 1)
@@ -288,8 +286,7 @@ COMMAND_HANDLER(handle_cti_testmode)
 
 COMMAND_HANDLER(handle_cti_write)
 {
-       struct arm_cti_object *obj = CMD_DATA;
-       struct arm_cti *cti = &obj->cti;
+       struct arm_cti *cti = CMD_DATA;
        int offset;
        uint32_t value;
 
@@ -307,8 +304,7 @@ COMMAND_HANDLER(handle_cti_write)
 
 COMMAND_HANDLER(handle_cti_read)
 {
-       struct arm_cti_object *obj = CMD_DATA;
-       struct arm_cti *cti = &obj->cti;
+       struct arm_cti *cti = CMD_DATA;
        int offset;
        int retval;
        uint32_t value;
@@ -331,8 +327,7 @@ COMMAND_HANDLER(handle_cti_read)
 
 COMMAND_HANDLER(handle_cti_ack)
 {
-       struct arm_cti_object *obj = CMD_DATA;
-       struct arm_cti *cti = &obj->cti;
+       struct arm_cti *cti = CMD_DATA;
        uint32_t event;
 
        if (CMD_ARGC != 1)
@@ -351,8 +346,7 @@ COMMAND_HANDLER(handle_cti_ack)
 
 COMMAND_HANDLER(handle_cti_channel)
 {
-       struct arm_cti_object *obj = CMD_DATA;
-       struct arm_cti *cti = &obj->cti;
+       struct arm_cti *cti = CMD_DATA;
        int retval = ERROR_OK;
        uint32_t ch_num;
 
@@ -436,83 +430,26 @@ static const struct command_registration cti_instance_command_handlers[] = {
        COMMAND_REGISTRATION_DONE
 };
 
-enum cti_cfg_param {
-       CFG_DAP,
-       CFG_AP_NUM,
-       CFG_CTIBASE
-};
-
-static const Jim_Nvp nvp_config_opts[] = {
-       { .name = "-dap",     .value = CFG_DAP },
-       { .name = "-ctibase", .value = CFG_CTIBASE },
-       { .name = "-ap-num",  .value = CFG_AP_NUM },
-       { .name = NULL, .value = -1 }
-};
-
-static int cti_configure(Jim_GetOptInfo *goi, struct arm_cti_object *cti)
+static int cti_configure(Jim_GetOptInfo *goi, struct arm_cti *cti)
 {
-       struct adiv5_dap *dap = NULL;
-       Jim_Nvp *n;
-       jim_wide w;
-       int e;
-
        /* parse config or cget options ... */
        while (goi->argc > 0) {
-               Jim_SetEmptyResult(goi->interp);
-
-               e = Jim_GetOpt_Nvp(goi, nvp_config_opts, &n);
-               if (e != JIM_OK) {
-                       Jim_GetOpt_NvpUnknown(goi, nvp_config_opts, 0);
+               int e = adiv5_jim_mem_ap_spot_configure(&cti->spot, goi);
+               if (e != JIM_OK)
                        return e;
-               }
-               switch (n->value) {
-               case CFG_DAP: {
-                       Jim_Obj *o_t;
-                       e = Jim_GetOpt_Obj(goi, &o_t);
-                       if (e != JIM_OK)
-                               return e;
-                       dap = dap_instance_by_jim_obj(goi->interp, o_t);
-                       if (dap == NULL) {
-                               Jim_SetResultString(goi->interp, "-dap is invalid", -1);
-                               return JIM_ERR;
-                       }
-                       /* loop for more */
-                       break;
-               }
-               case CFG_CTIBASE:
-                       e = Jim_GetOpt_Wide(goi, &w);
-                       if (e != JIM_OK)
-                               return e;
-                       cti->cti.base = (uint32_t)w;
-                       /* loop for more */
-                       break;
-
-               case CFG_AP_NUM:
-                       e = Jim_GetOpt_Wide(goi, &w);
-                       if (e != JIM_OK)
-                               return e;
-                       if (w < 0 || w > DP_APSEL_MAX) {
-                               Jim_SetResultString(goi->interp, "-ap-num is invalid", -1);
-                               return JIM_ERR;
-                       }
-                       cti->ap_num = (uint32_t)w;
-               }
        }
 
-       if (dap == NULL) {
+       if (!cti->spot.dap) {
                Jim_SetResultString(goi->interp, "-dap required when creating CTI", -1);
                return JIM_ERR;
        }
 
-       cti->cti.ap = dap_ap(dap, cti->ap_num);
-
        return JIM_OK;
 }
-
 static int cti_create(Jim_GetOptInfo *goi)
 {
        struct command_context *cmd_ctx;
-       static struct arm_cti_object *cti;
+       static struct arm_cti *cti;
        Jim_Obj *new_cmd;
        Jim_Cmd *cmd;
        const char *cp;
@@ -536,10 +473,14 @@ static int cti_create(Jim_GetOptInfo *goi)
        }
 
        /* Create it */
-       cti = calloc(1, sizeof(struct arm_cti_object));
+       cti = calloc(1, sizeof(*cti));
        if (cti == NULL)
                return JIM_ERR;
 
+       adiv5_mem_ap_spot_init(&cti->spot);
+
+       /* Do the rest as "configure" options */
+       goi->isconfigure = 1;
        e = cti_configure(goi, cti);
        if (e != JIM_OK) {
                free(cti);
@@ -593,7 +534,7 @@ static int jim_cti_create(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
 static int jim_cti_names(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 {
-       struct arm_cti_object *obj;
+       struct arm_cti *obj;
 
        if (argc != 1) {
                Jim_WrongNumArgs(interp, 1, argv, "Too many parameters");

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)