summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Short <keithshort@chromium.org>2020-08-03 14:33:52 -0600
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-05-16 10:00:27 +0000
commit8aecb453fcb26a406d121389c854fa29056f5664 (patch)
tree1fa0689ff91da40b86ed43779d1f65e7d4b7b50a
parent89fe47e40515f301b654a30bceaced1edfe1fa34 (diff)
downloadchrome-ec-8aecb453fcb26a406d121389c854fa29056f5664.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> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3631908 Tested-by: Zick Wei <zick.wei@quanta.corp-partner.google.com> Commit-Queue: Henry Sun <henrysun@google.com> Reviewed-by: Henry Sun <henrysun@google.com>
-rw-r--r--common/build.mk2
-rw-r--r--common/init_rom.c69
-rw-r--r--include/init_rom.h53
3 files changed, 123 insertions, 1 deletions
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);
+}
+
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 */