]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
x86: Allow installing an e820 when booting from coreboot
authorSimon Glass <sjg@chromium.org>
Mon, 15 Mar 2021 05:00:23 +0000 (18:00 +1300)
committerSimon Glass <sjg@chromium.org>
Sat, 27 Mar 2021 02:04:29 +0000 (15:04 +1300)
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>
arch/x86/cpu/coreboot/sdram.c
arch/x86/include/asm/e820.h
arch/x86/lib/coreboot/Makefile
arch/x86/lib/coreboot/cb_support.c [new file with mode: 0644]
arch/x86/lib/zimage.c

index 43604ee837afa9914f1868b8fc8a23bb914fe959..4a256bad4458ce957c0cb4c5b48cff369bfe3ebc 100644 (file)
@@ -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);
 }
 
 /*
index a66c0d2489135b306769f3a26cec7cda0d577828..850a0a7a89ec8563aaabb9cd40957433836ba682 100644 (file)
@@ -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 */
index b5250d916b24b444937059ef7ce55641aede07fe..cb0ae1d017b284551d97ae3a410cc4882e4a5265 100644 (file)
@@ -4,3 +4,4 @@
 #
 
 obj-y += cb_sysinfo.o
+obj-y += cb_support.o
diff --git a/arch/x86/lib/coreboot/cb_support.c b/arch/x86/lib/coreboot/cb_support.c
new file mode 100644 (file)
index 0000000..ebb45cd
--- /dev/null
@@ -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;
+}
index 602788e016dea9e563cf164759187fd1ae67b53e..90fc8a466d7d6d28524d79a94c74e043954e98a1 100644 (file)
@@ -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;