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
					
				|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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"); | ||||||
|  | 	if (ll_boot_init()) { | ||||||
| 		setup_base->e820_entries = install_e820_map( | 		setup_base->e820_entries = install_e820_map( | ||||||
| 			ARRAY_SIZE(setup_base->e820_map), setup_base->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…
	
		Reference in New Issue