Add a functional boot test for the Milk-V Duo board to validate the end-to-end boot flow.
$ ./build/run ./tests/functional/riscv64/test_milkv_duo.py TAP version 13 ok 1 test_milkv_duo.MilkvDuoMachine.test_riscv64_milkv_duo 1..1 Signed-off-by: Kuan-Wei Chiu <[email protected]> --- MAINTAINERS | 1 + tests/functional/riscv64/meson.build | 1 + tests/functional/riscv64/test_milkv_duo.py | 53 ++++++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100755 tests/functional/riscv64/test_milkv_duo.py diff --git a/MAINTAINERS b/MAINTAINERS index f7e4159679..689424fd1c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1880,6 +1880,7 @@ F: hw/riscv/cv1800b.c F: hw/riscv/milkv_duo.c F: include/hw/misc/cv1800b_clk.h F: include/hw/riscv/cv1800b.h +F: tests/functional/riscv64/test_milkv_duo.py F: tests/qtest/milkv-duo-test.c RX Machines diff --git a/tests/functional/riscv64/meson.build b/tests/functional/riscv64/meson.build index d1a3e6c2bf..8a4f1d00f9 100644 --- a/tests/functional/riscv64/meson.build +++ b/tests/functional/riscv64/meson.build @@ -18,4 +18,5 @@ tests_riscv64_system_thorough = [ 'sifive_u', 'tt_atlantis', 'tuxrun', + 'milkv_duo', ] diff --git a/tests/functional/riscv64/test_milkv_duo.py b/tests/functional/riscv64/test_milkv_duo.py new file mode 100755 index 0000000000..6a7e2a5d19 --- /dev/null +++ b/tests/functional/riscv64/test_milkv_duo.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +# +# Functional test that boots a Linux kernel on a Milk-V Duo machine +# +# Copyright (c) 2026 Kuan-Wei Chiu <[email protected]> +# +# SPDX-License-Identifier: GPL-2.0-or-later + +from qemu_test import LinuxKernelTest, Asset +from qemu_test import skipIfMissingCommands, wait_for_console_pattern + +class MilkvDuoMachine(LinuxKernelTest): + + timeout = 120 + + ASSET_KERNEL = Asset( + 'https://storage.tuxboot.com/kernels/6.11.9/riscv64/Image', + '174f8bb87f08961e54fa3fcd954a8e31f4645f6d6af4dd43983d5e9841490fb0' + ) + ASSET_DTBS = Asset( + 'https://storage.tuxboot.com/kernels/6.11.9/riscv64/dtbs.tar.xz', + '97e5e65a7e6c68303e53486af120c0846ee8df572e9c15f0c4dccb831d0cef4b' + ) + ASSET_ROOTFS = Asset( + 'https://storage.tuxboot.com/buildroot/20241119/riscv64/rootfs.ext4.zst', + 'aa4736a9872651dfc0d95e709465eedf1134fd19d42b8cb305bfd776f9801004' + ) + + @skipIfMissingCommands('zstd') + def test_riscv64_milkv_duo(self): + self.set_machine('milkv-duo') + + kernel_path = self.ASSET_KERNEL.fetch() + dtb_path = self.archive_extract( + self.ASSET_DTBS, member='dtbs/sophgo/cv1800b-milkv-duo.dtb') + rootfs_path = self.uncompress(self.ASSET_ROOTFS) + + self.vm.set_console() + self.vm.add_args('-bios', 'default', + '-kernel', kernel_path, + '-dtb', dtb_path, + '-drive', f'file={rootfs_path},format=raw,id=sd-card,snapshot=on', + '-device', 'sd-card,drive=sd-card', + '-append', 'console=ttyS0,115200 root=/dev/mmcblk0 rootwait earlycon') + + self.vm.launch() + + wait_for_console_pattern(self, 'Machine model: Milk-V Duo') + wait_for_console_pattern(self, 'Welcome to TuxTest') + wait_for_console_pattern(self, 'tuxtest login:') + +if __name__ == '__main__': + LinuxKernelTest.main() -- 2.56.0.rc1.315.gc6ed9934b7-goog
