mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-14 08:57:58 +00:00
90ae281437
Add a wait option to smp_call_function() to wait for the secondary harts to acknowledge the call-function request. The request is considered to be acknowledged once each secondary hart has cleared the corresponding IPI. As part of the call-function request, the secondary harts invalidate the instruction cache after clearing the IPI. This adds a delay between acknowledgment (clear IPI) and fulfillment (call function) of the request. We want to use the acknowledgment to be able to judge when the request has been completed. Remove the delay by clearing the IPI after cache invalidation and just before calling the function from the request. Signed-off-by: Lukas Auer <lukas.auer@aisec.fraunhofer.de> Reviewed-by: Rick Chen <rick@andestech.com> Tested-by: Rick Chen <rick@andestech.com> Reviewed-by: Anup Patel <anup.patel@wdc.com>
49 lines
1.1 KiB
C
49 lines
1.1 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Copyright (C) 2019 Fraunhofer AISEC,
|
|
* Lukas Auer <lukas.auer@aisec.fraunhofer.de>
|
|
*/
|
|
#include <common.h>
|
|
#include <cpu_func.h>
|
|
#include <spl.h>
|
|
#include <asm/smp.h>
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
__weak void board_init_f(ulong dummy)
|
|
{
|
|
int ret;
|
|
|
|
ret = spl_early_init();
|
|
if (ret)
|
|
panic("spl_early_init() failed: %d\n", ret);
|
|
|
|
arch_cpu_init_dm();
|
|
|
|
preloader_console_init();
|
|
}
|
|
|
|
void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
|
|
{
|
|
typedef void __noreturn (*image_entry_riscv_t)(ulong hart, void *dtb);
|
|
void *fdt_blob;
|
|
int ret;
|
|
|
|
#if CONFIG_IS_ENABLED(LOAD_FIT) || CONFIG_IS_ENABLED(LOAD_FIT_FULL)
|
|
fdt_blob = spl_image->fdt_addr;
|
|
#else
|
|
fdt_blob = (void *)gd->fdt_blob;
|
|
#endif
|
|
|
|
image_entry_riscv_t image_entry =
|
|
(image_entry_riscv_t)spl_image->entry_point;
|
|
invalidate_icache_all();
|
|
|
|
debug("image entry point: 0x%lX\n", spl_image->entry_point);
|
|
#ifdef CONFIG_SMP
|
|
ret = smp_call_function(spl_image->entry_point, (ulong)fdt_blob, 0, 0);
|
|
if (ret)
|
|
hang();
|
|
#endif
|
|
image_entry(gd->arch.boot_hart, fdt_blob);
|
|
}
|