Commit 7e81aaa1 authored by Yang Shen's avatar Yang Shen Committed by JiangShui
Browse files

crypto: hisilicon/zip - support deflate algorithm

maillist inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I8D4NG
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c97795014672



----------------------------------------------------------------------

Add the deflate algorithm support for hisilicon zip hardware.

Signed-off-by: default avatarYang Shen <shenyang39@huawei.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarJiangShui Yang <yangjiangshui@h-partners.com>
parent 4d4c15c4
Loading
Loading
Loading
Loading
+70 −16
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#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_DEFLATE			0x01
#define HZIP_ALG_TYPE_ZLIB			0x02
#define HZIP_ALG_TYPE_GZIP			0x03
#define HZIP_BUF_TYPE_M				GENMASK(11, 8)
@@ -41,6 +42,7 @@

#define HZIP_ALG_ZLIB				GENMASK(1, 0)
#define HZIP_ALG_GZIP				GENMASK(3, 2)
#define HZIP_ALG_DEFLATE			GENMASK(5, 4)

static const u8 zlib_head[HZIP_ZLIB_HEAD_SIZE] = {0x78, 0x9c};
static const u8 gzip_head[HZIP_GZIP_HEAD_SIZE] = {
@@ -59,8 +61,9 @@ enum {
};

#define COMP_NAME_TO_TYPE(alg_name)					\
	(!strcmp((alg_name), "deflate") ? HZIP_ALG_TYPE_DEFLATE :	\
	(!strcmp((alg_name), "zlib-deflate") ? HZIP_ALG_TYPE_ZLIB :	\
	 !strcmp((alg_name), "gzip") ? HZIP_ALG_TYPE_GZIP : 0)		\
	 !strcmp((alg_name), "gzip") ? HZIP_ALG_TYPE_GZIP : 0))		\

#define TO_HEAD_SIZE(req_type)						\
	(((req_type) == HZIP_ALG_TYPE_ZLIB) ? sizeof(zlib_head) :	\
@@ -447,16 +450,18 @@ static int hisi_zip_acompress(struct acomp_req *acomp_req)
	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 head_size = 0;
	int ret;

	/* let's output compression head now */
	if (qp_ctx->qp->req_type != HZIP_ALG_TYPE_DEFLATE) {
		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))
@@ -477,14 +482,16 @@ static int hisi_zip_adecompress(struct acomp_req *acomp_req)
	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;
	int head_size = 0, ret;

	if (qp_ctx->qp->req_type != HZIP_ALG_TYPE_DEFLATE) {
		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))
@@ -745,6 +752,42 @@ static void hisi_zip_acomp_exit(struct crypto_acomp *tfm)
	hisi_zip_ctx_exit(ctx);
}

static struct acomp_alg hisi_zip_acomp_deflate = {
	.init			= hisi_zip_acomp_init,
	.exit			= hisi_zip_acomp_exit,
	.compress		= hisi_zip_acompress,
	.decompress		= hisi_zip_adecompress,
	.base			= {
		.cra_name		= "deflate",
		.cra_driver_name	= "hisi-deflate-acomp",
		.cra_module		= THIS_MODULE,
		.cra_priority		= HZIP_ALG_PRIORITY,
		.cra_ctxsize		= sizeof(struct hisi_zip_ctx),
	}
};

static int hisi_zip_register_deflate(struct hisi_qm *qm)
{
	int ret;

	if (!hisi_zip_alg_support(qm, HZIP_ALG_DEFLATE))
		return 0;

	ret = crypto_register_acomp(&hisi_zip_acomp_deflate);
	if (ret)
		dev_err(&qm->pdev->dev, "failed to register to deflate (%d)!\n", ret);

	return ret;
}

static void hisi_zip_unregister_deflate(struct hisi_qm *qm)
{
	if (!hisi_zip_alg_support(qm, HZIP_ALG_DEFLATE))
		return;

	crypto_unregister_acomp(&hisi_zip_acomp_deflate);
}

static struct acomp_alg hisi_zip_acomp_zlib = {
	.init			= hisi_zip_acomp_init,
	.exit			= hisi_zip_acomp_exit,
@@ -821,19 +864,30 @@ int hisi_zip_register_to_crypto(struct hisi_qm *qm)
{
	int ret = 0;

	ret = hisi_zip_register_zlib(qm);
	ret = hisi_zip_register_deflate(qm);
	if (ret)
		return ret;

	ret = hisi_zip_register_zlib(qm);
	if (ret)
		goto err_unreg_deflate;

	ret = hisi_zip_register_gzip(qm);
	if (ret)
		hisi_zip_unregister_zlib(qm);
		goto err_unreg_zlib;

	return 0;

err_unreg_zlib:
	hisi_zip_unregister_zlib(qm);
err_unreg_deflate:
	hisi_zip_unregister_deflate(qm);
	return ret;
}

void hisi_zip_unregister_from_crypto(struct hisi_qm *qm)
{
	hisi_zip_unregister_deflate(qm);
	hisi_zip_unregister_zlib(qm);
	hisi_zip_unregister_gzip(qm);
}
+2 −2
Original line number Diff line number Diff line
@@ -231,8 +231,8 @@ static struct hisi_qm_cap_info zip_basic_cap_info[] = {
	{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_DRV_ALG_BITMAP, 0x3144, 0, GENMASK(31, 0), 0xF, 0xF, 0x3F},
	{ZIP_DEV_ALG_BITMAP, 0x3148, 0, GENMASK(31, 0), 0xF, 0xF, 0x3F},
	{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},