mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-29 09:45:52 +00:00
x86: Allow installing an e820 when booting from coreboot
Move this code into a generic location so that it can be used by other x86 boards which want to boot from coreboot. Also ensure that this is called if booting from coreboot. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
1058ab37f7
commit
e7bae8283f
5 changed files with 69 additions and 29 deletions
|
@ -16,32 +16,7 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
unsigned int install_e820_map(unsigned int max_entries,
|
unsigned int install_e820_map(unsigned int max_entries,
|
||||||
struct e820_entry *entries)
|
struct e820_entry *entries)
|
||||||
{
|
{
|
||||||
unsigned int num_entries;
|
return cb_install_e820_map(max_entries, entries);
|
||||||
int i;
|
|
||||||
|
|
||||||
num_entries = min((unsigned int)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;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* coreboot has some extensions (type 6 & 16) to the E820 types.
|
|
||||||
* When we detect this, mark it as E820_RESERVED.
|
|
||||||
*/
|
|
||||||
if (memrange->type == CB_MEM_VENDOR_RSVD ||
|
|
||||||
memrange->type == CB_MEM_TABLE)
|
|
||||||
entries[i].type = E820_RESERVED;
|
|
||||||
else
|
|
||||||
entries[i].type = memrange->type;
|
|
||||||
}
|
|
||||||
|
|
||||||
return num_entries;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -22,9 +22,23 @@ struct e820_entry {
|
||||||
#define ISA_START_ADDRESS 0xa0000
|
#define ISA_START_ADDRESS 0xa0000
|
||||||
#define ISA_END_ADDRESS 0x100000
|
#define ISA_END_ADDRESS 0x100000
|
||||||
|
|
||||||
/* Implementation defined function to install an e820 map */
|
/* Implementation-defined function to install an e820 map */
|
||||||
unsigned int install_e820_map(unsigned int max_entries,
|
unsigned int install_e820_map(unsigned int max_entries,
|
||||||
struct e820_entry *);
|
struct e820_entry *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cb_install_e820_map() - Install e820 map provided by coreboot sysinfo
|
||||||
|
*
|
||||||
|
* This should be used when booting from coreboot, since in that case the
|
||||||
|
* memory areas are provided by coreboot in its sysinfo.
|
||||||
|
*
|
||||||
|
* @max_entries: Maximum number of entries to write
|
||||||
|
* @entries: Place to put entires
|
||||||
|
* @return number of entries written
|
||||||
|
*/
|
||||||
|
unsigned int cb_install_e820_map(unsigned int max_entries,
|
||||||
|
struct e820_entry *entries);
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#endif /* _ASM_X86_E820_H */
|
#endif /* _ASM_X86_E820_H */
|
||||||
|
|
|
@ -4,3 +4,4 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-y += cb_sysinfo.o
|
obj-y += cb_sysinfo.o
|
||||||
|
obj-y += cb_support.o
|
||||||
|
|
41
arch/x86/lib/coreboot/cb_support.c
Normal file
41
arch/x86/lib/coreboot/cb_support.c
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
/*
|
||||||
|
* Support for booting from coreboot
|
||||||
|
*
|
||||||
|
* Copyright 2021 Google LLC
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <asm/cb_sysinfo.h>
|
||||||
|
#include <asm/e820.h>
|
||||||
|
|
||||||
|
unsigned int cb_install_e820_map(unsigned int max_entries,
|
||||||
|
struct e820_entry *entries)
|
||||||
|
{
|
||||||
|
unsigned int num_entries;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
num_entries = min((unsigned int)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;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* coreboot has some extensions (type 6 & 16) to the E820 types.
|
||||||
|
* When we detect this, mark it as E820_RESERVED.
|
||||||
|
*/
|
||||||
|
if (memrange->type == CB_MEM_VENDOR_RSVD ||
|
||||||
|
memrange->type == CB_MEM_TABLE)
|
||||||
|
entries[i].type = E820_RESERVED;
|
||||||
|
else
|
||||||
|
entries[i].type = memrange->type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return num_entries;
|
||||||
|
}
|
|
@ -18,6 +18,7 @@
|
||||||
#include <bootm.h>
|
#include <bootm.h>
|
||||||
#include <command.h>
|
#include <command.h>
|
||||||
#include <env.h>
|
#include <env.h>
|
||||||
|
#include <init.h>
|
||||||
#include <irq_func.h>
|
#include <irq_func.h>
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
@ -28,6 +29,7 @@
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
#include <asm/bootm.h>
|
#include <asm/bootm.h>
|
||||||
#include <asm/bootparam.h>
|
#include <asm/bootparam.h>
|
||||||
|
#include <asm/global_data.h>
|
||||||
#ifdef CONFIG_SYS_COREBOOT
|
#ifdef CONFIG_SYS_COREBOOT
|
||||||
#include <asm/arch/timestamp.h>
|
#include <asm/arch/timestamp.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -35,6 +37,8 @@
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
#include <linux/libfdt.h>
|
#include <linux/libfdt.h>
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Memory lay-out:
|
* Memory lay-out:
|
||||||
*
|
*
|
||||||
|
@ -309,8 +313,13 @@ int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
|
||||||
int bootproto = get_boot_protocol(hdr, false);
|
int bootproto = get_boot_protocol(hdr, false);
|
||||||
|
|
||||||
log_debug("Setup E820 entries\n");
|
log_debug("Setup E820 entries\n");
|
||||||
setup_base->e820_entries = install_e820_map(
|
if (ll_boot_init()) {
|
||||||
ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
|
setup_base->e820_entries = install_e820_map(
|
||||||
|
ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
|
||||||
|
} else if (IS_ENABLED(CONFIG_COREBOOT_SYSINFO)) {
|
||||||
|
setup_base->e820_entries = cb_install_e820_map(
|
||||||
|
ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
|
||||||
|
}
|
||||||
|
|
||||||
if (bootproto == 0x0100) {
|
if (bootproto == 0x0100) {
|
||||||
setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
|
setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
|
||||||
|
|
Loading…
Add table
Reference in a new issue