From: Tao Ding <dingtao0430@163.com>
To: qemu-devel@nongnu.org
Cc: qemu-riscv@nongnu.org, pbonzini@redhat.com, palmer@dabbelt.com,
alistair.francis@wdc.com, liwei1518@gmail.com,
daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com,
chao.liu@processmission.com, farosas@suse.de, lvivier@redhat.com,
pierrick.bouvier@oss.qualcomm.com, caojunze424@gmail.com,
Tao Ding <dingtao0430@163.com>
Subject: [PATCH v2 6/7] tests/qtest: add test for K230 decomp gzip
Date: Mon, 27 Jul 2026 23:57:01 +0800 [thread overview]
Message-ID: <20260727155702.36484-7-dingtao0430@163.com> (raw)
In-Reply-To: <20260727155702.36484-1-dingtao0430@163.com>
This commit adds test cases for Decomp_gzip.
A compressed data segment has been pre-set, configure GSDMA and decomp_gzip.
Compare the decompressed data with the original 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-decomp-gzip-test
Signed-off-by: Tao Ding <dingtao0430@163.com>
---
In patchv1, the reviewer pointed out issues with the data.
This is a bug and decomp_gzip only supports dynamic Huffman format.
In this commit, reused the dynamic Huffman method to generate compressed data.
MAINTAINERS | 1 +
tests/qtest/k230-decomp-gzip-test.c | 200 ++++++++++++++++++++++++++++
tests/qtest/meson.build | 2 +-
3 files changed, 202 insertions(+), 1 deletion(-)
create mode 100644 tests/qtest/k230-decomp-gzip-test.c
diff --git a/MAINTAINERS b/MAINTAINERS
index c260199142..dcfcc51144 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1838,6 +1838,7 @@ F: include/hw/misc/k230_decomp_gzip.h
F: tests/functional/riscv64/test_k230.py
F: tests/qtest/k230-wdt-test.c
F: tests/qtest/k230-gsdma-test.c
+F: tests/qtest/k230-decomp-gzip-test.c
RX Machines
-----------
diff --git a/tests/qtest/k230-decomp-gzip-test.c b/tests/qtest/k230-decomp-gzip-test.c
new file mode 100644
index 0000000000..e80113fd28
--- /dev/null
+++ b/tests/qtest/k230-decomp-gzip-test.c
@@ -0,0 +1,200 @@
+/*
+ * QTest testcase for K230 GZIP decompression engine
+ *
+ * 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 "libqtest.h"
+#include "hw/dma/k230_gsdma.h"
+#include "hw/misc/k230_decomp_gzip.h"
+
+#define K230_DECOMP_GZIP_BASE 0x80808000
+#define K230_GSDMA_BASE 0x80800000
+#define K230_SRAM_BASE 0x80200000
+#define TEST_LLT_ADDR0 0x01000000
+#define TEST_LLT_ADDR1 0x01000040
+#define TEST_SRC_ADDR 0x01100000
+#define TEST_DST_ADDR 0x01200000
+
+#define TEST_PAYLOAD_LEN (sizeof(test_payload) - 1)
+
+static inline uint64_t gzip_reg(hwaddr off)
+{
+ return K230_DECOMP_GZIP_BASE + off;
+}
+
+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 inline hwaddr k230_sram_addr(hwaddr off)
+{
+ return K230_SRAM_BASE + off;
+}
+
+static inline hwaddr k230_sram_input_addr(unsigned int slot)
+{
+ return k230_sram_addr(K230_DECOMP_GZIP_SRAM_IN_BASE +
+ slot * K230_DECOMP_GZIP_BLOCK_SIZE);
+}
+
+/*
+ * test_gzip_data was generated by compressing test_payload in gzip format
+ * using Dynamic Huffman coding. The compression method byte in the gzip
+ * header was then changed from the standard value 0x08 to the K230-specific
+ * value 0x09.
+ */
+static const uint8_t test_gzip_data[] = {
+ 0x1f, 0x8b, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x03, 0x05, 0xc1, 0xb1, 0x0d, 0x00, 0x20,
+ 0x08, 0x04, 0xc0, 0x9e, 0x29, 0x7e, 0x04, 0x23,
+ 0x63, 0x38, 0x85, 0x05, 0x21, 0x14, 0x10, 0x23,
+ 0x5f, 0x39, 0xbd, 0x77, 0x6b, 0xea, 0x80, 0xbf,
+ 0x38, 0x68, 0x5e, 0xdb, 0x19, 0xe5, 0xa0, 0x35,
+ 0x65, 0x4d, 0x1d, 0xf0, 0x17, 0x07, 0xcd, 0x6b,
+ 0x3b, 0xa3, 0x1c, 0xb4, 0xa6, 0xac, 0xa9, 0x03,
+ 0xfe, 0xe2, 0xa0, 0x79, 0x6d, 0x67, 0x94, 0x83,
+ 0xd6, 0x94, 0x35, 0x75, 0xc0, 0x5f, 0x1c, 0x34,
+ 0xaf, 0xed, 0x8c, 0x72, 0xd0, 0x9a, 0xb2, 0xa6,
+ 0x0e, 0xf8, 0x8b, 0x83, 0xe6, 0xb5, 0x9d, 0x51,
+ 0x0e, 0x5a, 0x53, 0xd6, 0xd4, 0x01, 0x7f, 0x71,
+ 0xd0, 0xbc, 0xb6, 0x33, 0xca, 0x41, 0x6b, 0xca,
+ 0x9a, 0x3a, 0xe0, 0x2f, 0x0e, 0x9a, 0xd7, 0x76,
+ 0x46, 0x39, 0x68, 0x4d, 0x59, 0x53, 0x07, 0xfc,
+ 0xc5, 0x41, 0xf3, 0xda, 0xce, 0x28, 0x07, 0xad,
+ 0x29, 0x1f, 0xdb, 0x9d, 0xbc, 0xdd, 0xc8, 0x00,
+ 0x00, 0x00,
+};
+
+static const uint8_t test_payload[] =
+ "K230 gzip streaming test\n"
+ "K230 gzip streaming test\n"
+ "K230 gzip streaming test\n"
+ "K230 gzip streaming test\n"
+ "K230 gzip streaming test\n"
+ "K230 gzip streaming test\n"
+ "K230 gzip streaming test\n"
+ "K230 gzip streaming test\n";
+
+static void write_sdma_llt_node(QTestState *qts, hwaddr addr, uint32_t src,
+ uint32_t dst, uint32_t len, uint32_t next)
+{
+ qtest_writel(qts, addr + offsetof(K230GSDMALLT, cfg), 0);
+ qtest_writel(qts, addr + offsetof(K230GSDMALLT, src_addr), src);
+ qtest_writel(qts, addr + offsetof(K230GSDMALLT, line_size), len);
+ 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 test_reset_and_rw(void)
+{
+ QTestState *qts = qtest_init("-machine k230");
+
+ g_assert_cmphex(qtest_readl(qts, gzip_reg(K230_DECOMP_GZIP_DECOMP_START)),
+ ==, 0);
+ g_assert_cmphex(qtest_readl(qts, gzip_reg(K230_DECOMP_GZIP_GZIP_SRC_SIZE)),
+ ==, 0);
+ g_assert_cmphex(qtest_readl(qts, gzip_reg(K230_DECOMP_GZIP_GZIP_OUT_SIZE)),
+ ==, 0);
+ g_assert_cmphex(qtest_readl(qts, gzip_reg(K230_DECOMP_GZIP_DECOMP_STAT)),
+ ==, 0);
+
+ qtest_writel(qts, gzip_reg(K230_DECOMP_GZIP_DECOMP_START),
+ K230_DECOMP_GZIP_START);
+
+ qtest_writel(qts, gzip_reg(K230_DECOMP_GZIP_GZIP_SRC_SIZE), 0xffffffff);
+ g_assert_cmphex(qtest_readl(qts, gzip_reg(K230_DECOMP_GZIP_GZIP_SRC_SIZE)),
+ ==, 0xffffffff);
+
+ qtest_writel(qts, gzip_reg(K230_DECOMP_GZIP_GZIP_OUT_SIZE), 0x12345678);
+ g_assert_cmphex(qtest_readl(qts, gzip_reg(K230_DECOMP_GZIP_GZIP_OUT_SIZE)),
+ ==, 0x12345678);
+
+ qtest_quit(qts);
+}
+
+static void test_gsdma_handshake_flow(void)
+{
+ QTestState *qts = qtest_init("-machine k230");
+ uint32_t stat;
+ uint8_t output[TEST_PAYLOAD_LEN];
+
+ qtest_memwrite(qts, TEST_SRC_ADDR, test_gzip_data, sizeof(test_gzip_data));
+ write_sdma_llt_node(qts, TEST_LLT_ADDR0, TEST_SRC_ADDR,
+ k230_sram_input_addr(0),
+ sizeof(test_gzip_data), 0);
+ write_sdma_llt_node(qts, TEST_LLT_ADDR1,
+ k230_sram_addr(K230_DECOMP_GZIP_SRAM_OUT_BASE),
+ TEST_DST_ADDR, TEST_PAYLOAD_LEN, 0);
+
+ qtest_writel(qts, gsdma_reg(K230_GSDMA_DMA_CH_EN), BIT(0) | BIT(1));
+ qtest_writel(qts, gsdma_ch_reg(0, K230_GSDMA_CH_CFG),
+ K230_GSDMA_CH0_CFG_DECOMP_CTRL_EN);
+ qtest_writel(qts, gsdma_ch_reg(1, K230_GSDMA_CH_CFG), 0);
+ qtest_writel(qts, gsdma_ch_reg(0, K230_GSDMA_CH_LLT_SADDR), TEST_LLT_ADDR0);
+ qtest_writel(qts, gsdma_ch_reg(1, K230_GSDMA_CH_LLT_SADDR), TEST_LLT_ADDR1);
+ qtest_writel(qts, gsdma_ch_reg(0, K230_GSDMA_CH_CTL), K230_GSDMA_CTL_START);
+ qtest_writel(qts, gsdma_ch_reg(1, K230_GSDMA_CH_CTL), K230_GSDMA_CTL_START);
+
+ g_assert_cmphex(qtest_readl(qts, gsdma_reg(K230_GSDMA_DMA_CH_EN)),
+ ==, BIT(0) | BIT(1));
+ g_assert_cmphex(qtest_readl(qts, gsdma_ch_reg(0, K230_GSDMA_CH_CFG)) &
+ K230_GSDMA_CH0_CFG_DECOMP_CTRL_EN,
+ ==, K230_GSDMA_CH0_CFG_DECOMP_CTRL_EN);
+ g_assert_cmphex(qtest_readl(qts, gsdma_ch_reg(0, K230_GSDMA_CH_LLT_SADDR)),
+ ==, TEST_LLT_ADDR0);
+ g_assert_cmphex(qtest_readl(qts, gsdma_ch_reg(1, K230_GSDMA_CH_LLT_SADDR)),
+ ==, TEST_LLT_ADDR1);
+
+ qtest_writel(qts, gzip_reg(K230_DECOMP_GZIP_GZIP_SRC_SIZE),
+ K230_DECOMP_GZIP_CTRL_EN | sizeof(test_gzip_data));
+ qtest_writel(qts, gzip_reg(K230_DECOMP_GZIP_GZIP_OUT_SIZE),
+ TEST_PAYLOAD_LEN);
+ qtest_writel(qts, gzip_reg(K230_DECOMP_GZIP_DECOMP_START),
+ K230_DECOMP_GZIP_START);
+
+ stat = qtest_readl(qts, gzip_reg(K230_DECOMP_GZIP_DECOMP_STAT));
+ g_assert_cmphex(stat & K230_DECOMP_GZIP_STAT_CRC_OK, ==,
+ K230_DECOMP_GZIP_STAT_CRC_OK);
+
+ g_assert_cmphex(qtest_readl(qts,
+ gsdma_ch_reg(0, K230_GSDMA_CH_CURRENT_LLT)),
+ ==, TEST_LLT_ADDR0);
+ g_assert_cmphex(qtest_readl(qts,
+ gsdma_ch_reg(1, K230_GSDMA_CH_CURRENT_LLT)),
+ ==, TEST_LLT_ADDR1);
+
+ stat = qtest_readl(qts, gsdma_reg(K230_GSDMA_DMA_INT_STAT));
+ g_assert_cmphex(stat & K230_GSDMA_SDMA_DONE_INT(0), ==,
+ K230_GSDMA_SDMA_DONE_INT(0));
+ g_assert_cmphex(stat & K230_GSDMA_SDMA_DONE_INT(1), ==,
+ K230_GSDMA_SDMA_DONE_INT(1));
+
+ qtest_memread(qts, TEST_DST_ADDR, output, sizeof(output));
+ g_assert_cmpmem(output, sizeof(output), test_payload, TEST_PAYLOAD_LEN);
+
+ qtest_quit(qts);
+}
+
+int main(int argc, char **argv)
+{
+ g_test_init(&argc, &argv, NULL);
+
+ qtest_add_func("/k230-decomp-gzip/reset-and-rw", test_reset_and_rw);
+ qtest_add_func("/k230-decomp-gzip/gsdma-handshake-flow",
+ test_gsdma_handshake_flow);
+
+ return g_test_run();
+}
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 1b13a777c9..7da12421af 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', 'k230-gsdma-test'] : [])
+ (config_all_devices.has_key('CONFIG_K230') ? ['k230-wdt-test', 'k230-gsdma-test', 'k230-decomp-gzip-test'] : [])
qtests_hexagon = ['boot-serial-test']
--
2.43.0
next prev parent reply other threads:[~2026-07-27 16:03 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
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 ` Tao Ding [this message]
2026-08-06 12:14 ` [PATCH v2 6/7] tests/qtest: add test for K230 decomp gzip 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=20260727155702.36484-7-dingtao0430@163.com \
--to=dingtao0430@163.com \
--cc=alistair.francis@wdc.com \
--cc=caojunze424@gmail.com \
--cc=chao.liu@processmission.com \
--cc=daniel.barboza@oss.qualcomm.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.