summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorVadim Bendebury <vbendeb@chromium.org>2014-12-25 15:07:22 -0800
committerPatrick Georgi <pgeorgi@google.com>2015-04-17 09:54:40 +0200
commit6bfabce33b698571be73a47f62fe733f18e69f66 (patch)
tree9fc265ea3e3552cb0e0ad0b414bebdb4bdf1c0b2 /src/lib
parent7271e23ec296b09420b72861e0d272ecbb94d2ca (diff)
cbfs: look for CBFS header in a predefined place
This patch introduces a new option (CONFIG_MULTIPLE_CBFS_INSTANCES) to allow multiple CBFS instances in the bootrom. When the new option is enabled, the code running on the target controls which CBFS instance is used. Since all other then header CBFS structures use relative addressing, the only value which needs explicit setting is the offset of the CBFS header in the bootrom. This patch adds a facility to set the CBFS header offset. The offset value of zero means default. i.e. the CBFS initialization code still discovers the offset through the value saved at the top of the ROM. BRANCH=storm BUG=chrome-os-partner:34161, chromium:445938 TEST=with the rest patches in, storm target successfully boots from RW section A. Change-Id: Id8333c9373e61597f0c653c727dcee4ef6a58cd2 Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: e57a3a15bba7cdcca4a5d684ed78f8ac6dbbc95e Original-Change-Id: I4c026389ec4fbaa19bd11b2160202282d2f9283c Original-Signed-off-by: Vadim Bendebury <vbendeb@chromium.org> Original-Reviewed-on: https://chromium-review.googlesource.com/237569 Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/9747 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-by: Edward O'Callaghan <edward.ocallaghan@koparo.com>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/cbfs_core.c40
1 files changed, 34 insertions, 6 deletions
diff --git a/src/lib/cbfs_core.c b/src/lib/cbfs_core.c
index 80d66ca3eb..9f45b3cedc 100644
--- a/src/lib/cbfs_core.c
+++ b/src/lib/cbfs_core.c
@@ -47,6 +47,25 @@
#include <cbfs.h>
#include <string.h>
+#include <symbols.h>
+
+#if IS_ENABLED(CONFIG_MULTIPLE_CBFS_INSTANCES)
+void cbfs_set_header_offset(size_t offset)
+{
+ _cbfs_header_offset[0] = offset;
+ LOG("header set to: %#zx\n", offset);
+}
+
+static size_t get_header_offset(void)
+{
+ return _cbfs_header_offset[0];
+}
+#else
+static size_t get_header_offset(void)
+{
+ return 0;
+}
+#endif
#include "cbfs_core.h"
@@ -73,13 +92,22 @@ const struct cbfs_header *cbfs_get_header(struct cbfs_media *media)
offset = *(int32_t *)(uintptr_t)0xfffffffc;
header = media->map(media, offset, sizeof(*header));
} else {
- int32_t rel_offset;
- if (!media->read(media, &rel_offset, CONFIG_CBFS_SIZE -
- sizeof(int32_t), sizeof(int32_t))) {
- ERROR("Could not read CBFS master header offset!\n");
- return CBFS_HEADER_INVALID_ADDRESS;
+
+ offset = get_header_offset();
+
+ if (!offset) {
+ int32_t rel_offset;
+ size_t cbfs_top = CONFIG_CBFS_SIZE;
+ DEBUG("CBFS top at offset: 0x%zx\n", cbfs_top);
+ if (!media->read(media, &rel_offset, cbfs_top -
+ sizeof(int32_t),
+ sizeof(int32_t))) {
+ ERROR("Could not read master header offset!\n");
+ media->close(media);
+ return CBFS_HEADER_INVALID_ADDRESS;
+ }
+ offset = cbfs_top + rel_offset;
}
- offset = CONFIG_CBFS_SIZE + rel_offset;
header = media->map(media, offset, sizeof(*header));
}
DEBUG("CBFS header offset: 0x%zx/0x%x\n", offset, CONFIG_ROM_SIZE);