summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Hughes <tomhughes@chromium.org>2020-01-31 14:33:07 -0800
committerCommit Bot <commit-bot@chromium.org>2020-02-28 03:43:51 +0000
commit65a9ccd061dd23cd6e39c3f3987b398a8ca43997 (patch)
tree3b52a659d30367f4885fdac1a788b77c0054bb31
parent78d1ed61d6b7d3e3af631f4c9b17af340e6f7c05 (diff)
downloadchrome-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.c67
-rw-r--r--include/ec_commands.h20
-rw-r--r--util/ectool.c80
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},