summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorDuncan Laurie <dlaurie@chromium.org>2012-08-15 13:14:58 -0700
committerStefan Reinauer <stefan.reinauer@coreboot.org>2012-11-08 19:38:06 +0100
commit86bf3f518f445f686bb7405f052a0a93cddba16a (patch)
tree696a6f85e3040a09e2d7f227f77f35d2bdf3583b /src/drivers
parentf1c76ef60547e3dd38d3554dba227351112d843a (diff)
downloadcoreboot-86bf3f518f445f686bb7405f052a0a93cddba16a.tar.xz
ELOG: Find flash base in FMAP if possible
Now that we have FMAP support in coreboot use it to find the offset in flash for ELOG to use. If coreboot has elog configured with a smaller size then use that over the FMAP size. This is because I set aside a 16KB region in the FMAP but we only use 4KB of it to keep the impact to boot/resume speed to a minimum. FMAP: Found "FMAP" version 1.0 at ffe10000. FMAP: base = 0 size = 800000 #areas = 32 FMAP: area RW_ELOG found FMAP: offset: 3f0000 FMAP: size: 16384 bytes FMAP: No valid base address, using 0xff800000 ELOG: base=0x003f0000 base_ptr=0xffbf0000 ELOG: MEM @0x00190ad8 FLASH @0xffbf0000 ELOG: areas are 4096 bytes, full threshold 3072, shrink size 1024 Change-Id: I3d826812c0f259d61f41b42797c58dd179f9f1c8 Signed-off-by: Duncan Laurie <dlaurie@chromium.org> Reviewed-on: http://review.coreboot.org/1706 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/elog/elog.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/drivers/elog/elog.c b/src/drivers/elog/elog.c
index 1219883907..7be443a375 100644
--- a/src/drivers/elog/elog.c
+++ b/src/drivers/elog/elog.c
@@ -28,7 +28,9 @@
#include <elog.h>
#include "elog_internal.h"
-#if CONFIG_ELOG_FLASH_BASE == 0
+#if CONFIG_CHROMEOS
+#include <vendorcode/google/chromeos/fmap.h>
+#elif CONFIG_ELOG_FLASH_BASE == 0
#error "CONFIG_ELOG_FLASH_BASE is invalid"
#endif
#if CONFIG_ELOG_FULL_THRESHOLD >= CONFIG_ELOG_AREA_SIZE
@@ -735,6 +737,12 @@ int elog_clear(void)
*/
int elog_init(void)
{
+ u32 flash_base = CONFIG_ELOG_FLASH_BASE;
+ int flash_size = CONFIG_ELOG_AREA_SIZE;
+#if CONFIG_CHROMEOS
+ u8 *flash_base_ptr;
+#endif
+
if (elog_initialized)
return 0;
@@ -746,9 +754,24 @@ int elog_init(void)
return -1;
}
+#if CONFIG_CHROMEOS
+ /* Find the ELOG base and size in FMAP */
+ flash_size = find_fmap_entry("RW_ELOG", (void **)&flash_base_ptr);
+ if (flash_size < 0) {
+ printk(BIOS_WARNING, "ELOG: Unable to find RW_ELOG in FMAP, "
+ "using CONFIG_ELOG_FLASH_BASE instead\n");
+ flash_size = CONFIG_ELOG_AREA_SIZE;
+ } else {
+ flash_base = elog_flash_address_to_offset(flash_base_ptr);
+
+ /* Use configured size if smaller than FMAP size */
+ if (flash_size > CONFIG_ELOG_AREA_SIZE)
+ flash_size = CONFIG_ELOG_AREA_SIZE;
+ }
+#endif
+
/* Setup descriptors for flash and memory areas */
- if (elog_setup_descriptors(CONFIG_ELOG_FLASH_BASE,
- CONFIG_ELOG_AREA_SIZE) < 0) {
+ if (elog_setup_descriptors(flash_base, flash_size) < 0) {
printk(BIOS_ERR, "ELOG: Unable to initialize descriptors\n");
return -1;
}