On Tue, 2018-10-30 at 13:55 +0100, Lukas Auer wrote: > QEMU embeds the location of the kernel image in the device tree. > Store > this address in the environment as variable kernel_start and use it > in > CONFIG_BOOTCOMMAND to boot the kernel. Use the device tree passed by > the > prior boot stage to boot Linux. > > Signed-off-by: Lukas Auer <lukas.a...@aisec.fraunhofer.de> > --- > > Changes in v2: > - Rebase onto u-boot-dm/next > - Boot Linux with the device tree provided by the prior boot stage > > board/emulation/qemu-riscv/Kconfig | 1 + > board/emulation/qemu-riscv/qemu-riscv.c | 29 > +++++++++++++++++++++++++ > configs/qemu-riscv32_defconfig | 1 + > configs/qemu-riscv64_defconfig | 1 + > include/configs/qemu-riscv.h | 10 ++++++++- > 5 files changed, 41 insertions(+), 1 deletion(-) > > diff --git a/board/emulation/qemu-riscv/Kconfig > b/board/emulation/qemu-riscv/Kconfig > index 37a80db6a9..be5839b7db 100644 > --- a/board/emulation/qemu-riscv/Kconfig > +++ b/board/emulation/qemu-riscv/Kconfig > @@ -29,5 +29,6 @@ config BOARD_SPECIFIC_OPTIONS # dummy > imply CMD_EXT2 > imply CMD_EXT4 > imply CMD_FAT > + imply BOARD_LATE_INIT > > endif > diff --git a/board/emulation/qemu-riscv/qemu-riscv.c > b/board/emulation/qemu-riscv/qemu-riscv.c > index 2ce093e19a..ee20983095 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)) { > + printf("No chosen node found\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) { > + printf("Can't find kernel start address in device > tree\n"); > + return 0; > + } > + > + env_set_hex("kernel_start", kernel_start); > + > + return 0; > +} > diff --git a/configs/qemu-riscv32_defconfig b/configs/qemu- > riscv32_defconfig > index b55644378a..13dd53a550 100644 > --- a/configs/qemu-riscv32_defconfig > +++ b/configs/qemu-riscv32_defconfig > @@ -4,4 +4,5 @@ CONFIG_NR_DRAM_BANKS=1 > CONFIG_FIT=y > CONFIG_DISPLAY_CPUINFO=y > CONFIG_DISPLAY_BOARDINFO=y > +CONFIG_HUSH_PARSER=y > CONFIG_OF_PRIOR_STAGE=y > diff --git a/configs/qemu-riscv64_defconfig b/configs/qemu- > riscv64_defconfig > index a542ac4893..06eb3042fa 100644 > --- a/configs/qemu-riscv64_defconfig > +++ b/configs/qemu-riscv64_defconfig > @@ -5,4 +5,5 @@ CONFIG_NR_DRAM_BANKS=1 > CONFIG_FIT=y > CONFIG_DISPLAY_CPUINFO=y > CONFIG_DISPLAY_BOARDINFO=y > +CONFIG_HUSH_PARSER=y > CONFIG_OF_PRIOR_STAGE=y > diff --git a/include/configs/qemu-riscv.h b/include/configs/qemu- > riscv.h > index ba6a18f2e6..7c88ba300a 100644 > --- a/include/configs/qemu-riscv.h > +++ b/include/configs/qemu-riscv.h > @@ -21,7 +21,15 @@ > #define CONFIG_ENV_SIZE SZ_4K > > #define CONFIG_EXTRA_ENV_SETTINGS \ > - "fdt_high=0xffffffffffffffff\0" \ > + "fdt_high=0x82000000\0" \ > + "bootm_size=0x10000000\0" \ > "initrd_high=0xffffffffffffffff\0" > > +#define CONFIG_BOOTCOMMAND \ > + "if env exists kernel_start; then " \ > + "bootm ${kernel_start} - ${prior_stage_dtb};" \
As Alexander Graf pointed out in reply to patch 24, we don't need the separate environment variable "prior_stage_dtb". I will replace it with "fdtcontroladdr" here and drop patch 24 in the next version. > + "else " \ > + "echo Kernel address not found in the device tree;" \ > + "fi;" > + > #endif /* __CONFIG_H */ _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot