• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2018, Bin Meng <bmeng.cn@gmail.com>
4  */
5 
6 #include <common.h>
7 #include <dm.h>
8 #include <env.h>
9 #include <fdtdec.h>
10 #include <spl.h>
11 #include <init.h>
12 #include <virtio_types.h>
13 #include <virtio.h>
14 
board_init(void)15 int board_init(void)
16 {
17 	/*
18 	 * Make sure virtio bus is enumerated so that peripherals
19 	 * on the virtio bus can be discovered by their drivers
20 	 */
21 	virtio_init();
22 
23 	return 0;
24 }
25 
board_late_init(void)26 int board_late_init(void)
27 {
28 	ulong kernel_start;
29 	ofnode chosen_node;
30 	int ret;
31 
32 	chosen_node = ofnode_path("/chosen");
33 	if (!ofnode_valid(chosen_node)) {
34 		debug("No chosen node found, can't get kernel start address\n");
35 		return 0;
36 	}
37 
38 #ifdef CONFIG_ARCH_RV64I
39 	ret = ofnode_read_u64(chosen_node, "riscv,kernel-start",
40 			      (u64 *)&kernel_start);
41 #else
42 	ret = ofnode_read_u32(chosen_node, "riscv,kernel-start",
43 			      (u32 *)&kernel_start);
44 #endif
45 	if (ret) {
46 		debug("Can't find kernel start address in device tree\n");
47 		return 0;
48 	}
49 
50 	env_set_hex("kernel_start", kernel_start);
51 
52 	return 0;
53 }
54 
55 /*
56  * QEMU specifies the location of Linux (supplied with the -kernel argument)
57  * in the device tree using the riscv,kernel-start and riscv,kernel-end
58  * properties. We currently rely on the SBI implementation of BBL to run
59  * Linux and therefore embed Linux as payload in BBL. This causes an issue,
60  * because BBL detects the kernel properties in the device tree and ignores
61  * the Linux payload as a result. To work around this issue, we clear the
62  * kernel properties before booting Linux.
63  *
64  * This workaround can be removed, once we do not require BBL for its SBI
65  * implementation anymore.
66  */
ft_board_setup(void * blob,bd_t * bd)67 int ft_board_setup(void *blob, bd_t *bd)
68 {
69 	int chosen_offset, ret;
70 
71 	chosen_offset = fdt_path_offset(blob, "/chosen");
72 	if (chosen_offset < 0)
73 		return 0;
74 
75 #ifdef CONFIG_ARCH_RV64I
76 	ret = fdt_setprop_u64(blob, chosen_offset, "riscv,kernel-start", 0);
77 #else
78 	ret = fdt_setprop_u32(blob, chosen_offset, "riscv,kernel-start", 0);
79 #endif
80 	if (ret)
81 		return ret;
82 
83 #ifdef CONFIG_ARCH_RV64I
84 	ret = fdt_setprop_u64(blob, chosen_offset, "riscv,kernel-end", 0);
85 #else
86 	ret = fdt_setprop_u32(blob, chosen_offset, "riscv,kernel-end", 0);
87 #endif
88 	if (ret)
89 		return ret;
90 
91 	return 0;
92 }
93 
94 #ifdef CONFIG_SPL
spl_boot_device(void)95 u32 spl_boot_device(void)
96 {
97 	/* RISC-V QEMU only supports RAM as SPL boot device */
98 	return BOOT_DEVICE_RAM;
99 }
100 #endif
101 
102 #ifdef CONFIG_SPL_LOAD_FIT
board_fit_config_name_match(const char * name)103 int board_fit_config_name_match(const char *name)
104 {
105 	/* boot using first FIT config */
106 	return 0;
107 }
108 #endif
109