xref: /openbmc/u-boot/arch/riscv/lib/bootm.c (revision 5b86ca96)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2011 Andes Technology Corporation
4  * Shawn Lin, Andes Technology Corporation <nobuhiro@andestech.com>
5  * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com>
6  * Rick Chen, Andes Technology Corporation <rick@andestech.com>
7  */
8 
9 #include <common.h>
10 #include <command.h>
11 #include <image.h>
12 #include <u-boot/zlib.h>
13 #include <asm/byteorder.h>
14 #include <asm/csr.h>
15 
16 DECLARE_GLOBAL_DATA_PTR;
17 
18 __weak void board_quiesce_devices(void)
19 {
20 }
21 
22 int arch_fixup_fdt(void *blob)
23 {
24 	return 0;
25 }
26 
27 int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
28 {
29 	void	(*kernel)(ulong hart, void *dtb);
30 
31 	/*
32 	 * allow the PREP bootm subcommand, it is required for bootm to work
33 	 */
34 	if (flag & BOOTM_STATE_OS_PREP)
35 		return 0;
36 
37 	if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
38 		return 1;
39 
40 	kernel = (void (*)(ulong, void *))images->ep;
41 
42 	bootstage_mark(BOOTSTAGE_ID_RUN_OS);
43 
44 	debug("## Transferring control to Linux (at address %08lx) ...\n",
45 	       (ulong)kernel);
46 
47 	if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len) {
48 #ifdef CONFIG_OF_LIBFDT
49 		debug("using: FDT\n");
50 		if (image_setup_linux(images)) {
51 			printf("FDT creation failed! hanging...");
52 			hang();
53 		}
54 #endif
55 	}
56 
57 	/* we assume that the kernel is in place */
58 	printf("\nStarting kernel ...\n\n");
59 
60 	cleanup_before_linux();
61 
62 	if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len)
63 		kernel(csr_read(mhartid), images->ft_addr);
64 
65 	/* does not return */
66 
67 	return 1;
68 }
69