payloads/external: add skiboot (for QEMU/Power9)

Add an option to build skiboot as a payload. This makes QEMU Power9
board simpler to use as skiboot is necessary anyway.

Change-Id: I0b49ea7464c97cc2ff0d5030629deed549851372
Signed-off-by: Igor Bagnucki <igor.bagnucki@3mdeb.com>
Signed-off-by: Krystian Hebel <krystian.hebel@3mdeb.com>
Signed-off-by: Sergii Dmytruk <sergii.dmytruk@3mdeb.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/58656
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Michał Żygowski <michal.zygowski@3mdeb.com>
This commit is contained in:
Sergii Dmytruk 2021-10-27 00:23:14 +03:00 committed by Felix Held
parent 8d436cfc1a
commit a816c29882
8 changed files with 105 additions and 8 deletions

View File

@ -1,7 +1,19 @@
# QEMU PPC64 emulator # QEMU PPC64 emulator
This page describes how to build and run coreboot for QEMU/PPC64. This page describes how to build and run coreboot for QEMU/PPC64.
You can configure ELF payload via `make menuconfig` (make sure "ROM chip size"
is large enough). ## Building coreboot
```bash
make defconfig KBUILD_DEFCONFIG=configs/config.emulation_qemu_power9
make
```
This builds coreboot with no payload.
## Payloads
You can configure ELF or `skiboot` payload via `make menuconfig`. In either case
you might need to adjust "ROM chip size" and make it large enough to accommodate
the payload (see how much space it needs in the error you get if it doesn't
fit).
## Running coreboot in QEMU ## Running coreboot in QEMU
```bash ```bash
@ -15,16 +27,26 @@ qemu-system-ppc64 -M powernv,hb-mode=on \
- The default CPU in QEMU for AArch64 is a 604. You specify a suitable - The default CPU in QEMU for AArch64 is a 604. You specify a suitable
PowerPC CPU via `-cpu power9`. PowerPC CPU via `-cpu power9`.
- By default Hostboot mode is off and it needs to be turned on to run coreboot - By default Hostboot mode is off and needs to be turned on to run coreboot
as a firmware rather than like an OS. as a firmware rather than like an OS.
- `-bios` specifies initial program (bootloader should suffice, but whole image - `-bios` specifies initial program (bootloader should suffice, but whole image
works fine too). works fine too).
- `-drive` specifies image for emulated flash device. - `-drive` specifies image for emulated flash device.
## Building coreboot ## Running with a kernel
Loading `skiboot` (built automatically by coreboot or otherwise) allows
specifying kernel and root file system to be run.
```bash ```bash
make defconfig KBUILD_DEFCONFIG=configs/config.emulation_qemu_power9 qemu-system-ppc64 -M powernv,hb-mode=on \
make -cpu power9 \
-bios build/coreboot.rom \
-drive file=build/coreboot.rom,if=mtd \
-serial stdio \
-display none \
-kernel zImage \
-initrd initrd.cpio.xz
``` ```
This builds coreboot with no payload. - Specify path to your kernel via `-kernel`.
- Specify path to your rootfs via `-initrd`.

View File

@ -28,6 +28,7 @@ payloads/external/tianocore \
payloads/external/GRUB2 \ payloads/external/GRUB2 \
payloads/external/LinuxBoot \ payloads/external/LinuxBoot \
payloads/external/Yabits \ payloads/external/Yabits \
payloads/external/skiboot \
force-payload: force-payload:

View File

@ -8,3 +8,5 @@ tint/tint/
U-Boot/u-boot/ U-Boot/u-boot/
Memtest86Plus/memtest86plus/ Memtest86Plus/memtest86plus/
iPXE/ipxe/ iPXE/ipxe/
skiboot/skiboot
skiboot/build

View File

