[PATCH 14/16] board: emulation: Add qemu-loongarch
Jiaxun Yang
jiaxun.yang at flygoat.com
Wed May 22 17:34:57 CEST 2024
Yet another generic QEMU VIRT machine.
QEMU placed FDT in memory before launching U-Boot, so we
can just obtian FDT here.
Signed-off-by: Jiaxun Yang <jiaxun.yang at flygoat.com>
---
arch/loongarch/Kconfig | 5 ++
arch/loongarch/dts/qemu-loongarch64.dts | 9 +++
board/emulation/qemu-loongarch/Kconfig | 68 ++++++++++++++++++
board/emulation/qemu-loongarch/MAINTAINERS | 7 ++
board/emulation/qemu-loongarch/Makefile | 6 ++
board/emulation/qemu-loongarch/qemu-loongarch.c | 84 +++++++++++++++++++++++
board/emulation/qemu-loongarch/qemu-loongarch.env | 6 ++
configs/qemu-loongarch64_defconfig | 36 ++++++++++
include/configs/qemu-loongarch.h | 13 ++++
9 files changed, 234 insertions(+)
diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig
index 5254afb2cd05..6cf7ad9b3a4f 100644
--- a/arch/loongarch/Kconfig
+++ b/arch/loongarch/Kconfig
@@ -7,9 +7,14 @@ config SYS_ARCH
choice
prompt "Target select"
+config TARGET_QEMU_LOONGARCH_VIRT
+ bool "Support QEMU Virt Board"
+ select BOARD_LATE_INIT
+
endchoice
# board-specific options below
+source "board/emulation/qemu-loongarch/Kconfig"
# platform-specific options below
source "arch/loongarch/cpu/generic/Kconfig"
diff --git a/arch/loongarch/dts/qemu-loongarch64.dts b/arch/loongarch/dts/qemu-loongarch64.dts
new file mode 100644
index 000000000000..39d303798fcb
--- /dev/null
+++ b/arch/loongarch/dts/qemu-loongarch64.dts
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2024 Jiaxun Yang <jiaxun.yang at flygoat.com>
+ */
+
+/dts-v1/;
+
+/ {
+};
diff --git a/board/emulation/qemu-loongarch/Kconfig b/board/emulation/qemu-loongarch/Kconfig
new file mode 100644
index 000000000000..188cd6967bfd
--- /dev/null
+++ b/board/emulation/qemu-loongarch/Kconfig
@@ -0,0 +1,68 @@
+if TARGET_QEMU_LOONGARCH_VIRT
+
+config SYS_BOARD
+ default "qemu-loongarch"
+
+config SYS_VENDOR
+ default "emulation"
+
+config SYS_CPU
+ default "generic"
+
+config SYS_CONFIG_NAME
+ default "qemu-loongarch"
+
+config TEXT_BASE
+ default 0x1c000000
+
+config BOARD_SPECIFIC_OPTIONS # dummy
+ def_bool y
+ select GENERIC_LOONGARCH
+ imply AHCI
+ imply BOARD_LATE_INIT
+ imply PCI_INIT_R
+ imply CMD_PCI
+ imply CMD_POWEROFF
+ imply CMD_SCSI
+ imply CMD_PING
+ imply CMD_EXT2
+ imply CMD_EXT4
+ imply CMD_FAT
+ imply CMD_FS_GENERIC
+ imply DOS_PARTITION
+ imply ISO_PARTITION
+ imply EFI_PARTITION
+ imply SCSI_AHCI
+ imply AHCI_PCI
+ imply E1000
+ imply PCI
+ imply NVME_PCI
+ imply PCIE_ECAM_GENERIC
+ imply DM_RNG
+ imply DM_RTC
+ imply QFW
+ imply QFW_MMIO
+ imply SCSI
+ imply SYS_NS16550
+ imply SYSRESET
+ imply SYSRESET_CMD_POWEROFF
+ imply SYSRESET_SYSCON
+ imply VIRTIO_MMIO
+ imply VIRTIO_PCI
+ imply VIRTIO_NET
+ imply VIRTIO_BLK
+ imply MTD_NOR_FLASH
+ imply CFI_FLASH
+ imply OF_HAS_PRIOR_STAGE
+ imply VIDEO
+ imply VIDEO_BOCHS
+ imply SYS_WHITE_ON_BLACK
+ imply USB
+ imply USB_XHCI_HCD
+ imply USB_XHCI_PCI
+ imply USB_KEYBOARD
+ imply CMD_USB
+ imply UFS
+ imply UFS_PCI
+
+endif
diff --git a/board/emulation/qemu-loongarch/MAINTAINERS b/board/emulation/qemu-loongarch/MAINTAINERS
new file mode 100644
index 000000000000..0ecd8201fb96
--- /dev/null
+++ b/board/emulation/qemu-loongarch/MAINTAINERS
@@ -0,0 +1,7 @@
+QEMU LOONGARCH 'VIRT' BOARD
+M: Jiaxun Yang <jiaxun.yang at flygoat.com>
+S: Maintained
+F: board/emulation/qemu-loongarch/
+F: board/emulation/common/
+F: include/configs/qemu-loongarch.h
+F: configs/qemu-loongarch64_defconfig
diff --git a/board/emulation/qemu-loongarch/Makefile b/board/emulation/qemu-loongarch/Makefile
new file mode 100644
index 000000000000..a928b90780e9
--- /dev/null
+++ b/board/emulation/qemu-loongarch/Makefile
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2024 Jiaxun yang <jiaxun.yang at flygoat.com>
+#
+
+obj-y += qemu-loongarch.o
diff --git a/board/emulation/qemu-loongarch/qemu-loongarch.c b/board/emulation/qemu-loongarch/qemu-loongarch.c
new file mode 100644
index 000000000000..5cedd2c7479e
--- /dev/null
+++ b/board/emulation/qemu-loongarch/qemu-loongarch.c
@@ -0,0 +1,84 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2024 Jiaxun Yang <jiaxun.yang at flygoat.com>
+ */
+
+#include <dm.h>
+#include <dm/ofnode.h>
+#include <env.h>
+#include <fdtdec.h>
+#include <image.h>
+#include <lmb.h>
+#include <log.h>
+#include <spl.h>
+#include <init.h>
+#include <usb.h>
+#include <virtio_types.h>
+#include <virtio.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#if IS_ENABLED(CONFIG_MTD_NOR_FLASH)
+int is_flash_available(void)
+{
+ if (!ofnode_equal(ofnode_by_compatible(ofnode_null(), "cfi-flash"),
+ ofnode_null()))
+ return 1;
+
+ return 0;
+}
+#endif
+
+phys_addr_t board_get_usable_ram_top(phys_size_t total_size)
+{
+ /* Limit RAM used by U-Boot to the DDR low region */
+ if (gd->ram_top > 0x10000000)
+ return 0x10000000;
+
+ return gd->ram_top;
+}
+
+int board_init(void)
+{
+ return 0;
+}
+
+#define addr_alloc(lmb, size) lmb_alloc(lmb, size, SZ_64K)
+
+int board_late_init(void)
+{
+ struct lmb lmb;
+ u32 status = 0;
+
+ lmb_init_and_reserve(&lmb, gd->bd, (void *)gd->fdt_blob);
+
+ status |= env_set_hex("kernel_addr_r", addr_alloc(&lmb, SZ_128M));
+ status |= env_set_hex("ramdisk_addr_r", addr_alloc(&lmb, SZ_128M));
+ status |= env_set_hex("kernel_comp_addr_r", addr_alloc(&lmb, SZ_64M));
+ status |= env_set_hex("kernel_comp_size", SZ_64M);
+ status |= env_set_hex("scriptaddr", addr_alloc(&lmb, SZ_4M));
+ status |= env_set_hex("pxefile_addr_r", addr_alloc(&lmb, SZ_4M));
+ status |= env_set_hex("fdt_addr_r", addr_alloc(&lmb, SZ_2M));
+
+ if (status)
+ log_warning("late_init: Failed to set run time variables\n");
+
+ /* start usb so that usb keyboard can be used as input device */
+ if (CONFIG_IS_ENABLED(USB_KEYBOARD))
+ usb_init();
+
+ /*
+ * Make sure virtio bus is enumerated so that peripherals
+ * on the virtio bus can be discovered by their drivers
+ */
+ virtio_init();
+
+ return 0;
+}
+
+void *board_fdt_blob_setup(int *err)
+{
+ *err = 0;
+ /* Stored the DTB address there during our init */
+ return (void *)(ulong)0x100000;
+}
diff --git a/board/emulation/qemu-loongarch/qemu-loongarch.env b/board/emulation/qemu-loongarch/qemu-loongarch.env
new file mode 100644
index 000000000000..2d130510607d
--- /dev/null
+++ b/board/emulation/qemu-loongarch/qemu-loongarch.env
@@ -0,0 +1,6 @@
+
+stdin=serial,usbkbd
+stdout=serial,vidconsole
+stderr=serial,vidconsole
+
+boot_targets=qfw usb scsi virtio nvme dhcp
diff --git a/configs/qemu-loongarch64_defconfig b/configs/qemu-loongarch64_defconfig
new file mode 100644
index 000000000000..d7f9c4338486
--- /dev/null
+++ b/configs/qemu-loongarch64_defconfig
@@ -0,0 +1,36 @@
+CONFIG_LOONGARCH=y
+CONFIG_SYS_MALLOC_LEN=0x800000
+CONFIG_SYS_MALLOC_F_LEN=0x4000
+CONFIG_NR_DRAM_BANKS=8
+CONFIG_ENV_SIZE=0x20000
+CONFIG_DEFAULT_DEVICE_TREE="qemu-loongarch64"
+CONFIG_DM_RESET=y
+CONFIG_SYS_LOAD_ADDR=0x02000000
+CONFIG_SHOW_REGS=y
+# CONFIG_OF_BOARD_FIXUP is not set
+CONFIG_SYS_PCI_64BIT=y
+CONFIG_FIT=y
+CONFIG_BOOTSTD_FULL=y
+CONFIG_SYS_BOOTM_LEN=0x4000000
+CONFIG_USE_BOOTARGS=y
+CONFIG_BOOTARGS_SUBST=y
+CONFIG_DISPLAY_CPUINFO=y
+CONFIG_DISPLAY_BOARDINFO=y
+# CONFIG_CMD_MII is not set
+CONFIG_CMD_2048=y
+CONFIG_CMD_RTC=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_SYSBOOT=y
+CONFIG_CMD_QFW=y
+CONFIG_PARTITION_TYPE_GUID=y
+CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+CONFIG_BLKMAP=y
+CONFIG_EFI_MEDIA=y
+CONFIG_DM_MMC=y
+CONFIG_DM_MTD=y
+CONFIG_FLASH_SHOW_PROGRESS=0
+CONFIG_SYS_MAX_FLASH_BANKS=2
+CONFIG_PCI_REGION_MULTI_ENTRY=y
+CONFIG_DM_REBOOT_MODE=y
+CONFIG_RESET_SYSCON=y
+CONFIG_HEXDUMP=y
diff --git a/include/configs/qemu-loongarch.h b/include/configs/qemu-loongarch.h
new file mode 100644
index 000000000000..c1af4fee83ff
--- /dev/null
+++ b/include/configs/qemu-loongarch.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (c) 2024 Jiaxun Yang <jiaxun.yang at flygoat.com>
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/* Those values are chosen by LoongArchQemuPkg */
+#define CFG_SYS_INIT_RAM_ADDR 0x10000
+#define CFG_SYS_INIT_RAM_SIZE 0x10000
+
+#endif
--
2.43.0
More information about the U-Boot
mailing list