mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-28 02:35:28 +00:00
The firmware defines had two almost-identical sets. Coalesce into one consistent set. Link had 256 KB flash, but only allowed 2 80KB images. Future LM4-based platforms (slippy/peppy/falco/etc) will now use the entire flash, with RO=124KB, pstate=4KB, RW=128KB. This matches what the STM32 platforms do, where pstate is contiguous with the RO firmware. No functional change to STM32-based platforms. BUG=chrome-os-partner:19176 BRANCH=none TEST=build all platforms and dump_fmap ec.bin. - stm32-based platforms should report RO=61440@0, RW=65536@0x10000 - link should report RO=81920@0, RW=81920@0x14000 - slippy should report RO=129024@0, RW=131072@0x20000 Change-Id: I20b1d95c16250d9a5d228ead06eef03d96548823 Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/56655
138 lines
3.7 KiB
C
138 lines
3.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 <stddef.h>
|
|
|
|
#include "common.h"
|
|
#include "version.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
|
|
|
|
/*
|
|
* For address containing CONFIG_FLASH_BASE (symbols in *.lds.S and variable),
|
|
* this computes the offset to the start of flash.
|
|
*/
|
|
#define RELATIVE(addr) ((addr) - CONFIG_FLASH_BASE)
|
|
|
|
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;
|
|
} __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;
|
|
} __packed FmapAreaHeader;
|
|
|
|
#define NUM_EC_FMAP_AREAS 7
|
|
|
|
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 */
|
|
{
|
|
/*
|
|
* Range of RO firmware to be updated. Verified in
|
|
* factory finalization by hash. Should not have
|
|
* volatile data (ex, calibration results).
|
|
*/
|
|
.area_name = "EC_RO",
|
|
.area_offset = CONFIG_FW_RO_OFF,
|
|
.area_size = CONFIG_FW_RO_SIZE,
|
|
.area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
|
|
},
|
|
{
|
|
/* (Optional) RO firmware code. */
|
|
.area_name = "FR_MAIN",
|
|
.area_offset = CONFIG_FW_RO_OFF,
|
|
.area_size = CONFIG_FW_RO_SIZE,
|
|
.area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
|
|
},
|
|
{
|
|
/*
|
|
* RO firmware version ID. Must be NULL terminated
|
|
* ASCII, and padded with \0.
|
|
*/
|
|
.area_name = "RO_FRID",
|
|
.area_offset = CONFIG_FW_RO_OFF +
|
|
RELATIVE((uint32_t)__version_struct_offset) +
|
|
offsetof(struct version_struct, version),
|
|
.area_size = sizeof(version_data.version),
|
|
.area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
|
|
},
|
|
|
|
/* Other RO stuff: FMAP, WP, KEYS, etc. */
|
|
{
|
|
.area_name = "FMAP",
|
|
.area_offset = CONFIG_FW_RO_OFF +
|
|
RELATIVE((uint32_t)&ec_fmap),
|
|
.area_size = sizeof(ec_fmap),
|
|
.area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
|
|
},
|
|
{
|
|
/*
|
|
* The range for write protection, for factory
|
|
* finalization. Should include (may be identical to)
|
|
* EC_RO and aligned to hardware specification.
|
|
*/
|
|
.area_name = "WP_RO",
|
|
.area_offset = CONFIG_FW_WP_RO_OFF,
|
|
.area_size = CONFIG_FW_WP_RO_SIZE,
|
|
.area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
|
|
},
|
|
|
|
/* RW Firmware */
|
|
{
|
|
/* The range of RW firmware to be auto-updated. */
|
|
.area_name = "EC_RW",
|
|
.area_offset = CONFIG_FW_RW_OFF,
|
|
.area_size = CONFIG_FW_RW_SIZE,
|
|
.area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO,
|
|
},
|
|
{
|
|
/*
|
|
* RW firmware version ID. Must be NULL terminated
|
|
* ASCII, and padded with \0.
|
|
*/
|
|
.area_name = "RW_FWID",
|
|
.area_offset = CONFIG_FW_RW_OFF +
|
|
RELATIVE((uint32_t)__version_struct_offset) +
|
|
offsetof(struct version_struct, version),
|
|
.area_size = sizeof(version_data.version),
|
|
.area_flags = FMAP_AREA_STATIC,
|
|
},
|
|
}
|
|
};
|