From fa6119dc2cd69e711e9127241c2736e57706321c Mon Sep 17 00:00:00 2001 From: Vadim Bendebury Date: Mon, 11 Nov 2019 13:59:59 -0800 Subject: 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 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1967543 Reviewed-by: Keith Short --- board/cr50/board.c | 13 +++++++++++++ board/cr50/board.h | 3 +++ board/host/board.h | 3 +++ common/nvmem.c | 5 +++-- 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(); -- cgit v1.2.1