[U-Boot] [PATCH v2 28/29] riscv: qemu: detect and boot the kernel passed by QEMU

Alexander Graf agraf at suse.de
Tue Oct 30 15:27:03 UTC 2018



On 30.10.18 16:02, Auer, Lukas wrote:
> 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.auer at 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.

Also, can you please enable distro boot? :)


Thanks,

Alex


More information about the U-Boot mailing list