Sol Boucher (solb@chromium.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/10093
-gerrit
commit 7476b2f3daefa1cd6c465a9a6352562896bcf75a Author: Sol Boucher solb@chromium.org Date: Mon May 4 21:46:03 2015 -0700
chromeos: Fix the region API's CONFIG_CHROMEOS build breakage
This restores the ability to build with CONFIG_CHROMEOS enabled, which was broken by the introduction of the new region-based CBFS and FMAP APIs. Note that this does not touch vboot integration, and that builds still fail when CONFIG_VBOOT_VERIFY_FIRMWARE and friends are enabled. Building panther from this commit using the config file from the Chromium OS project[1] (but modified with CONFIG_VBOOT_VERIFY_FIRMWARE=n, CONFIG_BUILD_WITH_FAKE_IFD=n, and CONFIG_HAVE_ME_BIN=y) results in firmware that successfully gets as far as loading depthcharge.
[1] https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/m...
Change-Id: I198e2f639a3584deb2b464cf3c237f69d93c1c5f Signed-off-by: Sol Boucher solb@chromium.org --- src/drivers/elog/elog.c | 33 +----- src/lib/Makefile.inc | 4 +- src/mainboard/google/butterfly/mainboard.c | 16 +-- src/mainboard/google/panther/lan.c | 10 +- src/northbridge/intel/haswell/mrccache.c | 17 +-- src/northbridge/intel/sandybridge/mrccache.c | 18 +-- src/soc/intel/common/mrc_cache.c | 21 ++-- src/vendorcode/google/chromeos/Makefile.inc | 4 - src/vendorcode/google/chromeos/cros_vpd.c | 38 ++++--- src/vendorcode/google/chromeos/fmap.c | 157 --------------------------- src/vendorcode/google/chromeos/fmap.h | 46 -------- 11 files changed, 75 insertions(+), 289 deletions(-)
diff --git a/src/drivers/elog/elog.c b/src/drivers/elog/elog.c index d7751c2..e5a99a6 100644 --- a/src/drivers/elog/elog.c +++ b/src/drivers/elog/elog.c @@ -26,6 +26,7 @@ #include <pc80/mc146818rtc.h> #endif #include <bcd.h> +#include <fmap.h> #include <rtc.h> #include <smbios.h> #include <spi-generic.h> @@ -35,8 +36,6 @@ #include <elog.h> #include "elog_internal.h"
-#include <vendorcode/google/chromeos/fmap.h> - #if !IS_ENABLED(CONFIG_CHROMEOS) && CONFIG_ELOG_FLASH_BASE == 0 #error "CONFIG_ELOG_FLASH_BASE is invalid" #endif @@ -86,26 +85,6 @@ static inline u32 get_rom_size(void) }
/* - * Convert a memory mapped flash address into a flash offset - */ -static inline u32 elog_flash_address_to_offset(u8 *address) -{ -#if CONFIG_ARCH_X86 - /* For x86, assume address is memory-mapped near 4GB */ - u32 rom_size; - - if (!elog_spi) - return 0; - - rom_size = get_rom_size(); - - return (u32)address - ((u32)~0UL - rom_size + 1); -#else - return (u32)(uintptr_t)address; -#endif -} - -/* * Pointer to an event log header in the event data area */ static inline struct event_header* @@ -517,16 +496,16 @@ static void elog_find_flash(void) { elog_debug("elog_find_flash()\n");
+ // TODO: Eliminate the base Kconfig option and always read from FMAP. #if CONFIG_CHROMEOS /* Find the ELOG base and size in FMAP */ - u8 *flash_base_ptr; - int fmap_size = find_fmap_entry("RW_ELOG", (void **)&flash_base_ptr); - if (fmap_size < 0) { + struct region section; + if (fmap_locate_area("RW_ELOG", §ion) < 0) { printk(BIOS_WARNING, "ELOG: Unable to find RW_ELOG in FMAP\n"); flash_base = total_size = 0; } else { - flash_base = elog_flash_address_to_offset(flash_base_ptr); - total_size = MIN(fmap_size, CONFIG_ELOG_AREA_SIZE); + flash_base = section.offset; + total_size = MIN(section.size, CONFIG_ELOG_AREA_SIZE); } #else flash_base = CONFIG_ELOG_FLASH_BASE; diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc index 1c69c95..34b31c7 100644 --- a/src/lib/Makefile.inc +++ b/src/lib/Makefile.inc @@ -140,7 +140,9 @@ ramstage-y += mem_pool.c romstage-y += region.c ramstage-y += region.c
-smm-y += cbfs.c memcmp.c +smm-y += cbfs.c +smm-y += fmap.c +smm-y += memcmp.c smm-y += region.c smm-y += mem_pool.c smm-$(CONFIG_COMPILER_GCC) += gcc.c diff --git a/src/mainboard/google/butterfly/mainboard.c b/src/mainboard/google/butterfly/mainboard.c index 5420f72..8bfe999 100644 --- a/src/mainboard/google/butterfly/mainboard.c +++ b/src/mainboard/google/butterfly/mainboard.c @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
+#include <cbfs.h> +#include <fmap.h> #include <types.h> #include <string.h> #include <device/device.h> @@ -36,11 +38,6 @@ #include <smbios.h> #include <device/pci.h> #include <ec/quanta/ene_kb3940q/ec.h> -#if CONFIG_CHROMEOS -#include <vendorcode/google/chromeos/fmap.h> -#else -#include <cbfs.h> -#endif
static unsigned int search(char *p, char *a, unsigned int lengthp, unsigned int lengtha) @@ -201,9 +198,12 @@ static void mainboard_init(device_t dev) u16 io_base = 0; struct device *ethernet_dev = NULL; #if CONFIG_CHROMEOS - char **vpd_region_ptr = NULL; - search_length = find_fmap_entry("RO_VPD", (void **)vpd_region_ptr); - search_address = (unsigned long)(*vpd_region_ptr); + struct region_device rdev; + if (fmap_locate_area_as_rdev("RO_VPD", &rdev) >= 0) { + search_address = (unsigned long)rdev_mmap(&rdev, 0, + region_sz(rdev.region)); + search_length = region_sz(rdev.region); + } #else void *vpd_file = cbfs_boot_map_with_leak("vpd.bin", CBFS_TYPE_RAW, &search_length); diff --git a/src/mainboard/google/panther/lan.c b/src/mainboard/google/panther/lan.c index 22da881..8500d90 100644 --- a/src/mainboard/google/panther/lan.c +++ b/src/mainboard/google/panther/lan.c @@ -18,6 +18,7 @@ */
#include <cbfs.h> +#include <fmap.h> #include <string.h> #include <types.h> #include <arch/io.h> @@ -25,7 +26,6 @@ #include <device/device.h> #include <device/pci.h> #include <southbridge/intel/bd82x6x/pch.h> -#include <vendorcode/google/chromeos/fmap.h> #include "onboard.h"
static unsigned int search(char *p, u8 *a, unsigned int lengthp, @@ -118,14 +118,18 @@ static void program_mac_address(u16 io_base) u32 low_dword = 0x0000AD0B; /* low word of mac address as a dword */
#if CONFIG_CHROMEOS - search_length = find_fmap_entry("RO_VPD", &search_address); + struct region_device region; + if (fmap_locate_area_as_rdev("RO_VPD", ®ion) >= 0) { + search_address = rdev_mmap(®ion, 0, region.region.size); + search_length = region.region.size; + } #else search_address = cbfs_boot_map_with_leak("vpd.bin", CBFS_TYPE_RAW, &search_length); #endif
if (search_length <= 0) - printk(BIOS_ERR, "LAN: find_fmap_entry returned -1.\n"); + printk(BIOS_ERR, "LAN: Unable to find saved MAC address!\n"); else get_mac_address(&high_dword, &low_dword, search_address, search_length); diff --git a/src/northbridge/intel/haswell/mrccache.c b/src/northbridge/intel/haswell/mrccache.c index d6522a0..4557b23 100644 --- a/src/northbridge/intel/haswell/mrccache.c +++ b/src/northbridge/intel/haswell/mrccache.c @@ -22,6 +22,7 @@ #include <bootstate.h> #include <console/console.h> #include <cbfs.h> +#include <fmap.h> #include <ip_checksum.h> #include <device/device.h> #include <cbmem.h> @@ -30,7 +31,6 @@ #include <spi-generic.h> #include <spi_flash.h> #if CONFIG_CHROMEOS -#include <vendorcode/google/chromeos/fmap.h> #endif
/* convert a pointer to flash area into the offset inside the flash */ @@ -58,16 +58,17 @@ static int is_mrc_cache(struct mrc_data_container *mrc_cache) return (!!mrc_cache) && (mrc_cache->mrc_signature == MRC_DATA_SIGNATURE); }
-/* Right now, the offsets for the MRC cache area are hard-coded in the - * northbridge Kconfig if CONFIG_CHROMEOS is not set. In order to make - * this more flexible, there are two of options: - * - Have each mainboard Kconfig supply a hard-coded offset - * - Use CBFS - */ static u32 get_mrc_cache_region(struct mrc_data_container **mrc_region_ptr) { + // TODO: Eliminate the CBFS access/write and always read from FMAP. #if CONFIG_CHROMEOS - return find_fmap_entry("RW_MRC_CACHE", (void **)mrc_region_ptr); + struct region_device rdev; + if (fmap_locate_area_as_rdev("RW_MRC_CACHE", &rdev) < 0) { + *mrc_region_ptr = NULL; + return 0; + } + *mrc_region_ptr = rdev_mmap(&rdev, 0, region_sz(rdev.region)); + return region_sz(rdev.region); #else size_t region_size; *mrc_region_ptr = cbfs_boot_map_with_leak("mrc.cache", diff --git a/src/northbridge/intel/sandybridge/mrccache.c b/src/northbridge/intel/sandybridge/mrccache.c index 6b02c21..10696b7 100644 --- a/src/northbridge/intel/sandybridge/mrccache.c +++ b/src/northbridge/intel/sandybridge/mrccache.c @@ -22,6 +22,7 @@ #include <bootstate.h> #include <console/console.h> #include <cbfs.h> +#include <fmap.h> #include <ip_checksum.h> #include <device/device.h> #include <cbmem.h> @@ -30,7 +31,6 @@ #include <spi-generic.h> #include <spi_flash.h> #if CONFIG_CHROMEOS -#include <vendorcode/google/chromeos/fmap.h> #endif
/* convert a pointer to flash area into the offset inside the flash */ @@ -58,16 +58,18 @@ static int is_mrc_cache(struct mrc_data_container *mrc_cache) return (!!mrc_cache) && (mrc_cache->mrc_signature == MRC_DATA_SIGNATURE); }
-/* Right now, the offsets for the MRC cache area are hard-coded in the - * northbridge Kconfig if CONFIG_CHROMEOS is not set. In order to make - * this more flexible, there are two of options: - * - Have each mainboard Kconfig supply a hard-coded offset - * - Use CBFS - */ static u32 get_mrc_cache_region(struct mrc_data_container **mrc_region_ptr) { + // TODO: Eliminate the CBFS access/write and always read from FMAP. #if CONFIG_CHROMEOS - return find_fmap_entry("RW_MRC_CACHE", (void **)mrc_region_ptr); + struct region_device rdev; + if (fmap_locate_area_as_rdev("RW_MRC_CACHE", &rdev) < 0) { + *mrc_region_ptr = NULL; + return 0; + } + *mrc_region_ptr = (struct mrc_data_container *)rdev_mmap(&rdev, 0, + region_sz(rdev.region)); + return region_sz(rdev.region); #else size_t region_size; *mrc_region_ptr = cbfs_boot_map_with_leak("mrc.cache", diff --git a/src/soc/intel/common/mrc_cache.c b/src/soc/intel/common/mrc_cache.c index f854046..abc2b4e 100644 --- a/src/soc/intel/common/mrc_cache.c +++ b/src/soc/intel/common/mrc_cache.c @@ -20,9 +20,9 @@ #include <string.h> #include <console/console.h> #include <cbmem.h> +#include <fmap.h> #include <ip_checksum.h> #if CONFIG_CHROMEOS -#include <vendorcode/google/chromeos/fmap.h> #endif #include "mrc_cache.h"
@@ -37,18 +37,19 @@ struct mrc_data_region { };
/* common code */ -static int mrc_cache_get_region(struct mrc_data_region *region) +static int mrc_cache_get_region(struct mrc_data_region *data_region) { + // TODO: Eliminate the CBFS access/write and always read from FMAP. #if CONFIG_CHROMEOS - int ret; - ret = find_fmap_entry("RW_MRC_CACHE", ®ion->base); - if (ret >= 0) { - region->size = ret; - return 0; - } + struct region_device rdev; + if (fmap_locate_area_as_rdev("RW_MRC_CACHE", &rdev) < 0) + return -1; + data_region->base = rdev_mmap(&rdev, 0, region_sz(rdev.region)); + data_region->size = region_sz(rdev.region); + return 0; #endif - region->base = (void *)CONFIG_MRC_SETTINGS_CACHE_BASE; - region->size = CONFIG_MRC_SETTINGS_CACHE_SIZE; + data_region->base = (void *)CONFIG_MRC_SETTINGS_CACHE_BASE; + data_region->size = CONFIG_MRC_SETTINGS_CACHE_SIZE; return 0; }
diff --git a/src/vendorcode/google/chromeos/Makefile.inc b/src/vendorcode/google/chromeos/Makefile.inc index 0c66985..87bbc82 100644 --- a/src/vendorcode/google/chromeos/Makefile.inc +++ b/src/vendorcode/google/chromeos/Makefile.inc @@ -35,11 +35,7 @@ ramstage-$(CONFIG_CHROMEOS_VBNV_FLASH) += vbnv_flash.c romstage-$(CONFIG_ARCH_ROMSTAGE_X86_32) += vboot.c ramstage-$(CONFIG_ELOG) += elog.c ramstage-$(CONFIG_HAVE_ACPI_TABLES) += gnvs.c -verstage-y += fmap.c -romstage-y += fmap.c -ramstage-y += fmap.c ramstage-$(CONFIG_CHROMEOS_RAMOOPS) += ramoops.c -smm-y += fmap.c romstage-y += vpd_decode.c cros_vpd.c ramstage-y += vpd_decode.c cros_vpd.c vpd_mac.c vpd_serialno.c vpd_calibration.c ifeq ($(CONFIG_ARCH_X86)$(CONFIG_ARCH_MIPS),) diff --git a/src/vendorcode/google/chromeos/cros_vpd.c b/src/vendorcode/google/chromeos/cros_vpd.c index c0e4830..f27ada6 100644 --- a/src/vendorcode/google/chromeos/cros_vpd.c +++ b/src/vendorcode/google/chromeos/cros_vpd.c @@ -7,11 +7,11 @@ #include <console/console.h>
#include <cbfs.h> +#include <fmap.h> #include <stdlib.h> #include <string.h>
#include "cros_vpd.h" -#include "fmap.h" #include "lib_vpd.h" #include "vpd_tables.h"
@@ -30,14 +30,14 @@ struct vpd_gets_arg { static int cros_vpd_load(uint8_t **vpd_address, int32_t *vpd_size) { MAYBE_STATIC int cached = 0; + MAYBE_STATIC uint8_t *mapped_address = NULL; MAYBE_STATIC uint8_t *cached_address = NULL; MAYBE_STATIC int32_t cached_size = 0; MAYBE_STATIC int result = -1; struct google_vpd_info info; int32_t base;
- const struct fmap_area *area; - struct cbfs_media media; + struct region_device rdev;
if (cached) { *vpd_address = cached_address; @@ -46,32 +46,36 @@ static int cros_vpd_load(uint8_t **vpd_address, int32_t *vpd_size) }
cached = 1; - area = find_fmap_area(fmap_find(), "RO_VPD"); - if (!area) { + if (fmap_locate_area_as_rdev("RO_VPD", &rdev) < 0) { printk(BIOS_ERR, "%s: No RO_VPD FMAP section.\n", __func__); return result; } - if (area->size <= GOOGLE_VPD_2_0_OFFSET + sizeof(info)) { + if (region_sz(rdev.region) <= GOOGLE_VPD_2_0_OFFSET + sizeof(info)) { printk(BIOS_ERR, "%s: Too small (%d) for Google VPD 2.0.\n", - __func__, area->size); + __func__, region_sz(rdev.region)); return result; }
- base = area->offset + GOOGLE_VPD_2_0_OFFSET; - cached_size = area->size - GOOGLE_VPD_2_0_OFFSET; - init_default_cbfs_media(&media); - media.open(&media); + base = GOOGLE_VPD_2_0_OFFSET; + cached_size = region_sz(rdev.region) - GOOGLE_VPD_2_0_OFFSET; + mapped_address = rdev_mmap(&rdev, base, cached_size); + if (!mapped_address) { + printk(BIOS_ERR, "%s: Couldn't map Google VPD from flash offset %#x.\n", + __func__, region_sz(rdev.region)); + return result; + }
/* Try if we can find a google_vpd_info, otherwise read whole VPD. */ - if (media.read(&media, &info, base, sizeof(info)) == sizeof(info) && - memcmp(info.header.magic, VPD_INFO_MAGIC, sizeof(info.header.magic)) - == 0 && cached_size >= info.size + sizeof(info)) { - base += sizeof(info); + cached_address = mapped_address; + memcpy(&info, cached_address, sizeof(info)); + if (memcmp(info.header.magic, VPD_INFO_MAGIC, sizeof(info.header.magic)) + == 0 && cached_size >= info.size + sizeof(info) && + sizeof(info) + info.size <= cached_size) { + cached_address += sizeof(info); cached_size = info.size; } + rdev_munmap(&rdev, mapped_address);
- cached_address = media.map(&media, base, cached_size); - media.close(&media); if (cached_address) { *vpd_address = cached_address; *vpd_size = cached_size; diff --git a/src/vendorcode/google/chromeos/fmap.c b/src/vendorcode/google/chromeos/fmap.c deleted file mode 100644 index 21d439e..0000000 --- a/src/vendorcode/google/chromeos/fmap.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - * This file is part of the coreboot project. - * - * Copyright (C) 2012 The ChromiumOS Authors. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <stdint.h> -#include <stddef.h> -#include <string.h> -#include <console/console.h> -#include <cbfs.h> -#include "fmap.h" - -static int is_fmap_signature_valid(const struct fmap *fmap) -{ - const char reversed_sig[] = FMAP_REVERSED_SIGNATURE; - const char *p2 = reversed_sig + sizeof(FMAP_REVERSED_SIGNATURE) - 2; - const char *p1 = (char *)fmap; - - while (p2 >= reversed_sig) - if (*p1++ != *p2--) { - printk(BIOS_ERR, "No FMAP found at %p.\n", fmap); - return 1; - } - - printk(BIOS_DEBUG, "FMAP: Found "%s" version %d.%d at %p.\n", - fmap->name, fmap->ver_major, fmap->ver_minor, fmap); - printk(BIOS_DEBUG, "FMAP: base = %llx size = %x #areas = %d\n", - (unsigned long long)fmap->base, fmap->size, fmap->nareas); - - return 0; -} - -/* Find FMAP data structure in ROM. - * See http://code.google.com/p/flashmap/ for more information on FMAP. - */ -const struct fmap *fmap_find(void) -{ - /* FIXME: Get rid of the hard codes. The "easy" way would be to - * do a binary search, but since ROM accesses are slow, we don't - * want to spend a lot of time looking for the FMAP. An elegant - * solution would be to store a pointer to the FMAP in the CBFS - * master header; that would require some more changes to cbfstool - * and possibly cros_bundle_firmware. - */ - const struct fmap *fmap; - struct cbfs_media media; - size_t size; - - if (init_default_cbfs_media(&media)) { - printk(BIOS_ERR, "failed to init default cbfs media\n"); - return NULL; - } - - media.open(&media); - fmap = media.map(&media, CONFIG_FLASHMAP_OFFSET, sizeof(*fmap)); - - if (fmap == CBFS_MEDIA_INVALID_MAP_ADDRESS) { - printk(BIOS_ERR, "failed to map FMAP header\n"); - media.close(&media); - return NULL; - } - - if (is_fmap_signature_valid(fmap)) { - media.unmap(&media, fmap); - media.close(&media); - return NULL; - } - - size = sizeof(*fmap) + sizeof(struct fmap_area) * fmap->nareas; - media.unmap(&media, fmap); - fmap = media.map(&media, CONFIG_FLASHMAP_OFFSET, size); - - if (fmap == CBFS_MEDIA_INVALID_MAP_ADDRESS) { - printk(BIOS_ERR, "failed to map FMAP (size=%zu)\n", size); - media.unmap(&media, fmap); - media.close(&media); - return NULL; - } - - media.close(&media); - return fmap; -} - -const struct fmap_area *find_fmap_area(const struct fmap *fmap, - const char name[]) -{ - const struct fmap_area *area = NULL; - - if (fmap) { - int i; - for (i = 0; i < fmap->nareas; i++) { - if (!strcmp((const char *)fmap->areas[i].name, name)) { - area = &fmap->areas[i]; - break; - } - } - } - - if (area) { - printk(BIOS_DEBUG, "FMAP: area %s found\n", name); - printk(BIOS_DEBUG, "FMAP: offset: %x\n", area->offset); - printk(BIOS_DEBUG, "FMAP: size: %d bytes\n", area->size); - } else { - printk(BIOS_DEBUG, "FMAP: area %s not found\n", name); - } - - return area; -} - -int find_fmap_entry(const char name[], void **pointer) -{ - MAYBE_STATIC const struct fmap *fmap = NULL; - const struct fmap_area *area; - void *base = NULL; - - if (!fmap) - fmap = fmap_find(); - - area = find_fmap_area(fmap, name); - - if (!area) - return -1; - - /* Right now cros_bundle_firmware does not write a valid - * base address into the FMAP. Hence, if base is 0, assume - * 4GB-8MB as base address. - */ - if (fmap->base) { - 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*) ((uintptr_t)base + area->offset); - printk(BIOS_DEBUG, "FMAP: %s at %p (offset %x)\n", - name, *pointer, area->offset); - return area->size; -} diff --git a/src/vendorcode/google/chromeos/fmap.h b/src/vendorcode/google/chromeos/fmap.h deleted file mode 100644 index fc84f15..0000000 --- a/src/vendorcode/google/chromeos/fmap.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2010, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, this software may be distributed under the terms of the - * GNU General Public License ("GPL") version 2 as published by the Free - * Software Foundation. - */ - -#ifndef FLASHMAP_LIB_FMAP_H__ -#define FLASHMAP_LIB_FMAP_H__ - -#include <fmap_serialized.h> - -/* coreboot specific function prototypes */ -const struct fmap *fmap_find(void); -const struct fmap_area *find_fmap_area(const struct fmap *fmap, - const char name[]); -int find_fmap_entry(const char name[], void **pointer); -#endif /* FLASHMAP_LIB_FMAP_H__*/