From 8aecb453fcb26a406d121389c854fa29056f5664 Mon Sep 17 00:00:00 2001 From: Keith Short Date: Mon, 3 Aug 2020 14:33:52 -0600 Subject: 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 Change-Id: I6cd311637e87cd10ac394ff75c4bfc16bbade3b0 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2335739 Reviewed-by: caveh jalali Reviewed-by: Abe Levkoy Commit-Queue: caveh jalali (cherry picked from commit b95587bb7a412d696f0800236bb8977d392e83b0) Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3214008 Tested-by: Rong Chang Auto-Submit: Rong Chang Commit-Queue: Rong Chang Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3631908 Tested-by: Zick Wei Commit-Queue: Henry Sun Reviewed-by: Henry Sun --- common/build.mk | 2 +- common/init_rom.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 common/init_rom.c (limited to 'common') diff --git a/common/build.mk b/common/build.mk index 886591e214..32e61123cb 100644 --- a/common/build.mk +++ b/common/build.mk @@ -47,7 +47,7 @@ common-$(CONFIG_CHARGER_V2)+=charge_state_v2.o common-$(CONFIG_CMD_I2CWEDGE)+=i2c_wedge.o common-$(CONFIG_COMMON_GPIO)+=gpio.o gpio_commands.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); +} + -- cgit v1.2.1