#include <common.h>
#include <cpu_func.h>
#include <errno.h>
+#include <hang.h>
+#include <image.h>
#include <spl.h>
#include <asm/smp.h>
#include <opensbi.h>
+#include <linux/libfdt.h>
DECLARE_GLOBAL_DATA_PTR;
opensbi_entry = (void (*)(ulong, ulong, ulong))spl_image->entry_point;
invalidate_icache_all();
-#ifdef CONFIG_SMP
+#ifdef CONFIG_SPL_SMP
+ /*
+ * Start OpenSBI on all secondary harts and wait for acknowledgment.
+ *
+ * OpenSBI first relocates itself to its link address. This is done by
+ * the main hart. To make sure no hart is still running U-Boot SPL
+ * during relocation, we wait for all secondary harts to acknowledge
+ * the call-function request before entering OpenSBI on the main hart.
+ * Otherwise, code corruption can occur if the link address ranges of
+ * U-Boot SPL and OpenSBI overlap.
+ */
ret = smp_call_function((ulong)spl_image->entry_point,
(ulong)spl_image->fdt_addr,
- (ulong)&opensbi_info, 0);
+ (ulong)&opensbi_info, 1);
if (ret)
hang();
#endif