target: add generic Xtensa LX support
[fw/openocd] / src / target / espressif / esp_xtensa_smp.c
index 6060662475d64976b4e2f0d1d36936f610fa707a..b109f3c5e9bad54108d2f7ee8ebd49c748c7d29b 100644 (file)
@@ -450,11 +450,10 @@ int esp_xtensa_smp_watchpoint_remove(struct target *target, struct watchpoint *w
 
 int esp_xtensa_smp_init_arch_info(struct target *target,
        struct esp_xtensa_smp_common *esp_xtensa_smp,
-       const struct xtensa_config *xtensa_cfg,
        struct xtensa_debug_module_config *dm_cfg,
        const struct esp_xtensa_smp_chip_ops *chip_ops)
 {
-       int ret = esp_xtensa_init_arch_info(target, &esp_xtensa_smp->esp_xtensa, xtensa_cfg, dm_cfg);
+       int ret = esp_xtensa_init_arch_info(target, &esp_xtensa_smp->esp_xtensa, dm_cfg);
        if (ret != ERROR_OK)
                return ret;
        esp_xtensa_smp->chip_ops = chip_ops;
@@ -467,6 +466,139 @@ int esp_xtensa_smp_target_init(struct command_context *cmd_ctx, struct target *t
        return esp_xtensa_target_init(cmd_ctx, target);
 }
 
+COMMAND_HANDLER(esp_xtensa_smp_cmd_xtdef)
+{
+       struct target *target = get_current_target(CMD_CTX);
+       if (target->smp && CMD_ARGC > 0) {
+               struct target_list *head;
+               struct target *curr;
+               foreach_smp_target(head, target->smp_targets) {
+                       curr = head->target;
+                       int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtdef_do,
+                               target_to_xtensa(curr));
+                       if (ret != ERROR_OK)
+                               return ret;
+               }
+               return ERROR_OK;
+       }
+       return CALL_COMMAND_HANDLER(xtensa_cmd_xtdef_do,
+               target_to_xtensa(target));
+}
+
+COMMAND_HANDLER(esp_xtensa_smp_cmd_xtopt)
+{
+       struct target *target = get_current_target(CMD_CTX);
+       if (target->smp && CMD_ARGC > 0) {
+               struct target_list *head;
+               struct target *curr;
+               foreach_smp_target(head, target->smp_targets) {
+                       curr = head->target;
+                       int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtopt_do,
+                               target_to_xtensa(curr));
+                       if (ret != ERROR_OK)
+                               return ret;
+               }
+               return ERROR_OK;
+       }
+       return CALL_COMMAND_HANDLER(xtensa_cmd_xtopt_do,
+               target_to_xtensa(target));
+}
+
+COMMAND_HANDLER(esp_xtensa_smp_cmd_xtmem)
+{
+       struct target *target = get_current_target(CMD_CTX);
+       if (target->smp && CMD_ARGC > 0) {
+               struct target_list *head;
+               struct target *curr;
+               foreach_smp_target(head, target->smp_targets) {
+                       curr = head->target;
+                       int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtmem_do,
+                               target_to_xtensa(curr));
+                       if (ret != ERROR_OK)
+                               return ret;
+               }
+               return ERROR_OK;
+       }
+       return CALL_COMMAND_HANDLER(xtensa_cmd_xtmem_do,
+               target_to_xtensa(target));
+}
+
+COMMAND_HANDLER(esp_xtensa_smp_cmd_xtmpu)
+{
+       struct target *target = get_current_target(CMD_CTX);
+       if (target->smp && CMD_ARGC > 0) {
+               struct target_list *head;
+               struct target *curr;
+               foreach_smp_target(head, target->smp_targets) {
+                       curr = head->target;
+                       int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtmpu_do,
+                               target_to_xtensa(curr));
+                       if (ret != ERROR_OK)
+                               return ret;
+               }
+               return ERROR_OK;
+       }
+       return CALL_COMMAND_HANDLER(xtensa_cmd_xtmpu_do,
+               target_to_xtensa(target));
+}
+
+COMMAND_HANDLER(esp_xtensa_smp_cmd_xtmmu)
+{
+       struct target *target = get_current_target(CMD_CTX);
+       if (target->smp && CMD_ARGC > 0) {
+               struct target_list *head;
+               struct target *curr;
+               foreach_smp_target(head, target->smp_targets) {
+                       curr = head->target;
+                       int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtmmu_do,
+                               target_to_xtensa(curr));
+                       if (ret != ERROR_OK)
+                               return ret;
+               }
+               return ERROR_OK;
+       }
+       return CALL_COMMAND_HANDLER(xtensa_cmd_xtmmu_do,
+               target_to_xtensa(target));
+}
+
+COMMAND_HANDLER(esp_xtensa_smp_cmd_xtreg)
+{
+       struct target *target = get_current_target(CMD_CTX);
+       if (target->smp && CMD_ARGC > 0) {
+               struct target_list *head;
+               struct target *curr;
+               foreach_smp_target(head, target->smp_targets) {
+                       curr = head->target;
+                       int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtreg_do,
+                               target_to_xtensa(curr));
+                       if (ret != ERROR_OK)
+                               return ret;
+               }
+               return ERROR_OK;
+       }
+       return CALL_COMMAND_HANDLER(xtensa_cmd_xtreg_do,
+               target_to_xtensa(target));
+}
+
+COMMAND_HANDLER(esp_xtensa_smp_cmd_xtregfmt)
+{
+       struct target *target = get_current_target(CMD_CTX);
+       if (target->smp && CMD_ARGC > 0) {
+               struct target_list *head;
+               struct target *curr;
+               foreach_smp_target(head, target->smp_targets) {
+                       curr = head->target;
+                       int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtregfmt_do,
+                               target_to_xtensa(curr));
+                       if (ret != ERROR_OK)
+                               return ret;
+               }
+               return ERROR_OK;
+       }
+       return CALL_COMMAND_HANDLER(xtensa_cmd_xtregfmt_do,
+               target_to_xtensa(target));
+}
+
 COMMAND_HANDLER(esp_xtensa_smp_cmd_permissive_mode)
 {
        struct target *target = get_current_target(CMD_CTX);
@@ -632,6 +764,62 @@ COMMAND_HANDLER(esp_xtensa_smp_cmd_tracedump)
 }
 
 const struct command_registration esp_xtensa_smp_xtensa_command_handlers[] = {
+       {
+               .name = "xtdef",
+               .handler = esp_xtensa_smp_cmd_xtdef,
+               .mode = COMMAND_CONFIG,
+               .help = "Configure Xtensa core type",
+               .usage = "<type>",
+       },
+       {
+               .name = "xtopt",
+               .handler = esp_xtensa_smp_cmd_xtopt,
+               .mode = COMMAND_CONFIG,
+               .help = "Configure Xtensa core option",
+               .usage = "<name> <value>",
+       },
+       {
+               .name = "xtmem",
+               .handler = esp_xtensa_smp_cmd_xtmem,
+               .mode = COMMAND_CONFIG,
+               .help = "Configure Xtensa memory/cache option",
+               .usage = "<type> [parameters]",
+       },
+       {
+               .name = "xtmmu",
+               .handler = esp_xtensa_smp_cmd_xtmmu,
+               .mode = COMMAND_CONFIG,
+               .help = "Configure Xtensa MMU option",
+               .usage = "<NIREFILLENTRIES> <NDREFILLENTRIES> <IVARWAY56> <DVARWAY56>",
+       },
+       {
+               .name = "xtmpu",
+               .handler = esp_xtensa_smp_cmd_xtmpu,
+               .mode = COMMAND_CONFIG,
+               .help = "Configure Xtensa MPU option",
+               .usage = "<num FG seg> <min seg size> <lockable> <executeonly>",
+       },
+       {
+               .name = "xtreg",
+               .handler = esp_xtensa_smp_cmd_xtreg,
+               .mode = COMMAND_CONFIG,
+               .help = "Configure Xtensa register",
+               .usage = "<regname> <regnum>",
+       },
+       {
+               .name = "xtregs",
+               .handler = esp_xtensa_smp_cmd_xtreg,
+               .mode = COMMAND_CONFIG,
+               .help = "Configure number of Xtensa registers",
+               .usage = "<numregs>",
+       },
+       {
+               .name = "xtregfmt",
+               .handler = esp_xtensa_smp_cmd_xtregfmt,
+               .mode = COMMAND_CONFIG,
+               .help = "Configure format of Xtensa register map",
+               .usage = "<numgregs>",
+       },
        {
                .name = "set_permissive",
                .handler = esp_xtensa_smp_cmd_permissive_mode,