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

Reply via email to