Stefan Reinauer (stefan.reinauer@coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4186
-gerrit
commit 98849d12653fb68e74eeb561956a6f56f05b6139 Author: Duncan Laurie dlaurie@chromium.org Date: Thu May 23 07:23:09 2013 -0700
elog: Check for successful flash erase in elog_shrink
A parrot device with a bad flash part has been seen to hang in the elog_shrink code becuase the flash was not successfully erased and it gets stuck in a loop trying to shrink the log and then add an event.
Change-Id: I8bb13dbadd293f9d892f322e213c9255c8e9acb3 Signed-off-by: Duncan Laurie dlaurie@chromium.org Reviewed-on: https://gerrit.chromium.org/gerrit/56405 Reviewed-by: Aaron Durbin adurbin@chromium.org --- src/drivers/elog/elog.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/drivers/elog/elog.c b/src/drivers/elog/elog.c index 6de5123..bc72e97 100644 --- a/src/drivers/elog/elog.c +++ b/src/drivers/elog/elog.c @@ -661,6 +661,12 @@ static int elog_shrink(void) /* Erase flash area */ elog_flash_erase_area();
+ /* Ensure the area was successfully erased */ + if (elog_get_flash()->next_event_offset >= CONFIG_ELOG_FULL_THRESHOLD) { + printk(BIOS_ERR, "ELOG: Flash area was not erased!\n"); + return -1; + } + /* Write new flash area */ elog_prepare_empty(elog_get_flash(), (u8*)elog_get_event_base(mem, offset), @@ -839,7 +845,8 @@ int elog_init(void)
/* Shrink the log if we are getting too full */ if (elog_get_mem()->next_event_offset >= CONFIG_ELOG_FULL_THRESHOLD) - elog_shrink(); + if (elog_shrink() < 0) + return -1;
#if CONFIG_ELOG_BOOT_COUNT && !defined(__SMM__) /* Log boot count event except in S3 resume */