[U-Boot] [PATCH v2 33/38] x86: fsp: Allow the HOBs to be used after relocation
Simon Glass
sjg at chromium.org
Wed Sep 25 14:11:42 UTC 2019
Allocate memory for the HOBs and copy them before relocation. This ensures
that they can still be accessed after relocation.
This is needed when relocating the HOB within U-Boot.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
Changes in v2: None
arch/x86/cpu/cpu.c | 6 ++++++
arch/x86/include/asm/fsp/fsp_support.h | 8 ++++++++
arch/x86/include/asm/hob.h | 8 ++++++++
arch/x86/lib/fsp/fsp_support.c | 16 ++++++++++++++++
arch/x86/lib/hob.c | 11 +++++++++++
5 files changed, 49 insertions(+)
diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index 290ee084e5e..e0b24c8df29 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -42,6 +42,9 @@
#include <asm/interrupt.h>
#include <asm/tables.h>
#include <linux/compiler.h>
+#ifdef CONFIG_HAVE_FSP
+#include <asm/fsp/fsp_support.h>
+#endif
DECLARE_GLOBAL_DATA_PTR;
@@ -262,6 +265,9 @@ int reserve_arch(void)
#ifdef CONFIG_ENABLE_MRC_CACHE
mrccache_reserve();
#endif
+#ifdef CONFIG_HAVE_FSP
+ fsp_reserve();
+#endif
#ifdef CONFIG_SEABIOS
high_table_reserve();
diff --git a/arch/x86/include/asm/fsp/fsp_support.h b/arch/x86/include/asm/fsp/fsp_support.h
index 4f93cb2a136..2424bc1f5f9 100644
--- a/arch/x86/include/asm/fsp/fsp_support.h
+++ b/arch/x86/include/asm/fsp/fsp_support.h
@@ -163,4 +163,12 @@ void *fsp_prepare_mrc_cache(void);
*/
u32 fsp_notify(struct fsp_header *fsp_hdr, u32 phase);
+/**
+ * fsp_reserve() - Relocation the HOBs
+ *
+ * Make space for the HOBs in the new memory and copy them there. This must be
+ * called from board_init_f() along with the 'reserve' functions.
+ */
+void fsp_reserve(void);
+
#endif
diff --git a/arch/x86/include/asm/hob.h b/arch/x86/include/asm/hob.h
index 72151ea045e..6b00d24071a 100644
--- a/arch/x86/include/asm/hob.h
+++ b/arch/x86/include/asm/hob.h
@@ -227,4 +227,12 @@ const struct hob_header *hob_get_next_guid_hob(const efi_guid_t *guid,
void *hob_get_guid_hob_data(const void *hob_list, u32 *len,
const efi_guid_t *guid);
+/**
+ * hob_get_size() - Get the total size of the HOB data
+ *
+ * This scans the list and returns the number of bytes oocupied by the HOB list.
+ * This can be used to copy the list to somewhere else in memory.
+ */
+uint hob_get_size(const void *hob_list);
+
#endif /* __HOB_H__ */
diff --git a/arch/x86/lib/fsp/fsp_support.c b/arch/x86/lib/fsp/fsp_support.c
index 983888fd743..8063b8f7a5f 100644
--- a/arch/x86/lib/fsp/fsp_support.c
+++ b/arch/x86/lib/fsp/fsp_support.c
@@ -181,3 +181,19 @@ void *fsp_get_graphics_info(const void *hob_list, u32 *len)
return hob_get_guid_hob_data(hob_list, len, &guid);
}
+
+void fsp_reserve(void)
+{
+ void *new_hobs;
+ uint hob_size;
+
+ hob_size = hob_get_size(gd->arch.hob_list);
+ gd->start_addr_sp -= hob_size;
+ new_hobs = (void *)gd->start_addr_sp;
+ memcpy(new_hobs, gd->arch.hob_list, hob_size);
+
+ gd->start_addr_sp &= ~0xf;
+ debug("Copying FSP HOBs from %p to %p, size %x\n", gd->arch.hob_list,
+ new_hobs, hob_size);
+ gd->arch.hob_list = new_hobs;
+}
diff --git a/arch/x86/lib/hob.c b/arch/x86/lib/hob.c
index f2c47240ee8..43c53f4bbb3 100644
--- a/arch/x86/lib/hob.c
+++ b/arch/x86/lib/hob.c
@@ -82,3 +82,14 @@ void *hob_get_guid_hob_data(const void *hob_list, u32 *len,
return get_guid_hob_data(guid_hob);
}
+
+uint hob_get_size(const void *hob_list)
+{
+ const struct hob_header *hdr;
+
+ for (hdr = hob_list; !end_of_hob(hdr); hdr = get_next_hob(hdr))
+ ;
+ hdr++;
+
+ return (void *)hdr - hob_list;
+}
--
2.23.0.444.g18eeb5a265-goog
More information about the U-Boot
mailing list