From 4c2e3dc57b99d2a17ea5f2799ab01c6924e630ae Mon Sep 17 00:00:00 2001 From: Simon Xue Date: Tue, 25 Feb 2025 11:59:02 +0800 Subject: [PATCH] soc: rockchip: decompress: add start_decom node for test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Take RK3588 as an example to show how to test decompress: echo mode > /sys/devices/platform/fea80000.decompress/start_decom “mode” means the compressed package format has following three types: 0 - LZ4 1 - GZIP 2 - ZLIB Change-Id: Ibd264dcce964c142abb603c1a5e8ca4c14e9fe1e Signed-off-by: Simon Xue --- drivers/soc/rockchip/Kconfig | 6 +++ drivers/soc/rockchip/rockchip_decompress.c | 55 ++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/drivers/soc/rockchip/Kconfig b/drivers/soc/rockchip/Kconfig index 936f52e0e682..aa94a31a8d5e 100644 --- a/drivers/soc/rockchip/Kconfig +++ b/drivers/soc/rockchip/Kconfig @@ -72,6 +72,12 @@ config ROCKCHIP_HW_DECOMPRESS This driver support Decompress IP built-in Rockchip SoC, support LZ4, GZIP, ZLIB. +config ROCKCHIP_HW_DECOMPRESS_TEST + bool "Rockchip Hw-Decompress test" + depends on ROCKCHIP_HW_DECOMPRESS + help + Say yes here to enable decompress test + config ROCKCHIP_HW_DECOMPRESS_USER tristate "Rockchip HardWare Decompress User Interface Support" default n diff --git a/drivers/soc/rockchip/rockchip_decompress.c b/drivers/soc/rockchip/rockchip_decompress.c index afabee1f66d9..7494ea2ceef7 100644 --- a/drivers/soc/rockchip/rockchip_decompress.c +++ b/drivers/soc/rockchip/rockchip_decompress.c @@ -244,7 +244,9 @@ static irqreturn_t rk_decom_irq_handler(int irq, void *priv) g_decom_noblocking = false; wake_up(&g_decom_wait); } else { +#ifndef CONFIG_ROCKCHIP_HW_DECOMPRESS_TEST writel(DECOM_ENABLE, rk_dec->regs + DECOM_ENR); +#endif } } } @@ -254,6 +256,7 @@ static irqreturn_t rk_decom_irq_handler(int irq, void *priv) static irqreturn_t rk_decom_irq_thread(int irq, void *priv) { +#ifndef CONFIG_ROCKCHIP_HW_DECOMPRESS_TEST struct rk_decom *rk_dec = priv; if (g_decom_complete) { @@ -273,9 +276,54 @@ static irqreturn_t rk_decom_irq_thread(int irq, void *priv) clk_bulk_disable_unprepare(rk_dec->num_clocks, rk_dec->clocks); } +#endif return IRQ_HANDLED; } +#ifdef CONFIG_ROCKCHIP_HW_DECOMPRESS_TEST +static ssize_t start_decom_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + u32 mode = 0; + phys_addr_t src, dst; + int ret; + struct rk_decom *rk_dec = dev_get_drvdata(dev); + + src = rk_dec->mem_start; + dst = rk_dec->mem_start + rk_dec->mem_size / 2; + + if (src == 0x0 || dst == 0x0) + return -EINVAL; + + ret = kstrtou32(buf, 10, &mode); + if (ret) + return ret; + + if (mode != LZ4_MOD && mode != GZIP_MOD && mode != ZLIB_MOD) + return -EINVAL; + + dev_info(dev, "%s,%d, src = %pa, dst = %pa, mode = %d\n", + __func__, __LINE__, &src, &dst, mode); + + ret = rk_decom_start(mode, src, dst, 0x80000000); + if (ret) + pr_info("%s, user decompress error\n", __func__); + + return size; +} + +static DEVICE_ATTR_WO(start_decom); +static struct attribute *decom_attrs[] = { + &dev_attr_start_decom.attr, + NULL +}; + +static const struct attribute_group decom_attr_group = { + .attrs = decom_attrs, +}; +#endif + static int __init rockchip_decom_probe(struct platform_device *pdev) { struct rk_decom *rk_dec; @@ -346,6 +394,13 @@ static int __init rockchip_decom_probe(struct platform_device *pdev) goto disable_clk; } +#ifdef CONFIG_ROCKCHIP_HW_DECOMPRESS_TEST + ret = sysfs_create_group(&pdev->dev.kobj, &decom_attr_group); + if (ret) { + dev_err(dev, "SysFS group creation failed\n"); + return ret; + } +#endif g_decom = rk_dec; wake_up(&decom_init_done);