summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/Makefile.inc15
-rw-r--r--src/lib/cbfs_master_header.c30
-rw-r--r--src/lib/master_header_pointer.c21
3 files changed, 66 insertions, 0 deletions
diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc
index f3da503b8b..a930663047 100644
--- a/src/lib/Makefile.inc
+++ b/src/lib/Makefile.inc
@@ -393,3 +393,18 @@ endif
ramstage-y += uuid.c
romstage-$(CONFIG_SPD_CACHE_IN_FMAP) += spd_cache.c
+
+cbfs-files-y += cbfs_master_header
+cbfs_master_header-file := cbfs_master_header.c:struct
+cbfs_master_header-type := "cbfs header"
+cbfs_master_header-position := 0
+
+ifeq ($(CONFIG_ARCH_X86),y)
+$(call src-to-obj,bootblock,$(dir)/header_pointer.c): $(obj)/fmap_config.h
+bootblock-y += master_header_pointer.c
+else
+cbfs-files-y += header_pointer
+header_pointer-file := master_header_pointer.c:struct
+header_pointer-position := -4
+header_pointer-type := "cbfs header"
+endif
diff --git a/src/lib/cbfs_master_header.c b/src/lib/cbfs_master_header.c
new file mode 100644
index 0000000000..d358d1a37d
--- /dev/null
+++ b/src/lib/cbfs_master_header.c
@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <endian.h>
+#include <fmap_config.h>
+#include <commonlib/bsd/cbfs_serialized.h>
+
+struct cbfs_header header = {
+ .magic = cpu_to_be32(CBFS_HEADER_MAGIC),
+ .version = cpu_to_be32(CBFS_HEADER_VERSION),
+ /*
+ * The offset and romsize fields within the master header are absolute
+ * values within the boot media. As such, romsize needs to reflect
+ * the end 'offset' for a CBFS. To achieve that the current buffer
+ * representing the CBFS region's size is added to the offset of
+ * the region within a larger image.
+ */
+ .romsize = cpu_to_be32(FMAP_SECTION_COREBOOT_START + FMAP_SECTION_COREBOOT_SIZE
+ - FMAP_SECTION_FLASH_START),
+ /*
+ * The 4 bytes are left out for two reasons:
+ * 1. the cbfs master header pointer resides there
+ * 2. some cbfs implementations assume that an image that resides
+ * below 4GB has a bootblock and get confused when the end of the
+ * image is at 4GB == 0.
+ */
+ .bootblocksize = cpu_to_be32(4),
+ .align = cpu_to_be32(CBFS_ALIGNMENT),
+ .offset = cpu_to_be32(FMAP_SECTION_COREBOOT_START - FMAP_SECTION_FLASH_START),
+ .architecture = cpu_to_be32(CBFS_ARCHITECTURE_UNKNOWN),
+};
diff --git a/src/lib/master_header_pointer.c b/src/lib/master_header_pointer.c
new file mode 100644
index 0000000000..b1146121c5
--- /dev/null
+++ b/src/lib/master_header_pointer.c
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <commonlib/bsd/cbfs_serialized.h>
+#include <endian.h>
+#include <fmap_config.h>
+#include <stdint.h>
+
+#if ENV_X86
+__attribute__((used, __section__(".header_pointer")))
+#endif
+
+#if FMAP_SECTION_COREBOOT_START < (0xffffffff - CONFIG_ROM_SIZE + 1)
+#define COREBOOT_CBFS_START (0xffffffff - CONFIG_ROM_SIZE + 1 + FMAP_SECTION_COREBOOT_START)
+#else
+#define COREBOOT_CBFS_START FMAP_SECTION_COREBOOT_START
+#endif
+
+uint32_t header_pointer =
+ cpu_to_le32(COREBOOT_CBFS_START + ALIGN_UP(sizeof(struct cbfs_file)
+ + sizeof("cbfs_master_header"),
+ CBFS_ATTRIBUTE_ALIGN));