On Sun, 2026-09-27 at 20:13 +0000, Kuan-Wei Chiu wrote: > 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]>
Acked-by: Alistair Francis <[email protected]> Alistair > --- > 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.z > st', > + > '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()
