summaryrefslogtreecommitdiff
path: root/src/vendorcode
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2015-03-28 23:56:22 -0500
committerAaron Durbin <adurbin@chromium.org>2015-05-26 22:33:53 +0200
commit0424c95a6dafdb65070538d6c5aa394b75eb9850 (patch)
treef5bd9f485a1a44eece1662a29c1435a44ab5c58a /src/vendorcode
parentb6981c0f9c4ce89c4209c14fb326a414096f2ff1 (diff)
fmap: new API using region_device
Instead of being pointer based use the region infrastrucutre. Additionally, this removes the need for arch-specific compilation paths. The users of the new API can use the region APIs to memory map or read the region provided by the new fmap API. Change-Id: Ie36e9ff9cb554234ec394b921f029eeed6845aee Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/9170 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Diffstat (limited to 'src/vendorcode')
-rw-r--r--src/vendorcode/google/chromeos/Kconfig9
-rw-r--r--src/vendorcode/google/chromeos/Makefile.inc4
-rw-r--r--src/vendorcode/google/chromeos/cros_vpd.c30
-rw-r--r--src/vendorcode/google/chromeos/fmap.h79
-rw-r--r--src/vendorcode/google/chromeos/vboot2/vboot_handoff.c2
-rw-r--r--src/vendorcode/google/chromeos/vboot_common.c14
6 files changed, 17 insertions, 121 deletions
diff --git a/src/vendorcode/google/chromeos/Kconfig b/src/vendorcode/google/chromeos/Kconfig
index 17bbc316ce..4e7fdac5e2 100644
--- a/src/vendorcode/google/chromeos/Kconfig
+++ b/src/vendorcode/google/chromeos/Kconfig
@@ -92,15 +92,6 @@ config CHROMEOS_RAMOOPS_RAM_SIZE
default 0x00100000
depends on CHROMEOS_RAMOOPS
-config FLASHMAP_OFFSET
- hex "Flash Map Offset"
- default 0x00670000 if NORTHBRIDGE_INTEL_SANDYBRIDGE
- default 0x00610000 if NORTHBRIDGE_INTEL_IVYBRIDGE
- default CBFS_SIZE if !ARCH_X86
- default 0
- help
- Offset of flash map in firmware image
-
config EC_SOFTWARE_SYNC
bool "Enable EC software sync"
default n
diff --git a/src/vendorcode/google/chromeos/Makefile.inc b/src/vendorcode/google/chromeos/Makefile.inc
index 5c7140fc36..67beabac1e 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 c0e483019b..fed1d82344 100644
--- a/src/vendorcode/google/chromeos/cros_vpd.c
+++ b/src/vendorcode/google/chromeos/cros_vpd.c
@@ -6,12 +6,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"
@@ -35,9 +34,7 @@ static int cros_vpd_load(uint8_t **vpd_address, int32_t *vpd_size)
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 vpd;
if (cached) {
*vpd_address = cached_address;
@@ -46,32 +43,31 @@ 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", &vpd)) {
printk(BIOS_ERR, "%s: No RO_VPD FMAP section.\n", __func__);
return result;
}
- if (area->size <= GOOGLE_VPD_2_0_OFFSET + sizeof(info)) {
+
+ base = 0;
+ cached_size = region_device_sz(&vpd);
+
+ if ((cached_size < GOOGLE_VPD_2_0_OFFSET + sizeof(info)) ||
+ rdev_chain(&vpd, &vpd, GOOGLE_VPD_2_0_OFFSET,
+ cached_size - GOOGLE_VPD_2_0_OFFSET)) {
printk(BIOS_ERR, "%s: Too small (%d) for Google VPD 2.0.\n",
- __func__, area->size);
+ __func__, cached_size);
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);
-
/* Try if we can find a google_vpd_info, otherwise read whole VPD. */
- if (media.read(&media, &info, base, sizeof(info)) == sizeof(info) &&
+ if (rdev_readat(&vpd, &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_size = info.size;
}
- cached_address = media.map(&media, base, cached_size);
- media.close(&media);
+ cached_address = rdev_mmap(&vpd, base, cached_size);
if (cached_address) {
*vpd_address = cached_address;
*vpd_size = cached_size;
diff --git a/src/vendorcode/google/chromeos/fmap.h b/src/vendorcode/google/chromeos/fmap.h
deleted file mode 100644
index 05d3fb6e1d..0000000000
--- a/src/vendorcode/google/chromeos/fmap.h
+++ /dev/null
@@ -1,79 +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 <stdint.h>
-
-#define FMAP_REVERSED_SIGNATURE "__PAMF__" /* avoid magic number in .rodata */
-#define FMAP_VER_MAJOR 1 /* this header's FMAP minor version */
-#define FMAP_VER_MINOR 1 /* this header's FMAP minor version */
-#define FMAP_STRLEN 32 /* maximum length for strings, */
- /* including null-terminator */
-
-enum fmap_flags {
- FMAP_AREA_STATIC = 1 << 0,
- FMAP_AREA_COMPRESSED = 1 << 1,
- FMAP_AREA_RO = 1 << 2,
-};
-
-/* Mapping of volatile and static regions in firmware binary */
-struct fmap_area {
- uint32_t offset; /* offset relative to base */
- uint32_t size; /* size in bytes */
- uint8_t name[FMAP_STRLEN]; /* descriptive name */
- uint16_t flags; /* flags for this area */
-} __attribute__((packed));
-
-struct fmap {
- uint8_t signature[8]; /* "__FMAP__" (0x5F5F464D41505F5F) */
- uint8_t ver_major; /* major version */
- uint8_t ver_minor; /* minor version */
- uint64_t base; /* address of the firmware binary */
- uint32_t size; /* size of firmware binary in bytes */
- uint8_t name[FMAP_STRLEN]; /* name of this firmware binary */
- uint16_t nareas; /* number of areas described by
- fmap_areas[] below */
- struct fmap_area areas[];
-} __attribute__((packed));
-
-
-/* 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__*/
diff --git a/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c b/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c
index 38f77a6e76..e7e0d99632 100644
--- a/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c
+++ b/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c
@@ -26,13 +26,13 @@
#include <cbmem.h>
#include <console/console.h>
#include <console/vtxprintf.h>
+#include <fmap.h>
#include <stdlib.h>
#include <timestamp.h>
#define NEED_VB20_INTERNALS /* TODO: remove me! */
#include <vb2_api.h>
#include <vboot_struct.h>
#include "../chromeos.h"
-#include "../fmap.h"
#include "../vboot_handoff.h"
#include "misc.h"
diff --git a/src/vendorcode/google/chromeos/vboot_common.c b/src/vendorcode/google/chromeos/vboot_common.c
index f593c7b43b..1db9d96aea 100644
--- a/src/vendorcode/google/chromeos/vboot_common.c
+++ b/src/vendorcode/google/chromeos/vboot_common.c
@@ -22,27 +22,19 @@
#include <cbmem.h>
#include <console/cbmem_console.h>
#include <console/console.h>
+#include <fmap.h>
#include <reset.h>
#include <stddef.h>
#include <string.h>
#include "chromeos.h"
-#include "fmap.h"
#include "vboot_common.h"
#include "vboot_handoff.h"
void vboot_locate_region(const char *name, struct region *region)
{
- const struct fmap_area *area;
-
- region->size = 0;
-
- area = find_fmap_area(fmap_find(), name);
-
- if (area != NULL) {
- region->offset = area->offset;
- region->size = area->size;
- }
+ if (fmap_locate_area(name, region))
+ region->size = 0;
}
void *vboot_get_region(size_t offset, size_t size, void *dest)