@ -332,3 +332,10 @@ payloads/external/Yabits/uefi/build/uefi.elf yabits:
payloads/external/BOOTBOOT/bootboot/dist/bootbootcb.elf: payloads/external/BOOTBOOT/bootboot/dist/bootbootcb.elf:
$(MAKE) -C payloads/external/BOOTBOOT all $(MAKE) -C payloads/external/BOOTBOOT all
# skiboot
payloads/external/skiboot/build/skiboot.elf:
$(MAKE) -C payloads/external/skiboot all \
CONFIG_SKIBOOT_GIT_REPO=$(CONFIG_SKIBOOT_GIT_REPO) \
CONFIG_SKIBOOT_REVISION=$(CONFIG_SKIBOOT_REVISION)

21
payloads/external/skiboot/Kconfig vendored Normal file
View File

@ -0,0 +1,21 @@
## SPDX-License-Identifier: GPL-2.0-only
if PAYLOAD_SKIBOOT
config PAYLOAD_FILE
default "payloads/external/skiboot/build/skiboot.elf"
config SKIBOOT_GIT_REPO
string "Git repository of skiboot payload"
default "https://github.com/open-power/skiboot"
help
Git repository which will be used to clone skiboot.
config SKIBOOT_REVISION
string "Revision of skiboot payload"
default "d93ddbd39b4eeac0bc11dacbdadea76df2996c13" if BOARD_EMULATION_QEMU_POWER9
help
Revision, that skiboot repository will be checked out to, before building
an image.
endif # PAYLOAD_SKIBOOT

View File

@ -0,0 +1,8 @@
## SPDX-License-Identifier: GPL-2.0-only
config PAYLOAD_SKIBOOT
bool "skiboot"
depends on ARCH_PPC64
help
Select this option if you want to build a coreboot image
with a skiboot payload.

36
payloads/external/skiboot/Makefile vendored Normal file
View File

@ -0,0 +1,36 @@
## SPDX-License-Identifier: GPL-2.0-only
build_dir=$(CURDIR)/build
skiboot_dir=$(CURDIR)/skiboot
skiboot_git_repo=$(CONFIG_SKIBOOT_GIT_REPO)
skiboot_revision=$(CONFIG_SKIBOOT_REVISION)
skiboot_elf=$(build_dir)/skiboot.elf
skiboot_cross=$(or $(CROSS),powerpc64-linux-gnu-)
unexport $(COREBOOT_EXPORTS)
.PHONY: all clean distclean
all: $(skiboot_elf)
$(skiboot_elf): | $(skiboot_dir) $(build_dir)
+$(MAKE) -C $(skiboot_dir) CROSS="$(skiboot_cross)"
cp $(skiboot_dir)/skiboot.elf $@
# skiboot is always built with debug information due to unconditional -ggdb
$(skiboot_cross)strip $@
$(skiboot_dir):
git clone $(skiboot_git_repo) $(skiboot_dir)
git -C $(skiboot_dir) checkout $(skiboot_revision)
$(build_dir):
mkdir -p $(build_dir)
distclean: clean
rm -rf $(skiboot_dir)
clean:
# Redefine RM because it's used like `$(RM) non-existent-file`
# Also ignore useless messages about removing test files
[ ! -d $(skiboot_dir) ] || $(MAKE) -C $(skiboot_dir) RM="rm -rf" clean > /dev/null
rm -rf $(build_dir)

View File

@ -8,7 +8,7 @@ if BOARD_EMULATION_QEMU_POWER9
config BOARD_SPECIFIC_OPTIONS config BOARD_SPECIFIC_OPTIONS
def_bool y def_bool y
select CPU_POWER9 select CPU_POWER9
select BOARD_ROMSIZE_KB_512 select BOARD_ROMSIZE_KB_1024
select ARCH_BOOTBLOCK_PPC64 select ARCH_BOOTBLOCK_PPC64
select ARCH_VERSTAGE_PPC64 select ARCH_VERSTAGE_PPC64
select ARCH_ROMSTAGE_PPC64 select ARCH_ROMSTAGE_PPC64