summaryrefslogtreecommitdiff
path: root/common/fmap.c
diff options
context:
space:
mode:
authorBill Richardson <wfrichar@chromium.org>2012-04-27 10:23:14 -0700
committerBill Richardson <wfrichar@chromium.org>2012-05-01 15:54:39 -0700
commit8d921af0bb4f189c10d11bb0bfce286fb92d348c (patch)
tree31dd1245146630cf90d10bdb96ef8013236ecaf0 /common/fmap.c
parenta5027ece4cb02a736db3db1e971bffd699422dec (diff)
downloadchrome-ec-8d921af0bb4f189c10d11bb0bfce286fb92d348c.tar.gz
Add basic FMAP to EC firmware image.
This is very basic, so you can only rely on RO_SECTION, RW_SECTION_A, and RW_SECTION_B for now. We'll fill in more regions as we add vboot stuff. Still, you should be able to do things like this: flashrom -p internal:bus=lpc -r ec.bin flashrom -p internal:bus=lpc -w ec.bin -i RW_SECTION:ec.B.flat BUG=chrome-os-partner:8198 TEST=manual Build the image, look for the FMAP in it. cd src/platform/ec make BOARD=link dump_fmap ./build/link/ec.bin Change-Id: I0adbbfb8e975faae805bda271873fcef46590cf4 Signed-off-by: Bill Richardson <wfrichar@chromium.org>
Diffstat (limited to 'common/fmap.c')
-rw-r--r--common/fmap.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/common/fmap.c b/common/fmap.c
new file mode 100644
index 0000000000..8ee698d615
--- /dev/null
+++ b/common/fmap.c
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include <stdint.h>
+#include "config.h"
+
+/* FMAP structs. See http://code.google.com/p/flashmap/wiki/FmapSpec */
+#define FMAP_NAMELEN 32
+#define FMAP_SIGNATURE "__FMAP__"
+#define FMAP_SIGNATURE_SIZE 8
+#define FMAP_VER_MAJOR 1
+#define FMAP_VER_MINOR 0
+#define FMAP_SEARCH_STRIDE 64 /* Spec revision 1.01 */
+
+typedef struct _FmapHeader {
+ char fmap_signature[FMAP_SIGNATURE_SIZE];
+ uint8_t fmap_ver_major;
+ uint8_t fmap_ver_minor;
+ uint64_t fmap_base;
+ uint32_t fmap_size;
+ char fmap_name[FMAP_NAMELEN];
+ uint16_t fmap_nareas;
+} __attribute__((packed)) FmapHeader;
+
+#define FMAP_AREA_STATIC (1 << 0) /* can be checksummed */
+#define FMAP_AREA_COMPRESSED (1 << 1) /* may be compressed */
+#define FMAP_AREA_RO (1 << 2) /* writes may fail */
+
+typedef struct _FmapAreaHeader {
+ uint32_t area_offset;
+ uint32_t area_size;
+ char area_name[FMAP_NAMELEN];
+ uint16_t area_flags;
+} __attribute__((packed)) FmapAreaHeader;
+
+
+#define NUM_EC_FMAP_AREAS 14
+
+const struct _ec_fmap {
+ FmapHeader header;
+ FmapAreaHeader area[NUM_EC_FMAP_AREAS];
+} ec_fmap __attribute__((section(".google"))) = {
+ /* Header */
+ {
+ .fmap_signature = {'_', '_', 'F', 'M', 'A', 'P', '_', '_'},
+ .fmap_ver_major = FMAP_VER_MAJOR,
+ .fmap_ver_minor = FMAP_VER_MINOR,
+ .fmap_base = CONFIG_FLASH_BASE,
+ .fmap_size = CONFIG_FLASH_SIZE,
+ .fmap_name = "EC_FMAP",
+ .fmap_nareas = NUM_EC_FMAP_AREAS,
+ },
+
+ {
+ /* RO Firmware */
+ {
+ .area_name = "RO_SECTION",
+ .area_offset = CONFIG_FW_RO_OFF,
+ .area_size = CONFIG_FW_IMAGE_SIZE,
+ .area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
+ },
+ {
+ .area_name = "BOOT_STUB",
+ .area_offset = CONFIG_FW_RO_OFF,
+ .area_size = CONFIG_FW_RO_SIZE,
+ .area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
+ },
+ {
+ .area_name = "RO_FRID", /* FIXME: Where is it? */
+ .area_offset = CONFIG_FW_RO_OFF,
+ .area_size = 0,
+ .area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
+ },
+
+ /* Other RO stuff: FMAP, GBB, etc. */
+ {
+ /* FIXME(wfrichar): GBB != FMAP. Use the right terms */
+ .area_name = "FMAP",
+ .area_offset = CONFIG_FW_RO_GBB_OFF,
+ .area_size = CONFIG_FW_RO_GBB_SIZE,
+ .area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
+ },
+ {
+ .area_name = "GBB",
+ .area_offset = CONFIG_FW_RO_GBB_OFF,
+ .area_size = 0,
+ .area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
+ },
+ {
+ /* A dummy region to identify it as EC firmware */
+ .area_name = "EC_IMAGE",
+ .area_offset = CONFIG_FW_RO_GBB_OFF,
+ .area_size = 0, /* Always zero */
+ .area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
+ },
+
+ /* Firmware A */
+ {
+ .area_name = "RW_SECTION_A",
+ .area_offset = CONFIG_FW_A_OFF,
+ .area_size = CONFIG_FW_IMAGE_SIZE,
+ .area_flags = FMAP_AREA_STATIC,
+ },
+ {
+ .area_name = "FW_MAIN_A",
+ .area_offset = CONFIG_FW_A_OFF,
+ .area_size = CONFIG_FW_IMAGE_SIZE,
+ .area_flags = FMAP_AREA_STATIC,
+ },
+ {
+ .area_name = "RW_FWID_A", /* FIXME: Where is it? */
+ .area_offset = CONFIG_FW_A_OFF,
+ .area_size = 0,
+ .area_flags = FMAP_AREA_STATIC,
+ },
+ {
+ .area_name = "VBLOCK_A",
+ .area_offset = CONFIG_FW_A_OFF,
+ .area_size = 0,
+ .area_flags = FMAP_AREA_STATIC,
+ },
+
+ /* Firmware B */
+ {
+ .area_name = "RW_SECTION_B",
+ .area_offset = CONFIG_FW_B_OFF,
+ .area_size = CONFIG_FW_IMAGE_SIZE,
+ .area_flags = FMAP_AREA_STATIC,
+ },
+ {
+ .area_name = "FW_MAIN_B",
+ .area_offset = CONFIG_FW_B_OFF,
+ .area_size = CONFIG_FW_IMAGE_SIZE,
+ .area_flags = FMAP_AREA_STATIC,
+ },
+ {
+ .area_name = "RW_FWID_B", /* FIXME: Where is it? */
+ .area_offset = CONFIG_FW_B_OFF,
+ .area_size = 0,
+ .area_flags = FMAP_AREA_STATIC,
+ },
+ {
+ .area_name = "VBLOCK_B",
+ .area_offset = CONFIG_FW_A_OFF,
+ .area_size = 0,
+ .area_flags = FMAP_AREA_STATIC,
+ },
+ }
+};