From 9ad28b940f74a17c88069816df1f20c0b03a9552 Mon Sep 17 00:00:00 2001 From: Stefan Reinauer Date: Tue, 17 Sep 2013 14:15:16 -0700 Subject: chromeos: Add code to read FMAP on ARM On ARM the SPI flash is not memory mapped. Use the CBFS interface to map the correct portion. Change-Id: I8ea9aa0119e90a892bf777313fdc389c4739154e Signed-off-by: Stefan Reinauer Reviewed-on: https://chromium-review.googlesource.com/169781 Reviewed-by: David Hendrix (cherry picked from commit a263d3717e82c43fe91e7c4e82d167e74bf27527) Signed-off-by: Isaac Christensen Reviewed-on: http://review.coreboot.org/6522 Tested-by: build bot (Jenkins) Reviewed-by: David Hendricks --- src/vendorcode/google/chromeos/fmap.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src') diff --git a/src/vendorcode/google/chromeos/fmap.c b/src/vendorcode/google/chromeos/fmap.c index 538b8c359c..e0ec30b248 100644 --- a/src/vendorcode/google/chromeos/fmap.c +++ b/src/vendorcode/google/chromeos/fmap.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "fmap.h" /* Find FMAP data structure in ROM. @@ -36,9 +37,19 @@ const struct fmap *fmap_find(void) * and possibly cros_bundle_firmware. */ +#if CONFIG_ARCH_X86 /* wrapping around 0x100000000 */ const struct fmap *fmap = (void *) (CONFIG_FLASHMAP_OFFSET - CONFIG_ROM_SIZE); +#elif CONFIG_ARCH_ARMV7 + struct cbfs_media default_media, *media; + media = &default_media; + init_default_cbfs_media(media); + media->open(media); + const struct fmap *fmap = (void *) + media->map(media, CONFIG_FLASHMAP_OFFSET, 4096); // FIXME size + media->close(media); +#endif if (memcmp(fmap, FMAP_SIGNATURE, sizeof(FMAP_SIGNATURE)-1)) { printk(BIOS_DEBUG, "No FMAP found at %p.\n", fmap); @@ -104,9 +115,11 @@ int find_fmap_entry(const char name[], void **pointer) base = (void *)(unsigned long)fmap->base; printk(BIOS_DEBUG, "FMAP: %s base at %p\n", name, base); } else { +#if CONFIG_ARCH_X86 base = (void *)(0 - CONFIG_ROM_SIZE); printk(BIOS_WARNING, "FMAP: No valid base address, using" " 0x%p\n", base); +#endif } *pointer = (void*) ((u32)base + area->offset); -- cgit v1.2.3