Add support for the BeagleBoard.org BeagleV-Ahead, based on the T-Head
TH1520 SoC with 4 GB of LPDDR4X.

The TH1520 SoC support and the devicetree are already upstream, so only
a board directory, a U-Boot devicetree include and a defconfig are
needed. As on the Lichee Pi 4A, the SPL is loaded into SRAM through
fastboot and starts OpenSBI and U-Boot from a FIT generated by binman.

The board has a single rank of memory, so the DDR firmware must be built
from lpddr4x-3733-singlerank.lua instead of the dual rank configuration
used by the Lichee Pi 4A.

Signed-off-by: Thomas Perrot <[email protected]>
---
 arch/riscv/Kconfig                              |   9 ++
 arch/riscv/dts/th1520-beaglev-ahead-u-boot.dtsi |  32 +++++++
 board/beagle/beaglev_ahead/Kconfig              |  43 +++++++++
 board/beagle/beaglev_ahead/MAINTAINERS          |   8 ++
 board/beagle/beaglev_ahead/Makefile             |   7 ++
 board/beagle/beaglev_ahead/board.c              |  14 +++
 board/beagle/beaglev_ahead/spl.c                |  51 +++++++++++
 configs/beaglev_ahead_defconfig                 | 110 ++++++++++++++++++++++++
 include/configs/beaglev_ahead.h                 |  20 +++++
 9 files changed, 294 insertions(+)

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index ad7589123c6c..20bf9b54d652 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -20,6 +20,14 @@ config TARGET_BANANAPI_F3
 config TARGET_BEAGLEBOARD_BEAGLEVFIRE
        bool "Support BeagleBoard BeagleV-Fire Board (based on Microchip MPFS)"
 
+config TARGET_BEAGLEV_AHEAD
+       bool "Support BeagleBoard BeagleV-Ahead Board (based on T-Head TH1520)"
+       select SYS_CACHE_SHIFT_6
+       help
+         The BeagleBoard.org BeagleV-Ahead is a single board computer based on
+         the T-Head TH1520 SoC (4x Xuantie C910), with 4 GB of LPDDR4X and
+         16 GB of eMMC.
+
 config TARGET_K230_CANMV
        bool "Support K230 CanMV Board"
 
@@ -109,6 +117,7 @@ config SPL_ZERO_MEM_BEFORE_USE
 source "board/andestech/ae350/Kconfig"
 source "board/andestech/voyager/Kconfig"
 source "board/aspeed/ibex_ast2700/Kconfig"
+source "board/beagle/beaglev_ahead/Kconfig"
 source "board/beagle/beaglev_fire/Kconfig"
 source "board/canaan/k230_canmv/Kconfig"
 source "board/emulation/qemu-riscv/Kconfig"
