From 1167cad6a88e45bbf6a5599f19d018cd6a8b5233 Mon Sep 17 00:00:00 2001 From: Shawn Nematbakhsh Date: Mon, 7 Sep 2015 13:47:48 -0700 Subject: [PATCH] cleanup: Change meaning of storage offset CONFIGs In order to support architectures with non-contiguous writable and protected regions, change storage offsets to be relative to writable and protected regions, rather than relative to "the start of the region of storage belonging to the EC". Spec doc available at https://goo.gl/fnzTvr. BRANCH=None BUG=chrome-os-partner:23796 TEST=With entire patch series, on both Samus and Glados: - Verify 'version' EC console command is correct - Verify 'flashrom -p ec -r read.bin' reads back EC image - Verify software sync correctly flashes both EC and PD RW images Signed-off-by: Shawn Nematbakhsh Change-Id: I796f8e7305a6336495bd256a78774595cb16a2e4 Reviewed-on: https://chromium-review.googlesource.com/297823 Commit-Ready: Shawn N Tested-by: Shawn N Reviewed-by: Randall Spangler --- chip/mec1322/config_chip.h | 4 --- chip/mec1322/config_flash_layout.h | 21 +++++++------- chip/mec1322/flash.c | 16 ++++------- chip/mec1322/lfw/ec_lfw.c | 6 ++-- chip/npcx/config_flash_layout.h | 15 ++++++---- common/flash.c | 41 +++++++++++++++++++++------- common/fmap.c | 41 ++++++++++++++++++++++------ common/system.c | 17 ++++++++---- common/usb_pd_policy.c | 12 +++++--- common/vboot_hash.c | 13 ++++++--- ec.bin | Bin 0 -> 131072 bytes include/config.h | 21 +++++++------- include/config_std_internal_flash.h | 13 ++++++--- include/flash.h | 4 +-- test/flash.c | 4 ++- 15 files changed, 146 insertions(+), 82 deletions(-) create mode 100644 ec.bin diff --git a/chip/mec1322/config_chip.h b/chip/mec1322/config_chip.h index 2309baad60..a693232a99 100644 --- a/chip/mec1322/config_chip.h +++ b/chip/mec1322/config_chip.h @@ -94,10 +94,6 @@ /* One page size for write */ #define CONFIG_FLASH_WRITE_IDEAL_SIZE 256 -/* Independent of the Flash Physical size of the board -256KB Max size used. Located at the top most segment */ -#define CONFIG_FLASH_PHYSICAL_SIZE 0x00040000 - /* Program memory base address */ #define CONFIG_PROGRAM_MEMORY_BASE 0x00100000 diff --git a/chip/mec1322/config_flash_layout.h b/chip/mec1322/config_flash_layout.h index 0efa9d8345..6b037df6d0 100644 --- a/chip/mec1322/config_flash_layout.h +++ b/chip/mec1322/config_flash_layout.h @@ -20,13 +20,19 @@ #undef CONFIG_FLASH_PSTATE #define CONFIG_SPI_FLASH -/* Size of SPI memory used by EC (lfw + RSA Keys + RO + RW + boot header) */ -#define CONFIG_FLASH_BASE_SPI (CONFIG_SPI_FLASH_SIZE - (0x40000)) +/* EC region of SPI resides at end of ROM, protected region follows writable */ +#define CONFIG_EC_PROTECTED_STORAGE_OFF (CONFIG_SPI_FLASH_SIZE - 0x20000) +#define CONFIG_EC_PROTECTED_STORAGE_SIZE 0x20000 +#define CONFIG_EC_WRITABLE_STORAGE_OFF (CONFIG_SPI_FLASH_SIZE - 0x40000) +#define CONFIG_EC_WRITABLE_STORAGE_SIZE 0x20000 + /* Size of one firmware image in flash */ #ifndef CONFIG_FW_IMAGE_SIZE #define CONFIG_FW_IMAGE_SIZE (96 * 1024) #endif +/* redundant..*/ +#define CONFIG_FLASH_PHYSICAL_SIZE CONFIG_SPI_FLASH_SIZE #define CONFIG_FLASH_SIZE CONFIG_FLASH_PHYSICAL_SIZE /* Loader resides at the beginning of program memory */ @@ -34,12 +40,12 @@ #define CONFIG_LOADER_SIZE 0x1000 /* Write protect Loader and RO Image */ -#define CONFIG_WP_OFF (CONFIG_FLASH_PHYSICAL_SIZE >> 1) +#define CONFIG_WP_STORAGE_OFF CONFIG_EC_PROTECTED_STORAGE_OFF /* * Write protect 128k section of 256k physical flash which contains loader * and RO Images. */ -#define CONFIG_WP_SIZE (CONFIG_FLASH_PHYSICAL_SIZE >> 1) +#define CONFIG_WP_STORAGE_SIZE CONFIG_EC_PROTECTED_STORAGE_SIZE /* * RO / RW images follow the loader in program memory. Either RO or RW @@ -52,7 +58,7 @@ #define CONFIG_RW_SIZE CONFIG_RO_SIZE /* WP region consists of second half of SPI, and begins with the boot header */ -#define CONFIG_BOOT_HEADER_STORAGE_OFF CONFIG_WP_OFF +#define CONFIG_BOOT_HEADER_STORAGE_OFF 0 #define CONFIG_BOOT_HEADER_STORAGE_SIZE 0x240 /* Loader / lfw image immediately follows the boot header on SPI */ @@ -66,9 +72,4 @@ /* RW image starts at the beginning of SPI */ #define CONFIG_RW_STORAGE_OFF 0 -#define CONFIG_RO_IMAGE_FLASHADDR (CONFIG_FLASH_BASE_SPI + \ - CONFIG_RO_STORAGE_OFF) -#define CONFIG_RW_IMAGE_FLASHADDR (CONFIG_FLASH_BASE_SPI + \ - CONFIG_RW_STORAGE_OFF) - #endif /* __CROS_EC_CONFIG_FLASH_LAYOUT_H */ diff --git a/chip/mec1322/flash.c b/chip/mec1322/flash.c index c04347cae1..d628109108 100644 --- a/chip/mec1322/flash.c +++ b/chip/mec1322/flash.c @@ -38,8 +38,6 @@ int flash_physical_read(int offset, int size, char *data) { int ret, i, read_size; - offset += CONFIG_FLASH_BASE_SPI; - for (i = 0; i < size; i += read_size) { read_size = MIN((size - i), SPI_FLASH_MAX_READ_SIZE); ret = spi_flash_read((uint8_t *)(data + i), @@ -70,8 +68,6 @@ int flash_physical_write(int offset, int size, const char *data) if (entire_flash_locked) return EC_ERROR_ACCESS_DENIED; - offset += CONFIG_FLASH_BASE_SPI; - /* Fail if offset, size, and data aren't at least word-aligned */ if ((offset | size | (uint32_t)(uintptr_t)data) & 3) return EC_ERROR_INVAL; @@ -102,7 +98,6 @@ int flash_physical_erase(int offset, int size) if (entire_flash_locked) return EC_ERROR_ACCESS_DENIED; - offset += CONFIG_FLASH_BASE_SPI; ret = spi_flash_erase(offset, size); return ret; } @@ -115,8 +110,7 @@ int flash_physical_erase(int offset, int size) */ int flash_physical_get_protect(int bank) { - return spi_flash_check_protect(CONFIG_FLASH_BASE_SPI + - bank * CONFIG_FLASH_BANK_SIZE, + return spi_flash_check_protect(bank * CONFIG_FLASH_BANK_SIZE, CONFIG_FLASH_BANK_SIZE); } @@ -153,8 +147,8 @@ uint32_t flash_physical_get_protect_flags(void) { uint32_t flags = 0; - if (spi_flash_check_protect(CONFIG_FLASH_BASE_SPI + - CONFIG_RO_STORAGE_OFF, CONFIG_RO_SIZE)) { + if (spi_flash_check_protect(CONFIG_WP_STORAGE_OFF, + CONFIG_WP_STORAGE_SIZE)) { flags |= EC_FLASH_PROTECT_RO_AT_BOOT | EC_FLASH_PROTECT_RO_NOW; } @@ -225,8 +219,8 @@ int flash_physical_protect_at_boot(enum flash_wp_range range) entire_flash_locked = 1; /* Fallthrough */ case FLASH_WP_RO: - offset = CONFIG_FLASH_BASE_SPI + CONFIG_WP_OFF; - size = CONFIG_WP_SIZE; + offset = CONFIG_WP_STORAGE_OFF; + size = CONFIG_WP_STORAGE_SIZE; flashwp = SPI_WP_HARDWARE; break; } diff --git a/chip/mec1322/lfw/ec_lfw.c b/chip/mec1322/lfw/ec_lfw.c index db02a7df57..87940ad2f7 100644 --- a/chip/mec1322/lfw/ec_lfw.c +++ b/chip/mec1322/lfw/ec_lfw.c @@ -259,11 +259,13 @@ void lfw_main() case SYSTEM_IMAGE_RW: uart_puts("lfw-RW load\n"); init_addr = CONFIG_RW_MEM_OFF + CONFIG_PROGRAM_MEMORY_BASE; - spi_image_load(CONFIG_RW_IMAGE_FLASHADDR); + spi_image_load(CONFIG_EC_WRITABLE_STORAGE_OFF + + CONFIG_RW_STORAGE_OFF); break; case SYSTEM_IMAGE_RO: uart_puts("lfw-RO load\n"); - spi_image_load(CONFIG_RO_IMAGE_FLASHADDR); + spi_image_load(CONFIG_EC_PROTECTED_STORAGE_OFF + + CONFIG_RO_STORAGE_OFF); /* fall through */ default: MEC1322_VBAT_RAM(MEC1322_IMAGETYPE_IDX) = diff --git a/chip/npcx/config_flash_layout.h b/chip/npcx/config_flash_layout.h index 9710d2b1e5..efdfdf171e 100644 --- a/chip/npcx/config_flash_layout.h +++ b/chip/npcx/config_flash_layout.h @@ -20,6 +20,11 @@ #define CONFIG_MAPPED_STORAGE_BASE 0x64000000 #undef CONFIG_FLASH_PSTATE +#define CONFIG_EC_PROTECTED_STORAGE_OFF (CONFIG_SPI_FLASH_SIZE - 0x40000) +#define CONFIG_EC_PROTECTED_STORAGE_SIZE 0x20000 +#define CONFIG_EC_WRITABLE_STORAGE_OFF (CONFIG_SPI_FLASH_SIZE - 0x20000) +#define CONFIG_EC_WRITABLE_STORAGE_SIZE 0x20000 + /* Size of one firmware image in flash */ #ifndef CONFIG_FW_IMAGE_SIZE #define CONFIG_FW_IMAGE_SIZE (CONFIG_FLASH_PHYSICAL_SIZE / 2) @@ -30,8 +35,8 @@ #define CONFIG_RO_HDR_MEM_OFF 0x0 #define CONFIG_RO_HDR_SIZE 0x40 -#define CONFIG_WP_OFF CONFIG_RO_STORAGE_OFF -#define CONFIG_WP_SIZE CONFIG_FW_IMAGE_SIZE +#define CONFIG_WP_STORAGE_OFF CONFIG_EC_PROTECTED_STORAGE_OFF +#define CONFIG_WP_STORAGE_SIZE CONFIG_EC_PROTECTED_STORAGE_SIZE /* RO firmware offset in flash */ #define CONFIG_RO_MEM_OFF CONFIG_RO_HDR_SIZE @@ -42,8 +47,8 @@ #define CONFIG_RW_MEM_OFF CONFIG_RW_STORAGE_OFF #define CONFIG_RW_SIZE (96 * 1024) /* 96KB for RW FW */ -/* The storage offset of ec.R*.flat */ -#define CONFIG_RO_STORAGE_OFF 0 -#define CONFIG_RW_STORAGE_OFF CONFIG_FW_IMAGE_SIZE /* 128 KB alignemnt */ +/* The storage offset of ec.R*.flat which is used for CONFIG_CDRAM_ARCH */ +#define CONFIG_RO_STORAGE_OFF CONFIG_RO_HDR_SIZE +#define CONFIG_RW_STORAGE_OFF 0 #endif /* __CROS_EC_CONFIG_FLASH_LAYOUT_H */ diff --git a/common/flash.c b/common/flash.c index b2c3847e60..72dbe35843 100644 --- a/common/flash.c +++ b/common/flash.c @@ -722,11 +722,24 @@ DECLARE_CONSOLE_COMMAND(flashwp, command_flash_wp, /*****************************************************************************/ /* Host commands */ +/* + * All internal EC code assumes that offsets are provided relative to + * physical address zero of storage. In some cases, the region of storage + * belonging to the EC is not physical address zero - a non-zero fmap_base + * indicates so. Since fmap_base is not yet handled correctly by external + * code, we must perform the adjustment in our host command handlers - + * adjust all offsets so they are relative to the beginning of the storage + * region belonging to the EC. TODO(crbug.com/529365): Handle fmap_base + * correctly in flashrom, dump_fmap, etc. and remove EC_FLASH_REGION_START. + */ +#define EC_FLASH_REGION_START MIN(CONFIG_EC_PROTECTED_STORAGE_OFF, \ + CONFIG_EC_WRITABLE_STORAGE_OFF) + static int flash_command_get_info(struct host_cmd_handler_args *args) { struct ec_response_flash_info_1 *r = args->response; - r->flash_size = CONFIG_FLASH_SIZE; + r->flash_size = CONFIG_FLASH_SIZE - EC_FLASH_REGION_START; r->write_block_size = CONFIG_FLASH_WRITE_SIZE; r->erase_block_size = CONFIG_FLASH_ERASE_SIZE; r->protect_block_size = CONFIG_FLASH_BANK_SIZE; @@ -772,11 +785,12 @@ DECLARE_HOST_COMMAND(EC_CMD_FLASH_INFO, static int flash_command_read(struct host_cmd_handler_args *args) { const struct ec_params_flash_read *p = args->params; + uint32_t offset = p->offset + EC_FLASH_REGION_START; if (p->size > args->response_max) return EC_RES_OVERFLOW; - if (flash_read(p->offset, p->size, args->response)) + if (flash_read(offset, p->size, args->response)) return EC_RES_ERROR; args->response_size = p->size; @@ -796,6 +810,7 @@ DECLARE_HOST_COMMAND(EC_CMD_FLASH_READ, static int flash_command_write(struct host_cmd_handler_args *args) { const struct ec_params_flash_write *p = args->params; + uint32_t offset = p->offset + EC_FLASH_REGION_START; if (flash_get_protect() & EC_FLASH_PROTECT_ALL_NOW) return EC_RES_ACCESS_DENIED; @@ -803,10 +818,10 @@ static int flash_command_write(struct host_cmd_handler_args *args) if (p->size + sizeof(*p) > args->params_size) return EC_RES_INVALID_PARAM; - if (system_unsafe_to_overwrite(p->offset, p->size)) + if (system_unsafe_to_overwrite(offset, p->size)) return EC_RES_ACCESS_DENIED; - if (flash_write(p->offset, p->size, (const uint8_t *)(p + 1))) + if (flash_write(offset, p->size, (const uint8_t *)(p + 1))) return EC_RES_ERROR; return EC_RES_SUCCESS; @@ -818,11 +833,12 @@ DECLARE_HOST_COMMAND(EC_CMD_FLASH_WRITE, static int flash_command_erase(struct host_cmd_handler_args *args) { const struct ec_params_flash_erase *p = args->params; + uint32_t offset = p->offset + EC_FLASH_REGION_START; if (flash_get_protect() & EC_FLASH_PROTECT_ALL_NOW) return EC_RES_ACCESS_DENIED; - if (system_unsafe_to_overwrite(p->offset, p->size)) + if (system_unsafe_to_overwrite(offset, p->size)) return EC_RES_ACCESS_DENIED; /* Indicate that we might be a while */ @@ -830,7 +846,7 @@ static int flash_command_erase(struct host_cmd_handler_args *args) args->result = EC_RES_IN_PROGRESS; host_send_response(args); #endif - if (flash_erase(p->offset, p->size)) + if (flash_erase(offset, p->size)) return EC_RES_ERROR; return EC_RES_SUCCESS; @@ -890,16 +906,21 @@ static int flash_command_region_info(struct host_cmd_handler_args *args) switch (p->region) { case EC_FLASH_REGION_RO: - r->offset = CONFIG_RO_STORAGE_OFF; + r->offset = CONFIG_EC_PROTECTED_STORAGE_OFF + + CONFIG_RO_STORAGE_OFF - + EC_FLASH_REGION_START; r->size = CONFIG_RO_SIZE; break; case EC_FLASH_REGION_RW: - r->offset = CONFIG_RW_STORAGE_OFF; + r->offset = CONFIG_EC_WRITABLE_STORAGE_OFF + + CONFIG_RW_STORAGE_OFF - + EC_FLASH_REGION_START; r->size = CONFIG_RW_SIZE; break; case EC_FLASH_REGION_WP_RO: - r->offset = CONFIG_WP_OFF; - r->size = CONFIG_WP_SIZE; + r->offset = CONFIG_WP_STORAGE_OFF - + EC_FLASH_REGION_START; + r->size = CONFIG_WP_STORAGE_SIZE; break; default: return EC_RES_INVALID_PARAM; diff --git a/common/fmap.c b/common/fmap.c index 4fbafe6f91..35111c6d1d 100644 --- a/common/fmap.c +++ b/common/fmap.c @@ -7,6 +7,7 @@ #include #include "common.h" +#include "util.h" #include "version.h" /* FMAP structs. See http://code.google.com/p/flashmap/wiki/FmapSpec */ @@ -20,10 +21,25 @@ * For address containing CONFIG_PROGRAM_MEMORY_BASE (symbols in *.RO.lds.S and * variable), this computes the offset to the start of the image on flash. */ - #define RELATIVE_RO(addr) ((addr) - CONFIG_PROGRAM_MEMORY_BASE - \ CONFIG_RO_MEM_OFF) +/* + * All internal EC code assumes that offsets are provided relative to + * physical address zero of storage. In some cases, the region of storage + * belonging to the EC is not physical address zero - a non-zero fmap_base + * indicates so. Since fmap_base is not yet handled correctly by external + * code, we must perform the adjustment in our host command handlers - + * adjust all offsets so they are relative to the beginning of the storage + * region belonging to the EC. TODO(crbug.com/529365): Handle fmap_base + * correctly in flashrom, dump_fmap, etc. and remove EC_FLASH_REGION_START. + */ +#if CONFIG_EC_WRITABLE_STORAGE_OFF < CONFIG_EC_PROTECTED_STORAGE_OFF +#define FMAP_REGION_START CONFIG_EC_WRITABLE_STORAGE_OFF +#else +#define FMAP_REGION_START CONFIG_EC_PROTECTED_STORAGE_OFF +#endif + struct fmap_header { char fmap_signature[FMAP_SIGNATURE_SIZE]; uint8_t fmap_ver_major; @@ -71,14 +87,16 @@ const struct _ec_fmap { * volatile data (ex, calibration results). */ .area_name = "EC_RO", - .area_offset = CONFIG_RO_STORAGE_OFF, + .area_offset = CONFIG_EC_PROTECTED_STORAGE_OFF - + FMAP_REGION_START + CONFIG_RO_STORAGE_OFF, .area_size = CONFIG_RO_SIZE, .area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO, }, { /* (Optional) RO firmware code. */ .area_name = "FR_MAIN", - .area_offset = CONFIG_RO_STORAGE_OFF, + .area_offset = CONFIG_EC_PROTECTED_STORAGE_OFF - + FMAP_REGION_START + CONFIG_RO_STORAGE_OFF, .area_size = CONFIG_RO_SIZE, .area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO, }, @@ -88,7 +106,8 @@ const struct _ec_fmap { * ASCII, and padded with \0. */ .area_name = "RO_FRID", - .area_offset = CONFIG_RO_STORAGE_OFF + + .area_offset = CONFIG_EC_PROTECTED_STORAGE_OFF - + FMAP_REGION_START + CONFIG_RO_STORAGE_OFF + RELATIVE_RO((uint32_t)__version_struct_offset) + offsetof(struct version_struct, version), .area_size = sizeof(version_data.version), @@ -98,7 +117,8 @@ const struct _ec_fmap { /* Other RO stuff: FMAP, WP, KEYS, etc. */ { .area_name = "FMAP", - .area_offset = CONFIG_RO_STORAGE_OFF + + .area_offset = CONFIG_EC_PROTECTED_STORAGE_OFF - + FMAP_REGION_START + CONFIG_RO_STORAGE_OFF + RELATIVE_RO((uint32_t)&ec_fmap), .area_size = sizeof(ec_fmap), .area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO, @@ -110,8 +130,9 @@ const struct _ec_fmap { * EC_RO and aligned to hardware specification. */ .area_name = "WP_RO", - .area_offset = CONFIG_WP_OFF, - .area_size = CONFIG_WP_SIZE, + .area_offset = CONFIG_WP_STORAGE_OFF - + FMAP_REGION_START, + .area_size = CONFIG_WP_STORAGE_SIZE, .area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO, }, @@ -119,7 +140,8 @@ const struct _ec_fmap { { /* The range of RW firmware to be auto-updated. */ .area_name = "EC_RW", - .area_offset = CONFIG_RW_STORAGE_OFF, + .area_offset = CONFIG_EC_WRITABLE_STORAGE_OFF - + FMAP_REGION_START + CONFIG_RW_STORAGE_OFF, .area_size = CONFIG_RW_SIZE, .area_flags = FMAP_AREA_STATIC | FMAP_AREA_RO, }, @@ -132,7 +154,8 @@ const struct _ec_fmap { * accomodate image asymmetry. */ .area_name = "RW_FWID", - .area_offset = CONFIG_RW_STORAGE_OFF + + .area_offset = CONFIG_EC_WRITABLE_STORAGE_OFF - + FMAP_REGION_START + CONFIG_RW_STORAGE_OFF + RELATIVE_RO((uint32_t)__version_struct_offset) + offsetof(struct version_struct, version), .area_size = sizeof(version_data.version), diff --git a/common/system.c b/common/system.c index 690403a94f..3d3d3d24cd 100644 --- a/common/system.c +++ b/common/system.c @@ -351,8 +351,9 @@ int system_get_image_used(enum system_image_copy_t copy) * the end of the image. */ #ifndef CONFIG_MAPPED_STORAGE - image_offset = (copy == SYSTEM_IMAGE_RW) ? CONFIG_RW_STORAGE_OFF : - CONFIG_RO_STORAGE_OFF; + image_offset = (copy == SYSTEM_IMAGE_RW) ? + CONFIG_EC_WRITABLE_STORAGE_OFF + CONFIG_RW_STORAGE_OFF : + CONFIG_EC_PROTECTED_STORAGE_OFF + CONFIG_RO_STORAGE_OFF; image = buf; do { @@ -382,11 +383,13 @@ test_mockable int system_unsafe_to_overwrite(uint32_t offset, uint32_t size) switch (system_get_image_copy()) { case SYSTEM_IMAGE_RO: - r_offset = CONFIG_RO_STORAGE_OFF; + r_offset = CONFIG_EC_PROTECTED_STORAGE_OFF + + CONFIG_RO_STORAGE_OFF; r_size = CONFIG_RO_SIZE; break; case SYSTEM_IMAGE_RW: - r_offset = CONFIG_RW_STORAGE_OFF; + r_offset = CONFIG_EC_WRITABLE_STORAGE_OFF + + CONFIG_RW_STORAGE_OFF; r_size = CONFIG_RW_SIZE; break; default: @@ -564,10 +567,12 @@ const char *system_get_version(enum system_image_copy_t copy) * Read the version information from the proper location * on storage. */ - addr += (copy == SYSTEM_IMAGE_RW) ? CONFIG_RW_STORAGE_OFF : - CONFIG_RO_STORAGE_OFF; + addr += (copy == SYSTEM_IMAGE_RW) ? + CONFIG_EC_WRITABLE_STORAGE_OFF + CONFIG_RW_STORAGE_OFF : + CONFIG_EC_PROTECTED_STORAGE_OFF + CONFIG_RO_STORAGE_OFF; #ifdef CONFIG_MAPPED_STORAGE + addr += CONFIG_MAPPED_STORAGE_BASE; v = (const struct version_struct *)addr; #else diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c index e628e6e556..0cd4160614 100644 --- a/common/usb_pd_policy.c +++ b/common/usb_pd_policy.c @@ -816,7 +816,8 @@ DECLARE_HOST_COMMAND(EC_CMD_USB_PD_GET_AMODE, #endif -#define FW_RW_END (CONFIG_RW_STORAGE_OFF + CONFIG_RW_SIZE) +#define FW_RW_END (CONFIG_EC_WRITABLE_STORAGE_OFF + \ + CONFIG_RW_STORAGE_OFF + CONFIG_RW_SIZE) uint8_t *flash_hash_rw(void) { @@ -878,14 +879,17 @@ int pd_custom_flash_vdm(int port, int cnt, uint32_t *payload) if (system_get_image_copy() != SYSTEM_IMAGE_RO) break; pd_log_event(PD_EVENT_ACC_RW_ERASE, 0, 0, NULL); - flash_offset = CONFIG_RW_STORAGE_OFF; - flash_physical_erase(CONFIG_RW_STORAGE_OFF, CONFIG_RW_SIZE); + flash_offset = CONFIG_EC_WRITABLE_STORAGE_OFF + + CONFIG_RW_STORAGE_OFF; + flash_physical_erase(CONFIG_EC_WRITABLE_STORAGE_OFF + + CONFIG_RW_STORAGE_OFF, CONFIG_RW_SIZE); rw_flash_changed = 1; break; case VDO_CMD_FLASH_WRITE: /* do not kill the code under our feet */ if ((system_get_image_copy() != SYSTEM_IMAGE_RO) || - (flash_offset < CONFIG_RW_STORAGE_OFF)) + (flash_offset < CONFIG_EC_WRITABLE_STORAGE_OFF + + CONFIG_RW_STORAGE_OFF)) break; flash_physical_write(flash_offset, 4*(cnt - 1), (const char *)(payload+1)); diff --git a/common/vboot_hash.c b/common/vboot_hash.c index 7726ef7043..e90fe50b07 100644 --- a/common/vboot_hash.c +++ b/common/vboot_hash.c @@ -222,7 +222,8 @@ static void vboot_hash_init(void) #endif { /* Start computing the hash of RW firmware */ - vboot_hash_start(CONFIG_RW_STORAGE_OFF, + vboot_hash_start(CONFIG_EC_WRITABLE_STORAGE_OFF + + CONFIG_RW_STORAGE_OFF, system_get_image_used(SYSTEM_IMAGE_RW), NULL, 0); } @@ -256,7 +257,8 @@ DECLARE_HOOK(HOOK_SYSJUMP, vboot_hash_preserve_state, HOOK_PRIO_DEFAULT); #ifdef CONFIG_CMD_HASH static int command_hash(int argc, char **argv) { - uint32_t offset = CONFIG_RW_STORAGE_OFF; + uint32_t offset = CONFIG_EC_WRITABLE_STORAGE_OFF + + CONFIG_RW_STORAGE_OFF; uint32_t size = CONFIG_RW_SIZE; char *e; @@ -282,11 +284,13 @@ static int command_hash(int argc, char **argv) return EC_SUCCESS; } else if (!strcasecmp(argv[1], "rw")) { return vboot_hash_start( + CONFIG_EC_WRITABLE_STORAGE_OFF + CONFIG_RW_STORAGE_OFF, system_get_image_used(SYSTEM_IMAGE_RW), NULL, 0); } else if (!strcasecmp(argv[1], "ro")) { return vboot_hash_start( + CONFIG_EC_PROTECTED_STORAGE_OFF + CONFIG_RO_STORAGE_OFF, system_get_image_used(SYSTEM_IMAGE_RO), NULL, 0); @@ -359,10 +363,11 @@ static int host_start_hash(const struct ec_params_vboot_hash *p) /* Handle special offset values */ if (offset == EC_VBOOT_HASH_OFFSET_RO) { - offset = CONFIG_RO_STORAGE_OFF; + offset = CONFIG_EC_PROTECTED_STORAGE_OFF + + CONFIG_RO_STORAGE_OFF; size = system_get_image_used(SYSTEM_IMAGE_RO); } else if (p->offset == EC_VBOOT_HASH_OFFSET_RW) { - offset = CONFIG_RW_STORAGE_OFF; + offset = CONFIG_EC_WRITABLE_STORAGE_OFF + CONFIG_RW_STORAGE_OFF; size = system_get_image_used(SYSTEM_IMAGE_RW); } diff --git a/ec.bin b/ec.bin new file mode 100644 index 0000000000000000000000000000000000000000..9cf7667e1986084d3b535315ea999bbce8348504 GIT binary patch literal 131072 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 literal 0 HcmV?d00001 diff --git a/include/config.h b/include/config.h index f73773e416..c903a92758 100644 --- a/include/config.h +++ b/include/config.h @@ -732,8 +732,13 @@ #undef CONFIG_FLASH_WRITE_IDEAL_SIZE #undef CONFIG_FLASH_WRITE_SIZE -/* Base address of SPI Flash. */ -#undef CONFIG_FLASH_BASE_SPI +/* Protected region of storage belonging to EC */ +#undef CONFIG_EC_PROTECTED_STORAGE_OFF +#undef CONFIG_EC_PROTECTED_STORAGE_SIZE + +/* Writable region of storage belonging to EC */ +#undef CONFIG_EC_WRITABLE_STORAGE_OFF +#undef CONFIG_EC_WRITABLE_STORAGE_SIZE /*****************************************************************************/ @@ -760,10 +765,12 @@ * for STORAGE and for MEMORY. */ #undef CONFIG_RO_MEM_OFF +/* Offset relative to CONFIG_EC_PROTECTED_STORAGE_OFF */ #undef CONFIG_RO_STORAGE_OFF #undef CONFIG_RO_SIZE #undef CONFIG_RW_MEM_OFF +/* Offset relative to CONFIG_EC_WRITABLE_STORAGE_OFF */ #undef CONFIG_RW_STORAGE_OFF #undef CONFIG_RW_SIZE @@ -778,8 +785,8 @@ * Write protect region offset / size. This region normally encompasses the * RO image, but may also contain additional images or data. */ -#undef CONFIG_WP_OFF -#undef CONFIG_WP_SIZE +#undef CONFIG_WP_STORAGE_OFF +#undef CONFIG_WP_STORAGE_SIZE /* * Board Image ec.bin contains a RO firmware. If not defined, the image will @@ -1353,12 +1360,6 @@ /* Define the RSA key size. */ #undef CONFIG_RSA_KEY_SIZE -/* Flash address of the RO image. */ -#undef CONFIG_RO_IMAGE_FLASHADDR - -/* Flash address of the RW image. */ -#undef CONFIG_RW_IMAGE_FLASHADDR - /* * Verify the RW firmware using the RSA signature. * (for accessories without software sync) diff --git a/include/config_std_internal_flash.h b/include/config_std_internal_flash.h index 51bd011304..35561a59da 100644 --- a/include/config_std_internal_flash.h +++ b/include/config_std_internal_flash.h @@ -67,11 +67,16 @@ #define CONFIG_RO_SIZE (CONFIG_FW_IMAGE_SIZE - CONFIG_FW_PSTATE_SIZE) #define CONFIG_RW_MEM_OFF (CONFIG_SHAREDLIB_MEM_OFF + \ CONFIG_SHAREDLIB_SIZE) -#define CONFIG_RW_STORAGE_OFF (CONFIG_SHAREDLIB_STORAGE_OFF + \ - CONFIG_SHAREDLIB_SIZE) +#define CONFIG_RW_STORAGE_OFF 0 #define CONFIG_RW_SIZE CONFIG_FW_IMAGE_SIZE -#define CONFIG_WP_OFF CONFIG_RO_STORAGE_OFF -#define CONFIG_WP_SIZE CONFIG_FW_IMAGE_SIZE +#define CONFIG_EC_PROTECTED_STORAGE_OFF 0 +#define CONFIG_EC_PROTECTED_STORAGE_SIZE CONFIG_RW_MEM_OFF +#define CONFIG_EC_WRITABLE_STORAGE_OFF CONFIG_RW_MEM_OFF +#define CONFIG_EC_WRITABLE_STORAGE_SIZE (CONFIG_FLASH_SIZE - \ + CONFIG_EC_WRITABLE_STORAGE_OFF) + +#define CONFIG_WP_STORAGE_OFF CONFIG_EC_PROTECTED_STORAGE_OFF +#define CONFIG_WP_STORAGE_SIZE CONFIG_EC_PROTECTED_STORAGE_SIZE #endif /* __CROS_EC_CONFIG_STD_INTERNAL_FLASH_H */ diff --git a/include/flash.h b/include/flash.h index 24922e04dc..6117d30025 100644 --- a/include/flash.h +++ b/include/flash.h @@ -15,8 +15,8 @@ #define PHYSICAL_BANKS (CONFIG_FLASH_PHYSICAL_SIZE / CONFIG_FLASH_BANK_SIZE) /*WP region offset and size in units of flash banks */ -#define WP_BANK_OFFSET (CONFIG_WP_OFF / CONFIG_FLASH_BANK_SIZE) -#define WP_BANK_COUNT (CONFIG_WP_SIZE / CONFIG_FLASH_BANK_SIZE) +#define WP_BANK_OFFSET (CONFIG_WP_STORAGE_OFF / CONFIG_FLASH_BANK_SIZE) +#define WP_BANK_COUNT (CONFIG_WP_STORAGE_SIZE / CONFIG_FLASH_BANK_SIZE) /* Persistent protection state flash offset / size / bank */ #if defined(CONFIG_FLASH_PSTATE) && defined(CONFIG_FLASH_PSTATE_BANK) diff --git a/test/flash.c b/test/flash.c index da3df8a1ad..260d79d3d6 100644 --- a/test/flash.c +++ b/test/flash.c @@ -361,11 +361,13 @@ static int test_flash_info(void) static int test_region_info(void) { VERIFY_REGION_INFO(EC_FLASH_REGION_RO, + CONFIG_EC_PROTECTED_STORAGE_OFF + CONFIG_RO_STORAGE_OFF, CONFIG_RO_SIZE); VERIFY_REGION_INFO(EC_FLASH_REGION_RW, + CONFIG_EC_WRITABLE_STORAGE_OFF + CONFIG_RW_STORAGE_OFF, CONFIG_RW_SIZE); VERIFY_REGION_INFO(EC_FLASH_REGION_WP_RO, - CONFIG_WP_OFF, CONFIG_WP_SIZE); + CONFIG_WP_STORAGE_OFF, CONFIG_WP_STORAGE_SIZE); return EC_SUCCESS; }