
Signed-off-by: Gabe Black gabeblack@chromium.org --- arch/x86/cpu/coreboot/sdram.c | 32 ++++++++++++++++++++++++++------ arch/x86/include/asm/zimage.h | 5 +++++ arch/x86/lib/zimage.c | 10 ++++++++++ 3 files changed, 41 insertions(+), 6 deletions(-)
diff --git a/arch/x86/cpu/coreboot/sdram.c b/arch/x86/cpu/coreboot/sdram.c index b5b086b..ce73467 100644 --- a/arch/x86/cpu/coreboot/sdram.c +++ b/arch/x86/cpu/coreboot/sdram.c @@ -23,6 +23,8 @@ */
#include <common.h> +#include <malloc.h> +#include <asm/e820.h> #include <asm/u-boot-x86.h> #include <asm/global_data.h> #include <asm/ic/coreboot/sysinfo.h> @@ -30,18 +32,36 @@
DECLARE_GLOBAL_DATA_PTR;
+unsigned install_e820_map(unsigned max_entries, struct e820entry *entries) +{ + int i; + + unsigned num_entries = min(lib_sysinfo.n_memranges, max_entries); + if (num_entries < lib_sysinfo.n_memranges) { + printf("Warning: Limiting e820 map to %d entries.\n", + num_entries); + } + for (i = 0; i < num_entries; i++) { + struct memrange *memrange = &lib_sysinfo.memrange[i]; + + entries[i].addr = memrange->base; + entries[i].size = memrange->size; + entries[i].type = memrange->type; + } + return num_entries; +} + int dram_init_f(void) { int i; phys_size_t ram_size = 0; + for (i = 0; i < lib_sysinfo.n_memranges; i++) { - unsigned long long end = \ - lib_sysinfo.memrange[i].base + - lib_sysinfo.memrange[i].size; - if (lib_sysinfo.memrange[i].type == CB_MEM_RAM && - end > ram_size) { + struct memrange *memrange = &lib_sysinfo.memrange[i]; + unsigned long long end = memrange->base + memrange->size; + + if (memrange->type == CB_MEM_RAM && end > ram_size) ram_size = end; - } } gd->ram_size = ram_size; if (ram_size == 0) diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h index a02637f..b172048 100644 --- a/arch/x86/include/asm/zimage.h +++ b/arch/x86/include/asm/zimage.h @@ -24,6 +24,8 @@ #ifndef _ASM_ZIMAGE_H_ #define _ASM_ZIMAGE_H_
+#include <asm/e820.h> + /* linux i386 zImage/bzImage header. Offsets relative to * the start of the image */
@@ -65,6 +67,9 @@ #define BZIMAGE_LOAD_ADDR 0x100000 #define ZIMAGE_LOAD_ADDR 0x10000
+/* Implementation defined function to install an e820 map. */ +unsigned install_e820_map(unsigned max_entries, struct e820entry *); + void *load_zimage(char *image, unsigned long kernel_size, unsigned long initrd_addr, unsigned long initrd_size, int auto_boot); diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c index 6843ff6..1fde13f 100644 --- a/arch/x86/lib/zimage.c +++ b/arch/x86/lib/zimage.c @@ -51,6 +51,16 @@
#define COMMAND_LINE_SIZE 2048
+unsigned generic_install_e820_map(unsigned max_entries, + struct e820entry *entries) +{ + return 0; +} + +unsigned install_e820_map(unsigned max_entries, + struct e820entry *entries) + __attribute__((weak, alias("generic_install_e820_map"))); + static void build_command_line(char *command_line, int auto_boot) { char *env_command_line;