On Wed, Jun 17, 2026 at 5:04 AM Kuan-Wei Chiu <[email protected]> wrote: > > Add minimal qtest coverage for the Milk-V Duo machine to validate basic > MMIO mapping and register access. > > Currently tested: > - Verify DW8250 UART component version and type signatures. > - Test read/write access to CV1800B clock bypass register. > > Tested with: > $ meson test -C build -v qemu:qtest-riscv64/milkv-duo-test > [...] > Ok: 1 > Fail: 0 > > Signed-off-by: Kuan-Wei Chiu <[email protected]> > --- > MAINTAINERS | 1 + > tests/qtest/meson.build | 3 +- > tests/qtest/milkv-duo-test.c | 70 ++++++++++++++++++++++++++++++++++++ > 3 files changed, 73 insertions(+), 1 deletion(-) > create mode 100644 tests/qtest/milkv-duo-test.c > > diff --git a/MAINTAINERS b/MAINTAINERS > index e197dcb5b2..472513537f 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -1807,6 +1807,7 @@ F: hw/riscv/milkv_duo.c > F: include/hw/char/dw8250.h > F: include/hw/misc/cv1800b_clk.h > F: include/hw/riscv/cv1800b.h > +F: tests/qtest/milkv-duo-test.c > > RX Machines > ----------- > diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build > index 4897325d84..38acbdc0c8 100644 > --- a/tests/qtest/meson.build > +++ b/tests/qtest/meson.build > @@ -293,7 +293,8 @@ qtests_riscv64 = ['riscv-csr-test'] + \ > (config_all_devices.has_key('CONFIG_IOMMU_TESTDEV') and > config_all_devices.has_key('CONFIG_RISCV_IOMMU') ? > ['iommu-riscv-test'] : []) + \ > - (config_all_devices.has_key('CONFIG_K230') ? ['k230-wdt-test'] : []) > + (config_all_devices.has_key('CONFIG_K230') ? ['k230-wdt-test'] : []) + \ > + ['milkv-duo-test'] > > qos_test_ss = ss.source_set() > qos_test_ss.add( > diff --git a/tests/qtest/milkv-duo-test.c b/tests/qtest/milkv-duo-test.c > new file mode 100644 > index 0000000000..06064b8733 > --- /dev/null > +++ b/tests/qtest/milkv-duo-test.c > @@ -0,0 +1,70 @@ > +/* > + * QTest for Milk-V Duo Board > + * > + * Copyright (c) 2026 Kuan-Wei Chiu <[email protected]> > + * > + * SPDX-License-Identifier: GPL-2.0-or-later > + */ > + > +#include "qemu/osdep.h" > +#include "libqtest.h" > + > +#define CV1800B_CLK_BASE 0x03002000 > +#define CV1800B_CLK_BYPASS 0x030 > +#define CV1800B_CLK_BYPASS_RESET 0xFFFFFFFF > +#define TEST_PATTERN_5A 0x5A5A5A5A > +#define TEST_PATTERN_A5 0xA5A5A5A5 > + > +#define CV1800B_UART0_BASE 0x04140000 > +#define DW_UART_UCV 0xF8 > +#define DW_UART_CTR 0xFC > +#define DW_UART_VERSION_3_23A 0x3332332A > +#define DW_UART_TYPE_SIGNATURE 0x44570110 > + > +static void test_milkv_duo_uart(void) > +{ > + QTestState *qts; > + uint32_t component_version; > + uint32_t component_type; > + > + qts = qtest_init("-M milkv-duo"); > + > + component_version = qtest_readl(qts, CV1800B_UART0_BASE + DW_UART_UCV); > + g_assert_cmphex(component_version, ==, DW_UART_VERSION_3_23A); > + > + component_type = qtest_readl(qts, CV1800B_UART0_BASE + DW_UART_CTR); > + g_assert_cmphex(component_type, ==, DW_UART_TYPE_SIGNATURE); > + > + qtest_quit(qts); > +} > + > +static void test_milkv_duo_clk(void) > +{ > + QTestState *qts; > + uint32_t clk_bypass_val; > + > + qts = qtest_init("-M milkv-duo"); > + > + clk_bypass_val = qtest_readl(qts, CV1800B_CLK_BASE + CV1800B_CLK_BYPASS); > + g_assert_cmphex(clk_bypass_val, ==, CV1800B_CLK_BYPASS_RESET); > + > + qtest_writel(qts, CV1800B_CLK_BASE + CV1800B_CLK_BYPASS, > TEST_PATTERN_5A); > + clk_bypass_val = qtest_readl(qts, CV1800B_CLK_BASE + CV1800B_CLK_BYPASS); > + g_assert_cmphex(clk_bypass_val, ==, TEST_PATTERN_5A); > + > + qtest_writel(qts, CV1800B_CLK_BASE + CV1800B_CLK_BYPASS, > TEST_PATTERN_A5); > + clk_bypass_val = qtest_readl(qts, CV1800B_CLK_BASE + CV1800B_CLK_BYPASS); > + g_assert_cmphex(clk_bypass_val, ==, TEST_PATTERN_A5); > + > + qtest_quit(qts); > +} > + > +int main(int argc, char **argv) > +{ > + g_test_init(&argc, &argv, NULL); > + > + qtest_add_func("/riscv/milkv-duo/uart", test_milkv_duo_uart); > + qtest_add_func("/riscv/milkv-duo/clk", test_milkv_duo_clk);
Thanks for the tests. These are just checking some static values though. Can you also add a boot test? Alistair
