Re: [PATCH 1/4] crypto: hisilicon/zip - Remove driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Herbert,

It's a pity to see that there is no user in the kernel of zlib-deflate. However, there may still be hidden users in the current kernel who may be using the zlib-deflate algorithm. Such as zswap, it can use user-specified algorithm. So there are still some benefits to be gained from zlib hardware.

What's more, hisilicon zip driver also does other work besides supporting the zlib-deflate:
1.Support gzip algorithm.
2.Support a user space cdev hisi-zip which can accelerate user space process via uacce subsystem. So if the zlib-deflate must be removed, the hisilicon zip driver should only remove the zlib-deflate registration.

Thanks,
Yang

在 2023/8/30 18:08, Herbert Xu 写道:
Remove the hisilicon zip driver as it only contains algorithms that
nobody uses in the kernel.

Signed-off-by: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
---

  Documentation/ABI/testing/debugfs-hisi-zip |  138 --
  MAINTAINERS                                |    8
  drivers/crypto/hisilicon/Kconfig           |   11
  drivers/crypto/hisilicon/Makefile          |    1
  drivers/crypto/hisilicon/zip/Makefile      |    2
  drivers/crypto/hisilicon/zip/zip.h         |   88 -
  drivers/crypto/hisilicon/zip/zip_crypto.c  |  839 -----------------
  drivers/crypto/hisilicon/zip/zip_main.c    | 1357 -----------------------------
  8 files changed, 2444 deletions(-)

diff --git a/Documentation/ABI/testing/debugfs-hisi-zip b/Documentation/ABI/testing/debugfs-hisi-zip
deleted file mode 100644
index fd3f314cf8d1..000000000000
--- a/Documentation/ABI/testing/debugfs-hisi-zip
+++ /dev/null
@@ -1,138 +0,0 @@
-What:		/sys/kernel/debug/hisi_zip/<bdf>/comp_core[01]/regs
-Date:		Nov 2018
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Dump of compression cores related debug registers.
-		Only available for PF.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/decomp_core[0-5]/regs
-Date:		Nov 2018
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Dump of decompression cores related debug registers.
-		Only available for PF.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/clear_enable
-Date:		Nov 2018
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Compression/decompression core debug registers read clear
-		control. 1 means enable register read clear, otherwise 0.
-		Writing to this file has no functional effect, only enable or
-		disable counters clear after reading of these registers.
-		Only available for PF.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/current_qm
-Date:		Nov 2018
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	One ZIP controller has one PF and multiple VFs, each function
-		has a QM. Select the QM which below qm refers to.
-		Only available for PF.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/alg_qos
-Date:		Jun 2021
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	The <bdf> is related the function for PF and VF.
-		ZIP driver supports to configure each function's QoS, the driver
-		supports to write <bdf> value to alg_qos in the host. Such as
-		"echo <bdf> value > alg_qos". The qos value is 1~1000, means
-		1/1000~1000/1000 of total QoS. The driver reading alg_qos to
-		get related QoS in the host and VM, Such as "cat alg_qos".
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/qm/regs
-Date:		Nov 2018
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Dump of QM related debug registers.
-		Available for PF and VF in host. VF in guest currently only
-		has one debug register.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/qm/current_q
-Date:		Nov 2018
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	One QM may contain multiple queues. Select specific queue to
-		show its debug registers in above regs.
-		Only available for PF.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/qm/clear_enable
-Date:		Nov 2018
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	QM debug registers(regs) read clear control. 1 means enable
-		register read clear, otherwise 0.
-		Writing to this file has no functional effect, only enable or
-		disable counters clear after reading of these registers.
-		Only available for PF.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/qm/err_irq
-Date:		Apr 2020
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Dump the number of invalid interrupts for
-		QM task completion.
-		Available for both PF and VF, and take no other effect on ZIP.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/qm/aeq_irq
-Date:		Apr 2020
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Dump the number of QM async event queue interrupts.
-		Available for both PF and VF, and take no other effect on ZIP.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/qm/abnormal_irq
-Date:		Apr 2020
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Dump the number of interrupts for QM abnormal event.
-		Available for both PF and VF, and take no other effect on ZIP.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/qm/create_qp_err
-Date:		Apr 2020
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Dump the number of queue allocation errors.
-		Available for both PF and VF, and take no other effect on ZIP.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/qm/mb_err
-Date:		Apr 2020
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Dump the number of failed QM mailbox commands.
-		Available for both PF and VF, and take no other effect on ZIP.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/qm/status
-Date:		Apr 2020
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Dump the status of the QM.
-		Four states: initiated, started, stopped and closed.
-		Available for both PF and VF, and take no other effect on ZIP.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/qm/diff_regs
-Date:		Mar 2022
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	QM debug registers(regs) read hardware register value. This
-		node is used to show the change of the qm registers value. This
-		node can be help users to check the change of register values.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/zip_dfx/diff_regs
-Date:		Mar 2022
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	ZIP debug registers(regs) read hardware register value. This
-		node is used to show the change of the registers value. this
-		node can be help users to check the change of register values.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/zip_dfx/send_cnt
-Date:		Apr 2020
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Dump the total number of sent requests.
-		Available for both PF and VF, and take no other effect on ZIP.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/zip_dfx/recv_cnt
-Date:		Apr 2020
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Dump the total number of received requests.
-		Available for both PF and VF, and take no other effect on ZIP.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/zip_dfx/send_busy_cnt
-Date:		Apr 2020
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Dump the total number of requests received
-		with returning busy.
-		Available for both PF and VF, and take no other effect on ZIP.
-
-What:		/sys/kernel/debug/hisi_zip/<bdf>/zip_dfx/err_bd_cnt
-Date:		Apr 2020
-Contact:	linux-crypto@xxxxxxxxxxxxxxx
-Description:	Dump the total number of BD type error requests
-		to be received.
-		Available for both PF and VF, and take no other effect on ZIP.
diff --git a/MAINTAINERS b/MAINTAINERS
index 64602d4169d0..c2872aeac0d2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9433,14 +9433,6 @@ S:	Maintained
  W:	http://www.hisilicon.com
  F:	drivers/spi/spi-hisi-sfc-v3xx.c
-HISILICON ZIP Controller DRIVER
-M:	Yang Shen <shenyang39@xxxxxxxxxx>
-M:	Zhou Wang <wangzhou1@xxxxxxxxxxxxx>
-L:	linux-crypto@xxxxxxxxxxxxxxx
-S:	Maintained
-F:	Documentation/ABI/testing/debugfs-hisi-zip
-F:	drivers/crypto/hisilicon/zip/
-
  HMM - Heterogeneous Memory Management
  M:	Jérôme Glisse <jglisse@xxxxxxxxxx>
  L:	linux-mm@xxxxxxxxx
diff --git a/drivers/crypto/hisilicon/Kconfig b/drivers/crypto/hisilicon/Kconfig
index 4137a8bf131f..a4ad616ce3e1 100644
--- a/drivers/crypto/hisilicon/Kconfig
+++ b/drivers/crypto/hisilicon/Kconfig
@@ -49,17 +49,6 @@ config CRYPTO_DEV_HISI_QM
  	  HiSilicon accelerator engines use a common queue management
  	  interface. Specific engine driver may use this module.
-config CRYPTO_DEV_HISI_ZIP
-	tristate "Support for HiSilicon ZIP accelerator"
-	depends on PCI_MSI
-	depends on ARM64 || (COMPILE_TEST && 64BIT)
-	depends on !CPU_BIG_ENDIAN || COMPILE_TEST
-	depends on UACCE || UACCE=n
-	depends on ACPI
-	select CRYPTO_DEV_HISI_QM
-	help
-	  Support for HiSilicon ZIP Driver
-
  config CRYPTO_DEV_HISI_HPRE
  	tristate "Support for HISI HPRE accelerator"
  	depends on PCI_MSI
diff --git a/drivers/crypto/hisilicon/Makefile b/drivers/crypto/hisilicon/Makefile
index 8595a5a5d228..b342d7562eb5 100644
--- a/drivers/crypto/hisilicon/Makefile
+++ b/drivers/crypto/hisilicon/Makefile
@@ -4,5 +4,4 @@ obj-$(CONFIG_CRYPTO_DEV_HISI_SEC) += sec/
  obj-$(CONFIG_CRYPTO_DEV_HISI_SEC2) += sec2/
  obj-$(CONFIG_CRYPTO_DEV_HISI_QM) += hisi_qm.o
  hisi_qm-objs = qm.o sgl.o debugfs.o
-obj-$(CONFIG_CRYPTO_DEV_HISI_ZIP) += zip/
  obj-$(CONFIG_CRYPTO_DEV_HISI_TRNG) += trng/
