uboot/arch/riscv/lib/spl.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2019 Fraunhofer AISEC,
   4 * Lukas Auer <lukas.auer@aisec.fraunhofer.de>
   5 */
   6#include <common.h>
   7#include <cpu_func.h>
   8#include <hang.h>
   9#include <init.h>
  10#include <log.h>
  11#include <spl.h>
  12#include <asm/smp.h>
  13
  14DECLARE_GLOBAL_DATA_PTR;
  15
  16__weak int spl_board_init_f(void)
  17{
  18        return 0;
  19}
  20
  21__weak void board_init_f(ulong dummy)
  22{
  23        int ret;
  24
  25        ret = spl_early_init();
  26        if (ret)
  27                panic("spl_early_init() failed: %d\n", ret);
  28
  29        arch_cpu_init_dm();
  30
  31        preloader_console_init();
  32
  33        ret = spl_board_init_f();
  34        if (ret)
  35                panic("spl_board_init_f() failed: %d\n", ret);
  36}
  37
  38void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
  39{
  40        typedef void __noreturn (*image_entry_riscv_t)(ulong hart, void *dtb);
  41        void *fdt_blob;
  42        __maybe_unused int ret;
  43
  44#if CONFIG_IS_ENABLED(LOAD_FIT) || CONFIG_IS_ENABLED(LOAD_FIT_FULL)
  45        fdt_blob = spl_image->fdt_addr;
  46#else
  47        fdt_blob = (void *)gd->fdt_blob;
  48#endif
  49
  50        image_entry_riscv_t image_entry =
  51                (image_entry_riscv_t)spl_image->entry_point;
  52        invalidate_icache_all();
  53
  54        debug("image entry point: 0x%lX\n", spl_image->entry_point);
  55#ifdef CONFIG_SPL_SMP
  56        ret = smp_call_function(spl_image->entry_point, (ulong)fdt_blob, 0, 0);
  57        if (ret)
  58                hang();
  59#endif
  60        image_entry(gd->arch.boot_hart, fdt_blob);
  61}
  62