summaryrefslogtreecommitdiff
path: root/src/arch/x86
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/x86')
-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
4 files changed, 45 insertions, 102 deletions
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);
-}