Skip to content

Commit

Permalink
riscv: qemu: clear kernel-start/-end in device tree as workaround for…
Browse files Browse the repository at this point in the history
… BBL

QEMU specifies the location of Linux (supplied with the -kernel
argument) in the device tree using the riscv,kernel-start and
riscv,kernel-end properties. We currently rely on the SBI implementation
of BBL to run Linux and therefore embed Linux as payload in BBL. This
causes an issue, because BBL detects the kernel properties in the device
tree and ignores the Linux payload as a result.
Work around this issue by clearing the kernel properties in the device
tree before booting Linux.

Signed-off-by: Lukas Auer <[email protected]>
Reviewed-by: Bin Meng <[email protected]>
  • Loading branch information
lukasauer authored and Andes committed Nov 26, 2018
1 parent 66ffe57 commit 897206c
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
1 change: 1 addition & 0 deletions board/emulation/qemu-riscv/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,6 @@ config BOARD_SPECIFIC_OPTIONS # dummy
imply CMD_EXT4
imply CMD_FAT
imply BOARD_LATE_INIT
imply OF_BOARD_SETUP

endif
39 changes: 39 additions & 0 deletions board/emulation/qemu-riscv/qemu-riscv.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,42 @@ int board_late_init(void)

return 0;
}

/*
* QEMU specifies the location of Linux (supplied with the -kernel argument)
* in the device tree using the riscv,kernel-start and riscv,kernel-end
* properties. We currently rely on the SBI implementation of BBL to run
* Linux and therefore embed Linux as payload in BBL. This causes an issue,
* because BBL detects the kernel properties in the device tree and ignores
* the Linux payload as a result. To work around this issue, we clear the
* kernel properties before booting Linux.
*
* This workaround can be removed, once we do not require BBL for its SBI
* implementation anymore.
*/
int ft_board_setup(void *blob, bd_t *bd)
{
int chosen_offset, ret;

chosen_offset = fdt_path_offset(blob, "/chosen");
if (chosen_offset < 0)
return 0;

#ifdef CONFIG_ARCH_RV64I
ret = fdt_setprop_u64(blob, chosen_offset, "riscv,kernel-start", 0);
#else
ret = fdt_setprop_u32(blob, chosen_offset, "riscv,kernel-start", 0);
#endif
if (ret)
return ret;

#ifdef CONFIG_ARCH_RV64I
ret = fdt_setprop_u64(blob, chosen_offset, "riscv,kernel-end", 0);
#else
ret = fdt_setprop_u32(blob, chosen_offset, "riscv,kernel-end", 0);
#endif
if (ret)
return ret;

return 0;
}

0 comments on commit 897206c

Please sign in to comment.