[RFC PATCH] arch: riscv: cpu: Add callback to init each core
Bin Meng
bmeng.cn at gmail.com
Mon Mar 22 11:04:37 CET 2021
On Mon, Mar 22, 2021 at 5:23 PM Green Wan <green.wan at sifive.com> wrote:
>
> I am looking for a proper place to add some M-mode code in SPL to
> configure features of each core as early as possible. Try to start
> the discussion by sending this RFC.
>
> I tried mach_cpu_init() as the start. And not sure whether I used
> it correctly, it seems executed only by the core wins lottery in
> ./arch/riscv/cpu/start.S.
>
> Is there a proper place to add some inits for each core like CSR
> in section 7.6 in document of U74-MC Core Complex Manual[1].
>
> There are some alternatives to do it such as
>
> a) sending IPI to each cores
> Have to wait for IPI init for each core. And the boot core
> have to perform the init by itself and send IPIs to other
> cores. It might not be straightforward.
> b) hook callback, (like this patch)
> c) hard code in ./arch/riscv/cpu/start.c
>
> [1] https://sifive.cdn.prismic.io/sifive/aee0dd4c-d156-496e-a6c4-db0cf54bbe68_sifive_U74MC_rtl_full_20G1.03.00_manual.pdf
>
> Signed-off-by: Green Wan <green.wan at sifive.com>
> ---
> arch/riscv/cpu/start.S | 5 +++++
> arch/riscv/lib/spl.c | 4 ++++
> board/sifive/unmatched/spl.c | 7 +++++++
> 3 files changed, 16 insertions(+)
>
> diff --git a/arch/riscv/cpu/start.S b/arch/riscv/cpu/start.S
> index 8589509e01..2629f7e4cc 100644
> --- a/arch/riscv/cpu/start.S
> +++ b/arch/riscv/cpu/start.S
> @@ -102,6 +102,11 @@ call_board_init_f_0:
> mv a0, sp
> jal board_init_f_alloc_reserve
>
> +#if CONFIG_IS_ENABLED(RISCV_MMODE)
> +call_each_cpu_core:
> + jal mach_cpu_core_init
> +#endif
Inserting it here potentially corrupts the return value of
board_init_f_alloc_reserve(), and you need to insert it after sp is
initialized for harts other than the boot hart.
> +
> /*
> * Save global data pointer for later. We don't set it here because it
> * is not initialized yet.
> diff --git a/arch/riscv/lib/spl.c b/arch/riscv/lib/spl.c
> index 8baee07bea..e8261d9c19 100644
> --- a/arch/riscv/lib/spl.c
> +++ b/arch/riscv/lib/spl.c
> @@ -14,6 +14,10 @@
>
> DECLARE_GLOBAL_DATA_PTR;
>
> +__weak void mach_cpu_core_init(void)
> +{
> +}
> +
> __weak int spl_board_init_f(void)
> {
> return 0;
> diff --git a/board/sifive/unmatched/spl.c b/board/sifive/unmatched/spl.c
> index 5e1333b09a..cc466f703a 100644
> --- a/board/sifive/unmatched/spl.c
> +++ b/board/sifive/unmatched/spl.c
> @@ -22,6 +22,13 @@
> #define MODE_SELECT_SD 0xb
> #define MODE_SELECT_MASK GENMASK(3, 0)
>
> +void mach_cpu_core_init(void)
> +{
> +#if CONFIG_IS_ENABLED(RISCV_MMODE)
> + asm volatile ("csrwi 0x7c1, 0");
> +#endif
> +}
> +
> int spl_board_init_f(void)
> {
> int ret;
> --
Regards,
Bin
More information about the U-Boot
mailing list