summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Bendebury <vbendeb@chromium.org>2019-11-11 13:59:59 -0800
committerCommit Bot <commit-bot@chromium.org>2019-12-13 18:23:42 +0000
commitfa6119dc2cd69e711e9127241c2736e57706321c (patch)
treeaa422da105258d71b0e1bc7ada9751fa5ac0f369
parent420abd92d8a437cde30115405a3fa883c7a7bccd (diff)
downloadchrome-ec-fa6119dc2cd69e711e9127241c2736e57706321c.tar.gz
nvmem: do not waste time looking for legacy NVMEM space
It takes 14.5 ms to decrypt two 12K flash spaces into SRAM, then calculate their hash to see if either one is is a valid NVMEM space. There is no need for this check when the 'other' Cr50 image is newer than {3,4}.18. BRANCH=Cr50, Cr50-mp BUG=b:132665283 TEST=with added instrumentation verified that in case the other slot is occupied by 0.0.22 image, the check takes 14.5 ms, when the other slot is occupied by 0.4.23 image the check takes 8 us. Change-Id: I0414ca3d7e90d343589a21e91319f35479632eff Signed-off-by: Vadim Bendebury <vbendeb@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1967543 Reviewed-by: Keith Short <keithshort@chromium.org>
-rw-r--r--board/cr50/board.c13
-rw-r--r--board/cr50/board.h3
-rw-r--r--board/host/board.h3
-rw-r--r--common/nvmem.c5
4 files changed, 22 insertions, 2 deletions
diff --git a/board/cr50/board.c b/board/cr50/board.c
index ac1e640e47..4eeb21fc23 100644
--- a/board/cr50/board.c
+++ b/board/cr50/board.c
@@ -1718,3 +1718,16 @@ int board_in_prod_mode(void)
{
return in_prod_mode;
}
+
+int board_nvmem_legacy_check_needed(void)
+{
+ enum system_image_copy_t other_rw;
+ const struct SignedHeader *h;
+
+ other_rw = system_get_image_copy() == SYSTEM_IMAGE_RW ?
+ SYSTEM_IMAGE_RW_B : SYSTEM_IMAGE_RW;
+
+ h = (const struct SignedHeader *)get_program_memory_addr(other_rw);
+
+ return (h->major_ <= 2) || (h->minor_ <= 18);
+}
diff --git a/board/cr50/board.h b/board/cr50/board.h
index f85d938b29..5a8c02f453 100644
--- a/board/cr50/board.h
+++ b/board/cr50/board.h
@@ -358,6 +358,9 @@ int ec_is_on(void);
int ec_is_rx_allowed(void);
int servo_is_connected(void);
+/* Moving from legacy versions might require NVMEM transition. */
+int board_nvmem_legacy_check_needed(void);
+
void set_ap_on(void);
/* Returns True if chip is brought up in a factory test harness. */
diff --git a/board/host/board.h b/board/host/board.h
index ac44f31907..ad65749c3d 100644
--- a/board/host/board.h
+++ b/board/host/board.h
@@ -80,4 +80,7 @@ enum {
#define CONFIG_RNG
void fps_event(enum gpio_signal signal);
+/* Let the tests always check the other NVMEM slot. */
+static inline int board_nvmem_legacy_check_needed(void){ return 1; }
+
#endif /* __CROS_EC_BOARD_H */
diff --git a/common/nvmem.c b/common/nvmem.c
index 4b4d8fc590..42fc0ba161 100644
--- a/common/nvmem.c
+++ b/common/nvmem.c
@@ -4,10 +4,10 @@
*/
#include "common.h"
+#include "board.h"
#include "console.h"
#include "dcrypto.h"
#include "flash.h"
-#include "nvmem.h"
#include "new_nvmem.h"
#include "task.h"
#include "timer.h"
@@ -313,7 +313,8 @@ int nvmem_init(void)
* Try discovering legacy partition(s). If even one is present, need
* to migrate to the new nvmem storage scheme.
*/
- if (nvmem_find_partition() == EC_SUCCESS)
+ if (board_nvmem_legacy_check_needed() &&
+ (nvmem_find_partition() == EC_SUCCESS))
ret = new_nvmem_migrate(nvmem_act_partition);
else
ret = new_nvmem_init();