All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com>
To: Tao Ding <dingtao0430@163.com>, qemu-devel@nongnu.org
Cc: qemu-riscv@nongnu.org, pbonzini@redhat.com, palmer@dabbelt.com,
	alistair.francis@wdc.com, liwei1518@gmail.com,
	zhiwei_liu@linux.alibaba.com, chao.liu@processmission.com,
	farosas@suse.de, lvivier@redhat.com,
	pierrick.bouvier@oss.qualcomm.com, caojunze424@gmail.com
Subject: Re: [PATCH v2 3/7] tests/qtest: add test for K230 gsdma
Date: Thu, 6 Aug 2026 08:36:08 -0300	[thread overview]
Message-ID: <197c1e99-ba1e-47bf-aa93-ecb893ae6534@oss.qualcomm.com> (raw)
In-Reply-To: <20260727155702.36484-4-dingtao0430@163.com>



On 7/27/2026 12:56 PM, Tao Ding wrote:
> This commit adds test cases for GSDMA.
> Imitate the behavior of the driver, set LLT and sdma registers.
> After the data transmission is completed, check the destination address data.
> 
> Update MAINTAINERS for this test.
> 
> Run this qtest:
>      $ mkdir build && cd build && ../configure --target-list="riscv64-softmmu"
>      $ QTEST_QEMU_BINARY=./qemu-system-riscv64   tests/qtest/k230-gsdma-test
> 
> Signed-off-by: Tao Ding <dingtao0430@163.com>
> ---

Reviewed-by: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com>