diff --git a/drivers/crypto/hisilicon/zip/Makefile b/drivers/crypto/hisilicon/zip/Makefile
deleted file mode 100644
index a936f099ee22..000000000000
--- a/drivers/crypto/hisilicon/zip/Makefile
+++ /dev/null
@@ -1,2 +0,0 @@
-obj-$(CONFIG_CRYPTO_DEV_HISI_ZIP) += hisi_zip.o
-hisi_zip-objs = zip_main.o zip_crypto.o
diff --git a/drivers/crypto/hisilicon/zip/zip.h b/drivers/crypto/hisilicon/zip/zip.h
deleted file mode 100644
index f2e6da3240ae..000000000000
--- a/drivers/crypto/hisilicon/zip/zip.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (c) 2019 HiSilicon Limited. */
-#ifndef HISI_ZIP_H
-#define HISI_ZIP_H
-
-#undef pr_fmt
-#define pr_fmt(fmt)	"hisi_zip: " fmt
-
-#include <linux/list.h>
-#include <linux/hisi_acc_qm.h>
-
-enum hisi_zip_error_type {
-	/* negative compression */
-	HZIP_NC_ERR = 0x0d,
-};
-
-struct hisi_zip_dfx {
-	atomic64_t send_cnt;
-	atomic64_t recv_cnt;
-	atomic64_t send_busy_cnt;
-	atomic64_t err_bd_cnt;
-};
-
-struct hisi_zip_ctrl;
-
-struct hisi_zip {
-	struct hisi_qm qm;
-	struct hisi_zip_ctrl *ctrl;
-	struct hisi_zip_dfx dfx;
-};
-
-struct hisi_zip_sqe {
-	u32 consumed;
-	u32 produced;
-	u32 comp_data_length;
-	/*
-	 * status: 0~7 bits
-	 * rsvd: 8~31 bits
-	 */
-	u32 dw3;
-	u32 input_data_length;
-	u32 dw5;
-	u32 dw6;
-	/*
-	 * in_sge_data_offset: 0~23 bits
-	 * rsvd: 24~27 bits
-	 * sqe_type: 29~31 bits
-	 */
-	u32 dw7;
-	/*
-	 * out_sge_data_offset: 0~23 bits
-	 * rsvd: 24~31 bits
-	 */
-	u32 dw8;
-	/*
-	 * request_type: 0~7 bits
-	 * buffer_type: 8~11 bits
-	 * rsvd: 13~31 bits
-	 */
-	u32 dw9;
-	u32 dw10;
-	u32 dw11;
-	u32 dw12;
-	/* tag: in sqe type 0 */
-	u32 dw13;
-	u32 dest_avail_out;
-	u32 dw15;
-	u32 dw16;
-	u32 dw17;
-	u32 source_addr_l;
-	u32 source_addr_h;
-	u32 dest_addr_l;
-	u32 dest_addr_h;
-	u32 dw22;
-	u32 dw23;
-	u32 dw24;
-	u32 dw25;
-	/* tag: in sqe type 3 */
-	u32 dw26;
-	u32 dw27;
-	u32 rsvd1[4];
-};
-
-int zip_create_qps(struct hisi_qp **qps, int qp_num, int node);
-int hisi_zip_register_to_crypto(struct hisi_qm *qm);
-void hisi_zip_unregister_from_crypto(struct hisi_qm *qm);
-bool hisi_zip_alg_support(struct hisi_qm *qm, u32 alg);
-#endif
diff --git a/drivers/crypto/hisilicon/zip/zip_crypto.c b/drivers/crypto/hisilicon/zip/zip_crypto.c
deleted file mode 100644
index 6608971d10cd..000000000000
--- a/drivers/crypto/hisilicon/zip/zip_crypto.c
+++ /dev/null
@@ -1,839 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/* Copyright (c) 2019 HiSilicon Limited. */
-#include <crypto/internal/acompress.h>
-#include <linux/bitfield.h>
-#include <linux/bitmap.h>
-#include <linux/dma-mapping.h>
-#include <linux/scatterlist.h>
-#include "zip.h"
-
-/* hisi_zip_sqe dw3 */
-#define HZIP_BD_STATUS_M			GENMASK(7, 0)
-/* hisi_zip_sqe dw7 */
-#define HZIP_IN_SGE_DATA_OFFSET_M		GENMASK(23, 0)
-#define HZIP_SQE_TYPE_M				GENMASK(31, 28)
-/* hisi_zip_sqe dw8 */
-#define HZIP_OUT_SGE_DATA_OFFSET_M		GENMASK(23, 0)
-/* hisi_zip_sqe dw9 */
-#define HZIP_REQ_TYPE_M				GENMASK(7, 0)
-#define HZIP_ALG_TYPE_ZLIB			0x02
-#define HZIP_ALG_TYPE_GZIP			0x03
-#define HZIP_BUF_TYPE_M				GENMASK(11, 8)
-#define HZIP_PBUFFER				0x0
-#define HZIP_SGL				0x1
-
-#define HZIP_ZLIB_HEAD_SIZE			2
-#define HZIP_GZIP_HEAD_SIZE			10
-
-#define GZIP_HEAD_FHCRC_BIT			BIT(1)
-#define GZIP_HEAD_FEXTRA_BIT			BIT(2)
-#define GZIP_HEAD_FNAME_BIT			BIT(3)
-#define GZIP_HEAD_FCOMMENT_BIT			BIT(4)
-
-#define GZIP_HEAD_FLG_SHIFT			3
-#define GZIP_HEAD_FEXTRA_SHIFT			10
-#define GZIP_HEAD_FEXTRA_XLEN			2UL
-#define GZIP_HEAD_FHCRC_SIZE			2
-
-#define HZIP_GZIP_HEAD_BUF			256
-#define HZIP_ALG_PRIORITY			300
-#define HZIP_SGL_SGE_NR				10
-
-#define HZIP_ALG_ZLIB				GENMASK(1, 0)
-#define HZIP_ALG_GZIP				GENMASK(3, 2)
-
-static const u8 zlib_head[HZIP_ZLIB_HEAD_SIZE] = {0x78, 0x9c};
-static const u8 gzip_head[HZIP_GZIP_HEAD_SIZE] = {
-	0x1f, 0x8b, 0x08, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x03
-};
-
-enum hisi_zip_alg_type {
-	HZIP_ALG_TYPE_COMP = 0,
-	HZIP_ALG_TYPE_DECOMP = 1,
-};
-
-enum {
-	HZIP_QPC_COMP,
-	HZIP_QPC_DECOMP,
-	HZIP_CTX_Q_NUM
-};
-
-#define COMP_NAME_TO_TYPE(alg_name)					\
-	(!strcmp((alg_name), "zlib-deflate") ? HZIP_ALG_TYPE_ZLIB :	\
-	 !strcmp((alg_name), "gzip") ? HZIP_ALG_TYPE_GZIP : 0)		\
-
-#define TO_HEAD_SIZE(req_type)						\
-	(((req_type) == HZIP_ALG_TYPE_ZLIB) ? sizeof(zlib_head) :	\
-	 ((req_type) == HZIP_ALG_TYPE_GZIP) ? sizeof(gzip_head) : 0)	\
-
-#define TO_HEAD(req_type)						\
-	(((req_type) == HZIP_ALG_TYPE_ZLIB) ? zlib_head :		\
-	 ((req_type) == HZIP_ALG_TYPE_GZIP) ? gzip_head : NULL)		\
-
-struct hisi_zip_req {
-	struct acomp_req *req;
-	u32 sskip;
-	u32 dskip;
-	struct hisi_acc_hw_sgl *hw_src;
-	struct hisi_acc_hw_sgl *hw_dst;
-	dma_addr_t dma_src;
-	dma_addr_t dma_dst;
-	u16 req_id;
-};
-
-struct hisi_zip_req_q {
-	struct hisi_zip_req *q;
-	unsigned long *req_bitmap;
-	rwlock_t req_lock;
-	u16 size;
-};
-
-struct hisi_zip_qp_ctx {
-	struct hisi_qp *qp;
-	struct hisi_zip_req_q req_q;
-	struct hisi_acc_sgl_pool *sgl_pool;
-	struct hisi_zip *zip_dev;
-	struct hisi_zip_ctx *ctx;
-};
-
-struct hisi_zip_sqe_ops {
-	u8 sqe_type;
-	void (*fill_addr)(struct hisi_zip_sqe *sqe, struct hisi_zip_req *req);
-	void (*fill_buf_size)(struct hisi_zip_sqe *sqe, struct hisi_zip_req *req);
-	void (*fill_buf_type)(struct hisi_zip_sqe *sqe, u8 buf_type);
-	void (*fill_req_type)(struct hisi_zip_sqe *sqe, u8 req_type);
-	void (*fill_tag)(struct hisi_zip_sqe *sqe, struct hisi_zip_req *req);
-	void (*fill_sqe_type)(struct hisi_zip_sqe *sqe, u8 sqe_type);
-	u32 (*get_tag)(struct hisi_zip_sqe *sqe);
-	u32 (*get_status)(struct hisi_zip_sqe *sqe);
-	u32 (*get_dstlen)(struct hisi_zip_sqe *sqe);
-};
-
-struct hisi_zip_ctx {
-	struct hisi_zip_qp_ctx qp_ctx[HZIP_CTX_Q_NUM];
-	const struct hisi_zip_sqe_ops *ops;
-};
-
-static int sgl_sge_nr_set(const char *val, const struct kernel_param *kp)
-{
-	int ret;
-	u16 n;
-
-	if (!val)
-		return -EINVAL;
-
-	ret = kstrtou16(val, 10, &n);
-	if (ret || n == 0 || n > HISI_ACC_SGL_SGE_NR_MAX)
-		return -EINVAL;
-
-	return param_set_ushort(val, kp);
-}
-
-static const struct kernel_param_ops sgl_sge_nr_ops = {
-	.set = sgl_sge_nr_set,
-	.get = param_get_ushort,
-};
-
-static u16 sgl_sge_nr = HZIP_SGL_SGE_NR;
-module_param_cb(sgl_sge_nr, &sgl_sge_nr_ops, &sgl_sge_nr, 0444);
-MODULE_PARM_DESC(sgl_sge_nr, "Number of sge in sgl(1-255)");
-
-static u32 get_extra_field_size(const u8 *start)
-{
-	return *((u16 *)start) + GZIP_HEAD_FEXTRA_XLEN;
-}
-
-static u32 get_name_field_size(const u8 *start)
-{
-	return strlen(start) + 1;
-}
-
-static u32 get_comment_field_size(const u8 *start)
-{
-	return strlen(start) + 1;
-}
-
-static u32 __get_gzip_head_size(const u8 *src)
-{
-	u8 head_flg = *(src + GZIP_HEAD_FLG_SHIFT);
-	u32 size = GZIP_HEAD_FEXTRA_SHIFT;
-
-	if (head_flg & GZIP_HEAD_FEXTRA_BIT)
-		size += get_extra_field_size(src + size);
-	if (head_flg & GZIP_HEAD_FNAME_BIT)
-		size += get_name_field_size(src + size);
-	if (head_flg & GZIP_HEAD_FCOMMENT_BIT)
-		size += get_comment_field_size(src + size);
-	if (head_flg & GZIP_HEAD_FHCRC_BIT)
-		size += GZIP_HEAD_FHCRC_SIZE;
-
-	return size;
-}
-
-static u32 __maybe_unused get_gzip_head_size(struct scatterlist *sgl)
-{
-	char buf[HZIP_GZIP_HEAD_BUF];
-
-	sg_copy_to_buffer(sgl, sg_nents(sgl), buf, sizeof(buf));
-
-	return __get_gzip_head_size(buf);
-}
-
-static int add_comp_head(struct scatterlist *dst, u8 req_type)
-{
-	int head_size = TO_HEAD_SIZE(req_type);
-	const u8 *head = TO_HEAD(req_type);
-	int ret;
-
-	ret = sg_copy_from_buffer(dst, sg_nents(dst), head, head_size);
-	if (unlikely(ret != head_size)) {
-		pr_err("the head size of buffer is wrong (%d)!\n", ret);
-		return -ENOMEM;
-	}
-
-	return head_size;
-}
-
-static int get_comp_head_size(struct acomp_req *acomp_req, u8 req_type)
-{
-	if (unlikely(!acomp_req->src || !acomp_req->slen))
-		return -EINVAL;
-
-	if (unlikely(req_type == HZIP_ALG_TYPE_GZIP &&
-		     acomp_req->slen < GZIP_HEAD_FEXTRA_SHIFT))
-		return -EINVAL;
-
-	switch (req_type) {
-	case HZIP_ALG_TYPE_ZLIB:
-		return TO_HEAD_SIZE(HZIP_ALG_TYPE_ZLIB);
-	case HZIP_ALG_TYPE_GZIP:
-		return TO_HEAD_SIZE(HZIP_ALG_TYPE_GZIP);
-	default:
-		pr_err("request type does not support!\n");
-		return -EINVAL;
-	}
-}
-
-static struct hisi_zip_req *hisi_zip_create_req(struct acomp_req *req,
-						struct hisi_zip_qp_ctx *qp_ctx,
-						size_t head_size, bool is_comp)
-{
-	struct hisi_zip_req_q *req_q = &qp_ctx->req_q;
-	struct hisi_zip_req *q = req_q->q;
-	struct hisi_zip_req *req_cache;
-	int req_id;
-
-	write_lock(&req_q->req_lock);
-
-	req_id = find_first_zero_bit(req_q->req_bitmap, req_q->size);
-	if (req_id >= req_q->size) {
-		write_unlock(&req_q->req_lock);
-		dev_dbg(&qp_ctx->qp->qm->pdev->dev, "req cache is full!\n");
-		return ERR_PTR(-EAGAIN);
-	}
-	set_bit(req_id, req_q->req_bitmap);
-
-	write_unlock(&req_q->req_lock);
-
-	req_cache = q + req_id;
-	req_cache->req_id = req_id;
-	req_cache->req = req;
-
-	if (is_comp) {
-		req_cache->sskip = 0;
-		req_cache->dskip = head_size;
-	} else {
-		req_cache->sskip = head_size;
-		req_cache->dskip = 0;
-	}
-
-	return req_cache;
-}
-
-static void hisi_zip_remove_req(struct hisi_zip_qp_ctx *qp_ctx,
-				struct hisi_zip_req *req)
-{
-	struct hisi_zip_req_q *req_q = &qp_ctx->req_q;
-
-	write_lock(&req_q->req_lock);
-	clear_bit(req->req_id, req_q->req_bitmap);
-	write_unlock(&req_q->req_lock);
-}
-
-static void hisi_zip_fill_addr(struct hisi_zip_sqe *sqe, struct hisi_zip_req *req)
-{
-	sqe->source_addr_l = lower_32_bits(req->dma_src);
-	sqe->source_addr_h = upper_32_bits(req->dma_src);
-	sqe->dest_addr_l = lower_32_bits(req->dma_dst);
-	sqe->dest_addr_h = upper_32_bits(req->dma_dst);
-}
-
-static void hisi_zip_fill_buf_size(struct hisi_zip_sqe *sqe, struct hisi_zip_req *req)
-{
-	struct acomp_req *a_req = req->req;
-
-	sqe->input_data_length = a_req->slen - req->sskip;
-	sqe->dest_avail_out = a_req->dlen - req->dskip;
-	sqe->dw7 = FIELD_PREP(HZIP_IN_SGE_DATA_OFFSET_M, req->sskip);
-	sqe->dw8 = FIELD_PREP(HZIP_OUT_SGE_DATA_OFFSET_M, req->dskip);
-}
-
-static void hisi_zip_fill_buf_type(struct hisi_zip_sqe *sqe, u8 buf_type)
-{
-	u32 val;
-
-	val = sqe->dw9 & ~HZIP_BUF_TYPE_M;
-	val |= FIELD_PREP(HZIP_BUF_TYPE_M, buf_type);
-	sqe->dw9 = val;
-}
-
-static void hisi_zip_fill_req_type(struct hisi_zip_sqe *sqe, u8 req_type)
-{
-	u32 val;
-
-	val = sqe->dw9 & ~HZIP_REQ_TYPE_M;
-	val |= FIELD_PREP(HZIP_REQ_TYPE_M, req_type);
-	sqe->dw9 = val;
-}
-
-static void hisi_zip_fill_tag_v1(struct hisi_zip_sqe *sqe, struct hisi_zip_req *req)
-{
-	sqe->dw13 = req->req_id;
-}
-
-static void hisi_zip_fill_tag_v2(struct hisi_zip_sqe *sqe, struct hisi_zip_req *req)
-{
-	sqe->dw26 = req->req_id;
-}
-
-static void hisi_zip_fill_sqe_type(struct hisi_zip_sqe *sqe, u8 sqe_type)
-{
-	u32 val;
-
-	val = sqe->dw7 & ~HZIP_SQE_TYPE_M;
-	val |= FIELD_PREP(HZIP_SQE_TYPE_M, sqe_type);
-	sqe->dw7 = val;
-}
-
-static void hisi_zip_fill_sqe(struct hisi_zip_ctx *ctx, struct hisi_zip_sqe *sqe,
-			      u8 req_type, struct hisi_zip_req *req)
-{
-	const struct hisi_zip_sqe_ops *ops = ctx->ops;
-
-	memset(sqe, 0, sizeof(struct hisi_zip_sqe));
-
-	ops->fill_addr(sqe, req);
-	ops->fill_buf_size(sqe, req);
-	ops->fill_buf_type(sqe, HZIP_SGL);
-	ops->fill_req_type(sqe, req_type);
-	ops->fill_tag(sqe, req);
-	ops->fill_sqe_type(sqe, ops->sqe_type);
-}
-
-static int hisi_zip_do_work(struct hisi_zip_req *req,
-			    struct hisi_zip_qp_ctx *qp_ctx)
-{
-	struct hisi_acc_sgl_pool *pool = qp_ctx->sgl_pool;
-	struct hisi_zip_dfx *dfx = &qp_ctx->zip_dev->dfx;
-	struct acomp_req *a_req = req->req;
-	struct hisi_qp *qp = qp_ctx->qp;
-	struct device *dev = &qp->qm->pdev->dev;
-	struct hisi_zip_sqe zip_sqe;
-	int ret;
-
-	if (unlikely(!a_req->src || !a_req->slen || !a_req->dst || !a_req->dlen))
-		return -EINVAL;
-
-	req->hw_src = hisi_acc_sg_buf_map_to_hw_sgl(dev, a_req->src, pool,
-						    req->req_id << 1, &req->dma_src);
-	if (IS_ERR(req->hw_src)) {
-		dev_err(dev, "failed to map the src buffer to hw sgl (%ld)!\n",
-			PTR_ERR(req->hw_src));
-		return PTR_ERR(req->hw_src);
-	}
-
-	req->hw_dst = hisi_acc_sg_buf_map_to_hw_sgl(dev, a_req->dst, pool,
-						    (req->req_id << 1) + 1,
-						    &req->dma_dst);
-	if (IS_ERR(req->hw_dst)) {
-		ret = PTR_ERR(req->hw_dst);
-		dev_err(dev, "failed to map the dst buffer to hw slg (%d)!\n",
-			ret);
-		goto err_unmap_input;
-	}
-
-	hisi_zip_fill_sqe(qp_ctx->ctx, &zip_sqe, qp->req_type, req);
-
-	/* send command to start a task */
-	atomic64_inc(&dfx->send_cnt);
-	ret = hisi_qp_send(qp, &zip_sqe);
-	if (unlikely(ret < 0)) {
-		atomic64_inc(&dfx->send_busy_cnt);
-		ret = -EAGAIN;
-		dev_dbg_ratelimited(dev, "failed to send request!\n");
-		goto err_unmap_output;
-	}
-
-	return -EINPROGRESS;
-
-err_unmap_output:
-	hisi_acc_sg_buf_unmap(dev, a_req->dst, req->hw_dst);
-err_unmap_input:
-	hisi_acc_sg_buf_unmap(dev, a_req->src, req->hw_src);
-	return ret;
-}
-
-static u32 hisi_zip_get_tag_v1(struct hisi_zip_sqe *sqe)
-{
-	return sqe->dw13;
-}
-
-static u32 hisi_zip_get_tag_v2(struct hisi_zip_sqe *sqe)
-{
-	return sqe->dw26;
-}
-
-static u32 hisi_zip_get_status(struct hisi_zip_sqe *sqe)
-{
-	return sqe->dw3 & HZIP_BD_STATUS_M;
-}
-
-static u32 hisi_zip_get_dstlen(struct hisi_zip_sqe *sqe)
-{
-	return sqe->produced;
-}
-
-static void hisi_zip_acomp_cb(struct hisi_qp *qp, void *data)
-{
-	struct hisi_zip_qp_ctx *qp_ctx = qp->qp_ctx;
-	const struct hisi_zip_sqe_ops *ops = qp_ctx->ctx->ops;
-	struct hisi_zip_dfx *dfx = &qp_ctx->zip_dev->dfx;
-	struct hisi_zip_req_q *req_q = &qp_ctx->req_q;
-	struct device *dev = &qp->qm->pdev->dev;
-	struct hisi_zip_sqe *sqe = data;
-	u32 tag = ops->get_tag(sqe);
-	struct hisi_zip_req *req = req_q->q + tag;
-	struct acomp_req *acomp_req = req->req;
-	u32 status, dlen, head_size;
-	int err = 0;
-
-	atomic64_inc(&dfx->recv_cnt);
-	status = ops->get_status(sqe);
-	if (unlikely(status != 0 && status != HZIP_NC_ERR)) {
-		dev_err(dev, "%scompress fail in qp%u: %u, output: %u\n",
-			(qp->alg_type == 0) ? "" : "de", qp->qp_id, status,
-			sqe->produced);
-		atomic64_inc(&dfx->err_bd_cnt);
-		err = -EIO;
-	}
-
-	dlen = ops->get_dstlen(sqe);
-
-	hisi_acc_sg_buf_unmap(dev, acomp_req->src, req->hw_src);
-	hisi_acc_sg_buf_unmap(dev, acomp_req->dst, req->hw_dst);
-
-	head_size = (qp->alg_type == 0) ? TO_HEAD_SIZE(qp->req_type) : 0;
-	acomp_req->dlen = dlen + head_size;
-
-	if (acomp_req->base.complete)
-		acomp_request_complete(acomp_req, err);
-
-	hisi_zip_remove_req(qp_ctx, req);
-}
-
-static int hisi_zip_acompress(struct acomp_req *acomp_req)
-{
-	struct hisi_zip_ctx *ctx = crypto_tfm_ctx(acomp_req->base.tfm);
-	struct hisi_zip_qp_ctx *qp_ctx = &ctx->qp_ctx[HZIP_QPC_COMP];
-	struct device *dev = &qp_ctx->qp->qm->pdev->dev;
-	struct hisi_zip_req *req;
-	int head_size;
-	int ret;
-
-	/* let's output compression head now */
-	head_size = add_comp_head(acomp_req->dst, qp_ctx->qp->req_type);
-	if (unlikely(head_size < 0)) {
-		dev_err_ratelimited(dev, "failed to add comp head (%d)!\n",
-				    head_size);
-		return head_size;
-	}
-
-	req = hisi_zip_create_req(acomp_req, qp_ctx, head_size, true);
-	if (IS_ERR(req))
-		return PTR_ERR(req);
-
-	ret = hisi_zip_do_work(req, qp_ctx);
-	if (unlikely(ret != -EINPROGRESS)) {
-		dev_info_ratelimited(dev, "failed to do compress (%d)!\n", ret);
-		hisi_zip_remove_req(qp_ctx, req);
-	}
-
-	return ret;
-}
-
-static int hisi_zip_adecompress(struct acomp_req *acomp_req)
-{
-	struct hisi_zip_ctx *ctx = crypto_tfm_ctx(acomp_req->base.tfm);
-	struct hisi_zip_qp_ctx *qp_ctx = &ctx->qp_ctx[HZIP_QPC_DECOMP];
-	struct device *dev = &qp_ctx->qp->qm->pdev->dev;
-	struct hisi_zip_req *req;
-	int head_size, ret;
-
-	head_size = get_comp_head_size(acomp_req, qp_ctx->qp->req_type);
-	if (unlikely(head_size < 0)) {
-		dev_err_ratelimited(dev, "failed to get comp head size (%d)!\n",
-				    head_size);
-		return head_size;
-	}
-
-	req = hisi_zip_create_req(acomp_req, qp_ctx, head_size, false);
-	if (IS_ERR(req))
-		return PTR_ERR(req);
-
-	ret = hisi_zip_do_work(req, qp_ctx);
-	if (unlikely(ret != -EINPROGRESS)) {
-		dev_info_ratelimited(dev, "failed to do decompress (%d)!\n",
-				     ret);
-		hisi_zip_remove_req(qp_ctx, req);
-	}
-
-	return ret;
-}
-
-static int hisi_zip_start_qp(struct hisi_qp *qp, struct hisi_zip_qp_ctx *qp_ctx,
-			     int alg_type, int req_type)
-{
-	struct device *dev = &qp->qm->pdev->dev;
-	int ret;
-
-	qp->req_type = req_type;
-	qp->alg_type = alg_type;
-	qp->qp_ctx = qp_ctx;
-
-	ret = hisi_qm_start_qp(qp, 0);
-	if (ret < 0) {
-		dev_err(dev, "failed to start qp (%d)!\n", ret);
-		return ret;
-	}
-
-	qp_ctx->qp = qp;
-
-	return 0;
-}
-
-static void hisi_zip_release_qp(struct hisi_zip_qp_ctx *qp_ctx)
-{
-	hisi_qm_stop_qp(qp_ctx->qp);
-	hisi_qm_free_qps(&qp_ctx->qp, 1);
-}
-
-static const struct hisi_zip_sqe_ops hisi_zip_ops_v1 = {
-	.sqe_type		= 0,
-	.fill_addr		= hisi_zip_fill_addr,
-	.fill_buf_size		= hisi_zip_fill_buf_size,
-	.fill_buf_type		= hisi_zip_fill_buf_type,
-	.fill_req_type		= hisi_zip_fill_req_type,
-	.fill_tag		= hisi_zip_fill_tag_v1,
-	.fill_sqe_type		= hisi_zip_fill_sqe_type,
-	.get_tag		= hisi_zip_get_tag_v1,
-	.get_status		= hisi_zip_get_status,
-	.get_dstlen		= hisi_zip_get_dstlen,
-};
-
-static const struct hisi_zip_sqe_ops hisi_zip_ops_v2 = {
-	.sqe_type		= 0x3,
-	.fill_addr		= hisi_zip_fill_addr,
-	.fill_buf_size		= hisi_zip_fill_buf_size,
-	.fill_buf_type		= hisi_zip_fill_buf_type,
-	.fill_req_type		= hisi_zip_fill_req_type,
-	.fill_tag		= hisi_zip_fill_tag_v2,
-	.fill_sqe_type		= hisi_zip_fill_sqe_type,
-	.get_tag		= hisi_zip_get_tag_v2,
-	.get_status		= hisi_zip_get_status,
-	.get_dstlen		= hisi_zip_get_dstlen,
-};
-
-static int hisi_zip_ctx_init(struct hisi_zip_ctx *hisi_zip_ctx, u8 req_type, int node)
-{
-	struct hisi_qp *qps[HZIP_CTX_Q_NUM] = { NULL };
-	struct hisi_zip_qp_ctx *qp_ctx;
-	struct hisi_zip *hisi_zip;
-	int ret, i, j;
-
-	ret = zip_create_qps(qps, HZIP_CTX_Q_NUM, node);
-	if (ret) {
-		pr_err("failed to create zip qps (%d)!\n", ret);
-		return -ENODEV;
-	}
-
-	hisi_zip = container_of(qps[0]->qm, struct hisi_zip, qm);
-
-	for (i = 0; i < HZIP_CTX_Q_NUM; i++) {
-		/* alg_type = 0 for compress, 1 for decompress in hw sqe */
-		qp_ctx = &hisi_zip_ctx->qp_ctx[i];
-		qp_ctx->ctx = hisi_zip_ctx;
-		ret = hisi_zip_start_qp(qps[i], qp_ctx, i, req_type);
-		if (ret) {
-			for (j = i - 1; j >= 0; j--)
-				hisi_qm_stop_qp(hisi_zip_ctx->qp_ctx[j].qp);
-
-			hisi_qm_free_qps(qps, HZIP_CTX_Q_NUM);
-			return ret;
-		}
-
-		qp_ctx->zip_dev = hisi_zip;
-	}
-
-	if (hisi_zip->qm.ver < QM_HW_V3)
-		hisi_zip_ctx->ops = &hisi_zip_ops_v1;
-	else
-		hisi_zip_ctx->ops = &hisi_zip_ops_v2;
-
-	return 0;
-}
-
-static void hisi_zip_ctx_exit(struct hisi_zip_ctx *hisi_zip_ctx)
-{
-	int i;
-
-	for (i = 0; i < HZIP_CTX_Q_NUM; i++)
-		hisi_zip_release_qp(&hisi_zip_ctx->qp_ctx[i]);
-}
-
-static int hisi_zip_create_req_q(struct hisi_zip_ctx *ctx)
-{
-	u16 q_depth = ctx->qp_ctx[0].qp->sq_depth;
-	struct hisi_zip_req_q *req_q;
-	int i, ret;
-
-	for (i = 0; i < HZIP_CTX_Q_NUM; i++) {
-		req_q = &ctx->qp_ctx[i].req_q;
-		req_q->size = q_depth;
-
-		req_q->req_bitmap = bitmap_zalloc(req_q->size, GFP_KERNEL);
-		if (!req_q->req_bitmap) {
-			ret = -ENOMEM;
-			if (i == 0)
-				return ret;
-
-			goto err_free_comp_q;
-		}
-		rwlock_init(&req_q->req_lock);
-
-		req_q->q = kcalloc(req_q->size, sizeof(struct hisi_zip_req),
-				   GFP_KERNEL);
-		if (!req_q->q) {
-			ret = -ENOMEM;
-			if (i == 0)
-				goto err_free_comp_bitmap;
-			else
-				goto err_free_decomp_bitmap;
-		}
-	}
-
-	return 0;
-
-err_free_decomp_bitmap:
-	bitmap_free(ctx->qp_ctx[HZIP_QPC_DECOMP].req_q.req_bitmap);
-err_free_comp_q:
-	kfree(ctx->qp_ctx[HZIP_QPC_COMP].req_q.q);
-err_free_comp_bitmap:
-	bitmap_free(ctx->qp_ctx[HZIP_QPC_COMP].req_q.req_bitmap);
-	return ret;
-}
-
-static void hisi_zip_release_req_q(struct hisi_zip_ctx *ctx)
-{
-	int i;
-
-	for (i = 0; i < HZIP_CTX_Q_NUM; i++) {
-		kfree(ctx->qp_ctx[i].req_q.q);
-		bitmap_free(ctx->qp_ctx[i].req_q.req_bitmap);
-	}
-}
-
-static int hisi_zip_create_sgl_pool(struct hisi_zip_ctx *ctx)
-{
-	u16 q_depth = ctx->qp_ctx[0].qp->sq_depth;
-	struct hisi_zip_qp_ctx *tmp;
-	struct device *dev;
-	int i;
-
-	for (i = 0; i < HZIP_CTX_Q_NUM; i++) {
-		tmp = &ctx->qp_ctx[i];
-		dev = &tmp->qp->qm->pdev->dev;
-		tmp->sgl_pool = hisi_acc_create_sgl_pool(dev, q_depth << 1,
-							 sgl_sge_nr);
-		if (IS_ERR(tmp->sgl_pool)) {
-			if (i == 1)
-				goto err_free_sgl_pool0;
-			return -ENOMEM;
-		}
-	}
-
-	return 0;
-
-err_free_sgl_pool0:
-	hisi_acc_free_sgl_pool(&ctx->qp_ctx[HZIP_QPC_COMP].qp->qm->pdev->dev,
-			       ctx->qp_ctx[HZIP_QPC_COMP].sgl_pool);
-	return -ENOMEM;
-}
-
-static void hisi_zip_release_sgl_pool(struct hisi_zip_ctx *ctx)
-{
-	int i;
-
-	for (i = 0; i < HZIP_CTX_Q_NUM; i++)
-		hisi_acc_free_sgl_pool(&ctx->qp_ctx[i].qp->qm->pdev->dev,
-				       ctx->qp_ctx[i].sgl_pool);
-}
-
-static void hisi_zip_set_acomp_cb(struct hisi_zip_ctx *ctx,
-				  void (*fn)(struct hisi_qp *, void *))
-{
-	int i;
-
-	for (i = 0; i < HZIP_CTX_Q_NUM; i++)
-		ctx->qp_ctx[i].qp->req_cb = fn;
-}
-
-static int hisi_zip_acomp_init(struct crypto_acomp *tfm)
-{
-	const char *alg_name = crypto_tfm_alg_name(&tfm->base);
-	struct hisi_zip_ctx *ctx = crypto_tfm_ctx(&tfm->base);
-	struct device *dev;
-	int ret;
-
-	ret = hisi_zip_ctx_init(ctx, COMP_NAME_TO_TYPE(alg_name), tfm->base.node);
-	if (ret) {
-		pr_err("failed to init ctx (%d)!\n", ret);
-		return ret;
-	}
-
-	dev = &ctx->qp_ctx[0].qp->qm->pdev->dev;
-
-	ret = hisi_zip_create_req_q(ctx);
-	if (ret) {
-		dev_err(dev, "failed to create request queue (%d)!\n", ret);
-		goto err_ctx_exit;
-	}
-
-	ret = hisi_zip_create_sgl_pool(ctx);
-	if (ret) {
-		dev_err(dev, "failed to create sgl pool (%d)!\n", ret);
-		goto err_release_req_q;
-	}
-
-	hisi_zip_set_acomp_cb(ctx, hisi_zip_acomp_cb);
-
-	return 0;
-
-err_release_req_q:
-	hisi_zip_release_req_q(ctx);
-err_ctx_exit:
-	hisi_zip_ctx_exit(ctx);
-	return ret;
-}
-
-static void hisi_zip_acomp_exit(struct crypto_acomp *tfm)
-{
-	struct hisi_zip_ctx *ctx = crypto_tfm_ctx(&tfm->base);
-
-	hisi_zip_set_acomp_cb(ctx, NULL);
-	hisi_zip_release_sgl_pool(ctx);
-	hisi_zip_release_req_q(ctx);
-	hisi_zip_ctx_exit(ctx);
-}
-
-static struct acomp_alg hisi_zip_acomp_zlib = {
-	.init			= hisi_zip_acomp_init,
-	.exit			= hisi_zip_acomp_exit,
-	.compress		= hisi_zip_acompress,
-	.decompress		= hisi_zip_adecompress,
-	.base			= {
-		.cra_name		= "zlib-deflate",
-		.cra_driver_name	= "hisi-zlib-acomp",
-		.cra_module		= THIS_MODULE,
-		.cra_priority           = HZIP_ALG_PRIORITY,
-		.cra_ctxsize		= sizeof(struct hisi_zip_ctx),
-	}
-};
-
-static int hisi_zip_register_zlib(struct hisi_qm *qm)
-{
-	int ret;
-
-	if (!hisi_zip_alg_support(qm, HZIP_ALG_ZLIB))
-		return 0;
-
-	ret = crypto_register_acomp(&hisi_zip_acomp_zlib);
-	if (ret)
-		dev_err(&qm->pdev->dev, "failed to register to zlib (%d)!\n", ret);
-
-	return ret;
-}
-
-static void hisi_zip_unregister_zlib(struct hisi_qm *qm)
-{
-	if (!hisi_zip_alg_support(qm, HZIP_ALG_ZLIB))
-		return;
-
-	crypto_unregister_acomp(&hisi_zip_acomp_zlib);
-}
-
-static struct acomp_alg hisi_zip_acomp_gzip = {
-	.init			= hisi_zip_acomp_init,
-	.exit			= hisi_zip_acomp_exit,
-	.compress		= hisi_zip_acompress,
-	.decompress		= hisi_zip_adecompress,
-	.base			= {
-		.cra_name		= "gzip",
-		.cra_driver_name	= "hisi-gzip-acomp",
-		.cra_module		= THIS_MODULE,
-		.cra_priority           = HZIP_ALG_PRIORITY,
-		.cra_ctxsize		= sizeof(struct hisi_zip_ctx),
-	}
-};
-
-static int hisi_zip_register_gzip(struct hisi_qm *qm)
-{
-	int ret;
-
-	if (!hisi_zip_alg_support(qm, HZIP_ALG_GZIP))
-		return 0;
-
-	ret = crypto_register_acomp(&hisi_zip_acomp_gzip);
-	if (ret)
-		dev_err(&qm->pdev->dev, "failed to register to gzip (%d)!\n", ret);
-
-	return ret;
-}
-
-static void hisi_zip_unregister_gzip(struct hisi_qm *qm)
-{
-	if (!hisi_zip_alg_support(qm, HZIP_ALG_GZIP))
-		return;
-
-	crypto_unregister_acomp(&hisi_zip_acomp_gzip);
-}
-
-int hisi_zip_register_to_crypto(struct hisi_qm *qm)
-{
-	int ret = 0;
-
-	ret = hisi_zip_register_zlib(qm);
-	if (ret)
-		return ret;
-
-	ret = hisi_zip_register_gzip(qm);
-	if (ret)
-		hisi_zip_unregister_zlib(qm);
-
-	return ret;
-}
-
-void hisi_zip_unregister_from_crypto(struct hisi_qm *qm)
-{
-	hisi_zip_unregister_zlib(qm);
-	hisi_zip_unregister_gzip(qm);
-}
diff --git a/drivers/crypto/hisilicon/zip/zip_main.c b/drivers/crypto/hisilicon/zip/zip_main.c
deleted file mode 100644
index f3ce34198775..000000000000
--- a/drivers/crypto/hisilicon/zip/zip_main.c
+++ /dev/null
@@ -1,1357 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/* Copyright (c) 2019 HiSilicon Limited. */
-#include <linux/acpi.h>
-#include <linux/bitops.h>
-#include <linux/debugfs.h>
-#include <linux/init.h>
-#include <linux/io.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/pci.h>
-#include <linux/pm_runtime.h>
-#include <linux/seq_file.h>
-#include <linux/topology.h>
-#include <linux/uacce.h>
-#include "zip.h"
-
-#define PCI_DEVICE_ID_HUAWEI_ZIP_PF	0xa250
-
-#define HZIP_QUEUE_NUM_V1		4096
-
-#define HZIP_CLOCK_GATE_CTRL		0x301004
-#define HZIP_DECOMP_CHECK_ENABLE	BIT(16)
-#define HZIP_FSM_MAX_CNT		0x301008
-
-#define HZIP_PORT_ARCA_CHE_0		0x301040
-#define HZIP_PORT_ARCA_CHE_1		0x301044
-#define HZIP_PORT_AWCA_CHE_0		0x301060
-#define HZIP_PORT_AWCA_CHE_1		0x301064
-#define HZIP_CACHE_ALL_EN		0xffffffff
-
-#define HZIP_BD_RUSER_32_63		0x301110
-#define HZIP_SGL_RUSER_32_63		0x30111c
-#define HZIP_DATA_RUSER_32_63		0x301128
-#define HZIP_DATA_WUSER_32_63		0x301134
-#define HZIP_BD_WUSER_32_63		0x301140
-
-#define HZIP_QM_IDEL_STATUS		0x3040e4
-
-#define HZIP_CORE_DFX_BASE		0x301000
-#define HZIP_CLOCK_GATED_CONTL		0X301004
-#define HZIP_CORE_DFX_COMP_0		0x302000
-#define HZIP_CORE_DFX_COMP_1		0x303000
-#define HZIP_CORE_DFX_DECOMP_0		0x304000
-#define HZIP_CORE_DFX_DECOMP_1		0x305000
-#define HZIP_CORE_DFX_DECOMP_2		0x306000
-#define HZIP_CORE_DFX_DECOMP_3		0x307000
-#define HZIP_CORE_DFX_DECOMP_4		0x308000
-#define HZIP_CORE_DFX_DECOMP_5		0x309000
-#define HZIP_CORE_REGS_BASE_LEN		0xB0
-#define HZIP_CORE_REGS_DFX_LEN		0x28
-
-#define HZIP_CORE_INT_SOURCE		0x3010A0
-#define HZIP_CORE_INT_MASK_REG		0x3010A4
-#define HZIP_CORE_INT_SET		0x3010A8
-#define HZIP_CORE_INT_STATUS		0x3010AC
-#define HZIP_CORE_INT_STATUS_M_ECC	BIT(1)
-#define HZIP_CORE_SRAM_ECC_ERR_INFO	0x301148
-#define HZIP_CORE_INT_RAS_CE_ENB	0x301160
-#define HZIP_CORE_INT_RAS_NFE_ENB	0x301164
-#define HZIP_CORE_INT_RAS_FE_ENB        0x301168
-#define HZIP_CORE_INT_RAS_FE_ENB_MASK	0x0
-#define HZIP_OOO_SHUTDOWN_SEL		0x30120C
-#define HZIP_SRAM_ECC_ERR_NUM_SHIFT	16
-#define HZIP_SRAM_ECC_ERR_ADDR_SHIFT	24
-#define HZIP_CORE_INT_MASK_ALL		GENMASK(12, 0)
-#define HZIP_SQE_SIZE			128
-#define HZIP_PF_DEF_Q_NUM		64
-#define HZIP_PF_DEF_Q_BASE		0
-
-#define HZIP_SOFT_CTRL_CNT_CLR_CE	0x301000
-#define HZIP_SOFT_CTRL_CNT_CLR_CE_BIT	BIT(0)
-#define HZIP_SOFT_CTRL_ZIP_CONTROL	0x30100C
-#define HZIP_AXI_SHUTDOWN_ENABLE	BIT(14)
-#define HZIP_WR_PORT			BIT(11)
-
-#define HZIP_DEV_ALG_MAX_LEN		256
-#define HZIP_ALG_ZLIB_BIT		GENMASK(1, 0)
-#define HZIP_ALG_GZIP_BIT		GENMASK(3, 2)
-#define HZIP_ALG_DEFLATE_BIT		GENMASK(5, 4)
-#define HZIP_ALG_LZ77_BIT		GENMASK(7, 6)
-
-#define HZIP_BUF_SIZE			22
-#define HZIP_SQE_MASK_OFFSET		64
-#define HZIP_SQE_MASK_LEN		48
-
-#define HZIP_CNT_CLR_CE_EN		BIT(0)
-#define HZIP_RO_CNT_CLR_CE_EN		BIT(2)
-#define HZIP_RD_CNT_CLR_CE_EN		(HZIP_CNT_CLR_CE_EN | \
-					 HZIP_RO_CNT_CLR_CE_EN)
-
-#define HZIP_PREFETCH_CFG		0x3011B0
-#define HZIP_SVA_TRANS			0x3011C4
-#define HZIP_PREFETCH_ENABLE		(~(BIT(26) | BIT(17) | BIT(0)))
-#define HZIP_SVA_PREFETCH_DISABLE	BIT(26)
-#define HZIP_SVA_DISABLE_READY		(BIT(26) | BIT(30))
-#define HZIP_SHAPER_RATE_COMPRESS	750
-#define HZIP_SHAPER_RATE_DECOMPRESS	140
-#define HZIP_DELAY_1_US		1
-#define HZIP_POLL_TIMEOUT_US	1000
-
-/* clock gating */
-#define HZIP_PEH_CFG_AUTO_GATE		0x3011A8
-#define HZIP_PEH_CFG_AUTO_GATE_EN	BIT(0)
-#define HZIP_CORE_GATED_EN		GENMASK(15, 8)
-#define HZIP_CORE_GATED_OOO_EN		BIT(29)
-#define HZIP_CLOCK_GATED_EN		(HZIP_CORE_GATED_EN | \
-					 HZIP_CORE_GATED_OOO_EN)
-
-static const char hisi_zip_name[] = "hisi_zip";
-static struct dentry *hzip_debugfs_root;
-
-struct hisi_zip_hw_error {
-	u32 int_msk;
-	const char *msg;
-};
-
-struct zip_dfx_item {
-	const char *name;
-	u32 offset;
-};
-
-struct zip_dev_alg {
-	u32 alg_msk;
-	const char *algs;
-};
-
-static const struct zip_dev_alg zip_dev_algs[] = { {
-		.alg_msk = HZIP_ALG_ZLIB_BIT,
-		.algs = "zlib\n",
-	}, {
-		.alg_msk = HZIP_ALG_GZIP_BIT,
-		.algs = "gzip\n",
-	}, {
-		.alg_msk = HZIP_ALG_DEFLATE_BIT,
-		.algs = "deflate\n",
-	}, {
-		.alg_msk = HZIP_ALG_LZ77_BIT,
-		.algs = "lz77_zstd\n",
-	},
-};
-
-static struct hisi_qm_list zip_devices = {
-	.register_to_crypto	= hisi_zip_register_to_crypto,
-	.unregister_from_crypto	= hisi_zip_unregister_from_crypto,
-};
-
-static struct zip_dfx_item zip_dfx_files[] = {
-	{"send_cnt", offsetof(struct hisi_zip_dfx, send_cnt)},
-	{"recv_cnt", offsetof(struct hisi_zip_dfx, recv_cnt)},
-	{"send_busy_cnt", offsetof(struct hisi_zip_dfx, send_busy_cnt)},
-	{"err_bd_cnt", offsetof(struct hisi_zip_dfx, err_bd_cnt)},
-};
-
-static const struct hisi_zip_hw_error zip_hw_error[] = {
-	{ .int_msk = BIT(0), .msg = "zip_ecc_1bitt_err" },
-	{ .int_msk = BIT(1), .msg = "zip_ecc_2bit_err" },
-	{ .int_msk = BIT(2), .msg = "zip_axi_rresp_err" },
-	{ .int_msk = BIT(3), .msg = "zip_axi_bresp_err" },
-	{ .int_msk = BIT(4), .msg = "zip_src_addr_parse_err" },
-	{ .int_msk = BIT(5), .msg = "zip_dst_addr_parse_err" },
-	{ .int_msk = BIT(6), .msg = "zip_pre_in_addr_err" },
-	{ .int_msk = BIT(7), .msg = "zip_pre_in_data_err" },
-	{ .int_msk = BIT(8), .msg = "zip_com_inf_err" },
-	{ .int_msk = BIT(9), .msg = "zip_enc_inf_err" },
-	{ .int_msk = BIT(10), .msg = "zip_pre_out_err" },
-	{ .int_msk = BIT(11), .msg = "zip_axi_poison_err" },
-	{ .int_msk = BIT(12), .msg = "zip_sva_err" },
-	{ /* sentinel */ }
-};
-
-enum ctrl_debug_file_index {
-	HZIP_CLEAR_ENABLE,
-	HZIP_DEBUG_FILE_NUM,
-};
-
-static const char * const ctrl_debug_file_name[] = {
-	[HZIP_CLEAR_ENABLE] = "clear_enable",
-};
-
-struct ctrl_debug_file {
-	enum ctrl_debug_file_index index;
-	spinlock_t lock;
-	struct hisi_zip_ctrl *ctrl;
-};
-
-/*
- * One ZIP controller has one PF and multiple VFs, some global configurations
- * which PF has need this structure.
- *
- * Just relevant for PF.
- */
-struct hisi_zip_ctrl {
-	struct hisi_zip *hisi_zip;
-	struct ctrl_debug_file files[HZIP_DEBUG_FILE_NUM];
-};
-
-enum zip_cap_type {
-	ZIP_QM_NFE_MASK_CAP = 0x0,
-	ZIP_QM_RESET_MASK_CAP,
-	ZIP_QM_OOO_SHUTDOWN_MASK_CAP,
-	ZIP_QM_CE_MASK_CAP,
-	ZIP_NFE_MASK_CAP,
-	ZIP_RESET_MASK_CAP,
-	ZIP_OOO_SHUTDOWN_MASK_CAP,
-	ZIP_CE_MASK_CAP,
-	ZIP_CLUSTER_NUM_CAP,
-	ZIP_CORE_TYPE_NUM_CAP,
-	ZIP_CORE_NUM_CAP,
-	ZIP_CLUSTER_COMP_NUM_CAP,
-	ZIP_CLUSTER_DECOMP_NUM_CAP,
-	ZIP_DECOMP_ENABLE_BITMAP,
-	ZIP_COMP_ENABLE_BITMAP,
-	ZIP_DRV_ALG_BITMAP,
-	ZIP_DEV_ALG_BITMAP,
-	ZIP_CORE1_ALG_BITMAP,
-	ZIP_CORE2_ALG_BITMAP,
-	ZIP_CORE3_ALG_BITMAP,
-	ZIP_CORE4_ALG_BITMAP,
-	ZIP_CORE5_ALG_BITMAP,
-	ZIP_CAP_MAX
-};
-
-static struct hisi_qm_cap_info zip_basic_cap_info[] = {
-	{ZIP_QM_NFE_MASK_CAP, 0x3124, 0, GENMASK(31, 0), 0x0, 0x1C57, 0x7C77},
-	{ZIP_QM_RESET_MASK_CAP, 0x3128, 0, GENMASK(31, 0), 0x0, 0xC57, 0x6C77},
-	{ZIP_QM_OOO_SHUTDOWN_MASK_CAP, 0x3128, 0, GENMASK(31, 0), 0x0, 0x4, 0x6C77},
-	{ZIP_QM_CE_MASK_CAP, 0x312C, 0, GENMASK(31, 0), 0x0, 0x8, 0x8},
-	{ZIP_NFE_MASK_CAP, 0x3130, 0, GENMASK(31, 0), 0x0, 0x7FE, 0x1FFE},
-	{ZIP_RESET_MASK_CAP, 0x3134, 0, GENMASK(31, 0), 0x0, 0x7FE, 0x7FE},
-	{ZIP_OOO_SHUTDOWN_MASK_CAP, 0x3134, 0, GENMASK(31, 0), 0x0, 0x2, 0x7FE},
-	{ZIP_CE_MASK_CAP, 0x3138, 0, GENMASK(31, 0), 0x0, 0x1, 0x1},
-	{ZIP_CLUSTER_NUM_CAP, 0x313C, 28, GENMASK(3, 0), 0x1, 0x1, 0x1},
-	{ZIP_CORE_TYPE_NUM_CAP, 0x313C, 24, GENMASK(3, 0), 0x2, 0x2, 0x2},
-	{ZIP_CORE_NUM_CAP, 0x313C, 16, GENMASK(7, 0), 0x8, 0x8, 0x5},
-	{ZIP_CLUSTER_COMP_NUM_CAP, 0x313C, 8, GENMASK(7, 0), 0x2, 0x2, 0x2},
-	{ZIP_CLUSTER_DECOMP_NUM_CAP, 0x313C, 0, GENMASK(7, 0), 0x6, 0x6, 0x3},
-	{ZIP_DECOMP_ENABLE_BITMAP, 0x3140, 16, GENMASK(15, 0), 0xFC, 0xFC, 0x1C},
-	{ZIP_COMP_ENABLE_BITMAP, 0x3140, 0, GENMASK(15, 0), 0x3, 0x3, 0x3},
-	{ZIP_DRV_ALG_BITMAP, 0x3144, 0, GENMASK(31, 0), 0xF, 0xF, 0xF},
-	{ZIP_DEV_ALG_BITMAP, 0x3148, 0, GENMASK(31, 0), 0xF, 0xF, 0xFF},
-	{ZIP_CORE1_ALG_BITMAP, 0x314C, 0, GENMASK(31, 0), 0x5, 0x5, 0xD5},
-	{ZIP_CORE2_ALG_BITMAP, 0x3150, 0, GENMASK(31, 0), 0x5, 0x5, 0xD5},
-	{ZIP_CORE3_ALG_BITMAP, 0x3154, 0, GENMASK(31, 0), 0xA, 0xA, 0x2A},
-	{ZIP_CORE4_ALG_BITMAP, 0x3158, 0, GENMASK(31, 0), 0xA, 0xA, 0x2A},
-	{ZIP_CORE5_ALG_BITMAP, 0x315C, 0, GENMASK(31, 0), 0xA, 0xA, 0x2A},
-	{ZIP_CAP_MAX, 0x317c, 0, GENMASK(0, 0), 0x0, 0x0, 0x0}
-};
-
-enum {
-	HZIP_COMP_CORE0,
-	HZIP_COMP_CORE1,
-	HZIP_DECOMP_CORE0,
-	HZIP_DECOMP_CORE1,
-	HZIP_DECOMP_CORE2,
-	HZIP_DECOMP_CORE3,
-	HZIP_DECOMP_CORE4,
-	HZIP_DECOMP_CORE5,
-};
-
-static const u64 core_offsets[] = {
-	[HZIP_COMP_CORE0]   = 0x302000,
-	[HZIP_COMP_CORE1]   = 0x303000,
-	[HZIP_DECOMP_CORE0] = 0x304000,
-	[HZIP_DECOMP_CORE1] = 0x305000,
-	[HZIP_DECOMP_CORE2] = 0x306000,
-	[HZIP_DECOMP_CORE3] = 0x307000,
-	[HZIP_DECOMP_CORE4] = 0x308000,
-	[HZIP_DECOMP_CORE5] = 0x309000,
-};
-
-static const struct debugfs_reg32 hzip_dfx_regs[] = {
-	{"HZIP_GET_BD_NUM                ",  0x00ull},
-	{"HZIP_GET_RIGHT_BD              ",  0x04ull},
-	{"HZIP_GET_ERROR_BD              ",  0x08ull},
-	{"HZIP_DONE_BD_NUM               ",  0x0cull},
-	{"HZIP_WORK_CYCLE                ",  0x10ull},
-	{"HZIP_IDLE_CYCLE                ",  0x18ull},
-	{"HZIP_MAX_DELAY                 ",  0x20ull},
-	{"HZIP_MIN_DELAY                 ",  0x24ull},
-	{"HZIP_AVG_DELAY                 ",  0x28ull},
-	{"HZIP_MEM_VISIBLE_DATA          ",  0x30ull},
-	{"HZIP_MEM_VISIBLE_ADDR          ",  0x34ull},
-	{"HZIP_CONSUMED_BYTE             ",  0x38ull},
-	{"HZIP_PRODUCED_BYTE             ",  0x40ull},
-	{"HZIP_COMP_INF                  ",  0x70ull},
-	{"HZIP_PRE_OUT                   ",  0x78ull},
-	{"HZIP_BD_RD                     ",  0x7cull},
-	{"HZIP_BD_WR                     ",  0x80ull},
-	{"HZIP_GET_BD_AXI_ERR_NUM        ",  0x84ull},
-	{"HZIP_GET_BD_PARSE_ERR_NUM      ",  0x88ull},
-	{"HZIP_ADD_BD_AXI_ERR_NUM        ",  0x8cull},
-	{"HZIP_DECOMP_STF_RELOAD_CURR_ST ",  0x94ull},
-	{"HZIP_DECOMP_LZ77_CURR_ST       ",  0x9cull},
-};
-
-static const struct debugfs_reg32 hzip_com_dfx_regs[] = {
-	{"HZIP_CLOCK_GATE_CTRL           ",  0x301004},
-	{"HZIP_CORE_INT_RAS_CE_ENB       ",  0x301160},
-	{"HZIP_CORE_INT_RAS_NFE_ENB      ",  0x301164},
-	{"HZIP_CORE_INT_RAS_FE_ENB       ",  0x301168},
-	{"HZIP_UNCOM_ERR_RAS_CTRL        ",  0x30116C},
-};
-
-static const struct debugfs_reg32 hzip_dump_dfx_regs[] = {
-	{"HZIP_GET_BD_NUM                ",  0x00ull},
-	{"HZIP_GET_RIGHT_BD              ",  0x04ull},
-	{"HZIP_GET_ERROR_BD              ",  0x08ull},
-	{"HZIP_DONE_BD_NUM               ",  0x0cull},
-	{"HZIP_MAX_DELAY                 ",  0x20ull},
-};
-
-/* define the ZIP's dfx regs region and region length */
-static struct dfx_diff_registers hzip_diff_regs[] = {
-	{
-		.reg_offset = HZIP_CORE_DFX_BASE,
-		.reg_len = HZIP_CORE_REGS_BASE_LEN,
-	}, {
-		.reg_offset = HZIP_CORE_DFX_COMP_0,
-		.reg_len = HZIP_CORE_REGS_DFX_LEN,
-	}, {
-		.reg_offset = HZIP_CORE_DFX_COMP_1,
-		.reg_len = HZIP_CORE_REGS_DFX_LEN,
-	}, {
-		.reg_offset = HZIP_CORE_DFX_DECOMP_0,
-		.reg_len = HZIP_CORE_REGS_DFX_LEN,
-	}, {
-		.reg_offset = HZIP_CORE_DFX_DECOMP_1,
-		.reg_len = HZIP_CORE_REGS_DFX_LEN,
-	}, {
-		.reg_offset = HZIP_CORE_DFX_DECOMP_2,
-		.reg_len = HZIP_CORE_REGS_DFX_LEN,
-	}, {
-		.reg_offset = HZIP_CORE_DFX_DECOMP_3,
-		.reg_len = HZIP_CORE_REGS_DFX_LEN,
-	}, {
-		.reg_offset = HZIP_CORE_DFX_DECOMP_4,
-		.reg_len = HZIP_CORE_REGS_DFX_LEN,
-	}, {
-		.reg_offset = HZIP_CORE_DFX_DECOMP_5,
-		.reg_len = HZIP_CORE_REGS_DFX_LEN,
-	},
-};
-
-static int hzip_diff_regs_show(struct seq_file *s, void *unused)
-{
-	struct hisi_qm *qm = s->private;
-
-	hisi_qm_acc_diff_regs_dump(qm, s, qm->debug.acc_diff_regs,
-					ARRAY_SIZE(hzip_diff_regs));
-
-	return 0;
-}
-DEFINE_SHOW_ATTRIBUTE(hzip_diff_regs);
-static const struct kernel_param_ops zip_uacce_mode_ops = {
-	.set = uacce_mode_set,
-	.get = param_get_int,
-};
-
-/*
- * uacce_mode = 0 means zip only register to crypto,
- * uacce_mode = 1 means zip both register to crypto and uacce.
- */
-static u32 uacce_mode = UACCE_MODE_NOUACCE;
-module_param_cb(uacce_mode, &zip_uacce_mode_ops, &uacce_mode, 0444);
-MODULE_PARM_DESC(uacce_mode, UACCE_MODE_DESC);
-
-static int pf_q_num_set(const char *val, const struct kernel_param *kp)
-{
-	return q_num_set(val, kp, PCI_DEVICE_ID_HUAWEI_ZIP_PF);
-}
-
-static const struct kernel_param_ops pf_q_num_ops = {
-	.set = pf_q_num_set,
-	.get = param_get_int,
-};
-
-static u32 pf_q_num = HZIP_PF_DEF_Q_NUM;
-module_param_cb(pf_q_num, &pf_q_num_ops, &pf_q_num, 0444);
-MODULE_PARM_DESC(pf_q_num, "Number of queues in PF(v1 2-4096, v2 2-1024)");
-
-static const struct kernel_param_ops vfs_num_ops = {
-	.set = vfs_num_set,
-	.get = param_get_int,
-};
-
-static u32 vfs_num;
-module_param_cb(vfs_num, &vfs_num_ops, &vfs_num, 0444);
-MODULE_PARM_DESC(vfs_num, "Number of VFs to enable(1-63), 0(default)");
-
-static const struct pci_device_id hisi_zip_dev_ids[] = {
-	{ PCI_DEVICE(PCI_VENDOR_ID_HUAWEI, PCI_DEVICE_ID_HUAWEI_ZIP_PF) },
-	{ PCI_DEVICE(PCI_VENDOR_ID_HUAWEI, PCI_DEVICE_ID_HUAWEI_ZIP_VF) },
-	{ 0, }
-};
-MODULE_DEVICE_TABLE(pci, hisi_zip_dev_ids);
-
-int zip_create_qps(struct hisi_qp **qps, int qp_num, int node)
-{
-	if (node == NUMA_NO_NODE)
-		node = cpu_to_node(smp_processor_id());
-
-	return hisi_qm_alloc_qps_node(&zip_devices, qp_num, 0, node, qps);
-}
-
-bool hisi_zip_alg_support(struct hisi_qm *qm, u32 alg)
-{
-	u32 cap_val;
-
-	cap_val = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_DRV_ALG_BITMAP, qm->cap_ver);
-	if ((alg & cap_val) == alg)
-		return true;
-
-	return false;
-}
-
-static int hisi_zip_set_qm_algs(struct hisi_qm *qm)
-{
-	struct device *dev = &qm->pdev->dev;
-	char *algs, *ptr;
-	u32 alg_mask;
-	int i;
-
-	if (!qm->use_sva)
-		return 0;
-
-	algs = devm_kzalloc(dev, HZIP_DEV_ALG_MAX_LEN * sizeof(char), GFP_KERNEL);
-	if (!algs)
-		return -ENOMEM;
-
-	alg_mask = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_DEV_ALG_BITMAP, qm->cap_ver);
-
-	for (i = 0; i < ARRAY_SIZE(zip_dev_algs); i++)
-		if (alg_mask & zip_dev_algs[i].alg_msk)
-			strcat(algs, zip_dev_algs[i].algs);
-
-	ptr = strrchr(algs, '\n');
-	if (ptr)
-		*ptr = '\0';
-
-	qm->uacce->algs = algs;
-
-	return 0;
-}
-
-static void hisi_zip_open_sva_prefetch(struct hisi_qm *qm)
-{
-	u32 val;
-	int ret;
-
-	if (!test_bit(QM_SUPPORT_SVA_PREFETCH, &qm->caps))
-		return;
-
-	/* Enable prefetch */
-	val = readl_relaxed(qm->io_base + HZIP_PREFETCH_CFG);
-	val &= HZIP_PREFETCH_ENABLE;
-	writel(val, qm->io_base + HZIP_PREFETCH_CFG);
-
-	ret = readl_relaxed_poll_timeout(qm->io_base + HZIP_PREFETCH_CFG,
-					 val, !(val & HZIP_SVA_PREFETCH_DISABLE),
-					 HZIP_DELAY_1_US, HZIP_POLL_TIMEOUT_US);
-	if (ret)
-		pci_err(qm->pdev, "failed to open sva prefetch\n");
-}
-
-static void hisi_zip_close_sva_prefetch(struct hisi_qm *qm)
-{
-	u32 val;
-	int ret;
-
-	if (!test_bit(QM_SUPPORT_SVA_PREFETCH, &qm->caps))
-		return;
-
-	val = readl_relaxed(qm->io_base + HZIP_PREFETCH_CFG);
-	val |= HZIP_SVA_PREFETCH_DISABLE;
-	writel(val, qm->io_base + HZIP_PREFETCH_CFG);
-
-	ret = readl_relaxed_poll_timeout(qm->io_base + HZIP_SVA_TRANS,
-					 val, !(val & HZIP_SVA_DISABLE_READY),
-					 HZIP_DELAY_1_US, HZIP_POLL_TIMEOUT_US);
-	if (ret)
-		pci_err(qm->pdev, "failed to close sva prefetch\n");
-}
-
-static void hisi_zip_enable_clock_gate(struct hisi_qm *qm)
-{
-	u32 val;
-
-	if (qm->ver < QM_HW_V3)
-		return;
-
-	val = readl(qm->io_base + HZIP_CLOCK_GATE_CTRL);
-	val |= HZIP_CLOCK_GATED_EN;
-	writel(val, qm->io_base + HZIP_CLOCK_GATE_CTRL);
-
-	val = readl(qm->io_base + HZIP_PEH_CFG_AUTO_GATE);
-	val |= HZIP_PEH_CFG_AUTO_GATE_EN;
-	writel(val, qm->io_base + HZIP_PEH_CFG_AUTO_GATE);
-}
-
-static int hisi_zip_set_user_domain_and_cache(struct hisi_qm *qm)
-{
-	void __iomem *base = qm->io_base;
-	u32 dcomp_bm, comp_bm;
-
-	/* qm user domain */
-	writel(AXUSER_BASE, base + QM_ARUSER_M_CFG_1);
-	writel(ARUSER_M_CFG_ENABLE, base + QM_ARUSER_M_CFG_ENABLE);
-	writel(AXUSER_BASE, base + QM_AWUSER_M_CFG_1);
-	writel(AWUSER_M_CFG_ENABLE, base + QM_AWUSER_M_CFG_ENABLE);
-	writel(WUSER_M_CFG_ENABLE, base + QM_WUSER_M_CFG_ENABLE);
-
-	/* qm cache */
-	writel(AXI_M_CFG, base + QM_AXI_M_CFG);
-	writel(AXI_M_CFG_ENABLE, base + QM_AXI_M_CFG_ENABLE);
-
-	/* disable FLR triggered by BME(bus master enable) */
-	writel(PEH_AXUSER_CFG, base + QM_PEH_AXUSER_CFG);
-	writel(PEH_AXUSER_CFG_ENABLE, base + QM_PEH_AXUSER_CFG_ENABLE);
-
-	/* cache */
-	writel(HZIP_CACHE_ALL_EN, base + HZIP_PORT_ARCA_CHE_0);
-	writel(HZIP_CACHE_ALL_EN, base + HZIP_PORT_ARCA_CHE_1);
-	writel(HZIP_CACHE_ALL_EN, base + HZIP_PORT_AWCA_CHE_0);
-	writel(HZIP_CACHE_ALL_EN, base + HZIP_PORT_AWCA_CHE_1);
-
-	/* user domain configurations */
-	writel(AXUSER_BASE, base + HZIP_BD_RUSER_32_63);
-	writel(AXUSER_BASE, base + HZIP_BD_WUSER_32_63);
-
-	if (qm->use_sva && qm->ver == QM_HW_V2) {
-		writel(AXUSER_BASE | AXUSER_SSV, base + HZIP_DATA_RUSER_32_63);
-		writel(AXUSER_BASE | AXUSER_SSV, base + HZIP_DATA_WUSER_32_63);
-		writel(AXUSER_BASE | AXUSER_SSV, base + HZIP_SGL_RUSER_32_63);
-	} else {
-		writel(AXUSER_BASE, base + HZIP_DATA_RUSER_32_63);
-		writel(AXUSER_BASE, base + HZIP_DATA_WUSER_32_63);
-		writel(AXUSER_BASE, base + HZIP_SGL_RUSER_32_63);
-	}
-
-	/* let's open all compression/decompression cores */
-	dcomp_bm = hisi_qm_get_hw_info(qm, zip_basic_cap_info,
-				       ZIP_DECOMP_ENABLE_BITMAP, qm->cap_ver);
-	comp_bm = hisi_qm_get_hw_info(qm, zip_basic_cap_info,
-				      ZIP_COMP_ENABLE_BITMAP, qm->cap_ver);
-	writel(HZIP_DECOMP_CHECK_ENABLE | dcomp_bm | comp_bm, base + HZIP_CLOCK_GATE_CTRL);
-
-	/* enable sqc,cqc writeback */
-	writel(SQC_CACHE_ENABLE | CQC_CACHE_ENABLE | SQC_CACHE_WB_ENABLE |
-	       CQC_CACHE_WB_ENABLE | FIELD_PREP(SQC_CACHE_WB_THRD, 1) |
-	       FIELD_PREP(CQC_CACHE_WB_THRD, 1), base + QM_CACHE_CTL);
-
-	hisi_zip_enable_clock_gate(qm);
-
-	return 0;
-}
-
-static void hisi_zip_master_ooo_ctrl(struct hisi_qm *qm, bool enable)
-{
-	u32 val1, val2;
-
-	val1 = readl(qm->io_base + HZIP_SOFT_CTRL_ZIP_CONTROL);
-	if (enable) {
-		val1 |= HZIP_AXI_SHUTDOWN_ENABLE;
-		val2 = hisi_qm_get_hw_info(qm, zip_basic_cap_info,
-				ZIP_OOO_SHUTDOWN_MASK_CAP, qm->cap_ver);
-	} else {
-		val1 &= ~HZIP_AXI_SHUTDOWN_ENABLE;
-		val2 = 0x0;
-	}
-
-	if (qm->ver > QM_HW_V2)
-		writel(val2, qm->io_base + HZIP_OOO_SHUTDOWN_SEL);
-
-	writel(val1, qm->io_base + HZIP_SOFT_CTRL_ZIP_CONTROL);
-}
-
-static void hisi_zip_hw_error_enable(struct hisi_qm *qm)
-{
-	u32 nfe, ce;
-
-	if (qm->ver == QM_HW_V1) {
-		writel(HZIP_CORE_INT_MASK_ALL,
-		       qm->io_base + HZIP_CORE_INT_MASK_REG);
-		dev_info(&qm->pdev->dev, "Does not support hw error handle\n");
-		return;
-	}
-
-	nfe = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_NFE_MASK_CAP, qm->cap_ver);
-	ce = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CE_MASK_CAP, qm->cap_ver);
-
-	/* clear ZIP hw error source if having */
-	writel(ce | nfe | HZIP_CORE_INT_RAS_FE_ENB_MASK, qm->io_base + HZIP_CORE_INT_SOURCE);
-
-	/* configure error type */
-	writel(ce, qm->io_base + HZIP_CORE_INT_RAS_CE_ENB);
-	writel(HZIP_CORE_INT_RAS_FE_ENB_MASK, qm->io_base + HZIP_CORE_INT_RAS_FE_ENB);
-	writel(nfe, qm->io_base + HZIP_CORE_INT_RAS_NFE_ENB);
-
-	hisi_zip_master_ooo_ctrl(qm, true);
-
-	/* enable ZIP hw error interrupts */
-	writel(0, qm->io_base + HZIP_CORE_INT_MASK_REG);
-}
-
-static void hisi_zip_hw_error_disable(struct hisi_qm *qm)
-{
-	u32 nfe, ce;
-
-	/* disable ZIP hw error interrupts */
-	nfe = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_NFE_MASK_CAP, qm->cap_ver);
-	ce = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CE_MASK_CAP, qm->cap_ver);
-	writel(ce | nfe | HZIP_CORE_INT_RAS_FE_ENB_MASK, qm->io_base + HZIP_CORE_INT_MASK_REG);
-
-	hisi_zip_master_ooo_ctrl(qm, false);
-}
-
-static inline struct hisi_qm *file_to_qm(struct ctrl_debug_file *file)
-{
-	struct hisi_zip *hisi_zip = file->ctrl->hisi_zip;
-
-	return &hisi_zip->qm;
-}
-
-static u32 clear_enable_read(struct hisi_qm *qm)
-{
-	return readl(qm->io_base + HZIP_SOFT_CTRL_CNT_CLR_CE) &
-		     HZIP_SOFT_CTRL_CNT_CLR_CE_BIT;
-}
-
-static int clear_enable_write(struct hisi_qm *qm, u32 val)
-{
-	u32 tmp;
-
-	if (val != 1 && val != 0)
-		return -EINVAL;
-
-	tmp = (readl(qm->io_base + HZIP_SOFT_CTRL_CNT_CLR_CE) &
-	       ~HZIP_SOFT_CTRL_CNT_CLR_CE_BIT) | val;
-	writel(tmp, qm->io_base + HZIP_SOFT_CTRL_CNT_CLR_CE);
-
-	return  0;
-}
-
-static ssize_t hisi_zip_ctrl_debug_read(struct file *filp, char __user *buf,
-					size_t count, loff_t *pos)
-{
-	struct ctrl_debug_file *file = filp->private_data;
-	struct hisi_qm *qm = file_to_qm(file);
-	char tbuf[HZIP_BUF_SIZE];
-	u32 val;
-	int ret;
-
-	ret = hisi_qm_get_dfx_access(qm);
-	if (ret)
-		return ret;
-
-	spin_lock_irq(&file->lock);
-	switch (file->index) {
-	case HZIP_CLEAR_ENABLE:
-		val = clear_enable_read(qm);
-		break;
-	default:
-		goto err_input;
-	}
-	spin_unlock_irq(&file->lock);
-
-	hisi_qm_put_dfx_access(qm);
-	ret = scnprintf(tbuf, sizeof(tbuf), "%u\n", val);
-	return simple_read_from_buffer(buf, count, pos, tbuf, ret);
-
-err_input:
-	spin_unlock_irq(&file->lock);
-	hisi_qm_put_dfx_access(qm);
-	return -EINVAL;
-}
-
-static ssize_t hisi_zip_ctrl_debug_write(struct file *filp,
-					 const char __user *buf,
-					 size_t count, loff_t *pos)
-{
-	struct ctrl_debug_file *file = filp->private_data;
-	struct hisi_qm *qm = file_to_qm(file);
-	char tbuf[HZIP_BUF_SIZE];
-	unsigned long val;
-	int len, ret;
-
-	if (*pos != 0)
-		return 0;
-
-	if (count >= HZIP_BUF_SIZE)
-		return -ENOSPC;
-
-	len = simple_write_to_buffer(tbuf, HZIP_BUF_SIZE - 1, pos, buf, count);
-	if (len < 0)
-		return len;
-
-	tbuf[len] = '\0';
-	ret = kstrtoul(tbuf, 0, &val);
-	if (ret)
-		return ret;
-
-	ret = hisi_qm_get_dfx_access(qm);
-	if (ret)
-		return ret;
-
-	spin_lock_irq(&file->lock);
-	switch (file->index) {
-	case HZIP_CLEAR_ENABLE:
-		ret = clear_enable_write(qm, val);
-		if (ret)
-			goto err_input;
-		break;
-	default:
-		ret = -EINVAL;
-		goto err_input;
-	}
-
-	ret = count;
-
-err_input:
-	spin_unlock_irq(&file->lock);
-	hisi_qm_put_dfx_access(qm);
-	return ret;
-}
-
-static const struct file_operations ctrl_debug_fops = {
-	.owner = THIS_MODULE,
-	.open = simple_open,
-	.read = hisi_zip_ctrl_debug_read,
-	.write = hisi_zip_ctrl_debug_write,
-};
-
-static int zip_debugfs_atomic64_set(void *data, u64 val)
-{
-	if (val)
-		return -EINVAL;
-
-	atomic64_set((atomic64_t *)data, 0);
-
-	return 0;
-}
-
-static int zip_debugfs_atomic64_get(void *data, u64 *val)
-{
-	*val = atomic64_read((atomic64_t *)data);
-
-	return 0;
-}
-
-DEFINE_DEBUGFS_ATTRIBUTE(zip_atomic64_ops, zip_debugfs_atomic64_get,
-			 zip_debugfs_atomic64_set, "%llu\n");
-
-static int hisi_zip_regs_show(struct seq_file *s, void *unused)
-{
-	hisi_qm_regs_dump(s, s->private);
-
-	return 0;
-}
-
-DEFINE_SHOW_ATTRIBUTE(hisi_zip_regs);
-
-static int hisi_zip_core_debug_init(struct hisi_qm *qm)
-{
-	u32 zip_core_num, zip_comp_core_num;
-	struct device *dev = &qm->pdev->dev;
-	struct debugfs_regset32 *regset;
-	struct dentry *tmp_d;
-	char buf[HZIP_BUF_SIZE];
-	int i;
-
-	zip_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CORE_NUM_CAP, qm->cap_ver);
-	zip_comp_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CLUSTER_COMP_NUM_CAP,
-						qm->cap_ver);
-
-	for (i = 0; i < zip_core_num; i++) {
-		if (i < zip_comp_core_num)
-			scnprintf(buf, sizeof(buf), "comp_core%d", i);
-		else
-			scnprintf(buf, sizeof(buf), "decomp_core%d",
-				  i - zip_comp_core_num);
-
-		regset = devm_kzalloc(dev, sizeof(*regset), GFP_KERNEL);
-		if (!regset)
-			return -ENOENT;
-
-		regset->regs = hzip_dfx_regs;
-		regset->nregs = ARRAY_SIZE(hzip_dfx_regs);
-		regset->base = qm->io_base + core_offsets[i];
-		regset->dev = dev;
-
-		tmp_d = debugfs_create_dir(buf, qm->debug.debug_root);
-		debugfs_create_file("regs", 0444, tmp_d, regset,
-				    &hisi_zip_regs_fops);
-	}
-
-	return 0;
-}
-
-static void hisi_zip_dfx_debug_init(struct hisi_qm *qm)
-{
-	struct dfx_diff_registers *hzip_regs = qm->debug.acc_diff_regs;
-	struct hisi_zip *zip = container_of(qm, struct hisi_zip, qm);
-	struct hisi_zip_dfx *dfx = &zip->dfx;
-	struct dentry *tmp_dir;
-	void *data;
-	int i;
-
-	tmp_dir = debugfs_create_dir("zip_dfx", qm->debug.debug_root);
-	for (i = 0; i < ARRAY_SIZE(zip_dfx_files); i++) {
-		data = (atomic64_t *)((uintptr_t)dfx + zip_dfx_files[i].offset);
-		debugfs_create_file(zip_dfx_files[i].name,
-				    0644, tmp_dir, data,
-				    &zip_atomic64_ops);
-	}
-
-	if (qm->fun_type == QM_HW_PF && hzip_regs)
-		debugfs_create_file("diff_regs", 0444, tmp_dir,
-				      qm, &hzip_diff_regs_fops);
-}
-
-static int hisi_zip_ctrl_debug_init(struct hisi_qm *qm)
-{
-	struct hisi_zip *zip = container_of(qm, struct hisi_zip, qm);
-	int i;
-
-	for (i = HZIP_CLEAR_ENABLE; i < HZIP_DEBUG_FILE_NUM; i++) {
-		spin_lock_init(&zip->ctrl->files[i].lock);
-		zip->ctrl->files[i].ctrl = zip->ctrl;
-		zip->ctrl->files[i].index = i;
-
-		debugfs_create_file(ctrl_debug_file_name[i], 0600,
-				    qm->debug.debug_root,
-				    zip->ctrl->files + i,
-				    &ctrl_debug_fops);
-	}
-
-	return hisi_zip_core_debug_init(qm);
-}
-
-static int hisi_zip_debugfs_init(struct hisi_qm *qm)
-{
-	struct device *dev = &qm->pdev->dev;
-	struct dentry *dev_d;
-	int ret;
-
-	dev_d = debugfs_create_dir(dev_name(dev), hzip_debugfs_root);
-
-	qm->debug.sqe_mask_offset = HZIP_SQE_MASK_OFFSET;
-	qm->debug.sqe_mask_len = HZIP_SQE_MASK_LEN;
-	qm->debug.debug_root = dev_d;
-	ret = hisi_qm_regs_debugfs_init(qm, hzip_diff_regs, ARRAY_SIZE(hzip_diff_regs));
-	if (ret) {
-		dev_warn(dev, "Failed to init ZIP diff regs!\n");
-		goto debugfs_remove;
-	}
-
-	hisi_qm_debug_init(qm);
-
-	if (qm->fun_type == QM_HW_PF) {
-		ret = hisi_zip_ctrl_debug_init(qm);
-		if (ret)
-			goto failed_to_create;
-	}
-
-	hisi_zip_dfx_debug_init(qm);
-
-	return 0;
-
-failed_to_create:
-	hisi_qm_regs_debugfs_uninit(qm, ARRAY_SIZE(hzip_diff_regs));
-debugfs_remove:
-	debugfs_remove_recursive(hzip_debugfs_root);
-	return ret;
-}
-
-/* hisi_zip_debug_regs_clear() - clear the zip debug regs */
-static void hisi_zip_debug_regs_clear(struct hisi_qm *qm)
-{
-	int i, j;
-
-	/* enable register read_clear bit */
-	writel(HZIP_RD_CNT_CLR_CE_EN, qm->io_base + HZIP_SOFT_CTRL_CNT_CLR_CE);
-	for (i = 0; i < ARRAY_SIZE(core_offsets); i++)
-		for (j = 0; j < ARRAY_SIZE(hzip_dfx_regs); j++)
-			readl(qm->io_base + core_offsets[i] +
-			      hzip_dfx_regs[j].offset);
-
-	/* disable register read_clear bit */
-	writel(0x0, qm->io_base + HZIP_SOFT_CTRL_CNT_CLR_CE);
-
-	hisi_qm_debug_regs_clear(qm);
-}
-
-static void hisi_zip_debugfs_exit(struct hisi_qm *qm)
-{
-	hisi_qm_regs_debugfs_uninit(qm, ARRAY_SIZE(hzip_diff_regs));
-
-	debugfs_remove_recursive(qm->debug.debug_root);
-
-	if (qm->fun_type == QM_HW_PF) {
-		hisi_zip_debug_regs_clear(qm);
-		qm->debug.curr_qm_qp_num = 0;
-	}
-}
-
-static int hisi_zip_show_last_regs_init(struct hisi_qm *qm)
-{
-	int core_dfx_regs_num =  ARRAY_SIZE(hzip_dump_dfx_regs);
-	int com_dfx_regs_num = ARRAY_SIZE(hzip_com_dfx_regs);
-	struct qm_debug *debug = &qm->debug;
-	void __iomem *io_base;
-	u32 zip_core_num;
-	int i, j, idx;
-
-	zip_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CORE_NUM_CAP, qm->cap_ver);
-
-	debug->last_words = kcalloc(core_dfx_regs_num * zip_core_num + com_dfx_regs_num,
-				    sizeof(unsigned int), GFP_KERNEL);
-	if (!debug->last_words)
-		return -ENOMEM;
-
-	for (i = 0; i < com_dfx_regs_num; i++) {
-		io_base = qm->io_base + hzip_com_dfx_regs[i].offset;
-		debug->last_words[i] = readl_relaxed(io_base);
-	}
-
-	for (i = 0; i < zip_core_num; i++) {
-		io_base = qm->io_base + core_offsets[i];
-		for (j = 0; j < core_dfx_regs_num; j++) {
-			idx = com_dfx_regs_num + i * core_dfx_regs_num + j;
-			debug->last_words[idx] = readl_relaxed(
-				io_base + hzip_dump_dfx_regs[j].offset);
-		}
-	}
-
-	return 0;
-}
-
-static void hisi_zip_show_last_regs_uninit(struct hisi_qm *qm)
-{
-	struct qm_debug *debug = &qm->debug;
-
-	if (qm->fun_type == QM_HW_VF || !debug->last_words)
-		return;
-
-	kfree(debug->last_words);
-	debug->last_words = NULL;
-}
-
-static void hisi_zip_show_last_dfx_regs(struct hisi_qm *qm)
-{
-	int core_dfx_regs_num =  ARRAY_SIZE(hzip_dump_dfx_regs);
-	int com_dfx_regs_num = ARRAY_SIZE(hzip_com_dfx_regs);
-	u32 zip_core_num, zip_comp_core_num;
-	struct qm_debug *debug = &qm->debug;
-	char buf[HZIP_BUF_SIZE];
-	void __iomem *base;
-	int i, j, idx;
-	u32 val;
-
-	if (qm->fun_type == QM_HW_VF || !debug->last_words)
-		return;
-
-	for (i = 0; i < com_dfx_regs_num; i++) {
-		val = readl_relaxed(qm->io_base + hzip_com_dfx_regs[i].offset);
-		if (debug->last_words[i] != val)
-			pci_info(qm->pdev, "com_dfx: %s \t= 0x%08x => 0x%08x\n",
-				 hzip_com_dfx_regs[i].name, debug->last_words[i], val);
-	}
-
-	zip_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CORE_NUM_CAP, qm->cap_ver);
-	zip_comp_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CLUSTER_COMP_NUM_CAP,
-						qm->cap_ver);
-	for (i = 0; i < zip_core_num; i++) {
-		if (i < zip_comp_core_num)
-			scnprintf(buf, sizeof(buf), "Comp_core-%d", i);
-		else
-			scnprintf(buf, sizeof(buf), "Decomp_core-%d",
-				  i - zip_comp_core_num);
-		base = qm->io_base + core_offsets[i];
-
-		pci_info(qm->pdev, "==>%s:\n", buf);
-		/* dump last word for dfx regs during control resetting */
-		for (j = 0; j < core_dfx_regs_num; j++) {
-			idx = com_dfx_regs_num + i * core_dfx_regs_num + j;
-			val = readl_relaxed(base + hzip_dump_dfx_regs[j].offset);
-			if (debug->last_words[idx] != val)
-				pci_info(qm->pdev, "%s \t= 0x%08x => 0x%08x\n",
-					 hzip_dump_dfx_regs[j].name,
-					 debug->last_words[idx], val);
-		}
-	}
-}
-
-static void hisi_zip_log_hw_error(struct hisi_qm *qm, u32 err_sts)
-{
-	const struct hisi_zip_hw_error *err = zip_hw_error;
-	struct device *dev = &qm->pdev->dev;
-	u32 err_val;
-
-	while (err->msg) {
-		if (err->int_msk & err_sts) {
-			dev_err(dev, "%s [error status=0x%x] found\n",
-				err->msg, err->int_msk);
-
-			if (err->int_msk & HZIP_CORE_INT_STATUS_M_ECC) {
-				err_val = readl(qm->io_base +
-						HZIP_CORE_SRAM_ECC_ERR_INFO);
-				dev_err(dev, "hisi-zip multi ecc sram num=0x%x\n",
-					((err_val >>
-					HZIP_SRAM_ECC_ERR_NUM_SHIFT) & 0xFF));
-			}
-		}
-		err++;
-	}
-}
-
-static u32 hisi_zip_get_hw_err_status(struct hisi_qm *qm)
-{
-	return readl(qm->io_base + HZIP_CORE_INT_STATUS);
-}
-
-static void hisi_zip_clear_hw_err_status(struct hisi_qm *qm, u32 err_sts)
-{
-	u32 nfe;
-
-	writel(err_sts, qm->io_base + HZIP_CORE_INT_SOURCE);
-	nfe = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_NFE_MASK_CAP, qm->cap_ver);
-	writel(nfe, qm->io_base + HZIP_CORE_INT_RAS_NFE_ENB);
-}
-
-static void hisi_zip_open_axi_master_ooo(struct hisi_qm *qm)
-{
-	u32 val;
-
-	val = readl(qm->io_base + HZIP_SOFT_CTRL_ZIP_CONTROL);
-
-	writel(val & ~HZIP_AXI_SHUTDOWN_ENABLE,
-	       qm->io_base + HZIP_SOFT_CTRL_ZIP_CONTROL);
-
-	writel(val | HZIP_AXI_SHUTDOWN_ENABLE,
-	       qm->io_base + HZIP_SOFT_CTRL_ZIP_CONTROL);
-}
-
-static void hisi_zip_close_axi_master_ooo(struct hisi_qm *qm)
-{
-	u32 nfe_enb;
-
-	/* Disable ECC Mbit error report. */
-	nfe_enb = readl(qm->io_base + HZIP_CORE_INT_RAS_NFE_ENB);
-	writel(nfe_enb & ~HZIP_CORE_INT_STATUS_M_ECC,
-	       qm->io_base + HZIP_CORE_INT_RAS_NFE_ENB);
-
-	/* Inject zip ECC Mbit error to block master ooo. */
-	writel(HZIP_CORE_INT_STATUS_M_ECC,
-	       qm->io_base + HZIP_CORE_INT_SET);
-}
-
-static void hisi_zip_err_info_init(struct hisi_qm *qm)
-{
-	struct hisi_qm_err_info *err_info = &qm->err_info;
-
-	err_info->fe = HZIP_CORE_INT_RAS_FE_ENB_MASK;
-	err_info->ce = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_QM_CE_MASK_CAP, qm->cap_ver);
-	err_info->nfe = hisi_qm_get_hw_info(qm, zip_basic_cap_info,
-					    ZIP_QM_NFE_MASK_CAP, qm->cap_ver);
-	err_info->ecc_2bits_mask = HZIP_CORE_INT_STATUS_M_ECC;
-	err_info->qm_shutdown_mask = hisi_qm_get_hw_info(qm, zip_basic_cap_info,
-							 ZIP_QM_OOO_SHUTDOWN_MASK_CAP, qm->cap_ver);
-	err_info->dev_shutdown_mask = hisi_qm_get_hw_info(qm, zip_basic_cap_info,
-							  ZIP_OOO_SHUTDOWN_MASK_CAP, qm->cap_ver);
-	err_info->qm_reset_mask = hisi_qm_get_hw_info(qm, zip_basic_cap_info,
-						      ZIP_QM_RESET_MASK_CAP, qm->cap_ver);
-	err_info->dev_reset_mask = hisi_qm_get_hw_info(qm, zip_basic_cap_info,
-						       ZIP_RESET_MASK_CAP, qm->cap_ver);
-	err_info->msi_wr_port = HZIP_WR_PORT;
-	err_info->acpi_rst = "ZRST";
-}
-
-static const struct hisi_qm_err_ini hisi_zip_err_ini = {
-	.hw_init		= hisi_zip_set_user_domain_and_cache,
-	.hw_err_enable		= hisi_zip_hw_error_enable,
-	.hw_err_disable		= hisi_zip_hw_error_disable,
-	.get_dev_hw_err_status	= hisi_zip_get_hw_err_status,
-	.clear_dev_hw_err_status = hisi_zip_clear_hw_err_status,
-	.log_dev_hw_err		= hisi_zip_log_hw_error,
-	.open_axi_master_ooo	= hisi_zip_open_axi_master_ooo,
-	.close_axi_master_ooo	= hisi_zip_close_axi_master_ooo,
-	.open_sva_prefetch	= hisi_zip_open_sva_prefetch,
-	.close_sva_prefetch	= hisi_zip_close_sva_prefetch,
-	.show_last_dfx_regs	= hisi_zip_show_last_dfx_regs,
-	.err_info_init		= hisi_zip_err_info_init,
-};
-
-static int hisi_zip_pf_probe_init(struct hisi_zip *hisi_zip)
-{
-	struct hisi_qm *qm = &hisi_zip->qm;
-	struct hisi_zip_ctrl *ctrl;
-	int ret;
-
-	ctrl = devm_kzalloc(&qm->pdev->dev, sizeof(*ctrl), GFP_KERNEL);
-	if (!ctrl)
-		return -ENOMEM;
-
-	hisi_zip->ctrl = ctrl;
-	ctrl->hisi_zip = hisi_zip;
-	qm->err_ini = &hisi_zip_err_ini;
-	qm->err_ini->err_info_init(qm);
-
-	ret = hisi_zip_set_user_domain_and_cache(qm);
-	if (ret)
-		return ret;
-
-	hisi_zip_open_sva_prefetch(qm);
-	hisi_qm_dev_err_init(qm);
-	hisi_zip_debug_regs_clear(qm);
-
-	ret = hisi_zip_show_last_regs_init(qm);
-	if (ret)
-		pci_err(qm->pdev, "Failed to init last word regs!\n");
-
-	return ret;
-}
-
-static int hisi_zip_qm_init(struct hisi_qm *qm, struct pci_dev *pdev)
-{
-	int ret;
-
-	qm->pdev = pdev;
-	qm->ver = pdev->revision;
-	qm->mode = uacce_mode;
-	qm->sqe_size = HZIP_SQE_SIZE;
-	qm->dev_name = hisi_zip_name;
-
-	qm->fun_type = (pdev->device == PCI_DEVICE_ID_HUAWEI_ZIP_PF) ?
-			QM_HW_PF : QM_HW_VF;
-	if (qm->fun_type == QM_HW_PF) {
-		qm->qp_base = HZIP_PF_DEF_Q_BASE;
-		qm->qp_num = pf_q_num;
-		qm->debug.curr_qm_qp_num = pf_q_num;
-		qm->qm_list = &zip_devices;
-	} else if (qm->fun_type == QM_HW_VF && qm->ver == QM_HW_V1) {
-		/*
-		 * have no way to get qm configure in VM in v1 hardware,
-		 * so currently force PF to uses HZIP_PF_DEF_Q_NUM, and force
-		 * to trigger only one VF in v1 hardware.
-		 *
-		 * v2 hardware has no such problem.
-		 */
-		qm->qp_base = HZIP_PF_DEF_Q_NUM;
-		qm->qp_num = HZIP_QUEUE_NUM_V1 - HZIP_PF_DEF_Q_NUM;
-	}
-
-	ret = hisi_qm_init(qm);
-	if (ret) {
-		pci_err(qm->pdev, "Failed to init zip qm configures!\n");
-		return ret;
-	}
-
-	ret = hisi_zip_set_qm_algs(qm);
-	if (ret) {
-		pci_err(qm->pdev, "Failed to set zip algs!\n");
-		hisi_qm_uninit(qm);
-	}
-
-	return ret;
-}
-
-static void hisi_zip_qm_uninit(struct hisi_qm *qm)
-{
-	hisi_qm_uninit(qm);
-}
-
-static int hisi_zip_probe_init(struct hisi_zip *hisi_zip)
-{
-	u32 type_rate = HZIP_SHAPER_RATE_COMPRESS;
-	struct hisi_qm *qm = &hisi_zip->qm;
-	int ret;
-
-	if (qm->fun_type == QM_HW_PF) {
-		ret = hisi_zip_pf_probe_init(hisi_zip);
-		if (ret)
-			return ret;
-		/* enable shaper type 0 */
-		if (qm->ver >= QM_HW_V3) {
-			type_rate |= QM_SHAPER_ENABLE;
-
-			/* ZIP need to enable shaper type 1 */
-			type_rate |= HZIP_SHAPER_RATE_DECOMPRESS << QM_SHAPER_TYPE1_OFFSET;
-			qm->type_rate = type_rate;
-		}
-	}
-
-	return 0;
-}
-
-static int hisi_zip_probe(struct pci_dev *pdev, const struct pci_device_id *id)
-{
-	struct hisi_zip *hisi_zip;
-	struct hisi_qm *qm;
-	int ret;
-
-	hisi_zip = devm_kzalloc(&pdev->dev, sizeof(*hisi_zip), GFP_KERNEL);
-	if (!hisi_zip)
-		return -ENOMEM;
-
-	qm = &hisi_zip->qm;
-
-	ret = hisi_zip_qm_init(qm, pdev);
-	if (ret) {
-		pci_err(pdev, "Failed to init ZIP QM (%d)!\n", ret);
-		return ret;
-	}
-
-	ret = hisi_zip_probe_init(hisi_zip);
-	if (ret) {
-		pci_err(pdev, "Failed to probe (%d)!\n", ret);
-		goto err_qm_uninit;
-	}
-
-	ret = hisi_qm_start(qm);
-	if (ret)
-		goto err_dev_err_uninit;
-
-	ret = hisi_zip_debugfs_init(qm);
-	if (ret)
-		pci_err(pdev, "failed to init debugfs (%d)!\n", ret);
-
-	ret = hisi_qm_alg_register(qm, &zip_devices);
-	if (ret < 0) {
-		pci_err(pdev, "failed to register driver to crypto!\n");
-		goto err_qm_stop;
-	}
-
-	if (qm->uacce) {
-		ret = uacce_register(qm->uacce);
-		if (ret) {
-			pci_err(pdev, "failed to register uacce (%d)!\n", ret);
-			goto err_qm_alg_unregister;
-		}
-	}
-
-	if (qm->fun_type == QM_HW_PF && vfs_num > 0) {
-		ret = hisi_qm_sriov_enable(pdev, vfs_num);
-		if (ret < 0)
-			goto err_qm_alg_unregister;
-	}
-
-	hisi_qm_pm_init(qm);
-
-	return 0;
-
-err_qm_alg_unregister:
-	hisi_qm_alg_unregister(qm, &zip_devices);
-
-err_qm_stop:
-	hisi_zip_debugfs_exit(qm);
-	hisi_qm_stop(qm, QM_NORMAL);
-
-err_dev_err_uninit:
-	hisi_zip_show_last_regs_uninit(qm);
-	hisi_qm_dev_err_uninit(qm);
-
-err_qm_uninit:
-	hisi_zip_qm_uninit(qm);
-
-	return ret;
-}
-
-static void hisi_zip_remove(struct pci_dev *pdev)
-{
-	struct hisi_qm *qm = pci_get_drvdata(pdev);
-
-	hisi_qm_pm_uninit(qm);
-	hisi_qm_wait_task_finish(qm, &zip_devices);
-	hisi_qm_alg_unregister(qm, &zip_devices);
-
-	if (qm->fun_type == QM_HW_PF && qm->vfs_num)
-		hisi_qm_sriov_disable(pdev, true);
-
-	hisi_zip_debugfs_exit(qm);
-	hisi_qm_stop(qm, QM_NORMAL);
-	hisi_zip_show_last_regs_uninit(qm);
-	hisi_qm_dev_err_uninit(qm);
-	hisi_zip_qm_uninit(qm);
-}
-
-static const struct dev_pm_ops hisi_zip_pm_ops = {
-	SET_RUNTIME_PM_OPS(hisi_qm_suspend, hisi_qm_resume, NULL)
-};
-
-static const struct pci_error_handlers hisi_zip_err_handler = {
-	.error_detected	= hisi_qm_dev_err_detected,
-	.slot_reset	= hisi_qm_dev_slot_reset,
-	.reset_prepare	= hisi_qm_reset_prepare,
-	.reset_done	= hisi_qm_reset_done,
-};
-
-static struct pci_driver hisi_zip_pci_driver = {
-	.name			= "hisi_zip",
-	.id_table		= hisi_zip_dev_ids,
-	.probe			= hisi_zip_probe,
-	.remove			= hisi_zip_remove,
-	.sriov_configure	= IS_ENABLED(CONFIG_PCI_IOV) ?
-					hisi_qm_sriov_configure : NULL,
-	.err_handler		= &hisi_zip_err_handler,
-	.shutdown		= hisi_qm_dev_shutdown,
-	.driver.pm		= &hisi_zip_pm_ops,
-};
-
-struct pci_driver *hisi_zip_get_pf_driver(void)
-{
-	return &hisi_zip_pci_driver;
-}
-EXPORT_SYMBOL_GPL(hisi_zip_get_pf_driver);
-
-static void hisi_zip_register_debugfs(void)
-{
-	if (!debugfs_initialized())
-		return;
-
-	hzip_debugfs_root = debugfs_create_dir("hisi_zip", NULL);
-}
-
-static void hisi_zip_unregister_debugfs(void)
-{
-	debugfs_remove_recursive(hzip_debugfs_root);
-}
-
-static int __init hisi_zip_init(void)
-{
-	int ret;
-
-	hisi_qm_init_list(&zip_devices);
-	hisi_zip_register_debugfs();
-
-	ret = pci_register_driver(&hisi_zip_pci_driver);
-	if (ret < 0) {
-		hisi_zip_unregister_debugfs();
-		pr_err("Failed to register pci driver.\n");
-	}
-
-	return ret;
-}
-
-static void __exit hisi_zip_exit(void)
-{
-	pci_unregister_driver(&hisi_zip_pci_driver);
-	hisi_zip_unregister_debugfs();
-}
-
-module_init(hisi_zip_init);
-module_exit(hisi_zip_exit);
-
-MODULE_LICENSE("GPL v2");
-MODULE_AUTHOR("Zhou Wang <wangzhou1@xxxxxxxxxxxxx>");
-MODULE_DESCRIPTION("Driver for HiSilicon ZIP accelerator");





[Index of Archives]     [Kernel]     [Gnu Classpath]     [Gnu Crypto]     [DM Crypt]     [Netfilter]     [Bugtraq]
  Powered by Linux