diff --git a/Documentation/mainboard/emulation/qemu-power9.md b/Documentation/mainboard/emulation/qemu-power9.md new file mode 100644 index 0000000000..3e2c75f9f4 --- /dev/null +++ b/Documentation/mainboard/emulation/qemu-power9.md @@ -0,0 +1,30 @@ +# QEMU PPC64 emulator +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). + +## Running coreboot in QEMU +```bash +qemu-system-ppc64 -M powernv,hb-mode=on \ + -cpu power9 \ + -bios build/coreboot.rom \ + -drive file=build/coreboot.rom,if=mtd \ + -serial stdio \ + -display none +``` + +- The default CPU in QEMU for AArch64 is a 604. You specify a suitable +PowerPC CPU via `-cpu power9`. +- By default Hostboot mode is off and it needs to be turned on to run coreboot +as a firmware rather than like an OS. +- `-bios` specifies initial program (bootloader should suffice, but whole image +works fine too). +- `-drive` specifies image for emulated flash device. + +## Building coreboot +```bash +make defconfig KBUILD_DEFCONFIG=configs/config.emulation_qemu_power9 +make +``` + +This builds coreboot with no payload. diff --git a/configs/config.emulation_qemu_power9 b/configs/config.emulation_qemu_power9 new file mode 100644 index 0000000000..7f64ee8506 --- /dev/null +++ b/configs/config.emulation_qemu_power9 @@ -0,0 +1 @@ +CONFIG_BOARD_EMULATION_QEMU_POWER9=y diff --git a/src/mainboard/emulation/qemu-power9/Kconfig b/src/mainboard/emulation/qemu-power9/Kconfig new file mode 100644 index 0000000000..7bda9cde3c --- /dev/null +++ b/src/mainboard/emulation/qemu-power9/Kconfig @@ -0,0 +1,43 @@ +## SPDX-License-Identifier: GPL-2.0-only + +# To execute, do: +# qemu-system-ppc64 -M powernv --cpu power9 --bios 'build/coreboot.rom' + +if BOARD_EMULATION_QEMU_POWER9 + +config BOARD_SPECIFIC_OPTIONS + def_bool y + select CPU_POWER9 + select BOARD_ROMSIZE_KB_512 + select ARCH_BOOTBLOCK_PPC64 + select ARCH_VERSTAGE_PPC64 + select ARCH_ROMSTAGE_PPC64 + select ARCH_RAMSTAGE_PPC64 + select BOOT_DEVICE_NOT_SPI_FLASH + select MISSING_BOARD_RESET + +config MEMLAYOUT_LD_FILE + string + default "src/mainboard/\$(CONFIG_MAINBOARD_DIR)/memlayout.ld" + +config MAINBOARD_DIR + string + default "emulation/qemu-power9" + +config MAINBOARD_PART_NUMBER + string + default "QEMU POWER9" + +config MAX_CPUS + int + default 1 + +config MAINBOARD_VENDOR + string + default "Emulation" + +config DRAM_SIZE_MB + int + default 32768 + +endif # BOARD_EMULATION_QEMU_POWER9 diff --git a/src/mainboard/emulation/qemu-power9/Kconfig.name b/src/mainboard/emulation/qemu-power9/Kconfig.name new file mode 100644 index 0000000000..1f5d4e177c --- /dev/null +++ b/src/mainboard/emulation/qemu-power9/Kconfig.name @@ -0,0 +1,2 @@ +config BOARD_EMULATION_QEMU_POWER9 + bool "QEMU power9" diff --git a/src/mainboard/emulation/qemu-power9/Makefile.inc b/src/mainboard/emulation/qemu-power9/Makefile.inc new file mode 100644 index 0000000000..bd905a3029 --- /dev/null +++ b/src/mainboard/emulation/qemu-power9/Makefile.inc @@ -0,0 +1,4 @@ +## SPDX-License-Identifier: GPL-2.0-only + +romstage-y += cbmem.c +romstage-y += romstage.c diff --git a/src/mainboard/emulation/qemu-power9/board_info.txt b/src/mainboard/emulation/qemu-power9/board_info.txt new file mode 100644 index 0000000000..11820e7187 --- /dev/null +++ b/src/mainboard/emulation/qemu-power9/board_info.txt @@ -0,0 +1,2 @@ +Board name: QEMU POWER9 +Category: emulation diff --git a/src/mainboard/emulation/qemu-power9/cbmem.c b/src/mainboard/emulation/qemu-power9/cbmem.c new file mode 100644 index 0000000000..c1c5e94c5c --- /dev/null +++ b/src/mainboard/emulation/qemu-power9/cbmem.c @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include + +void *cbmem_top_chipset(void) +{ + /* Top of cbmem is at lowest usable DRAM address below 4GiB. */ + /* For now, last 1M of 4G */ + void *ptr = (void *) (4ULL * GiB - 1 * MiB); + return ptr; +} diff --git a/src/mainboard/emulation/qemu-power9/devicetree.cb b/src/mainboard/emulation/qemu-power9/devicetree.cb new file mode 100644 index 0000000000..7ea6247070 --- /dev/null +++ b/src/mainboard/emulation/qemu-power9/devicetree.cb @@ -0,0 +1,5 @@ +## SPDX-License-Identifier: GPL-2.0-only + +chip cpu/power9 + device cpu_cluster 0 on end +end diff --git a/src/mainboard/emulation/qemu-power9/mainboard.c b/src/mainboard/emulation/qemu-power9/mainboard.c new file mode 100644 index 0000000000..a1a35f0833 --- /dev/null +++ b/src/mainboard/emulation/qemu-power9/mainboard.c @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include + +static void mainboard_enable(struct device *dev) +{ + if (!dev) + die("No dev0; die\n"); +} + +struct chip_operations mainboard_ops = { + .enable_dev = mainboard_enable, +}; diff --git a/src/mainboard/emulation/qemu-power9/memlayout.ld b/src/mainboard/emulation/qemu-power9/memlayout.ld new file mode 100644 index 0000000000..ebac3c4a24 --- /dev/null +++ b/src/mainboard/emulation/qemu-power9/memlayout.ld @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include + +#include + +SECTIONS +{ + DRAM_START(0x0) + + BOOTBLOCK(0, 32K) + + STACK(0x8000, 32K) + + PRERAM_CBMEM_CONSOLE(0x10000, 128K) + FMAP_CACHE(0x30000, 4K) + CBFS_MCACHE(0x31000, 8K) + TIMESTAMP(0x33000, 4K) + CBFS_CACHE(0x34000, 512K) + ROMSTAGE(0x100000, 1M) + + RAMSTAGE(0x300000, 5M) +} diff --git a/src/mainboard/emulation/qemu-power9/romstage.c b/src/mainboard/emulation/qemu-power9/romstage.c new file mode 100644 index 0000000000..c412315255 --- /dev/null +++ b/src/mainboard/emulation/qemu-power9/romstage.c @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include + +void main(void) +{ + console_init(); + run_ramstage(); +}