mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-03-13 21:36:57 +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,
|
||||
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;
|
||||
return cb_install_e820_map(max_entries, entries);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -22,9 +22,23 @@ struct e820_entry {
|
|||
#define ISA_START_ADDRESS 0xa0000
|
||||
#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,
|
||||
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 /* _ASM_X86_E820_H */
|
||||
|
|
|
@ -4,3 +4,4 @@
|
|||
#
|
||||
|
||||
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 <command.h>
|
||||
#include <env.h>
|
||||
#include <init.h>
|
||||
#include <irq_func.h>
|
||||
#include <log.h>
|
||||
#include <malloc.h>
|
||||
|
@ -28,6 +29,7 @@
|
|||
#include <asm/byteorder.h>
|
||||
#include <asm/bootm.h>
|
||||
#include <asm/bootparam.h>
|
||||
#include <asm/global_data.h>
|
||||
#ifdef CONFIG_SYS_COREBOOT
|
||||
#include <asm/arch/timestamp.h>
|
||||
#endif
|
||||
|
@ -35,6 +37,8 @@
|
|||
#include <linux/ctype.h>
|
||||
#include <linux/libfdt.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
/*
|
||||
* 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);
|
||||
|
||||
log_debug("Setup E820 entries\n");
|
||||
setup_base->e820_entries = install_e820_map(
|
||||
ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
|
||||
if (ll_boot_init()) {
|
||||
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) {
|
||||
setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
|
||||
|
|
Loading…
Add table
Reference in a new issue