diff options
author | Keith Short <keithshort@chromium.org> | 2020-08-03 14:33:52 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-08-13 14:26:57 +0000 |
commit | b95587bb7a412d696f0800236bb8977d392e83b0 (patch) | |
tree | bab5fe73c9259598597a6cf6df24ba4b4b57d69f /common | |
parent | e0bf946ced052fe5e857b42da666ba252b03da95 (diff) | |
download | chrome-ec-b95587bb7a412d696f0800236bb8977d392e83b0.tar.gz |
init_rom: Add init_rom layer
Create a thin init_rom layer for accessing data objects linked into the
.init_rom section with the CONFIG_CHIP_INIT_ROM_REGION opton and
__init_rom attribute.
BUG=b:160330682
BRANCH=none
TEST=make buildall
TEST=Using the next CL, verify BMI260 config data can be read using both
memory mapped and indirect access.
Signed-off-by: Keith Short <keithshort@chromium.org>
Change-Id: I6cd311637e87cd10ac394ff75c4bfc16bbade3b0
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2335739
Reviewed-by: caveh jalali <caveh@chromium.org>
Reviewed-by: Abe Levkoy <alevkoy@chromium.org>
Commit-Queue: caveh jalali <caveh@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/build.mk | 2 | ||||
-rw-r--r-- | common/init_rom.c | 69 |
2 files changed, 70 insertions, 1 deletions
diff --git a/common/build.mk b/common/build.mk index 8a2cd33cbd..0a7fbe86cc 100644 --- a/common/build.mk +++ b/common/build.mk @@ -56,7 +56,7 @@ common-$(CONFIG_CMD_I2CWEDGE)+=i2c_wedge.o common-$(CONFIG_COMMON_GPIO)+=gpio.o gpio_commands.o common-$(CONFIG_IO_EXPANDER)+=ioexpander.o common-$(CONFIG_COMMON_PANIC_OUTPUT)+=panic_output.o -common-$(CONFIG_COMMON_RUNTIME)+=hooks.o main.o system.o peripheral.o +common-$(CONFIG_COMMON_RUNTIME)+=hooks.o main.o system.o peripheral.o init_rom.o common-$(CONFIG_COMMON_TIMER)+=timer.o common-$(CONFIG_CRC8)+= crc8.o common-$(CONFIG_CURVE25519)+=curve25519.o diff --git a/common/init_rom.c b/common/init_rom.c new file mode 100644 index 0000000000..fd796f7fe9 --- /dev/null +++ b/common/init_rom.c @@ -0,0 +1,69 @@ +/* Copyright 2020 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. + */ + +/* Init ROM module for Chrome EC */ + +#include "builtin/assert.h" +#include "common.h" +#include "init_rom.h" +#include "flash.h" +#include "stdbool.h" +#include "stddef.h" + +const void *init_rom_map(const void *addr, int size) +{ + const char *src; + uintptr_t offset; + + /* + * When CONFIG_CHIP_INIT_ROM_REGION isn't enabled, .init_rom objects + * are linked into the .rodata section and directly addressable. + * Return the caller's pointer. + */ + if (!IS_ENABLED(CONFIG_CHIP_INIT_ROM_REGION)) + return addr; + + /* + * When flash isn't memory mapped, caller's must use init_rom_copy() + * to copy .init_rom data into RAM. + */ + if (!IS_ENABLED(CONFIG_MAPPED_STORAGE)) + return NULL; + + /* + * Safe pointer conversion - needed for host tests which can have + * 64-bit pointers. + */ + offset = (uintptr_t)addr; + + ASSERT(offset <= __INT_MAX__); + + /* + * Convert flash offset to memory mapped address + */ + if (flash_dataptr((int)offset, size, 1, &src) < 0) + return NULL; + + /* Once the flash offset is validated, lock the flash for the caller */ + flash_lock_mapped_storage(1); + + return src; +} + +/* + * The addr and size parameters are provided for forward compatibility if + * the flash API is extended to support locking less than the entire flash. + */ +void init_rom_unmap(const void *addr, int size) +{ + if (IS_ENABLED(CONFIG_CHIP_INIT_ROM_REGION)) + flash_lock_mapped_storage(0); +} + +int init_rom_copy(int offset, int size, char *data) +{ + return flash_read(offset, size, data); +} + |