>   MAINTAINERS                   |   1 +
>   tests/qtest/k230-gsdma-test.c | 201 ++++++++++++++++++++++++++++++++++
>   tests/qtest/meson.build       |   2 +-
>   3 files changed, 203 insertions(+), 1 deletion(-)
>   create mode 100644 tests/qtest/k230-gsdma-test.c
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 49c8013d5f..9c546596e7 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -1835,6 +1835,7 @@ F: include/hw/watchdog/k230_wdt.h
>   F: include/hw/dma/k230_gsdma.h
>   F: tests/functional/riscv64/test_k230.py
>   F: tests/qtest/k230-wdt-test.c
> +F: tests/qtest/k230-gsdma-test.c
>   
>   RX Machines
>   -----------
> diff --git a/tests/qtest/k230-gsdma-test.c b/tests/qtest/k230-gsdma-test.c
> new file mode 100644
> index 0000000000..44d4248739
> --- /dev/null
> +++ b/tests/qtest/k230-gsdma-test.c
> @@ -0,0 +1,201 @@
> +/*
> + * QTest testcase for K230 GSDMA
> + *
> + * Copyright (c) 2026 Tao Ding <dingtao0430@163.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qemu/bitops.h"
> +#include "exec/hwaddr.h"
> +#include "hw/dma/k230_gsdma.h"
> +#include "libqtest.h"
> +
> +#define K230_GSDMA_BASE              0x80800000
> +#define TEST_LLT_ADDR0               0x10000
> +#define TEST_LLT_ADDR1               0x10040
> +#define TEST_LLT_ADDR2               0x10080
> +
> +#define TEST_SRC_ADDR0               0x20000
> +#define TEST_SRC_ADDR1               0x22000
> +#define TEST_SRC_ADDR2               0x23000
> +#define TEST_DST_ADDR0               0x30000
> +#define TEST_DST_ADDR1               0x32000
> +#define TEST_DST_ADDR2               0x33000
> +
> +static inline uint64_t gsdma_reg(hwaddr off)
> +{
> +    return K230_GSDMA_BASE + off;
> +}
> +
> +static inline uint64_t gsdma_ch_reg(unsigned int ch, hwaddr off)
> +{
> +    return K230_GSDMA_BASE + K230_GSDMA_CH_BASE +
> +           ch * K230_GSDMA_CH_STRIDE + off;
> +}
> +
> +static void write_sdma_llt_node_full(QTestState *qts, hwaddr addr,
> +                                     uint32_t cfg, hwaddr src,
> +                                     uint32_t size, hwaddr dst,
> +                                     hwaddr next)
> +{
> +    qtest_writel(qts, addr + offsetof(K230GSDMALLT, cfg), cfg);
> +    qtest_writel(qts, addr + offsetof(K230GSDMALLT, src_addr), src);
> +    qtest_writel(qts, addr + offsetof(K230GSDMALLT, line_size), size);
> +    qtest_writel(qts, addr + offsetof(K230GSDMALLT, line_cfg), 0x1);
> +    qtest_writel(qts, addr + offsetof(K230GSDMALLT, dst_addr), dst);
> +    qtest_writel(qts, addr + offsetof(K230GSDMALLT, next_llt_addr), next);
> +}
> +
> +static void write_sdma_llt_node(QTestState *qts, hwaddr addr, uint32_t cfg,
> +                                uint32_t next)
> +{
> +    write_sdma_llt_node_full(qts, addr, cfg, 0x11110000, 0x200,
> +                             0x22220000, next);
> +}
> +
> +static void fill_pattern(uint8_t *buf, size_t size, uint8_t seed)
> +{
> +    for (size_t i = 0; i < size; i++) {
> +        buf[i] = seed + i * 37;
> +    }
> +}
> +
> +static void test_global_registers(void)
> +{
> +    QTestState *qts = qtest_init("-machine k230");
> +
> +    g_assert_cmphex(qtest_readl(qts, gsdma_reg(K230_GSDMA_DMA_CFG)), ==,
> +                    K230_GSDMA_DMA_CFG_RESET);
> +
> +    qtest_writel(qts, gsdma_reg(K230_GSDMA_DMA_CH_EN), 0xff);
> +    g_assert_cmphex(qtest_readl(qts, gsdma_reg(K230_GSDMA_DMA_CH_EN)), ==,
> +                    K230_GSDMA_DMA_CH_EN_MASK);
> +
> +    qtest_writel(qts, gsdma_reg(K230_GSDMA_DMA_INT_MASK), 0x12345);
> +    g_assert_cmphex(qtest_readl(qts, gsdma_reg(K230_GSDMA_DMA_INT_MASK)), ==,
> +                    0x12345);
> +
> +    qtest_writel(qts, gsdma_reg(K230_GSDMA_DMA_CFG), 0xa5a5a5a5);
> +    g_assert_cmphex(qtest_readl(qts, gsdma_reg(K230_GSDMA_DMA_CFG)), ==,
> +                    0xa5a5a5a5);
> +
> +    qtest_writel(qts, gsdma_reg(K230_GSDMA_DMA_WEIGHT), 0xff55aa55);
> +    g_assert_cmphex(qtest_readl(qts, gsdma_reg(K230_GSDMA_DMA_WEIGHT)), ==,
> +                    0x55aa55);
> +
> +    qtest_quit(qts);
> +}
> +
> +static void test_sdma_pause_resume(void)
> +{
> +    uint32_t int_stat;
> +    QTestState *qts = qtest_init("-machine k230");
> +
> +    write_sdma_llt_node(qts, TEST_LLT_ADDR0, K230_GSDMA_LLT_PAUSE,
> +                        TEST_LLT_ADDR1);
> +    write_sdma_llt_node(qts, TEST_LLT_ADDR1, K230_GSDMA_LLT_NODE_INTR, 0);
> +
> +    qtest_writel(qts, gsdma_reg(K230_GSDMA_DMA_CH_EN), BIT(0));
> +    qtest_writel(qts, gsdma_ch_reg(0, K230_GSDMA_CH_LLT_SADDR), TEST_LLT_ADDR0);
> +    qtest_writel(qts, gsdma_ch_reg(0, K230_GSDMA_CH_CTL), K230_GSDMA_CTL_START);
> +
> +    g_assert_cmphex(qtest_readl(qts, gsdma_ch_reg(0, K230_GSDMA_CH_STATUS)), ==,
> +                    K230_GSDMA_SDMA_STATUS_PAUSE);
> +    g_assert_cmphex(qtest_readl(qts, gsdma_ch_reg(0, K230_GSDMA_CH_CURRENT_LLT)),
> +                    ==, TEST_LLT_ADDR0);
> +
> +    int_stat = qtest_readl(qts, gsdma_reg(K230_GSDMA_DMA_INT_STAT));
> +    g_assert_cmphex(int_stat & K230_GSDMA_SDMA_PAUSE_INT(0), ==,
> +                    K230_GSDMA_SDMA_PAUSE_INT(0));
> +    g_assert_cmphex(int_stat & K230_GSDMA_SDMA_DONE_INT(0), ==, 0);
> +
> +    qtest_writel(qts, gsdma_reg(K230_GSDMA_DMA_INT_STAT), int_stat);
> +    qtest_writel(qts, gsdma_ch_reg(0, K230_GSDMA_CH_CTL), K230_GSDMA_CTL_RESUME);
> +
> +    g_assert_cmphex(qtest_readl(qts, gsdma_ch_reg(0, K230_GSDMA_CH_STATUS)), ==,
> +                    0);
> +    g_assert_cmphex(qtest_readl(qts, gsdma_ch_reg(0, K230_GSDMA_CH_CURRENT_LLT)),
> +                    ==, TEST_LLT_ADDR1);
> +
> +    int_stat = qtest_readl(qts, gsdma_reg(K230_GSDMA_DMA_INT_STAT));
> +    g_assert_cmphex(int_stat & K230_GSDMA_SDMA_DONE_INT(0), ==,
> +                    K230_GSDMA_SDMA_DONE_INT(0));
> +    g_assert_cmphex(int_stat & K230_GSDMA_SDMA_ITEM_INT(0), ==,
> +                    K230_GSDMA_SDMA_ITEM_INT(0));
> +
> +    qtest_quit(qts);
> +}
> +
> +static void test_sdma_three_llt_copy(void)
> +{
> +    uint8_t src0[0x1000];
> +    uint8_t src1[1];
> +    uint8_t src2[511];
> +    uint8_t dst0[sizeof(src0)];
> +    uint8_t dst1[sizeof(src1)];
> +    uint8_t dst2[sizeof(src2)];
> +    uint32_t int_stat;
> +    QTestState *qts = qtest_init("-machine k230");
> +
> +    fill_pattern(src0, sizeof(src0), 0x10);
> +    fill_pattern(src1, sizeof(src1), 0x31);
> +    fill_pattern(src2, sizeof(src2), 0x52);
> +    memset(dst0, 0xa5, sizeof(dst0));
> +    memset(dst1, 0xa5, sizeof(dst1));
> +    memset(dst2, 0xa5, sizeof(dst2));
> +
> +    qtest_memwrite(qts, TEST_SRC_ADDR0, src0, sizeof(src0));
> +    qtest_memwrite(qts, TEST_SRC_ADDR1, src1, sizeof(src1));
> +    qtest_memwrite(qts, TEST_SRC_ADDR2, src2, sizeof(src2));
> +    qtest_memwrite(qts, TEST_DST_ADDR0, dst0, sizeof(dst0));
> +    qtest_memwrite(qts, TEST_DST_ADDR1, dst1, sizeof(dst1));
> +    qtest_memwrite(qts, TEST_DST_ADDR2, dst2, sizeof(dst2));
> +
> +    write_sdma_llt_node_full(qts, TEST_LLT_ADDR0, 0, TEST_SRC_ADDR0,
> +                             sizeof(src0), TEST_DST_ADDR0, TEST_LLT_ADDR1);
> +    write_sdma_llt_node_full(qts, TEST_LLT_ADDR1, 0, TEST_SRC_ADDR1,
> +                             sizeof(src1), TEST_DST_ADDR1, TEST_LLT_ADDR2);
> +    write_sdma_llt_node_full(qts, TEST_LLT_ADDR2, 0, TEST_SRC_ADDR2,
> +                             sizeof(src2), TEST_DST_ADDR2, 0);
> +
> +    qtest_writel(qts, gsdma_reg(K230_GSDMA_DMA_CH_EN), BIT(0));
> +    qtest_writel(qts, gsdma_ch_reg(0, K230_GSDMA_CH_LLT_SADDR), TEST_LLT_ADDR0);
> +    qtest_writel(qts, gsdma_ch_reg(0, K230_GSDMA_CH_CTL), K230_GSDMA_CTL_START);
> +
> +    g_assert_cmphex(qtest_readl(qts, gsdma_ch_reg(0, K230_GSDMA_CH_STATUS)), ==,
> +                    0);
> +    g_assert_cmphex(qtest_readl(qts, gsdma_ch_reg(0, K230_GSDMA_CH_CURRENT_LLT)),
> +                    ==, TEST_LLT_ADDR2);
> +
> +    int_stat = qtest_readl(qts, gsdma_reg(K230_GSDMA_DMA_INT_STAT));
> +    g_assert_cmphex(int_stat & K230_GSDMA_SDMA_DONE_INT(0), ==,
> +                    K230_GSDMA_SDMA_DONE_INT(0));
> +    g_assert_cmphex(int_stat & K230_GSDMA_SDMA_PAUSE_INT(0), ==, 0);
> +
> +    memset(dst0, 0, sizeof(dst0));
> +    memset(dst1, 0, sizeof(dst1));
> +    memset(dst2, 0, sizeof(dst2));
> +    qtest_memread(qts, TEST_DST_ADDR0, dst0, sizeof(dst0));
> +    qtest_memread(qts, TEST_DST_ADDR1, dst1, sizeof(dst1));
> +    qtest_memread(qts, TEST_DST_ADDR2, dst2, sizeof(dst2));
> +
> +    g_assert_cmpmem(dst0, sizeof(dst0), src0, sizeof(src0));
> +    g_assert_cmpmem(dst1, sizeof(dst1), src1, sizeof(src1));
> +    g_assert_cmpmem(dst2, sizeof(dst2), src2, sizeof(src2));
> +
> +    qtest_quit(qts);
> +}
> +
> +int main(int argc, char **argv)
> +{
> +    g_test_init(&argc, &argv, NULL);
> +
> +    qtest_add_func("/k230-gsdma/global-registers", test_global_registers);
> +    qtest_add_func("/k230-gsdma/sdma-pause-resume", test_sdma_pause_resume);
> +    qtest_add_func("/k230-gsdma/sdma-three-llt-copy",
> +                   test_sdma_three_llt_copy);
> +
> +    return g_test_run();
> +}
> diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
> index 56ff860e21..1b13a777c9 100644
> --- a/tests/qtest/meson.build
> +++ b/tests/qtest/meson.build
> @@ -297,7 +297,7 @@ 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', 'k230-gsdma-test'] : [])
>   
>   qtests_hexagon = ['boot-serial-test']
>   



  reply	other threads:[~2026-08-06 11:36 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-27 15:56 [PATCH v2 0/7] K230: add gsdma and decomp_gzip Tao Ding
2026-07-27 15:56 ` [PATCH v2 1/7] hw/dma: add K230 gsdma Tao Ding
2026-08-06 11:34   ` Daniel Henrique Barboza
2026-08-07  4:46   ` Chao Liu
2026-07-27 15:56 ` [PATCH v2 2/7] hw/riscv: k230: add gsdma in K230 board Tao Ding
2026-08-06 11:34   ` Daniel Henrique Barboza
2026-07-27 15:56 ` [PATCH v2 3/7] tests/qtest: add test for K230 gsdma Tao Ding
2026-08-06 11:36   ` Daniel Henrique Barboza [this message]
2026-07-27 15:56 ` [PATCH v2 4/7] hw/misc: add K230 decomp gzip Tao Ding
2026-08-06 11:47   ` Daniel Henrique Barboza
2026-07-27 15:57 ` [PATCH v2 5/7] hw/riscv: k230: add decomp gzip in K230 board Tao Ding
2026-08-06 11:48   ` Daniel Henrique Barboza
2026-07-27 15:57 ` [PATCH v2 6/7] tests/qtest: add test for K230 decomp gzip Tao Ding
2026-08-06 12:14   ` Daniel Henrique Barboza
2026-07-27 15:57 ` [PATCH v2 7/7] hw/riscv: k230: add a noc stub region in K230 board Tao Ding
2026-08-06 12:15   ` Daniel Henrique Barboza

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=197c1e99-ba1e-47bf-aa93-ecb893ae6534@oss.qualcomm.com \
    --to=daniel.barboza@oss.qualcomm.com \
    --cc=alistair.francis@wdc.com \
    --cc=caojunze424@gmail.com \
    --cc=chao.liu@processmission.com \
    --cc=dingtao0430@163.com \
    --cc=farosas@suse.de \
    --cc=liwei1518@gmail.com \
    --cc=lvivier@redhat.com \
    --cc=palmer@dabbelt.com \
    --cc=pbonzini@redhat.com \
    --cc=pierrick.bouvier@oss.qualcomm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-riscv@nongnu.org \
    --cc=zhiwei_liu@linux.alibaba.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.