target: add check_reset hook
authorØyvind Harboe <oyvind.harboe@zylin.com>
Mon, 11 Jan 2010 14:28:18 +0000 (15:28 +0100)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Wed, 13 Jan 2010 11:00:02 +0000 (12:00 +0100)
Allow targets to run checks post reset. Used to check
that e.g. DCC downloads have been enabled.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
src/target/target.c
src/target/target.h
src/target/target_type.h

index 7994affa586b84d887e3379a2f924ee7d1170a67..c56265c1d1e8c200adcc43366c46dd1e5b32b4b6 100644 (file)
@@ -477,6 +477,11 @@ int target_process_reset(struct command_context *cmd_ctx, enum target_reset_mode
        /* We want any events to be processed before the prompt */
        retval = target_call_timer_callbacks_now();
 
+       struct target *target;
+       for (target = all_targets; target; target = target->next) {
+               target->type->check_reset(target);
+       }
+
        return retval;
 }
 
@@ -499,6 +504,12 @@ static int default_examine(struct target *target)
        return ERROR_OK;
 }
 
+/* no check by default */
+static int default_check_reset(struct target *target)
+{
+       return ERROR_OK;
+}
+
 int target_examine_one(struct target *target)
 {
        return target->type->examine(target);
@@ -708,6 +719,9 @@ static int target_init_one(struct command_context *cmd_ctx,
        if (type->examine == NULL)
                type->examine = default_examine;
 
+       if (type->check_reset== NULL)
+               type->check_reset = default_check_reset;
+
        int retval = type->init_target(cmd_ctx, target);
        if (ERROR_OK != retval)
        {
@@ -4887,6 +4901,20 @@ int target_register_commands(struct command_context *cmd_ctx)
        return register_commands(cmd_ctx, NULL, target_command_handlers);
 }
 
+static bool target_reset_nag = true;
+
+bool get_target_reset_nag(void)
+{
+       return target_reset_nag;
+}
+
+COMMAND_HANDLER(handle_target_reset_nag)
+{
+       return CALL_COMMAND_HANDLER(handle_command_parse_bool,
+                       &target_reset_nag, "Nag after each reset about options to improve "
+                       "performance");
+}
+
 static const struct command_registration target_exec_command_handlers[] = {
        {
                .name = "fast_load_image",
@@ -5088,6 +5116,14 @@ static const struct command_registration target_exec_command_handlers[] = {
                        "and write the 8/16/32 bit values",
                .usage = "arrayname bitwidth address count",
        },
+       {
+               .name = "reset_nag",
+               .handler = handle_target_reset_nag,
+               .mode = COMMAND_ANY,
+               .help = "Nag after each reset about options that could have been "
+                               "enabled to improve performance. ",
+               .usage = "['enable'|'disable']",
+       },
        COMMAND_REGISTRATION_DONE
 };
 int target_register_user_commands(struct command_context *cmd_ctx)
index 4151c228b6b0479b9cdb1ea0c835803bac38bbd1..da91d464c8db02346a3225ead10b54e405b2cd38 100644 (file)
@@ -2,7 +2,7 @@
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
- *   Copyright (C) 2007,2008,2009 Øyvind Harboe                            *
+ *   Copyright (C) 2007-9 Øyvind Harboe                                    *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   Copyright (C) 2008 by Spencer Oliver                                  *
@@ -483,4 +483,6 @@ void target_all_handle_event(enum target_event e);
 
 const char *target_strerror_safe(int err);
 
+extern bool get_target_reset_nag(void);
+
 #endif /* TARGET_H */
index 67041b31625a68e2a605d3e90ef09fedf2e99eed..70eb96253754a457879b13806ce99e1aade98c9b 100644 (file)
@@ -213,6 +213,13 @@ struct target_type
 
        int (*mmu)(struct target *target, int *enabled);
 
+       /* after reset is complete, the target can check if things are properly set up.
+        *
+        * This can be used to check if e.g. DCC memory writes have been enabled for
+        * arm7/9 targets, which they really should except in the most contrived
+        * circumstances.
+        */
+       int (*check_reset)(struct target *target);
 };
 
 #endif // TARGET_TYPE_H