On Tue, May 12, 2026 at 2:32 AM Chao Liu <[email protected]> wrote: > > Signed-off-by: Chao Liu <[email protected]>
Acked-by: Alistair Francis <[email protected]> Alistair > --- > MAINTAINERS | 1 + > docs/system/riscv/k230.rst | 113 +++++++++++++++++++++++++++++++++++ > docs/system/target-riscv.rst | 1 + > 3 files changed, 115 insertions(+) > create mode 100644 docs/system/riscv/k230.rst > > diff --git a/MAINTAINERS b/MAINTAINERS > index e7e3ed0c5c..6a752b1a0a 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -1784,6 +1784,7 @@ K230 Machines > M: Chao Liu <[email protected]> > L: [email protected] > S: Maintained > +F: docs/system/riscv/k230.rst > F: hw/riscv/k230.c > F: hw/watchdog/k230_wdt.c > F: include/hw/riscv/k230.h > diff --git a/docs/system/riscv/k230.rst b/docs/system/riscv/k230.rst > new file mode 100644 > index 0000000000..cea8202e55 > --- /dev/null > +++ b/docs/system/riscv/k230.rst > @@ -0,0 +1,113 @@ > +Kendryte K230 virt reference platform (``k230``) > +========================================================================== > +The ``k230`` machine is compatible with the Kendryte K230 SDK. > + > +The K230 is a chip from the AIoT SoC series made by Kendryte ® — a part of > +Canaan Inc. It uses a brand-new multi-heterogeneous unit accelerated > computing > +structure. > + > +This chip has 2 RISC-V computing cores and a new-generation KPU (Knowledge > +Process Unit) smart computing unit. > + > +For more information, see <https://www.kendryte.com/en/proDetail/230> > + > +Supported devices > +----------------- > +The ``k230`` machine supports the following devices: > + > +* 1 c908 cores (little core) > +* Core Local Interruptor (CLINT) > +* Platform-Level Interrupt Controller (PLIC) > +* 2 K230 Watchdog Timer > +* 5 UART > + > +Boot options > +------------ > +The ``k230`` machine supports K230 SDK boot through M-mode U-Boot, which then > +starts OpenSBI/Linux with ``bootm``. It also supports direct Linux boot. > + > +K230 SDK Linux kernels use T-HEAD C9xx private MAEE page table attributes. > QEMU > +does not implement MAEE in the generic RISC-V MMU, so such kernels need to be > +built with standard RISC-V PTE bits before they can boot under QEMU. > + > +Running > +------- > + > +Direct Linux boot > +~~~~~~~~~~~~~~~~~ > + > +This flow lets QEMU load OpenSBI, Linux, initrd, and DTB directly, without > +running SDK U-Boot. The Linux Image must be rebuilt with standard RISC-V PTE > +bits before running under QEMU. > + > +.. code-block:: bash > + > + $ SDK=k230_sdk/output/k230_canmv_defconfig > + $ qemu-system-riscv64 -machine k230 \ > + -kernel "$SDK/images/little-core/Image" \ > + -dtb "/tmp/user-k230-qemu.dtb" \ > + -initrd "$SDK/images/little-core/rootfs.cpio.gz" \ > + -append "console=ttyS0,115200 earlycon=sbi cma=0" \ > + -nographic > + > +Direct boot uses the SDK little-core RAM layout for OpenSBI at > +``0x08000000``, Linux at ``0x08200000``, and the DTB at ``0x0a000000``. The > +initrd is placed by QEMU's generic RISC-V boot helper, and QEMU writes the > +initrd range and kernel command line into ``/chosen``. The DTB passed with > +``-dtb`` should be derived from ``$SDK/images/little-core/k230.dtb`` and must > +describe that initrd location as usable memory and disable any devices that > are > +not emulated by this machine. > + > +U-Boot boot > +~~~~~~~~~~~ > + > +This flow starts SDK U-Boot in M-mode with ``-bios``. Until the SDK storage > +path is modeled, place OpenSBI, Linux, initrd, and DTB in RAM with loader > +devices and run ``bootm`` manually. The Linux Image must be rebuilt with > +standard RISC-V PTE bits before running under QEMU. > + > +.. code-block:: bash > + > + $ SDK=k230_sdk/output/k230_canmv_defconfig > + $ IMAGE=$SDK/images/little-core/Image > + $ INITRD=$SDK/images/little-core/rootfs.cpio.gz > + $ DTB=$SDK/images/little-core/k230.dtb > + $ FWJUMP_UIMAGE=/tmp/k230-fw-jump.uImage > + $ INITRD_END=$(printf "0x%x" $((0x0a100000 + $(stat -c %s "$INITRD")))) > + $ "$SDK/little/buildroot-ext/host/bin/mkimage" \ > + -A riscv -O linux -T kernel -C none \ > + -a 0x8000000 -e 0x8000000 -n opensbi \ > + -d "$SDK/images/little-core/fw_jump.bin" "$FWJUMP_UIMAGE" > + $ qemu-system-riscv64 -machine k230 \ > + -bios "$SDK/little/uboot/u-boot" \ > + -device loader,file="$FWJUMP_UIMAGE",addr=0xc100000,force-raw=on \ > + -device loader,file="$IMAGE",addr=0x8200000,force-raw=on \ > + -device loader,file="$INITRD",addr=0xa100000,force-raw=on \ > + -device loader,file="$DTB",addr=0xa000000,force-raw=on \ > + -nographic > + > +The loader addresses mirror the SDK ``k230_canmv_defconfig`` output. Read the > +U-Boot addresses from the generated environment, and read the Linux RAM base > +from the generated ``hw/k230.dts.txt``. This replaces the SDK storage and > +decompression steps. > + > +Press Enter to stop autoboot. At the U-Boot prompt, run these commands: > + > +.. code-block:: bash > + > + K230# setenv bootargs console=ttyS0,115200 earlycon=sbi cma=0 > + K230# fdt addr 0xa000000 > + K230# fdt resize 8192 > + K230# fdt set /chosen linux,initrd-start <0x0 0xa100000> > + K230# fdt set /chosen linux,initrd-end <0x0 ${INITRD_END}> > + K230# fdt set /soc/sdhci0@91580000 status disabled > + K230# fdt set /soc/sdhci1@91581000 status disabled > + K230# bootm 0xc100000 - 0xa000000 > + > +Use ``setenv`` so ``bootm`` writes the kernel command line into > +``/chosen/bootargs``. The ``fdt`` commands select the loaded DTB, add space > for > +edits, describe the initrd range in ``/chosen``, and disable SDHCI nodes > because > +this machine does not emulate those controllers yet. Replace > ``${INITRD_END}`` > +with the host-calculated value above when typing the command. ``cma=0`` > avoids > +the SDK kernel reserving too much of the little-core memory window for > initramfs > +boot. > diff --git a/docs/system/target-riscv.rst b/docs/system/target-riscv.rst > index 3ad5d1ddaf..b0b2f9584f 100644 > --- a/docs/system/target-riscv.rst > +++ b/docs/system/target-riscv.rst > @@ -66,6 +66,7 @@ undocumented; you can get a complete list by running > .. toctree:: > :maxdepth: 1 > > + riscv/k230 > riscv/microblaze-v-generic > riscv/microchip-icicle-kit > riscv/mips >
