diff options
| author | Lukas Auer <lukas.auer@aisec.fraunhofer.de> | 2018-11-22 11:26:36 +0100 | 
|---|---|---|
| committer | Andes <uboot@andestech.com> | 2018-11-26 13:57:33 +0800 | 
| commit | 66ffe5783b6340977ead5782cce9b63edfc0e348 (patch) | |
| tree | 7ed1c06db8b5a625b6d041ba75d39e7a764483e3 /board/emulation/qemu-riscv/qemu-riscv.c | |
| parent | afb301295363391f588f37696c27795cd7c0ffc4 (diff) | |
riscv: qemu: detect and boot the kernel passed by QEMU
QEMU embeds the location of the kernel image in the device tree. Store
this address in the environment as variable kernel_start. It is used in
the board-local distro boot command QEMU to boot the kernel with the
U-Boot device tree. The QEMU boot command is added as the first boot
target device.
Signed-off-by: Lukas Auer <lukas.auer@aisec.fraunhofer.de>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'board/emulation/qemu-riscv/qemu-riscv.c')
| -rw-r--r-- | board/emulation/qemu-riscv/qemu-riscv.c | 29 | 
1 files changed, 29 insertions, 0 deletions
| diff --git a/board/emulation/qemu-riscv/qemu-riscv.c b/board/emulation/qemu-riscv/qemu-riscv.c index 2ce093e19a9..587f2c49094 100644 --- a/board/emulation/qemu-riscv/qemu-riscv.c +++ b/board/emulation/qemu-riscv/qemu-riscv.c @@ -19,3 +19,32 @@ int board_init(void)  	return 0;  } + +int board_late_init(void) +{ +	ulong kernel_start; +	ofnode chosen_node; +	int ret; + +	chosen_node = ofnode_path("/chosen"); +	if (!ofnode_valid(chosen_node)) { +		debug("No chosen node found, can't get kernel start address\n"); +		return 0; +	} + +#ifdef CONFIG_ARCH_RV64I +	ret = ofnode_read_u64(chosen_node, "riscv,kernel-start", +			      (u64 *)&kernel_start); +#else +	ret = ofnode_read_u32(chosen_node, "riscv,kernel-start", +			      (u32 *)&kernel_start); +#endif +	if (ret) { +		debug("Can't find kernel start address in device tree\n"); +		return 0; +	} + +	env_set_hex("kernel_start", kernel_start); + +	return 0; +} | 
