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>
This commit is contained in:
Lukas Auer 2018-11-22 11:26:36 +01:00 committed by Andes
parent afb3012953
commit 66ffe5783b
3 changed files with 40 additions and 0 deletions

View file

@ -29,5 +29,6 @@ config BOARD_SPECIFIC_OPTIONS # dummy
imply CMD_EXT2
imply CMD_EXT4
imply CMD_FAT
imply BOARD_LATE_INIT
endif

View file

@ -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;
}

View file

@ -21,11 +21,21 @@
#define CONFIG_ENV_SIZE SZ_4K
#define BOOT_TARGET_DEVICES(func) \
func(QEMU, qemu, na) \
func(VIRTIO, virtio, 0) \
func(DHCP, dhcp, na)
#include <config_distro_bootcmd.h>
#define BOOTENV_DEV_QEMU(devtypeu, devtypel, instance) \
"bootcmd_qemu=" \
"if env exists kernel_start; then " \
"bootm ${kernel_start} - ${fdtcontroladdr};" \
"fi;\0"
#define BOOTENV_DEV_NAME_QEMU(devtypeu, devtypel, instance) \
"qemu "
#define CONFIG_EXTRA_ENV_SETTINGS \
"fdt_high=0xffffffffffffffff\0" \
"initrd_high=0xffffffffffffffff\0" \