diff options
author | Daisuke Nojiri <dnojiri@chromium.org> | 2015-09-04 14:32:49 -0700 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2015-09-17 14:14:58 +0000 |
commit | 914a21ed9ceb403b178c30bedbc354e816b98e92 (patch) | |
tree | f66751ebc99bff39dcd026106549db7cd0227e56 /src | |
parent | 4a69562d01cc4fc716dcf25500d1de2b7ddb3ee5 (diff) |
vbnv: check alignment of nvram in advance
Currently, erase operation only works if the region is sector-aligned.
These asserts ensure we can erase the region when it's all used up.
Erase operation can be updated to handle unaligned erases by read,
update, write-back cycle. However, these asserts will still remain useful
in case the adjacent region contains critical data and mis-updating it
can cause a critical failure.
Additionaly we should write a FAFT test but it's more reliable to catch
it here since FAFT can fail in many ways.
BUG=none
BRANCH=master
TEST=tested on samus using misaligned nvram region
Change-Id: I3add4671ed354d9763e21bf96616c8aeca0cb777
Signed-off-by: Patrick Georgi <pgeorgi@chromium.org>
Original-Commit-Id: fc001a4d3446cf96b76367dde492c3453aa948c6
Original-Change-Id: Ib4df8f620bf7531b345364fa4c3e274aba09f677
Original-Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/297801
Reviewed-on: http://review.coreboot.org/11654
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/vendorcode/google/chromeos/vbnv_flash.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/vendorcode/google/chromeos/vbnv_flash.c b/src/vendorcode/google/chromeos/vbnv_flash.c index 656c3ea2a2..0ee9eaa943 100644 --- a/src/vendorcode/google/chromeos/vbnv_flash.c +++ b/src/vendorcode/google/chromeos/vbnv_flash.c @@ -19,6 +19,7 @@ * TODO: Make this CAR-friendly in case we use it on x86 some day. */ +#include <assert.h> #include <console/console.h> #include <spi_flash.h> #include <string.h> @@ -111,6 +112,23 @@ static int init_vbnv(void) return 0; } +static void vbnv_is_erasable(void) +{ + /* + * We check whether the region is aligned or not in advance to ensure + * we can erase the region when it's all used up. + * + * The region offset & size are determined by fmap.dts yet the check can + * be confidently done only by the spi flash driver. We use the same + * check as the one used by spi_flash_cmd_erase, which happens to be + * common to all the spi flash parts we support. + * + * TODO: Check by calling can_erase implemented by each spi flash driver + */ + assert(!(region_device_offset(&nvram_region) % spi_flash->sector_size)); + assert(!(region_device_sz(&nvram_region) % spi_flash->sector_size)); +} + static int vbnv_flash_probe(void) { if (!spi_flash) { @@ -119,6 +137,11 @@ static int vbnv_flash_probe(void) printk(BIOS_ERR, "failed to probe spi flash\n"); return 1; } + /* + * Called here instead of init_vbnv to reduce impact on boot + * speed. + */ + vbnv_is_erasable(); } return 0; } |