mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-15 00:56:22 +00:00
EC_RO and WP_RO area are identical and should cover whole range needed to be write-protected. While EC_RO is for legacy firmware updater, the WP_RO is for future factory finalize test. EC_RW is for fw_updater to update both A/B at once. Signed-off-by: Louis Yung-Chieh Lo <yjlou@chromium.org> BUG=chrome-os-partner:9536 TEST=build in chroot and dump_fmap build/link/ec.bin opened build/link/ec.bin hit at 0x00013800 fmap_signature __FMAP__ fmap_version: 1.0 fmap_base: 0x0 fmap_size: 0x0003f800 (260096) fmap_name: EC_FMAP fmap_nareas: 16 area: 1 area_offset: 0x00000000 area_size: 0x00014000 (81920) area_name: RO_SECTION area: 2 area_offset: 0x00000000 area_size: 0x00013000 (77824) area_name: BOOT_STUB area: 5 area_offset: 0x00013800 area_size: 0x00000302 (770) area_name: FMAP area: 7 <---- area_offset: 0x00000000 <---- area_size: 0x00014000 (81920) <---- area_name: EC_RO <---- area: 8 <---- area_offset: 0x00014000 <---- area_size: 0x00028000 (163840) <---- area_name: EC_RW <---- area: 9 <---- area_offset: 0x00000000 <---- area_size: 0x00014000 (81920) <---- area_name: WP_RO <---- area: 10 area_offset: 0x00014000 area_size: 0x00014000 (81920) area_name: RW_SECTION_A area: 14 area_offset: 0x00028000 area_size: 0x00014000 (81920) area_name: RW_SECTION_B Change-Id: I11b9450f87e26ef1cd0ac65ecd059e13d8489e26
176 lines
4.7 KiB
C
176 lines
4.7 KiB
C
/*
|
|
* 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 17
|
|
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,
|
|
/* NOTE: EC implementation reserves one bank for itself */
|
|
.fmap_size = CONFIG_FLASH_SIZE - CONFIG_FLASH_BANK_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. */
|
|
{
|
|
.area_name = "ROOT_KEY",
|
|
.area_offset = CONFIG_VBOOT_ROOTKEY_OFF,
|
|
.area_size = CONFIG_VBOOT_ROOTKEY_SIZE,
|
|
.area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
|
|
},
|
|
{
|
|
/* FIXME(wfrichar): GBB != FMAP. Use the right terms */
|
|
.area_name = "FMAP",
|
|
.area_offset = (uint32_t)&ec_fmap,
|
|
.area_size = sizeof(ec_fmap),
|
|
.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_OFF,
|
|
.area_size = 0, /* Always zero */
|
|
.area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
|
|
},
|
|
{
|
|
/* The range for write protect, for lagecy firmware
|
|
* updater. Should be identical to 'WP_RO'. */
|
|
.area_name = "EC_RO",
|
|
.area_offset = CONFIG_FW_RO_OFF,
|
|
.area_size = CONFIG_FW_IMAGE_SIZE,
|
|
.area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
|
|
},
|
|
{
|
|
/* The range for autoupdate to update A/B at once. */
|
|
.area_name = "EC_RW",
|
|
.area_offset = CONFIG_FW_A_OFF,
|
|
.area_size = CONFIG_FW_IMAGE_SIZE * 2,
|
|
.area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
|
|
},
|
|
{
|
|
/* The range for write protect, for factory finalize
|
|
* test case. Should be identical to 'EC_RO'. */
|
|
.area_name = "WP_RO",
|
|
.area_offset = CONFIG_FW_RO_OFF,
|
|
.area_size = CONFIG_FW_IMAGE_SIZE,
|
|
.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_A_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_VBLOCK_A_OFF,
|
|
.area_size = CONFIG_VBLOCK_A_SIZE,
|
|
.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_B_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_VBLOCK_B_OFF,
|
|
.area_size = CONFIG_VBLOCK_B_SIZE,
|
|
.area_flags = FMAP_AREA_STATIC,
|
|
},
|
|
}
|
|
};
|