summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorKeith Short <keithshort@chromium.org>2020-08-03 14:33:52 -0600
committerCommit Bot <commit-bot@chromium.org>2020-08-13 14:26:57 +0000
commitb95587bb7a412d696f0800236bb8977d392e83b0 (patch)
treebab5fe73c9259598597a6cf6df24ba4b4b57d69f /common
parente0bf946ced052fe5e857b42da666ba252b03da95 (diff)
downloadchrome-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.mk2
-rw-r--r--common/init_rom.c69
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);
+}
+