riscv: implement IPI platform functions using SBI
The supervisor binary interface (SBI) provides the necessary functions to implement the platform IPI functions riscv_send_ipi() and riscv_clear_ipi(). Use it to implement them. This adds support for inter-processor interrupts (IPIs) on RISC-V CPUs running in supervisor mode. Support for machine mode is already available for CPUs that include the SiFive CLINT. Signed-off-by: Lukas Auer <lukas.auer@aisec.fraunhofer.de> Reviewed-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Atish Patra <atish.patra@wdc.com> Tested-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
34a0626fc3
commit
f152febb2a
@ -139,4 +139,9 @@ config NR_CPUS
|
||||
Stack memory is pre-allocated. U-Boot must therefore know the
|
||||
maximum number of CPUs that may be present.
|
||||
|
||||
config SBI_IPI
|
||||
bool
|
||||
default y if RISCV_SMODE
|
||||
depends on SMP
|
||||
|
||||
endmenu
|
||||
|
@ -13,6 +13,7 @@ obj-$(CONFIG_RISCV_RDTIME) += rdtime.o
|
||||
obj-$(CONFIG_SIFIVE_CLINT) += sifive_clint.o
|
||||
obj-y += interrupts.o
|
||||
obj-y += reset.o
|
||||
obj-$(CONFIG_SBI_IPI) += sbi_ipi.o
|
||||
obj-y += setjmp.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
|
||||
|
25
arch/riscv/lib/sbi_ipi.c
Normal file
25
arch/riscv/lib/sbi_ipi.c
Normal file
@ -0,0 +1,25 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Copyright (C) 2019 Fraunhofer AISEC,
|
||||
* Lukas Auer <lukas.auer@aisec.fraunhofer.de>
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/sbi.h>
|
||||
|
||||
int riscv_send_ipi(int hart)
|
||||
{
|
||||
ulong mask;
|
||||
|
||||
mask = 1UL << hart;
|
||||
sbi_send_ipi(&mask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int riscv_clear_ipi(int hart)
|
||||
{
|
||||
sbi_clear_ipi();
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user