mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 07:31:15 +00:00
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:
parent
afb3012953
commit
66ffe5783b
3 changed files with 40 additions and 0 deletions
|
@ -29,5 +29,6 @@ config BOARD_SPECIFIC_OPTIONS # dummy
|
|||
imply CMD_EXT2
|
||||
imply CMD_EXT4
|
||||
imply CMD_FAT
|
||||
imply BOARD_LATE_INIT
|
||||
|
||||
endif
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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" \
|
||||
|
|
Loading…
Reference in a new issue