diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index 265b5320777..329ee35900b 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -47,6 +47,9 @@ config TARGET_SIPEED_MAIX bool "Support Sipeed Maix Board" select SYS_CACHE_SHIFT_6 +config TARGET_SPACEMIT_K3 + bool "Support SpacemiT K3 based Boards" + config TARGET_STARFIVE_VISIONFIVE2 bool "Support StarFive VisionFive2 Board" select BOARD_LATE_INIT @@ -116,6 +119,7 @@ source "board/sipeed/maix/Kconfig" source "board/sophgo/milkv_duo/Kconfig" source "board/sophgo/licheerv_nano/Kconfig" source "board/spacemit/bananapi-f3/Kconfig" +source "board/spacemit/k3-generic/Kconfig" source "board/starfive/visionfive2/Kconfig" source "board/thead/th1520_lpi4a/Kconfig" source "board/xilinx/mbv/Kconfig" @@ -129,6 +133,7 @@ source "arch/riscv/cpu/ast2700/Kconfig" source "arch/riscv/cpu/generic/Kconfig" source "arch/riscv/cpu/jh7110/Kconfig" source "arch/riscv/cpu/k1/Kconfig" +source "arch/riscv/cpu/k3/Kconfig" source "arch/riscv/cpu/k230/Kconfig" source "arch/riscv/cpu/th1520/Kconfig" diff --git a/arch/riscv/cpu/k3/Kconfig b/arch/riscv/cpu/k3/Kconfig new file mode 100644 index 00000000000..d4ae03d8ca2 --- /dev/null +++ b/arch/riscv/cpu/k3/Kconfig @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Copyright (c) 2026, Hangfan Li + +# Due to limitation of Kconfig, the following symbols cannot be selected here: +# CONFIG_ARCH_RV64I +# CONFIG_RISCV_SMODE + +config SPACEMIT_K3 + bool + select ARCH_EARLY_INIT_R + imply CPU + imply CPU_RISCV + imply RISCV_ISA_ZICBOM + +if SPACEMIT_K3 + +config SYS_CPU + default "k3" + +endif diff --git a/arch/riscv/cpu/k3/Makefile b/arch/riscv/cpu/k3/Makefile new file mode 100644 index 00000000000..d1d375be276 --- /dev/null +++ b/arch/riscv/cpu/k3/Makefile @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Copyright (c) 2026, Hangfan Li + +obj-$(CONFIG_XPL_BUILD) += spl.o +obj-y += cpu.o +obj-y += cache.o +obj-y += dram.o diff --git a/arch/riscv/cpu/k3/cache.c b/arch/riscv/cpu/k3/cache.c new file mode 100644 index 00000000000..e69de29bb2d diff --git a/arch/riscv/cpu/k3/cpu.c b/arch/riscv/cpu/k3/cpu.c new file mode 100644 index 00000000000..db45f2055ad --- /dev/null +++ b/arch/riscv/cpu/k3/cpu.c @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2026 Hangfan Li + */ + +#include +#include + + +/* + * cleanup_before_linux() is called just before we call linux + * it prepares the processor for linux + * + * we disable interrupt and caches. + */ +int cleanup_before_linux(void) +{ + disable_interrupts(); + + cache_flush(); + + return 0; +} + diff --git a/arch/riscv/cpu/k3/dram.c b/arch/riscv/cpu/k3/dram.c new file mode 100644 index 00000000000..f47c1038886 --- /dev/null +++ b/arch/riscv/cpu/k3/dram.c @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2026 Hangfan Li + */ + +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +__weak int dram_init(void) +{ + return fdtdec_setup_mem_size_base(); +} + +__weak int dram_init_banksize(void) +{ + return fdtdec_setup_memory_banksize(); +} + diff --git a/arch/riscv/cpu/k3/spl.c b/arch/riscv/cpu/k3/spl.c new file mode 100644 index 00000000000..e69de29bb2d diff --git a/arch/riscv/dts/k3-cpus.dtsi b/arch/riscv/dts/k3-cpus.dtsi new file mode 100644 index 00000000000..c5b002eddc6 --- /dev/null +++ b/arch/riscv/dts/k3-cpus.dtsi @@ -0,0 +1,74 @@ +/ { + cpus { + bootph-all; + #address-cells = <1>; + #size-cells = <0>; + timebase-frequency = <24000000>; + + cpu_0: cpu@0 { + bootph-all; + compatible = "spacemit,x100", "riscv"; + device_type = "cpu"; + reg = <0>; + riscv,isa = "rv64imafdcvh_zicbom_zicboz_zicntr_zicond_zicsr_zifencei_zihintpause_zihpm_zfh_zfhmin_zba_zbb_zbc_zbs_zkt_zvbb_zvbc_zvfh_zvfhmin_zvkb_zvkg_zvkn_zvknc_zvkned_zvkng_zvknha_zvknhb_zvks_zvksc_zvksed_zvksh_zvksg_zvkt_ssaia_sscofpmf_sstc_svinval_svnapot_svpbmt_smstateen"; + riscv,isa-base = "rv64i"; + riscv,isa-extensions = "i", "m", "a", "f", "d", "c", "v", "h", + "zicbom", "zicboz", "zicntr", "zicond", "zicsr", + "zifencei", "zihintpause", "zihpm", "zfh", "zfhmin", + "zba", "zbb", "zbc", "zbs", "zkt", "zvbb", "zvbc", + "zvfh", "zvfhmin", "zvkb", "zvkg", "zvkn", "zvknc", + "zvkned", "zvkng", "zvknha", "zvknhb", "zvks", + "zvksc", "zvksed", "zvksh", "zvksg", "zvkt", "ssaia", + "sscofpmf", "sstc", "svinval", "svnapot", "svpbmt", + "smstateen"; + riscv,cbom-block-size = <64>; + /*riscv,cbop-block-size = <64>;*/ + riscv,cboz-block-size = <64>; + i-cache-block-size = <64>; + i-cache-size = <65536>; + i-cache-sets = <256>; + d-cache-block-size = <64>; + d-cache-size = <65536>; + d-cache-sets = <256>; + next-level-cache = <&cluster0_l2_cache>; + mmu-type = "riscv,sv39"; + }; + + cluster0_l2_cache: l2-cache0 { + bootph-all; + compatible = "cache"; + cache-block-size = <64>; + cache-level = <2>; + cache-size = <4194304>; + cache-sets = <4096>; + cache-unified; + }; + + cluster1_l2_cache: l2-cache1 { + compatible = "cache"; + cache-block-size = <64>; + cache-level = <2>; + cache-size = <4194304>; + cache-sets = <4096>; + cache-unified; + }; + + cluster2_l2_cache: l2-cache2 { + compatible = "cache"; + cache-block-size = <64>; + cache-level = <2>; + cache-size = <1048576>; + cache-sets = <1024>; + cache-unified; + }; + + cluster3_l2_cache: l2-cache3 { + compatible = "cache"; + cache-block-size = <64>; + cache-level = <2>; + cache-size = <1048576>; + cache-sets = <1024>; + cache-unified; + }; + }; +}; diff --git a/arch/riscv/dts/k3-spacemit-deb1.dts b/arch/riscv/dts/k3-spacemit-deb1.dts new file mode 100644 index 00000000000..55cf83b5cf7 --- /dev/null +++ b/arch/riscv/dts/k3-spacemit-deb1.dts @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/* + * Copyright (C) 2026 Hangfan Li + */ + +#include "k3.dtsi" + +/ { + model = "SpacemiT K3 DEB1 Board"; + compatible = "spacemit,k3-deb1", "spacemit,k3"; + + chosen { + stdout-path = "serial0"; + }; + + memory@0 { + device_type = "memory"; + reg = <0x00000000 0x00000000 0x00000000 0x80000000>; + }; +}; diff --git a/arch/riscv/dts/k3.dtsi b/arch/riscv/dts/k3.dtsi new file mode 100644 index 00000000000..4eb09a40c99 --- /dev/null +++ b/arch/riscv/dts/k3.dtsi @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/* + * Copyright (C) 2026 Hangfan Li + */ + +/dts-v1/; + +#include "k3-cpus.dtsi" + +/ { + #address-cells = <2>; + #size-cells = <2>; + model = "SpacemiT K3"; + compatible = "spacemit,k3"; + + aliases { + }; + +}; diff --git a/board/spacemit/k3-generic/Kconfig b/board/spacemit/k3-generic/Kconfig new file mode 100644 index 00000000000..e23fbaf8b9a --- /dev/null +++ b/board/spacemit/k3-generic/Kconfig @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Copyright (c) 2026, Hangfan Li + +if TARGET_SPACEMIT_K3 + +config SYS_VENDOR + default "spacemit" + +config SYS_BOARD + default "k3-generic" + +config SYS_CONFIG_NAME + default "spacemit-k3-generic" + +config CUSTOM_SYS_INIT_SP_ADDR + default 0xc0880000 + +config TEXT_BASE + hex + default 0x80200000 if RISCV_SMODE + +config SYS_LOAD_ADDR + hex + default 0x102000000 + +config DEFAULT_DEVICE_TREE + default "k3-spacemit-deb1" + +config BOARD_SPECIFIC_OPTIONS + def_bool y + select SPACEMIT_K3 + select HAS_CUSTOM_SYS_INIT_SP_ADDR + +endif diff --git a/board/spacemit/k3-generic/Makefile b/board/spacemit/k3-generic/Makefile new file mode 100644 index 00000000000..03d8668463b --- /dev/null +++ b/board/spacemit/k3-generic/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Copyright (c) 2026, Hangfan Li + +obj-y := k3-generic.o diff --git a/board/spacemit/k3-generic/k3-generic.c b/board/spacemit/k3-generic/k3-generic.c new file mode 100644 index 00000000000..c3d421d5c8b --- /dev/null +++ b/board/spacemit/k3-generic/k3-generic.c @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2026, Hangfan Li + */ + +int board_init(void) +{ + /* Add board-specific initialization */ + return 0; +} diff --git a/configs/k3_defconfig b/configs/k3_defconfig new file mode 100644 index 00000000000..cc6f894aa7d --- /dev/null +++ b/configs/k3_defconfig @@ -0,0 +1,4 @@ +CONFIG_RISCV=y +CONFIG_TARGET_SPACEMIT_K3=y +CONFIG_ARCH_RV64I=y +CONFIG_RISCV_SMODE=y diff --git a/include/configs/spacemit-k3-generic.h b/include/configs/spacemit-k3-generic.h new file mode 100644 index 00000000000..a70e737a2c8 --- /dev/null +++ b/include/configs/spacemit-k3-generic.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2026, Hangfan Li + */ + +#ifndef __CONFIG_H +#define __CONFIG_H + + + +#endif /* __CONFIG_H */