summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
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);
+}
+