riscv: qemu: detect and boot the kernel passed by QEMU
authorLukas Auer <lukas.auer@aisec.fraunhofer.de>
Thu, 22 Nov 2018 10:26:36 +0000 (11:26 +0100)
committerAndes <uboot@andestech.com>
Mon, 26 Nov 2018 05:57:33 +0000 (13:57 +0800)
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>
board/emulation/qemu-riscv/Kconfig
board/emulation/qemu-riscv/qemu-riscv.c
include/configs/qemu-riscv.h

index 37a80db..be5839b 100644 (file)
@@ -29,5 +29,6 @@ config BOARD_SPECIFIC_OPTIONS # dummy
        imply CMD_EXT2
        imply CMD_EXT4
        imply CMD_FAT
+       imply BOARD_LATE_INIT
 
 endif
index 2ce093e..587f2c4 100644 (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;
+}
index 66d61bd..b29d155 100644 (file)
 #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" \