summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/arm/armv7/bootblock_simple.c3
-rw-r--r--src/arch/arm64/arm_tf.c48
-rw-r--r--src/arch/riscv/rom_media.c67
-rw-r--r--src/arch/x86/boot/acpi.c3
-rw-r--r--src/arch/x86/lib/Makefile.inc3
-rw-r--r--src/arch/x86/lib/mmap_boot.c44
-rw-r--r--src/arch/x86/lib/rom_media.c97
7 files changed, 58 insertions, 207 deletions
diff --git a/src/arch/arm/armv7/bootblock_simple.c b/src/arch/arm/armv7/bootblock_simple.c
index 903c24d819..4dc0975e22 100644
--- a/src/arch/arm/armv7/bootblock_simple.c
+++ b/src/arch/arm/armv7/bootblock_simple.c
@@ -21,7 +21,6 @@
#include <arch/exception.h>
#include <arch/stages.h>
#include <bootblock_common.h>
-#include <cbfs.h>
#include <console/console.h>
#include <delay.h>
#include <program_loading.h>
@@ -45,8 +44,6 @@ void main(void)
exception_init();
#endif
- cbfs_set_header_offset(0);
-
bootblock_soc_init();
bootblock_mainboard_init();
diff --git a/src/arch/arm64/arm_tf.c b/src/arch/arm64/arm_tf.c
index 1bdf522a2c..3e0892ec34 100644
--- a/src/arch/arm64/arm_tf.c
+++ b/src/arch/arm64/arm_tf.c
@@ -22,7 +22,7 @@
#include <assert.h>
#include <cbfs.h>
#include <cbmem.h>
-#include <vendorcode/google/chromeos/vboot_handoff.h>
+#include <program_loading.h>
/*
* TODO: Many of these structures are currently unused. Better not fill them out
@@ -37,34 +37,6 @@ static entry_point_info_t bl32_ep_info;
static entry_point_info_t bl33_ep_info;
static bl31_params_t bl31_params;
-/* TODO: Replace with glorious new CBFSv1 solution when it's available. */
-static void *vboot_get_bl31(void)
-{
- void *bl31_entry;
- struct cbfs_media *media;
- struct firmware_component *component;
- struct vboot_handoff *handoff = cbmem_find(CBMEM_ID_VBOOT_HANDOFF);
-
- if (!handoff)
- return NULL;
-
- assert(CONFIG_VBOOT_BL31_INDEX < MAX_PARSED_FW_COMPONENTS);
- component = &handoff->components[CONFIG_VBOOT_BL31_INDEX];
-
- /* components[] is zeroed out before filling, so size == 0 -> missing */
- if (!component->size)
- return NULL;
-
- init_default_cbfs_media(media);
- bl31_entry = cbfs_load_stage_by_offset(media, component->address);
- if (bl31_entry == CBFS_LOAD_ERROR)
- return NULL;
-
- printk(BIOS_INFO, "Loaded %u bytes verified BL31 from %#.8x to EP %p\n",
- component->size, component->address, bl31_entry);
- return bl31_entry;
-}
-
void __attribute__((weak)) *soc_get_bl31_plat_params(bl31_params_t *params)
{
/* Default weak implementation. */
@@ -73,17 +45,19 @@ void __attribute__((weak)) *soc_get_bl31_plat_params(bl31_params_t *params)
void arm_tf_run_bl31(u64 payload_entry, u64 payload_arg0, u64 payload_spsr)
{
- const char *bl31_filename = CONFIG_CBFS_PREFIX"/bl31";
+ struct prog bl31 = {
+ .type = PROG_BL31,
+ .name = CONFIG_CBFS_PREFIX"/bl31",
+ };
void (*bl31_entry)(bl31_params_t *params, void *plat_params) = NULL;
- if (IS_ENABLED(CONFIG_VBOOT2_VERIFY_FIRMWARE))
- bl31_entry = vboot_get_bl31();
+ if (prog_locate(&bl31))
+ die("BL31 not found");
+
+ if (cbfs_prog_stage_load(&bl31))
+ die("BL31 load failed");
- if (!bl31_entry) {
- bl31_entry = cbfs_load_stage(CBFS_DEFAULT_MEDIA, bl31_filename);
- if (bl31_entry == CBFS_LOAD_ERROR)
- die("BL31 not found in CBFS");
- }
+ bl31_entry = prog_entry(&bl31);
SET_PARAM_HEAD(&bl31_params, PARAM_BL31, VERSION_1, 0);
bl31_params.bl33_ep_info = &bl33_ep_info;
diff --git a/src/arch/riscv/rom_media.c b/src/arch/riscv/rom_media.c
index f18030c49f..dd57849db4 100644
--- a/src/arch/riscv/rom_media.c
+++ b/src/arch/riscv/rom_media.c
@@ -18,76 +18,13 @@
* Foundation, Inc.
*/
#include <boot_device.h>
-#include <cbfs.h>
-#include <console/console.h>
-#include <string.h>
/* This assumes that the CBFS resides at 0x0, which is true for the default
* configuration. */
-static const struct mem_region_device gboot_dev =
+static const struct mem_region_device boot_dev =
MEM_REGION_DEV_INIT(NULL, CONFIG_ROM_SIZE);
const struct region_device *boot_device_ro(void)
{
- return &gboot_dev.rdev;
-}
-
-static int rom_media_open(struct cbfs_media *media) {
- return 0;
-}
-
-static void *rom_media_map(struct cbfs_media *media, size_t offset, size_t count) {
- const struct region_device *boot_dev;
- void *ptr;
-
- printk(BIOS_INFO, "%s: media %p, offset %lx, size %ld.\n", __func__, media, offset, count);
- boot_dev = media->context;
-
- ptr = rdev_mmap(boot_dev, offset, count);
-
- if (ptr == NULL)
- return (void *)-1;
-
- return ptr;
-}
-
-static void *rom_media_unmap(struct cbfs_media *media, const void *address) {
- const struct region_device *boot_dev;
-
- boot_dev = media->context;
-
- rdev_munmap(boot_dev, (void *)address);
-
- return NULL;
-}
-
-static size_t rom_media_read(struct cbfs_media *media, void *dest, size_t offset,
- size_t count) {
- const struct region_device *boot_dev;
-
- boot_dev = media->context;
-
- if (rdev_readat(boot_dev, dest, offset, count) < 0)
- return 0;
-
- return count;
-}
-
-static int rom_media_close(struct cbfs_media *media) {
- return 0;
-}
-
-static int init_rom_media_cbfs(struct cbfs_media *media) {
- boot_device_init();
- media->context = (void *)boot_device_ro();
- media->open = rom_media_open;
- media->close = rom_media_close;
- media->map = rom_media_map;
- media->unmap = rom_media_unmap;
- media->read = rom_media_read;
- return 0;
-}
-
-int init_default_cbfs_media(struct cbfs_media *media) {
- return init_rom_media_cbfs(media);
+ return &boot_dev.rdev;
}
diff --git a/src/arch/x86/boot/acpi.c b/src/arch/x86/boot/acpi.c
index 4ce5ed6036..bfdb18fbf8 100644
--- a/src/arch/x86/boot/acpi.c
+++ b/src/arch/x86/boot/acpi.c
@@ -759,8 +759,7 @@ unsigned long write_acpi_tables(unsigned long start)
if (fw)
return fw;
- slic_file = cbfs_get_file_content(CBFS_DEFAULT_MEDIA,
- CONFIG_CBFS_PREFIX "/slic",
+ slic_file = cbfs_boot_map_with_leak(CONFIG_CBFS_PREFIX "/slic",
CBFS_TYPE_RAW, &slic_size);
if (slic_file
&& (slic_file->length > slic_size
diff --git a/src/arch/x86/lib/Makefile.inc b/src/arch/x86/lib/Makefile.inc
index e308be91bc..0d88a6daea 100644
--- a/src/arch/x86/lib/Makefile.inc
+++ b/src/arch/x86/lib/Makefile.inc
@@ -5,7 +5,6 @@ romstage-y += cbfs_and_run.c
romstage-y += memset.c
romstage-y += memcpy.c
romstage-y += memmove.c
-romstage-y += rom_media.c
romstage-y += mmap_boot.c
endif # CONFIG_ARCH_ROMSTAGE_X86_32
@@ -22,7 +21,6 @@ ramstage-y += memset.c
ramstage-y += memcpy.c
ramstage-y += memmove.c
ramstage-y += ebda.c
-ramstage-y += rom_media.c
ramstage-y += mmap_boot.c
ramstage-$(CONFIG_COOP_MULTITASKING) += thread.c
ramstage-$(CONFIG_COOP_MULTITASKING) += thread_switch.S
@@ -33,7 +31,6 @@ romstage-$(CONFIG_COLLECT_TIMESTAMPS) += timestamp.c
smm-y += memset.c
smm-y += memcpy.c
smm-y += memmove.c
-smm-y += rom_media.c
smm-y += mmap_boot.c
rmodules_x86_32-y += memset.c
diff --git a/src/arch/x86/lib/mmap_boot.c b/src/arch/x86/lib/mmap_boot.c
index eb7b23e2b1..4dd269b772 100644
--- a/src/arch/x86/lib/mmap_boot.c
+++ b/src/arch/x86/lib/mmap_boot.c
@@ -18,6 +18,10 @@
*/
#include <boot_device.h>
+#include <console/console.h>
+#include <cbfs.h>
+#include <endian.h>
+#include <stdlib.h>
/* The ROM is memory mapped just below 4GiB. Form a pointer for the base. */
#define rom_base ((void *)(uintptr_t)(-(int32_t)CONFIG_ROM_SIZE))
@@ -29,3 +33,43 @@ const struct region_device *boot_device_ro(void)
{
return &boot_dev.rdev;
}
+
+int cbfs_boot_region_properties(struct cbfs_props *props)
+{
+ struct cbfs_header header;
+ int32_t offset;
+ const struct region_device *bdev;
+
+ bdev = boot_device_ro();
+
+ rdev_readat(bdev, &offset, CONFIG_ROM_SIZE - sizeof(offset),
+ sizeof(offset));
+
+ /* The offset is relative to the end of the media. */
+ offset += CONFIG_ROM_SIZE;
+
+ rdev_readat(bdev, &header , offset, sizeof(header));
+
+ header.magic = ntohl(header.magic);
+ header.romsize = ntohl(header.romsize);
+ header.bootblocksize = ntohl(header.bootblocksize);
+ header.align = ntohl(header.align);
+ header.offset = ntohl(header.offset);
+
+ if (header.magic != CBFS_HEADER_MAGIC)
+ return -1;
+
+ props->align = header.align;
+ props->offset = header.offset;
+ if (CONFIG_ROM_SIZE != header.romsize)
+ props->size = CONFIG_ROM_SIZE;
+ else
+ props->size = header.romsize;
+ props->size -= props->offset;
+ props->size -= header.bootblocksize;
+ props->size = ALIGN_DOWN(props->size, props->align);
+
+ printk(BIOS_DEBUG, "CBFS @ %zx size %zx\n", props->offset, props->size);
+
+ return 0;
+}
diff --git a/src/arch/x86/lib/rom_media.c b/src/arch/x86/lib/rom_media.c
deleted file mode 100644
index d4663c7f60..0000000000
--- a/src/arch/x86/lib/rom_media.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2013 The Chromium OS Authors. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; version 2 of
- * the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc.
- */
-
-#include <boot_device.h>
-#include <cbfs.h>
-#include <string.h>
-
-#ifdef LIBPAYLOAD
-# define printk(x...)
-# define init_default_cbfs_media libpayload_init_default_cbfs_media
- extern int libpayload_init_default_cbfs_media(struct cbfs_media *media);
-#else
-# include <console/console.h>
-#endif
-
-// Implementation of memory-mapped ROM media source on X86.
-
-static int x86_rom_open(struct cbfs_media *media) {
- return 0;
-}
-
-static void *x86_rom_map(struct cbfs_media *media, size_t offset, size_t count) {
- void *ptr;
- const struct region_device *boot_dev;
-
- boot_dev = media->context;
-
- /* Extremely large offsets are considered relative to end of region. */
- if ((uint32_t)offset > (uint32_t)0xf0000000)
- offset += region_device_sz(boot_dev);
-
- ptr = rdev_mmap(boot_dev, offset, count);
-
- if (ptr == NULL)
- return (void *)-1;
-
- return ptr;
-}
-
-static void *x86_rom_unmap(struct cbfs_media *media, const void *address) {
- return NULL;
-}
-
-static size_t x86_rom_read(struct cbfs_media *media, void *dest, size_t offset,
- size_t count) {
- void *ptr;
-
- ptr = x86_rom_map(media, offset, count);
-
- if (ptr == (void *)-1)
- return 0;
-
- memcpy(dest, ptr, count);
- x86_rom_unmap(media, ptr);
- return count;
-}
-
-static int x86_rom_close(struct cbfs_media *media) {
- return 0;
-}
-
-static int init_x86rom_cbfs_media(struct cbfs_media *media) {
- boot_device_init();
-
- media->context = (void *)boot_device_ro();
-
- if (media->context == NULL)
- return -1;
-
- media->open = x86_rom_open;
- media->close = x86_rom_close;
- media->map = x86_rom_map;
- media->unmap = x86_rom_unmap;
- media->read = x86_rom_read;
- return 0;
-}
-
-int init_default_cbfs_media(struct cbfs_media *media) {
- return init_x86rom_cbfs_media(media);
-}