summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/mainboard/emulation/qemu-power9.md30
-rw-r--r--configs/config.emulation_qemu_power91
-rw-r--r--src/mainboard/emulation/qemu-power9/Kconfig43
-rw-r--r--src/mainboard/emulation/qemu-power9/Kconfig.name2
-rw-r--r--src/mainboard/emulation/qemu-power9/Makefile.inc4
-rw-r--r--src/mainboard/emulation/qemu-power9/board_info.txt2
-rw-r--r--src/mainboard/emulation/qemu-power9/cbmem.c11
-rw-r--r--src/mainboard/emulation/qemu-power9/devicetree.cb5
-rw-r--r--src/mainboard/emulation/qemu-power9/mainboard.c15
-rw-r--r--src/mainboard/emulation/qemu-power9/memlayout.ld23
-rw-r--r--src/mainboard/emulation/qemu-power9/romstage.c10
11 files changed, 146 insertions, 0 deletions
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 <cbmem.h>
+
+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 <console/console.h>
+#include <device/device.h>
+#include <cbmem.h>
+
+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 <memlayout.h>
+
+#include <arch/header.ld>
+
+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 <console/console.h>
+#include <program_loading.h>
+
+void main(void)
+{
+ console_init();
+ run_ramstage();
+}