diff options
author | Keith Short <keithshort@chromium.org> | 2020-08-03 14:33:52 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-10-12 15:10:37 +0000 |
commit | 988414d09601d33aa162ca051f0afeacb3884aae (patch) | |
tree | abd85144cc69346d0d235f4fd0965ce4ae3276d3 | |
parent | c71ca8bad2c6a8cea20a589b632f5675d3de1b2c (diff) | |
download | chrome-ec-988414d09601d33aa162ca051f0afeacb3884aae.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.
Conflicts:
include/config.h: CONFIG_CHIP_INIT_ROM_REGION not supported
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>
(cherry picked from commit b95587bb7a412d696f0800236bb8977d392e83b0)
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3214008
Tested-by: Rong Chang <rongchang@chromium.org>
Auto-Submit: Rong Chang <rongchang@chromium.org>
Commit-Queue: Rong Chang <rongchang@chromium.org>
-rw-r--r-- | common/build.mk | 2 | ||||
-rw-r--r-- | common/init_rom.c | 69 | ||||
-rw-r--r-- | include/init_rom.h | 53 |
3 files changed, 123 insertions, 1 deletions
diff --git a/common/build.mk b/common/build.mk index 5953f52681..d17c36c2cf 100644 --- a/common/build.mk +++ b/common/build.mk @@ -57,7 +57,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); +} + diff --git a/include/init_rom.h b/include/init_rom.h new file mode 100644 index 0000000000..6d54e6aec4 --- /dev/null +++ b/include/init_rom.h @@ -0,0 +1,53 @@ +/* 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. + */ + +/* + * Routines for accessing data objects store in the .init_rom region. + * Enabled with the CONFIG_CHIP_INIT_ROM_REGION config option. Data + * objects are placed into the .init_rom region using the __init_rom attribute. + */ + +#ifndef __CROS_EC_INIT_ROM_H +#define __CROS_EC_INIT_ROM_H + +#include "stdbool.h" + +/** + * Get the memory mapped address of an .init_rom data object. + * + * @param offset Address of the data object assigned by the linker. + * This is effectively a flash offset when + * CONFIG_CHIP_INIT_ROM_REGION is enabled, otherwise + * it is a regular address. + * @param size Size of the data object. + * + * @return Pointer to data object in memory. Return NULL if the object + * is not memory mapped. + */ +const void *init_rom_map(const void *addr, int size); + +/** + * Unmaps an .init_rom data object. Must be called when init_rom_map() is + * successful. + * + * @param offset Address of the data object assigned by the linker. + * @param size Size of the data object. + */ +void init_rom_unmap(const void *addr, int size); + +/** + * Copy an .init_rom data object into a RAM location. This routine must be used + * if init_rom_get_addr() returns NULL. This routine automatically handles + * locking of the flash. + * + * @param offset Flash offset of the data object. + * @param size Size of the data object. + * @param data Destination buffer for data. + * + * @return 0 on success. + */ +int init_rom_copy(int offset, int size, char *data); + +#endif /* __CROS_EC_INIT_ROM_H */ |