diff options
author | Tom Hughes <tomhughes@chromium.org> | 2020-01-31 14:33:07 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-02-28 03:43:51 +0000 |
commit | 65a9ccd061dd23cd6e39c3f3987b398a8ca43997 (patch) | |
tree | 3b52a659d30367f4885fdac1a788b77c0054bb31 | |
parent | 78d1ed61d6b7d3e3af631f4c9b17af340e6f7c05 (diff) | |
download | chrome-ec-65a9ccd061dd23cd6e39c3f3987b398a8ca43997.tar.gz |
common/system: Add sysinfo host command
This command is useful to use during testing to verify the state of the
system (e.g., locked/unlocked, currently running image, etc.).
BRANCH=none
BUG=b:146447208
TEST=make buildall -j
TEST=ectool --name=cros_fp sysinfo
TEST=ectool --name=cros_fp sysinfo flags
TEST=ectool --name=cros_fp sysinfo reset_flags
TEST=ectool --name=cros_fp sysinfo firmware_copy
Change-Id: I714b6bd8c0d7192386404c25a831e38438fa5238
Signed-off-by: Tom Hughes <tomhughes@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2047032
Reviewed-by: Ting Shen <phoenixshen@chromium.org>
-rw-r--r-- | common/system.c | 67 | ||||
-rw-r--r-- | include/ec_commands.h | 20 | ||||
-rw-r--r-- | util/ectool.c | 80 |
3 files changed, 158 insertions, 9 deletions
diff --git a/common/system.c b/common/system.c index b2416c5a65..fa7eccabd5 100644 --- a/common/system.c +++ b/common/system.c @@ -907,36 +907,85 @@ static void system_common_shutdown(void) DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, system_common_shutdown, HOOK_PRIO_DEFAULT); /*****************************************************************************/ -/* Console commands */ +/* Console and Host Commands */ #ifdef CONFIG_CMD_SYSINFO +static int sysinfo(struct ec_response_sysinfo *info) +{ + memset(info, 0, sizeof(*info)); + + info->reset_flags = system_get_reset_flags(); + + info->current_image = system_get_image_copy(); + + if (system_jumped_to_this_image()) + info->flags |= SYSTEM_JUMPED_TO_CURRENT_IMAGE; + + if (system_is_locked()) { + info->flags |= SYSTEM_IS_LOCKED; + if (force_locked) + info->flags |= SYSTEM_IS_FORCE_LOCKED; + if (!disable_jump) + info->flags |= SYSTEM_JUMP_ENABLED; + } + + if (reboot_at_shutdown) + info->flags |= SYSTEM_REBOOT_AT_SHUTDOWN; + + return EC_SUCCESS; +} + static int command_sysinfo(int argc, char **argv) { - ccprintf("Reset flags: 0x%08x (", system_get_reset_flags()); + struct ec_response_sysinfo info; + int rv; + + rv = sysinfo(&info); + if (rv != EC_SUCCESS) + return rv; + + ccprintf("Reset flags: 0x%08x (", info.reset_flags); system_print_reset_flags(); ccprintf(")\n"); - ccprintf("Copy: %s\n", system_get_image_copy_string()); - ccprintf("Jumped: %s\n", system_jumped_to_this_image() ? "yes" : "no"); + ccprintf("Copy: %s\n", ec_image_to_string(info.current_image)); + ccprintf("Jumped: %s\n", + (info.flags & SYSTEM_JUMPED_TO_CURRENT_IMAGE) ? "yes" : "no"); ccputs("Flags: "); - if (system_is_locked()) { + if (info.flags & SYSTEM_IS_LOCKED) { ccputs(" locked"); - if (force_locked) + if (info.flags & SYSTEM_IS_FORCE_LOCKED) ccputs(" (forced)"); - if (disable_jump) + if (!(info.flags & SYSTEM_JUMP_ENABLED)) ccputs(" jump-disabled"); } else ccputs(" unlocked"); ccputs("\n"); - if (reboot_at_shutdown) - ccprintf("Reboot at shutdown: %d\n", reboot_at_shutdown); + if (info.flags & SYSTEM_REBOOT_AT_SHUTDOWN) + ccprintf("Reboot at shutdown: %d\n", + !!(info.flags & SYSTEM_REBOOT_AT_SHUTDOWN)); return EC_SUCCESS; } DECLARE_SAFE_CONSOLE_COMMAND(sysinfo, command_sysinfo, NULL, "Print system info"); + +static enum ec_status host_command_sysinfo(struct host_cmd_handler_args *args) +{ + struct ec_response_sysinfo *r = args->response; + + if (sysinfo(r) != EC_SUCCESS) + return EC_RES_ERROR; + + args->response_size = sizeof(*r); + + return EC_RES_SUCCESS; +} + +DECLARE_HOST_COMMAND(EC_CMD_SYSINFO, host_command_sysinfo, + EC_VER_MASK(EC_VER_SYSINFO)); #endif #ifdef CONFIG_CMD_SCRATCHPAD diff --git a/include/ec_commands.h b/include/ec_commands.h index 7e3c784e49..d68b7b6146 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -1839,6 +1839,26 @@ struct ec_response_rwsig_info { BUILD_ASSERT(sizeof(struct ec_response_rwsig_info) == 32); +/** + * Get information about the system, such as reset flags, locked state, etc. + */ +#define EC_CMD_SYSINFO 0x001C +#define EC_VER_SYSINFO 0 + +enum sysinfo_flags { + SYSTEM_IS_LOCKED = BIT(0), + SYSTEM_IS_FORCE_LOCKED = BIT(1), + SYSTEM_JUMP_ENABLED = BIT(2), + SYSTEM_JUMPED_TO_CURRENT_IMAGE = BIT(3), + SYSTEM_REBOOT_AT_SHUTDOWN = BIT(4) +}; + +struct ec_response_sysinfo { + uint32_t reset_flags; /**< EC_RESET_FLAG_* flags */ + uint32_t current_image; /**< enum ec_current_image */ + uint32_t flags; /**< enum sysinfo_flags */ +} __ec_align4; + /*****************************************************************************/ /* PWM commands */ diff --git a/util/ectool.c b/util/ectool.c index bf7f11ce65..97e44779fe 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -283,6 +283,8 @@ const char help_str[] = " Serial output test for COM2\n" " stress [reboot] [help]\n" " Stress test the ec host command interface.\n" + " sysinfo [flags|reset_flags|firmware_copy]\n" + " Display system info.\n" " switches\n" " Prints current EC switch positions\n" " temps <sensorid>\n" @@ -1637,6 +1639,83 @@ int cmd_rwsig(int argc, char **argv) return -1; } +enum sysinfo_fields { + SYSINFO_FIELD_RESET_FLAGS = BIT(0), + SYSINFO_FIELD_CURRENT_IMAGE = BIT(1), + SYSINFO_FIELD_FLAGS = BIT(2), + SYSINFO_INFO_FIELD_ALL = SYSINFO_FIELD_RESET_FLAGS | + SYSINFO_FIELD_CURRENT_IMAGE | + SYSINFO_FIELD_FLAGS +}; + +static int sysinfo(struct ec_response_sysinfo *info) +{ + struct ec_response_sysinfo r; + int rv; + + rv = ec_command(EC_CMD_SYSINFO, 0, NULL, 0, &r, sizeof(r)); + if (rv < 0) { + fprintf(stderr, "ERROR: EC_CMD_SYSINFO failed: %d\n", rv); + return rv; + } + + return 0; +} + +int cmd_sysinfo(int argc, char **argv) +{ + struct ec_response_sysinfo r; + enum sysinfo_fields fields = 0; + bool print_prefix = false; + + if (argc != 1 && argc != 2) + goto sysinfo_error_usage; + + if (argc == 1) { + fields = SYSINFO_INFO_FIELD_ALL; + print_prefix = true; + } else if (argc == 2) { + if (strcmp(argv[1], "flags") == 0) + fields = SYSINFO_FIELD_FLAGS; + else if (strcmp(argv[1], "reset_flags") == 0) + fields = SYSINFO_FIELD_RESET_FLAGS; + else if (strcmp(argv[1], "firmware_copy") == 0) + fields = SYSINFO_FIELD_CURRENT_IMAGE; + else + goto sysinfo_error_usage; + } + + if (sysinfo(&r) != 0) + return -1; + + if (fields & SYSINFO_FIELD_RESET_FLAGS) { + if (print_prefix) + printf("Reset flags: "); + printf("0x%08x\n", r.reset_flags); + } + + if (fields & SYSINFO_FIELD_FLAGS) { + if (print_prefix) + printf("Flags: "); + printf("0x%08x\n", r.flags); + + } + + if (fields & SYSINFO_FIELD_CURRENT_IMAGE) { + if (print_prefix) + printf("Firmware copy: "); + printf("%d\n", r.current_image); + } + + return 0; + +sysinfo_error_usage: + fprintf(stderr, "Usage: %s " + "[flags|reset_flags|firmware_copy]\n", + argv[0]); + return -1; +} + int cmd_rollback_info(int argc, char *argv[]) { struct ec_response_rollback_info r; @@ -9449,6 +9528,7 @@ const struct command commands[] = { {"rwsigstatus", cmd_rwsig_status}, {"sertest", cmd_serial_test}, {"stress", cmd_stress_test}, + {"sysinfo", cmd_sysinfo}, {"port80flood", cmd_port_80_flood}, {"switches", cmd_switches}, {"temps", cmd_temperature}, |