mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +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_EXT2
|
||||||
imply CMD_EXT4
|
imply CMD_EXT4
|
||||||
imply CMD_FAT
|
imply CMD_FAT
|
||||||
|
imply BOARD_LATE_INIT
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -19,3 +19,32 @@ int board_init(void)
|
||||||
|
|
||||||
return 0;
|
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 CONFIG_ENV_SIZE SZ_4K
|
||||||
|
|
||||||
#define BOOT_TARGET_DEVICES(func) \
|
#define BOOT_TARGET_DEVICES(func) \
|
||||||
|
func(QEMU, qemu, na) \
|
||||||
func(VIRTIO, virtio, 0) \
|
func(VIRTIO, virtio, 0) \
|
||||||
func(DHCP, dhcp, na)
|
func(DHCP, dhcp, na)
|
||||||
|
|
||||||
#include <config_distro_bootcmd.h>
|
#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 \
|
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||||
"fdt_high=0xffffffffffffffff\0" \
|
"fdt_high=0xffffffffffffffff\0" \
|
||||||
"initrd_high=0xffffffffffffffff\0" \
|
"initrd_high=0xffffffffffffffff\0" \
|
||||||
|
|
Loading…
Reference in a new issue