boot.c
1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 3 #include <program_loading.h> 4 #include <vm.h> 5 #include <arch/boot.h> 6 #include <arch/encoding.h> 7 #include <arch/smp/smp.h> 8 #include <mcall.h> 9 #include <cbfs.h> 10 #include <console/console.h> 11 12 struct arch_prog_run_args { 13 struct prog *prog; 14 struct prog *opensbi; 15 }; 16 17 /* 18 * A pointer to the Flattened Device Tree passed to coreboot by the boot ROM. 19 * Presumably this FDT is also in ROM. 20 * 21 * This pointer is only used in ramstage! 22 */ 23 24 static void do_arch_prog_run(struct arch_prog_run_args *args) 25 { 26 int hart_id = HLS()->hart_id; 27 struct prog *prog = args->prog; 28 void *fdt = HLS()->fdt; 29 30 if (prog_cbfs_type(prog) == CBFS_TYPE_FIT_PAYLOAD) 31 fdt = prog_entry_arg(prog); 32 33 if (ENV_RAMSTAGE && prog_type(prog) == PROG_PAYLOAD) { 34 if (CONFIG(RISCV_OPENSBI)) { 35 // tell OpenSBI to switch to Supervisor mode before jumping to payload 36 run_payload_opensbi(prog, fdt, args->opensbi, RISCV_PAYLOAD_MODE_S); 37 } else { 38 run_payload(prog, fdt, RISCV_PAYLOAD_MODE_S); 39 } 40 } else { 41 void (*doit)(int hart_id, void *fdt, void *arg) = prog_entry(prog); 42 doit(hart_id, fdt, prog_entry_arg(prog)); 43 } 44 45 die("Failed to run stage"); 46 } 47 48 void arch_prog_run(struct prog *prog) 49 { 50 struct arch_prog_run_args args = {}; 51 52 args.prog = prog; 53 54 /* In case of OpenSBI we have to load it before resuming all HARTs */ 55 if (ENV_RAMSTAGE && CONFIG(RISCV_OPENSBI)) { 56 struct prog sbi = PROG_INIT(PROG_OPENSBI, CONFIG_CBFS_PREFIX"/opensbi"); 57 58 if (!selfload_check(&sbi, BM_MEM_OPENSBI)) 59 die("OpenSBI load failed"); 60 61 args.opensbi = &sbi; 62 } 63 64 smp_resume((void (*)(void *))do_arch_prog_run, &args); 65 }