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>
Reviewed-on: http://review.coreboot.org/4186
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
Duncan Laurie 2013-05-23 07:23:09 -07:00 committed by Stefan Reinauer
parent b1c25e74af
commit 032be82a11
1 changed files with 8 additions and 1 deletions

View File

@ -661,6 +661,12 @@ static int elog_shrink(void)
/* Erase flash area */ /* Erase flash area */
elog_flash_erase_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 */ /* Write new flash area */
elog_prepare_empty(elog_get_flash(), elog_prepare_empty(elog_get_flash(),
(u8*)elog_get_event_base(mem, offset), (u8*)elog_get_event_base(mem, offset),
@ -839,7 +845,8 @@ int elog_init(void)
/* Shrink the log if we are getting too full */ /* Shrink the log if we are getting too full */
if (elog_get_mem()->next_event_offset >= CONFIG_ELOG_FULL_THRESHOLD) 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__) #if CONFIG_ELOG_BOOT_COUNT && !defined(__SMM__)
/* Log boot count event except in S3 resume */ /* Log boot count event except in S3 resume */