summaryrefslogtreecommitdiff
path: root/src/soc
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2014-01-13 11:34:51 -0600
committerKyösti Mälkki <kyosti.malkki@gmail.com>2014-05-15 05:05:09 +0200
commit931e59074556988dfc4a2f32fe7fa7874a4e064e (patch)
tree9f1e14447c019165c66a450f5811383f836cbe8a /src/soc
parent58d6e18f0c963832ebfc3ad1aad48cfe1d65fd8a (diff)
downloadcoreboot-931e59074556988dfc4a2f32fe7fa7874a4e064e.tar.xz
baytrail: mrc_cache: check region erased before erasing
On a firmware update the MRC cache is destroyed. On the subsequent boot the MRC region was attempted to be erased even if it was already erased. This led to spi part taking longer than it should have for an unnecessary erase operation. Therefore, check that the region is erased before issuing the erease command. BUG=chrome-os-partner:24916 BRANCH=baytrail TEST=Booted after chromeos-firmeareupdate. Noted no error messages in this path. Change-Id: I6fadeb6bc5fc178abb0a7e3f0898855e481add2e Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/182153 Reviewed-by: Duncan Laurie <dlaurie@chromium.org> Reviewed-on: http://review.coreboot.org/5043 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
Diffstat (limited to 'src/soc')
-rw-r--r--src/soc/intel/baytrail/mrc_cache.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/soc/intel/baytrail/mrc_cache.c b/src/soc/intel/baytrail/mrc_cache.c
index 5613761ce5..ae0afe7f7f 100644
--- a/src/soc/intel/baytrail/mrc_cache.c
+++ b/src/soc/intel/baytrail/mrc_cache.c
@@ -275,9 +275,12 @@ static void update_mrc_cache(void *unused)
next_slot = mrc_cache_next_slot(&region, current_saved);
if (!mrc_slot_valid(&region, next_slot, current_boot)) {
- if (nvm_erase(region.base, region.size) < 0) {
- printk(BIOS_DEBUG, "Could not erase MRC region.\n");
- return;
+ printk(BIOS_DEBUG, "Slot @ %p is invalid.\n", next_slot);
+ if (!nvm_is_erased(region.base, region.size)) {
+ if (nvm_erase(region.base, region.size) < 0) {
+ printk(BIOS_DEBUG, "Failure erasing region.\n");
+ return;
+ }
}
next_slot = region.base;
}