summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChe-Liang Chiou <clchiou@chromium.org>2012-06-22 18:18:17 +0800
committerGerrit <chrome-bot@google.com>2012-09-05 16:00:28 -0700
commit8a9471e5ef305a2aea81e6cb62a17d6966865b6b (patch)
tree73f9deda68cd4e76d646a6c2ba15aa0bd8913622
parent696b908f53a9d33bc9ce1a676ee646f45d489ee5 (diff)
downloadchrome-ec-8a9471e5ef305a2aea81e6cb62a17d6966865b6b.tar.gz
stm32: Store VbNvContext in backup registers
This would improve boot speed when compared to storing in eMMC because initialing eMMC is slow. So far other platforms do not have this need because CMOS is quite efficient; thus it is left unimplemented in lm4. Signed-off-by: Che-Liang Chiou <clchiou@chromium.org> BRANCH=snow BUG=chrome-os-partner:10660,13094 TEST=On Snow, see VbNvContext is preserved across power cycles (you have to patch U-Boot to test this) Change-Id: If5072c678b87bc47a3a82a1dff2afa3896304f36 Reviewed-on: https://gerrit.chromium.org/gerrit/31832 Tested-by: Che-Liang Chiou <clchiou@chromium.org> Reviewed-by: Simon Glass <sjg@chromium.org> Reviewed-by: Randall Spangler <rspangler@chromium.org> Commit-Ready: Che-Liang Chiou <clchiou@chromium.org>
-rw-r--r--chip/lm4/system.c10
-rw-r--r--chip/stm32/system.c43
-rw-r--r--common/system_common.c26
-rw-r--r--include/ec_commands.h18
-rw-r--r--include/system.h10
5 files changed, 107 insertions, 0 deletions
diff --git a/chip/lm4/system.c b/chip/lm4/system.c
index 6046f15d4c..2c970ee125 100644
--- a/chip/lm4/system.c
+++ b/chip/lm4/system.c
@@ -396,6 +396,16 @@ const char *system_get_chip_name(void)
}
}
+int system_get_vbnvcontext(uint8_t *block)
+{
+ return EC_ERROR_UNIMPLEMENTED;
+}
+
+int system_set_vbnvcontext(const uint8_t *block)
+{
+ return EC_ERROR_UNIMPLEMENTED;
+}
+
const char *system_get_chip_revision(void)
{
static char rev[3];
diff --git a/chip/stm32/system.c b/chip/stm32/system.c
index f5f7dff73d..df10f6810a 100644
--- a/chip/stm32/system.c
+++ b/chip/stm32/system.c
@@ -19,6 +19,14 @@
enum bkpdata_index {
BKPDATA_INDEX_SCRATCHPAD, /* General-purpose scratchpad */
BKPDATA_INDEX_SAVED_RESET_FLAGS,/* Saved reset flags */
+ BKPDATA_INDEX_VBNV_CONTEXT0,
+ BKPDATA_INDEX_VBNV_CONTEXT1,
+ BKPDATA_INDEX_VBNV_CONTEXT2,
+ BKPDATA_INDEX_VBNV_CONTEXT3,
+ BKPDATA_INDEX_VBNV_CONTEXT4,
+ BKPDATA_INDEX_VBNV_CONTEXT5,
+ BKPDATA_INDEX_VBNV_CONTEXT6,
+ BKPDATA_INDEX_VBNV_CONTEXT7,
};
@@ -217,6 +225,41 @@ const char *system_get_chip_revision(void)
}
+int system_get_vbnvcontext(uint8_t *block)
+{
+ enum bkpdata_index i;
+ uint16_t value;
+
+ for (i = BKPDATA_INDEX_VBNV_CONTEXT0;
+ i <= BKPDATA_INDEX_VBNV_CONTEXT7; i++) {
+ value = bkpdata_read(i);
+ *block++ = (uint8_t)(value & 0xff);
+ *block++ = (uint8_t)(value >> 8);
+ }
+
+ return EC_SUCCESS;
+}
+
+
+int system_set_vbnvcontext(const uint8_t *block)
+{
+ enum bkpdata_index i;
+ uint16_t value;
+ int err;
+
+ for (i = BKPDATA_INDEX_VBNV_CONTEXT0;
+ i <= BKPDATA_INDEX_VBNV_CONTEXT7; i++) {
+ value = *block++;
+ value |= ((uint16_t)*block++) << 8;
+ err = bkpdata_write(i, value);
+ if (err)
+ return err;
+ }
+
+ return EC_SUCCESS;
+}
+
+
/* TODO: crosbug.com/p/12036 */
int system_set_fake_wp(int val)
{
diff --git a/common/system_common.c b/common/system_common.c
index 772d932748..e88a377b63 100644
--- a/common/system_common.c
+++ b/common/system_common.c
@@ -816,6 +816,32 @@ DECLARE_HOST_COMMAND(EC_CMD_GET_BOARD_VERSION,
host_command_get_board_version,
EC_VER_MASK(0));
+int host_command_vbnvcontext(struct host_cmd_handler_args *args)
+{
+ const struct ec_params_vbnvcontext *p = args->params;
+ struct ec_response_vbnvcontext *r;
+
+ switch (p->op) {
+ case EC_VBNV_CONTEXT_OP_READ:
+ r = args->response;
+ if (system_get_vbnvcontext(r->block))
+ return EC_RES_ERROR;
+ args->response_size = sizeof(*r);
+ break;
+ case EC_VBNV_CONTEXT_OP_WRITE:
+ if (system_set_vbnvcontext(p->block))
+ return EC_RES_ERROR;
+ break;
+ default:
+ return EC_RES_ERROR;
+ }
+
+ return EC_RES_SUCCESS;
+}
+DECLARE_HOST_COMMAND(EC_CMD_VBNV_CONTEXT,
+ host_command_vbnvcontext,
+ EC_VER_MASK(EC_VER_VBNV_CONTEXT));
+
int host_command_reboot(struct host_cmd_handler_args *args)
{
struct ec_params_reboot_ec p;
diff --git a/include/ec_commands.h b/include/ec_commands.h
index b74da5e4cd..f9ee74e86e 100644
--- a/include/ec_commands.h
+++ b/include/ec_commands.h
@@ -553,6 +553,24 @@ struct ec_response_flash_region_info {
uint32_t size;
} __packed;
+/* Read/write VbNvContext */
+#define EC_CMD_VBNV_CONTEXT 0x17
+#define EC_VER_VBNV_CONTEXT 1
+#define EC_VBNV_BLOCK_SIZE 16
+
+enum ec_vbnvcontext_op {
+ EC_VBNV_CONTEXT_OP_READ,
+ EC_VBNV_CONTEXT_OP_WRITE,
+};
+
+struct ec_params_vbnvcontext {
+ uint32_t op;
+ uint8_t block[EC_VBNV_BLOCK_SIZE];
+} __packed;
+
+struct ec_response_vbnvcontext {
+ uint8_t block[EC_VBNV_BLOCK_SIZE];
+} __packed;
/*****************************************************************************/
/* PWM commands */
diff --git a/include/system.h b/include/system.h
index f3d5b035d6..1385c4d006 100644
--- a/include/system.h
+++ b/include/system.h
@@ -173,6 +173,16 @@ const char *system_get_chip_name(void);
const char *system_get_chip_revision(void);
/**
+ * Get/Set VbNvContext in non-volatile storage. The block should be 16 bytes
+ * long, which is the current size of VbNvContext block.
+ *
+ * @param block Pointer to a buffer holding VbNvContext.
+ * @return 0 on success, !0 on error.
+ */
+int system_get_vbnvcontext(uint8_t *block);
+int system_set_vbnvcontext(const uint8_t *block);
+
+/**
* Put the EC in hibernate (lowest EC power state).
*
* @param seconds Number of seconds to hibernate.