diff --git a/arch/riscv/dts/th1520-beaglev-ahead-u-boot.dtsi 
b/arch/riscv/dts/th1520-beaglev-ahead-u-boot.dtsi
new file mode 100644
index 000000000000..b5e77bdf9d06
--- /dev/null
+++ b/arch/riscv/dts/th1520-beaglev-ahead-u-boot.dtsi
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2025 Yao Zi <[email protected]>
+ * Copyright (C) 2026 Thomas Perrot <[email protected]>
+ */
+
+#include "th1520-u-boot.dtsi"
+#include "thead-th1520-binman.dtsi"
+
+&{/memory@0} {
+       bootph-pre-ram;
+};
+
+&clk {
+       bootph-some-ram;
+};
+
+&padctrl0_apsys {
+       bootph-some-ram;
+};
+
+&uart0_pins {
+       bootph-some-ram;
+
+       tx-pins {
+               bootph-some-ram;
+       };
+
+       rx-pins {
+               bootph-some-ram;
+       };
+};
diff --git a/board/beagle/beaglev_ahead/Kconfig 
b/board/beagle/beaglev_ahead/Kconfig
new file mode 100644
index 000000000000..f0c4fe54678a
--- /dev/null
+++ b/board/beagle/beaglev_ahead/Kconfig
@@ -0,0 +1,43 @@
+if TARGET_BEAGLEV_AHEAD
+
+config ARCH_THEAD
+       bool
+       default y
+
+config SYS_BOARD
+       default "beaglev_ahead"
+
+config SYS_VENDOR
+       default "beagle"
+
+config SYS_CPU
+       default "th1520"
+
+config SYS_CONFIG_NAME
+       default "beaglev_ahead"
+
+config TEXT_BASE
+       default 0x01b00000 if SPL
+       default 0x01c00000 if !RISCV_SMODE
+       default 0x01c00000 if RISCV_SMODE
+
+config SPL_TEXT_BASE
+       default 0xffe0000000
+
+config SPL_OPENSBI_LOAD_ADDR
+       default 0x80000000
+
+config BOARD_SPECIFIC_OPTIONS
+       def_bool y
+       select ARCH_EARLY_INIT_R
+       select THEAD_TH1520
+       imply CPU
+       imply CPU_RISCV
+       imply RISCV_TIMER if RISCV_SMODE
+       imply CMD_CPU
+       imply SMP
+       imply SUPPORT_OF_CONTROL
+       imply OF_CONTROL
+       imply OF_REAL
+
+endif
diff --git a/board/beagle/beaglev_ahead/MAINTAINERS 
b/board/beagle/beaglev_ahead/MAINTAINERS
new file mode 100644
index 000000000000..7d6a162863b0
--- /dev/null
+++ b/board/beagle/beaglev_ahead/MAINTAINERS
@@ -0,0 +1,8 @@
+BeagleBoard BeagleV-Ahead
+M:     Thomas Perrot <[email protected]>
+S:     Maintained
+F:     arch/riscv/dts/th1520-beaglev-ahead-u-boot.dtsi
+F:     board/beagle/beaglev_ahead/
+F:     configs/beaglev_ahead_defconfig
+F:     doc/board/beagle/beaglev_ahead.rst
+F:     include/configs/beaglev_ahead.h
diff --git a/board/beagle/beaglev_ahead/Makefile 
b/board/beagle/beaglev_ahead/Makefile
new file mode 100644
index 000000000000..ab3c61a10eca
--- /dev/null
+++ b/board/beagle/beaglev_ahead/Makefile
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (c) 2023, Yixun Lan <[email protected]>
+# Copyright (c) 2026, Thomas Perrot <[email protected]>
+
+obj-y += board.o
+obj-$(CONFIG_XPL_BUILD) += spl.o
diff --git a/board/beagle/beaglev_ahead/board.c 
b/board/beagle/beaglev_ahead/board.c
new file mode 100644
index 000000000000..32c3f3205078
--- /dev/null
+++ b/board/beagle/beaglev_ahead/board.c
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2023, Yixun Lan <[email protected]>
+ * Copyright (c) 2026, Thomas Perrot <[email protected]>
+ */
+
+#include <cpu_func.h>
+
+int board_init(void)
+{
+       enable_caches();
+
+       return 0;
+}
diff --git a/board/beagle/beaglev_ahead/spl.c b/board/beagle/beaglev_ahead/spl.c
new file mode 100644
index 000000000000..d75fa6f3eff7
--- /dev/null
+++ b/board/beagle/beaglev_ahead/spl.c
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2025, Yao Zi <[email protected]>
+ */
+
+#include <asm/io.h>
+#include <asm/spl.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/spl.h>
+#include <cpu_func.h>
+#include <dm.h>
+#include <hang.h>
+#include <spl.h>
+
+u32 spl_boot_device(void)
+{
+       /*
+        * We don't bother to load proper U-Boot from an external device as
+        * it fits in the integrated SRAM nicely.
+        */
+       return BOOT_DEVICE_RAM;
+}
+
+void board_init_f(ulong dummy)
+{
+       int ret = spl_early_init();
+       struct udevice *dev;
+
+       if (ret)
+               panic("spl_early_init() failed %d\n", ret);
+
+       preloader_console_init();
+
+       /*
+        * Manually bind CPU ahead of time to make sure in-core timers are
+        * available in SPL.
+        */
+       ret = uclass_get_device(UCLASS_CPU, 0, &dev);
+       if (ret)
+               panic("failed to bind CPU: %d\n", ret);
+
+       riscv_cpu_setup();
+       th1520_kick_secondary_cores();
+
+       spl_dram_init();
+
+       icache_enable();
+       dcache_enable();
+
+       th1520_invalidate_pmp();
+}
diff --git a/configs/beaglev_ahead_defconfig b/configs/beaglev_ahead_defconfig
new file mode 100644
index 000000000000..1ababbd63f2a
--- /dev/null
+++ b/configs/beaglev_ahead_defconfig
@@ -0,0 +1,110 @@
+CONFIG_RISCV=y
+CONFIG_SYS_MALLOC_LEN=0x800000
+CONFIG_SYS_MALLOC_F_LEN=0x10000
+CONFIG_SPL_GPIO=y
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
+CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x80200000
+CONFIG_DM_GPIO=y
+CONFIG_DEFAULT_DEVICE_TREE="thead/th1520-beaglev-ahead"
+CONFIG_SPL_STACK=0xffe0170000
+CONFIG_SPL_BSS_START_ADDR=0xffe0160000
+CONFIG_SPL_BSS_MAX_SIZE=0x10000
+CONFIG_SYS_LOAD_ADDR=0x80200000
+CONFIG_SPL=y
+CONFIG_TARGET_BEAGLEV_AHEAD=y
+CONFIG_ARCH_RV64I=y
+CONFIG_RISCV_SMODE=y
+CONFIG_SYS_BOOT_GET_CMDLINE=y
+CONFIG_SYS_BOOT_GET_KBD=y
+# CONFIG_EFI_LOADER is not set
+CONFIG_FIT=y
+# CONFIG_FIT_FULL_CHECK is not set
+# CONFIG_FIT_PRINT is not set
+CONFIG_SPL_LOAD_FIT_ADDRESS=0xffe0040000
+# CONFIG_BOOTSTD is not set
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_BOOTARGS_SUBST=y
+CONFIG_BOOTCOMMAND=""
+CONFIG_DEFAULT_FDT_FILE="thead/th1520-beaglev-ahead.dtb"
+CONFIG_SYS_CBSIZE=256
+CONFIG_SYS_PBSIZE=276
+CONFIG_LOG=y
+CONFIG_DISPLAY_CPUINFO=y
+CONFIG_DISPLAY_BOARDINFO=y
+CONFIG_DISPLAY_BOARDINFO_LATE=y
+CONFIG_SPL_MAX_SIZE=0x40000
+# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
+CONFIG_SPL_HAVE_INIT_STACK=y
+CONFIG_SPL_SYS_MALLOC=y
+CONFIG_SPL_HAS_CUSTOM_MALLOC_START=y
+CONFIG_SPL_CUSTOM_SYS_MALLOC_ADDR=0x10000000
+CONFIG_SPL_SYS_MALLOC_SIZE=0x400000
+CONFIG_SPL_RAM_DEVICE=y
+CONFIG_SYS_PROMPT="Ahead=> "
+CONFIG_CMD_CONFIG=y
+CONFIG_CMD_LICENSE=y
+CONFIG_CMD_BOOTZ=y
+# CONFIG_BOOTM_PLAN9 is not set
+# CONFIG_BOOTM_RTEMS is not set
+# CONFIG_BOOTM_VXWORKS is not set
+CONFIG_CMD_BOOTMENU=y
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMI is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_EXPORTENV is not set
+# CONFIG_CMD_IMPORTENV is not set
+# CONFIG_CMD_EDITENV is not set
+# CONFIG_CMD_SAVEENV is not set
+# CONFIG_CMD_CRC32 is not set
+# CONFIG_CMD_MEMORY is not set
+# CONFIG_CMD_LZMADEC is not set
+# CONFIG_CMD_UNLZ4 is not set
+# CONFIG_CMD_UNZIP is not set
+CONFIG_CMD_GPIO=y
+# CONFIG_CMD_LOADB is not set
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MMC=y
+CONFIG_MMC_SPEED_MODE_SET=y
+# CONFIG_CMD_ITEST is not set
+# CONFIG_CMD_SOURCE is not set
+# CONFIG_CMD_SETEXPR is not set
+# CONFIG_CMD_SLEEP is not set
+CONFIG_PARTITION_TYPE_GUID=y
+CONFIG_ENV_RELOC_GD_ENV_ADDR=y
+CONFIG_VERSION_VARIABLE=y
+CONFIG_NET_RANDOM_ETHADDR=y
+# CONFIG_BLOCK_CACHE is not set
+CONFIG_DWAPB_GPIO=y
+# CONFIG_I2C is not set
+# CONFIG_INPUT is not set
+CONFIG_MMC=y
+CONFIG_MMC_IO_VOLTAGE=y
+CONFIG_MMC_UHS_SUPPORT=y
+CONFIG_MMC_HS400_ES_SUPPORT=y
+CONFIG_MMC_HS400_SUPPORT=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_ADMA=y
+CONFIG_MMC_SDHCI_SNPS=y
+# CONFIG_MTD is not set
+CONFIG_DM_MDIO=y
+CONFIG_DM_ETH_PHY=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_ETH_DESIGNWARE_THEAD=y
+CONFIG_PHY_REALTEK=y
+CONFIG_PINCTRL=y
+# CONFIG_POWER is not set
+CONFIG_RAM=y
+CONFIG_SPL_RAM=y
+CONFIG_SPL_THEAD_TH1520_DDR=y
+CONFIG_SYS_NS16550=y
+CONFIG_AES=y
+CONFIG_BLAKE2=y
+CONFIG_SHA512=y
+CONFIG_LZ4=y
+CONFIG_LZMA=y
+CONFIG_LZO=y
+CONFIG_ZLIB_UNCOMPRESS=y
+CONFIG_BZIP2=y
+CONFIG_ZSTD=y
+CONFIG_LIB_RATIONAL=y
diff --git a/include/configs/beaglev_ahead.h b/include/configs/beaglev_ahead.h
new file mode 100644
index 000000000000..ac5df86890a3
--- /dev/null
+++ b/include/configs/beaglev_ahead.h
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (c) 2023 Yixun Lan <[email protected]>
+ * Copyright (c) 2026 Thomas Perrot <[email protected]>
+ */
+
+#ifndef __BEAGLEV_AHEAD_H
+#define __BEAGLEV_AHEAD_H
+
+#include <linux/sizes.h>
+
+#define CFG_SYS_NS16550_CLK            100000000
+#define CFG_SYS_SDRAM_BASE             0x00000000
+
+/* Environment options */
+
+#define CFG_EXTRA_ENV_SETTINGS \
+       "PS1=[BeagleV-Ahead]# \0"
+
+#endif /* __BEAGLEV_AHEAD_H */

-- 
2.55.0

Reply via email to