18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Freescale FSL CAAM support for crypto API over QI backend.
48c2ecf20Sopenharmony_ci * Based on caamalg.c
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Copyright 2013-2016 Freescale Semiconductor, Inc.
78c2ecf20Sopenharmony_ci * Copyright 2016-2019 NXP
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include "compat.h"
118c2ecf20Sopenharmony_ci#include "ctrl.h"
128c2ecf20Sopenharmony_ci#include "regs.h"
138c2ecf20Sopenharmony_ci#include "intern.h"
148c2ecf20Sopenharmony_ci#include "desc_constr.h"
158c2ecf20Sopenharmony_ci#include "error.h"
168c2ecf20Sopenharmony_ci#include "sg_sw_qm.h"
178c2ecf20Sopenharmony_ci#include "key_gen.h"
188c2ecf20Sopenharmony_ci#include "qi.h"
198c2ecf20Sopenharmony_ci#include "jr.h"
208c2ecf20Sopenharmony_ci#include "caamalg_desc.h"
218c2ecf20Sopenharmony_ci#include <crypto/xts.h>
228c2ecf20Sopenharmony_ci#include <asm/unaligned.h>
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci/*
258c2ecf20Sopenharmony_ci * crypto alg
268c2ecf20Sopenharmony_ci */
278c2ecf20Sopenharmony_ci#define CAAM_CRA_PRIORITY		2000
288c2ecf20Sopenharmony_ci/* max key is sum of AES_MAX_KEY_SIZE, max split key size */
298c2ecf20Sopenharmony_ci#define CAAM_MAX_KEY_SIZE		(AES_MAX_KEY_SIZE + \
308c2ecf20Sopenharmony_ci					 SHA512_DIGEST_SIZE * 2)
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci#define DESC_MAX_USED_BYTES		(DESC_QI_AEAD_GIVENC_LEN + \
338c2ecf20Sopenharmony_ci					 CAAM_MAX_KEY_SIZE)
348c2ecf20Sopenharmony_ci#define DESC_MAX_USED_LEN		(DESC_MAX_USED_BYTES / CAAM_CMD_SZ)
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_cistruct caam_alg_entry {
378c2ecf20Sopenharmony_ci	int class1_alg_type;
388c2ecf20Sopenharmony_ci	int class2_alg_type;
398c2ecf20Sopenharmony_ci	bool rfc3686;
408c2ecf20Sopenharmony_ci	bool geniv;
418c2ecf20Sopenharmony_ci	bool nodkp;
428c2ecf20Sopenharmony_ci};
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cistruct caam_aead_alg {
458c2ecf20Sopenharmony_ci	struct aead_alg aead;
468c2ecf20Sopenharmony_ci	struct caam_alg_entry caam;
478c2ecf20Sopenharmony_ci	bool registered;
488c2ecf20Sopenharmony_ci};
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_cistruct caam_skcipher_alg {
518c2ecf20Sopenharmony_ci	struct skcipher_alg skcipher;
528c2ecf20Sopenharmony_ci	struct caam_alg_entry caam;
538c2ecf20Sopenharmony_ci	bool registered;
548c2ecf20Sopenharmony_ci};
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci/*
578c2ecf20Sopenharmony_ci * per-session context
588c2ecf20Sopenharmony_ci */
598c2ecf20Sopenharmony_cistruct caam_ctx {
608c2ecf20Sopenharmony_ci	struct device *jrdev;
618c2ecf20Sopenharmony_ci	u32 sh_desc_enc[DESC_MAX_USED_LEN];
628c2ecf20Sopenharmony_ci	u32 sh_desc_dec[DESC_MAX_USED_LEN];
638c2ecf20Sopenharmony_ci	u8 key[CAAM_MAX_KEY_SIZE];
648c2ecf20Sopenharmony_ci	dma_addr_t key_dma;
658c2ecf20Sopenharmony_ci	enum dma_data_direction dir;
668c2ecf20Sopenharmony_ci	struct alginfo adata;
678c2ecf20Sopenharmony_ci	struct alginfo cdata;
688c2ecf20Sopenharmony_ci	unsigned int authsize;
698c2ecf20Sopenharmony_ci	struct device *qidev;
708c2ecf20Sopenharmony_ci	spinlock_t lock;	/* Protects multiple init of driver context */
718c2ecf20Sopenharmony_ci	struct caam_drv_ctx *drv_ctx[NUM_OP];
728c2ecf20Sopenharmony_ci	bool xts_key_fallback;
738c2ecf20Sopenharmony_ci	struct crypto_skcipher *fallback;
748c2ecf20Sopenharmony_ci};
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_cistruct caam_skcipher_req_ctx {
778c2ecf20Sopenharmony_ci	struct skcipher_request fallback_req;
788c2ecf20Sopenharmony_ci};
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_cistatic int aead_set_sh_desc(struct crypto_aead *aead)
818c2ecf20Sopenharmony_ci{
828c2ecf20Sopenharmony_ci	struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),
838c2ecf20Sopenharmony_ci						 typeof(*alg), aead);
848c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
858c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
868c2ecf20Sopenharmony_ci	u32 ctx1_iv_off = 0;
878c2ecf20Sopenharmony_ci	u32 *nonce = NULL;
888c2ecf20Sopenharmony_ci	unsigned int data_len[2];
898c2ecf20Sopenharmony_ci	u32 inl_mask;
908c2ecf20Sopenharmony_ci	const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) ==
918c2ecf20Sopenharmony_ci			       OP_ALG_AAI_CTR_MOD128);
928c2ecf20Sopenharmony_ci	const bool is_rfc3686 = alg->caam.rfc3686;
938c2ecf20Sopenharmony_ci	struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctx->jrdev->parent);
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen || !ctx->authsize)
968c2ecf20Sopenharmony_ci		return 0;
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	/*
998c2ecf20Sopenharmony_ci	 * AES-CTR needs to load IV in CONTEXT1 reg
1008c2ecf20Sopenharmony_ci	 * at an offset of 128bits (16bytes)
1018c2ecf20Sopenharmony_ci	 * CONTEXT1[255:128] = IV
1028c2ecf20Sopenharmony_ci	 */
1038c2ecf20Sopenharmony_ci	if (ctr_mode)
1048c2ecf20Sopenharmony_ci		ctx1_iv_off = 16;
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ci	/*
1078c2ecf20Sopenharmony_ci	 * RFC3686 specific:
1088c2ecf20Sopenharmony_ci	 *	CONTEXT1[255:128] = {NONCE, IV, COUNTER}
1098c2ecf20Sopenharmony_ci	 */
1108c2ecf20Sopenharmony_ci	if (is_rfc3686) {
1118c2ecf20Sopenharmony_ci		ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;
1128c2ecf20Sopenharmony_ci		nonce = (u32 *)((void *)ctx->key + ctx->adata.keylen_pad +
1138c2ecf20Sopenharmony_ci				ctx->cdata.keylen - CTR_RFC3686_NONCE_SIZE);
1148c2ecf20Sopenharmony_ci	}
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci	/*
1178c2ecf20Sopenharmony_ci	 * In case |user key| > |derived key|, using DKP<imm,imm> would result
1188c2ecf20Sopenharmony_ci	 * in invalid opcodes (last bytes of user key) in the resulting
1198c2ecf20Sopenharmony_ci	 * descriptor. Use DKP<ptr,imm> instead => both virtual and dma key
1208c2ecf20Sopenharmony_ci	 * addresses are needed.
1218c2ecf20Sopenharmony_ci	 */
1228c2ecf20Sopenharmony_ci	ctx->adata.key_virt = ctx->key;
1238c2ecf20Sopenharmony_ci	ctx->adata.key_dma = ctx->key_dma;
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = ctx->key + ctx->adata.keylen_pad;
1268c2ecf20Sopenharmony_ci	ctx->cdata.key_dma = ctx->key_dma + ctx->adata.keylen_pad;
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ci	data_len[0] = ctx->adata.keylen_pad;
1298c2ecf20Sopenharmony_ci	data_len[1] = ctx->cdata.keylen;
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci	if (alg->caam.geniv)
1328c2ecf20Sopenharmony_ci		goto skip_enc;
1338c2ecf20Sopenharmony_ci
1348c2ecf20Sopenharmony_ci	/* aead_encrypt shared descriptor */
1358c2ecf20Sopenharmony_ci	if (desc_inline_query(DESC_QI_AEAD_ENC_LEN +
1368c2ecf20Sopenharmony_ci			      (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
1378c2ecf20Sopenharmony_ci			      DESC_JOB_IO_LEN, data_len, &inl_mask,
1388c2ecf20Sopenharmony_ci			      ARRAY_SIZE(data_len)) < 0)
1398c2ecf20Sopenharmony_ci		return -EINVAL;
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_ci	ctx->adata.key_inline = !!(inl_mask & 1);
1428c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = !!(inl_mask & 2);
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_ci	cnstr_shdsc_aead_encap(ctx->sh_desc_enc, &ctx->cdata, &ctx->adata,
1458c2ecf20Sopenharmony_ci			       ivsize, ctx->authsize, is_rfc3686, nonce,
1468c2ecf20Sopenharmony_ci			       ctx1_iv_off, true, ctrlpriv->era);
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_ciskip_enc:
1498c2ecf20Sopenharmony_ci	/* aead_decrypt shared descriptor */
1508c2ecf20Sopenharmony_ci	if (desc_inline_query(DESC_QI_AEAD_DEC_LEN +
1518c2ecf20Sopenharmony_ci			      (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
1528c2ecf20Sopenharmony_ci			      DESC_JOB_IO_LEN, data_len, &inl_mask,
1538c2ecf20Sopenharmony_ci			      ARRAY_SIZE(data_len)) < 0)
1548c2ecf20Sopenharmony_ci		return -EINVAL;
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci	ctx->adata.key_inline = !!(inl_mask & 1);
1578c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = !!(inl_mask & 2);
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci	cnstr_shdsc_aead_decap(ctx->sh_desc_dec, &ctx->cdata, &ctx->adata,
1608c2ecf20Sopenharmony_ci			       ivsize, ctx->authsize, alg->caam.geniv,
1618c2ecf20Sopenharmony_ci			       is_rfc3686, nonce, ctx1_iv_off, true,
1628c2ecf20Sopenharmony_ci			       ctrlpriv->era);
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_ci	if (!alg->caam.geniv)
1658c2ecf20Sopenharmony_ci		goto skip_givenc;
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_ci	/* aead_givencrypt shared descriptor */
1688c2ecf20Sopenharmony_ci	if (desc_inline_query(DESC_QI_AEAD_GIVENC_LEN +
1698c2ecf20Sopenharmony_ci			      (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
1708c2ecf20Sopenharmony_ci			      DESC_JOB_IO_LEN, data_len, &inl_mask,
1718c2ecf20Sopenharmony_ci			      ARRAY_SIZE(data_len)) < 0)
1728c2ecf20Sopenharmony_ci		return -EINVAL;
1738c2ecf20Sopenharmony_ci
1748c2ecf20Sopenharmony_ci	ctx->adata.key_inline = !!(inl_mask & 1);
1758c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = !!(inl_mask & 2);
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_ci	cnstr_shdsc_aead_givencap(ctx->sh_desc_enc, &ctx->cdata, &ctx->adata,
1788c2ecf20Sopenharmony_ci				  ivsize, ctx->authsize, is_rfc3686, nonce,
1798c2ecf20Sopenharmony_ci				  ctx1_iv_off, true, ctrlpriv->era);
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ciskip_givenc:
1828c2ecf20Sopenharmony_ci	return 0;
1838c2ecf20Sopenharmony_ci}
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_cistatic int aead_setauthsize(struct crypto_aead *authenc, unsigned int authsize)
1868c2ecf20Sopenharmony_ci{
1878c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
1908c2ecf20Sopenharmony_ci	aead_set_sh_desc(authenc);
1918c2ecf20Sopenharmony_ci
1928c2ecf20Sopenharmony_ci	return 0;
1938c2ecf20Sopenharmony_ci}
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_cistatic int aead_setkey(struct crypto_aead *aead, const u8 *key,
1968c2ecf20Sopenharmony_ci		       unsigned int keylen)
1978c2ecf20Sopenharmony_ci{
1988c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
1998c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
2008c2ecf20Sopenharmony_ci	struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
2018c2ecf20Sopenharmony_ci	struct crypto_authenc_keys keys;
2028c2ecf20Sopenharmony_ci	int ret = 0;
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_ci	if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
2058c2ecf20Sopenharmony_ci		goto badkey;
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci	dev_dbg(jrdev, "keylen %d enckeylen %d authkeylen %d\n",
2088c2ecf20Sopenharmony_ci		keys.authkeylen + keys.enckeylen, keys.enckeylen,
2098c2ecf20Sopenharmony_ci		keys.authkeylen);
2108c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",
2118c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ci	/*
2148c2ecf20Sopenharmony_ci	 * If DKP is supported, use it in the shared descriptor to generate
2158c2ecf20Sopenharmony_ci	 * the split key.
2168c2ecf20Sopenharmony_ci	 */
2178c2ecf20Sopenharmony_ci	if (ctrlpriv->era >= 6) {
2188c2ecf20Sopenharmony_ci		ctx->adata.keylen = keys.authkeylen;
2198c2ecf20Sopenharmony_ci		ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype &
2208c2ecf20Sopenharmony_ci						      OP_ALG_ALGSEL_MASK);
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_ci		if (ctx->adata.keylen_pad + keys.enckeylen > CAAM_MAX_KEY_SIZE)
2238c2ecf20Sopenharmony_ci			goto badkey;
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci		memcpy(ctx->key, keys.authkey, keys.authkeylen);
2268c2ecf20Sopenharmony_ci		memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey,
2278c2ecf20Sopenharmony_ci		       keys.enckeylen);
2288c2ecf20Sopenharmony_ci		dma_sync_single_for_device(jrdev->parent, ctx->key_dma,
2298c2ecf20Sopenharmony_ci					   ctx->adata.keylen_pad +
2308c2ecf20Sopenharmony_ci					   keys.enckeylen, ctx->dir);
2318c2ecf20Sopenharmony_ci		goto skip_split_key;
2328c2ecf20Sopenharmony_ci	}
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_ci	ret = gen_split_key(jrdev, ctx->key, &ctx->adata, keys.authkey,
2358c2ecf20Sopenharmony_ci			    keys.authkeylen, CAAM_MAX_KEY_SIZE -
2368c2ecf20Sopenharmony_ci			    keys.enckeylen);
2378c2ecf20Sopenharmony_ci	if (ret)
2388c2ecf20Sopenharmony_ci		goto badkey;
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_ci	/* postpend encryption key to auth split key */
2418c2ecf20Sopenharmony_ci	memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, keys.enckeylen);
2428c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev->parent, ctx->key_dma,
2438c2ecf20Sopenharmony_ci				   ctx->adata.keylen_pad + keys.enckeylen,
2448c2ecf20Sopenharmony_ci				   ctx->dir);
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci	print_hex_dump_debug("ctx.key@" __stringify(__LINE__)": ",
2478c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, ctx->key,
2488c2ecf20Sopenharmony_ci			     ctx->adata.keylen_pad + keys.enckeylen, 1);
2498c2ecf20Sopenharmony_ci
2508c2ecf20Sopenharmony_ciskip_split_key:
2518c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keys.enckeylen;
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci	ret = aead_set_sh_desc(aead);
2548c2ecf20Sopenharmony_ci	if (ret)
2558c2ecf20Sopenharmony_ci		goto badkey;
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_ci	/* Now update the driver contexts with the new shared descriptor */
2588c2ecf20Sopenharmony_ci	if (ctx->drv_ctx[ENCRYPT]) {
2598c2ecf20Sopenharmony_ci		ret = caam_drv_ctx_update(ctx->drv_ctx[ENCRYPT],
2608c2ecf20Sopenharmony_ci					  ctx->sh_desc_enc);
2618c2ecf20Sopenharmony_ci		if (ret) {
2628c2ecf20Sopenharmony_ci			dev_err(jrdev, "driver enc context update failed\n");
2638c2ecf20Sopenharmony_ci			goto badkey;
2648c2ecf20Sopenharmony_ci		}
2658c2ecf20Sopenharmony_ci	}
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci	if (ctx->drv_ctx[DECRYPT]) {
2688c2ecf20Sopenharmony_ci		ret = caam_drv_ctx_update(ctx->drv_ctx[DECRYPT],
2698c2ecf20Sopenharmony_ci					  ctx->sh_desc_dec);
2708c2ecf20Sopenharmony_ci		if (ret) {
2718c2ecf20Sopenharmony_ci			dev_err(jrdev, "driver dec context update failed\n");
2728c2ecf20Sopenharmony_ci			goto badkey;
2738c2ecf20Sopenharmony_ci		}
2748c2ecf20Sopenharmony_ci	}
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci	memzero_explicit(&keys, sizeof(keys));
2778c2ecf20Sopenharmony_ci	return ret;
2788c2ecf20Sopenharmony_cibadkey:
2798c2ecf20Sopenharmony_ci	memzero_explicit(&keys, sizeof(keys));
2808c2ecf20Sopenharmony_ci	return -EINVAL;
2818c2ecf20Sopenharmony_ci}
2828c2ecf20Sopenharmony_ci
2838c2ecf20Sopenharmony_cistatic int des3_aead_setkey(struct crypto_aead *aead, const u8 *key,
2848c2ecf20Sopenharmony_ci			    unsigned int keylen)
2858c2ecf20Sopenharmony_ci{
2868c2ecf20Sopenharmony_ci	struct crypto_authenc_keys keys;
2878c2ecf20Sopenharmony_ci	int err;
2888c2ecf20Sopenharmony_ci
2898c2ecf20Sopenharmony_ci	err = crypto_authenc_extractkeys(&keys, key, keylen);
2908c2ecf20Sopenharmony_ci	if (unlikely(err))
2918c2ecf20Sopenharmony_ci		return err;
2928c2ecf20Sopenharmony_ci
2938c2ecf20Sopenharmony_ci	err = verify_aead_des3_key(aead, keys.enckey, keys.enckeylen) ?:
2948c2ecf20Sopenharmony_ci	      aead_setkey(aead, key, keylen);
2958c2ecf20Sopenharmony_ci
2968c2ecf20Sopenharmony_ci	memzero_explicit(&keys, sizeof(keys));
2978c2ecf20Sopenharmony_ci	return err;
2988c2ecf20Sopenharmony_ci}
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_cistatic int gcm_set_sh_desc(struct crypto_aead *aead)
3018c2ecf20Sopenharmony_ci{
3028c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
3038c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
3048c2ecf20Sopenharmony_ci	int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN -
3058c2ecf20Sopenharmony_ci			ctx->cdata.keylen;
3068c2ecf20Sopenharmony_ci
3078c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen || !ctx->authsize)
3088c2ecf20Sopenharmony_ci		return 0;
3098c2ecf20Sopenharmony_ci
3108c2ecf20Sopenharmony_ci	/*
3118c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptor
3128c2ecf20Sopenharmony_ci	 * must fit into the 64-word Descriptor h/w Buffer
3138c2ecf20Sopenharmony_ci	 */
3148c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_QI_GCM_ENC_LEN) {
3158c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
3168c2ecf20Sopenharmony_ci		ctx->cdata.key_virt = ctx->key;
3178c2ecf20Sopenharmony_ci	} else {
3188c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
3198c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
3208c2ecf20Sopenharmony_ci	}
3218c2ecf20Sopenharmony_ci
3228c2ecf20Sopenharmony_ci	cnstr_shdsc_gcm_encap(ctx->sh_desc_enc, &ctx->cdata, ivsize,
3238c2ecf20Sopenharmony_ci			      ctx->authsize, true);
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_ci	/*
3268c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptor
3278c2ecf20Sopenharmony_ci	 * must fit into the 64-word Descriptor h/w Buffer
3288c2ecf20Sopenharmony_ci	 */
3298c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_QI_GCM_DEC_LEN) {
3308c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
3318c2ecf20Sopenharmony_ci		ctx->cdata.key_virt = ctx->key;
3328c2ecf20Sopenharmony_ci	} else {
3338c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
3348c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
3358c2ecf20Sopenharmony_ci	}
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ci	cnstr_shdsc_gcm_decap(ctx->sh_desc_dec, &ctx->cdata, ivsize,
3388c2ecf20Sopenharmony_ci			      ctx->authsize, true);
3398c2ecf20Sopenharmony_ci
3408c2ecf20Sopenharmony_ci	return 0;
3418c2ecf20Sopenharmony_ci}
3428c2ecf20Sopenharmony_ci
3438c2ecf20Sopenharmony_cistatic int gcm_setauthsize(struct crypto_aead *authenc, unsigned int authsize)
3448c2ecf20Sopenharmony_ci{
3458c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
3468c2ecf20Sopenharmony_ci	int err;
3478c2ecf20Sopenharmony_ci
3488c2ecf20Sopenharmony_ci	err = crypto_gcm_check_authsize(authsize);
3498c2ecf20Sopenharmony_ci	if (err)
3508c2ecf20Sopenharmony_ci		return err;
3518c2ecf20Sopenharmony_ci
3528c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
3538c2ecf20Sopenharmony_ci	gcm_set_sh_desc(authenc);
3548c2ecf20Sopenharmony_ci
3558c2ecf20Sopenharmony_ci	return 0;
3568c2ecf20Sopenharmony_ci}
3578c2ecf20Sopenharmony_ci
3588c2ecf20Sopenharmony_cistatic int gcm_setkey(struct crypto_aead *aead,
3598c2ecf20Sopenharmony_ci		      const u8 *key, unsigned int keylen)
3608c2ecf20Sopenharmony_ci{
3618c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
3628c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
3638c2ecf20Sopenharmony_ci	int ret;
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_ci	ret = aes_check_keylen(keylen);
3668c2ecf20Sopenharmony_ci	if (ret)
3678c2ecf20Sopenharmony_ci		return ret;
3688c2ecf20Sopenharmony_ci
3698c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",
3708c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
3718c2ecf20Sopenharmony_ci
3728c2ecf20Sopenharmony_ci	memcpy(ctx->key, key, keylen);
3738c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev->parent, ctx->key_dma, keylen,
3748c2ecf20Sopenharmony_ci				   ctx->dir);
3758c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen;
3768c2ecf20Sopenharmony_ci
3778c2ecf20Sopenharmony_ci	ret = gcm_set_sh_desc(aead);
3788c2ecf20Sopenharmony_ci	if (ret)
3798c2ecf20Sopenharmony_ci		return ret;
3808c2ecf20Sopenharmony_ci
3818c2ecf20Sopenharmony_ci	/* Now update the driver contexts with the new shared descriptor */
3828c2ecf20Sopenharmony_ci	if (ctx->drv_ctx[ENCRYPT]) {
3838c2ecf20Sopenharmony_ci		ret = caam_drv_ctx_update(ctx->drv_ctx[ENCRYPT],
3848c2ecf20Sopenharmony_ci					  ctx->sh_desc_enc);
3858c2ecf20Sopenharmony_ci		if (ret) {
3868c2ecf20Sopenharmony_ci			dev_err(jrdev, "driver enc context update failed\n");
3878c2ecf20Sopenharmony_ci			return ret;
3888c2ecf20Sopenharmony_ci		}
3898c2ecf20Sopenharmony_ci	}
3908c2ecf20Sopenharmony_ci
3918c2ecf20Sopenharmony_ci	if (ctx->drv_ctx[DECRYPT]) {
3928c2ecf20Sopenharmony_ci		ret = caam_drv_ctx_update(ctx->drv_ctx[DECRYPT],
3938c2ecf20Sopenharmony_ci					  ctx->sh_desc_dec);
3948c2ecf20Sopenharmony_ci		if (ret) {
3958c2ecf20Sopenharmony_ci			dev_err(jrdev, "driver dec context update failed\n");
3968c2ecf20Sopenharmony_ci			return ret;
3978c2ecf20Sopenharmony_ci		}
3988c2ecf20Sopenharmony_ci	}
3998c2ecf20Sopenharmony_ci
4008c2ecf20Sopenharmony_ci	return 0;
4018c2ecf20Sopenharmony_ci}
4028c2ecf20Sopenharmony_ci
4038c2ecf20Sopenharmony_cistatic int rfc4106_set_sh_desc(struct crypto_aead *aead)
4048c2ecf20Sopenharmony_ci{
4058c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
4068c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
4078c2ecf20Sopenharmony_ci	int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN -
4088c2ecf20Sopenharmony_ci			ctx->cdata.keylen;
4098c2ecf20Sopenharmony_ci
4108c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen || !ctx->authsize)
4118c2ecf20Sopenharmony_ci		return 0;
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = ctx->key;
4148c2ecf20Sopenharmony_ci
4158c2ecf20Sopenharmony_ci	/*
4168c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptor
4178c2ecf20Sopenharmony_ci	 * must fit into the 64-word Descriptor h/w Buffer
4188c2ecf20Sopenharmony_ci	 */
4198c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_QI_RFC4106_ENC_LEN) {
4208c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
4218c2ecf20Sopenharmony_ci	} else {
4228c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
4238c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
4248c2ecf20Sopenharmony_ci	}
4258c2ecf20Sopenharmony_ci
4268c2ecf20Sopenharmony_ci	cnstr_shdsc_rfc4106_encap(ctx->sh_desc_enc, &ctx->cdata, ivsize,
4278c2ecf20Sopenharmony_ci				  ctx->authsize, true);
4288c2ecf20Sopenharmony_ci
4298c2ecf20Sopenharmony_ci	/*
4308c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptor
4318c2ecf20Sopenharmony_ci	 * must fit into the 64-word Descriptor h/w Buffer
4328c2ecf20Sopenharmony_ci	 */
4338c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_QI_RFC4106_DEC_LEN) {
4348c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
4358c2ecf20Sopenharmony_ci	} else {
4368c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
4378c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
4388c2ecf20Sopenharmony_ci	}
4398c2ecf20Sopenharmony_ci
4408c2ecf20Sopenharmony_ci	cnstr_shdsc_rfc4106_decap(ctx->sh_desc_dec, &ctx->cdata, ivsize,
4418c2ecf20Sopenharmony_ci				  ctx->authsize, true);
4428c2ecf20Sopenharmony_ci
4438c2ecf20Sopenharmony_ci	return 0;
4448c2ecf20Sopenharmony_ci}
4458c2ecf20Sopenharmony_ci
4468c2ecf20Sopenharmony_cistatic int rfc4106_setauthsize(struct crypto_aead *authenc,
4478c2ecf20Sopenharmony_ci			       unsigned int authsize)
4488c2ecf20Sopenharmony_ci{
4498c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
4508c2ecf20Sopenharmony_ci	int err;
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_ci	err = crypto_rfc4106_check_authsize(authsize);
4538c2ecf20Sopenharmony_ci	if (err)
4548c2ecf20Sopenharmony_ci		return err;
4558c2ecf20Sopenharmony_ci
4568c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
4578c2ecf20Sopenharmony_ci	rfc4106_set_sh_desc(authenc);
4588c2ecf20Sopenharmony_ci
4598c2ecf20Sopenharmony_ci	return 0;
4608c2ecf20Sopenharmony_ci}
4618c2ecf20Sopenharmony_ci
4628c2ecf20Sopenharmony_cistatic int rfc4106_setkey(struct crypto_aead *aead,
4638c2ecf20Sopenharmony_ci			  const u8 *key, unsigned int keylen)
4648c2ecf20Sopenharmony_ci{
4658c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
4668c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
4678c2ecf20Sopenharmony_ci	int ret;
4688c2ecf20Sopenharmony_ci
4698c2ecf20Sopenharmony_ci	ret = aes_check_keylen(keylen - 4);
4708c2ecf20Sopenharmony_ci	if (ret)
4718c2ecf20Sopenharmony_ci		return ret;
4728c2ecf20Sopenharmony_ci
4738c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",
4748c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
4758c2ecf20Sopenharmony_ci
4768c2ecf20Sopenharmony_ci	memcpy(ctx->key, key, keylen);
4778c2ecf20Sopenharmony_ci	/*
4788c2ecf20Sopenharmony_ci	 * The last four bytes of the key material are used as the salt value
4798c2ecf20Sopenharmony_ci	 * in the nonce. Update the AES key length.
4808c2ecf20Sopenharmony_ci	 */
4818c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen - 4;
4828c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev->parent, ctx->key_dma,
4838c2ecf20Sopenharmony_ci				   ctx->cdata.keylen, ctx->dir);
4848c2ecf20Sopenharmony_ci
4858c2ecf20Sopenharmony_ci	ret = rfc4106_set_sh_desc(aead);
4868c2ecf20Sopenharmony_ci	if (ret)
4878c2ecf20Sopenharmony_ci		return ret;
4888c2ecf20Sopenharmony_ci
4898c2ecf20Sopenharmony_ci	/* Now update the driver contexts with the new shared descriptor */
4908c2ecf20Sopenharmony_ci	if (ctx->drv_ctx[ENCRYPT]) {
4918c2ecf20Sopenharmony_ci		ret = caam_drv_ctx_update(ctx->drv_ctx[ENCRYPT],
4928c2ecf20Sopenharmony_ci					  ctx->sh_desc_enc);
4938c2ecf20Sopenharmony_ci		if (ret) {
4948c2ecf20Sopenharmony_ci			dev_err(jrdev, "driver enc context update failed\n");
4958c2ecf20Sopenharmony_ci			return ret;
4968c2ecf20Sopenharmony_ci		}
4978c2ecf20Sopenharmony_ci	}
4988c2ecf20Sopenharmony_ci
4998c2ecf20Sopenharmony_ci	if (ctx->drv_ctx[DECRYPT]) {
5008c2ecf20Sopenharmony_ci		ret = caam_drv_ctx_update(ctx->drv_ctx[DECRYPT],
5018c2ecf20Sopenharmony_ci					  ctx->sh_desc_dec);
5028c2ecf20Sopenharmony_ci		if (ret) {
5038c2ecf20Sopenharmony_ci			dev_err(jrdev, "driver dec context update failed\n");
5048c2ecf20Sopenharmony_ci			return ret;
5058c2ecf20Sopenharmony_ci		}
5068c2ecf20Sopenharmony_ci	}
5078c2ecf20Sopenharmony_ci
5088c2ecf20Sopenharmony_ci	return 0;
5098c2ecf20Sopenharmony_ci}
5108c2ecf20Sopenharmony_ci
5118c2ecf20Sopenharmony_cistatic int rfc4543_set_sh_desc(struct crypto_aead *aead)
5128c2ecf20Sopenharmony_ci{
5138c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
5148c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
5158c2ecf20Sopenharmony_ci	int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN -
5168c2ecf20Sopenharmony_ci			ctx->cdata.keylen;
5178c2ecf20Sopenharmony_ci
5188c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen || !ctx->authsize)
5198c2ecf20Sopenharmony_ci		return 0;
5208c2ecf20Sopenharmony_ci
5218c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = ctx->key;
5228c2ecf20Sopenharmony_ci
5238c2ecf20Sopenharmony_ci	/*
5248c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptor
5258c2ecf20Sopenharmony_ci	 * must fit into the 64-word Descriptor h/w Buffer
5268c2ecf20Sopenharmony_ci	 */
5278c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_QI_RFC4543_ENC_LEN) {
5288c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
5298c2ecf20Sopenharmony_ci	} else {
5308c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
5318c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
5328c2ecf20Sopenharmony_ci	}
5338c2ecf20Sopenharmony_ci
5348c2ecf20Sopenharmony_ci	cnstr_shdsc_rfc4543_encap(ctx->sh_desc_enc, &ctx->cdata, ivsize,
5358c2ecf20Sopenharmony_ci				  ctx->authsize, true);
5368c2ecf20Sopenharmony_ci
5378c2ecf20Sopenharmony_ci	/*
5388c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptor
5398c2ecf20Sopenharmony_ci	 * must fit into the 64-word Descriptor h/w Buffer
5408c2ecf20Sopenharmony_ci	 */
5418c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_QI_RFC4543_DEC_LEN) {
5428c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
5438c2ecf20Sopenharmony_ci	} else {
5448c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
5458c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
5468c2ecf20Sopenharmony_ci	}
5478c2ecf20Sopenharmony_ci
5488c2ecf20Sopenharmony_ci	cnstr_shdsc_rfc4543_decap(ctx->sh_desc_dec, &ctx->cdata, ivsize,
5498c2ecf20Sopenharmony_ci				  ctx->authsize, true);
5508c2ecf20Sopenharmony_ci
5518c2ecf20Sopenharmony_ci	return 0;
5528c2ecf20Sopenharmony_ci}
5538c2ecf20Sopenharmony_ci
5548c2ecf20Sopenharmony_cistatic int rfc4543_setauthsize(struct crypto_aead *authenc,
5558c2ecf20Sopenharmony_ci			       unsigned int authsize)
5568c2ecf20Sopenharmony_ci{
5578c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
5588c2ecf20Sopenharmony_ci
5598c2ecf20Sopenharmony_ci	if (authsize != 16)
5608c2ecf20Sopenharmony_ci		return -EINVAL;
5618c2ecf20Sopenharmony_ci
5628c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
5638c2ecf20Sopenharmony_ci	rfc4543_set_sh_desc(authenc);
5648c2ecf20Sopenharmony_ci
5658c2ecf20Sopenharmony_ci	return 0;
5668c2ecf20Sopenharmony_ci}
5678c2ecf20Sopenharmony_ci
5688c2ecf20Sopenharmony_cistatic int rfc4543_setkey(struct crypto_aead *aead,
5698c2ecf20Sopenharmony_ci			  const u8 *key, unsigned int keylen)
5708c2ecf20Sopenharmony_ci{
5718c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
5728c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
5738c2ecf20Sopenharmony_ci	int ret;
5748c2ecf20Sopenharmony_ci
5758c2ecf20Sopenharmony_ci	ret = aes_check_keylen(keylen - 4);
5768c2ecf20Sopenharmony_ci	if (ret)
5778c2ecf20Sopenharmony_ci		return ret;
5788c2ecf20Sopenharmony_ci
5798c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",
5808c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
5818c2ecf20Sopenharmony_ci
5828c2ecf20Sopenharmony_ci	memcpy(ctx->key, key, keylen);
5838c2ecf20Sopenharmony_ci	/*
5848c2ecf20Sopenharmony_ci	 * The last four bytes of the key material are used as the salt value
5858c2ecf20Sopenharmony_ci	 * in the nonce. Update the AES key length.
5868c2ecf20Sopenharmony_ci	 */
5878c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen - 4;
5888c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev->parent, ctx->key_dma,
5898c2ecf20Sopenharmony_ci				   ctx->cdata.keylen, ctx->dir);
5908c2ecf20Sopenharmony_ci
5918c2ecf20Sopenharmony_ci	ret = rfc4543_set_sh_desc(aead);
5928c2ecf20Sopenharmony_ci	if (ret)
5938c2ecf20Sopenharmony_ci		return ret;
5948c2ecf20Sopenharmony_ci
5958c2ecf20Sopenharmony_ci	/* Now update the driver contexts with the new shared descriptor */
5968c2ecf20Sopenharmony_ci	if (ctx->drv_ctx[ENCRYPT]) {
5978c2ecf20Sopenharmony_ci		ret = caam_drv_ctx_update(ctx->drv_ctx[ENCRYPT],
5988c2ecf20Sopenharmony_ci					  ctx->sh_desc_enc);
5998c2ecf20Sopenharmony_ci		if (ret) {
6008c2ecf20Sopenharmony_ci			dev_err(jrdev, "driver enc context update failed\n");
6018c2ecf20Sopenharmony_ci			return ret;
6028c2ecf20Sopenharmony_ci		}
6038c2ecf20Sopenharmony_ci	}
6048c2ecf20Sopenharmony_ci
6058c2ecf20Sopenharmony_ci	if (ctx->drv_ctx[DECRYPT]) {
6068c2ecf20Sopenharmony_ci		ret = caam_drv_ctx_update(ctx->drv_ctx[DECRYPT],
6078c2ecf20Sopenharmony_ci					  ctx->sh_desc_dec);
6088c2ecf20Sopenharmony_ci		if (ret) {
6098c2ecf20Sopenharmony_ci			dev_err(jrdev, "driver dec context update failed\n");
6108c2ecf20Sopenharmony_ci			return ret;
6118c2ecf20Sopenharmony_ci		}
6128c2ecf20Sopenharmony_ci	}
6138c2ecf20Sopenharmony_ci
6148c2ecf20Sopenharmony_ci	return 0;
6158c2ecf20Sopenharmony_ci}
6168c2ecf20Sopenharmony_ci
6178c2ecf20Sopenharmony_cistatic int skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key,
6188c2ecf20Sopenharmony_ci			   unsigned int keylen, const u32 ctx1_iv_off)
6198c2ecf20Sopenharmony_ci{
6208c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
6218c2ecf20Sopenharmony_ci	struct caam_skcipher_alg *alg =
6228c2ecf20Sopenharmony_ci		container_of(crypto_skcipher_alg(skcipher), typeof(*alg),
6238c2ecf20Sopenharmony_ci			     skcipher);
6248c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
6258c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_skcipher_ivsize(skcipher);
6268c2ecf20Sopenharmony_ci	const bool is_rfc3686 = alg->caam.rfc3686;
6278c2ecf20Sopenharmony_ci	int ret = 0;
6288c2ecf20Sopenharmony_ci
6298c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",
6308c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
6318c2ecf20Sopenharmony_ci
6328c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen;
6338c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = key;
6348c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = true;
6358c2ecf20Sopenharmony_ci
6368c2ecf20Sopenharmony_ci	/* skcipher encrypt, decrypt shared descriptors */
6378c2ecf20Sopenharmony_ci	cnstr_shdsc_skcipher_encap(ctx->sh_desc_enc, &ctx->cdata, ivsize,
6388c2ecf20Sopenharmony_ci				   is_rfc3686, ctx1_iv_off);
6398c2ecf20Sopenharmony_ci	cnstr_shdsc_skcipher_decap(ctx->sh_desc_dec, &ctx->cdata, ivsize,
6408c2ecf20Sopenharmony_ci				   is_rfc3686, ctx1_iv_off);
6418c2ecf20Sopenharmony_ci
6428c2ecf20Sopenharmony_ci	/* Now update the driver contexts with the new shared descriptor */
6438c2ecf20Sopenharmony_ci	if (ctx->drv_ctx[ENCRYPT]) {
6448c2ecf20Sopenharmony_ci		ret = caam_drv_ctx_update(ctx->drv_ctx[ENCRYPT],
6458c2ecf20Sopenharmony_ci					  ctx->sh_desc_enc);
6468c2ecf20Sopenharmony_ci		if (ret) {
6478c2ecf20Sopenharmony_ci			dev_err(jrdev, "driver enc context update failed\n");
6488c2ecf20Sopenharmony_ci			return -EINVAL;
6498c2ecf20Sopenharmony_ci		}
6508c2ecf20Sopenharmony_ci	}
6518c2ecf20Sopenharmony_ci
6528c2ecf20Sopenharmony_ci	if (ctx->drv_ctx[DECRYPT]) {
6538c2ecf20Sopenharmony_ci		ret = caam_drv_ctx_update(ctx->drv_ctx[DECRYPT],
6548c2ecf20Sopenharmony_ci					  ctx->sh_desc_dec);
6558c2ecf20Sopenharmony_ci		if (ret) {
6568c2ecf20Sopenharmony_ci			dev_err(jrdev, "driver dec context update failed\n");
6578c2ecf20Sopenharmony_ci			return -EINVAL;
6588c2ecf20Sopenharmony_ci		}
6598c2ecf20Sopenharmony_ci	}
6608c2ecf20Sopenharmony_ci
6618c2ecf20Sopenharmony_ci	return ret;
6628c2ecf20Sopenharmony_ci}
6638c2ecf20Sopenharmony_ci
6648c2ecf20Sopenharmony_cistatic int aes_skcipher_setkey(struct crypto_skcipher *skcipher,
6658c2ecf20Sopenharmony_ci			       const u8 *key, unsigned int keylen)
6668c2ecf20Sopenharmony_ci{
6678c2ecf20Sopenharmony_ci	int err;
6688c2ecf20Sopenharmony_ci
6698c2ecf20Sopenharmony_ci	err = aes_check_keylen(keylen);
6708c2ecf20Sopenharmony_ci	if (err)
6718c2ecf20Sopenharmony_ci		return err;
6728c2ecf20Sopenharmony_ci
6738c2ecf20Sopenharmony_ci	return skcipher_setkey(skcipher, key, keylen, 0);
6748c2ecf20Sopenharmony_ci}
6758c2ecf20Sopenharmony_ci
6768c2ecf20Sopenharmony_cistatic int rfc3686_skcipher_setkey(struct crypto_skcipher *skcipher,
6778c2ecf20Sopenharmony_ci				   const u8 *key, unsigned int keylen)
6788c2ecf20Sopenharmony_ci{
6798c2ecf20Sopenharmony_ci	u32 ctx1_iv_off;
6808c2ecf20Sopenharmony_ci	int err;
6818c2ecf20Sopenharmony_ci
6828c2ecf20Sopenharmony_ci	/*
6838c2ecf20Sopenharmony_ci	 * RFC3686 specific:
6848c2ecf20Sopenharmony_ci	 *	| CONTEXT1[255:128] = {NONCE, IV, COUNTER}
6858c2ecf20Sopenharmony_ci	 *	| *key = {KEY, NONCE}
6868c2ecf20Sopenharmony_ci	 */
6878c2ecf20Sopenharmony_ci	ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;
6888c2ecf20Sopenharmony_ci	keylen -= CTR_RFC3686_NONCE_SIZE;
6898c2ecf20Sopenharmony_ci
6908c2ecf20Sopenharmony_ci	err = aes_check_keylen(keylen);
6918c2ecf20Sopenharmony_ci	if (err)
6928c2ecf20Sopenharmony_ci		return err;
6938c2ecf20Sopenharmony_ci
6948c2ecf20Sopenharmony_ci	return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off);
6958c2ecf20Sopenharmony_ci}
6968c2ecf20Sopenharmony_ci
6978c2ecf20Sopenharmony_cistatic int ctr_skcipher_setkey(struct crypto_skcipher *skcipher,
6988c2ecf20Sopenharmony_ci			       const u8 *key, unsigned int keylen)
6998c2ecf20Sopenharmony_ci{
7008c2ecf20Sopenharmony_ci	u32 ctx1_iv_off;
7018c2ecf20Sopenharmony_ci	int err;
7028c2ecf20Sopenharmony_ci
7038c2ecf20Sopenharmony_ci	/*
7048c2ecf20Sopenharmony_ci	 * AES-CTR needs to load IV in CONTEXT1 reg
7058c2ecf20Sopenharmony_ci	 * at an offset of 128bits (16bytes)
7068c2ecf20Sopenharmony_ci	 * CONTEXT1[255:128] = IV
7078c2ecf20Sopenharmony_ci	 */
7088c2ecf20Sopenharmony_ci	ctx1_iv_off = 16;
7098c2ecf20Sopenharmony_ci
7108c2ecf20Sopenharmony_ci	err = aes_check_keylen(keylen);
7118c2ecf20Sopenharmony_ci	if (err)
7128c2ecf20Sopenharmony_ci		return err;
7138c2ecf20Sopenharmony_ci
7148c2ecf20Sopenharmony_ci	return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off);
7158c2ecf20Sopenharmony_ci}
7168c2ecf20Sopenharmony_ci
7178c2ecf20Sopenharmony_cistatic int des3_skcipher_setkey(struct crypto_skcipher *skcipher,
7188c2ecf20Sopenharmony_ci				const u8 *key, unsigned int keylen)
7198c2ecf20Sopenharmony_ci{
7208c2ecf20Sopenharmony_ci	return verify_skcipher_des3_key(skcipher, key) ?:
7218c2ecf20Sopenharmony_ci	       skcipher_setkey(skcipher, key, keylen, 0);
7228c2ecf20Sopenharmony_ci}
7238c2ecf20Sopenharmony_ci
7248c2ecf20Sopenharmony_cistatic int des_skcipher_setkey(struct crypto_skcipher *skcipher,
7258c2ecf20Sopenharmony_ci			       const u8 *key, unsigned int keylen)
7268c2ecf20Sopenharmony_ci{
7278c2ecf20Sopenharmony_ci	return verify_skcipher_des_key(skcipher, key) ?:
7288c2ecf20Sopenharmony_ci	       skcipher_setkey(skcipher, key, keylen, 0);
7298c2ecf20Sopenharmony_ci}
7308c2ecf20Sopenharmony_ci
7318c2ecf20Sopenharmony_cistatic int xts_skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key,
7328c2ecf20Sopenharmony_ci			       unsigned int keylen)
7338c2ecf20Sopenharmony_ci{
7348c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
7358c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
7368c2ecf20Sopenharmony_ci	struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
7378c2ecf20Sopenharmony_ci	int ret = 0;
7388c2ecf20Sopenharmony_ci	int err;
7398c2ecf20Sopenharmony_ci
7408c2ecf20Sopenharmony_ci	err = xts_verify_key(skcipher, key, keylen);
7418c2ecf20Sopenharmony_ci	if (err) {
7428c2ecf20Sopenharmony_ci		dev_dbg(jrdev, "key size mismatch\n");
7438c2ecf20Sopenharmony_ci		return err;
7448c2ecf20Sopenharmony_ci	}
7458c2ecf20Sopenharmony_ci
7468c2ecf20Sopenharmony_ci	if (keylen != 2 * AES_KEYSIZE_128 && keylen != 2 * AES_KEYSIZE_256)
7478c2ecf20Sopenharmony_ci		ctx->xts_key_fallback = true;
7488c2ecf20Sopenharmony_ci
7498c2ecf20Sopenharmony_ci	if (ctrlpriv->era <= 8 || ctx->xts_key_fallback) {
7508c2ecf20Sopenharmony_ci		err = crypto_skcipher_setkey(ctx->fallback, key, keylen);
7518c2ecf20Sopenharmony_ci		if (err)
7528c2ecf20Sopenharmony_ci			return err;
7538c2ecf20Sopenharmony_ci	}
7548c2ecf20Sopenharmony_ci
7558c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen;
7568c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = key;
7578c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = true;
7588c2ecf20Sopenharmony_ci
7598c2ecf20Sopenharmony_ci	/* xts skcipher encrypt, decrypt shared descriptors */
7608c2ecf20Sopenharmony_ci	cnstr_shdsc_xts_skcipher_encap(ctx->sh_desc_enc, &ctx->cdata);
7618c2ecf20Sopenharmony_ci	cnstr_shdsc_xts_skcipher_decap(ctx->sh_desc_dec, &ctx->cdata);
7628c2ecf20Sopenharmony_ci
7638c2ecf20Sopenharmony_ci	/* Now update the driver contexts with the new shared descriptor */
7648c2ecf20Sopenharmony_ci	if (ctx->drv_ctx[ENCRYPT]) {
7658c2ecf20Sopenharmony_ci		ret = caam_drv_ctx_update(ctx->drv_ctx[ENCRYPT],
7668c2ecf20Sopenharmony_ci					  ctx->sh_desc_enc);
7678c2ecf20Sopenharmony_ci		if (ret) {
7688c2ecf20Sopenharmony_ci			dev_err(jrdev, "driver enc context update failed\n");
7698c2ecf20Sopenharmony_ci			return -EINVAL;
7708c2ecf20Sopenharmony_ci		}
7718c2ecf20Sopenharmony_ci	}
7728c2ecf20Sopenharmony_ci
7738c2ecf20Sopenharmony_ci	if (ctx->drv_ctx[DECRYPT]) {
7748c2ecf20Sopenharmony_ci		ret = caam_drv_ctx_update(ctx->drv_ctx[DECRYPT],
7758c2ecf20Sopenharmony_ci					  ctx->sh_desc_dec);
7768c2ecf20Sopenharmony_ci		if (ret) {
7778c2ecf20Sopenharmony_ci			dev_err(jrdev, "driver dec context update failed\n");
7788c2ecf20Sopenharmony_ci			return -EINVAL;
7798c2ecf20Sopenharmony_ci		}
7808c2ecf20Sopenharmony_ci	}
7818c2ecf20Sopenharmony_ci
7828c2ecf20Sopenharmony_ci	return ret;
7838c2ecf20Sopenharmony_ci}
7848c2ecf20Sopenharmony_ci
7858c2ecf20Sopenharmony_ci/*
7868c2ecf20Sopenharmony_ci * aead_edesc - s/w-extended aead descriptor
7878c2ecf20Sopenharmony_ci * @src_nents: number of segments in input scatterlist
7888c2ecf20Sopenharmony_ci * @dst_nents: number of segments in output scatterlist
7898c2ecf20Sopenharmony_ci * @iv_dma: dma address of iv for checking continuity and link table
7908c2ecf20Sopenharmony_ci * @qm_sg_bytes: length of dma mapped h/w link table
7918c2ecf20Sopenharmony_ci * @qm_sg_dma: bus physical mapped address of h/w link table
7928c2ecf20Sopenharmony_ci * @assoclen: associated data length, in CAAM endianness
7938c2ecf20Sopenharmony_ci * @assoclen_dma: bus physical mapped address of req->assoclen
7948c2ecf20Sopenharmony_ci * @drv_req: driver-specific request structure
7958c2ecf20Sopenharmony_ci * @sgt: the h/w link table, followed by IV
7968c2ecf20Sopenharmony_ci */
7978c2ecf20Sopenharmony_cistruct aead_edesc {
7988c2ecf20Sopenharmony_ci	int src_nents;
7998c2ecf20Sopenharmony_ci	int dst_nents;
8008c2ecf20Sopenharmony_ci	dma_addr_t iv_dma;
8018c2ecf20Sopenharmony_ci	int qm_sg_bytes;
8028c2ecf20Sopenharmony_ci	dma_addr_t qm_sg_dma;
8038c2ecf20Sopenharmony_ci	unsigned int assoclen;
8048c2ecf20Sopenharmony_ci	dma_addr_t assoclen_dma;
8058c2ecf20Sopenharmony_ci	struct caam_drv_req drv_req;
8068c2ecf20Sopenharmony_ci	struct qm_sg_entry sgt[];
8078c2ecf20Sopenharmony_ci};
8088c2ecf20Sopenharmony_ci
8098c2ecf20Sopenharmony_ci/*
8108c2ecf20Sopenharmony_ci * skcipher_edesc - s/w-extended skcipher descriptor
8118c2ecf20Sopenharmony_ci * @src_nents: number of segments in input scatterlist
8128c2ecf20Sopenharmony_ci * @dst_nents: number of segments in output scatterlist
8138c2ecf20Sopenharmony_ci * @iv_dma: dma address of iv for checking continuity and link table
8148c2ecf20Sopenharmony_ci * @qm_sg_bytes: length of dma mapped h/w link table
8158c2ecf20Sopenharmony_ci * @qm_sg_dma: bus physical mapped address of h/w link table
8168c2ecf20Sopenharmony_ci * @drv_req: driver-specific request structure
8178c2ecf20Sopenharmony_ci * @sgt: the h/w link table, followed by IV
8188c2ecf20Sopenharmony_ci */
8198c2ecf20Sopenharmony_cistruct skcipher_edesc {
8208c2ecf20Sopenharmony_ci	int src_nents;
8218c2ecf20Sopenharmony_ci	int dst_nents;
8228c2ecf20Sopenharmony_ci	dma_addr_t iv_dma;
8238c2ecf20Sopenharmony_ci	int qm_sg_bytes;
8248c2ecf20Sopenharmony_ci	dma_addr_t qm_sg_dma;
8258c2ecf20Sopenharmony_ci	struct caam_drv_req drv_req;
8268c2ecf20Sopenharmony_ci	struct qm_sg_entry sgt[];
8278c2ecf20Sopenharmony_ci};
8288c2ecf20Sopenharmony_ci
8298c2ecf20Sopenharmony_cistatic struct caam_drv_ctx *get_drv_ctx(struct caam_ctx *ctx,
8308c2ecf20Sopenharmony_ci					enum optype type)
8318c2ecf20Sopenharmony_ci{
8328c2ecf20Sopenharmony_ci	/*
8338c2ecf20Sopenharmony_ci	 * This function is called on the fast path with values of 'type'
8348c2ecf20Sopenharmony_ci	 * known at compile time. Invalid arguments are not expected and
8358c2ecf20Sopenharmony_ci	 * thus no checks are made.
8368c2ecf20Sopenharmony_ci	 */
8378c2ecf20Sopenharmony_ci	struct caam_drv_ctx *drv_ctx = ctx->drv_ctx[type];
8388c2ecf20Sopenharmony_ci	u32 *desc;
8398c2ecf20Sopenharmony_ci
8408c2ecf20Sopenharmony_ci	if (unlikely(!drv_ctx)) {
8418c2ecf20Sopenharmony_ci		spin_lock(&ctx->lock);
8428c2ecf20Sopenharmony_ci
8438c2ecf20Sopenharmony_ci		/* Read again to check if some other core init drv_ctx */
8448c2ecf20Sopenharmony_ci		drv_ctx = ctx->drv_ctx[type];
8458c2ecf20Sopenharmony_ci		if (!drv_ctx) {
8468c2ecf20Sopenharmony_ci			int cpu;
8478c2ecf20Sopenharmony_ci
8488c2ecf20Sopenharmony_ci			if (type == ENCRYPT)
8498c2ecf20Sopenharmony_ci				desc = ctx->sh_desc_enc;
8508c2ecf20Sopenharmony_ci			else /* (type == DECRYPT) */
8518c2ecf20Sopenharmony_ci				desc = ctx->sh_desc_dec;
8528c2ecf20Sopenharmony_ci
8538c2ecf20Sopenharmony_ci			cpu = smp_processor_id();
8548c2ecf20Sopenharmony_ci			drv_ctx = caam_drv_ctx_init(ctx->qidev, &cpu, desc);
8558c2ecf20Sopenharmony_ci			if (!IS_ERR_OR_NULL(drv_ctx))
8568c2ecf20Sopenharmony_ci				drv_ctx->op_type = type;
8578c2ecf20Sopenharmony_ci
8588c2ecf20Sopenharmony_ci			ctx->drv_ctx[type] = drv_ctx;
8598c2ecf20Sopenharmony_ci		}
8608c2ecf20Sopenharmony_ci
8618c2ecf20Sopenharmony_ci		spin_unlock(&ctx->lock);
8628c2ecf20Sopenharmony_ci	}
8638c2ecf20Sopenharmony_ci
8648c2ecf20Sopenharmony_ci	return drv_ctx;
8658c2ecf20Sopenharmony_ci}
8668c2ecf20Sopenharmony_ci
8678c2ecf20Sopenharmony_cistatic void caam_unmap(struct device *dev, struct scatterlist *src,
8688c2ecf20Sopenharmony_ci		       struct scatterlist *dst, int src_nents,
8698c2ecf20Sopenharmony_ci		       int dst_nents, dma_addr_t iv_dma, int ivsize,
8708c2ecf20Sopenharmony_ci		       enum dma_data_direction iv_dir, dma_addr_t qm_sg_dma,
8718c2ecf20Sopenharmony_ci		       int qm_sg_bytes)
8728c2ecf20Sopenharmony_ci{
8738c2ecf20Sopenharmony_ci	if (dst != src) {
8748c2ecf20Sopenharmony_ci		if (src_nents)
8758c2ecf20Sopenharmony_ci			dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE);
8768c2ecf20Sopenharmony_ci		if (dst_nents)
8778c2ecf20Sopenharmony_ci			dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE);
8788c2ecf20Sopenharmony_ci	} else {
8798c2ecf20Sopenharmony_ci		dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL);
8808c2ecf20Sopenharmony_ci	}
8818c2ecf20Sopenharmony_ci
8828c2ecf20Sopenharmony_ci	if (iv_dma)
8838c2ecf20Sopenharmony_ci		dma_unmap_single(dev, iv_dma, ivsize, iv_dir);
8848c2ecf20Sopenharmony_ci	if (qm_sg_bytes)
8858c2ecf20Sopenharmony_ci		dma_unmap_single(dev, qm_sg_dma, qm_sg_bytes, DMA_TO_DEVICE);
8868c2ecf20Sopenharmony_ci}
8878c2ecf20Sopenharmony_ci
8888c2ecf20Sopenharmony_cistatic void aead_unmap(struct device *dev,
8898c2ecf20Sopenharmony_ci		       struct aead_edesc *edesc,
8908c2ecf20Sopenharmony_ci		       struct aead_request *req)
8918c2ecf20Sopenharmony_ci{
8928c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
8938c2ecf20Sopenharmony_ci	int ivsize = crypto_aead_ivsize(aead);
8948c2ecf20Sopenharmony_ci
8958c2ecf20Sopenharmony_ci	caam_unmap(dev, req->src, req->dst, edesc->src_nents, edesc->dst_nents,
8968c2ecf20Sopenharmony_ci		   edesc->iv_dma, ivsize, DMA_TO_DEVICE, edesc->qm_sg_dma,
8978c2ecf20Sopenharmony_ci		   edesc->qm_sg_bytes);
8988c2ecf20Sopenharmony_ci	dma_unmap_single(dev, edesc->assoclen_dma, 4, DMA_TO_DEVICE);
8998c2ecf20Sopenharmony_ci}
9008c2ecf20Sopenharmony_ci
9018c2ecf20Sopenharmony_cistatic void skcipher_unmap(struct device *dev, struct skcipher_edesc *edesc,
9028c2ecf20Sopenharmony_ci			   struct skcipher_request *req)
9038c2ecf20Sopenharmony_ci{
9048c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
9058c2ecf20Sopenharmony_ci	int ivsize = crypto_skcipher_ivsize(skcipher);
9068c2ecf20Sopenharmony_ci
9078c2ecf20Sopenharmony_ci	caam_unmap(dev, req->src, req->dst, edesc->src_nents, edesc->dst_nents,
9088c2ecf20Sopenharmony_ci		   edesc->iv_dma, ivsize, DMA_BIDIRECTIONAL, edesc->qm_sg_dma,
9098c2ecf20Sopenharmony_ci		   edesc->qm_sg_bytes);
9108c2ecf20Sopenharmony_ci}
9118c2ecf20Sopenharmony_ci
9128c2ecf20Sopenharmony_cistatic void aead_done(struct caam_drv_req *drv_req, u32 status)
9138c2ecf20Sopenharmony_ci{
9148c2ecf20Sopenharmony_ci	struct device *qidev;
9158c2ecf20Sopenharmony_ci	struct aead_edesc *edesc;
9168c2ecf20Sopenharmony_ci	struct aead_request *aead_req = drv_req->app_ctx;
9178c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(aead_req);
9188c2ecf20Sopenharmony_ci	struct caam_ctx *caam_ctx = crypto_aead_ctx(aead);
9198c2ecf20Sopenharmony_ci	int ecode = 0;
9208c2ecf20Sopenharmony_ci
9218c2ecf20Sopenharmony_ci	qidev = caam_ctx->qidev;
9228c2ecf20Sopenharmony_ci
9238c2ecf20Sopenharmony_ci	if (unlikely(status))
9248c2ecf20Sopenharmony_ci		ecode = caam_jr_strstatus(qidev, status);
9258c2ecf20Sopenharmony_ci
9268c2ecf20Sopenharmony_ci	edesc = container_of(drv_req, typeof(*edesc), drv_req);
9278c2ecf20Sopenharmony_ci	aead_unmap(qidev, edesc, aead_req);
9288c2ecf20Sopenharmony_ci
9298c2ecf20Sopenharmony_ci	aead_request_complete(aead_req, ecode);
9308c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
9318c2ecf20Sopenharmony_ci}
9328c2ecf20Sopenharmony_ci
9338c2ecf20Sopenharmony_ci/*
9348c2ecf20Sopenharmony_ci * allocate and map the aead extended descriptor
9358c2ecf20Sopenharmony_ci */
9368c2ecf20Sopenharmony_cistatic struct aead_edesc *aead_edesc_alloc(struct aead_request *req,
9378c2ecf20Sopenharmony_ci					   bool encrypt)
9388c2ecf20Sopenharmony_ci{
9398c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
9408c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
9418c2ecf20Sopenharmony_ci	struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),
9428c2ecf20Sopenharmony_ci						 typeof(*alg), aead);
9438c2ecf20Sopenharmony_ci	struct device *qidev = ctx->qidev;
9448c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
9458c2ecf20Sopenharmony_ci		       GFP_KERNEL : GFP_ATOMIC;
9468c2ecf20Sopenharmony_ci	int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0;
9478c2ecf20Sopenharmony_ci	int src_len, dst_len = 0;
9488c2ecf20Sopenharmony_ci	struct aead_edesc *edesc;
9498c2ecf20Sopenharmony_ci	dma_addr_t qm_sg_dma, iv_dma = 0;
9508c2ecf20Sopenharmony_ci	int ivsize = 0;
9518c2ecf20Sopenharmony_ci	unsigned int authsize = ctx->authsize;
9528c2ecf20Sopenharmony_ci	int qm_sg_index = 0, qm_sg_ents = 0, qm_sg_bytes;
9538c2ecf20Sopenharmony_ci	int in_len, out_len;
9548c2ecf20Sopenharmony_ci	struct qm_sg_entry *sg_table, *fd_sgt;
9558c2ecf20Sopenharmony_ci	struct caam_drv_ctx *drv_ctx;
9568c2ecf20Sopenharmony_ci
9578c2ecf20Sopenharmony_ci	drv_ctx = get_drv_ctx(ctx, encrypt ? ENCRYPT : DECRYPT);
9588c2ecf20Sopenharmony_ci	if (IS_ERR_OR_NULL(drv_ctx))
9598c2ecf20Sopenharmony_ci		return (struct aead_edesc *)drv_ctx;
9608c2ecf20Sopenharmony_ci
9618c2ecf20Sopenharmony_ci	/* allocate space for base edesc and hw desc commands, link tables */
9628c2ecf20Sopenharmony_ci	edesc = qi_cache_alloc(GFP_DMA | flags);
9638c2ecf20Sopenharmony_ci	if (unlikely(!edesc)) {
9648c2ecf20Sopenharmony_ci		dev_err(qidev, "could not allocate extended descriptor\n");
9658c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
9668c2ecf20Sopenharmony_ci	}
9678c2ecf20Sopenharmony_ci
9688c2ecf20Sopenharmony_ci	if (likely(req->src == req->dst)) {
9698c2ecf20Sopenharmony_ci		src_len = req->assoclen + req->cryptlen +
9708c2ecf20Sopenharmony_ci			  (encrypt ? authsize : 0);
9718c2ecf20Sopenharmony_ci
9728c2ecf20Sopenharmony_ci		src_nents = sg_nents_for_len(req->src, src_len);
9738c2ecf20Sopenharmony_ci		if (unlikely(src_nents < 0)) {
9748c2ecf20Sopenharmony_ci			dev_err(qidev, "Insufficient bytes (%d) in src S/G\n",
9758c2ecf20Sopenharmony_ci				src_len);
9768c2ecf20Sopenharmony_ci			qi_cache_free(edesc);
9778c2ecf20Sopenharmony_ci			return ERR_PTR(src_nents);
9788c2ecf20Sopenharmony_ci		}
9798c2ecf20Sopenharmony_ci
9808c2ecf20Sopenharmony_ci		mapped_src_nents = dma_map_sg(qidev, req->src, src_nents,
9818c2ecf20Sopenharmony_ci					      DMA_BIDIRECTIONAL);
9828c2ecf20Sopenharmony_ci		if (unlikely(!mapped_src_nents)) {
9838c2ecf20Sopenharmony_ci			dev_err(qidev, "unable to map source\n");
9848c2ecf20Sopenharmony_ci			qi_cache_free(edesc);
9858c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
9868c2ecf20Sopenharmony_ci		}
9878c2ecf20Sopenharmony_ci	} else {
9888c2ecf20Sopenharmony_ci		src_len = req->assoclen + req->cryptlen;
9898c2ecf20Sopenharmony_ci		dst_len = src_len + (encrypt ? authsize : (-authsize));
9908c2ecf20Sopenharmony_ci
9918c2ecf20Sopenharmony_ci		src_nents = sg_nents_for_len(req->src, src_len);
9928c2ecf20Sopenharmony_ci		if (unlikely(src_nents < 0)) {
9938c2ecf20Sopenharmony_ci			dev_err(qidev, "Insufficient bytes (%d) in src S/G\n",
9948c2ecf20Sopenharmony_ci				src_len);
9958c2ecf20Sopenharmony_ci			qi_cache_free(edesc);
9968c2ecf20Sopenharmony_ci			return ERR_PTR(src_nents);
9978c2ecf20Sopenharmony_ci		}
9988c2ecf20Sopenharmony_ci
9998c2ecf20Sopenharmony_ci		dst_nents = sg_nents_for_len(req->dst, dst_len);
10008c2ecf20Sopenharmony_ci		if (unlikely(dst_nents < 0)) {
10018c2ecf20Sopenharmony_ci			dev_err(qidev, "Insufficient bytes (%d) in dst S/G\n",
10028c2ecf20Sopenharmony_ci				dst_len);
10038c2ecf20Sopenharmony_ci			qi_cache_free(edesc);
10048c2ecf20Sopenharmony_ci			return ERR_PTR(dst_nents);
10058c2ecf20Sopenharmony_ci		}
10068c2ecf20Sopenharmony_ci
10078c2ecf20Sopenharmony_ci		if (src_nents) {
10088c2ecf20Sopenharmony_ci			mapped_src_nents = dma_map_sg(qidev, req->src,
10098c2ecf20Sopenharmony_ci						      src_nents, DMA_TO_DEVICE);
10108c2ecf20Sopenharmony_ci			if (unlikely(!mapped_src_nents)) {
10118c2ecf20Sopenharmony_ci				dev_err(qidev, "unable to map source\n");
10128c2ecf20Sopenharmony_ci				qi_cache_free(edesc);
10138c2ecf20Sopenharmony_ci				return ERR_PTR(-ENOMEM);
10148c2ecf20Sopenharmony_ci			}
10158c2ecf20Sopenharmony_ci		} else {
10168c2ecf20Sopenharmony_ci			mapped_src_nents = 0;
10178c2ecf20Sopenharmony_ci		}
10188c2ecf20Sopenharmony_ci
10198c2ecf20Sopenharmony_ci		if (dst_nents) {
10208c2ecf20Sopenharmony_ci			mapped_dst_nents = dma_map_sg(qidev, req->dst,
10218c2ecf20Sopenharmony_ci						      dst_nents,
10228c2ecf20Sopenharmony_ci						      DMA_FROM_DEVICE);
10238c2ecf20Sopenharmony_ci			if (unlikely(!mapped_dst_nents)) {
10248c2ecf20Sopenharmony_ci				dev_err(qidev, "unable to map destination\n");
10258c2ecf20Sopenharmony_ci				dma_unmap_sg(qidev, req->src, src_nents,
10268c2ecf20Sopenharmony_ci					     DMA_TO_DEVICE);
10278c2ecf20Sopenharmony_ci				qi_cache_free(edesc);
10288c2ecf20Sopenharmony_ci				return ERR_PTR(-ENOMEM);
10298c2ecf20Sopenharmony_ci			}
10308c2ecf20Sopenharmony_ci		} else {
10318c2ecf20Sopenharmony_ci			mapped_dst_nents = 0;
10328c2ecf20Sopenharmony_ci		}
10338c2ecf20Sopenharmony_ci	}
10348c2ecf20Sopenharmony_ci
10358c2ecf20Sopenharmony_ci	if ((alg->caam.rfc3686 && encrypt) || !alg->caam.geniv)
10368c2ecf20Sopenharmony_ci		ivsize = crypto_aead_ivsize(aead);
10378c2ecf20Sopenharmony_ci
10388c2ecf20Sopenharmony_ci	/*
10398c2ecf20Sopenharmony_ci	 * Create S/G table: req->assoclen, [IV,] req->src [, req->dst].
10408c2ecf20Sopenharmony_ci	 * Input is not contiguous.
10418c2ecf20Sopenharmony_ci	 * HW reads 4 S/G entries at a time; make sure the reads don't go beyond
10428c2ecf20Sopenharmony_ci	 * the end of the table by allocating more S/G entries. Logic:
10438c2ecf20Sopenharmony_ci	 * if (src != dst && output S/G)
10448c2ecf20Sopenharmony_ci	 *      pad output S/G, if needed
10458c2ecf20Sopenharmony_ci	 * else if (src == dst && S/G)
10468c2ecf20Sopenharmony_ci	 *      overlapping S/Gs; pad one of them
10478c2ecf20Sopenharmony_ci	 * else if (input S/G) ...
10488c2ecf20Sopenharmony_ci	 *      pad input S/G, if needed
10498c2ecf20Sopenharmony_ci	 */
10508c2ecf20Sopenharmony_ci	qm_sg_ents = 1 + !!ivsize + mapped_src_nents;
10518c2ecf20Sopenharmony_ci	if (mapped_dst_nents > 1)
10528c2ecf20Sopenharmony_ci		qm_sg_ents += pad_sg_nents(mapped_dst_nents);
10538c2ecf20Sopenharmony_ci	else if ((req->src == req->dst) && (mapped_src_nents > 1))
10548c2ecf20Sopenharmony_ci		qm_sg_ents = max(pad_sg_nents(qm_sg_ents),
10558c2ecf20Sopenharmony_ci				 1 + !!ivsize + pad_sg_nents(mapped_src_nents));
10568c2ecf20Sopenharmony_ci	else
10578c2ecf20Sopenharmony_ci		qm_sg_ents = pad_sg_nents(qm_sg_ents);
10588c2ecf20Sopenharmony_ci
10598c2ecf20Sopenharmony_ci	sg_table = &edesc->sgt[0];
10608c2ecf20Sopenharmony_ci	qm_sg_bytes = qm_sg_ents * sizeof(*sg_table);
10618c2ecf20Sopenharmony_ci	if (unlikely(offsetof(struct aead_edesc, sgt) + qm_sg_bytes + ivsize >
10628c2ecf20Sopenharmony_ci		     CAAM_QI_MEMCACHE_SIZE)) {
10638c2ecf20Sopenharmony_ci		dev_err(qidev, "No space for %d S/G entries and/or %dB IV\n",
10648c2ecf20Sopenharmony_ci			qm_sg_ents, ivsize);
10658c2ecf20Sopenharmony_ci		caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents, 0,
10668c2ecf20Sopenharmony_ci			   0, DMA_NONE, 0, 0);
10678c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
10688c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
10698c2ecf20Sopenharmony_ci	}
10708c2ecf20Sopenharmony_ci
10718c2ecf20Sopenharmony_ci	if (ivsize) {
10728c2ecf20Sopenharmony_ci		u8 *iv = (u8 *)(sg_table + qm_sg_ents);
10738c2ecf20Sopenharmony_ci
10748c2ecf20Sopenharmony_ci		/* Make sure IV is located in a DMAable area */
10758c2ecf20Sopenharmony_ci		memcpy(iv, req->iv, ivsize);
10768c2ecf20Sopenharmony_ci
10778c2ecf20Sopenharmony_ci		iv_dma = dma_map_single(qidev, iv, ivsize, DMA_TO_DEVICE);
10788c2ecf20Sopenharmony_ci		if (dma_mapping_error(qidev, iv_dma)) {
10798c2ecf20Sopenharmony_ci			dev_err(qidev, "unable to map IV\n");
10808c2ecf20Sopenharmony_ci			caam_unmap(qidev, req->src, req->dst, src_nents,
10818c2ecf20Sopenharmony_ci				   dst_nents, 0, 0, DMA_NONE, 0, 0);
10828c2ecf20Sopenharmony_ci			qi_cache_free(edesc);
10838c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
10848c2ecf20Sopenharmony_ci		}
10858c2ecf20Sopenharmony_ci	}
10868c2ecf20Sopenharmony_ci
10878c2ecf20Sopenharmony_ci	edesc->src_nents = src_nents;
10888c2ecf20Sopenharmony_ci	edesc->dst_nents = dst_nents;
10898c2ecf20Sopenharmony_ci	edesc->iv_dma = iv_dma;
10908c2ecf20Sopenharmony_ci	edesc->drv_req.app_ctx = req;
10918c2ecf20Sopenharmony_ci	edesc->drv_req.cbk = aead_done;
10928c2ecf20Sopenharmony_ci	edesc->drv_req.drv_ctx = drv_ctx;
10938c2ecf20Sopenharmony_ci
10948c2ecf20Sopenharmony_ci	edesc->assoclen = cpu_to_caam32(req->assoclen);
10958c2ecf20Sopenharmony_ci	edesc->assoclen_dma = dma_map_single(qidev, &edesc->assoclen, 4,
10968c2ecf20Sopenharmony_ci					     DMA_TO_DEVICE);
10978c2ecf20Sopenharmony_ci	if (dma_mapping_error(qidev, edesc->assoclen_dma)) {
10988c2ecf20Sopenharmony_ci		dev_err(qidev, "unable to map assoclen\n");
10998c2ecf20Sopenharmony_ci		caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents,
11008c2ecf20Sopenharmony_ci			   iv_dma, ivsize, DMA_TO_DEVICE, 0, 0);
11018c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
11028c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
11038c2ecf20Sopenharmony_ci	}
11048c2ecf20Sopenharmony_ci
11058c2ecf20Sopenharmony_ci	dma_to_qm_sg_one(sg_table, edesc->assoclen_dma, 4, 0);
11068c2ecf20Sopenharmony_ci	qm_sg_index++;
11078c2ecf20Sopenharmony_ci	if (ivsize) {
11088c2ecf20Sopenharmony_ci		dma_to_qm_sg_one(sg_table + qm_sg_index, iv_dma, ivsize, 0);
11098c2ecf20Sopenharmony_ci		qm_sg_index++;
11108c2ecf20Sopenharmony_ci	}
11118c2ecf20Sopenharmony_ci	sg_to_qm_sg_last(req->src, src_len, sg_table + qm_sg_index, 0);
11128c2ecf20Sopenharmony_ci	qm_sg_index += mapped_src_nents;
11138c2ecf20Sopenharmony_ci
11148c2ecf20Sopenharmony_ci	if (mapped_dst_nents > 1)
11158c2ecf20Sopenharmony_ci		sg_to_qm_sg_last(req->dst, dst_len, sg_table + qm_sg_index, 0);
11168c2ecf20Sopenharmony_ci
11178c2ecf20Sopenharmony_ci	qm_sg_dma = dma_map_single(qidev, sg_table, qm_sg_bytes, DMA_TO_DEVICE);
11188c2ecf20Sopenharmony_ci	if (dma_mapping_error(qidev, qm_sg_dma)) {
11198c2ecf20Sopenharmony_ci		dev_err(qidev, "unable to map S/G table\n");
11208c2ecf20Sopenharmony_ci		dma_unmap_single(qidev, edesc->assoclen_dma, 4, DMA_TO_DEVICE);
11218c2ecf20Sopenharmony_ci		caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents,
11228c2ecf20Sopenharmony_ci			   iv_dma, ivsize, DMA_TO_DEVICE, 0, 0);
11238c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
11248c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
11258c2ecf20Sopenharmony_ci	}
11268c2ecf20Sopenharmony_ci
11278c2ecf20Sopenharmony_ci	edesc->qm_sg_dma = qm_sg_dma;
11288c2ecf20Sopenharmony_ci	edesc->qm_sg_bytes = qm_sg_bytes;
11298c2ecf20Sopenharmony_ci
11308c2ecf20Sopenharmony_ci	out_len = req->assoclen + req->cryptlen +
11318c2ecf20Sopenharmony_ci		  (encrypt ? ctx->authsize : (-ctx->authsize));
11328c2ecf20Sopenharmony_ci	in_len = 4 + ivsize + req->assoclen + req->cryptlen;
11338c2ecf20Sopenharmony_ci
11348c2ecf20Sopenharmony_ci	fd_sgt = &edesc->drv_req.fd_sgt[0];
11358c2ecf20Sopenharmony_ci	dma_to_qm_sg_one_last_ext(&fd_sgt[1], qm_sg_dma, in_len, 0);
11368c2ecf20Sopenharmony_ci
11378c2ecf20Sopenharmony_ci	if (req->dst == req->src) {
11388c2ecf20Sopenharmony_ci		if (mapped_src_nents == 1)
11398c2ecf20Sopenharmony_ci			dma_to_qm_sg_one(&fd_sgt[0], sg_dma_address(req->src),
11408c2ecf20Sopenharmony_ci					 out_len, 0);
11418c2ecf20Sopenharmony_ci		else
11428c2ecf20Sopenharmony_ci			dma_to_qm_sg_one_ext(&fd_sgt[0], qm_sg_dma +
11438c2ecf20Sopenharmony_ci					     (1 + !!ivsize) * sizeof(*sg_table),
11448c2ecf20Sopenharmony_ci					     out_len, 0);
11458c2ecf20Sopenharmony_ci	} else if (mapped_dst_nents <= 1) {
11468c2ecf20Sopenharmony_ci		dma_to_qm_sg_one(&fd_sgt[0], sg_dma_address(req->dst), out_len,
11478c2ecf20Sopenharmony_ci				 0);
11488c2ecf20Sopenharmony_ci	} else {
11498c2ecf20Sopenharmony_ci		dma_to_qm_sg_one_ext(&fd_sgt[0], qm_sg_dma + sizeof(*sg_table) *
11508c2ecf20Sopenharmony_ci				     qm_sg_index, out_len, 0);
11518c2ecf20Sopenharmony_ci	}
11528c2ecf20Sopenharmony_ci
11538c2ecf20Sopenharmony_ci	return edesc;
11548c2ecf20Sopenharmony_ci}
11558c2ecf20Sopenharmony_ci
11568c2ecf20Sopenharmony_cistatic inline int aead_crypt(struct aead_request *req, bool encrypt)
11578c2ecf20Sopenharmony_ci{
11588c2ecf20Sopenharmony_ci	struct aead_edesc *edesc;
11598c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
11608c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
11618c2ecf20Sopenharmony_ci	int ret;
11628c2ecf20Sopenharmony_ci
11638c2ecf20Sopenharmony_ci	if (unlikely(caam_congested))
11648c2ecf20Sopenharmony_ci		return -EAGAIN;
11658c2ecf20Sopenharmony_ci
11668c2ecf20Sopenharmony_ci	/* allocate extended descriptor */
11678c2ecf20Sopenharmony_ci	edesc = aead_edesc_alloc(req, encrypt);
11688c2ecf20Sopenharmony_ci	if (IS_ERR_OR_NULL(edesc))
11698c2ecf20Sopenharmony_ci		return PTR_ERR(edesc);
11708c2ecf20Sopenharmony_ci
11718c2ecf20Sopenharmony_ci	/* Create and submit job descriptor */
11728c2ecf20Sopenharmony_ci	ret = caam_qi_enqueue(ctx->qidev, &edesc->drv_req);
11738c2ecf20Sopenharmony_ci	if (!ret) {
11748c2ecf20Sopenharmony_ci		ret = -EINPROGRESS;
11758c2ecf20Sopenharmony_ci	} else {
11768c2ecf20Sopenharmony_ci		aead_unmap(ctx->qidev, edesc, req);
11778c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
11788c2ecf20Sopenharmony_ci	}
11798c2ecf20Sopenharmony_ci
11808c2ecf20Sopenharmony_ci	return ret;
11818c2ecf20Sopenharmony_ci}
11828c2ecf20Sopenharmony_ci
11838c2ecf20Sopenharmony_cistatic int aead_encrypt(struct aead_request *req)
11848c2ecf20Sopenharmony_ci{
11858c2ecf20Sopenharmony_ci	return aead_crypt(req, true);
11868c2ecf20Sopenharmony_ci}
11878c2ecf20Sopenharmony_ci
11888c2ecf20Sopenharmony_cistatic int aead_decrypt(struct aead_request *req)
11898c2ecf20Sopenharmony_ci{
11908c2ecf20Sopenharmony_ci	return aead_crypt(req, false);
11918c2ecf20Sopenharmony_ci}
11928c2ecf20Sopenharmony_ci
11938c2ecf20Sopenharmony_cistatic int ipsec_gcm_encrypt(struct aead_request *req)
11948c2ecf20Sopenharmony_ci{
11958c2ecf20Sopenharmony_ci	return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_crypt(req,
11968c2ecf20Sopenharmony_ci					   true);
11978c2ecf20Sopenharmony_ci}
11988c2ecf20Sopenharmony_ci
11998c2ecf20Sopenharmony_cistatic int ipsec_gcm_decrypt(struct aead_request *req)
12008c2ecf20Sopenharmony_ci{
12018c2ecf20Sopenharmony_ci	return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_crypt(req,
12028c2ecf20Sopenharmony_ci					   false);
12038c2ecf20Sopenharmony_ci}
12048c2ecf20Sopenharmony_ci
12058c2ecf20Sopenharmony_cistatic void skcipher_done(struct caam_drv_req *drv_req, u32 status)
12068c2ecf20Sopenharmony_ci{
12078c2ecf20Sopenharmony_ci	struct skcipher_edesc *edesc;
12088c2ecf20Sopenharmony_ci	struct skcipher_request *req = drv_req->app_ctx;
12098c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
12108c2ecf20Sopenharmony_ci	struct caam_ctx *caam_ctx = crypto_skcipher_ctx(skcipher);
12118c2ecf20Sopenharmony_ci	struct device *qidev = caam_ctx->qidev;
12128c2ecf20Sopenharmony_ci	int ivsize = crypto_skcipher_ivsize(skcipher);
12138c2ecf20Sopenharmony_ci	int ecode = 0;
12148c2ecf20Sopenharmony_ci
12158c2ecf20Sopenharmony_ci	dev_dbg(qidev, "%s %d: status 0x%x\n", __func__, __LINE__, status);
12168c2ecf20Sopenharmony_ci
12178c2ecf20Sopenharmony_ci	edesc = container_of(drv_req, typeof(*edesc), drv_req);
12188c2ecf20Sopenharmony_ci
12198c2ecf20Sopenharmony_ci	if (status)
12208c2ecf20Sopenharmony_ci		ecode = caam_jr_strstatus(qidev, status);
12218c2ecf20Sopenharmony_ci
12228c2ecf20Sopenharmony_ci	print_hex_dump_debug("dstiv  @" __stringify(__LINE__)": ",
12238c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, req->iv,
12248c2ecf20Sopenharmony_ci			     edesc->src_nents > 1 ? 100 : ivsize, 1);
12258c2ecf20Sopenharmony_ci	caam_dump_sg("dst    @" __stringify(__LINE__)": ",
12268c2ecf20Sopenharmony_ci		     DUMP_PREFIX_ADDRESS, 16, 4, req->dst,
12278c2ecf20Sopenharmony_ci		     edesc->dst_nents > 1 ? 100 : req->cryptlen, 1);
12288c2ecf20Sopenharmony_ci
12298c2ecf20Sopenharmony_ci	skcipher_unmap(qidev, edesc, req);
12308c2ecf20Sopenharmony_ci
12318c2ecf20Sopenharmony_ci	/*
12328c2ecf20Sopenharmony_ci	 * The crypto API expects us to set the IV (req->iv) to the last
12338c2ecf20Sopenharmony_ci	 * ciphertext block (CBC mode) or last counter (CTR mode).
12348c2ecf20Sopenharmony_ci	 * This is used e.g. by the CTS mode.
12358c2ecf20Sopenharmony_ci	 */
12368c2ecf20Sopenharmony_ci	if (!ecode)
12378c2ecf20Sopenharmony_ci		memcpy(req->iv, (u8 *)&edesc->sgt[0] + edesc->qm_sg_bytes,
12388c2ecf20Sopenharmony_ci		       ivsize);
12398c2ecf20Sopenharmony_ci
12408c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
12418c2ecf20Sopenharmony_ci	skcipher_request_complete(req, ecode);
12428c2ecf20Sopenharmony_ci}
12438c2ecf20Sopenharmony_ci
12448c2ecf20Sopenharmony_cistatic struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
12458c2ecf20Sopenharmony_ci						   bool encrypt)
12468c2ecf20Sopenharmony_ci{
12478c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
12488c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
12498c2ecf20Sopenharmony_ci	struct device *qidev = ctx->qidev;
12508c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
12518c2ecf20Sopenharmony_ci		       GFP_KERNEL : GFP_ATOMIC;
12528c2ecf20Sopenharmony_ci	int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0;
12538c2ecf20Sopenharmony_ci	struct skcipher_edesc *edesc;
12548c2ecf20Sopenharmony_ci	dma_addr_t iv_dma;
12558c2ecf20Sopenharmony_ci	u8 *iv;
12568c2ecf20Sopenharmony_ci	int ivsize = crypto_skcipher_ivsize(skcipher);
12578c2ecf20Sopenharmony_ci	int dst_sg_idx, qm_sg_ents, qm_sg_bytes;
12588c2ecf20Sopenharmony_ci	struct qm_sg_entry *sg_table, *fd_sgt;
12598c2ecf20Sopenharmony_ci	struct caam_drv_ctx *drv_ctx;
12608c2ecf20Sopenharmony_ci
12618c2ecf20Sopenharmony_ci	drv_ctx = get_drv_ctx(ctx, encrypt ? ENCRYPT : DECRYPT);
12628c2ecf20Sopenharmony_ci	if (IS_ERR_OR_NULL(drv_ctx))
12638c2ecf20Sopenharmony_ci		return (struct skcipher_edesc *)drv_ctx;
12648c2ecf20Sopenharmony_ci
12658c2ecf20Sopenharmony_ci	src_nents = sg_nents_for_len(req->src, req->cryptlen);
12668c2ecf20Sopenharmony_ci	if (unlikely(src_nents < 0)) {
12678c2ecf20Sopenharmony_ci		dev_err(qidev, "Insufficient bytes (%d) in src S/G\n",
12688c2ecf20Sopenharmony_ci			req->cryptlen);
12698c2ecf20Sopenharmony_ci		return ERR_PTR(src_nents);
12708c2ecf20Sopenharmony_ci	}
12718c2ecf20Sopenharmony_ci
12728c2ecf20Sopenharmony_ci	if (unlikely(req->src != req->dst)) {
12738c2ecf20Sopenharmony_ci		dst_nents = sg_nents_for_len(req->dst, req->cryptlen);
12748c2ecf20Sopenharmony_ci		if (unlikely(dst_nents < 0)) {
12758c2ecf20Sopenharmony_ci			dev_err(qidev, "Insufficient bytes (%d) in dst S/G\n",
12768c2ecf20Sopenharmony_ci				req->cryptlen);
12778c2ecf20Sopenharmony_ci			return ERR_PTR(dst_nents);
12788c2ecf20Sopenharmony_ci		}
12798c2ecf20Sopenharmony_ci
12808c2ecf20Sopenharmony_ci		mapped_src_nents = dma_map_sg(qidev, req->src, src_nents,
12818c2ecf20Sopenharmony_ci					      DMA_TO_DEVICE);
12828c2ecf20Sopenharmony_ci		if (unlikely(!mapped_src_nents)) {
12838c2ecf20Sopenharmony_ci			dev_err(qidev, "unable to map source\n");
12848c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
12858c2ecf20Sopenharmony_ci		}
12868c2ecf20Sopenharmony_ci
12878c2ecf20Sopenharmony_ci		mapped_dst_nents = dma_map_sg(qidev, req->dst, dst_nents,
12888c2ecf20Sopenharmony_ci					      DMA_FROM_DEVICE);
12898c2ecf20Sopenharmony_ci		if (unlikely(!mapped_dst_nents)) {
12908c2ecf20Sopenharmony_ci			dev_err(qidev, "unable to map destination\n");
12918c2ecf20Sopenharmony_ci			dma_unmap_sg(qidev, req->src, src_nents, DMA_TO_DEVICE);
12928c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
12938c2ecf20Sopenharmony_ci		}
12948c2ecf20Sopenharmony_ci	} else {
12958c2ecf20Sopenharmony_ci		mapped_src_nents = dma_map_sg(qidev, req->src, src_nents,
12968c2ecf20Sopenharmony_ci					      DMA_BIDIRECTIONAL);
12978c2ecf20Sopenharmony_ci		if (unlikely(!mapped_src_nents)) {
12988c2ecf20Sopenharmony_ci			dev_err(qidev, "unable to map source\n");
12998c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
13008c2ecf20Sopenharmony_ci		}
13018c2ecf20Sopenharmony_ci	}
13028c2ecf20Sopenharmony_ci
13038c2ecf20Sopenharmony_ci	qm_sg_ents = 1 + mapped_src_nents;
13048c2ecf20Sopenharmony_ci	dst_sg_idx = qm_sg_ents;
13058c2ecf20Sopenharmony_ci
13068c2ecf20Sopenharmony_ci	/*
13078c2ecf20Sopenharmony_ci	 * Input, output HW S/G tables: [IV, src][dst, IV]
13088c2ecf20Sopenharmony_ci	 * IV entries point to the same buffer
13098c2ecf20Sopenharmony_ci	 * If src == dst, S/G entries are reused (S/G tables overlap)
13108c2ecf20Sopenharmony_ci	 *
13118c2ecf20Sopenharmony_ci	 * HW reads 4 S/G entries at a time; make sure the reads don't go beyond
13128c2ecf20Sopenharmony_ci	 * the end of the table by allocating more S/G entries.
13138c2ecf20Sopenharmony_ci	 */
13148c2ecf20Sopenharmony_ci	if (req->src != req->dst)
13158c2ecf20Sopenharmony_ci		qm_sg_ents += pad_sg_nents(mapped_dst_nents + 1);
13168c2ecf20Sopenharmony_ci	else
13178c2ecf20Sopenharmony_ci		qm_sg_ents = 1 + pad_sg_nents(qm_sg_ents);
13188c2ecf20Sopenharmony_ci
13198c2ecf20Sopenharmony_ci	qm_sg_bytes = qm_sg_ents * sizeof(struct qm_sg_entry);
13208c2ecf20Sopenharmony_ci	if (unlikely(offsetof(struct skcipher_edesc, sgt) + qm_sg_bytes +
13218c2ecf20Sopenharmony_ci		     ivsize > CAAM_QI_MEMCACHE_SIZE)) {
13228c2ecf20Sopenharmony_ci		dev_err(qidev, "No space for %d S/G entries and/or %dB IV\n",
13238c2ecf20Sopenharmony_ci			qm_sg_ents, ivsize);
13248c2ecf20Sopenharmony_ci		caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents, 0,
13258c2ecf20Sopenharmony_ci			   0, DMA_NONE, 0, 0);
13268c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
13278c2ecf20Sopenharmony_ci	}
13288c2ecf20Sopenharmony_ci
13298c2ecf20Sopenharmony_ci	/* allocate space for base edesc, link tables and IV */
13308c2ecf20Sopenharmony_ci	edesc = qi_cache_alloc(GFP_DMA | flags);
13318c2ecf20Sopenharmony_ci	if (unlikely(!edesc)) {
13328c2ecf20Sopenharmony_ci		dev_err(qidev, "could not allocate extended descriptor\n");
13338c2ecf20Sopenharmony_ci		caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents, 0,
13348c2ecf20Sopenharmony_ci			   0, DMA_NONE, 0, 0);
13358c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
13368c2ecf20Sopenharmony_ci	}
13378c2ecf20Sopenharmony_ci
13388c2ecf20Sopenharmony_ci	/* Make sure IV is located in a DMAable area */
13398c2ecf20Sopenharmony_ci	sg_table = &edesc->sgt[0];
13408c2ecf20Sopenharmony_ci	iv = (u8 *)(sg_table + qm_sg_ents);
13418c2ecf20Sopenharmony_ci	memcpy(iv, req->iv, ivsize);
13428c2ecf20Sopenharmony_ci
13438c2ecf20Sopenharmony_ci	iv_dma = dma_map_single(qidev, iv, ivsize, DMA_BIDIRECTIONAL);
13448c2ecf20Sopenharmony_ci	if (dma_mapping_error(qidev, iv_dma)) {
13458c2ecf20Sopenharmony_ci		dev_err(qidev, "unable to map IV\n");
13468c2ecf20Sopenharmony_ci		caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents, 0,
13478c2ecf20Sopenharmony_ci			   0, DMA_NONE, 0, 0);
13488c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
13498c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
13508c2ecf20Sopenharmony_ci	}
13518c2ecf20Sopenharmony_ci
13528c2ecf20Sopenharmony_ci	edesc->src_nents = src_nents;
13538c2ecf20Sopenharmony_ci	edesc->dst_nents = dst_nents;
13548c2ecf20Sopenharmony_ci	edesc->iv_dma = iv_dma;
13558c2ecf20Sopenharmony_ci	edesc->qm_sg_bytes = qm_sg_bytes;
13568c2ecf20Sopenharmony_ci	edesc->drv_req.app_ctx = req;
13578c2ecf20Sopenharmony_ci	edesc->drv_req.cbk = skcipher_done;
13588c2ecf20Sopenharmony_ci	edesc->drv_req.drv_ctx = drv_ctx;
13598c2ecf20Sopenharmony_ci
13608c2ecf20Sopenharmony_ci	dma_to_qm_sg_one(sg_table, iv_dma, ivsize, 0);
13618c2ecf20Sopenharmony_ci	sg_to_qm_sg(req->src, req->cryptlen, sg_table + 1, 0);
13628c2ecf20Sopenharmony_ci
13638c2ecf20Sopenharmony_ci	if (req->src != req->dst)
13648c2ecf20Sopenharmony_ci		sg_to_qm_sg(req->dst, req->cryptlen, sg_table + dst_sg_idx, 0);
13658c2ecf20Sopenharmony_ci
13668c2ecf20Sopenharmony_ci	dma_to_qm_sg_one(sg_table + dst_sg_idx + mapped_dst_nents, iv_dma,
13678c2ecf20Sopenharmony_ci			 ivsize, 0);
13688c2ecf20Sopenharmony_ci
13698c2ecf20Sopenharmony_ci	edesc->qm_sg_dma = dma_map_single(qidev, sg_table, edesc->qm_sg_bytes,
13708c2ecf20Sopenharmony_ci					  DMA_TO_DEVICE);
13718c2ecf20Sopenharmony_ci	if (dma_mapping_error(qidev, edesc->qm_sg_dma)) {
13728c2ecf20Sopenharmony_ci		dev_err(qidev, "unable to map S/G table\n");
13738c2ecf20Sopenharmony_ci		caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents,
13748c2ecf20Sopenharmony_ci			   iv_dma, ivsize, DMA_BIDIRECTIONAL, 0, 0);
13758c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
13768c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
13778c2ecf20Sopenharmony_ci	}
13788c2ecf20Sopenharmony_ci
13798c2ecf20Sopenharmony_ci	fd_sgt = &edesc->drv_req.fd_sgt[0];
13808c2ecf20Sopenharmony_ci
13818c2ecf20Sopenharmony_ci	dma_to_qm_sg_one_last_ext(&fd_sgt[1], edesc->qm_sg_dma,
13828c2ecf20Sopenharmony_ci				  ivsize + req->cryptlen, 0);
13838c2ecf20Sopenharmony_ci
13848c2ecf20Sopenharmony_ci	if (req->src == req->dst)
13858c2ecf20Sopenharmony_ci		dma_to_qm_sg_one_ext(&fd_sgt[0], edesc->qm_sg_dma +
13868c2ecf20Sopenharmony_ci				     sizeof(*sg_table), req->cryptlen + ivsize,
13878c2ecf20Sopenharmony_ci				     0);
13888c2ecf20Sopenharmony_ci	else
13898c2ecf20Sopenharmony_ci		dma_to_qm_sg_one_ext(&fd_sgt[0], edesc->qm_sg_dma + dst_sg_idx *
13908c2ecf20Sopenharmony_ci				     sizeof(*sg_table), req->cryptlen + ivsize,
13918c2ecf20Sopenharmony_ci				     0);
13928c2ecf20Sopenharmony_ci
13938c2ecf20Sopenharmony_ci	return edesc;
13948c2ecf20Sopenharmony_ci}
13958c2ecf20Sopenharmony_ci
13968c2ecf20Sopenharmony_cistatic inline bool xts_skcipher_ivsize(struct skcipher_request *req)
13978c2ecf20Sopenharmony_ci{
13988c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
13998c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_skcipher_ivsize(skcipher);
14008c2ecf20Sopenharmony_ci
14018c2ecf20Sopenharmony_ci	return !!get_unaligned((u64 *)(req->iv + (ivsize / 2)));
14028c2ecf20Sopenharmony_ci}
14038c2ecf20Sopenharmony_ci
14048c2ecf20Sopenharmony_cistatic inline int skcipher_crypt(struct skcipher_request *req, bool encrypt)
14058c2ecf20Sopenharmony_ci{
14068c2ecf20Sopenharmony_ci	struct skcipher_edesc *edesc;
14078c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
14088c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
14098c2ecf20Sopenharmony_ci	struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctx->jrdev->parent);
14108c2ecf20Sopenharmony_ci	int ret;
14118c2ecf20Sopenharmony_ci
14128c2ecf20Sopenharmony_ci	/*
14138c2ecf20Sopenharmony_ci	 * XTS is expected to return an error even for input length = 0
14148c2ecf20Sopenharmony_ci	 * Note that the case input length < block size will be caught during
14158c2ecf20Sopenharmony_ci	 * HW offloading and return an error.
14168c2ecf20Sopenharmony_ci	 */
14178c2ecf20Sopenharmony_ci	if (!req->cryptlen && !ctx->fallback)
14188c2ecf20Sopenharmony_ci		return 0;
14198c2ecf20Sopenharmony_ci
14208c2ecf20Sopenharmony_ci	if (ctx->fallback && ((ctrlpriv->era <= 8 && xts_skcipher_ivsize(req)) ||
14218c2ecf20Sopenharmony_ci			      ctx->xts_key_fallback)) {
14228c2ecf20Sopenharmony_ci		struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req);
14238c2ecf20Sopenharmony_ci
14248c2ecf20Sopenharmony_ci		skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback);
14258c2ecf20Sopenharmony_ci		skcipher_request_set_callback(&rctx->fallback_req,
14268c2ecf20Sopenharmony_ci					      req->base.flags,
14278c2ecf20Sopenharmony_ci					      req->base.complete,
14288c2ecf20Sopenharmony_ci					      req->base.data);
14298c2ecf20Sopenharmony_ci		skcipher_request_set_crypt(&rctx->fallback_req, req->src,
14308c2ecf20Sopenharmony_ci					   req->dst, req->cryptlen, req->iv);
14318c2ecf20Sopenharmony_ci
14328c2ecf20Sopenharmony_ci		return encrypt ? crypto_skcipher_encrypt(&rctx->fallback_req) :
14338c2ecf20Sopenharmony_ci				 crypto_skcipher_decrypt(&rctx->fallback_req);
14348c2ecf20Sopenharmony_ci	}
14358c2ecf20Sopenharmony_ci
14368c2ecf20Sopenharmony_ci	if (unlikely(caam_congested))
14378c2ecf20Sopenharmony_ci		return -EAGAIN;
14388c2ecf20Sopenharmony_ci
14398c2ecf20Sopenharmony_ci	/* allocate extended descriptor */
14408c2ecf20Sopenharmony_ci	edesc = skcipher_edesc_alloc(req, encrypt);
14418c2ecf20Sopenharmony_ci	if (IS_ERR(edesc))
14428c2ecf20Sopenharmony_ci		return PTR_ERR(edesc);
14438c2ecf20Sopenharmony_ci
14448c2ecf20Sopenharmony_ci	ret = caam_qi_enqueue(ctx->qidev, &edesc->drv_req);
14458c2ecf20Sopenharmony_ci	if (!ret) {
14468c2ecf20Sopenharmony_ci		ret = -EINPROGRESS;
14478c2ecf20Sopenharmony_ci	} else {
14488c2ecf20Sopenharmony_ci		skcipher_unmap(ctx->qidev, edesc, req);
14498c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
14508c2ecf20Sopenharmony_ci	}
14518c2ecf20Sopenharmony_ci
14528c2ecf20Sopenharmony_ci	return ret;
14538c2ecf20Sopenharmony_ci}
14548c2ecf20Sopenharmony_ci
14558c2ecf20Sopenharmony_cistatic int skcipher_encrypt(struct skcipher_request *req)
14568c2ecf20Sopenharmony_ci{
14578c2ecf20Sopenharmony_ci	return skcipher_crypt(req, true);
14588c2ecf20Sopenharmony_ci}
14598c2ecf20Sopenharmony_ci
14608c2ecf20Sopenharmony_cistatic int skcipher_decrypt(struct skcipher_request *req)
14618c2ecf20Sopenharmony_ci{
14628c2ecf20Sopenharmony_ci	return skcipher_crypt(req, false);
14638c2ecf20Sopenharmony_ci}
14648c2ecf20Sopenharmony_ci
14658c2ecf20Sopenharmony_cistatic struct caam_skcipher_alg driver_algs[] = {
14668c2ecf20Sopenharmony_ci	{
14678c2ecf20Sopenharmony_ci		.skcipher = {
14688c2ecf20Sopenharmony_ci			.base = {
14698c2ecf20Sopenharmony_ci				.cra_name = "cbc(aes)",
14708c2ecf20Sopenharmony_ci				.cra_driver_name = "cbc-aes-caam-qi",
14718c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
14728c2ecf20Sopenharmony_ci			},
14738c2ecf20Sopenharmony_ci			.setkey = aes_skcipher_setkey,
14748c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
14758c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
14768c2ecf20Sopenharmony_ci			.min_keysize = AES_MIN_KEY_SIZE,
14778c2ecf20Sopenharmony_ci			.max_keysize = AES_MAX_KEY_SIZE,
14788c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
14798c2ecf20Sopenharmony_ci		},
14808c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
14818c2ecf20Sopenharmony_ci	},
14828c2ecf20Sopenharmony_ci	{
14838c2ecf20Sopenharmony_ci		.skcipher = {
14848c2ecf20Sopenharmony_ci			.base = {
14858c2ecf20Sopenharmony_ci				.cra_name = "cbc(des3_ede)",
14868c2ecf20Sopenharmony_ci				.cra_driver_name = "cbc-3des-caam-qi",
14878c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
14888c2ecf20Sopenharmony_ci			},
14898c2ecf20Sopenharmony_ci			.setkey = des3_skcipher_setkey,
14908c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
14918c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
14928c2ecf20Sopenharmony_ci			.min_keysize = DES3_EDE_KEY_SIZE,
14938c2ecf20Sopenharmony_ci			.max_keysize = DES3_EDE_KEY_SIZE,
14948c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
14958c2ecf20Sopenharmony_ci		},
14968c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
14978c2ecf20Sopenharmony_ci	},
14988c2ecf20Sopenharmony_ci	{
14998c2ecf20Sopenharmony_ci		.skcipher = {
15008c2ecf20Sopenharmony_ci			.base = {
15018c2ecf20Sopenharmony_ci				.cra_name = "cbc(des)",
15028c2ecf20Sopenharmony_ci				.cra_driver_name = "cbc-des-caam-qi",
15038c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
15048c2ecf20Sopenharmony_ci			},
15058c2ecf20Sopenharmony_ci			.setkey = des_skcipher_setkey,
15068c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
15078c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
15088c2ecf20Sopenharmony_ci			.min_keysize = DES_KEY_SIZE,
15098c2ecf20Sopenharmony_ci			.max_keysize = DES_KEY_SIZE,
15108c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
15118c2ecf20Sopenharmony_ci		},
15128c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
15138c2ecf20Sopenharmony_ci	},
15148c2ecf20Sopenharmony_ci	{
15158c2ecf20Sopenharmony_ci		.skcipher = {
15168c2ecf20Sopenharmony_ci			.base = {
15178c2ecf20Sopenharmony_ci				.cra_name = "ctr(aes)",
15188c2ecf20Sopenharmony_ci				.cra_driver_name = "ctr-aes-caam-qi",
15198c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
15208c2ecf20Sopenharmony_ci			},
15218c2ecf20Sopenharmony_ci			.setkey = ctr_skcipher_setkey,
15228c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
15238c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
15248c2ecf20Sopenharmony_ci			.min_keysize = AES_MIN_KEY_SIZE,
15258c2ecf20Sopenharmony_ci			.max_keysize = AES_MAX_KEY_SIZE,
15268c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
15278c2ecf20Sopenharmony_ci			.chunksize = AES_BLOCK_SIZE,
15288c2ecf20Sopenharmony_ci		},
15298c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_AES |
15308c2ecf20Sopenharmony_ci					OP_ALG_AAI_CTR_MOD128,
15318c2ecf20Sopenharmony_ci	},
15328c2ecf20Sopenharmony_ci	{
15338c2ecf20Sopenharmony_ci		.skcipher = {
15348c2ecf20Sopenharmony_ci			.base = {
15358c2ecf20Sopenharmony_ci				.cra_name = "rfc3686(ctr(aes))",
15368c2ecf20Sopenharmony_ci				.cra_driver_name = "rfc3686-ctr-aes-caam-qi",
15378c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
15388c2ecf20Sopenharmony_ci			},
15398c2ecf20Sopenharmony_ci			.setkey = rfc3686_skcipher_setkey,
15408c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
15418c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
15428c2ecf20Sopenharmony_ci			.min_keysize = AES_MIN_KEY_SIZE +
15438c2ecf20Sopenharmony_ci				       CTR_RFC3686_NONCE_SIZE,
15448c2ecf20Sopenharmony_ci			.max_keysize = AES_MAX_KEY_SIZE +
15458c2ecf20Sopenharmony_ci				       CTR_RFC3686_NONCE_SIZE,
15468c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
15478c2ecf20Sopenharmony_ci			.chunksize = AES_BLOCK_SIZE,
15488c2ecf20Sopenharmony_ci		},
15498c2ecf20Sopenharmony_ci		.caam = {
15508c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
15518c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
15528c2ecf20Sopenharmony_ci			.rfc3686 = true,
15538c2ecf20Sopenharmony_ci		},
15548c2ecf20Sopenharmony_ci	},
15558c2ecf20Sopenharmony_ci	{
15568c2ecf20Sopenharmony_ci		.skcipher = {
15578c2ecf20Sopenharmony_ci			.base = {
15588c2ecf20Sopenharmony_ci				.cra_name = "xts(aes)",
15598c2ecf20Sopenharmony_ci				.cra_driver_name = "xts-aes-caam-qi",
15608c2ecf20Sopenharmony_ci				.cra_flags = CRYPTO_ALG_NEED_FALLBACK,
15618c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
15628c2ecf20Sopenharmony_ci			},
15638c2ecf20Sopenharmony_ci			.setkey = xts_skcipher_setkey,
15648c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
15658c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
15668c2ecf20Sopenharmony_ci			.min_keysize = 2 * AES_MIN_KEY_SIZE,
15678c2ecf20Sopenharmony_ci			.max_keysize = 2 * AES_MAX_KEY_SIZE,
15688c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
15698c2ecf20Sopenharmony_ci		},
15708c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_XTS,
15718c2ecf20Sopenharmony_ci	},
15728c2ecf20Sopenharmony_ci};
15738c2ecf20Sopenharmony_ci
15748c2ecf20Sopenharmony_cistatic struct caam_aead_alg driver_aeads[] = {
15758c2ecf20Sopenharmony_ci	{
15768c2ecf20Sopenharmony_ci		.aead = {
15778c2ecf20Sopenharmony_ci			.base = {
15788c2ecf20Sopenharmony_ci				.cra_name = "rfc4106(gcm(aes))",
15798c2ecf20Sopenharmony_ci				.cra_driver_name = "rfc4106-gcm-aes-caam-qi",
15808c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
15818c2ecf20Sopenharmony_ci			},
15828c2ecf20Sopenharmony_ci			.setkey = rfc4106_setkey,
15838c2ecf20Sopenharmony_ci			.setauthsize = rfc4106_setauthsize,
15848c2ecf20Sopenharmony_ci			.encrypt = ipsec_gcm_encrypt,
15858c2ecf20Sopenharmony_ci			.decrypt = ipsec_gcm_decrypt,
15868c2ecf20Sopenharmony_ci			.ivsize = 8,
15878c2ecf20Sopenharmony_ci			.maxauthsize = AES_BLOCK_SIZE,
15888c2ecf20Sopenharmony_ci		},
15898c2ecf20Sopenharmony_ci		.caam = {
15908c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
15918c2ecf20Sopenharmony_ci			.nodkp = true,
15928c2ecf20Sopenharmony_ci		},
15938c2ecf20Sopenharmony_ci	},
15948c2ecf20Sopenharmony_ci	{
15958c2ecf20Sopenharmony_ci		.aead = {
15968c2ecf20Sopenharmony_ci			.base = {
15978c2ecf20Sopenharmony_ci				.cra_name = "rfc4543(gcm(aes))",
15988c2ecf20Sopenharmony_ci				.cra_driver_name = "rfc4543-gcm-aes-caam-qi",
15998c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
16008c2ecf20Sopenharmony_ci			},
16018c2ecf20Sopenharmony_ci			.setkey = rfc4543_setkey,
16028c2ecf20Sopenharmony_ci			.setauthsize = rfc4543_setauthsize,
16038c2ecf20Sopenharmony_ci			.encrypt = ipsec_gcm_encrypt,
16048c2ecf20Sopenharmony_ci			.decrypt = ipsec_gcm_decrypt,
16058c2ecf20Sopenharmony_ci			.ivsize = 8,
16068c2ecf20Sopenharmony_ci			.maxauthsize = AES_BLOCK_SIZE,
16078c2ecf20Sopenharmony_ci		},
16088c2ecf20Sopenharmony_ci		.caam = {
16098c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
16108c2ecf20Sopenharmony_ci			.nodkp = true,
16118c2ecf20Sopenharmony_ci		},
16128c2ecf20Sopenharmony_ci	},
16138c2ecf20Sopenharmony_ci	/* Galois Counter Mode */
16148c2ecf20Sopenharmony_ci	{
16158c2ecf20Sopenharmony_ci		.aead = {
16168c2ecf20Sopenharmony_ci			.base = {
16178c2ecf20Sopenharmony_ci				.cra_name = "gcm(aes)",
16188c2ecf20Sopenharmony_ci				.cra_driver_name = "gcm-aes-caam-qi",
16198c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
16208c2ecf20Sopenharmony_ci			},
16218c2ecf20Sopenharmony_ci			.setkey = gcm_setkey,
16228c2ecf20Sopenharmony_ci			.setauthsize = gcm_setauthsize,
16238c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
16248c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
16258c2ecf20Sopenharmony_ci			.ivsize = 12,
16268c2ecf20Sopenharmony_ci			.maxauthsize = AES_BLOCK_SIZE,
16278c2ecf20Sopenharmony_ci		},
16288c2ecf20Sopenharmony_ci		.caam = {
16298c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
16308c2ecf20Sopenharmony_ci			.nodkp = true,
16318c2ecf20Sopenharmony_ci		}
16328c2ecf20Sopenharmony_ci	},
16338c2ecf20Sopenharmony_ci	/* single-pass ipsec_esp descriptor */
16348c2ecf20Sopenharmony_ci	{
16358c2ecf20Sopenharmony_ci		.aead = {
16368c2ecf20Sopenharmony_ci			.base = {
16378c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(md5),cbc(aes))",
16388c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-md5-"
16398c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi",
16408c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
16418c2ecf20Sopenharmony_ci			},
16428c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
16438c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
16448c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
16458c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
16468c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
16478c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
16488c2ecf20Sopenharmony_ci		},
16498c2ecf20Sopenharmony_ci		.caam = {
16508c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
16518c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
16528c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
16538c2ecf20Sopenharmony_ci		}
16548c2ecf20Sopenharmony_ci	},
16558c2ecf20Sopenharmony_ci	{
16568c2ecf20Sopenharmony_ci		.aead = {
16578c2ecf20Sopenharmony_ci			.base = {
16588c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(md5),"
16598c2ecf20Sopenharmony_ci					    "cbc(aes)))",
16608c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-hmac-md5-"
16618c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi",
16628c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
16638c2ecf20Sopenharmony_ci			},
16648c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
16658c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
16668c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
16678c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
16688c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
16698c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
16708c2ecf20Sopenharmony_ci		},
16718c2ecf20Sopenharmony_ci		.caam = {
16728c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
16738c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
16748c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
16758c2ecf20Sopenharmony_ci			.geniv = true,
16768c2ecf20Sopenharmony_ci		}
16778c2ecf20Sopenharmony_ci	},
16788c2ecf20Sopenharmony_ci	{
16798c2ecf20Sopenharmony_ci		.aead = {
16808c2ecf20Sopenharmony_ci			.base = {
16818c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha1),cbc(aes))",
16828c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha1-"
16838c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi",
16848c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
16858c2ecf20Sopenharmony_ci			},
16868c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
16878c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
16888c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
16898c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
16908c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
16918c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
16928c2ecf20Sopenharmony_ci		},
16938c2ecf20Sopenharmony_ci		.caam = {
16948c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
16958c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
16968c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
16978c2ecf20Sopenharmony_ci		}
16988c2ecf20Sopenharmony_ci	},
16998c2ecf20Sopenharmony_ci	{
17008c2ecf20Sopenharmony_ci		.aead = {
17018c2ecf20Sopenharmony_ci			.base = {
17028c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha1),"
17038c2ecf20Sopenharmony_ci					    "cbc(aes)))",
17048c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
17058c2ecf20Sopenharmony_ci						   "hmac-sha1-cbc-aes-caam-qi",
17068c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
17078c2ecf20Sopenharmony_ci			},
17088c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
17098c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
17108c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
17118c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
17128c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
17138c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
17148c2ecf20Sopenharmony_ci		},
17158c2ecf20Sopenharmony_ci		.caam = {
17168c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
17178c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
17188c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
17198c2ecf20Sopenharmony_ci			.geniv = true,
17208c2ecf20Sopenharmony_ci		},
17218c2ecf20Sopenharmony_ci	},
17228c2ecf20Sopenharmony_ci	{
17238c2ecf20Sopenharmony_ci		.aead = {
17248c2ecf20Sopenharmony_ci			.base = {
17258c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha224),cbc(aes))",
17268c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha224-"
17278c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi",
17288c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
17298c2ecf20Sopenharmony_ci			},
17308c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
17318c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
17328c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
17338c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
17348c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
17358c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
17368c2ecf20Sopenharmony_ci		},
17378c2ecf20Sopenharmony_ci		.caam = {
17388c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
17398c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
17408c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
17418c2ecf20Sopenharmony_ci		}
17428c2ecf20Sopenharmony_ci	},
17438c2ecf20Sopenharmony_ci	{
17448c2ecf20Sopenharmony_ci		.aead = {
17458c2ecf20Sopenharmony_ci			.base = {
17468c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha224),"
17478c2ecf20Sopenharmony_ci					    "cbc(aes)))",
17488c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
17498c2ecf20Sopenharmony_ci						   "hmac-sha224-cbc-aes-caam-qi",
17508c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
17518c2ecf20Sopenharmony_ci			},
17528c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
17538c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
17548c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
17558c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
17568c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
17578c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
17588c2ecf20Sopenharmony_ci		},
17598c2ecf20Sopenharmony_ci		.caam = {
17608c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
17618c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
17628c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
17638c2ecf20Sopenharmony_ci			.geniv = true,
17648c2ecf20Sopenharmony_ci		}
17658c2ecf20Sopenharmony_ci	},
17668c2ecf20Sopenharmony_ci	{
17678c2ecf20Sopenharmony_ci		.aead = {
17688c2ecf20Sopenharmony_ci			.base = {
17698c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha256),cbc(aes))",
17708c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha256-"
17718c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi",
17728c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
17738c2ecf20Sopenharmony_ci			},
17748c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
17758c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
17768c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
17778c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
17788c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
17798c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
17808c2ecf20Sopenharmony_ci		},
17818c2ecf20Sopenharmony_ci		.caam = {
17828c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
17838c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
17848c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
17858c2ecf20Sopenharmony_ci		}
17868c2ecf20Sopenharmony_ci	},
17878c2ecf20Sopenharmony_ci	{
17888c2ecf20Sopenharmony_ci		.aead = {
17898c2ecf20Sopenharmony_ci			.base = {
17908c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha256),"
17918c2ecf20Sopenharmony_ci					    "cbc(aes)))",
17928c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
17938c2ecf20Sopenharmony_ci						   "hmac-sha256-cbc-aes-"
17948c2ecf20Sopenharmony_ci						   "caam-qi",
17958c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
17968c2ecf20Sopenharmony_ci			},
17978c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
17988c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
17998c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
18008c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
18018c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
18028c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
18038c2ecf20Sopenharmony_ci		},
18048c2ecf20Sopenharmony_ci		.caam = {
18058c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
18068c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
18078c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
18088c2ecf20Sopenharmony_ci			.geniv = true,
18098c2ecf20Sopenharmony_ci		}
18108c2ecf20Sopenharmony_ci	},
18118c2ecf20Sopenharmony_ci	{
18128c2ecf20Sopenharmony_ci		.aead = {
18138c2ecf20Sopenharmony_ci			.base = {
18148c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha384),cbc(aes))",
18158c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha384-"
18168c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi",
18178c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
18188c2ecf20Sopenharmony_ci			},
18198c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
18208c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
18218c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
18228c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
18238c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
18248c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
18258c2ecf20Sopenharmony_ci		},
18268c2ecf20Sopenharmony_ci		.caam = {
18278c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
18288c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
18298c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
18308c2ecf20Sopenharmony_ci		}
18318c2ecf20Sopenharmony_ci	},
18328c2ecf20Sopenharmony_ci	{
18338c2ecf20Sopenharmony_ci		.aead = {
18348c2ecf20Sopenharmony_ci			.base = {
18358c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha384),"
18368c2ecf20Sopenharmony_ci					    "cbc(aes)))",
18378c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
18388c2ecf20Sopenharmony_ci						   "hmac-sha384-cbc-aes-"
18398c2ecf20Sopenharmony_ci						   "caam-qi",
18408c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
18418c2ecf20Sopenharmony_ci			},
18428c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
18438c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
18448c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
18458c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
18468c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
18478c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
18488c2ecf20Sopenharmony_ci		},
18498c2ecf20Sopenharmony_ci		.caam = {
18508c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
18518c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
18528c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
18538c2ecf20Sopenharmony_ci			.geniv = true,
18548c2ecf20Sopenharmony_ci		}
18558c2ecf20Sopenharmony_ci	},
18568c2ecf20Sopenharmony_ci	{
18578c2ecf20Sopenharmony_ci		.aead = {
18588c2ecf20Sopenharmony_ci			.base = {
18598c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha512),cbc(aes))",
18608c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha512-"
18618c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi",
18628c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
18638c2ecf20Sopenharmony_ci			},
18648c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
18658c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
18668c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
18678c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
18688c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
18698c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
18708c2ecf20Sopenharmony_ci		},
18718c2ecf20Sopenharmony_ci		.caam = {
18728c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
18738c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
18748c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
18758c2ecf20Sopenharmony_ci		}
18768c2ecf20Sopenharmony_ci	},
18778c2ecf20Sopenharmony_ci	{
18788c2ecf20Sopenharmony_ci		.aead = {
18798c2ecf20Sopenharmony_ci			.base = {
18808c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha512),"
18818c2ecf20Sopenharmony_ci					    "cbc(aes)))",
18828c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
18838c2ecf20Sopenharmony_ci						   "hmac-sha512-cbc-aes-"
18848c2ecf20Sopenharmony_ci						   "caam-qi",
18858c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
18868c2ecf20Sopenharmony_ci			},
18878c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
18888c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
18898c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
18908c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
18918c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
18928c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
18938c2ecf20Sopenharmony_ci		},
18948c2ecf20Sopenharmony_ci		.caam = {
18958c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
18968c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
18978c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
18988c2ecf20Sopenharmony_ci			.geniv = true,
18998c2ecf20Sopenharmony_ci		}
19008c2ecf20Sopenharmony_ci	},
19018c2ecf20Sopenharmony_ci	{
19028c2ecf20Sopenharmony_ci		.aead = {
19038c2ecf20Sopenharmony_ci			.base = {
19048c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(md5),cbc(des3_ede))",
19058c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-md5-"
19068c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi",
19078c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
19088c2ecf20Sopenharmony_ci			},
19098c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
19108c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
19118c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
19128c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
19138c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
19148c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
19158c2ecf20Sopenharmony_ci		},
19168c2ecf20Sopenharmony_ci		.caam = {
19178c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
19188c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
19198c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
19208c2ecf20Sopenharmony_ci		}
19218c2ecf20Sopenharmony_ci	},
19228c2ecf20Sopenharmony_ci	{
19238c2ecf20Sopenharmony_ci		.aead = {
19248c2ecf20Sopenharmony_ci			.base = {
19258c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(md5),"
19268c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
19278c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-hmac-md5-"
19288c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi",
19298c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
19308c2ecf20Sopenharmony_ci			},
19318c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
19328c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
19338c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
19348c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
19358c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
19368c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
19378c2ecf20Sopenharmony_ci		},
19388c2ecf20Sopenharmony_ci		.caam = {
19398c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
19408c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
19418c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
19428c2ecf20Sopenharmony_ci			.geniv = true,
19438c2ecf20Sopenharmony_ci		}
19448c2ecf20Sopenharmony_ci	},
19458c2ecf20Sopenharmony_ci	{
19468c2ecf20Sopenharmony_ci		.aead = {
19478c2ecf20Sopenharmony_ci			.base = {
19488c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha1),"
19498c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
19508c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha1-"
19518c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi",
19528c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
19538c2ecf20Sopenharmony_ci			},
19548c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
19558c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
19568c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
19578c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
19588c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
19598c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
19608c2ecf20Sopenharmony_ci		},
19618c2ecf20Sopenharmony_ci		.caam = {
19628c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
19638c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
19648c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
19658c2ecf20Sopenharmony_ci		},
19668c2ecf20Sopenharmony_ci	},
19678c2ecf20Sopenharmony_ci	{
19688c2ecf20Sopenharmony_ci		.aead = {
19698c2ecf20Sopenharmony_ci			.base = {
19708c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha1),"
19718c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
19728c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
19738c2ecf20Sopenharmony_ci						   "hmac-sha1-"
19748c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi",
19758c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
19768c2ecf20Sopenharmony_ci			},
19778c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
19788c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
19798c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
19808c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
19818c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
19828c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
19838c2ecf20Sopenharmony_ci		},
19848c2ecf20Sopenharmony_ci		.caam = {
19858c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
19868c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
19878c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
19888c2ecf20Sopenharmony_ci			.geniv = true,
19898c2ecf20Sopenharmony_ci		}
19908c2ecf20Sopenharmony_ci	},
19918c2ecf20Sopenharmony_ci	{
19928c2ecf20Sopenharmony_ci		.aead = {
19938c2ecf20Sopenharmony_ci			.base = {
19948c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha224),"
19958c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
19968c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha224-"
19978c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi",
19988c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
19998c2ecf20Sopenharmony_ci			},
20008c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
20018c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
20028c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
20038c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
20048c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
20058c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
20068c2ecf20Sopenharmony_ci		},
20078c2ecf20Sopenharmony_ci		.caam = {
20088c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
20098c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
20108c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
20118c2ecf20Sopenharmony_ci		},
20128c2ecf20Sopenharmony_ci	},
20138c2ecf20Sopenharmony_ci	{
20148c2ecf20Sopenharmony_ci		.aead = {
20158c2ecf20Sopenharmony_ci			.base = {
20168c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha224),"
20178c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
20188c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
20198c2ecf20Sopenharmony_ci						   "hmac-sha224-"
20208c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi",
20218c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
20228c2ecf20Sopenharmony_ci			},
20238c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
20248c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
20258c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
20268c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
20278c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
20288c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
20298c2ecf20Sopenharmony_ci		},
20308c2ecf20Sopenharmony_ci		.caam = {
20318c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
20328c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
20338c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
20348c2ecf20Sopenharmony_ci			.geniv = true,
20358c2ecf20Sopenharmony_ci		}
20368c2ecf20Sopenharmony_ci	},
20378c2ecf20Sopenharmony_ci	{
20388c2ecf20Sopenharmony_ci		.aead = {
20398c2ecf20Sopenharmony_ci			.base = {
20408c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha256),"
20418c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
20428c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha256-"
20438c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi",
20448c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
20458c2ecf20Sopenharmony_ci			},
20468c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
20478c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
20488c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
20498c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
20508c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
20518c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
20528c2ecf20Sopenharmony_ci		},
20538c2ecf20Sopenharmony_ci		.caam = {
20548c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
20558c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
20568c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
20578c2ecf20Sopenharmony_ci		},
20588c2ecf20Sopenharmony_ci	},
20598c2ecf20Sopenharmony_ci	{
20608c2ecf20Sopenharmony_ci		.aead = {
20618c2ecf20Sopenharmony_ci			.base = {
20628c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha256),"
20638c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
20648c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
20658c2ecf20Sopenharmony_ci						   "hmac-sha256-"
20668c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi",
20678c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
20688c2ecf20Sopenharmony_ci			},
20698c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
20708c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
20718c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
20728c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
20738c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
20748c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
20758c2ecf20Sopenharmony_ci		},
20768c2ecf20Sopenharmony_ci		.caam = {
20778c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
20788c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
20798c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
20808c2ecf20Sopenharmony_ci			.geniv = true,
20818c2ecf20Sopenharmony_ci		}
20828c2ecf20Sopenharmony_ci	},
20838c2ecf20Sopenharmony_ci	{
20848c2ecf20Sopenharmony_ci		.aead = {
20858c2ecf20Sopenharmony_ci			.base = {
20868c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha384),"
20878c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
20888c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha384-"
20898c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi",
20908c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
20918c2ecf20Sopenharmony_ci			},
20928c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
20938c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
20948c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
20958c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
20968c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
20978c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
20988c2ecf20Sopenharmony_ci		},
20998c2ecf20Sopenharmony_ci		.caam = {
21008c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
21018c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
21028c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21038c2ecf20Sopenharmony_ci		},
21048c2ecf20Sopenharmony_ci	},
21058c2ecf20Sopenharmony_ci	{
21068c2ecf20Sopenharmony_ci		.aead = {
21078c2ecf20Sopenharmony_ci			.base = {
21088c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha384),"
21098c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
21108c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
21118c2ecf20Sopenharmony_ci						   "hmac-sha384-"
21128c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi",
21138c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
21148c2ecf20Sopenharmony_ci			},
21158c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
21168c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
21178c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
21188c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
21198c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
21208c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
21218c2ecf20Sopenharmony_ci		},
21228c2ecf20Sopenharmony_ci		.caam = {
21238c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
21248c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
21258c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21268c2ecf20Sopenharmony_ci			.geniv = true,
21278c2ecf20Sopenharmony_ci		}
21288c2ecf20Sopenharmony_ci	},
21298c2ecf20Sopenharmony_ci	{
21308c2ecf20Sopenharmony_ci		.aead = {
21318c2ecf20Sopenharmony_ci			.base = {
21328c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha512),"
21338c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
21348c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha512-"
21358c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi",
21368c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
21378c2ecf20Sopenharmony_ci			},
21388c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
21398c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
21408c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
21418c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
21428c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
21438c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
21448c2ecf20Sopenharmony_ci		},
21458c2ecf20Sopenharmony_ci		.caam = {
21468c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
21478c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
21488c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21498c2ecf20Sopenharmony_ci		},
21508c2ecf20Sopenharmony_ci	},
21518c2ecf20Sopenharmony_ci	{
21528c2ecf20Sopenharmony_ci		.aead = {
21538c2ecf20Sopenharmony_ci			.base = {
21548c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha512),"
21558c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
21568c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
21578c2ecf20Sopenharmony_ci						   "hmac-sha512-"
21588c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi",
21598c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
21608c2ecf20Sopenharmony_ci			},
21618c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
21628c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
21638c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
21648c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
21658c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
21668c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
21678c2ecf20Sopenharmony_ci		},
21688c2ecf20Sopenharmony_ci		.caam = {
21698c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
21708c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
21718c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21728c2ecf20Sopenharmony_ci			.geniv = true,
21738c2ecf20Sopenharmony_ci		}
21748c2ecf20Sopenharmony_ci	},
21758c2ecf20Sopenharmony_ci	{
21768c2ecf20Sopenharmony_ci		.aead = {
21778c2ecf20Sopenharmony_ci			.base = {
21788c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(md5),cbc(des))",
21798c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-md5-"
21808c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi",
21818c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
21828c2ecf20Sopenharmony_ci			},
21838c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
21848c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
21858c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
21868c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
21878c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
21888c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
21898c2ecf20Sopenharmony_ci		},
21908c2ecf20Sopenharmony_ci		.caam = {
21918c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
21928c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
21938c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21948c2ecf20Sopenharmony_ci		},
21958c2ecf20Sopenharmony_ci	},
21968c2ecf20Sopenharmony_ci	{
21978c2ecf20Sopenharmony_ci		.aead = {
21988c2ecf20Sopenharmony_ci			.base = {
21998c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(md5),"
22008c2ecf20Sopenharmony_ci					    "cbc(des)))",
22018c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-hmac-md5-"
22028c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi",
22038c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
22048c2ecf20Sopenharmony_ci			},
22058c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
22068c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22078c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
22088c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
22098c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
22108c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
22118c2ecf20Sopenharmony_ci		},
22128c2ecf20Sopenharmony_ci		.caam = {
22138c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
22148c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
22158c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
22168c2ecf20Sopenharmony_ci			.geniv = true,
22178c2ecf20Sopenharmony_ci		}
22188c2ecf20Sopenharmony_ci	},
22198c2ecf20Sopenharmony_ci	{
22208c2ecf20Sopenharmony_ci		.aead = {
22218c2ecf20Sopenharmony_ci			.base = {
22228c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha1),cbc(des))",
22238c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha1-"
22248c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi",
22258c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
22268c2ecf20Sopenharmony_ci			},
22278c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
22288c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22298c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
22308c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
22318c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
22328c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
22338c2ecf20Sopenharmony_ci		},
22348c2ecf20Sopenharmony_ci		.caam = {
22358c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
22368c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
22378c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
22388c2ecf20Sopenharmony_ci		},
22398c2ecf20Sopenharmony_ci	},
22408c2ecf20Sopenharmony_ci	{
22418c2ecf20Sopenharmony_ci		.aead = {
22428c2ecf20Sopenharmony_ci			.base = {
22438c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha1),"
22448c2ecf20Sopenharmony_ci					    "cbc(des)))",
22458c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
22468c2ecf20Sopenharmony_ci						   "hmac-sha1-cbc-des-caam-qi",
22478c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
22488c2ecf20Sopenharmony_ci			},
22498c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
22508c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22518c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
22528c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
22538c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
22548c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
22558c2ecf20Sopenharmony_ci		},
22568c2ecf20Sopenharmony_ci		.caam = {
22578c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
22588c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
22598c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
22608c2ecf20Sopenharmony_ci			.geniv = true,
22618c2ecf20Sopenharmony_ci		}
22628c2ecf20Sopenharmony_ci	},
22638c2ecf20Sopenharmony_ci	{
22648c2ecf20Sopenharmony_ci		.aead = {
22658c2ecf20Sopenharmony_ci			.base = {
22668c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha224),cbc(des))",
22678c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha224-"
22688c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi",
22698c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
22708c2ecf20Sopenharmony_ci			},
22718c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
22728c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22738c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
22748c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
22758c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
22768c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
22778c2ecf20Sopenharmony_ci		},
22788c2ecf20Sopenharmony_ci		.caam = {
22798c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
22808c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
22818c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
22828c2ecf20Sopenharmony_ci		},
22838c2ecf20Sopenharmony_ci	},
22848c2ecf20Sopenharmony_ci	{
22858c2ecf20Sopenharmony_ci		.aead = {
22868c2ecf20Sopenharmony_ci			.base = {
22878c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha224),"
22888c2ecf20Sopenharmony_ci					    "cbc(des)))",
22898c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
22908c2ecf20Sopenharmony_ci						   "hmac-sha224-cbc-des-"
22918c2ecf20Sopenharmony_ci						   "caam-qi",
22928c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
22938c2ecf20Sopenharmony_ci			},
22948c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
22958c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22968c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
22978c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
22988c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
22998c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
23008c2ecf20Sopenharmony_ci		},
23018c2ecf20Sopenharmony_ci		.caam = {
23028c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
23038c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
23048c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23058c2ecf20Sopenharmony_ci			.geniv = true,
23068c2ecf20Sopenharmony_ci		}
23078c2ecf20Sopenharmony_ci	},
23088c2ecf20Sopenharmony_ci	{
23098c2ecf20Sopenharmony_ci		.aead = {
23108c2ecf20Sopenharmony_ci			.base = {
23118c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha256),cbc(des))",
23128c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha256-"
23138c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi",
23148c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
23158c2ecf20Sopenharmony_ci			},
23168c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
23178c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
23188c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
23198c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
23208c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
23218c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
23228c2ecf20Sopenharmony_ci		},
23238c2ecf20Sopenharmony_ci		.caam = {
23248c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
23258c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
23268c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23278c2ecf20Sopenharmony_ci		},
23288c2ecf20Sopenharmony_ci	},
23298c2ecf20Sopenharmony_ci	{
23308c2ecf20Sopenharmony_ci		.aead = {
23318c2ecf20Sopenharmony_ci			.base = {
23328c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha256),"
23338c2ecf20Sopenharmony_ci					    "cbc(des)))",
23348c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
23358c2ecf20Sopenharmony_ci						   "hmac-sha256-cbc-des-"
23368c2ecf20Sopenharmony_ci						   "caam-qi",
23378c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
23388c2ecf20Sopenharmony_ci			},
23398c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
23408c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
23418c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
23428c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
23438c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
23448c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
23458c2ecf20Sopenharmony_ci		},
23468c2ecf20Sopenharmony_ci		.caam = {
23478c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
23488c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
23498c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23508c2ecf20Sopenharmony_ci			.geniv = true,
23518c2ecf20Sopenharmony_ci		},
23528c2ecf20Sopenharmony_ci	},
23538c2ecf20Sopenharmony_ci	{
23548c2ecf20Sopenharmony_ci		.aead = {
23558c2ecf20Sopenharmony_ci			.base = {
23568c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha384),cbc(des))",
23578c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha384-"
23588c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi",
23598c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
23608c2ecf20Sopenharmony_ci			},
23618c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
23628c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
23638c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
23648c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
23658c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
23668c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
23678c2ecf20Sopenharmony_ci		},
23688c2ecf20Sopenharmony_ci		.caam = {
23698c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
23708c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
23718c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23728c2ecf20Sopenharmony_ci		},
23738c2ecf20Sopenharmony_ci	},
23748c2ecf20Sopenharmony_ci	{
23758c2ecf20Sopenharmony_ci		.aead = {
23768c2ecf20Sopenharmony_ci			.base = {
23778c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha384),"
23788c2ecf20Sopenharmony_ci					    "cbc(des)))",
23798c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
23808c2ecf20Sopenharmony_ci						   "hmac-sha384-cbc-des-"
23818c2ecf20Sopenharmony_ci						   "caam-qi",
23828c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
23838c2ecf20Sopenharmony_ci			},
23848c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
23858c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
23868c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
23878c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
23888c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
23898c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
23908c2ecf20Sopenharmony_ci		},
23918c2ecf20Sopenharmony_ci		.caam = {
23928c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
23938c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
23948c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23958c2ecf20Sopenharmony_ci			.geniv = true,
23968c2ecf20Sopenharmony_ci		}
23978c2ecf20Sopenharmony_ci	},
23988c2ecf20Sopenharmony_ci	{
23998c2ecf20Sopenharmony_ci		.aead = {
24008c2ecf20Sopenharmony_ci			.base = {
24018c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha512),cbc(des))",
24028c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha512-"
24038c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi",
24048c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
24058c2ecf20Sopenharmony_ci			},
24068c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
24078c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
24088c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
24098c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
24108c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
24118c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
24128c2ecf20Sopenharmony_ci		},
24138c2ecf20Sopenharmony_ci		.caam = {
24148c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
24158c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
24168c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
24178c2ecf20Sopenharmony_ci		}
24188c2ecf20Sopenharmony_ci	},
24198c2ecf20Sopenharmony_ci	{
24208c2ecf20Sopenharmony_ci		.aead = {
24218c2ecf20Sopenharmony_ci			.base = {
24228c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha512),"
24238c2ecf20Sopenharmony_ci					    "cbc(des)))",
24248c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
24258c2ecf20Sopenharmony_ci						   "hmac-sha512-cbc-des-"
24268c2ecf20Sopenharmony_ci						   "caam-qi",
24278c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
24288c2ecf20Sopenharmony_ci			},
24298c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
24308c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
24318c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
24328c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
24338c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
24348c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
24358c2ecf20Sopenharmony_ci		},
24368c2ecf20Sopenharmony_ci		.caam = {
24378c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
24388c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
24398c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
24408c2ecf20Sopenharmony_ci			.geniv = true,
24418c2ecf20Sopenharmony_ci		}
24428c2ecf20Sopenharmony_ci	},
24438c2ecf20Sopenharmony_ci};
24448c2ecf20Sopenharmony_ci
24458c2ecf20Sopenharmony_cistatic int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam,
24468c2ecf20Sopenharmony_ci			    bool uses_dkp)
24478c2ecf20Sopenharmony_ci{
24488c2ecf20Sopenharmony_ci	struct caam_drv_private *priv;
24498c2ecf20Sopenharmony_ci	struct device *dev;
24508c2ecf20Sopenharmony_ci
24518c2ecf20Sopenharmony_ci	/*
24528c2ecf20Sopenharmony_ci	 * distribute tfms across job rings to ensure in-order
24538c2ecf20Sopenharmony_ci	 * crypto request processing per tfm
24548c2ecf20Sopenharmony_ci	 */
24558c2ecf20Sopenharmony_ci	ctx->jrdev = caam_jr_alloc();
24568c2ecf20Sopenharmony_ci	if (IS_ERR(ctx->jrdev)) {
24578c2ecf20Sopenharmony_ci		pr_err("Job Ring Device allocation for transform failed\n");
24588c2ecf20Sopenharmony_ci		return PTR_ERR(ctx->jrdev);
24598c2ecf20Sopenharmony_ci	}
24608c2ecf20Sopenharmony_ci
24618c2ecf20Sopenharmony_ci	dev = ctx->jrdev->parent;
24628c2ecf20Sopenharmony_ci	priv = dev_get_drvdata(dev);
24638c2ecf20Sopenharmony_ci	if (priv->era >= 6 && uses_dkp)
24648c2ecf20Sopenharmony_ci		ctx->dir = DMA_BIDIRECTIONAL;
24658c2ecf20Sopenharmony_ci	else
24668c2ecf20Sopenharmony_ci		ctx->dir = DMA_TO_DEVICE;
24678c2ecf20Sopenharmony_ci
24688c2ecf20Sopenharmony_ci	ctx->key_dma = dma_map_single(dev, ctx->key, sizeof(ctx->key),
24698c2ecf20Sopenharmony_ci				      ctx->dir);
24708c2ecf20Sopenharmony_ci	if (dma_mapping_error(dev, ctx->key_dma)) {
24718c2ecf20Sopenharmony_ci		dev_err(dev, "unable to map key\n");
24728c2ecf20Sopenharmony_ci		caam_jr_free(ctx->jrdev);
24738c2ecf20Sopenharmony_ci		return -ENOMEM;
24748c2ecf20Sopenharmony_ci	}
24758c2ecf20Sopenharmony_ci
24768c2ecf20Sopenharmony_ci	/* copy descriptor header template value */
24778c2ecf20Sopenharmony_ci	ctx->cdata.algtype = OP_TYPE_CLASS1_ALG | caam->class1_alg_type;
24788c2ecf20Sopenharmony_ci	ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam->class2_alg_type;
24798c2ecf20Sopenharmony_ci
24808c2ecf20Sopenharmony_ci	ctx->qidev = dev;
24818c2ecf20Sopenharmony_ci
24828c2ecf20Sopenharmony_ci	spin_lock_init(&ctx->lock);
24838c2ecf20Sopenharmony_ci	ctx->drv_ctx[ENCRYPT] = NULL;
24848c2ecf20Sopenharmony_ci	ctx->drv_ctx[DECRYPT] = NULL;
24858c2ecf20Sopenharmony_ci
24868c2ecf20Sopenharmony_ci	return 0;
24878c2ecf20Sopenharmony_ci}
24888c2ecf20Sopenharmony_ci
24898c2ecf20Sopenharmony_cistatic int caam_cra_init(struct crypto_skcipher *tfm)
24908c2ecf20Sopenharmony_ci{
24918c2ecf20Sopenharmony_ci	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
24928c2ecf20Sopenharmony_ci	struct caam_skcipher_alg *caam_alg =
24938c2ecf20Sopenharmony_ci		container_of(alg, typeof(*caam_alg), skcipher);
24948c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(tfm);
24958c2ecf20Sopenharmony_ci	u32 alg_aai = caam_alg->caam.class1_alg_type & OP_ALG_AAI_MASK;
24968c2ecf20Sopenharmony_ci	int ret = 0;
24978c2ecf20Sopenharmony_ci
24988c2ecf20Sopenharmony_ci	if (alg_aai == OP_ALG_AAI_XTS) {
24998c2ecf20Sopenharmony_ci		const char *tfm_name = crypto_tfm_alg_name(&tfm->base);
25008c2ecf20Sopenharmony_ci		struct crypto_skcipher *fallback;
25018c2ecf20Sopenharmony_ci
25028c2ecf20Sopenharmony_ci		fallback = crypto_alloc_skcipher(tfm_name, 0,
25038c2ecf20Sopenharmony_ci						 CRYPTO_ALG_NEED_FALLBACK);
25048c2ecf20Sopenharmony_ci		if (IS_ERR(fallback)) {
25058c2ecf20Sopenharmony_ci			pr_err("Failed to allocate %s fallback: %ld\n",
25068c2ecf20Sopenharmony_ci			       tfm_name, PTR_ERR(fallback));
25078c2ecf20Sopenharmony_ci			return PTR_ERR(fallback);
25088c2ecf20Sopenharmony_ci		}
25098c2ecf20Sopenharmony_ci
25108c2ecf20Sopenharmony_ci		ctx->fallback = fallback;
25118c2ecf20Sopenharmony_ci		crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx) +
25128c2ecf20Sopenharmony_ci					    crypto_skcipher_reqsize(fallback));
25138c2ecf20Sopenharmony_ci	}
25148c2ecf20Sopenharmony_ci
25158c2ecf20Sopenharmony_ci	ret = caam_init_common(ctx, &caam_alg->caam, false);
25168c2ecf20Sopenharmony_ci	if (ret && ctx->fallback)
25178c2ecf20Sopenharmony_ci		crypto_free_skcipher(ctx->fallback);
25188c2ecf20Sopenharmony_ci
25198c2ecf20Sopenharmony_ci	return ret;
25208c2ecf20Sopenharmony_ci}
25218c2ecf20Sopenharmony_ci
25228c2ecf20Sopenharmony_cistatic int caam_aead_init(struct crypto_aead *tfm)
25238c2ecf20Sopenharmony_ci{
25248c2ecf20Sopenharmony_ci	struct aead_alg *alg = crypto_aead_alg(tfm);
25258c2ecf20Sopenharmony_ci	struct caam_aead_alg *caam_alg = container_of(alg, typeof(*caam_alg),
25268c2ecf20Sopenharmony_ci						      aead);
25278c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(tfm);
25288c2ecf20Sopenharmony_ci
25298c2ecf20Sopenharmony_ci	return caam_init_common(ctx, &caam_alg->caam, !caam_alg->caam.nodkp);
25308c2ecf20Sopenharmony_ci}
25318c2ecf20Sopenharmony_ci
25328c2ecf20Sopenharmony_cistatic void caam_exit_common(struct caam_ctx *ctx)
25338c2ecf20Sopenharmony_ci{
25348c2ecf20Sopenharmony_ci	caam_drv_ctx_rel(ctx->drv_ctx[ENCRYPT]);
25358c2ecf20Sopenharmony_ci	caam_drv_ctx_rel(ctx->drv_ctx[DECRYPT]);
25368c2ecf20Sopenharmony_ci
25378c2ecf20Sopenharmony_ci	dma_unmap_single(ctx->jrdev->parent, ctx->key_dma, sizeof(ctx->key),
25388c2ecf20Sopenharmony_ci			 ctx->dir);
25398c2ecf20Sopenharmony_ci
25408c2ecf20Sopenharmony_ci	caam_jr_free(ctx->jrdev);
25418c2ecf20Sopenharmony_ci}
25428c2ecf20Sopenharmony_ci
25438c2ecf20Sopenharmony_cistatic void caam_cra_exit(struct crypto_skcipher *tfm)
25448c2ecf20Sopenharmony_ci{
25458c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(tfm);
25468c2ecf20Sopenharmony_ci
25478c2ecf20Sopenharmony_ci	if (ctx->fallback)
25488c2ecf20Sopenharmony_ci		crypto_free_skcipher(ctx->fallback);
25498c2ecf20Sopenharmony_ci	caam_exit_common(ctx);
25508c2ecf20Sopenharmony_ci}
25518c2ecf20Sopenharmony_ci
25528c2ecf20Sopenharmony_cistatic void caam_aead_exit(struct crypto_aead *tfm)
25538c2ecf20Sopenharmony_ci{
25548c2ecf20Sopenharmony_ci	caam_exit_common(crypto_aead_ctx(tfm));
25558c2ecf20Sopenharmony_ci}
25568c2ecf20Sopenharmony_ci
25578c2ecf20Sopenharmony_civoid caam_qi_algapi_exit(void)
25588c2ecf20Sopenharmony_ci{
25598c2ecf20Sopenharmony_ci	int i;
25608c2ecf20Sopenharmony_ci
25618c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {
25628c2ecf20Sopenharmony_ci		struct caam_aead_alg *t_alg = driver_aeads + i;
25638c2ecf20Sopenharmony_ci
25648c2ecf20Sopenharmony_ci		if (t_alg->registered)
25658c2ecf20Sopenharmony_ci			crypto_unregister_aead(&t_alg->aead);
25668c2ecf20Sopenharmony_ci	}
25678c2ecf20Sopenharmony_ci
25688c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
25698c2ecf20Sopenharmony_ci		struct caam_skcipher_alg *t_alg = driver_algs + i;
25708c2ecf20Sopenharmony_ci
25718c2ecf20Sopenharmony_ci		if (t_alg->registered)
25728c2ecf20Sopenharmony_ci			crypto_unregister_skcipher(&t_alg->skcipher);
25738c2ecf20Sopenharmony_ci	}
25748c2ecf20Sopenharmony_ci}
25758c2ecf20Sopenharmony_ci
25768c2ecf20Sopenharmony_cistatic void caam_skcipher_alg_init(struct caam_skcipher_alg *t_alg)
25778c2ecf20Sopenharmony_ci{
25788c2ecf20Sopenharmony_ci	struct skcipher_alg *alg = &t_alg->skcipher;
25798c2ecf20Sopenharmony_ci
25808c2ecf20Sopenharmony_ci	alg->base.cra_module = THIS_MODULE;
25818c2ecf20Sopenharmony_ci	alg->base.cra_priority = CAAM_CRA_PRIORITY;
25828c2ecf20Sopenharmony_ci	alg->base.cra_ctxsize = sizeof(struct caam_ctx);
25838c2ecf20Sopenharmony_ci	alg->base.cra_flags |= (CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY |
25848c2ecf20Sopenharmony_ci				CRYPTO_ALG_KERN_DRIVER_ONLY);
25858c2ecf20Sopenharmony_ci
25868c2ecf20Sopenharmony_ci	alg->init = caam_cra_init;
25878c2ecf20Sopenharmony_ci	alg->exit = caam_cra_exit;
25888c2ecf20Sopenharmony_ci}
25898c2ecf20Sopenharmony_ci
25908c2ecf20Sopenharmony_cistatic void caam_aead_alg_init(struct caam_aead_alg *t_alg)
25918c2ecf20Sopenharmony_ci{
25928c2ecf20Sopenharmony_ci	struct aead_alg *alg = &t_alg->aead;
25938c2ecf20Sopenharmony_ci
25948c2ecf20Sopenharmony_ci	alg->base.cra_module = THIS_MODULE;
25958c2ecf20Sopenharmony_ci	alg->base.cra_priority = CAAM_CRA_PRIORITY;
25968c2ecf20Sopenharmony_ci	alg->base.cra_ctxsize = sizeof(struct caam_ctx);
25978c2ecf20Sopenharmony_ci	alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY |
25988c2ecf20Sopenharmony_ci			      CRYPTO_ALG_KERN_DRIVER_ONLY;
25998c2ecf20Sopenharmony_ci
26008c2ecf20Sopenharmony_ci	alg->init = caam_aead_init;
26018c2ecf20Sopenharmony_ci	alg->exit = caam_aead_exit;
26028c2ecf20Sopenharmony_ci}
26038c2ecf20Sopenharmony_ci
26048c2ecf20Sopenharmony_ciint caam_qi_algapi_init(struct device *ctrldev)
26058c2ecf20Sopenharmony_ci{
26068c2ecf20Sopenharmony_ci	struct caam_drv_private *priv = dev_get_drvdata(ctrldev);
26078c2ecf20Sopenharmony_ci	int i = 0, err = 0;
26088c2ecf20Sopenharmony_ci	u32 aes_vid, aes_inst, des_inst, md_vid, md_inst;
26098c2ecf20Sopenharmony_ci	unsigned int md_limit = SHA512_DIGEST_SIZE;
26108c2ecf20Sopenharmony_ci	bool registered = false;
26118c2ecf20Sopenharmony_ci
26128c2ecf20Sopenharmony_ci	/* Make sure this runs only on (DPAA 1.x) QI */
26138c2ecf20Sopenharmony_ci	if (!priv->qi_present || caam_dpaa2)
26148c2ecf20Sopenharmony_ci		return 0;
26158c2ecf20Sopenharmony_ci
26168c2ecf20Sopenharmony_ci	/*
26178c2ecf20Sopenharmony_ci	 * Register crypto algorithms the device supports.
26188c2ecf20Sopenharmony_ci	 * First, detect presence and attributes of DES, AES, and MD blocks.
26198c2ecf20Sopenharmony_ci	 */
26208c2ecf20Sopenharmony_ci	if (priv->era < 10) {
26218c2ecf20Sopenharmony_ci		u32 cha_vid, cha_inst;
26228c2ecf20Sopenharmony_ci
26238c2ecf20Sopenharmony_ci		cha_vid = rd_reg32(&priv->ctrl->perfmon.cha_id_ls);
26248c2ecf20Sopenharmony_ci		aes_vid = cha_vid & CHA_ID_LS_AES_MASK;
26258c2ecf20Sopenharmony_ci		md_vid = (cha_vid & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT;
26268c2ecf20Sopenharmony_ci
26278c2ecf20Sopenharmony_ci		cha_inst = rd_reg32(&priv->ctrl->perfmon.cha_num_ls);
26288c2ecf20Sopenharmony_ci		des_inst = (cha_inst & CHA_ID_LS_DES_MASK) >>
26298c2ecf20Sopenharmony_ci			   CHA_ID_LS_DES_SHIFT;
26308c2ecf20Sopenharmony_ci		aes_inst = cha_inst & CHA_ID_LS_AES_MASK;
26318c2ecf20Sopenharmony_ci		md_inst = (cha_inst & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT;
26328c2ecf20Sopenharmony_ci	} else {
26338c2ecf20Sopenharmony_ci		u32 aesa, mdha;
26348c2ecf20Sopenharmony_ci
26358c2ecf20Sopenharmony_ci		aesa = rd_reg32(&priv->ctrl->vreg.aesa);
26368c2ecf20Sopenharmony_ci		mdha = rd_reg32(&priv->ctrl->vreg.mdha);
26378c2ecf20Sopenharmony_ci
26388c2ecf20Sopenharmony_ci		aes_vid = (aesa & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT;
26398c2ecf20Sopenharmony_ci		md_vid = (mdha & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT;
26408c2ecf20Sopenharmony_ci
26418c2ecf20Sopenharmony_ci		des_inst = rd_reg32(&priv->ctrl->vreg.desa) & CHA_VER_NUM_MASK;
26428c2ecf20Sopenharmony_ci		aes_inst = aesa & CHA_VER_NUM_MASK;
26438c2ecf20Sopenharmony_ci		md_inst = mdha & CHA_VER_NUM_MASK;
26448c2ecf20Sopenharmony_ci	}
26458c2ecf20Sopenharmony_ci
26468c2ecf20Sopenharmony_ci	/* If MD is present, limit digest size based on LP256 */
26478c2ecf20Sopenharmony_ci	if (md_inst && md_vid  == CHA_VER_VID_MD_LP256)
26488c2ecf20Sopenharmony_ci		md_limit = SHA256_DIGEST_SIZE;
26498c2ecf20Sopenharmony_ci
26508c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
26518c2ecf20Sopenharmony_ci		struct caam_skcipher_alg *t_alg = driver_algs + i;
26528c2ecf20Sopenharmony_ci		u32 alg_sel = t_alg->caam.class1_alg_type & OP_ALG_ALGSEL_MASK;
26538c2ecf20Sopenharmony_ci
26548c2ecf20Sopenharmony_ci		/* Skip DES algorithms if not supported by device */
26558c2ecf20Sopenharmony_ci		if (!des_inst &&
26568c2ecf20Sopenharmony_ci		    ((alg_sel == OP_ALG_ALGSEL_3DES) ||
26578c2ecf20Sopenharmony_ci		     (alg_sel == OP_ALG_ALGSEL_DES)))
26588c2ecf20Sopenharmony_ci			continue;
26598c2ecf20Sopenharmony_ci
26608c2ecf20Sopenharmony_ci		/* Skip AES algorithms if not supported by device */
26618c2ecf20Sopenharmony_ci		if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES))
26628c2ecf20Sopenharmony_ci			continue;
26638c2ecf20Sopenharmony_ci
26648c2ecf20Sopenharmony_ci		caam_skcipher_alg_init(t_alg);
26658c2ecf20Sopenharmony_ci
26668c2ecf20Sopenharmony_ci		err = crypto_register_skcipher(&t_alg->skcipher);
26678c2ecf20Sopenharmony_ci		if (err) {
26688c2ecf20Sopenharmony_ci			dev_warn(ctrldev, "%s alg registration failed\n",
26698c2ecf20Sopenharmony_ci				 t_alg->skcipher.base.cra_driver_name);
26708c2ecf20Sopenharmony_ci			continue;
26718c2ecf20Sopenharmony_ci		}
26728c2ecf20Sopenharmony_ci
26738c2ecf20Sopenharmony_ci		t_alg->registered = true;
26748c2ecf20Sopenharmony_ci		registered = true;
26758c2ecf20Sopenharmony_ci	}
26768c2ecf20Sopenharmony_ci
26778c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {
26788c2ecf20Sopenharmony_ci		struct caam_aead_alg *t_alg = driver_aeads + i;
26798c2ecf20Sopenharmony_ci		u32 c1_alg_sel = t_alg->caam.class1_alg_type &
26808c2ecf20Sopenharmony_ci				 OP_ALG_ALGSEL_MASK;
26818c2ecf20Sopenharmony_ci		u32 c2_alg_sel = t_alg->caam.class2_alg_type &
26828c2ecf20Sopenharmony_ci				 OP_ALG_ALGSEL_MASK;
26838c2ecf20Sopenharmony_ci		u32 alg_aai = t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK;
26848c2ecf20Sopenharmony_ci
26858c2ecf20Sopenharmony_ci		/* Skip DES algorithms if not supported by device */
26868c2ecf20Sopenharmony_ci		if (!des_inst &&
26878c2ecf20Sopenharmony_ci		    ((c1_alg_sel == OP_ALG_ALGSEL_3DES) ||
26888c2ecf20Sopenharmony_ci		     (c1_alg_sel == OP_ALG_ALGSEL_DES)))
26898c2ecf20Sopenharmony_ci			continue;
26908c2ecf20Sopenharmony_ci
26918c2ecf20Sopenharmony_ci		/* Skip AES algorithms if not supported by device */
26928c2ecf20Sopenharmony_ci		if (!aes_inst && (c1_alg_sel == OP_ALG_ALGSEL_AES))
26938c2ecf20Sopenharmony_ci			continue;
26948c2ecf20Sopenharmony_ci
26958c2ecf20Sopenharmony_ci		/*
26968c2ecf20Sopenharmony_ci		 * Check support for AES algorithms not available
26978c2ecf20Sopenharmony_ci		 * on LP devices.
26988c2ecf20Sopenharmony_ci		 */
26998c2ecf20Sopenharmony_ci		if (aes_vid  == CHA_VER_VID_AES_LP && alg_aai == OP_ALG_AAI_GCM)
27008c2ecf20Sopenharmony_ci			continue;
27018c2ecf20Sopenharmony_ci
27028c2ecf20Sopenharmony_ci		/*
27038c2ecf20Sopenharmony_ci		 * Skip algorithms requiring message digests
27048c2ecf20Sopenharmony_ci		 * if MD or MD size is not supported by device.
27058c2ecf20Sopenharmony_ci		 */
27068c2ecf20Sopenharmony_ci		if (c2_alg_sel &&
27078c2ecf20Sopenharmony_ci		    (!md_inst || (t_alg->aead.maxauthsize > md_limit)))
27088c2ecf20Sopenharmony_ci			continue;
27098c2ecf20Sopenharmony_ci
27108c2ecf20Sopenharmony_ci		caam_aead_alg_init(t_alg);
27118c2ecf20Sopenharmony_ci
27128c2ecf20Sopenharmony_ci		err = crypto_register_aead(&t_alg->aead);
27138c2ecf20Sopenharmony_ci		if (err) {
27148c2ecf20Sopenharmony_ci			pr_warn("%s alg registration failed\n",
27158c2ecf20Sopenharmony_ci				t_alg->aead.base.cra_driver_name);
27168c2ecf20Sopenharmony_ci			continue;
27178c2ecf20Sopenharmony_ci		}
27188c2ecf20Sopenharmony_ci
27198c2ecf20Sopenharmony_ci		t_alg->registered = true;
27208c2ecf20Sopenharmony_ci		registered = true;
27218c2ecf20Sopenharmony_ci	}
27228c2ecf20Sopenharmony_ci
27238c2ecf20Sopenharmony_ci	if (registered)
27248c2ecf20Sopenharmony_ci		dev_info(ctrldev, "algorithms registered in /proc/crypto\n");
27258c2ecf20Sopenharmony_ci
27268c2ecf20Sopenharmony_ci	return err;
27278c2ecf20Sopenharmony_ci}
2728