18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * caam - Freescale FSL CAAM support for crypto API
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright 2008-2011 Freescale Semiconductor, Inc.
68c2ecf20Sopenharmony_ci * Copyright 2016-2019 NXP
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Based on talitos crypto API driver.
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci * relationship of job descriptors to shared descriptors (SteveC Dec 10 2008):
118c2ecf20Sopenharmony_ci *
128c2ecf20Sopenharmony_ci * ---------------                     ---------------
138c2ecf20Sopenharmony_ci * | JobDesc #1  |-------------------->|  ShareDesc  |
148c2ecf20Sopenharmony_ci * | *(packet 1) |                     |   (PDB)     |
158c2ecf20Sopenharmony_ci * ---------------      |------------->|  (hashKey)  |
168c2ecf20Sopenharmony_ci *       .              |              | (cipherKey) |
178c2ecf20Sopenharmony_ci *       .              |    |-------->| (operation) |
188c2ecf20Sopenharmony_ci * ---------------      |    |         ---------------
198c2ecf20Sopenharmony_ci * | JobDesc #2  |------|    |
208c2ecf20Sopenharmony_ci * | *(packet 2) |           |
218c2ecf20Sopenharmony_ci * ---------------           |
228c2ecf20Sopenharmony_ci *       .                   |
238c2ecf20Sopenharmony_ci *       .                   |
248c2ecf20Sopenharmony_ci * ---------------           |
258c2ecf20Sopenharmony_ci * | JobDesc #3  |------------
268c2ecf20Sopenharmony_ci * | *(packet 3) |
278c2ecf20Sopenharmony_ci * ---------------
288c2ecf20Sopenharmony_ci *
298c2ecf20Sopenharmony_ci * The SharedDesc never changes for a connection unless rekeyed, but
308c2ecf20Sopenharmony_ci * each packet will likely be in a different place. So all we need
318c2ecf20Sopenharmony_ci * to know to process the packet is where the input is, where the
328c2ecf20Sopenharmony_ci * output goes, and what context we want to process with. Context is
338c2ecf20Sopenharmony_ci * in the SharedDesc, packet references in the JobDesc.
348c2ecf20Sopenharmony_ci *
358c2ecf20Sopenharmony_ci * So, a job desc looks like:
368c2ecf20Sopenharmony_ci *
378c2ecf20Sopenharmony_ci * ---------------------
388c2ecf20Sopenharmony_ci * | Header            |
398c2ecf20Sopenharmony_ci * | ShareDesc Pointer |
408c2ecf20Sopenharmony_ci * | SEQ_OUT_PTR       |
418c2ecf20Sopenharmony_ci * | (output buffer)   |
428c2ecf20Sopenharmony_ci * | (output length)   |
438c2ecf20Sopenharmony_ci * | SEQ_IN_PTR        |
448c2ecf20Sopenharmony_ci * | (input buffer)    |
458c2ecf20Sopenharmony_ci * | (input length)    |
468c2ecf20Sopenharmony_ci * ---------------------
478c2ecf20Sopenharmony_ci */
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci#include "compat.h"
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci#include "regs.h"
528c2ecf20Sopenharmony_ci#include "intern.h"
538c2ecf20Sopenharmony_ci#include "desc_constr.h"
548c2ecf20Sopenharmony_ci#include "jr.h"
558c2ecf20Sopenharmony_ci#include "error.h"
568c2ecf20Sopenharmony_ci#include "sg_sw_sec4.h"
578c2ecf20Sopenharmony_ci#include "key_gen.h"
588c2ecf20Sopenharmony_ci#include "caamalg_desc.h"
598c2ecf20Sopenharmony_ci#include <crypto/engine.h>
608c2ecf20Sopenharmony_ci#include <crypto/xts.h>
618c2ecf20Sopenharmony_ci#include <asm/unaligned.h>
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci/*
648c2ecf20Sopenharmony_ci * crypto alg
658c2ecf20Sopenharmony_ci */
668c2ecf20Sopenharmony_ci#define CAAM_CRA_PRIORITY		3000
678c2ecf20Sopenharmony_ci/* max key is sum of AES_MAX_KEY_SIZE, max split key size */
688c2ecf20Sopenharmony_ci#define CAAM_MAX_KEY_SIZE		(AES_MAX_KEY_SIZE + \
698c2ecf20Sopenharmony_ci					 CTR_RFC3686_NONCE_SIZE + \
708c2ecf20Sopenharmony_ci					 SHA512_DIGEST_SIZE * 2)
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci#define AEAD_DESC_JOB_IO_LEN		(DESC_JOB_IO_LEN + CAAM_CMD_SZ * 2)
738c2ecf20Sopenharmony_ci#define GCM_DESC_JOB_IO_LEN		(AEAD_DESC_JOB_IO_LEN + \
748c2ecf20Sopenharmony_ci					 CAAM_CMD_SZ * 4)
758c2ecf20Sopenharmony_ci#define AUTHENC_DESC_JOB_IO_LEN		(AEAD_DESC_JOB_IO_LEN + \
768c2ecf20Sopenharmony_ci					 CAAM_CMD_SZ * 5)
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci#define CHACHAPOLY_DESC_JOB_IO_LEN	(AEAD_DESC_JOB_IO_LEN + CAAM_CMD_SZ * 6)
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci#define DESC_MAX_USED_BYTES		(CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN_MIN)
818c2ecf20Sopenharmony_ci#define DESC_MAX_USED_LEN		(DESC_MAX_USED_BYTES / CAAM_CMD_SZ)
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_cistruct caam_alg_entry {
848c2ecf20Sopenharmony_ci	int class1_alg_type;
858c2ecf20Sopenharmony_ci	int class2_alg_type;
868c2ecf20Sopenharmony_ci	bool rfc3686;
878c2ecf20Sopenharmony_ci	bool geniv;
888c2ecf20Sopenharmony_ci	bool nodkp;
898c2ecf20Sopenharmony_ci};
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_cistruct caam_aead_alg {
928c2ecf20Sopenharmony_ci	struct aead_alg aead;
938c2ecf20Sopenharmony_ci	struct caam_alg_entry caam;
948c2ecf20Sopenharmony_ci	bool registered;
958c2ecf20Sopenharmony_ci};
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_cistruct caam_skcipher_alg {
988c2ecf20Sopenharmony_ci	struct skcipher_alg skcipher;
998c2ecf20Sopenharmony_ci	struct caam_alg_entry caam;
1008c2ecf20Sopenharmony_ci	bool registered;
1018c2ecf20Sopenharmony_ci};
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci/*
1048c2ecf20Sopenharmony_ci * per-session context
1058c2ecf20Sopenharmony_ci */
1068c2ecf20Sopenharmony_cistruct caam_ctx {
1078c2ecf20Sopenharmony_ci	struct crypto_engine_ctx enginectx;
1088c2ecf20Sopenharmony_ci	u32 sh_desc_enc[DESC_MAX_USED_LEN];
1098c2ecf20Sopenharmony_ci	u32 sh_desc_dec[DESC_MAX_USED_LEN];
1108c2ecf20Sopenharmony_ci	u8 key[CAAM_MAX_KEY_SIZE];
1118c2ecf20Sopenharmony_ci	dma_addr_t sh_desc_enc_dma;
1128c2ecf20Sopenharmony_ci	dma_addr_t sh_desc_dec_dma;
1138c2ecf20Sopenharmony_ci	dma_addr_t key_dma;
1148c2ecf20Sopenharmony_ci	enum dma_data_direction dir;
1158c2ecf20Sopenharmony_ci	struct device *jrdev;
1168c2ecf20Sopenharmony_ci	struct alginfo adata;
1178c2ecf20Sopenharmony_ci	struct alginfo cdata;
1188c2ecf20Sopenharmony_ci	unsigned int authsize;
1198c2ecf20Sopenharmony_ci	bool xts_key_fallback;
1208c2ecf20Sopenharmony_ci	struct crypto_skcipher *fallback;
1218c2ecf20Sopenharmony_ci};
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_cistruct caam_skcipher_req_ctx {
1248c2ecf20Sopenharmony_ci	struct skcipher_edesc *edesc;
1258c2ecf20Sopenharmony_ci	struct skcipher_request fallback_req;
1268c2ecf20Sopenharmony_ci};
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_cistruct caam_aead_req_ctx {
1298c2ecf20Sopenharmony_ci	struct aead_edesc *edesc;
1308c2ecf20Sopenharmony_ci};
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_cistatic int aead_null_set_sh_desc(struct crypto_aead *aead)
1338c2ecf20Sopenharmony_ci{
1348c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
1358c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
1368c2ecf20Sopenharmony_ci	struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
1378c2ecf20Sopenharmony_ci	u32 *desc;
1388c2ecf20Sopenharmony_ci	int rem_bytes = CAAM_DESC_BYTES_MAX - AEAD_DESC_JOB_IO_LEN -
1398c2ecf20Sopenharmony_ci			ctx->adata.keylen_pad;
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_ci	/*
1428c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptors
1438c2ecf20Sopenharmony_ci	 * must all fit into the 64-word Descriptor h/w Buffer
1448c2ecf20Sopenharmony_ci	 */
1458c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_AEAD_NULL_ENC_LEN) {
1468c2ecf20Sopenharmony_ci		ctx->adata.key_inline = true;
1478c2ecf20Sopenharmony_ci		ctx->adata.key_virt = ctx->key;
1488c2ecf20Sopenharmony_ci	} else {
1498c2ecf20Sopenharmony_ci		ctx->adata.key_inline = false;
1508c2ecf20Sopenharmony_ci		ctx->adata.key_dma = ctx->key_dma;
1518c2ecf20Sopenharmony_ci	}
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci	/* aead_encrypt shared descriptor */
1548c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_enc;
1558c2ecf20Sopenharmony_ci	cnstr_shdsc_aead_null_encap(desc, &ctx->adata, ctx->authsize,
1568c2ecf20Sopenharmony_ci				    ctrlpriv->era);
1578c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
1588c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci	/*
1618c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptors
1628c2ecf20Sopenharmony_ci	 * must all fit into the 64-word Descriptor h/w Buffer
1638c2ecf20Sopenharmony_ci	 */
1648c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_AEAD_NULL_DEC_LEN) {
1658c2ecf20Sopenharmony_ci		ctx->adata.key_inline = true;
1668c2ecf20Sopenharmony_ci		ctx->adata.key_virt = ctx->key;
1678c2ecf20Sopenharmony_ci	} else {
1688c2ecf20Sopenharmony_ci		ctx->adata.key_inline = false;
1698c2ecf20Sopenharmony_ci		ctx->adata.key_dma = ctx->key_dma;
1708c2ecf20Sopenharmony_ci	}
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_ci	/* aead_decrypt shared descriptor */
1738c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_dec;
1748c2ecf20Sopenharmony_ci	cnstr_shdsc_aead_null_decap(desc, &ctx->adata, ctx->authsize,
1758c2ecf20Sopenharmony_ci				    ctrlpriv->era);
1768c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
1778c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_ci	return 0;
1808c2ecf20Sopenharmony_ci}
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_cistatic int aead_set_sh_desc(struct crypto_aead *aead)
1838c2ecf20Sopenharmony_ci{
1848c2ecf20Sopenharmony_ci	struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),
1858c2ecf20Sopenharmony_ci						 struct caam_aead_alg, aead);
1868c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
1878c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
1888c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
1898c2ecf20Sopenharmony_ci	struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
1908c2ecf20Sopenharmony_ci	u32 ctx1_iv_off = 0;
1918c2ecf20Sopenharmony_ci	u32 *desc, *nonce = NULL;
1928c2ecf20Sopenharmony_ci	u32 inl_mask;
1938c2ecf20Sopenharmony_ci	unsigned int data_len[2];
1948c2ecf20Sopenharmony_ci	const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) ==
1958c2ecf20Sopenharmony_ci			       OP_ALG_AAI_CTR_MOD128);
1968c2ecf20Sopenharmony_ci	const bool is_rfc3686 = alg->caam.rfc3686;
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_ci	if (!ctx->authsize)
1998c2ecf20Sopenharmony_ci		return 0;
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_ci	/* NULL encryption / decryption */
2028c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen)
2038c2ecf20Sopenharmony_ci		return aead_null_set_sh_desc(aead);
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_ci	/*
2068c2ecf20Sopenharmony_ci	 * AES-CTR needs to load IV in CONTEXT1 reg
2078c2ecf20Sopenharmony_ci	 * at an offset of 128bits (16bytes)
2088c2ecf20Sopenharmony_ci	 * CONTEXT1[255:128] = IV
2098c2ecf20Sopenharmony_ci	 */
2108c2ecf20Sopenharmony_ci	if (ctr_mode)
2118c2ecf20Sopenharmony_ci		ctx1_iv_off = 16;
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ci	/*
2148c2ecf20Sopenharmony_ci	 * RFC3686 specific:
2158c2ecf20Sopenharmony_ci	 *	CONTEXT1[255:128] = {NONCE, IV, COUNTER}
2168c2ecf20Sopenharmony_ci	 */
2178c2ecf20Sopenharmony_ci	if (is_rfc3686) {
2188c2ecf20Sopenharmony_ci		ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;
2198c2ecf20Sopenharmony_ci		nonce = (u32 *)((void *)ctx->key + ctx->adata.keylen_pad +
2208c2ecf20Sopenharmony_ci				ctx->cdata.keylen - CTR_RFC3686_NONCE_SIZE);
2218c2ecf20Sopenharmony_ci	}
2228c2ecf20Sopenharmony_ci
2238c2ecf20Sopenharmony_ci	/*
2248c2ecf20Sopenharmony_ci	 * In case |user key| > |derived key|, using DKP<imm,imm>
2258c2ecf20Sopenharmony_ci	 * would result in invalid opcodes (last bytes of user key) in
2268c2ecf20Sopenharmony_ci	 * the resulting descriptor. Use DKP<ptr,imm> instead => both
2278c2ecf20Sopenharmony_ci	 * virtual and dma key addresses are needed.
2288c2ecf20Sopenharmony_ci	 */
2298c2ecf20Sopenharmony_ci	ctx->adata.key_virt = ctx->key;
2308c2ecf20Sopenharmony_ci	ctx->adata.key_dma = ctx->key_dma;
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = ctx->key + ctx->adata.keylen_pad;
2338c2ecf20Sopenharmony_ci	ctx->cdata.key_dma = ctx->key_dma + ctx->adata.keylen_pad;
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci	data_len[0] = ctx->adata.keylen_pad;
2368c2ecf20Sopenharmony_ci	data_len[1] = ctx->cdata.keylen;
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_ci	if (alg->caam.geniv)
2398c2ecf20Sopenharmony_ci		goto skip_enc;
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_ci	/*
2428c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptors
2438c2ecf20Sopenharmony_ci	 * must all fit into the 64-word Descriptor h/w Buffer
2448c2ecf20Sopenharmony_ci	 */
2458c2ecf20Sopenharmony_ci	if (desc_inline_query(DESC_AEAD_ENC_LEN +
2468c2ecf20Sopenharmony_ci			      (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
2478c2ecf20Sopenharmony_ci			      AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask,
2488c2ecf20Sopenharmony_ci			      ARRAY_SIZE(data_len)) < 0)
2498c2ecf20Sopenharmony_ci		return -EINVAL;
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_ci	ctx->adata.key_inline = !!(inl_mask & 1);
2528c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = !!(inl_mask & 2);
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_ci	/* aead_encrypt shared descriptor */
2558c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_enc;
2568c2ecf20Sopenharmony_ci	cnstr_shdsc_aead_encap(desc, &ctx->cdata, &ctx->adata, ivsize,
2578c2ecf20Sopenharmony_ci			       ctx->authsize, is_rfc3686, nonce, ctx1_iv_off,
2588c2ecf20Sopenharmony_ci			       false, ctrlpriv->era);
2598c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
2608c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_ciskip_enc:
2638c2ecf20Sopenharmony_ci	/*
2648c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptors
2658c2ecf20Sopenharmony_ci	 * must all fit into the 64-word Descriptor h/w Buffer
2668c2ecf20Sopenharmony_ci	 */
2678c2ecf20Sopenharmony_ci	if (desc_inline_query(DESC_AEAD_DEC_LEN +
2688c2ecf20Sopenharmony_ci			      (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
2698c2ecf20Sopenharmony_ci			      AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask,
2708c2ecf20Sopenharmony_ci			      ARRAY_SIZE(data_len)) < 0)
2718c2ecf20Sopenharmony_ci		return -EINVAL;
2728c2ecf20Sopenharmony_ci
2738c2ecf20Sopenharmony_ci	ctx->adata.key_inline = !!(inl_mask & 1);
2748c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = !!(inl_mask & 2);
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci	/* aead_decrypt shared descriptor */
2778c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_dec;
2788c2ecf20Sopenharmony_ci	cnstr_shdsc_aead_decap(desc, &ctx->cdata, &ctx->adata, ivsize,
2798c2ecf20Sopenharmony_ci			       ctx->authsize, alg->caam.geniv, is_rfc3686,
2808c2ecf20Sopenharmony_ci			       nonce, ctx1_iv_off, false, ctrlpriv->era);
2818c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
2828c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
2838c2ecf20Sopenharmony_ci
2848c2ecf20Sopenharmony_ci	if (!alg->caam.geniv)
2858c2ecf20Sopenharmony_ci		goto skip_givenc;
2868c2ecf20Sopenharmony_ci
2878c2ecf20Sopenharmony_ci	/*
2888c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptors
2898c2ecf20Sopenharmony_ci	 * must all fit into the 64-word Descriptor h/w Buffer
2908c2ecf20Sopenharmony_ci	 */
2918c2ecf20Sopenharmony_ci	if (desc_inline_query(DESC_AEAD_GIVENC_LEN +
2928c2ecf20Sopenharmony_ci			      (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
2938c2ecf20Sopenharmony_ci			      AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask,
2948c2ecf20Sopenharmony_ci			      ARRAY_SIZE(data_len)) < 0)
2958c2ecf20Sopenharmony_ci		return -EINVAL;
2968c2ecf20Sopenharmony_ci
2978c2ecf20Sopenharmony_ci	ctx->adata.key_inline = !!(inl_mask & 1);
2988c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = !!(inl_mask & 2);
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_ci	/* aead_givencrypt shared descriptor */
3018c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_enc;
3028c2ecf20Sopenharmony_ci	cnstr_shdsc_aead_givencap(desc, &ctx->cdata, &ctx->adata, ivsize,
3038c2ecf20Sopenharmony_ci				  ctx->authsize, is_rfc3686, nonce,
3048c2ecf20Sopenharmony_ci				  ctx1_iv_off, false, ctrlpriv->era);
3058c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
3068c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_ciskip_givenc:
3098c2ecf20Sopenharmony_ci	return 0;
3108c2ecf20Sopenharmony_ci}
3118c2ecf20Sopenharmony_ci
3128c2ecf20Sopenharmony_cistatic int aead_setauthsize(struct crypto_aead *authenc,
3138c2ecf20Sopenharmony_ci				    unsigned int authsize)
3148c2ecf20Sopenharmony_ci{
3158c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
3168c2ecf20Sopenharmony_ci
3178c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
3188c2ecf20Sopenharmony_ci	aead_set_sh_desc(authenc);
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_ci	return 0;
3218c2ecf20Sopenharmony_ci}
3228c2ecf20Sopenharmony_ci
3238c2ecf20Sopenharmony_cistatic int gcm_set_sh_desc(struct crypto_aead *aead)
3248c2ecf20Sopenharmony_ci{
3258c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
3268c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
3278c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
3288c2ecf20Sopenharmony_ci	u32 *desc;
3298c2ecf20Sopenharmony_ci	int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN -
3308c2ecf20Sopenharmony_ci			ctx->cdata.keylen;
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen || !ctx->authsize)
3338c2ecf20Sopenharmony_ci		return 0;
3348c2ecf20Sopenharmony_ci
3358c2ecf20Sopenharmony_ci	/*
3368c2ecf20Sopenharmony_ci	 * AES GCM encrypt shared descriptor
3378c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptor
3388c2ecf20Sopenharmony_ci	 * must fit into the 64-word Descriptor h/w Buffer
3398c2ecf20Sopenharmony_ci	 */
3408c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_GCM_ENC_LEN) {
3418c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
3428c2ecf20Sopenharmony_ci		ctx->cdata.key_virt = ctx->key;
3438c2ecf20Sopenharmony_ci	} else {
3448c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
3458c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
3468c2ecf20Sopenharmony_ci	}
3478c2ecf20Sopenharmony_ci
3488c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_enc;
3498c2ecf20Sopenharmony_ci	cnstr_shdsc_gcm_encap(desc, &ctx->cdata, ivsize, ctx->authsize, false);
3508c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
3518c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
3528c2ecf20Sopenharmony_ci
3538c2ecf20Sopenharmony_ci	/*
3548c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptors
3558c2ecf20Sopenharmony_ci	 * must all fit into the 64-word Descriptor h/w Buffer
3568c2ecf20Sopenharmony_ci	 */
3578c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_GCM_DEC_LEN) {
3588c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
3598c2ecf20Sopenharmony_ci		ctx->cdata.key_virt = ctx->key;
3608c2ecf20Sopenharmony_ci	} else {
3618c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
3628c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
3638c2ecf20Sopenharmony_ci	}
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_dec;
3668c2ecf20Sopenharmony_ci	cnstr_shdsc_gcm_decap(desc, &ctx->cdata, ivsize, ctx->authsize, false);
3678c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
3688c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
3698c2ecf20Sopenharmony_ci
3708c2ecf20Sopenharmony_ci	return 0;
3718c2ecf20Sopenharmony_ci}
3728c2ecf20Sopenharmony_ci
3738c2ecf20Sopenharmony_cistatic int gcm_setauthsize(struct crypto_aead *authenc, unsigned int authsize)
3748c2ecf20Sopenharmony_ci{
3758c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
3768c2ecf20Sopenharmony_ci	int err;
3778c2ecf20Sopenharmony_ci
3788c2ecf20Sopenharmony_ci	err = crypto_gcm_check_authsize(authsize);
3798c2ecf20Sopenharmony_ci	if (err)
3808c2ecf20Sopenharmony_ci		return err;
3818c2ecf20Sopenharmony_ci
3828c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
3838c2ecf20Sopenharmony_ci	gcm_set_sh_desc(authenc);
3848c2ecf20Sopenharmony_ci
3858c2ecf20Sopenharmony_ci	return 0;
3868c2ecf20Sopenharmony_ci}
3878c2ecf20Sopenharmony_ci
3888c2ecf20Sopenharmony_cistatic int rfc4106_set_sh_desc(struct crypto_aead *aead)
3898c2ecf20Sopenharmony_ci{
3908c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
3918c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
3928c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
3938c2ecf20Sopenharmony_ci	u32 *desc;
3948c2ecf20Sopenharmony_ci	int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN -
3958c2ecf20Sopenharmony_ci			ctx->cdata.keylen;
3968c2ecf20Sopenharmony_ci
3978c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen || !ctx->authsize)
3988c2ecf20Sopenharmony_ci		return 0;
3998c2ecf20Sopenharmony_ci
4008c2ecf20Sopenharmony_ci	/*
4018c2ecf20Sopenharmony_ci	 * RFC4106 encrypt shared descriptor
4028c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptor
4038c2ecf20Sopenharmony_ci	 * must fit into the 64-word Descriptor h/w Buffer
4048c2ecf20Sopenharmony_ci	 */
4058c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_RFC4106_ENC_LEN) {
4068c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
4078c2ecf20Sopenharmony_ci		ctx->cdata.key_virt = ctx->key;
4088c2ecf20Sopenharmony_ci	} else {
4098c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
4108c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
4118c2ecf20Sopenharmony_ci	}
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_enc;
4148c2ecf20Sopenharmony_ci	cnstr_shdsc_rfc4106_encap(desc, &ctx->cdata, ivsize, ctx->authsize,
4158c2ecf20Sopenharmony_ci				  false);
4168c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
4178c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
4188c2ecf20Sopenharmony_ci
4198c2ecf20Sopenharmony_ci	/*
4208c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptors
4218c2ecf20Sopenharmony_ci	 * must all fit into the 64-word Descriptor h/w Buffer
4228c2ecf20Sopenharmony_ci	 */
4238c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_RFC4106_DEC_LEN) {
4248c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
4258c2ecf20Sopenharmony_ci		ctx->cdata.key_virt = ctx->key;
4268c2ecf20Sopenharmony_ci	} else {
4278c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
4288c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
4298c2ecf20Sopenharmony_ci	}
4308c2ecf20Sopenharmony_ci
4318c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_dec;
4328c2ecf20Sopenharmony_ci	cnstr_shdsc_rfc4106_decap(desc, &ctx->cdata, ivsize, ctx->authsize,
4338c2ecf20Sopenharmony_ci				  false);
4348c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
4358c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
4368c2ecf20Sopenharmony_ci
4378c2ecf20Sopenharmony_ci	return 0;
4388c2ecf20Sopenharmony_ci}
4398c2ecf20Sopenharmony_ci
4408c2ecf20Sopenharmony_cistatic int rfc4106_setauthsize(struct crypto_aead *authenc,
4418c2ecf20Sopenharmony_ci			       unsigned int authsize)
4428c2ecf20Sopenharmony_ci{
4438c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
4448c2ecf20Sopenharmony_ci	int err;
4458c2ecf20Sopenharmony_ci
4468c2ecf20Sopenharmony_ci	err = crypto_rfc4106_check_authsize(authsize);
4478c2ecf20Sopenharmony_ci	if (err)
4488c2ecf20Sopenharmony_ci		return err;
4498c2ecf20Sopenharmony_ci
4508c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
4518c2ecf20Sopenharmony_ci	rfc4106_set_sh_desc(authenc);
4528c2ecf20Sopenharmony_ci
4538c2ecf20Sopenharmony_ci	return 0;
4548c2ecf20Sopenharmony_ci}
4558c2ecf20Sopenharmony_ci
4568c2ecf20Sopenharmony_cistatic int rfc4543_set_sh_desc(struct crypto_aead *aead)
4578c2ecf20Sopenharmony_ci{
4588c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
4598c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
4608c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
4618c2ecf20Sopenharmony_ci	u32 *desc;
4628c2ecf20Sopenharmony_ci	int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN -
4638c2ecf20Sopenharmony_ci			ctx->cdata.keylen;
4648c2ecf20Sopenharmony_ci
4658c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen || !ctx->authsize)
4668c2ecf20Sopenharmony_ci		return 0;
4678c2ecf20Sopenharmony_ci
4688c2ecf20Sopenharmony_ci	/*
4698c2ecf20Sopenharmony_ci	 * RFC4543 encrypt shared descriptor
4708c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptor
4718c2ecf20Sopenharmony_ci	 * must fit into the 64-word Descriptor h/w Buffer
4728c2ecf20Sopenharmony_ci	 */
4738c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_RFC4543_ENC_LEN) {
4748c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
4758c2ecf20Sopenharmony_ci		ctx->cdata.key_virt = ctx->key;
4768c2ecf20Sopenharmony_ci	} else {
4778c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
4788c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
4798c2ecf20Sopenharmony_ci	}
4808c2ecf20Sopenharmony_ci
4818c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_enc;
4828c2ecf20Sopenharmony_ci	cnstr_shdsc_rfc4543_encap(desc, &ctx->cdata, ivsize, ctx->authsize,
4838c2ecf20Sopenharmony_ci				  false);
4848c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
4858c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
4868c2ecf20Sopenharmony_ci
4878c2ecf20Sopenharmony_ci	/*
4888c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptors
4898c2ecf20Sopenharmony_ci	 * must all fit into the 64-word Descriptor h/w Buffer
4908c2ecf20Sopenharmony_ci	 */
4918c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_RFC4543_DEC_LEN) {
4928c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
4938c2ecf20Sopenharmony_ci		ctx->cdata.key_virt = ctx->key;
4948c2ecf20Sopenharmony_ci	} else {
4958c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
4968c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
4978c2ecf20Sopenharmony_ci	}
4988c2ecf20Sopenharmony_ci
4998c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_dec;
5008c2ecf20Sopenharmony_ci	cnstr_shdsc_rfc4543_decap(desc, &ctx->cdata, ivsize, ctx->authsize,
5018c2ecf20Sopenharmony_ci				  false);
5028c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
5038c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
5048c2ecf20Sopenharmony_ci
5058c2ecf20Sopenharmony_ci	return 0;
5068c2ecf20Sopenharmony_ci}
5078c2ecf20Sopenharmony_ci
5088c2ecf20Sopenharmony_cistatic int rfc4543_setauthsize(struct crypto_aead *authenc,
5098c2ecf20Sopenharmony_ci			       unsigned int authsize)
5108c2ecf20Sopenharmony_ci{
5118c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
5128c2ecf20Sopenharmony_ci
5138c2ecf20Sopenharmony_ci	if (authsize != 16)
5148c2ecf20Sopenharmony_ci		return -EINVAL;
5158c2ecf20Sopenharmony_ci
5168c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
5178c2ecf20Sopenharmony_ci	rfc4543_set_sh_desc(authenc);
5188c2ecf20Sopenharmony_ci
5198c2ecf20Sopenharmony_ci	return 0;
5208c2ecf20Sopenharmony_ci}
5218c2ecf20Sopenharmony_ci
5228c2ecf20Sopenharmony_cistatic int chachapoly_set_sh_desc(struct crypto_aead *aead)
5238c2ecf20Sopenharmony_ci{
5248c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
5258c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
5268c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
5278c2ecf20Sopenharmony_ci	u32 *desc;
5288c2ecf20Sopenharmony_ci
5298c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen || !ctx->authsize)
5308c2ecf20Sopenharmony_ci		return 0;
5318c2ecf20Sopenharmony_ci
5328c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_enc;
5338c2ecf20Sopenharmony_ci	cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize,
5348c2ecf20Sopenharmony_ci			       ctx->authsize, true, false);
5358c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
5368c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
5378c2ecf20Sopenharmony_ci
5388c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_dec;
5398c2ecf20Sopenharmony_ci	cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize,
5408c2ecf20Sopenharmony_ci			       ctx->authsize, false, false);
5418c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
5428c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
5438c2ecf20Sopenharmony_ci
5448c2ecf20Sopenharmony_ci	return 0;
5458c2ecf20Sopenharmony_ci}
5468c2ecf20Sopenharmony_ci
5478c2ecf20Sopenharmony_cistatic int chachapoly_setauthsize(struct crypto_aead *aead,
5488c2ecf20Sopenharmony_ci				  unsigned int authsize)
5498c2ecf20Sopenharmony_ci{
5508c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
5518c2ecf20Sopenharmony_ci
5528c2ecf20Sopenharmony_ci	if (authsize != POLY1305_DIGEST_SIZE)
5538c2ecf20Sopenharmony_ci		return -EINVAL;
5548c2ecf20Sopenharmony_ci
5558c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
5568c2ecf20Sopenharmony_ci	return chachapoly_set_sh_desc(aead);
5578c2ecf20Sopenharmony_ci}
5588c2ecf20Sopenharmony_ci
5598c2ecf20Sopenharmony_cistatic int chachapoly_setkey(struct crypto_aead *aead, const u8 *key,
5608c2ecf20Sopenharmony_ci			     unsigned int keylen)
5618c2ecf20Sopenharmony_ci{
5628c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
5638c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
5648c2ecf20Sopenharmony_ci	unsigned int saltlen = CHACHAPOLY_IV_SIZE - ivsize;
5658c2ecf20Sopenharmony_ci
5668c2ecf20Sopenharmony_ci	if (keylen != CHACHA_KEY_SIZE + saltlen)
5678c2ecf20Sopenharmony_ci		return -EINVAL;
5688c2ecf20Sopenharmony_ci
5698c2ecf20Sopenharmony_ci	memcpy(ctx->key, key, keylen);
5708c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = ctx->key;
5718c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen - saltlen;
5728c2ecf20Sopenharmony_ci
5738c2ecf20Sopenharmony_ci	return chachapoly_set_sh_desc(aead);
5748c2ecf20Sopenharmony_ci}
5758c2ecf20Sopenharmony_ci
5768c2ecf20Sopenharmony_cistatic int aead_setkey(struct crypto_aead *aead,
5778c2ecf20Sopenharmony_ci			       const u8 *key, unsigned int keylen)
5788c2ecf20Sopenharmony_ci{
5798c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
5808c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
5818c2ecf20Sopenharmony_ci	struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
5828c2ecf20Sopenharmony_ci	struct crypto_authenc_keys keys;
5838c2ecf20Sopenharmony_ci	int ret = 0;
5848c2ecf20Sopenharmony_ci
5858c2ecf20Sopenharmony_ci	if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
5868c2ecf20Sopenharmony_ci		goto badkey;
5878c2ecf20Sopenharmony_ci
5888c2ecf20Sopenharmony_ci	dev_dbg(jrdev, "keylen %d enckeylen %d authkeylen %d\n",
5898c2ecf20Sopenharmony_ci	       keys.authkeylen + keys.enckeylen, keys.enckeylen,
5908c2ecf20Sopenharmony_ci	       keys.authkeylen);
5918c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
5928c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
5938c2ecf20Sopenharmony_ci
5948c2ecf20Sopenharmony_ci	/*
5958c2ecf20Sopenharmony_ci	 * If DKP is supported, use it in the shared descriptor to generate
5968c2ecf20Sopenharmony_ci	 * the split key.
5978c2ecf20Sopenharmony_ci	 */
5988c2ecf20Sopenharmony_ci	if (ctrlpriv->era >= 6) {
5998c2ecf20Sopenharmony_ci		ctx->adata.keylen = keys.authkeylen;
6008c2ecf20Sopenharmony_ci		ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype &
6018c2ecf20Sopenharmony_ci						      OP_ALG_ALGSEL_MASK);
6028c2ecf20Sopenharmony_ci
6038c2ecf20Sopenharmony_ci		if (ctx->adata.keylen_pad + keys.enckeylen > CAAM_MAX_KEY_SIZE)
6048c2ecf20Sopenharmony_ci			goto badkey;
6058c2ecf20Sopenharmony_ci
6068c2ecf20Sopenharmony_ci		memcpy(ctx->key, keys.authkey, keys.authkeylen);
6078c2ecf20Sopenharmony_ci		memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey,
6088c2ecf20Sopenharmony_ci		       keys.enckeylen);
6098c2ecf20Sopenharmony_ci		dma_sync_single_for_device(jrdev, ctx->key_dma,
6108c2ecf20Sopenharmony_ci					   ctx->adata.keylen_pad +
6118c2ecf20Sopenharmony_ci					   keys.enckeylen, ctx->dir);
6128c2ecf20Sopenharmony_ci		goto skip_split_key;
6138c2ecf20Sopenharmony_ci	}
6148c2ecf20Sopenharmony_ci
6158c2ecf20Sopenharmony_ci	ret = gen_split_key(ctx->jrdev, ctx->key, &ctx->adata, keys.authkey,
6168c2ecf20Sopenharmony_ci			    keys.authkeylen, CAAM_MAX_KEY_SIZE -
6178c2ecf20Sopenharmony_ci			    keys.enckeylen);
6188c2ecf20Sopenharmony_ci	if (ret) {
6198c2ecf20Sopenharmony_ci		goto badkey;
6208c2ecf20Sopenharmony_ci	}
6218c2ecf20Sopenharmony_ci
6228c2ecf20Sopenharmony_ci	/* postpend encryption key to auth split key */
6238c2ecf20Sopenharmony_ci	memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, keys.enckeylen);
6248c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->adata.keylen_pad +
6258c2ecf20Sopenharmony_ci				   keys.enckeylen, ctx->dir);
6268c2ecf20Sopenharmony_ci
6278c2ecf20Sopenharmony_ci	print_hex_dump_debug("ctx.key@"__stringify(__LINE__)": ",
6288c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, ctx->key,
6298c2ecf20Sopenharmony_ci			     ctx->adata.keylen_pad + keys.enckeylen, 1);
6308c2ecf20Sopenharmony_ci
6318c2ecf20Sopenharmony_ciskip_split_key:
6328c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keys.enckeylen;
6338c2ecf20Sopenharmony_ci	memzero_explicit(&keys, sizeof(keys));
6348c2ecf20Sopenharmony_ci	return aead_set_sh_desc(aead);
6358c2ecf20Sopenharmony_cibadkey:
6368c2ecf20Sopenharmony_ci	memzero_explicit(&keys, sizeof(keys));
6378c2ecf20Sopenharmony_ci	return -EINVAL;
6388c2ecf20Sopenharmony_ci}
6398c2ecf20Sopenharmony_ci
6408c2ecf20Sopenharmony_cistatic int des3_aead_setkey(struct crypto_aead *aead, const u8 *key,
6418c2ecf20Sopenharmony_ci			    unsigned int keylen)
6428c2ecf20Sopenharmony_ci{
6438c2ecf20Sopenharmony_ci	struct crypto_authenc_keys keys;
6448c2ecf20Sopenharmony_ci	int err;
6458c2ecf20Sopenharmony_ci
6468c2ecf20Sopenharmony_ci	err = crypto_authenc_extractkeys(&keys, key, keylen);
6478c2ecf20Sopenharmony_ci	if (unlikely(err))
6488c2ecf20Sopenharmony_ci		return err;
6498c2ecf20Sopenharmony_ci
6508c2ecf20Sopenharmony_ci	err = verify_aead_des3_key(aead, keys.enckey, keys.enckeylen) ?:
6518c2ecf20Sopenharmony_ci	      aead_setkey(aead, key, keylen);
6528c2ecf20Sopenharmony_ci
6538c2ecf20Sopenharmony_ci	memzero_explicit(&keys, sizeof(keys));
6548c2ecf20Sopenharmony_ci	return err;
6558c2ecf20Sopenharmony_ci}
6568c2ecf20Sopenharmony_ci
6578c2ecf20Sopenharmony_cistatic int gcm_setkey(struct crypto_aead *aead,
6588c2ecf20Sopenharmony_ci		      const u8 *key, unsigned int keylen)
6598c2ecf20Sopenharmony_ci{
6608c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
6618c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
6628c2ecf20Sopenharmony_ci	int err;
6638c2ecf20Sopenharmony_ci
6648c2ecf20Sopenharmony_ci	err = aes_check_keylen(keylen);
6658c2ecf20Sopenharmony_ci	if (err)
6668c2ecf20Sopenharmony_ci		return err;
6678c2ecf20Sopenharmony_ci
6688c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
6698c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
6708c2ecf20Sopenharmony_ci
6718c2ecf20Sopenharmony_ci	memcpy(ctx->key, key, keylen);
6728c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->key_dma, keylen, ctx->dir);
6738c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen;
6748c2ecf20Sopenharmony_ci
6758c2ecf20Sopenharmony_ci	return gcm_set_sh_desc(aead);
6768c2ecf20Sopenharmony_ci}
6778c2ecf20Sopenharmony_ci
6788c2ecf20Sopenharmony_cistatic int rfc4106_setkey(struct crypto_aead *aead,
6798c2ecf20Sopenharmony_ci			  const u8 *key, unsigned int keylen)
6808c2ecf20Sopenharmony_ci{
6818c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
6828c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
6838c2ecf20Sopenharmony_ci	int err;
6848c2ecf20Sopenharmony_ci
6858c2ecf20Sopenharmony_ci	err = aes_check_keylen(keylen - 4);
6868c2ecf20Sopenharmony_ci	if (err)
6878c2ecf20Sopenharmony_ci		return err;
6888c2ecf20Sopenharmony_ci
6898c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
6908c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
6918c2ecf20Sopenharmony_ci
6928c2ecf20Sopenharmony_ci	memcpy(ctx->key, key, keylen);
6938c2ecf20Sopenharmony_ci
6948c2ecf20Sopenharmony_ci	/*
6958c2ecf20Sopenharmony_ci	 * The last four bytes of the key material are used as the salt value
6968c2ecf20Sopenharmony_ci	 * in the nonce. Update the AES key length.
6978c2ecf20Sopenharmony_ci	 */
6988c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen - 4;
6998c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->cdata.keylen,
7008c2ecf20Sopenharmony_ci				   ctx->dir);
7018c2ecf20Sopenharmony_ci	return rfc4106_set_sh_desc(aead);
7028c2ecf20Sopenharmony_ci}
7038c2ecf20Sopenharmony_ci
7048c2ecf20Sopenharmony_cistatic int rfc4543_setkey(struct crypto_aead *aead,
7058c2ecf20Sopenharmony_ci			  const u8 *key, unsigned int keylen)
7068c2ecf20Sopenharmony_ci{
7078c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
7088c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
7098c2ecf20Sopenharmony_ci	int err;
7108c2ecf20Sopenharmony_ci
7118c2ecf20Sopenharmony_ci	err = aes_check_keylen(keylen - 4);
7128c2ecf20Sopenharmony_ci	if (err)
7138c2ecf20Sopenharmony_ci		return err;
7148c2ecf20Sopenharmony_ci
7158c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
7168c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
7178c2ecf20Sopenharmony_ci
7188c2ecf20Sopenharmony_ci	memcpy(ctx->key, key, keylen);
7198c2ecf20Sopenharmony_ci
7208c2ecf20Sopenharmony_ci	/*
7218c2ecf20Sopenharmony_ci	 * The last four bytes of the key material are used as the salt value
7228c2ecf20Sopenharmony_ci	 * in the nonce. Update the AES key length.
7238c2ecf20Sopenharmony_ci	 */
7248c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen - 4;
7258c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->cdata.keylen,
7268c2ecf20Sopenharmony_ci				   ctx->dir);
7278c2ecf20Sopenharmony_ci	return rfc4543_set_sh_desc(aead);
7288c2ecf20Sopenharmony_ci}
7298c2ecf20Sopenharmony_ci
7308c2ecf20Sopenharmony_cistatic int skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key,
7318c2ecf20Sopenharmony_ci			   unsigned int keylen, const u32 ctx1_iv_off)
7328c2ecf20Sopenharmony_ci{
7338c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
7348c2ecf20Sopenharmony_ci	struct caam_skcipher_alg *alg =
7358c2ecf20Sopenharmony_ci		container_of(crypto_skcipher_alg(skcipher), typeof(*alg),
7368c2ecf20Sopenharmony_ci			     skcipher);
7378c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
7388c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_skcipher_ivsize(skcipher);
7398c2ecf20Sopenharmony_ci	u32 *desc;
7408c2ecf20Sopenharmony_ci	const bool is_rfc3686 = alg->caam.rfc3686;
7418c2ecf20Sopenharmony_ci
7428c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
7438c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
7448c2ecf20Sopenharmony_ci
7458c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen;
7468c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = key;
7478c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = true;
7488c2ecf20Sopenharmony_ci
7498c2ecf20Sopenharmony_ci	/* skcipher_encrypt shared descriptor */
7508c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_enc;
7518c2ecf20Sopenharmony_ci	cnstr_shdsc_skcipher_encap(desc, &ctx->cdata, ivsize, is_rfc3686,
7528c2ecf20Sopenharmony_ci				   ctx1_iv_off);
7538c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
7548c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
7558c2ecf20Sopenharmony_ci
7568c2ecf20Sopenharmony_ci	/* skcipher_decrypt shared descriptor */
7578c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_dec;
7588c2ecf20Sopenharmony_ci	cnstr_shdsc_skcipher_decap(desc, &ctx->cdata, ivsize, is_rfc3686,
7598c2ecf20Sopenharmony_ci				   ctx1_iv_off);
7608c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
7618c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
7628c2ecf20Sopenharmony_ci
7638c2ecf20Sopenharmony_ci	return 0;
7648c2ecf20Sopenharmony_ci}
7658c2ecf20Sopenharmony_ci
7668c2ecf20Sopenharmony_cistatic int aes_skcipher_setkey(struct crypto_skcipher *skcipher,
7678c2ecf20Sopenharmony_ci			       const u8 *key, unsigned int keylen)
7688c2ecf20Sopenharmony_ci{
7698c2ecf20Sopenharmony_ci	int err;
7708c2ecf20Sopenharmony_ci
7718c2ecf20Sopenharmony_ci	err = aes_check_keylen(keylen);
7728c2ecf20Sopenharmony_ci	if (err)
7738c2ecf20Sopenharmony_ci		return err;
7748c2ecf20Sopenharmony_ci
7758c2ecf20Sopenharmony_ci	return skcipher_setkey(skcipher, key, keylen, 0);
7768c2ecf20Sopenharmony_ci}
7778c2ecf20Sopenharmony_ci
7788c2ecf20Sopenharmony_cistatic int rfc3686_skcipher_setkey(struct crypto_skcipher *skcipher,
7798c2ecf20Sopenharmony_ci				   const u8 *key, unsigned int keylen)
7808c2ecf20Sopenharmony_ci{
7818c2ecf20Sopenharmony_ci	u32 ctx1_iv_off;
7828c2ecf20Sopenharmony_ci	int err;
7838c2ecf20Sopenharmony_ci
7848c2ecf20Sopenharmony_ci	/*
7858c2ecf20Sopenharmony_ci	 * RFC3686 specific:
7868c2ecf20Sopenharmony_ci	 *	| CONTEXT1[255:128] = {NONCE, IV, COUNTER}
7878c2ecf20Sopenharmony_ci	 *	| *key = {KEY, NONCE}
7888c2ecf20Sopenharmony_ci	 */
7898c2ecf20Sopenharmony_ci	ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;
7908c2ecf20Sopenharmony_ci	keylen -= CTR_RFC3686_NONCE_SIZE;
7918c2ecf20Sopenharmony_ci
7928c2ecf20Sopenharmony_ci	err = aes_check_keylen(keylen);
7938c2ecf20Sopenharmony_ci	if (err)
7948c2ecf20Sopenharmony_ci		return err;
7958c2ecf20Sopenharmony_ci
7968c2ecf20Sopenharmony_ci	return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off);
7978c2ecf20Sopenharmony_ci}
7988c2ecf20Sopenharmony_ci
7998c2ecf20Sopenharmony_cistatic int ctr_skcipher_setkey(struct crypto_skcipher *skcipher,
8008c2ecf20Sopenharmony_ci			       const u8 *key, unsigned int keylen)
8018c2ecf20Sopenharmony_ci{
8028c2ecf20Sopenharmony_ci	u32 ctx1_iv_off;
8038c2ecf20Sopenharmony_ci	int err;
8048c2ecf20Sopenharmony_ci
8058c2ecf20Sopenharmony_ci	/*
8068c2ecf20Sopenharmony_ci	 * AES-CTR needs to load IV in CONTEXT1 reg
8078c2ecf20Sopenharmony_ci	 * at an offset of 128bits (16bytes)
8088c2ecf20Sopenharmony_ci	 * CONTEXT1[255:128] = IV
8098c2ecf20Sopenharmony_ci	 */
8108c2ecf20Sopenharmony_ci	ctx1_iv_off = 16;
8118c2ecf20Sopenharmony_ci
8128c2ecf20Sopenharmony_ci	err = aes_check_keylen(keylen);
8138c2ecf20Sopenharmony_ci	if (err)
8148c2ecf20Sopenharmony_ci		return err;
8158c2ecf20Sopenharmony_ci
8168c2ecf20Sopenharmony_ci	return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off);
8178c2ecf20Sopenharmony_ci}
8188c2ecf20Sopenharmony_ci
8198c2ecf20Sopenharmony_cistatic int des_skcipher_setkey(struct crypto_skcipher *skcipher,
8208c2ecf20Sopenharmony_ci			       const u8 *key, unsigned int keylen)
8218c2ecf20Sopenharmony_ci{
8228c2ecf20Sopenharmony_ci	return verify_skcipher_des_key(skcipher, key) ?:
8238c2ecf20Sopenharmony_ci	       skcipher_setkey(skcipher, key, keylen, 0);
8248c2ecf20Sopenharmony_ci}
8258c2ecf20Sopenharmony_ci
8268c2ecf20Sopenharmony_cistatic int des3_skcipher_setkey(struct crypto_skcipher *skcipher,
8278c2ecf20Sopenharmony_ci				const u8 *key, unsigned int keylen)
8288c2ecf20Sopenharmony_ci{
8298c2ecf20Sopenharmony_ci	return verify_skcipher_des3_key(skcipher, key) ?:
8308c2ecf20Sopenharmony_ci	       skcipher_setkey(skcipher, key, keylen, 0);
8318c2ecf20Sopenharmony_ci}
8328c2ecf20Sopenharmony_ci
8338c2ecf20Sopenharmony_cistatic int xts_skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key,
8348c2ecf20Sopenharmony_ci			       unsigned int keylen)
8358c2ecf20Sopenharmony_ci{
8368c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
8378c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
8388c2ecf20Sopenharmony_ci	struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
8398c2ecf20Sopenharmony_ci	u32 *desc;
8408c2ecf20Sopenharmony_ci	int err;
8418c2ecf20Sopenharmony_ci
8428c2ecf20Sopenharmony_ci	err = xts_verify_key(skcipher, key, keylen);
8438c2ecf20Sopenharmony_ci	if (err) {
8448c2ecf20Sopenharmony_ci		dev_dbg(jrdev, "key size mismatch\n");
8458c2ecf20Sopenharmony_ci		return err;
8468c2ecf20Sopenharmony_ci	}
8478c2ecf20Sopenharmony_ci
8488c2ecf20Sopenharmony_ci	if (keylen != 2 * AES_KEYSIZE_128 && keylen != 2 * AES_KEYSIZE_256)
8498c2ecf20Sopenharmony_ci		ctx->xts_key_fallback = true;
8508c2ecf20Sopenharmony_ci
8518c2ecf20Sopenharmony_ci	if (ctrlpriv->era <= 8 || ctx->xts_key_fallback) {
8528c2ecf20Sopenharmony_ci		err = crypto_skcipher_setkey(ctx->fallback, key, keylen);
8538c2ecf20Sopenharmony_ci		if (err)
8548c2ecf20Sopenharmony_ci			return err;
8558c2ecf20Sopenharmony_ci	}
8568c2ecf20Sopenharmony_ci
8578c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen;
8588c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = key;
8598c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = true;
8608c2ecf20Sopenharmony_ci
8618c2ecf20Sopenharmony_ci	/* xts_skcipher_encrypt shared descriptor */
8628c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_enc;
8638c2ecf20Sopenharmony_ci	cnstr_shdsc_xts_skcipher_encap(desc, &ctx->cdata);
8648c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
8658c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
8668c2ecf20Sopenharmony_ci
8678c2ecf20Sopenharmony_ci	/* xts_skcipher_decrypt shared descriptor */
8688c2ecf20Sopenharmony_ci	desc = ctx->sh_desc_dec;
8698c2ecf20Sopenharmony_ci	cnstr_shdsc_xts_skcipher_decap(desc, &ctx->cdata);
8708c2ecf20Sopenharmony_ci	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
8718c2ecf20Sopenharmony_ci				   desc_bytes(desc), ctx->dir);
8728c2ecf20Sopenharmony_ci
8738c2ecf20Sopenharmony_ci	return 0;
8748c2ecf20Sopenharmony_ci}
8758c2ecf20Sopenharmony_ci
8768c2ecf20Sopenharmony_ci/*
8778c2ecf20Sopenharmony_ci * aead_edesc - s/w-extended aead descriptor
8788c2ecf20Sopenharmony_ci * @src_nents: number of segments in input s/w scatterlist
8798c2ecf20Sopenharmony_ci * @dst_nents: number of segments in output s/w scatterlist
8808c2ecf20Sopenharmony_ci * @mapped_src_nents: number of segments in input h/w link table
8818c2ecf20Sopenharmony_ci * @mapped_dst_nents: number of segments in output h/w link table
8828c2ecf20Sopenharmony_ci * @sec4_sg_bytes: length of dma mapped sec4_sg space
8838c2ecf20Sopenharmony_ci * @bklog: stored to determine if the request needs backlog
8848c2ecf20Sopenharmony_ci * @sec4_sg_dma: bus physical mapped address of h/w link table
8858c2ecf20Sopenharmony_ci * @sec4_sg: pointer to h/w link table
8868c2ecf20Sopenharmony_ci * @hw_desc: the h/w job descriptor followed by any referenced link tables
8878c2ecf20Sopenharmony_ci */
8888c2ecf20Sopenharmony_cistruct aead_edesc {
8898c2ecf20Sopenharmony_ci	int src_nents;
8908c2ecf20Sopenharmony_ci	int dst_nents;
8918c2ecf20Sopenharmony_ci	int mapped_src_nents;
8928c2ecf20Sopenharmony_ci	int mapped_dst_nents;
8938c2ecf20Sopenharmony_ci	int sec4_sg_bytes;
8948c2ecf20Sopenharmony_ci	bool bklog;
8958c2ecf20Sopenharmony_ci	dma_addr_t sec4_sg_dma;
8968c2ecf20Sopenharmony_ci	struct sec4_sg_entry *sec4_sg;
8978c2ecf20Sopenharmony_ci	u32 hw_desc[];
8988c2ecf20Sopenharmony_ci};
8998c2ecf20Sopenharmony_ci
9008c2ecf20Sopenharmony_ci/*
9018c2ecf20Sopenharmony_ci * skcipher_edesc - s/w-extended skcipher descriptor
9028c2ecf20Sopenharmony_ci * @src_nents: number of segments in input s/w scatterlist
9038c2ecf20Sopenharmony_ci * @dst_nents: number of segments in output s/w scatterlist
9048c2ecf20Sopenharmony_ci * @mapped_src_nents: number of segments in input h/w link table
9058c2ecf20Sopenharmony_ci * @mapped_dst_nents: number of segments in output h/w link table
9068c2ecf20Sopenharmony_ci * @iv_dma: dma address of iv for checking continuity and link table
9078c2ecf20Sopenharmony_ci * @sec4_sg_bytes: length of dma mapped sec4_sg space
9088c2ecf20Sopenharmony_ci * @bklog: stored to determine if the request needs backlog
9098c2ecf20Sopenharmony_ci * @sec4_sg_dma: bus physical mapped address of h/w link table
9108c2ecf20Sopenharmony_ci * @sec4_sg: pointer to h/w link table
9118c2ecf20Sopenharmony_ci * @hw_desc: the h/w job descriptor followed by any referenced link tables
9128c2ecf20Sopenharmony_ci *	     and IV
9138c2ecf20Sopenharmony_ci */
9148c2ecf20Sopenharmony_cistruct skcipher_edesc {
9158c2ecf20Sopenharmony_ci	int src_nents;
9168c2ecf20Sopenharmony_ci	int dst_nents;
9178c2ecf20Sopenharmony_ci	int mapped_src_nents;
9188c2ecf20Sopenharmony_ci	int mapped_dst_nents;
9198c2ecf20Sopenharmony_ci	dma_addr_t iv_dma;
9208c2ecf20Sopenharmony_ci	int sec4_sg_bytes;
9218c2ecf20Sopenharmony_ci	bool bklog;
9228c2ecf20Sopenharmony_ci	dma_addr_t sec4_sg_dma;
9238c2ecf20Sopenharmony_ci	struct sec4_sg_entry *sec4_sg;
9248c2ecf20Sopenharmony_ci	u32 hw_desc[];
9258c2ecf20Sopenharmony_ci};
9268c2ecf20Sopenharmony_ci
9278c2ecf20Sopenharmony_cistatic void caam_unmap(struct device *dev, struct scatterlist *src,
9288c2ecf20Sopenharmony_ci		       struct scatterlist *dst, int src_nents,
9298c2ecf20Sopenharmony_ci		       int dst_nents,
9308c2ecf20Sopenharmony_ci		       dma_addr_t iv_dma, int ivsize, dma_addr_t sec4_sg_dma,
9318c2ecf20Sopenharmony_ci		       int sec4_sg_bytes)
9328c2ecf20Sopenharmony_ci{
9338c2ecf20Sopenharmony_ci	if (dst != src) {
9348c2ecf20Sopenharmony_ci		if (src_nents)
9358c2ecf20Sopenharmony_ci			dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE);
9368c2ecf20Sopenharmony_ci		if (dst_nents)
9378c2ecf20Sopenharmony_ci			dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE);
9388c2ecf20Sopenharmony_ci	} else {
9398c2ecf20Sopenharmony_ci		dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL);
9408c2ecf20Sopenharmony_ci	}
9418c2ecf20Sopenharmony_ci
9428c2ecf20Sopenharmony_ci	if (iv_dma)
9438c2ecf20Sopenharmony_ci		dma_unmap_single(dev, iv_dma, ivsize, DMA_BIDIRECTIONAL);
9448c2ecf20Sopenharmony_ci	if (sec4_sg_bytes)
9458c2ecf20Sopenharmony_ci		dma_unmap_single(dev, sec4_sg_dma, sec4_sg_bytes,
9468c2ecf20Sopenharmony_ci				 DMA_TO_DEVICE);
9478c2ecf20Sopenharmony_ci}
9488c2ecf20Sopenharmony_ci
9498c2ecf20Sopenharmony_cistatic void aead_unmap(struct device *dev,
9508c2ecf20Sopenharmony_ci		       struct aead_edesc *edesc,
9518c2ecf20Sopenharmony_ci		       struct aead_request *req)
9528c2ecf20Sopenharmony_ci{
9538c2ecf20Sopenharmony_ci	caam_unmap(dev, req->src, req->dst,
9548c2ecf20Sopenharmony_ci		   edesc->src_nents, edesc->dst_nents, 0, 0,
9558c2ecf20Sopenharmony_ci		   edesc->sec4_sg_dma, edesc->sec4_sg_bytes);
9568c2ecf20Sopenharmony_ci}
9578c2ecf20Sopenharmony_ci
9588c2ecf20Sopenharmony_cistatic void skcipher_unmap(struct device *dev, struct skcipher_edesc *edesc,
9598c2ecf20Sopenharmony_ci			   struct skcipher_request *req)
9608c2ecf20Sopenharmony_ci{
9618c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
9628c2ecf20Sopenharmony_ci	int ivsize = crypto_skcipher_ivsize(skcipher);
9638c2ecf20Sopenharmony_ci
9648c2ecf20Sopenharmony_ci	caam_unmap(dev, req->src, req->dst,
9658c2ecf20Sopenharmony_ci		   edesc->src_nents, edesc->dst_nents,
9668c2ecf20Sopenharmony_ci		   edesc->iv_dma, ivsize,
9678c2ecf20Sopenharmony_ci		   edesc->sec4_sg_dma, edesc->sec4_sg_bytes);
9688c2ecf20Sopenharmony_ci}
9698c2ecf20Sopenharmony_ci
9708c2ecf20Sopenharmony_cistatic void aead_crypt_done(struct device *jrdev, u32 *desc, u32 err,
9718c2ecf20Sopenharmony_ci			    void *context)
9728c2ecf20Sopenharmony_ci{
9738c2ecf20Sopenharmony_ci	struct aead_request *req = context;
9748c2ecf20Sopenharmony_ci	struct caam_aead_req_ctx *rctx = aead_request_ctx(req);
9758c2ecf20Sopenharmony_ci	struct caam_drv_private_jr *jrp = dev_get_drvdata(jrdev);
9768c2ecf20Sopenharmony_ci	struct aead_edesc *edesc;
9778c2ecf20Sopenharmony_ci	int ecode = 0;
9788c2ecf20Sopenharmony_ci	bool has_bklog;
9798c2ecf20Sopenharmony_ci
9808c2ecf20Sopenharmony_ci	dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
9818c2ecf20Sopenharmony_ci
9828c2ecf20Sopenharmony_ci	edesc = rctx->edesc;
9838c2ecf20Sopenharmony_ci	has_bklog = edesc->bklog;
9848c2ecf20Sopenharmony_ci
9858c2ecf20Sopenharmony_ci	if (err)
9868c2ecf20Sopenharmony_ci		ecode = caam_jr_strstatus(jrdev, err);
9878c2ecf20Sopenharmony_ci
9888c2ecf20Sopenharmony_ci	aead_unmap(jrdev, edesc, req);
9898c2ecf20Sopenharmony_ci
9908c2ecf20Sopenharmony_ci	kfree(edesc);
9918c2ecf20Sopenharmony_ci
9928c2ecf20Sopenharmony_ci	/*
9938c2ecf20Sopenharmony_ci	 * If no backlog flag, the completion of the request is done
9948c2ecf20Sopenharmony_ci	 * by CAAM, not crypto engine.
9958c2ecf20Sopenharmony_ci	 */
9968c2ecf20Sopenharmony_ci	if (!has_bklog)
9978c2ecf20Sopenharmony_ci		aead_request_complete(req, ecode);
9988c2ecf20Sopenharmony_ci	else
9998c2ecf20Sopenharmony_ci		crypto_finalize_aead_request(jrp->engine, req, ecode);
10008c2ecf20Sopenharmony_ci}
10018c2ecf20Sopenharmony_ci
10028c2ecf20Sopenharmony_cistatic void skcipher_crypt_done(struct device *jrdev, u32 *desc, u32 err,
10038c2ecf20Sopenharmony_ci				void *context)
10048c2ecf20Sopenharmony_ci{
10058c2ecf20Sopenharmony_ci	struct skcipher_request *req = context;
10068c2ecf20Sopenharmony_ci	struct skcipher_edesc *edesc;
10078c2ecf20Sopenharmony_ci	struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req);
10088c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
10098c2ecf20Sopenharmony_ci	struct caam_drv_private_jr *jrp = dev_get_drvdata(jrdev);
10108c2ecf20Sopenharmony_ci	int ivsize = crypto_skcipher_ivsize(skcipher);
10118c2ecf20Sopenharmony_ci	int ecode = 0;
10128c2ecf20Sopenharmony_ci	bool has_bklog;
10138c2ecf20Sopenharmony_ci
10148c2ecf20Sopenharmony_ci	dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
10158c2ecf20Sopenharmony_ci
10168c2ecf20Sopenharmony_ci	edesc = rctx->edesc;
10178c2ecf20Sopenharmony_ci	has_bklog = edesc->bklog;
10188c2ecf20Sopenharmony_ci	if (err)
10198c2ecf20Sopenharmony_ci		ecode = caam_jr_strstatus(jrdev, err);
10208c2ecf20Sopenharmony_ci
10218c2ecf20Sopenharmony_ci	skcipher_unmap(jrdev, edesc, req);
10228c2ecf20Sopenharmony_ci
10238c2ecf20Sopenharmony_ci	/*
10248c2ecf20Sopenharmony_ci	 * The crypto API expects us to set the IV (req->iv) to the last
10258c2ecf20Sopenharmony_ci	 * ciphertext block (CBC mode) or last counter (CTR mode).
10268c2ecf20Sopenharmony_ci	 * This is used e.g. by the CTS mode.
10278c2ecf20Sopenharmony_ci	 */
10288c2ecf20Sopenharmony_ci	if (ivsize && !ecode) {
10298c2ecf20Sopenharmony_ci		memcpy(req->iv, (u8 *)edesc->sec4_sg + edesc->sec4_sg_bytes,
10308c2ecf20Sopenharmony_ci		       ivsize);
10318c2ecf20Sopenharmony_ci
10328c2ecf20Sopenharmony_ci		print_hex_dump_debug("dstiv  @" __stringify(__LINE__)": ",
10338c2ecf20Sopenharmony_ci				     DUMP_PREFIX_ADDRESS, 16, 4, req->iv,
10348c2ecf20Sopenharmony_ci				     ivsize, 1);
10358c2ecf20Sopenharmony_ci	}
10368c2ecf20Sopenharmony_ci
10378c2ecf20Sopenharmony_ci	caam_dump_sg("dst    @" __stringify(__LINE__)": ",
10388c2ecf20Sopenharmony_ci		     DUMP_PREFIX_ADDRESS, 16, 4, req->dst,
10398c2ecf20Sopenharmony_ci		     edesc->dst_nents > 1 ? 100 : req->cryptlen, 1);
10408c2ecf20Sopenharmony_ci
10418c2ecf20Sopenharmony_ci	kfree(edesc);
10428c2ecf20Sopenharmony_ci
10438c2ecf20Sopenharmony_ci	/*
10448c2ecf20Sopenharmony_ci	 * If no backlog flag, the completion of the request is done
10458c2ecf20Sopenharmony_ci	 * by CAAM, not crypto engine.
10468c2ecf20Sopenharmony_ci	 */
10478c2ecf20Sopenharmony_ci	if (!has_bklog)
10488c2ecf20Sopenharmony_ci		skcipher_request_complete(req, ecode);
10498c2ecf20Sopenharmony_ci	else
10508c2ecf20Sopenharmony_ci		crypto_finalize_skcipher_request(jrp->engine, req, ecode);
10518c2ecf20Sopenharmony_ci}
10528c2ecf20Sopenharmony_ci
10538c2ecf20Sopenharmony_ci/*
10548c2ecf20Sopenharmony_ci * Fill in aead job descriptor
10558c2ecf20Sopenharmony_ci */
10568c2ecf20Sopenharmony_cistatic void init_aead_job(struct aead_request *req,
10578c2ecf20Sopenharmony_ci			  struct aead_edesc *edesc,
10588c2ecf20Sopenharmony_ci			  bool all_contig, bool encrypt)
10598c2ecf20Sopenharmony_ci{
10608c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
10618c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
10628c2ecf20Sopenharmony_ci	int authsize = ctx->authsize;
10638c2ecf20Sopenharmony_ci	u32 *desc = edesc->hw_desc;
10648c2ecf20Sopenharmony_ci	u32 out_options, in_options;
10658c2ecf20Sopenharmony_ci	dma_addr_t dst_dma, src_dma;
10668c2ecf20Sopenharmony_ci	int len, sec4_sg_index = 0;
10678c2ecf20Sopenharmony_ci	dma_addr_t ptr;
10688c2ecf20Sopenharmony_ci	u32 *sh_desc;
10698c2ecf20Sopenharmony_ci
10708c2ecf20Sopenharmony_ci	sh_desc = encrypt ? ctx->sh_desc_enc : ctx->sh_desc_dec;
10718c2ecf20Sopenharmony_ci	ptr = encrypt ? ctx->sh_desc_enc_dma : ctx->sh_desc_dec_dma;
10728c2ecf20Sopenharmony_ci
10738c2ecf20Sopenharmony_ci	len = desc_len(sh_desc);
10748c2ecf20Sopenharmony_ci	init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE);
10758c2ecf20Sopenharmony_ci
10768c2ecf20Sopenharmony_ci	if (all_contig) {
10778c2ecf20Sopenharmony_ci		src_dma = edesc->mapped_src_nents ? sg_dma_address(req->src) :
10788c2ecf20Sopenharmony_ci						    0;
10798c2ecf20Sopenharmony_ci		in_options = 0;
10808c2ecf20Sopenharmony_ci	} else {
10818c2ecf20Sopenharmony_ci		src_dma = edesc->sec4_sg_dma;
10828c2ecf20Sopenharmony_ci		sec4_sg_index += edesc->mapped_src_nents;
10838c2ecf20Sopenharmony_ci		in_options = LDST_SGF;
10848c2ecf20Sopenharmony_ci	}
10858c2ecf20Sopenharmony_ci
10868c2ecf20Sopenharmony_ci	append_seq_in_ptr(desc, src_dma, req->assoclen + req->cryptlen,
10878c2ecf20Sopenharmony_ci			  in_options);
10888c2ecf20Sopenharmony_ci
10898c2ecf20Sopenharmony_ci	dst_dma = src_dma;
10908c2ecf20Sopenharmony_ci	out_options = in_options;
10918c2ecf20Sopenharmony_ci
10928c2ecf20Sopenharmony_ci	if (unlikely(req->src != req->dst)) {
10938c2ecf20Sopenharmony_ci		if (!edesc->mapped_dst_nents) {
10948c2ecf20Sopenharmony_ci			dst_dma = 0;
10958c2ecf20Sopenharmony_ci			out_options = 0;
10968c2ecf20Sopenharmony_ci		} else if (edesc->mapped_dst_nents == 1) {
10978c2ecf20Sopenharmony_ci			dst_dma = sg_dma_address(req->dst);
10988c2ecf20Sopenharmony_ci			out_options = 0;
10998c2ecf20Sopenharmony_ci		} else {
11008c2ecf20Sopenharmony_ci			dst_dma = edesc->sec4_sg_dma +
11018c2ecf20Sopenharmony_ci				  sec4_sg_index *
11028c2ecf20Sopenharmony_ci				  sizeof(struct sec4_sg_entry);
11038c2ecf20Sopenharmony_ci			out_options = LDST_SGF;
11048c2ecf20Sopenharmony_ci		}
11058c2ecf20Sopenharmony_ci	}
11068c2ecf20Sopenharmony_ci
11078c2ecf20Sopenharmony_ci	if (encrypt)
11088c2ecf20Sopenharmony_ci		append_seq_out_ptr(desc, dst_dma,
11098c2ecf20Sopenharmony_ci				   req->assoclen + req->cryptlen + authsize,
11108c2ecf20Sopenharmony_ci				   out_options);
11118c2ecf20Sopenharmony_ci	else
11128c2ecf20Sopenharmony_ci		append_seq_out_ptr(desc, dst_dma,
11138c2ecf20Sopenharmony_ci				   req->assoclen + req->cryptlen - authsize,
11148c2ecf20Sopenharmony_ci				   out_options);
11158c2ecf20Sopenharmony_ci}
11168c2ecf20Sopenharmony_ci
11178c2ecf20Sopenharmony_cistatic void init_gcm_job(struct aead_request *req,
11188c2ecf20Sopenharmony_ci			 struct aead_edesc *edesc,
11198c2ecf20Sopenharmony_ci			 bool all_contig, bool encrypt)
11208c2ecf20Sopenharmony_ci{
11218c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
11228c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
11238c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
11248c2ecf20Sopenharmony_ci	u32 *desc = edesc->hw_desc;
11258c2ecf20Sopenharmony_ci	bool generic_gcm = (ivsize == GCM_AES_IV_SIZE);
11268c2ecf20Sopenharmony_ci	unsigned int last;
11278c2ecf20Sopenharmony_ci
11288c2ecf20Sopenharmony_ci	init_aead_job(req, edesc, all_contig, encrypt);
11298c2ecf20Sopenharmony_ci	append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen);
11308c2ecf20Sopenharmony_ci
11318c2ecf20Sopenharmony_ci	/* BUG This should not be specific to generic GCM. */
11328c2ecf20Sopenharmony_ci	last = 0;
11338c2ecf20Sopenharmony_ci	if (encrypt && generic_gcm && !(req->assoclen + req->cryptlen))
11348c2ecf20Sopenharmony_ci		last = FIFOLD_TYPE_LAST1;
11358c2ecf20Sopenharmony_ci
11368c2ecf20Sopenharmony_ci	/* Read GCM IV */
11378c2ecf20Sopenharmony_ci	append_cmd(desc, CMD_FIFO_LOAD | FIFOLD_CLASS_CLASS1 | IMMEDIATE |
11388c2ecf20Sopenharmony_ci			 FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 | GCM_AES_IV_SIZE | last);
11398c2ecf20Sopenharmony_ci	/* Append Salt */
11408c2ecf20Sopenharmony_ci	if (!generic_gcm)
11418c2ecf20Sopenharmony_ci		append_data(desc, ctx->key + ctx->cdata.keylen, 4);
11428c2ecf20Sopenharmony_ci	/* Append IV */
11438c2ecf20Sopenharmony_ci	append_data(desc, req->iv, ivsize);
11448c2ecf20Sopenharmony_ci	/* End of blank commands */
11458c2ecf20Sopenharmony_ci}
11468c2ecf20Sopenharmony_ci
11478c2ecf20Sopenharmony_cistatic void init_chachapoly_job(struct aead_request *req,
11488c2ecf20Sopenharmony_ci				struct aead_edesc *edesc, bool all_contig,
11498c2ecf20Sopenharmony_ci				bool encrypt)
11508c2ecf20Sopenharmony_ci{
11518c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
11528c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
11538c2ecf20Sopenharmony_ci	unsigned int assoclen = req->assoclen;
11548c2ecf20Sopenharmony_ci	u32 *desc = edesc->hw_desc;
11558c2ecf20Sopenharmony_ci	u32 ctx_iv_off = 4;
11568c2ecf20Sopenharmony_ci
11578c2ecf20Sopenharmony_ci	init_aead_job(req, edesc, all_contig, encrypt);
11588c2ecf20Sopenharmony_ci
11598c2ecf20Sopenharmony_ci	if (ivsize != CHACHAPOLY_IV_SIZE) {
11608c2ecf20Sopenharmony_ci		/* IPsec specific: CONTEXT1[223:128] = {NONCE, IV} */
11618c2ecf20Sopenharmony_ci		ctx_iv_off += 4;
11628c2ecf20Sopenharmony_ci
11638c2ecf20Sopenharmony_ci		/*
11648c2ecf20Sopenharmony_ci		 * The associated data comes already with the IV but we need
11658c2ecf20Sopenharmony_ci		 * to skip it when we authenticate or encrypt...
11668c2ecf20Sopenharmony_ci		 */
11678c2ecf20Sopenharmony_ci		assoclen -= ivsize;
11688c2ecf20Sopenharmony_ci	}
11698c2ecf20Sopenharmony_ci
11708c2ecf20Sopenharmony_ci	append_math_add_imm_u32(desc, REG3, ZERO, IMM, assoclen);
11718c2ecf20Sopenharmony_ci
11728c2ecf20Sopenharmony_ci	/*
11738c2ecf20Sopenharmony_ci	 * For IPsec load the IV further in the same register.
11748c2ecf20Sopenharmony_ci	 * For RFC7539 simply load the 12 bytes nonce in a single operation
11758c2ecf20Sopenharmony_ci	 */
11768c2ecf20Sopenharmony_ci	append_load_as_imm(desc, req->iv, ivsize, LDST_CLASS_1_CCB |
11778c2ecf20Sopenharmony_ci			   LDST_SRCDST_BYTE_CONTEXT |
11788c2ecf20Sopenharmony_ci			   ctx_iv_off << LDST_OFFSET_SHIFT);
11798c2ecf20Sopenharmony_ci}
11808c2ecf20Sopenharmony_ci
11818c2ecf20Sopenharmony_cistatic void init_authenc_job(struct aead_request *req,
11828c2ecf20Sopenharmony_ci			     struct aead_edesc *edesc,
11838c2ecf20Sopenharmony_ci			     bool all_contig, bool encrypt)
11848c2ecf20Sopenharmony_ci{
11858c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
11868c2ecf20Sopenharmony_ci	struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),
11878c2ecf20Sopenharmony_ci						 struct caam_aead_alg, aead);
11888c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
11898c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
11908c2ecf20Sopenharmony_ci	struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctx->jrdev->parent);
11918c2ecf20Sopenharmony_ci	const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) ==
11928c2ecf20Sopenharmony_ci			       OP_ALG_AAI_CTR_MOD128);
11938c2ecf20Sopenharmony_ci	const bool is_rfc3686 = alg->caam.rfc3686;
11948c2ecf20Sopenharmony_ci	u32 *desc = edesc->hw_desc;
11958c2ecf20Sopenharmony_ci	u32 ivoffset = 0;
11968c2ecf20Sopenharmony_ci
11978c2ecf20Sopenharmony_ci	/*
11988c2ecf20Sopenharmony_ci	 * AES-CTR needs to load IV in CONTEXT1 reg
11998c2ecf20Sopenharmony_ci	 * at an offset of 128bits (16bytes)
12008c2ecf20Sopenharmony_ci	 * CONTEXT1[255:128] = IV
12018c2ecf20Sopenharmony_ci	 */
12028c2ecf20Sopenharmony_ci	if (ctr_mode)
12038c2ecf20Sopenharmony_ci		ivoffset = 16;
12048c2ecf20Sopenharmony_ci
12058c2ecf20Sopenharmony_ci	/*
12068c2ecf20Sopenharmony_ci	 * RFC3686 specific:
12078c2ecf20Sopenharmony_ci	 *	CONTEXT1[255:128] = {NONCE, IV, COUNTER}
12088c2ecf20Sopenharmony_ci	 */
12098c2ecf20Sopenharmony_ci	if (is_rfc3686)
12108c2ecf20Sopenharmony_ci		ivoffset = 16 + CTR_RFC3686_NONCE_SIZE;
12118c2ecf20Sopenharmony_ci
12128c2ecf20Sopenharmony_ci	init_aead_job(req, edesc, all_contig, encrypt);
12138c2ecf20Sopenharmony_ci
12148c2ecf20Sopenharmony_ci	/*
12158c2ecf20Sopenharmony_ci	 * {REG3, DPOVRD} = assoclen, depending on whether MATH command supports
12168c2ecf20Sopenharmony_ci	 * having DPOVRD as destination.
12178c2ecf20Sopenharmony_ci	 */
12188c2ecf20Sopenharmony_ci	if (ctrlpriv->era < 3)
12198c2ecf20Sopenharmony_ci		append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen);
12208c2ecf20Sopenharmony_ci	else
12218c2ecf20Sopenharmony_ci		append_math_add_imm_u32(desc, DPOVRD, ZERO, IMM, req->assoclen);
12228c2ecf20Sopenharmony_ci
12238c2ecf20Sopenharmony_ci	if (ivsize && ((is_rfc3686 && encrypt) || !alg->caam.geniv))
12248c2ecf20Sopenharmony_ci		append_load_as_imm(desc, req->iv, ivsize,
12258c2ecf20Sopenharmony_ci				   LDST_CLASS_1_CCB |
12268c2ecf20Sopenharmony_ci				   LDST_SRCDST_BYTE_CONTEXT |
12278c2ecf20Sopenharmony_ci				   (ivoffset << LDST_OFFSET_SHIFT));
12288c2ecf20Sopenharmony_ci}
12298c2ecf20Sopenharmony_ci
12308c2ecf20Sopenharmony_ci/*
12318c2ecf20Sopenharmony_ci * Fill in skcipher job descriptor
12328c2ecf20Sopenharmony_ci */
12338c2ecf20Sopenharmony_cistatic void init_skcipher_job(struct skcipher_request *req,
12348c2ecf20Sopenharmony_ci			      struct skcipher_edesc *edesc,
12358c2ecf20Sopenharmony_ci			      const bool encrypt)
12368c2ecf20Sopenharmony_ci{
12378c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
12388c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
12398c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
12408c2ecf20Sopenharmony_ci	int ivsize = crypto_skcipher_ivsize(skcipher);
12418c2ecf20Sopenharmony_ci	u32 *desc = edesc->hw_desc;
12428c2ecf20Sopenharmony_ci	u32 *sh_desc;
12438c2ecf20Sopenharmony_ci	u32 in_options = 0, out_options = 0;
12448c2ecf20Sopenharmony_ci	dma_addr_t src_dma, dst_dma, ptr;
12458c2ecf20Sopenharmony_ci	int len, sec4_sg_index = 0;
12468c2ecf20Sopenharmony_ci
12478c2ecf20Sopenharmony_ci	print_hex_dump_debug("presciv@"__stringify(__LINE__)": ",
12488c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, req->iv, ivsize, 1);
12498c2ecf20Sopenharmony_ci	dev_dbg(jrdev, "asked=%d, cryptlen%d\n",
12508c2ecf20Sopenharmony_ci	       (int)edesc->src_nents > 1 ? 100 : req->cryptlen, req->cryptlen);
12518c2ecf20Sopenharmony_ci
12528c2ecf20Sopenharmony_ci	caam_dump_sg("src    @" __stringify(__LINE__)": ",
12538c2ecf20Sopenharmony_ci		     DUMP_PREFIX_ADDRESS, 16, 4, req->src,
12548c2ecf20Sopenharmony_ci		     edesc->src_nents > 1 ? 100 : req->cryptlen, 1);
12558c2ecf20Sopenharmony_ci
12568c2ecf20Sopenharmony_ci	sh_desc = encrypt ? ctx->sh_desc_enc : ctx->sh_desc_dec;
12578c2ecf20Sopenharmony_ci	ptr = encrypt ? ctx->sh_desc_enc_dma : ctx->sh_desc_dec_dma;
12588c2ecf20Sopenharmony_ci
12598c2ecf20Sopenharmony_ci	len = desc_len(sh_desc);
12608c2ecf20Sopenharmony_ci	init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE);
12618c2ecf20Sopenharmony_ci
12628c2ecf20Sopenharmony_ci	if (ivsize || edesc->mapped_src_nents > 1) {
12638c2ecf20Sopenharmony_ci		src_dma = edesc->sec4_sg_dma;
12648c2ecf20Sopenharmony_ci		sec4_sg_index = edesc->mapped_src_nents + !!ivsize;
12658c2ecf20Sopenharmony_ci		in_options = LDST_SGF;
12668c2ecf20Sopenharmony_ci	} else {
12678c2ecf20Sopenharmony_ci		src_dma = sg_dma_address(req->src);
12688c2ecf20Sopenharmony_ci	}
12698c2ecf20Sopenharmony_ci
12708c2ecf20Sopenharmony_ci	append_seq_in_ptr(desc, src_dma, req->cryptlen + ivsize, in_options);
12718c2ecf20Sopenharmony_ci
12728c2ecf20Sopenharmony_ci	if (likely(req->src == req->dst)) {
12738c2ecf20Sopenharmony_ci		dst_dma = src_dma + !!ivsize * sizeof(struct sec4_sg_entry);
12748c2ecf20Sopenharmony_ci		out_options = in_options;
12758c2ecf20Sopenharmony_ci	} else if (!ivsize && edesc->mapped_dst_nents == 1) {
12768c2ecf20Sopenharmony_ci		dst_dma = sg_dma_address(req->dst);
12778c2ecf20Sopenharmony_ci	} else {
12788c2ecf20Sopenharmony_ci		dst_dma = edesc->sec4_sg_dma + sec4_sg_index *
12798c2ecf20Sopenharmony_ci			  sizeof(struct sec4_sg_entry);
12808c2ecf20Sopenharmony_ci		out_options = LDST_SGF;
12818c2ecf20Sopenharmony_ci	}
12828c2ecf20Sopenharmony_ci
12838c2ecf20Sopenharmony_ci	append_seq_out_ptr(desc, dst_dma, req->cryptlen + ivsize, out_options);
12848c2ecf20Sopenharmony_ci}
12858c2ecf20Sopenharmony_ci
12868c2ecf20Sopenharmony_ci/*
12878c2ecf20Sopenharmony_ci * allocate and map the aead extended descriptor
12888c2ecf20Sopenharmony_ci */
12898c2ecf20Sopenharmony_cistatic struct aead_edesc *aead_edesc_alloc(struct aead_request *req,
12908c2ecf20Sopenharmony_ci					   int desc_bytes, bool *all_contig_ptr,
12918c2ecf20Sopenharmony_ci					   bool encrypt)
12928c2ecf20Sopenharmony_ci{
12938c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
12948c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
12958c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
12968c2ecf20Sopenharmony_ci	struct caam_aead_req_ctx *rctx = aead_request_ctx(req);
12978c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
12988c2ecf20Sopenharmony_ci		       GFP_KERNEL : GFP_ATOMIC;
12998c2ecf20Sopenharmony_ci	int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0;
13008c2ecf20Sopenharmony_ci	int src_len, dst_len = 0;
13018c2ecf20Sopenharmony_ci	struct aead_edesc *edesc;
13028c2ecf20Sopenharmony_ci	int sec4_sg_index, sec4_sg_len, sec4_sg_bytes;
13038c2ecf20Sopenharmony_ci	unsigned int authsize = ctx->authsize;
13048c2ecf20Sopenharmony_ci
13058c2ecf20Sopenharmony_ci	if (unlikely(req->dst != req->src)) {
13068c2ecf20Sopenharmony_ci		src_len = req->assoclen + req->cryptlen;
13078c2ecf20Sopenharmony_ci		dst_len = src_len + (encrypt ? authsize : (-authsize));
13088c2ecf20Sopenharmony_ci
13098c2ecf20Sopenharmony_ci		src_nents = sg_nents_for_len(req->src, src_len);
13108c2ecf20Sopenharmony_ci		if (unlikely(src_nents < 0)) {
13118c2ecf20Sopenharmony_ci			dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n",
13128c2ecf20Sopenharmony_ci				src_len);
13138c2ecf20Sopenharmony_ci			return ERR_PTR(src_nents);
13148c2ecf20Sopenharmony_ci		}
13158c2ecf20Sopenharmony_ci
13168c2ecf20Sopenharmony_ci		dst_nents = sg_nents_for_len(req->dst, dst_len);
13178c2ecf20Sopenharmony_ci		if (unlikely(dst_nents < 0)) {
13188c2ecf20Sopenharmony_ci			dev_err(jrdev, "Insufficient bytes (%d) in dst S/G\n",
13198c2ecf20Sopenharmony_ci				dst_len);
13208c2ecf20Sopenharmony_ci			return ERR_PTR(dst_nents);
13218c2ecf20Sopenharmony_ci		}
13228c2ecf20Sopenharmony_ci	} else {
13238c2ecf20Sopenharmony_ci		src_len = req->assoclen + req->cryptlen +
13248c2ecf20Sopenharmony_ci			  (encrypt ? authsize : 0);
13258c2ecf20Sopenharmony_ci
13268c2ecf20Sopenharmony_ci		src_nents = sg_nents_for_len(req->src, src_len);
13278c2ecf20Sopenharmony_ci		if (unlikely(src_nents < 0)) {
13288c2ecf20Sopenharmony_ci			dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n",
13298c2ecf20Sopenharmony_ci				src_len);
13308c2ecf20Sopenharmony_ci			return ERR_PTR(src_nents);
13318c2ecf20Sopenharmony_ci		}
13328c2ecf20Sopenharmony_ci	}
13338c2ecf20Sopenharmony_ci
13348c2ecf20Sopenharmony_ci	if (likely(req->src == req->dst)) {
13358c2ecf20Sopenharmony_ci		mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents,
13368c2ecf20Sopenharmony_ci					      DMA_BIDIRECTIONAL);
13378c2ecf20Sopenharmony_ci		if (unlikely(!mapped_src_nents)) {
13388c2ecf20Sopenharmony_ci			dev_err(jrdev, "unable to map source\n");
13398c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
13408c2ecf20Sopenharmony_ci		}
13418c2ecf20Sopenharmony_ci	} else {
13428c2ecf20Sopenharmony_ci		/* Cover also the case of null (zero length) input data */
13438c2ecf20Sopenharmony_ci		if (src_nents) {
13448c2ecf20Sopenharmony_ci			mapped_src_nents = dma_map_sg(jrdev, req->src,
13458c2ecf20Sopenharmony_ci						      src_nents, DMA_TO_DEVICE);
13468c2ecf20Sopenharmony_ci			if (unlikely(!mapped_src_nents)) {
13478c2ecf20Sopenharmony_ci				dev_err(jrdev, "unable to map source\n");
13488c2ecf20Sopenharmony_ci				return ERR_PTR(-ENOMEM);
13498c2ecf20Sopenharmony_ci			}
13508c2ecf20Sopenharmony_ci		} else {
13518c2ecf20Sopenharmony_ci			mapped_src_nents = 0;
13528c2ecf20Sopenharmony_ci		}
13538c2ecf20Sopenharmony_ci
13548c2ecf20Sopenharmony_ci		/* Cover also the case of null (zero length) output data */
13558c2ecf20Sopenharmony_ci		if (dst_nents) {
13568c2ecf20Sopenharmony_ci			mapped_dst_nents = dma_map_sg(jrdev, req->dst,
13578c2ecf20Sopenharmony_ci						      dst_nents,
13588c2ecf20Sopenharmony_ci						      DMA_FROM_DEVICE);
13598c2ecf20Sopenharmony_ci			if (unlikely(!mapped_dst_nents)) {
13608c2ecf20Sopenharmony_ci				dev_err(jrdev, "unable to map destination\n");
13618c2ecf20Sopenharmony_ci				dma_unmap_sg(jrdev, req->src, src_nents,
13628c2ecf20Sopenharmony_ci					     DMA_TO_DEVICE);
13638c2ecf20Sopenharmony_ci				return ERR_PTR(-ENOMEM);
13648c2ecf20Sopenharmony_ci			}
13658c2ecf20Sopenharmony_ci		} else {
13668c2ecf20Sopenharmony_ci			mapped_dst_nents = 0;
13678c2ecf20Sopenharmony_ci		}
13688c2ecf20Sopenharmony_ci	}
13698c2ecf20Sopenharmony_ci
13708c2ecf20Sopenharmony_ci	/*
13718c2ecf20Sopenharmony_ci	 * HW reads 4 S/G entries at a time; make sure the reads don't go beyond
13728c2ecf20Sopenharmony_ci	 * the end of the table by allocating more S/G entries.
13738c2ecf20Sopenharmony_ci	 */
13748c2ecf20Sopenharmony_ci	sec4_sg_len = mapped_src_nents > 1 ? mapped_src_nents : 0;
13758c2ecf20Sopenharmony_ci	if (mapped_dst_nents > 1)
13768c2ecf20Sopenharmony_ci		sec4_sg_len += pad_sg_nents(mapped_dst_nents);
13778c2ecf20Sopenharmony_ci	else
13788c2ecf20Sopenharmony_ci		sec4_sg_len = pad_sg_nents(sec4_sg_len);
13798c2ecf20Sopenharmony_ci
13808c2ecf20Sopenharmony_ci	sec4_sg_bytes = sec4_sg_len * sizeof(struct sec4_sg_entry);
13818c2ecf20Sopenharmony_ci
13828c2ecf20Sopenharmony_ci	/* allocate space for base edesc and hw desc commands, link tables */
13838c2ecf20Sopenharmony_ci	edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes,
13848c2ecf20Sopenharmony_ci			GFP_DMA | flags);
13858c2ecf20Sopenharmony_ci	if (!edesc) {
13868c2ecf20Sopenharmony_ci		caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0,
13878c2ecf20Sopenharmony_ci			   0, 0, 0);
13888c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
13898c2ecf20Sopenharmony_ci	}
13908c2ecf20Sopenharmony_ci
13918c2ecf20Sopenharmony_ci	edesc->src_nents = src_nents;
13928c2ecf20Sopenharmony_ci	edesc->dst_nents = dst_nents;
13938c2ecf20Sopenharmony_ci	edesc->mapped_src_nents = mapped_src_nents;
13948c2ecf20Sopenharmony_ci	edesc->mapped_dst_nents = mapped_dst_nents;
13958c2ecf20Sopenharmony_ci	edesc->sec4_sg = (void *)edesc + sizeof(struct aead_edesc) +
13968c2ecf20Sopenharmony_ci			 desc_bytes;
13978c2ecf20Sopenharmony_ci
13988c2ecf20Sopenharmony_ci	rctx->edesc = edesc;
13998c2ecf20Sopenharmony_ci
14008c2ecf20Sopenharmony_ci	*all_contig_ptr = !(mapped_src_nents > 1);
14018c2ecf20Sopenharmony_ci
14028c2ecf20Sopenharmony_ci	sec4_sg_index = 0;
14038c2ecf20Sopenharmony_ci	if (mapped_src_nents > 1) {
14048c2ecf20Sopenharmony_ci		sg_to_sec4_sg_last(req->src, src_len,
14058c2ecf20Sopenharmony_ci				   edesc->sec4_sg + sec4_sg_index, 0);
14068c2ecf20Sopenharmony_ci		sec4_sg_index += mapped_src_nents;
14078c2ecf20Sopenharmony_ci	}
14088c2ecf20Sopenharmony_ci	if (mapped_dst_nents > 1) {
14098c2ecf20Sopenharmony_ci		sg_to_sec4_sg_last(req->dst, dst_len,
14108c2ecf20Sopenharmony_ci				   edesc->sec4_sg + sec4_sg_index, 0);
14118c2ecf20Sopenharmony_ci	}
14128c2ecf20Sopenharmony_ci
14138c2ecf20Sopenharmony_ci	if (!sec4_sg_bytes)
14148c2ecf20Sopenharmony_ci		return edesc;
14158c2ecf20Sopenharmony_ci
14168c2ecf20Sopenharmony_ci	edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
14178c2ecf20Sopenharmony_ci					    sec4_sg_bytes, DMA_TO_DEVICE);
14188c2ecf20Sopenharmony_ci	if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) {
14198c2ecf20Sopenharmony_ci		dev_err(jrdev, "unable to map S/G table\n");
14208c2ecf20Sopenharmony_ci		aead_unmap(jrdev, edesc, req);
14218c2ecf20Sopenharmony_ci		kfree(edesc);
14228c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
14238c2ecf20Sopenharmony_ci	}
14248c2ecf20Sopenharmony_ci
14258c2ecf20Sopenharmony_ci	edesc->sec4_sg_bytes = sec4_sg_bytes;
14268c2ecf20Sopenharmony_ci
14278c2ecf20Sopenharmony_ci	return edesc;
14288c2ecf20Sopenharmony_ci}
14298c2ecf20Sopenharmony_ci
14308c2ecf20Sopenharmony_cistatic int aead_enqueue_req(struct device *jrdev, struct aead_request *req)
14318c2ecf20Sopenharmony_ci{
14328c2ecf20Sopenharmony_ci	struct caam_drv_private_jr *jrpriv = dev_get_drvdata(jrdev);
14338c2ecf20Sopenharmony_ci	struct caam_aead_req_ctx *rctx = aead_request_ctx(req);
14348c2ecf20Sopenharmony_ci	struct aead_edesc *edesc = rctx->edesc;
14358c2ecf20Sopenharmony_ci	u32 *desc = edesc->hw_desc;
14368c2ecf20Sopenharmony_ci	int ret;
14378c2ecf20Sopenharmony_ci
14388c2ecf20Sopenharmony_ci	/*
14398c2ecf20Sopenharmony_ci	 * Only the backlog request are sent to crypto-engine since the others
14408c2ecf20Sopenharmony_ci	 * can be handled by CAAM, if free, especially since JR has up to 1024
14418c2ecf20Sopenharmony_ci	 * entries (more than the 10 entries from crypto-engine).
14428c2ecf20Sopenharmony_ci	 */
14438c2ecf20Sopenharmony_ci	if (req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)
14448c2ecf20Sopenharmony_ci		ret = crypto_transfer_aead_request_to_engine(jrpriv->engine,
14458c2ecf20Sopenharmony_ci							     req);
14468c2ecf20Sopenharmony_ci	else
14478c2ecf20Sopenharmony_ci		ret = caam_jr_enqueue(jrdev, desc, aead_crypt_done, req);
14488c2ecf20Sopenharmony_ci
14498c2ecf20Sopenharmony_ci	if ((ret != -EINPROGRESS) && (ret != -EBUSY)) {
14508c2ecf20Sopenharmony_ci		aead_unmap(jrdev, edesc, req);
14518c2ecf20Sopenharmony_ci		kfree(rctx->edesc);
14528c2ecf20Sopenharmony_ci	}
14538c2ecf20Sopenharmony_ci
14548c2ecf20Sopenharmony_ci	return ret;
14558c2ecf20Sopenharmony_ci}
14568c2ecf20Sopenharmony_ci
14578c2ecf20Sopenharmony_cistatic inline int chachapoly_crypt(struct aead_request *req, bool encrypt)
14588c2ecf20Sopenharmony_ci{
14598c2ecf20Sopenharmony_ci	struct aead_edesc *edesc;
14608c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
14618c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
14628c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
14638c2ecf20Sopenharmony_ci	bool all_contig;
14648c2ecf20Sopenharmony_ci	u32 *desc;
14658c2ecf20Sopenharmony_ci
14668c2ecf20Sopenharmony_ci	edesc = aead_edesc_alloc(req, CHACHAPOLY_DESC_JOB_IO_LEN, &all_contig,
14678c2ecf20Sopenharmony_ci				 encrypt);
14688c2ecf20Sopenharmony_ci	if (IS_ERR(edesc))
14698c2ecf20Sopenharmony_ci		return PTR_ERR(edesc);
14708c2ecf20Sopenharmony_ci
14718c2ecf20Sopenharmony_ci	desc = edesc->hw_desc;
14728c2ecf20Sopenharmony_ci
14738c2ecf20Sopenharmony_ci	init_chachapoly_job(req, edesc, all_contig, encrypt);
14748c2ecf20Sopenharmony_ci	print_hex_dump_debug("chachapoly jobdesc@" __stringify(__LINE__)": ",
14758c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
14768c2ecf20Sopenharmony_ci			     1);
14778c2ecf20Sopenharmony_ci
14788c2ecf20Sopenharmony_ci	return aead_enqueue_req(jrdev, req);
14798c2ecf20Sopenharmony_ci}
14808c2ecf20Sopenharmony_ci
14818c2ecf20Sopenharmony_cistatic int chachapoly_encrypt(struct aead_request *req)
14828c2ecf20Sopenharmony_ci{
14838c2ecf20Sopenharmony_ci	return chachapoly_crypt(req, true);
14848c2ecf20Sopenharmony_ci}
14858c2ecf20Sopenharmony_ci
14868c2ecf20Sopenharmony_cistatic int chachapoly_decrypt(struct aead_request *req)
14878c2ecf20Sopenharmony_ci{
14888c2ecf20Sopenharmony_ci	return chachapoly_crypt(req, false);
14898c2ecf20Sopenharmony_ci}
14908c2ecf20Sopenharmony_ci
14918c2ecf20Sopenharmony_cistatic inline int aead_crypt(struct aead_request *req, bool encrypt)
14928c2ecf20Sopenharmony_ci{
14938c2ecf20Sopenharmony_ci	struct aead_edesc *edesc;
14948c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
14958c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
14968c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
14978c2ecf20Sopenharmony_ci	bool all_contig;
14988c2ecf20Sopenharmony_ci
14998c2ecf20Sopenharmony_ci	/* allocate extended descriptor */
15008c2ecf20Sopenharmony_ci	edesc = aead_edesc_alloc(req, AUTHENC_DESC_JOB_IO_LEN,
15018c2ecf20Sopenharmony_ci				 &all_contig, encrypt);
15028c2ecf20Sopenharmony_ci	if (IS_ERR(edesc))
15038c2ecf20Sopenharmony_ci		return PTR_ERR(edesc);
15048c2ecf20Sopenharmony_ci
15058c2ecf20Sopenharmony_ci	/* Create and submit job descriptor */
15068c2ecf20Sopenharmony_ci	init_authenc_job(req, edesc, all_contig, encrypt);
15078c2ecf20Sopenharmony_ci
15088c2ecf20Sopenharmony_ci	print_hex_dump_debug("aead jobdesc@"__stringify(__LINE__)": ",
15098c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
15108c2ecf20Sopenharmony_ci			     desc_bytes(edesc->hw_desc), 1);
15118c2ecf20Sopenharmony_ci
15128c2ecf20Sopenharmony_ci	return aead_enqueue_req(jrdev, req);
15138c2ecf20Sopenharmony_ci}
15148c2ecf20Sopenharmony_ci
15158c2ecf20Sopenharmony_cistatic int aead_encrypt(struct aead_request *req)
15168c2ecf20Sopenharmony_ci{
15178c2ecf20Sopenharmony_ci	return aead_crypt(req, true);
15188c2ecf20Sopenharmony_ci}
15198c2ecf20Sopenharmony_ci
15208c2ecf20Sopenharmony_cistatic int aead_decrypt(struct aead_request *req)
15218c2ecf20Sopenharmony_ci{
15228c2ecf20Sopenharmony_ci	return aead_crypt(req, false);
15238c2ecf20Sopenharmony_ci}
15248c2ecf20Sopenharmony_ci
15258c2ecf20Sopenharmony_cistatic int aead_do_one_req(struct crypto_engine *engine, void *areq)
15268c2ecf20Sopenharmony_ci{
15278c2ecf20Sopenharmony_ci	struct aead_request *req = aead_request_cast(areq);
15288c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(crypto_aead_reqtfm(req));
15298c2ecf20Sopenharmony_ci	struct caam_aead_req_ctx *rctx = aead_request_ctx(req);
15308c2ecf20Sopenharmony_ci	u32 *desc = rctx->edesc->hw_desc;
15318c2ecf20Sopenharmony_ci	int ret;
15328c2ecf20Sopenharmony_ci
15338c2ecf20Sopenharmony_ci	rctx->edesc->bklog = true;
15348c2ecf20Sopenharmony_ci
15358c2ecf20Sopenharmony_ci	ret = caam_jr_enqueue(ctx->jrdev, desc, aead_crypt_done, req);
15368c2ecf20Sopenharmony_ci
15378c2ecf20Sopenharmony_ci	if (ret != -EINPROGRESS) {
15388c2ecf20Sopenharmony_ci		aead_unmap(ctx->jrdev, rctx->edesc, req);
15398c2ecf20Sopenharmony_ci		kfree(rctx->edesc);
15408c2ecf20Sopenharmony_ci	} else {
15418c2ecf20Sopenharmony_ci		ret = 0;
15428c2ecf20Sopenharmony_ci	}
15438c2ecf20Sopenharmony_ci
15448c2ecf20Sopenharmony_ci	return ret;
15458c2ecf20Sopenharmony_ci}
15468c2ecf20Sopenharmony_ci
15478c2ecf20Sopenharmony_cistatic inline int gcm_crypt(struct aead_request *req, bool encrypt)
15488c2ecf20Sopenharmony_ci{
15498c2ecf20Sopenharmony_ci	struct aead_edesc *edesc;
15508c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
15518c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
15528c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
15538c2ecf20Sopenharmony_ci	bool all_contig;
15548c2ecf20Sopenharmony_ci
15558c2ecf20Sopenharmony_ci	/* allocate extended descriptor */
15568c2ecf20Sopenharmony_ci	edesc = aead_edesc_alloc(req, GCM_DESC_JOB_IO_LEN, &all_contig,
15578c2ecf20Sopenharmony_ci				 encrypt);
15588c2ecf20Sopenharmony_ci	if (IS_ERR(edesc))
15598c2ecf20Sopenharmony_ci		return PTR_ERR(edesc);
15608c2ecf20Sopenharmony_ci
15618c2ecf20Sopenharmony_ci	/* Create and submit job descriptor */
15628c2ecf20Sopenharmony_ci	init_gcm_job(req, edesc, all_contig, encrypt);
15638c2ecf20Sopenharmony_ci
15648c2ecf20Sopenharmony_ci	print_hex_dump_debug("aead jobdesc@"__stringify(__LINE__)": ",
15658c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
15668c2ecf20Sopenharmony_ci			     desc_bytes(edesc->hw_desc), 1);
15678c2ecf20Sopenharmony_ci
15688c2ecf20Sopenharmony_ci	return aead_enqueue_req(jrdev, req);
15698c2ecf20Sopenharmony_ci}
15708c2ecf20Sopenharmony_ci
15718c2ecf20Sopenharmony_cistatic int gcm_encrypt(struct aead_request *req)
15728c2ecf20Sopenharmony_ci{
15738c2ecf20Sopenharmony_ci	return gcm_crypt(req, true);
15748c2ecf20Sopenharmony_ci}
15758c2ecf20Sopenharmony_ci
15768c2ecf20Sopenharmony_cistatic int gcm_decrypt(struct aead_request *req)
15778c2ecf20Sopenharmony_ci{
15788c2ecf20Sopenharmony_ci	return gcm_crypt(req, false);
15798c2ecf20Sopenharmony_ci}
15808c2ecf20Sopenharmony_ci
15818c2ecf20Sopenharmony_cistatic int ipsec_gcm_encrypt(struct aead_request *req)
15828c2ecf20Sopenharmony_ci{
15838c2ecf20Sopenharmony_ci	return crypto_ipsec_check_assoclen(req->assoclen) ? : gcm_encrypt(req);
15848c2ecf20Sopenharmony_ci}
15858c2ecf20Sopenharmony_ci
15868c2ecf20Sopenharmony_cistatic int ipsec_gcm_decrypt(struct aead_request *req)
15878c2ecf20Sopenharmony_ci{
15888c2ecf20Sopenharmony_ci	return crypto_ipsec_check_assoclen(req->assoclen) ? : gcm_decrypt(req);
15898c2ecf20Sopenharmony_ci}
15908c2ecf20Sopenharmony_ci
15918c2ecf20Sopenharmony_ci/*
15928c2ecf20Sopenharmony_ci * allocate and map the skcipher extended descriptor for skcipher
15938c2ecf20Sopenharmony_ci */
15948c2ecf20Sopenharmony_cistatic struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
15958c2ecf20Sopenharmony_ci						   int desc_bytes)
15968c2ecf20Sopenharmony_ci{
15978c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
15988c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
15998c2ecf20Sopenharmony_ci	struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req);
16008c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
16018c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
16028c2ecf20Sopenharmony_ci		       GFP_KERNEL : GFP_ATOMIC;
16038c2ecf20Sopenharmony_ci	int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0;
16048c2ecf20Sopenharmony_ci	struct skcipher_edesc *edesc;
16058c2ecf20Sopenharmony_ci	dma_addr_t iv_dma = 0;
16068c2ecf20Sopenharmony_ci	u8 *iv;
16078c2ecf20Sopenharmony_ci	int ivsize = crypto_skcipher_ivsize(skcipher);
16088c2ecf20Sopenharmony_ci	int dst_sg_idx, sec4_sg_ents, sec4_sg_bytes;
16098c2ecf20Sopenharmony_ci
16108c2ecf20Sopenharmony_ci	src_nents = sg_nents_for_len(req->src, req->cryptlen);
16118c2ecf20Sopenharmony_ci	if (unlikely(src_nents < 0)) {
16128c2ecf20Sopenharmony_ci		dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n",
16138c2ecf20Sopenharmony_ci			req->cryptlen);
16148c2ecf20Sopenharmony_ci		return ERR_PTR(src_nents);
16158c2ecf20Sopenharmony_ci	}
16168c2ecf20Sopenharmony_ci
16178c2ecf20Sopenharmony_ci	if (req->dst != req->src) {
16188c2ecf20Sopenharmony_ci		dst_nents = sg_nents_for_len(req->dst, req->cryptlen);
16198c2ecf20Sopenharmony_ci		if (unlikely(dst_nents < 0)) {
16208c2ecf20Sopenharmony_ci			dev_err(jrdev, "Insufficient bytes (%d) in dst S/G\n",
16218c2ecf20Sopenharmony_ci				req->cryptlen);
16228c2ecf20Sopenharmony_ci			return ERR_PTR(dst_nents);
16238c2ecf20Sopenharmony_ci		}
16248c2ecf20Sopenharmony_ci	}
16258c2ecf20Sopenharmony_ci
16268c2ecf20Sopenharmony_ci	if (likely(req->src == req->dst)) {
16278c2ecf20Sopenharmony_ci		mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents,
16288c2ecf20Sopenharmony_ci					      DMA_BIDIRECTIONAL);
16298c2ecf20Sopenharmony_ci		if (unlikely(!mapped_src_nents)) {
16308c2ecf20Sopenharmony_ci			dev_err(jrdev, "unable to map source\n");
16318c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
16328c2ecf20Sopenharmony_ci		}
16338c2ecf20Sopenharmony_ci	} else {
16348c2ecf20Sopenharmony_ci		mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents,
16358c2ecf20Sopenharmony_ci					      DMA_TO_DEVICE);
16368c2ecf20Sopenharmony_ci		if (unlikely(!mapped_src_nents)) {
16378c2ecf20Sopenharmony_ci			dev_err(jrdev, "unable to map source\n");
16388c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
16398c2ecf20Sopenharmony_ci		}
16408c2ecf20Sopenharmony_ci		mapped_dst_nents = dma_map_sg(jrdev, req->dst, dst_nents,
16418c2ecf20Sopenharmony_ci					      DMA_FROM_DEVICE);
16428c2ecf20Sopenharmony_ci		if (unlikely(!mapped_dst_nents)) {
16438c2ecf20Sopenharmony_ci			dev_err(jrdev, "unable to map destination\n");
16448c2ecf20Sopenharmony_ci			dma_unmap_sg(jrdev, req->src, src_nents, DMA_TO_DEVICE);
16458c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
16468c2ecf20Sopenharmony_ci		}
16478c2ecf20Sopenharmony_ci	}
16488c2ecf20Sopenharmony_ci
16498c2ecf20Sopenharmony_ci	if (!ivsize && mapped_src_nents == 1)
16508c2ecf20Sopenharmony_ci		sec4_sg_ents = 0; // no need for an input hw s/g table
16518c2ecf20Sopenharmony_ci	else
16528c2ecf20Sopenharmony_ci		sec4_sg_ents = mapped_src_nents + !!ivsize;
16538c2ecf20Sopenharmony_ci	dst_sg_idx = sec4_sg_ents;
16548c2ecf20Sopenharmony_ci
16558c2ecf20Sopenharmony_ci	/*
16568c2ecf20Sopenharmony_ci	 * Input, output HW S/G tables: [IV, src][dst, IV]
16578c2ecf20Sopenharmony_ci	 * IV entries point to the same buffer
16588c2ecf20Sopenharmony_ci	 * If src == dst, S/G entries are reused (S/G tables overlap)
16598c2ecf20Sopenharmony_ci	 *
16608c2ecf20Sopenharmony_ci	 * HW reads 4 S/G entries at a time; make sure the reads don't go beyond
16618c2ecf20Sopenharmony_ci	 * the end of the table by allocating more S/G entries. Logic:
16628c2ecf20Sopenharmony_ci	 * if (output S/G)
16638c2ecf20Sopenharmony_ci	 *      pad output S/G, if needed
16648c2ecf20Sopenharmony_ci	 * else if (input S/G) ...
16658c2ecf20Sopenharmony_ci	 *      pad input S/G, if needed
16668c2ecf20Sopenharmony_ci	 */
16678c2ecf20Sopenharmony_ci	if (ivsize || mapped_dst_nents > 1) {
16688c2ecf20Sopenharmony_ci		if (req->src == req->dst)
16698c2ecf20Sopenharmony_ci			sec4_sg_ents = !!ivsize + pad_sg_nents(sec4_sg_ents);
16708c2ecf20Sopenharmony_ci		else
16718c2ecf20Sopenharmony_ci			sec4_sg_ents += pad_sg_nents(mapped_dst_nents +
16728c2ecf20Sopenharmony_ci						     !!ivsize);
16738c2ecf20Sopenharmony_ci	} else {
16748c2ecf20Sopenharmony_ci		sec4_sg_ents = pad_sg_nents(sec4_sg_ents);
16758c2ecf20Sopenharmony_ci	}
16768c2ecf20Sopenharmony_ci
16778c2ecf20Sopenharmony_ci	sec4_sg_bytes = sec4_sg_ents * sizeof(struct sec4_sg_entry);
16788c2ecf20Sopenharmony_ci
16798c2ecf20Sopenharmony_ci	/*
16808c2ecf20Sopenharmony_ci	 * allocate space for base edesc and hw desc commands, link tables, IV
16818c2ecf20Sopenharmony_ci	 */
16828c2ecf20Sopenharmony_ci	edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes + ivsize,
16838c2ecf20Sopenharmony_ci			GFP_DMA | flags);
16848c2ecf20Sopenharmony_ci	if (!edesc) {
16858c2ecf20Sopenharmony_ci		dev_err(jrdev, "could not allocate extended descriptor\n");
16868c2ecf20Sopenharmony_ci		caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0,
16878c2ecf20Sopenharmony_ci			   0, 0, 0);
16888c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
16898c2ecf20Sopenharmony_ci	}
16908c2ecf20Sopenharmony_ci
16918c2ecf20Sopenharmony_ci	edesc->src_nents = src_nents;
16928c2ecf20Sopenharmony_ci	edesc->dst_nents = dst_nents;
16938c2ecf20Sopenharmony_ci	edesc->mapped_src_nents = mapped_src_nents;
16948c2ecf20Sopenharmony_ci	edesc->mapped_dst_nents = mapped_dst_nents;
16958c2ecf20Sopenharmony_ci	edesc->sec4_sg_bytes = sec4_sg_bytes;
16968c2ecf20Sopenharmony_ci	edesc->sec4_sg = (struct sec4_sg_entry *)((u8 *)edesc->hw_desc +
16978c2ecf20Sopenharmony_ci						  desc_bytes);
16988c2ecf20Sopenharmony_ci	rctx->edesc = edesc;
16998c2ecf20Sopenharmony_ci
17008c2ecf20Sopenharmony_ci	/* Make sure IV is located in a DMAable area */
17018c2ecf20Sopenharmony_ci	if (ivsize) {
17028c2ecf20Sopenharmony_ci		iv = (u8 *)edesc->sec4_sg + sec4_sg_bytes;
17038c2ecf20Sopenharmony_ci		memcpy(iv, req->iv, ivsize);
17048c2ecf20Sopenharmony_ci
17058c2ecf20Sopenharmony_ci		iv_dma = dma_map_single(jrdev, iv, ivsize, DMA_BIDIRECTIONAL);
17068c2ecf20Sopenharmony_ci		if (dma_mapping_error(jrdev, iv_dma)) {
17078c2ecf20Sopenharmony_ci			dev_err(jrdev, "unable to map IV\n");
17088c2ecf20Sopenharmony_ci			caam_unmap(jrdev, req->src, req->dst, src_nents,
17098c2ecf20Sopenharmony_ci				   dst_nents, 0, 0, 0, 0);
17108c2ecf20Sopenharmony_ci			kfree(edesc);
17118c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
17128c2ecf20Sopenharmony_ci		}
17138c2ecf20Sopenharmony_ci
17148c2ecf20Sopenharmony_ci		dma_to_sec4_sg_one(edesc->sec4_sg, iv_dma, ivsize, 0);
17158c2ecf20Sopenharmony_ci	}
17168c2ecf20Sopenharmony_ci	if (dst_sg_idx)
17178c2ecf20Sopenharmony_ci		sg_to_sec4_sg(req->src, req->cryptlen, edesc->sec4_sg +
17188c2ecf20Sopenharmony_ci			      !!ivsize, 0);
17198c2ecf20Sopenharmony_ci
17208c2ecf20Sopenharmony_ci	if (req->src != req->dst && (ivsize || mapped_dst_nents > 1))
17218c2ecf20Sopenharmony_ci		sg_to_sec4_sg(req->dst, req->cryptlen, edesc->sec4_sg +
17228c2ecf20Sopenharmony_ci			      dst_sg_idx, 0);
17238c2ecf20Sopenharmony_ci
17248c2ecf20Sopenharmony_ci	if (ivsize)
17258c2ecf20Sopenharmony_ci		dma_to_sec4_sg_one(edesc->sec4_sg + dst_sg_idx +
17268c2ecf20Sopenharmony_ci				   mapped_dst_nents, iv_dma, ivsize, 0);
17278c2ecf20Sopenharmony_ci
17288c2ecf20Sopenharmony_ci	if (ivsize || mapped_dst_nents > 1)
17298c2ecf20Sopenharmony_ci		sg_to_sec4_set_last(edesc->sec4_sg + dst_sg_idx +
17308c2ecf20Sopenharmony_ci				    mapped_dst_nents - 1 + !!ivsize);
17318c2ecf20Sopenharmony_ci
17328c2ecf20Sopenharmony_ci	if (sec4_sg_bytes) {
17338c2ecf20Sopenharmony_ci		edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
17348c2ecf20Sopenharmony_ci						    sec4_sg_bytes,
17358c2ecf20Sopenharmony_ci						    DMA_TO_DEVICE);
17368c2ecf20Sopenharmony_ci		if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) {
17378c2ecf20Sopenharmony_ci			dev_err(jrdev, "unable to map S/G table\n");
17388c2ecf20Sopenharmony_ci			caam_unmap(jrdev, req->src, req->dst, src_nents,
17398c2ecf20Sopenharmony_ci				   dst_nents, iv_dma, ivsize, 0, 0);
17408c2ecf20Sopenharmony_ci			kfree(edesc);
17418c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
17428c2ecf20Sopenharmony_ci		}
17438c2ecf20Sopenharmony_ci	}
17448c2ecf20Sopenharmony_ci
17458c2ecf20Sopenharmony_ci	edesc->iv_dma = iv_dma;
17468c2ecf20Sopenharmony_ci
17478c2ecf20Sopenharmony_ci	print_hex_dump_debug("skcipher sec4_sg@" __stringify(__LINE__)": ",
17488c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, edesc->sec4_sg,
17498c2ecf20Sopenharmony_ci			     sec4_sg_bytes, 1);
17508c2ecf20Sopenharmony_ci
17518c2ecf20Sopenharmony_ci	return edesc;
17528c2ecf20Sopenharmony_ci}
17538c2ecf20Sopenharmony_ci
17548c2ecf20Sopenharmony_cistatic int skcipher_do_one_req(struct crypto_engine *engine, void *areq)
17558c2ecf20Sopenharmony_ci{
17568c2ecf20Sopenharmony_ci	struct skcipher_request *req = skcipher_request_cast(areq);
17578c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req));
17588c2ecf20Sopenharmony_ci	struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req);
17598c2ecf20Sopenharmony_ci	u32 *desc = rctx->edesc->hw_desc;
17608c2ecf20Sopenharmony_ci	int ret;
17618c2ecf20Sopenharmony_ci
17628c2ecf20Sopenharmony_ci	rctx->edesc->bklog = true;
17638c2ecf20Sopenharmony_ci
17648c2ecf20Sopenharmony_ci	ret = caam_jr_enqueue(ctx->jrdev, desc, skcipher_crypt_done, req);
17658c2ecf20Sopenharmony_ci
17668c2ecf20Sopenharmony_ci	if (ret != -EINPROGRESS) {
17678c2ecf20Sopenharmony_ci		skcipher_unmap(ctx->jrdev, rctx->edesc, req);
17688c2ecf20Sopenharmony_ci		kfree(rctx->edesc);
17698c2ecf20Sopenharmony_ci	} else {
17708c2ecf20Sopenharmony_ci		ret = 0;
17718c2ecf20Sopenharmony_ci	}
17728c2ecf20Sopenharmony_ci
17738c2ecf20Sopenharmony_ci	return ret;
17748c2ecf20Sopenharmony_ci}
17758c2ecf20Sopenharmony_ci
17768c2ecf20Sopenharmony_cistatic inline bool xts_skcipher_ivsize(struct skcipher_request *req)
17778c2ecf20Sopenharmony_ci{
17788c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
17798c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_skcipher_ivsize(skcipher);
17808c2ecf20Sopenharmony_ci
17818c2ecf20Sopenharmony_ci	return !!get_unaligned((u64 *)(req->iv + (ivsize / 2)));
17828c2ecf20Sopenharmony_ci}
17838c2ecf20Sopenharmony_ci
17848c2ecf20Sopenharmony_cistatic inline int skcipher_crypt(struct skcipher_request *req, bool encrypt)
17858c2ecf20Sopenharmony_ci{
17868c2ecf20Sopenharmony_ci	struct skcipher_edesc *edesc;
17878c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
17888c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
17898c2ecf20Sopenharmony_ci	struct device *jrdev = ctx->jrdev;
17908c2ecf20Sopenharmony_ci	struct caam_drv_private_jr *jrpriv = dev_get_drvdata(jrdev);
17918c2ecf20Sopenharmony_ci	struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
17928c2ecf20Sopenharmony_ci	u32 *desc;
17938c2ecf20Sopenharmony_ci	int ret = 0;
17948c2ecf20Sopenharmony_ci
17958c2ecf20Sopenharmony_ci	/*
17968c2ecf20Sopenharmony_ci	 * XTS is expected to return an error even for input length = 0
17978c2ecf20Sopenharmony_ci	 * Note that the case input length < block size will be caught during
17988c2ecf20Sopenharmony_ci	 * HW offloading and return an error.
17998c2ecf20Sopenharmony_ci	 */
18008c2ecf20Sopenharmony_ci	if (!req->cryptlen && !ctx->fallback)
18018c2ecf20Sopenharmony_ci		return 0;
18028c2ecf20Sopenharmony_ci
18038c2ecf20Sopenharmony_ci	if (ctx->fallback && ((ctrlpriv->era <= 8 && xts_skcipher_ivsize(req)) ||
18048c2ecf20Sopenharmony_ci			      ctx->xts_key_fallback)) {
18058c2ecf20Sopenharmony_ci		struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req);
18068c2ecf20Sopenharmony_ci
18078c2ecf20Sopenharmony_ci		skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback);
18088c2ecf20Sopenharmony_ci		skcipher_request_set_callback(&rctx->fallback_req,
18098c2ecf20Sopenharmony_ci					      req->base.flags,
18108c2ecf20Sopenharmony_ci					      req->base.complete,
18118c2ecf20Sopenharmony_ci					      req->base.data);
18128c2ecf20Sopenharmony_ci		skcipher_request_set_crypt(&rctx->fallback_req, req->src,
18138c2ecf20Sopenharmony_ci					   req->dst, req->cryptlen, req->iv);
18148c2ecf20Sopenharmony_ci
18158c2ecf20Sopenharmony_ci		return encrypt ? crypto_skcipher_encrypt(&rctx->fallback_req) :
18168c2ecf20Sopenharmony_ci				 crypto_skcipher_decrypt(&rctx->fallback_req);
18178c2ecf20Sopenharmony_ci	}
18188c2ecf20Sopenharmony_ci
18198c2ecf20Sopenharmony_ci	/* allocate extended descriptor */
18208c2ecf20Sopenharmony_ci	edesc = skcipher_edesc_alloc(req, DESC_JOB_IO_LEN * CAAM_CMD_SZ);
18218c2ecf20Sopenharmony_ci	if (IS_ERR(edesc))
18228c2ecf20Sopenharmony_ci		return PTR_ERR(edesc);
18238c2ecf20Sopenharmony_ci
18248c2ecf20Sopenharmony_ci	/* Create and submit job descriptor*/
18258c2ecf20Sopenharmony_ci	init_skcipher_job(req, edesc, encrypt);
18268c2ecf20Sopenharmony_ci
18278c2ecf20Sopenharmony_ci	print_hex_dump_debug("skcipher jobdesc@" __stringify(__LINE__)": ",
18288c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
18298c2ecf20Sopenharmony_ci			     desc_bytes(edesc->hw_desc), 1);
18308c2ecf20Sopenharmony_ci
18318c2ecf20Sopenharmony_ci	desc = edesc->hw_desc;
18328c2ecf20Sopenharmony_ci	/*
18338c2ecf20Sopenharmony_ci	 * Only the backlog request are sent to crypto-engine since the others
18348c2ecf20Sopenharmony_ci	 * can be handled by CAAM, if free, especially since JR has up to 1024
18358c2ecf20Sopenharmony_ci	 * entries (more than the 10 entries from crypto-engine).
18368c2ecf20Sopenharmony_ci	 */
18378c2ecf20Sopenharmony_ci	if (req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)
18388c2ecf20Sopenharmony_ci		ret = crypto_transfer_skcipher_request_to_engine(jrpriv->engine,
18398c2ecf20Sopenharmony_ci								 req);
18408c2ecf20Sopenharmony_ci	else
18418c2ecf20Sopenharmony_ci		ret = caam_jr_enqueue(jrdev, desc, skcipher_crypt_done, req);
18428c2ecf20Sopenharmony_ci
18438c2ecf20Sopenharmony_ci	if ((ret != -EINPROGRESS) && (ret != -EBUSY)) {
18448c2ecf20Sopenharmony_ci		skcipher_unmap(jrdev, edesc, req);
18458c2ecf20Sopenharmony_ci		kfree(edesc);
18468c2ecf20Sopenharmony_ci	}
18478c2ecf20Sopenharmony_ci
18488c2ecf20Sopenharmony_ci	return ret;
18498c2ecf20Sopenharmony_ci}
18508c2ecf20Sopenharmony_ci
18518c2ecf20Sopenharmony_cistatic int skcipher_encrypt(struct skcipher_request *req)
18528c2ecf20Sopenharmony_ci{
18538c2ecf20Sopenharmony_ci	return skcipher_crypt(req, true);
18548c2ecf20Sopenharmony_ci}
18558c2ecf20Sopenharmony_ci
18568c2ecf20Sopenharmony_cistatic int skcipher_decrypt(struct skcipher_request *req)
18578c2ecf20Sopenharmony_ci{
18588c2ecf20Sopenharmony_ci	return skcipher_crypt(req, false);
18598c2ecf20Sopenharmony_ci}
18608c2ecf20Sopenharmony_ci
18618c2ecf20Sopenharmony_cistatic struct caam_skcipher_alg driver_algs[] = {
18628c2ecf20Sopenharmony_ci	{
18638c2ecf20Sopenharmony_ci		.skcipher = {
18648c2ecf20Sopenharmony_ci			.base = {
18658c2ecf20Sopenharmony_ci				.cra_name = "cbc(aes)",
18668c2ecf20Sopenharmony_ci				.cra_driver_name = "cbc-aes-caam",
18678c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
18688c2ecf20Sopenharmony_ci			},
18698c2ecf20Sopenharmony_ci			.setkey = aes_skcipher_setkey,
18708c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
18718c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
18728c2ecf20Sopenharmony_ci			.min_keysize = AES_MIN_KEY_SIZE,
18738c2ecf20Sopenharmony_ci			.max_keysize = AES_MAX_KEY_SIZE,
18748c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
18758c2ecf20Sopenharmony_ci		},
18768c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
18778c2ecf20Sopenharmony_ci	},
18788c2ecf20Sopenharmony_ci	{
18798c2ecf20Sopenharmony_ci		.skcipher = {
18808c2ecf20Sopenharmony_ci			.base = {
18818c2ecf20Sopenharmony_ci				.cra_name = "cbc(des3_ede)",
18828c2ecf20Sopenharmony_ci				.cra_driver_name = "cbc-3des-caam",
18838c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
18848c2ecf20Sopenharmony_ci			},
18858c2ecf20Sopenharmony_ci			.setkey = des3_skcipher_setkey,
18868c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
18878c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
18888c2ecf20Sopenharmony_ci			.min_keysize = DES3_EDE_KEY_SIZE,
18898c2ecf20Sopenharmony_ci			.max_keysize = DES3_EDE_KEY_SIZE,
18908c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
18918c2ecf20Sopenharmony_ci		},
18928c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
18938c2ecf20Sopenharmony_ci	},
18948c2ecf20Sopenharmony_ci	{
18958c2ecf20Sopenharmony_ci		.skcipher = {
18968c2ecf20Sopenharmony_ci			.base = {
18978c2ecf20Sopenharmony_ci				.cra_name = "cbc(des)",
18988c2ecf20Sopenharmony_ci				.cra_driver_name = "cbc-des-caam",
18998c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
19008c2ecf20Sopenharmony_ci			},
19018c2ecf20Sopenharmony_ci			.setkey = des_skcipher_setkey,
19028c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
19038c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
19048c2ecf20Sopenharmony_ci			.min_keysize = DES_KEY_SIZE,
19058c2ecf20Sopenharmony_ci			.max_keysize = DES_KEY_SIZE,
19068c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
19078c2ecf20Sopenharmony_ci		},
19088c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
19098c2ecf20Sopenharmony_ci	},
19108c2ecf20Sopenharmony_ci	{
19118c2ecf20Sopenharmony_ci		.skcipher = {
19128c2ecf20Sopenharmony_ci			.base = {
19138c2ecf20Sopenharmony_ci				.cra_name = "ctr(aes)",
19148c2ecf20Sopenharmony_ci				.cra_driver_name = "ctr-aes-caam",
19158c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
19168c2ecf20Sopenharmony_ci			},
19178c2ecf20Sopenharmony_ci			.setkey = ctr_skcipher_setkey,
19188c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
19198c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
19208c2ecf20Sopenharmony_ci			.min_keysize = AES_MIN_KEY_SIZE,
19218c2ecf20Sopenharmony_ci			.max_keysize = AES_MAX_KEY_SIZE,
19228c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
19238c2ecf20Sopenharmony_ci			.chunksize = AES_BLOCK_SIZE,
19248c2ecf20Sopenharmony_ci		},
19258c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_AES |
19268c2ecf20Sopenharmony_ci					OP_ALG_AAI_CTR_MOD128,
19278c2ecf20Sopenharmony_ci	},
19288c2ecf20Sopenharmony_ci	{
19298c2ecf20Sopenharmony_ci		.skcipher = {
19308c2ecf20Sopenharmony_ci			.base = {
19318c2ecf20Sopenharmony_ci				.cra_name = "rfc3686(ctr(aes))",
19328c2ecf20Sopenharmony_ci				.cra_driver_name = "rfc3686-ctr-aes-caam",
19338c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
19348c2ecf20Sopenharmony_ci			},
19358c2ecf20Sopenharmony_ci			.setkey = rfc3686_skcipher_setkey,
19368c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
19378c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
19388c2ecf20Sopenharmony_ci			.min_keysize = AES_MIN_KEY_SIZE +
19398c2ecf20Sopenharmony_ci				       CTR_RFC3686_NONCE_SIZE,
19408c2ecf20Sopenharmony_ci			.max_keysize = AES_MAX_KEY_SIZE +
19418c2ecf20Sopenharmony_ci				       CTR_RFC3686_NONCE_SIZE,
19428c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
19438c2ecf20Sopenharmony_ci			.chunksize = AES_BLOCK_SIZE,
19448c2ecf20Sopenharmony_ci		},
19458c2ecf20Sopenharmony_ci		.caam = {
19468c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
19478c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
19488c2ecf20Sopenharmony_ci			.rfc3686 = true,
19498c2ecf20Sopenharmony_ci		},
19508c2ecf20Sopenharmony_ci	},
19518c2ecf20Sopenharmony_ci	{
19528c2ecf20Sopenharmony_ci		.skcipher = {
19538c2ecf20Sopenharmony_ci			.base = {
19548c2ecf20Sopenharmony_ci				.cra_name = "xts(aes)",
19558c2ecf20Sopenharmony_ci				.cra_driver_name = "xts-aes-caam",
19568c2ecf20Sopenharmony_ci				.cra_flags = CRYPTO_ALG_NEED_FALLBACK,
19578c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
19588c2ecf20Sopenharmony_ci			},
19598c2ecf20Sopenharmony_ci			.setkey = xts_skcipher_setkey,
19608c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
19618c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
19628c2ecf20Sopenharmony_ci			.min_keysize = 2 * AES_MIN_KEY_SIZE,
19638c2ecf20Sopenharmony_ci			.max_keysize = 2 * AES_MAX_KEY_SIZE,
19648c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
19658c2ecf20Sopenharmony_ci		},
19668c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_XTS,
19678c2ecf20Sopenharmony_ci	},
19688c2ecf20Sopenharmony_ci	{
19698c2ecf20Sopenharmony_ci		.skcipher = {
19708c2ecf20Sopenharmony_ci			.base = {
19718c2ecf20Sopenharmony_ci				.cra_name = "ecb(des)",
19728c2ecf20Sopenharmony_ci				.cra_driver_name = "ecb-des-caam",
19738c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
19748c2ecf20Sopenharmony_ci			},
19758c2ecf20Sopenharmony_ci			.setkey = des_skcipher_setkey,
19768c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
19778c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
19788c2ecf20Sopenharmony_ci			.min_keysize = DES_KEY_SIZE,
19798c2ecf20Sopenharmony_ci			.max_keysize = DES_KEY_SIZE,
19808c2ecf20Sopenharmony_ci		},
19818c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_ECB,
19828c2ecf20Sopenharmony_ci	},
19838c2ecf20Sopenharmony_ci	{
19848c2ecf20Sopenharmony_ci		.skcipher = {
19858c2ecf20Sopenharmony_ci			.base = {
19868c2ecf20Sopenharmony_ci				.cra_name = "ecb(aes)",
19878c2ecf20Sopenharmony_ci				.cra_driver_name = "ecb-aes-caam",
19888c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
19898c2ecf20Sopenharmony_ci			},
19908c2ecf20Sopenharmony_ci			.setkey = aes_skcipher_setkey,
19918c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
19928c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
19938c2ecf20Sopenharmony_ci			.min_keysize = AES_MIN_KEY_SIZE,
19948c2ecf20Sopenharmony_ci			.max_keysize = AES_MAX_KEY_SIZE,
19958c2ecf20Sopenharmony_ci		},
19968c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_ECB,
19978c2ecf20Sopenharmony_ci	},
19988c2ecf20Sopenharmony_ci	{
19998c2ecf20Sopenharmony_ci		.skcipher = {
20008c2ecf20Sopenharmony_ci			.base = {
20018c2ecf20Sopenharmony_ci				.cra_name = "ecb(des3_ede)",
20028c2ecf20Sopenharmony_ci				.cra_driver_name = "ecb-des3-caam",
20038c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
20048c2ecf20Sopenharmony_ci			},
20058c2ecf20Sopenharmony_ci			.setkey = des3_skcipher_setkey,
20068c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
20078c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
20088c2ecf20Sopenharmony_ci			.min_keysize = DES3_EDE_KEY_SIZE,
20098c2ecf20Sopenharmony_ci			.max_keysize = DES3_EDE_KEY_SIZE,
20108c2ecf20Sopenharmony_ci		},
20118c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_ECB,
20128c2ecf20Sopenharmony_ci	},
20138c2ecf20Sopenharmony_ci};
20148c2ecf20Sopenharmony_ci
20158c2ecf20Sopenharmony_cistatic struct caam_aead_alg driver_aeads[] = {
20168c2ecf20Sopenharmony_ci	{
20178c2ecf20Sopenharmony_ci		.aead = {
20188c2ecf20Sopenharmony_ci			.base = {
20198c2ecf20Sopenharmony_ci				.cra_name = "rfc4106(gcm(aes))",
20208c2ecf20Sopenharmony_ci				.cra_driver_name = "rfc4106-gcm-aes-caam",
20218c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
20228c2ecf20Sopenharmony_ci			},
20238c2ecf20Sopenharmony_ci			.setkey = rfc4106_setkey,
20248c2ecf20Sopenharmony_ci			.setauthsize = rfc4106_setauthsize,
20258c2ecf20Sopenharmony_ci			.encrypt = ipsec_gcm_encrypt,
20268c2ecf20Sopenharmony_ci			.decrypt = ipsec_gcm_decrypt,
20278c2ecf20Sopenharmony_ci			.ivsize = GCM_RFC4106_IV_SIZE,
20288c2ecf20Sopenharmony_ci			.maxauthsize = AES_BLOCK_SIZE,
20298c2ecf20Sopenharmony_ci		},
20308c2ecf20Sopenharmony_ci		.caam = {
20318c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
20328c2ecf20Sopenharmony_ci			.nodkp = true,
20338c2ecf20Sopenharmony_ci		},
20348c2ecf20Sopenharmony_ci	},
20358c2ecf20Sopenharmony_ci	{
20368c2ecf20Sopenharmony_ci		.aead = {
20378c2ecf20Sopenharmony_ci			.base = {
20388c2ecf20Sopenharmony_ci				.cra_name = "rfc4543(gcm(aes))",
20398c2ecf20Sopenharmony_ci				.cra_driver_name = "rfc4543-gcm-aes-caam",
20408c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
20418c2ecf20Sopenharmony_ci			},
20428c2ecf20Sopenharmony_ci			.setkey = rfc4543_setkey,
20438c2ecf20Sopenharmony_ci			.setauthsize = rfc4543_setauthsize,
20448c2ecf20Sopenharmony_ci			.encrypt = ipsec_gcm_encrypt,
20458c2ecf20Sopenharmony_ci			.decrypt = ipsec_gcm_decrypt,
20468c2ecf20Sopenharmony_ci			.ivsize = GCM_RFC4543_IV_SIZE,
20478c2ecf20Sopenharmony_ci			.maxauthsize = AES_BLOCK_SIZE,
20488c2ecf20Sopenharmony_ci		},
20498c2ecf20Sopenharmony_ci		.caam = {
20508c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
20518c2ecf20Sopenharmony_ci			.nodkp = true,
20528c2ecf20Sopenharmony_ci		},
20538c2ecf20Sopenharmony_ci	},
20548c2ecf20Sopenharmony_ci	/* Galois Counter Mode */
20558c2ecf20Sopenharmony_ci	{
20568c2ecf20Sopenharmony_ci		.aead = {
20578c2ecf20Sopenharmony_ci			.base = {
20588c2ecf20Sopenharmony_ci				.cra_name = "gcm(aes)",
20598c2ecf20Sopenharmony_ci				.cra_driver_name = "gcm-aes-caam",
20608c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
20618c2ecf20Sopenharmony_ci			},
20628c2ecf20Sopenharmony_ci			.setkey = gcm_setkey,
20638c2ecf20Sopenharmony_ci			.setauthsize = gcm_setauthsize,
20648c2ecf20Sopenharmony_ci			.encrypt = gcm_encrypt,
20658c2ecf20Sopenharmony_ci			.decrypt = gcm_decrypt,
20668c2ecf20Sopenharmony_ci			.ivsize = GCM_AES_IV_SIZE,
20678c2ecf20Sopenharmony_ci			.maxauthsize = AES_BLOCK_SIZE,
20688c2ecf20Sopenharmony_ci		},
20698c2ecf20Sopenharmony_ci		.caam = {
20708c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
20718c2ecf20Sopenharmony_ci			.nodkp = true,
20728c2ecf20Sopenharmony_ci		},
20738c2ecf20Sopenharmony_ci	},
20748c2ecf20Sopenharmony_ci	/* single-pass ipsec_esp descriptor */
20758c2ecf20Sopenharmony_ci	{
20768c2ecf20Sopenharmony_ci		.aead = {
20778c2ecf20Sopenharmony_ci			.base = {
20788c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(md5),"
20798c2ecf20Sopenharmony_ci					    "ecb(cipher_null))",
20808c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-md5-"
20818c2ecf20Sopenharmony_ci						   "ecb-cipher_null-caam",
20828c2ecf20Sopenharmony_ci				.cra_blocksize = NULL_BLOCK_SIZE,
20838c2ecf20Sopenharmony_ci			},
20848c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
20858c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
20868c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
20878c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
20888c2ecf20Sopenharmony_ci			.ivsize = NULL_IV_SIZE,
20898c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
20908c2ecf20Sopenharmony_ci		},
20918c2ecf20Sopenharmony_ci		.caam = {
20928c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
20938c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
20948c2ecf20Sopenharmony_ci		},
20958c2ecf20Sopenharmony_ci	},
20968c2ecf20Sopenharmony_ci	{
20978c2ecf20Sopenharmony_ci		.aead = {
20988c2ecf20Sopenharmony_ci			.base = {
20998c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha1),"
21008c2ecf20Sopenharmony_ci					    "ecb(cipher_null))",
21018c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha1-"
21028c2ecf20Sopenharmony_ci						   "ecb-cipher_null-caam",
21038c2ecf20Sopenharmony_ci				.cra_blocksize = NULL_BLOCK_SIZE,
21048c2ecf20Sopenharmony_ci			},
21058c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
21068c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
21078c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
21088c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
21098c2ecf20Sopenharmony_ci			.ivsize = NULL_IV_SIZE,
21108c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
21118c2ecf20Sopenharmony_ci		},
21128c2ecf20Sopenharmony_ci		.caam = {
21138c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
21148c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21158c2ecf20Sopenharmony_ci		},
21168c2ecf20Sopenharmony_ci	},
21178c2ecf20Sopenharmony_ci	{
21188c2ecf20Sopenharmony_ci		.aead = {
21198c2ecf20Sopenharmony_ci			.base = {
21208c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha224),"
21218c2ecf20Sopenharmony_ci					    "ecb(cipher_null))",
21228c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha224-"
21238c2ecf20Sopenharmony_ci						   "ecb-cipher_null-caam",
21248c2ecf20Sopenharmony_ci				.cra_blocksize = NULL_BLOCK_SIZE,
21258c2ecf20Sopenharmony_ci			},
21268c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
21278c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
21288c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
21298c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
21308c2ecf20Sopenharmony_ci			.ivsize = NULL_IV_SIZE,
21318c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
21328c2ecf20Sopenharmony_ci		},
21338c2ecf20Sopenharmony_ci		.caam = {
21348c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
21358c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21368c2ecf20Sopenharmony_ci		},
21378c2ecf20Sopenharmony_ci	},
21388c2ecf20Sopenharmony_ci	{
21398c2ecf20Sopenharmony_ci		.aead = {
21408c2ecf20Sopenharmony_ci			.base = {
21418c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha256),"
21428c2ecf20Sopenharmony_ci					    "ecb(cipher_null))",
21438c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha256-"
21448c2ecf20Sopenharmony_ci						   "ecb-cipher_null-caam",
21458c2ecf20Sopenharmony_ci				.cra_blocksize = NULL_BLOCK_SIZE,
21468c2ecf20Sopenharmony_ci			},
21478c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
21488c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
21498c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
21508c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
21518c2ecf20Sopenharmony_ci			.ivsize = NULL_IV_SIZE,
21528c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
21538c2ecf20Sopenharmony_ci		},
21548c2ecf20Sopenharmony_ci		.caam = {
21558c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
21568c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21578c2ecf20Sopenharmony_ci		},
21588c2ecf20Sopenharmony_ci	},
21598c2ecf20Sopenharmony_ci	{
21608c2ecf20Sopenharmony_ci		.aead = {
21618c2ecf20Sopenharmony_ci			.base = {
21628c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha384),"
21638c2ecf20Sopenharmony_ci					    "ecb(cipher_null))",
21648c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha384-"
21658c2ecf20Sopenharmony_ci						   "ecb-cipher_null-caam",
21668c2ecf20Sopenharmony_ci				.cra_blocksize = NULL_BLOCK_SIZE,
21678c2ecf20Sopenharmony_ci			},
21688c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
21698c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
21708c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
21718c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
21728c2ecf20Sopenharmony_ci			.ivsize = NULL_IV_SIZE,
21738c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
21748c2ecf20Sopenharmony_ci		},
21758c2ecf20Sopenharmony_ci		.caam = {
21768c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
21778c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21788c2ecf20Sopenharmony_ci		},
21798c2ecf20Sopenharmony_ci	},
21808c2ecf20Sopenharmony_ci	{
21818c2ecf20Sopenharmony_ci		.aead = {
21828c2ecf20Sopenharmony_ci			.base = {
21838c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha512),"
21848c2ecf20Sopenharmony_ci					    "ecb(cipher_null))",
21858c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha512-"
21868c2ecf20Sopenharmony_ci						   "ecb-cipher_null-caam",
21878c2ecf20Sopenharmony_ci				.cra_blocksize = NULL_BLOCK_SIZE,
21888c2ecf20Sopenharmony_ci			},
21898c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
21908c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
21918c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
21928c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
21938c2ecf20Sopenharmony_ci			.ivsize = NULL_IV_SIZE,
21948c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
21958c2ecf20Sopenharmony_ci		},
21968c2ecf20Sopenharmony_ci		.caam = {
21978c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
21988c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21998c2ecf20Sopenharmony_ci		},
22008c2ecf20Sopenharmony_ci	},
22018c2ecf20Sopenharmony_ci	{
22028c2ecf20Sopenharmony_ci		.aead = {
22038c2ecf20Sopenharmony_ci			.base = {
22048c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(md5),cbc(aes))",
22058c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-md5-"
22068c2ecf20Sopenharmony_ci						   "cbc-aes-caam",
22078c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
22088c2ecf20Sopenharmony_ci			},
22098c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
22108c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22118c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
22128c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
22138c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
22148c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
22158c2ecf20Sopenharmony_ci		},
22168c2ecf20Sopenharmony_ci		.caam = {
22178c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
22188c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
22198c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
22208c2ecf20Sopenharmony_ci		},
22218c2ecf20Sopenharmony_ci	},
22228c2ecf20Sopenharmony_ci	{
22238c2ecf20Sopenharmony_ci		.aead = {
22248c2ecf20Sopenharmony_ci			.base = {
22258c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(md5),"
22268c2ecf20Sopenharmony_ci					    "cbc(aes)))",
22278c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-hmac-md5-"
22288c2ecf20Sopenharmony_ci						   "cbc-aes-caam",
22298c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
22308c2ecf20Sopenharmony_ci			},
22318c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
22328c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22338c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
22348c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
22358c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
22368c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
22378c2ecf20Sopenharmony_ci		},
22388c2ecf20Sopenharmony_ci		.caam = {
22398c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
22408c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
22418c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
22428c2ecf20Sopenharmony_ci			.geniv = true,
22438c2ecf20Sopenharmony_ci		},
22448c2ecf20Sopenharmony_ci	},
22458c2ecf20Sopenharmony_ci	{
22468c2ecf20Sopenharmony_ci		.aead = {
22478c2ecf20Sopenharmony_ci			.base = {
22488c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha1),cbc(aes))",
22498c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha1-"
22508c2ecf20Sopenharmony_ci						   "cbc-aes-caam",
22518c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
22528c2ecf20Sopenharmony_ci			},
22538c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
22548c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22558c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
22568c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
22578c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
22588c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
22598c2ecf20Sopenharmony_ci		},
22608c2ecf20Sopenharmony_ci		.caam = {
22618c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
22628c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
22638c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
22648c2ecf20Sopenharmony_ci		},
22658c2ecf20Sopenharmony_ci	},
22668c2ecf20Sopenharmony_ci	{
22678c2ecf20Sopenharmony_ci		.aead = {
22688c2ecf20Sopenharmony_ci			.base = {
22698c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha1),"
22708c2ecf20Sopenharmony_ci					    "cbc(aes)))",
22718c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
22728c2ecf20Sopenharmony_ci						   "hmac-sha1-cbc-aes-caam",
22738c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
22748c2ecf20Sopenharmony_ci			},
22758c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
22768c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22778c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
22788c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
22798c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
22808c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
22818c2ecf20Sopenharmony_ci		},
22828c2ecf20Sopenharmony_ci		.caam = {
22838c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
22848c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
22858c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
22868c2ecf20Sopenharmony_ci			.geniv = true,
22878c2ecf20Sopenharmony_ci		},
22888c2ecf20Sopenharmony_ci	},
22898c2ecf20Sopenharmony_ci	{
22908c2ecf20Sopenharmony_ci		.aead = {
22918c2ecf20Sopenharmony_ci			.base = {
22928c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha224),cbc(aes))",
22938c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha224-"
22948c2ecf20Sopenharmony_ci						   "cbc-aes-caam",
22958c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
22968c2ecf20Sopenharmony_ci			},
22978c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
22988c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22998c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
23008c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
23018c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
23028c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
23038c2ecf20Sopenharmony_ci		},
23048c2ecf20Sopenharmony_ci		.caam = {
23058c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
23068c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
23078c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23088c2ecf20Sopenharmony_ci		},
23098c2ecf20Sopenharmony_ci	},
23108c2ecf20Sopenharmony_ci	{
23118c2ecf20Sopenharmony_ci		.aead = {
23128c2ecf20Sopenharmony_ci			.base = {
23138c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha224),"
23148c2ecf20Sopenharmony_ci					    "cbc(aes)))",
23158c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
23168c2ecf20Sopenharmony_ci						   "hmac-sha224-cbc-aes-caam",
23178c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
23188c2ecf20Sopenharmony_ci			},
23198c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
23208c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
23218c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
23228c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
23238c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
23248c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
23258c2ecf20Sopenharmony_ci		},
23268c2ecf20Sopenharmony_ci		.caam = {
23278c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
23288c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
23298c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23308c2ecf20Sopenharmony_ci			.geniv = true,
23318c2ecf20Sopenharmony_ci		},
23328c2ecf20Sopenharmony_ci	},
23338c2ecf20Sopenharmony_ci	{
23348c2ecf20Sopenharmony_ci		.aead = {
23358c2ecf20Sopenharmony_ci			.base = {
23368c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha256),cbc(aes))",
23378c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha256-"
23388c2ecf20Sopenharmony_ci						   "cbc-aes-caam",
23398c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
23408c2ecf20Sopenharmony_ci			},
23418c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
23428c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
23438c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
23448c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
23458c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
23468c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
23478c2ecf20Sopenharmony_ci		},
23488c2ecf20Sopenharmony_ci		.caam = {
23498c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
23508c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
23518c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23528c2ecf20Sopenharmony_ci		},
23538c2ecf20Sopenharmony_ci	},
23548c2ecf20Sopenharmony_ci	{
23558c2ecf20Sopenharmony_ci		.aead = {
23568c2ecf20Sopenharmony_ci			.base = {
23578c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha256),"
23588c2ecf20Sopenharmony_ci					    "cbc(aes)))",
23598c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
23608c2ecf20Sopenharmony_ci						   "hmac-sha256-cbc-aes-caam",
23618c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
23628c2ecf20Sopenharmony_ci			},
23638c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
23648c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
23658c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
23668c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
23678c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
23688c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
23698c2ecf20Sopenharmony_ci		},
23708c2ecf20Sopenharmony_ci		.caam = {
23718c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
23728c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
23738c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23748c2ecf20Sopenharmony_ci			.geniv = true,
23758c2ecf20Sopenharmony_ci		},
23768c2ecf20Sopenharmony_ci	},
23778c2ecf20Sopenharmony_ci	{
23788c2ecf20Sopenharmony_ci		.aead = {
23798c2ecf20Sopenharmony_ci			.base = {
23808c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha384),cbc(aes))",
23818c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha384-"
23828c2ecf20Sopenharmony_ci						   "cbc-aes-caam",
23838c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
23848c2ecf20Sopenharmony_ci			},
23858c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
23868c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
23878c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
23888c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
23898c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
23908c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
23918c2ecf20Sopenharmony_ci		},
23928c2ecf20Sopenharmony_ci		.caam = {
23938c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
23948c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
23958c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23968c2ecf20Sopenharmony_ci		},
23978c2ecf20Sopenharmony_ci	},
23988c2ecf20Sopenharmony_ci	{
23998c2ecf20Sopenharmony_ci		.aead = {
24008c2ecf20Sopenharmony_ci			.base = {
24018c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha384),"
24028c2ecf20Sopenharmony_ci					    "cbc(aes)))",
24038c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
24048c2ecf20Sopenharmony_ci						   "hmac-sha384-cbc-aes-caam",
24058c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
24068c2ecf20Sopenharmony_ci			},
24078c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
24088c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
24098c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
24108c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
24118c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
24128c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
24138c2ecf20Sopenharmony_ci		},
24148c2ecf20Sopenharmony_ci		.caam = {
24158c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
24168c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
24178c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
24188c2ecf20Sopenharmony_ci			.geniv = true,
24198c2ecf20Sopenharmony_ci		},
24208c2ecf20Sopenharmony_ci	},
24218c2ecf20Sopenharmony_ci	{
24228c2ecf20Sopenharmony_ci		.aead = {
24238c2ecf20Sopenharmony_ci			.base = {
24248c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha512),cbc(aes))",
24258c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha512-"
24268c2ecf20Sopenharmony_ci						   "cbc-aes-caam",
24278c2ecf20Sopenharmony_ci				.cra_blocksize = AES_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 = AES_BLOCK_SIZE,
24348c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
24358c2ecf20Sopenharmony_ci		},
24368c2ecf20Sopenharmony_ci		.caam = {
24378c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
24388c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
24398c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
24408c2ecf20Sopenharmony_ci		},
24418c2ecf20Sopenharmony_ci	},
24428c2ecf20Sopenharmony_ci	{
24438c2ecf20Sopenharmony_ci		.aead = {
24448c2ecf20Sopenharmony_ci			.base = {
24458c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha512),"
24468c2ecf20Sopenharmony_ci					    "cbc(aes)))",
24478c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
24488c2ecf20Sopenharmony_ci						   "hmac-sha512-cbc-aes-caam",
24498c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
24508c2ecf20Sopenharmony_ci			},
24518c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
24528c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
24538c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
24548c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
24558c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
24568c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
24578c2ecf20Sopenharmony_ci		},
24588c2ecf20Sopenharmony_ci		.caam = {
24598c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
24608c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
24618c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
24628c2ecf20Sopenharmony_ci			.geniv = true,
24638c2ecf20Sopenharmony_ci		},
24648c2ecf20Sopenharmony_ci	},
24658c2ecf20Sopenharmony_ci	{
24668c2ecf20Sopenharmony_ci		.aead = {
24678c2ecf20Sopenharmony_ci			.base = {
24688c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(md5),cbc(des3_ede))",
24698c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-md5-"
24708c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam",
24718c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
24728c2ecf20Sopenharmony_ci			},
24738c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
24748c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
24758c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
24768c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
24778c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
24788c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
24798c2ecf20Sopenharmony_ci		},
24808c2ecf20Sopenharmony_ci		.caam = {
24818c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
24828c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
24838c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
24848c2ecf20Sopenharmony_ci		}
24858c2ecf20Sopenharmony_ci	},
24868c2ecf20Sopenharmony_ci	{
24878c2ecf20Sopenharmony_ci		.aead = {
24888c2ecf20Sopenharmony_ci			.base = {
24898c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(md5),"
24908c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
24918c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-hmac-md5-"
24928c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam",
24938c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
24948c2ecf20Sopenharmony_ci			},
24958c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
24968c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
24978c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
24988c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
24998c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
25008c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
25018c2ecf20Sopenharmony_ci		},
25028c2ecf20Sopenharmony_ci		.caam = {
25038c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
25048c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
25058c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
25068c2ecf20Sopenharmony_ci			.geniv = true,
25078c2ecf20Sopenharmony_ci		}
25088c2ecf20Sopenharmony_ci	},
25098c2ecf20Sopenharmony_ci	{
25108c2ecf20Sopenharmony_ci		.aead = {
25118c2ecf20Sopenharmony_ci			.base = {
25128c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha1),"
25138c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
25148c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha1-"
25158c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam",
25168c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
25178c2ecf20Sopenharmony_ci			},
25188c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
25198c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
25208c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
25218c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
25228c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
25238c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
25248c2ecf20Sopenharmony_ci		},
25258c2ecf20Sopenharmony_ci		.caam = {
25268c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
25278c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
25288c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
25298c2ecf20Sopenharmony_ci		},
25308c2ecf20Sopenharmony_ci	},
25318c2ecf20Sopenharmony_ci	{
25328c2ecf20Sopenharmony_ci		.aead = {
25338c2ecf20Sopenharmony_ci			.base = {
25348c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha1),"
25358c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
25368c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
25378c2ecf20Sopenharmony_ci						   "hmac-sha1-"
25388c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam",
25398c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
25408c2ecf20Sopenharmony_ci			},
25418c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
25428c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
25438c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
25448c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
25458c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
25468c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
25478c2ecf20Sopenharmony_ci		},
25488c2ecf20Sopenharmony_ci		.caam = {
25498c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
25508c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
25518c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
25528c2ecf20Sopenharmony_ci			.geniv = true,
25538c2ecf20Sopenharmony_ci		},
25548c2ecf20Sopenharmony_ci	},
25558c2ecf20Sopenharmony_ci	{
25568c2ecf20Sopenharmony_ci		.aead = {
25578c2ecf20Sopenharmony_ci			.base = {
25588c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha224),"
25598c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
25608c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha224-"
25618c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam",
25628c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
25638c2ecf20Sopenharmony_ci			},
25648c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
25658c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
25668c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
25678c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
25688c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
25698c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
25708c2ecf20Sopenharmony_ci		},
25718c2ecf20Sopenharmony_ci		.caam = {
25728c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
25738c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
25748c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
25758c2ecf20Sopenharmony_ci		},
25768c2ecf20Sopenharmony_ci	},
25778c2ecf20Sopenharmony_ci	{
25788c2ecf20Sopenharmony_ci		.aead = {
25798c2ecf20Sopenharmony_ci			.base = {
25808c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha224),"
25818c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
25828c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
25838c2ecf20Sopenharmony_ci						   "hmac-sha224-"
25848c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam",
25858c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
25868c2ecf20Sopenharmony_ci			},
25878c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
25888c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
25898c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
25908c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
25918c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
25928c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
25938c2ecf20Sopenharmony_ci		},
25948c2ecf20Sopenharmony_ci		.caam = {
25958c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
25968c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
25978c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
25988c2ecf20Sopenharmony_ci			.geniv = true,
25998c2ecf20Sopenharmony_ci		},
26008c2ecf20Sopenharmony_ci	},
26018c2ecf20Sopenharmony_ci	{
26028c2ecf20Sopenharmony_ci		.aead = {
26038c2ecf20Sopenharmony_ci			.base = {
26048c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha256),"
26058c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
26068c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha256-"
26078c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam",
26088c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
26098c2ecf20Sopenharmony_ci			},
26108c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
26118c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
26128c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
26138c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
26148c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
26158c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
26168c2ecf20Sopenharmony_ci		},
26178c2ecf20Sopenharmony_ci		.caam = {
26188c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
26198c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
26208c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
26218c2ecf20Sopenharmony_ci		},
26228c2ecf20Sopenharmony_ci	},
26238c2ecf20Sopenharmony_ci	{
26248c2ecf20Sopenharmony_ci		.aead = {
26258c2ecf20Sopenharmony_ci			.base = {
26268c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha256),"
26278c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
26288c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
26298c2ecf20Sopenharmony_ci						   "hmac-sha256-"
26308c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam",
26318c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
26328c2ecf20Sopenharmony_ci			},
26338c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
26348c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
26358c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
26368c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
26378c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
26388c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
26398c2ecf20Sopenharmony_ci		},
26408c2ecf20Sopenharmony_ci		.caam = {
26418c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
26428c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
26438c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
26448c2ecf20Sopenharmony_ci			.geniv = true,
26458c2ecf20Sopenharmony_ci		},
26468c2ecf20Sopenharmony_ci	},
26478c2ecf20Sopenharmony_ci	{
26488c2ecf20Sopenharmony_ci		.aead = {
26498c2ecf20Sopenharmony_ci			.base = {
26508c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha384),"
26518c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
26528c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha384-"
26538c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam",
26548c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
26558c2ecf20Sopenharmony_ci			},
26568c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
26578c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
26588c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
26598c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
26608c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
26618c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
26628c2ecf20Sopenharmony_ci		},
26638c2ecf20Sopenharmony_ci		.caam = {
26648c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
26658c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
26668c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
26678c2ecf20Sopenharmony_ci		},
26688c2ecf20Sopenharmony_ci	},
26698c2ecf20Sopenharmony_ci	{
26708c2ecf20Sopenharmony_ci		.aead = {
26718c2ecf20Sopenharmony_ci			.base = {
26728c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha384),"
26738c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
26748c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
26758c2ecf20Sopenharmony_ci						   "hmac-sha384-"
26768c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam",
26778c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
26788c2ecf20Sopenharmony_ci			},
26798c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
26808c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
26818c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
26828c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
26838c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
26848c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
26858c2ecf20Sopenharmony_ci		},
26868c2ecf20Sopenharmony_ci		.caam = {
26878c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
26888c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
26898c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
26908c2ecf20Sopenharmony_ci			.geniv = true,
26918c2ecf20Sopenharmony_ci		},
26928c2ecf20Sopenharmony_ci	},
26938c2ecf20Sopenharmony_ci	{
26948c2ecf20Sopenharmony_ci		.aead = {
26958c2ecf20Sopenharmony_ci			.base = {
26968c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha512),"
26978c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
26988c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha512-"
26998c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam",
27008c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
27018c2ecf20Sopenharmony_ci			},
27028c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
27038c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
27048c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
27058c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
27068c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
27078c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
27088c2ecf20Sopenharmony_ci		},
27098c2ecf20Sopenharmony_ci		.caam = {
27108c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
27118c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
27128c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
27138c2ecf20Sopenharmony_ci		},
27148c2ecf20Sopenharmony_ci	},
27158c2ecf20Sopenharmony_ci	{
27168c2ecf20Sopenharmony_ci		.aead = {
27178c2ecf20Sopenharmony_ci			.base = {
27188c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha512),"
27198c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
27208c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
27218c2ecf20Sopenharmony_ci						   "hmac-sha512-"
27228c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam",
27238c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
27248c2ecf20Sopenharmony_ci			},
27258c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
27268c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
27278c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
27288c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
27298c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
27308c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
27318c2ecf20Sopenharmony_ci		},
27328c2ecf20Sopenharmony_ci		.caam = {
27338c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
27348c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
27358c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
27368c2ecf20Sopenharmony_ci			.geniv = true,
27378c2ecf20Sopenharmony_ci		},
27388c2ecf20Sopenharmony_ci	},
27398c2ecf20Sopenharmony_ci	{
27408c2ecf20Sopenharmony_ci		.aead = {
27418c2ecf20Sopenharmony_ci			.base = {
27428c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(md5),cbc(des))",
27438c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-md5-"
27448c2ecf20Sopenharmony_ci						   "cbc-des-caam",
27458c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
27468c2ecf20Sopenharmony_ci			},
27478c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
27488c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
27498c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
27508c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
27518c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
27528c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
27538c2ecf20Sopenharmony_ci		},
27548c2ecf20Sopenharmony_ci		.caam = {
27558c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
27568c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
27578c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
27588c2ecf20Sopenharmony_ci		},
27598c2ecf20Sopenharmony_ci	},
27608c2ecf20Sopenharmony_ci	{
27618c2ecf20Sopenharmony_ci		.aead = {
27628c2ecf20Sopenharmony_ci			.base = {
27638c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(md5),"
27648c2ecf20Sopenharmony_ci					    "cbc(des)))",
27658c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-hmac-md5-"
27668c2ecf20Sopenharmony_ci						   "cbc-des-caam",
27678c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
27688c2ecf20Sopenharmony_ci			},
27698c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
27708c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
27718c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
27728c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
27738c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
27748c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
27758c2ecf20Sopenharmony_ci		},
27768c2ecf20Sopenharmony_ci		.caam = {
27778c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
27788c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
27798c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
27808c2ecf20Sopenharmony_ci			.geniv = true,
27818c2ecf20Sopenharmony_ci		},
27828c2ecf20Sopenharmony_ci	},
27838c2ecf20Sopenharmony_ci	{
27848c2ecf20Sopenharmony_ci		.aead = {
27858c2ecf20Sopenharmony_ci			.base = {
27868c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha1),cbc(des))",
27878c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha1-"
27888c2ecf20Sopenharmony_ci						   "cbc-des-caam",
27898c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
27908c2ecf20Sopenharmony_ci			},
27918c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
27928c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
27938c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
27948c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
27958c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
27968c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
27978c2ecf20Sopenharmony_ci		},
27988c2ecf20Sopenharmony_ci		.caam = {
27998c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
28008c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
28018c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
28028c2ecf20Sopenharmony_ci		},
28038c2ecf20Sopenharmony_ci	},
28048c2ecf20Sopenharmony_ci	{
28058c2ecf20Sopenharmony_ci		.aead = {
28068c2ecf20Sopenharmony_ci			.base = {
28078c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha1),"
28088c2ecf20Sopenharmony_ci					    "cbc(des)))",
28098c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
28108c2ecf20Sopenharmony_ci						   "hmac-sha1-cbc-des-caam",
28118c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
28128c2ecf20Sopenharmony_ci			},
28138c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
28148c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
28158c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
28168c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
28178c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
28188c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
28198c2ecf20Sopenharmony_ci		},
28208c2ecf20Sopenharmony_ci		.caam = {
28218c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
28228c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
28238c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
28248c2ecf20Sopenharmony_ci			.geniv = true,
28258c2ecf20Sopenharmony_ci		},
28268c2ecf20Sopenharmony_ci	},
28278c2ecf20Sopenharmony_ci	{
28288c2ecf20Sopenharmony_ci		.aead = {
28298c2ecf20Sopenharmony_ci			.base = {
28308c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha224),cbc(des))",
28318c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha224-"
28328c2ecf20Sopenharmony_ci						   "cbc-des-caam",
28338c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
28348c2ecf20Sopenharmony_ci			},
28358c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
28368c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
28378c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
28388c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
28398c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
28408c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
28418c2ecf20Sopenharmony_ci		},
28428c2ecf20Sopenharmony_ci		.caam = {
28438c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
28448c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
28458c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
28468c2ecf20Sopenharmony_ci		},
28478c2ecf20Sopenharmony_ci	},
28488c2ecf20Sopenharmony_ci	{
28498c2ecf20Sopenharmony_ci		.aead = {
28508c2ecf20Sopenharmony_ci			.base = {
28518c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha224),"
28528c2ecf20Sopenharmony_ci					    "cbc(des)))",
28538c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
28548c2ecf20Sopenharmony_ci						   "hmac-sha224-cbc-des-caam",
28558c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
28568c2ecf20Sopenharmony_ci			},
28578c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
28588c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
28598c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
28608c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
28618c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
28628c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
28638c2ecf20Sopenharmony_ci		},
28648c2ecf20Sopenharmony_ci		.caam = {
28658c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
28668c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
28678c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
28688c2ecf20Sopenharmony_ci			.geniv = true,
28698c2ecf20Sopenharmony_ci		},
28708c2ecf20Sopenharmony_ci	},
28718c2ecf20Sopenharmony_ci	{
28728c2ecf20Sopenharmony_ci		.aead = {
28738c2ecf20Sopenharmony_ci			.base = {
28748c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha256),cbc(des))",
28758c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha256-"
28768c2ecf20Sopenharmony_ci						   "cbc-des-caam",
28778c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
28788c2ecf20Sopenharmony_ci			},
28798c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
28808c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
28818c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
28828c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
28838c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
28848c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
28858c2ecf20Sopenharmony_ci		},
28868c2ecf20Sopenharmony_ci		.caam = {
28878c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
28888c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
28898c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
28908c2ecf20Sopenharmony_ci		},
28918c2ecf20Sopenharmony_ci	},
28928c2ecf20Sopenharmony_ci	{
28938c2ecf20Sopenharmony_ci		.aead = {
28948c2ecf20Sopenharmony_ci			.base = {
28958c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha256),"
28968c2ecf20Sopenharmony_ci					    "cbc(des)))",
28978c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
28988c2ecf20Sopenharmony_ci						   "hmac-sha256-cbc-des-caam",
28998c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
29008c2ecf20Sopenharmony_ci			},
29018c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
29028c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
29038c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
29048c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
29058c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
29068c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
29078c2ecf20Sopenharmony_ci		},
29088c2ecf20Sopenharmony_ci		.caam = {
29098c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
29108c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
29118c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
29128c2ecf20Sopenharmony_ci			.geniv = true,
29138c2ecf20Sopenharmony_ci		},
29148c2ecf20Sopenharmony_ci	},
29158c2ecf20Sopenharmony_ci	{
29168c2ecf20Sopenharmony_ci		.aead = {
29178c2ecf20Sopenharmony_ci			.base = {
29188c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha384),cbc(des))",
29198c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha384-"
29208c2ecf20Sopenharmony_ci						   "cbc-des-caam",
29218c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
29228c2ecf20Sopenharmony_ci			},
29238c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
29248c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
29258c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
29268c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
29278c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
29288c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
29298c2ecf20Sopenharmony_ci		},
29308c2ecf20Sopenharmony_ci		.caam = {
29318c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
29328c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
29338c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
29348c2ecf20Sopenharmony_ci		},
29358c2ecf20Sopenharmony_ci	},
29368c2ecf20Sopenharmony_ci	{
29378c2ecf20Sopenharmony_ci		.aead = {
29388c2ecf20Sopenharmony_ci			.base = {
29398c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha384),"
29408c2ecf20Sopenharmony_ci					    "cbc(des)))",
29418c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
29428c2ecf20Sopenharmony_ci						   "hmac-sha384-cbc-des-caam",
29438c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
29448c2ecf20Sopenharmony_ci			},
29458c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
29468c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
29478c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
29488c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
29498c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
29508c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
29518c2ecf20Sopenharmony_ci		},
29528c2ecf20Sopenharmony_ci		.caam = {
29538c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
29548c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
29558c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
29568c2ecf20Sopenharmony_ci			.geniv = true,
29578c2ecf20Sopenharmony_ci		},
29588c2ecf20Sopenharmony_ci	},
29598c2ecf20Sopenharmony_ci	{
29608c2ecf20Sopenharmony_ci		.aead = {
29618c2ecf20Sopenharmony_ci			.base = {
29628c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha512),cbc(des))",
29638c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha512-"
29648c2ecf20Sopenharmony_ci						   "cbc-des-caam",
29658c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
29668c2ecf20Sopenharmony_ci			},
29678c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
29688c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
29698c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
29708c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
29718c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
29728c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
29738c2ecf20Sopenharmony_ci		},
29748c2ecf20Sopenharmony_ci		.caam = {
29758c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
29768c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
29778c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
29788c2ecf20Sopenharmony_ci		},
29798c2ecf20Sopenharmony_ci	},
29808c2ecf20Sopenharmony_ci	{
29818c2ecf20Sopenharmony_ci		.aead = {
29828c2ecf20Sopenharmony_ci			.base = {
29838c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha512),"
29848c2ecf20Sopenharmony_ci					    "cbc(des)))",
29858c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
29868c2ecf20Sopenharmony_ci						   "hmac-sha512-cbc-des-caam",
29878c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
29888c2ecf20Sopenharmony_ci			},
29898c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
29908c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
29918c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
29928c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
29938c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
29948c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
29958c2ecf20Sopenharmony_ci		},
29968c2ecf20Sopenharmony_ci		.caam = {
29978c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
29988c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
29998c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
30008c2ecf20Sopenharmony_ci			.geniv = true,
30018c2ecf20Sopenharmony_ci		},
30028c2ecf20Sopenharmony_ci	},
30038c2ecf20Sopenharmony_ci	{
30048c2ecf20Sopenharmony_ci		.aead = {
30058c2ecf20Sopenharmony_ci			.base = {
30068c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(md5),"
30078c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes)))",
30088c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-md5-"
30098c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam",
30108c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
30118c2ecf20Sopenharmony_ci			},
30128c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
30138c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
30148c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
30158c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
30168c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
30178c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
30188c2ecf20Sopenharmony_ci		},
30198c2ecf20Sopenharmony_ci		.caam = {
30208c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
30218c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
30228c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
30238c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
30248c2ecf20Sopenharmony_ci			.rfc3686 = true,
30258c2ecf20Sopenharmony_ci		},
30268c2ecf20Sopenharmony_ci	},
30278c2ecf20Sopenharmony_ci	{
30288c2ecf20Sopenharmony_ci		.aead = {
30298c2ecf20Sopenharmony_ci			.base = {
30308c2ecf20Sopenharmony_ci				.cra_name = "seqiv(authenc("
30318c2ecf20Sopenharmony_ci					    "hmac(md5),rfc3686(ctr(aes))))",
30328c2ecf20Sopenharmony_ci				.cra_driver_name = "seqiv-authenc-hmac-md5-"
30338c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam",
30348c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
30358c2ecf20Sopenharmony_ci			},
30368c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
30378c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
30388c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
30398c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
30408c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
30418c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
30428c2ecf20Sopenharmony_ci		},
30438c2ecf20Sopenharmony_ci		.caam = {
30448c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
30458c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
30468c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
30478c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
30488c2ecf20Sopenharmony_ci			.rfc3686 = true,
30498c2ecf20Sopenharmony_ci			.geniv = true,
30508c2ecf20Sopenharmony_ci		},
30518c2ecf20Sopenharmony_ci	},
30528c2ecf20Sopenharmony_ci	{
30538c2ecf20Sopenharmony_ci		.aead = {
30548c2ecf20Sopenharmony_ci			.base = {
30558c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha1),"
30568c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes)))",
30578c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha1-"
30588c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam",
30598c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
30608c2ecf20Sopenharmony_ci			},
30618c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
30628c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
30638c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
30648c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
30658c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
30668c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
30678c2ecf20Sopenharmony_ci		},
30688c2ecf20Sopenharmony_ci		.caam = {
30698c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
30708c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
30718c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
30728c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
30738c2ecf20Sopenharmony_ci			.rfc3686 = true,
30748c2ecf20Sopenharmony_ci		},
30758c2ecf20Sopenharmony_ci	},
30768c2ecf20Sopenharmony_ci	{
30778c2ecf20Sopenharmony_ci		.aead = {
30788c2ecf20Sopenharmony_ci			.base = {
30798c2ecf20Sopenharmony_ci				.cra_name = "seqiv(authenc("
30808c2ecf20Sopenharmony_ci					    "hmac(sha1),rfc3686(ctr(aes))))",
30818c2ecf20Sopenharmony_ci				.cra_driver_name = "seqiv-authenc-hmac-sha1-"
30828c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam",
30838c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
30848c2ecf20Sopenharmony_ci			},
30858c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
30868c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
30878c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
30888c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
30898c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
30908c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
30918c2ecf20Sopenharmony_ci		},
30928c2ecf20Sopenharmony_ci		.caam = {
30938c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
30948c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
30958c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
30968c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
30978c2ecf20Sopenharmony_ci			.rfc3686 = true,
30988c2ecf20Sopenharmony_ci			.geniv = true,
30998c2ecf20Sopenharmony_ci		},
31008c2ecf20Sopenharmony_ci	},
31018c2ecf20Sopenharmony_ci	{
31028c2ecf20Sopenharmony_ci		.aead = {
31038c2ecf20Sopenharmony_ci			.base = {
31048c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha224),"
31058c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes)))",
31068c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha224-"
31078c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam",
31088c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
31098c2ecf20Sopenharmony_ci			},
31108c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
31118c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
31128c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
31138c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
31148c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
31158c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
31168c2ecf20Sopenharmony_ci		},
31178c2ecf20Sopenharmony_ci		.caam = {
31188c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
31198c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
31208c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
31218c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
31228c2ecf20Sopenharmony_ci			.rfc3686 = true,
31238c2ecf20Sopenharmony_ci		},
31248c2ecf20Sopenharmony_ci	},
31258c2ecf20Sopenharmony_ci	{
31268c2ecf20Sopenharmony_ci		.aead = {
31278c2ecf20Sopenharmony_ci			.base = {
31288c2ecf20Sopenharmony_ci				.cra_name = "seqiv(authenc("
31298c2ecf20Sopenharmony_ci					    "hmac(sha224),rfc3686(ctr(aes))))",
31308c2ecf20Sopenharmony_ci				.cra_driver_name = "seqiv-authenc-hmac-sha224-"
31318c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam",
31328c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
31338c2ecf20Sopenharmony_ci			},
31348c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
31358c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
31368c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
31378c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
31388c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
31398c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
31408c2ecf20Sopenharmony_ci		},
31418c2ecf20Sopenharmony_ci		.caam = {
31428c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
31438c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
31448c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
31458c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
31468c2ecf20Sopenharmony_ci			.rfc3686 = true,
31478c2ecf20Sopenharmony_ci			.geniv = true,
31488c2ecf20Sopenharmony_ci		},
31498c2ecf20Sopenharmony_ci	},
31508c2ecf20Sopenharmony_ci	{
31518c2ecf20Sopenharmony_ci		.aead = {
31528c2ecf20Sopenharmony_ci			.base = {
31538c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha256),"
31548c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes)))",
31558c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha256-"
31568c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam",
31578c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
31588c2ecf20Sopenharmony_ci			},
31598c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
31608c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
31618c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
31628c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
31638c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
31648c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
31658c2ecf20Sopenharmony_ci		},
31668c2ecf20Sopenharmony_ci		.caam = {
31678c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
31688c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
31698c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
31708c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
31718c2ecf20Sopenharmony_ci			.rfc3686 = true,
31728c2ecf20Sopenharmony_ci		},
31738c2ecf20Sopenharmony_ci	},
31748c2ecf20Sopenharmony_ci	{
31758c2ecf20Sopenharmony_ci		.aead = {
31768c2ecf20Sopenharmony_ci			.base = {
31778c2ecf20Sopenharmony_ci				.cra_name = "seqiv(authenc(hmac(sha256),"
31788c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes))))",
31798c2ecf20Sopenharmony_ci				.cra_driver_name = "seqiv-authenc-hmac-sha256-"
31808c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam",
31818c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
31828c2ecf20Sopenharmony_ci			},
31838c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
31848c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
31858c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
31868c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
31878c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
31888c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
31898c2ecf20Sopenharmony_ci		},
31908c2ecf20Sopenharmony_ci		.caam = {
31918c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
31928c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
31938c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
31948c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
31958c2ecf20Sopenharmony_ci			.rfc3686 = true,
31968c2ecf20Sopenharmony_ci			.geniv = true,
31978c2ecf20Sopenharmony_ci		},
31988c2ecf20Sopenharmony_ci	},
31998c2ecf20Sopenharmony_ci	{
32008c2ecf20Sopenharmony_ci		.aead = {
32018c2ecf20Sopenharmony_ci			.base = {
32028c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha384),"
32038c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes)))",
32048c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha384-"
32058c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam",
32068c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
32078c2ecf20Sopenharmony_ci			},
32088c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
32098c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
32108c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
32118c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
32128c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
32138c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
32148c2ecf20Sopenharmony_ci		},
32158c2ecf20Sopenharmony_ci		.caam = {
32168c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
32178c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
32188c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
32198c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
32208c2ecf20Sopenharmony_ci			.rfc3686 = true,
32218c2ecf20Sopenharmony_ci		},
32228c2ecf20Sopenharmony_ci	},
32238c2ecf20Sopenharmony_ci	{
32248c2ecf20Sopenharmony_ci		.aead = {
32258c2ecf20Sopenharmony_ci			.base = {
32268c2ecf20Sopenharmony_ci				.cra_name = "seqiv(authenc(hmac(sha384),"
32278c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes))))",
32288c2ecf20Sopenharmony_ci				.cra_driver_name = "seqiv-authenc-hmac-sha384-"
32298c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam",
32308c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
32318c2ecf20Sopenharmony_ci			},
32328c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
32338c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
32348c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
32358c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
32368c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
32378c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
32388c2ecf20Sopenharmony_ci		},
32398c2ecf20Sopenharmony_ci		.caam = {
32408c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
32418c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
32428c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
32438c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
32448c2ecf20Sopenharmony_ci			.rfc3686 = true,
32458c2ecf20Sopenharmony_ci			.geniv = true,
32468c2ecf20Sopenharmony_ci		},
32478c2ecf20Sopenharmony_ci	},
32488c2ecf20Sopenharmony_ci	{
32498c2ecf20Sopenharmony_ci		.aead = {
32508c2ecf20Sopenharmony_ci			.base = {
32518c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha512),"
32528c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes)))",
32538c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha512-"
32548c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam",
32558c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
32568c2ecf20Sopenharmony_ci			},
32578c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
32588c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
32598c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
32608c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
32618c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
32628c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
32638c2ecf20Sopenharmony_ci		},
32648c2ecf20Sopenharmony_ci		.caam = {
32658c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
32668c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
32678c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
32688c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
32698c2ecf20Sopenharmony_ci			.rfc3686 = true,
32708c2ecf20Sopenharmony_ci		},
32718c2ecf20Sopenharmony_ci	},
32728c2ecf20Sopenharmony_ci	{
32738c2ecf20Sopenharmony_ci		.aead = {
32748c2ecf20Sopenharmony_ci			.base = {
32758c2ecf20Sopenharmony_ci				.cra_name = "seqiv(authenc(hmac(sha512),"
32768c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes))))",
32778c2ecf20Sopenharmony_ci				.cra_driver_name = "seqiv-authenc-hmac-sha512-"
32788c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam",
32798c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
32808c2ecf20Sopenharmony_ci			},
32818c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
32828c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
32838c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
32848c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
32858c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
32868c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
32878c2ecf20Sopenharmony_ci		},
32888c2ecf20Sopenharmony_ci		.caam = {
32898c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
32908c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
32918c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
32928c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
32938c2ecf20Sopenharmony_ci			.rfc3686 = true,
32948c2ecf20Sopenharmony_ci			.geniv = true,
32958c2ecf20Sopenharmony_ci		},
32968c2ecf20Sopenharmony_ci	},
32978c2ecf20Sopenharmony_ci	{
32988c2ecf20Sopenharmony_ci		.aead = {
32998c2ecf20Sopenharmony_ci			.base = {
33008c2ecf20Sopenharmony_ci				.cra_name = "rfc7539(chacha20,poly1305)",
33018c2ecf20Sopenharmony_ci				.cra_driver_name = "rfc7539-chacha20-poly1305-"
33028c2ecf20Sopenharmony_ci						   "caam",
33038c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
33048c2ecf20Sopenharmony_ci			},
33058c2ecf20Sopenharmony_ci			.setkey = chachapoly_setkey,
33068c2ecf20Sopenharmony_ci			.setauthsize = chachapoly_setauthsize,
33078c2ecf20Sopenharmony_ci			.encrypt = chachapoly_encrypt,
33088c2ecf20Sopenharmony_ci			.decrypt = chachapoly_decrypt,
33098c2ecf20Sopenharmony_ci			.ivsize = CHACHAPOLY_IV_SIZE,
33108c2ecf20Sopenharmony_ci			.maxauthsize = POLY1305_DIGEST_SIZE,
33118c2ecf20Sopenharmony_ci		},
33128c2ecf20Sopenharmony_ci		.caam = {
33138c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_CHACHA20 |
33148c2ecf20Sopenharmony_ci					   OP_ALG_AAI_AEAD,
33158c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_POLY1305 |
33168c2ecf20Sopenharmony_ci					   OP_ALG_AAI_AEAD,
33178c2ecf20Sopenharmony_ci			.nodkp = true,
33188c2ecf20Sopenharmony_ci		},
33198c2ecf20Sopenharmony_ci	},
33208c2ecf20Sopenharmony_ci	{
33218c2ecf20Sopenharmony_ci		.aead = {
33228c2ecf20Sopenharmony_ci			.base = {
33238c2ecf20Sopenharmony_ci				.cra_name = "rfc7539esp(chacha20,poly1305)",
33248c2ecf20Sopenharmony_ci				.cra_driver_name = "rfc7539esp-chacha20-"
33258c2ecf20Sopenharmony_ci						   "poly1305-caam",
33268c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
33278c2ecf20Sopenharmony_ci			},
33288c2ecf20Sopenharmony_ci			.setkey = chachapoly_setkey,
33298c2ecf20Sopenharmony_ci			.setauthsize = chachapoly_setauthsize,
33308c2ecf20Sopenharmony_ci			.encrypt = chachapoly_encrypt,
33318c2ecf20Sopenharmony_ci			.decrypt = chachapoly_decrypt,
33328c2ecf20Sopenharmony_ci			.ivsize = 8,
33338c2ecf20Sopenharmony_ci			.maxauthsize = POLY1305_DIGEST_SIZE,
33348c2ecf20Sopenharmony_ci		},
33358c2ecf20Sopenharmony_ci		.caam = {
33368c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_CHACHA20 |
33378c2ecf20Sopenharmony_ci					   OP_ALG_AAI_AEAD,
33388c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_POLY1305 |
33398c2ecf20Sopenharmony_ci					   OP_ALG_AAI_AEAD,
33408c2ecf20Sopenharmony_ci			.nodkp = true,
33418c2ecf20Sopenharmony_ci		},
33428c2ecf20Sopenharmony_ci	},
33438c2ecf20Sopenharmony_ci};
33448c2ecf20Sopenharmony_ci
33458c2ecf20Sopenharmony_cistatic int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam,
33468c2ecf20Sopenharmony_ci			    bool uses_dkp)
33478c2ecf20Sopenharmony_ci{
33488c2ecf20Sopenharmony_ci	dma_addr_t dma_addr;
33498c2ecf20Sopenharmony_ci	struct caam_drv_private *priv;
33508c2ecf20Sopenharmony_ci	const size_t sh_desc_enc_offset = offsetof(struct caam_ctx,
33518c2ecf20Sopenharmony_ci						   sh_desc_enc);
33528c2ecf20Sopenharmony_ci
33538c2ecf20Sopenharmony_ci	ctx->jrdev = caam_jr_alloc();
33548c2ecf20Sopenharmony_ci	if (IS_ERR(ctx->jrdev)) {
33558c2ecf20Sopenharmony_ci		pr_err("Job Ring Device allocation for transform failed\n");
33568c2ecf20Sopenharmony_ci		return PTR_ERR(ctx->jrdev);
33578c2ecf20Sopenharmony_ci	}
33588c2ecf20Sopenharmony_ci
33598c2ecf20Sopenharmony_ci	priv = dev_get_drvdata(ctx->jrdev->parent);
33608c2ecf20Sopenharmony_ci	if (priv->era >= 6 && uses_dkp)
33618c2ecf20Sopenharmony_ci		ctx->dir = DMA_BIDIRECTIONAL;
33628c2ecf20Sopenharmony_ci	else
33638c2ecf20Sopenharmony_ci		ctx->dir = DMA_TO_DEVICE;
33648c2ecf20Sopenharmony_ci
33658c2ecf20Sopenharmony_ci	dma_addr = dma_map_single_attrs(ctx->jrdev, ctx->sh_desc_enc,
33668c2ecf20Sopenharmony_ci					offsetof(struct caam_ctx,
33678c2ecf20Sopenharmony_ci						 sh_desc_enc_dma) -
33688c2ecf20Sopenharmony_ci					sh_desc_enc_offset,
33698c2ecf20Sopenharmony_ci					ctx->dir, DMA_ATTR_SKIP_CPU_SYNC);
33708c2ecf20Sopenharmony_ci	if (dma_mapping_error(ctx->jrdev, dma_addr)) {
33718c2ecf20Sopenharmony_ci		dev_err(ctx->jrdev, "unable to map key, shared descriptors\n");
33728c2ecf20Sopenharmony_ci		caam_jr_free(ctx->jrdev);
33738c2ecf20Sopenharmony_ci		return -ENOMEM;
33748c2ecf20Sopenharmony_ci	}
33758c2ecf20Sopenharmony_ci
33768c2ecf20Sopenharmony_ci	ctx->sh_desc_enc_dma = dma_addr;
33778c2ecf20Sopenharmony_ci	ctx->sh_desc_dec_dma = dma_addr + offsetof(struct caam_ctx,
33788c2ecf20Sopenharmony_ci						   sh_desc_dec) -
33798c2ecf20Sopenharmony_ci					sh_desc_enc_offset;
33808c2ecf20Sopenharmony_ci	ctx->key_dma = dma_addr + offsetof(struct caam_ctx, key) -
33818c2ecf20Sopenharmony_ci					sh_desc_enc_offset;
33828c2ecf20Sopenharmony_ci
33838c2ecf20Sopenharmony_ci	/* copy descriptor header template value */
33848c2ecf20Sopenharmony_ci	ctx->cdata.algtype = OP_TYPE_CLASS1_ALG | caam->class1_alg_type;
33858c2ecf20Sopenharmony_ci	ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam->class2_alg_type;
33868c2ecf20Sopenharmony_ci
33878c2ecf20Sopenharmony_ci	return 0;
33888c2ecf20Sopenharmony_ci}
33898c2ecf20Sopenharmony_ci
33908c2ecf20Sopenharmony_cistatic int caam_cra_init(struct crypto_skcipher *tfm)
33918c2ecf20Sopenharmony_ci{
33928c2ecf20Sopenharmony_ci	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
33938c2ecf20Sopenharmony_ci	struct caam_skcipher_alg *caam_alg =
33948c2ecf20Sopenharmony_ci		container_of(alg, typeof(*caam_alg), skcipher);
33958c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(tfm);
33968c2ecf20Sopenharmony_ci	u32 alg_aai = caam_alg->caam.class1_alg_type & OP_ALG_AAI_MASK;
33978c2ecf20Sopenharmony_ci	int ret = 0;
33988c2ecf20Sopenharmony_ci
33998c2ecf20Sopenharmony_ci	ctx->enginectx.op.do_one_request = skcipher_do_one_req;
34008c2ecf20Sopenharmony_ci
34018c2ecf20Sopenharmony_ci	if (alg_aai == OP_ALG_AAI_XTS) {
34028c2ecf20Sopenharmony_ci		const char *tfm_name = crypto_tfm_alg_name(&tfm->base);
34038c2ecf20Sopenharmony_ci		struct crypto_skcipher *fallback;
34048c2ecf20Sopenharmony_ci
34058c2ecf20Sopenharmony_ci		fallback = crypto_alloc_skcipher(tfm_name, 0,
34068c2ecf20Sopenharmony_ci						 CRYPTO_ALG_NEED_FALLBACK);
34078c2ecf20Sopenharmony_ci		if (IS_ERR(fallback)) {
34088c2ecf20Sopenharmony_ci			pr_err("Failed to allocate %s fallback: %ld\n",
34098c2ecf20Sopenharmony_ci			       tfm_name, PTR_ERR(fallback));
34108c2ecf20Sopenharmony_ci			return PTR_ERR(fallback);
34118c2ecf20Sopenharmony_ci		}
34128c2ecf20Sopenharmony_ci
34138c2ecf20Sopenharmony_ci		ctx->fallback = fallback;
34148c2ecf20Sopenharmony_ci		crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx) +
34158c2ecf20Sopenharmony_ci					    crypto_skcipher_reqsize(fallback));
34168c2ecf20Sopenharmony_ci	} else {
34178c2ecf20Sopenharmony_ci		crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx));
34188c2ecf20Sopenharmony_ci	}
34198c2ecf20Sopenharmony_ci
34208c2ecf20Sopenharmony_ci	ret = caam_init_common(ctx, &caam_alg->caam, false);
34218c2ecf20Sopenharmony_ci	if (ret && ctx->fallback)
34228c2ecf20Sopenharmony_ci		crypto_free_skcipher(ctx->fallback);
34238c2ecf20Sopenharmony_ci
34248c2ecf20Sopenharmony_ci	return ret;
34258c2ecf20Sopenharmony_ci}
34268c2ecf20Sopenharmony_ci
34278c2ecf20Sopenharmony_cistatic int caam_aead_init(struct crypto_aead *tfm)
34288c2ecf20Sopenharmony_ci{
34298c2ecf20Sopenharmony_ci	struct aead_alg *alg = crypto_aead_alg(tfm);
34308c2ecf20Sopenharmony_ci	struct caam_aead_alg *caam_alg =
34318c2ecf20Sopenharmony_ci		 container_of(alg, struct caam_aead_alg, aead);
34328c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(tfm);
34338c2ecf20Sopenharmony_ci
34348c2ecf20Sopenharmony_ci	crypto_aead_set_reqsize(tfm, sizeof(struct caam_aead_req_ctx));
34358c2ecf20Sopenharmony_ci
34368c2ecf20Sopenharmony_ci	ctx->enginectx.op.do_one_request = aead_do_one_req;
34378c2ecf20Sopenharmony_ci
34388c2ecf20Sopenharmony_ci	return caam_init_common(ctx, &caam_alg->caam, !caam_alg->caam.nodkp);
34398c2ecf20Sopenharmony_ci}
34408c2ecf20Sopenharmony_ci
34418c2ecf20Sopenharmony_cistatic void caam_exit_common(struct caam_ctx *ctx)
34428c2ecf20Sopenharmony_ci{
34438c2ecf20Sopenharmony_ci	dma_unmap_single_attrs(ctx->jrdev, ctx->sh_desc_enc_dma,
34448c2ecf20Sopenharmony_ci			       offsetof(struct caam_ctx, sh_desc_enc_dma) -
34458c2ecf20Sopenharmony_ci			       offsetof(struct caam_ctx, sh_desc_enc),
34468c2ecf20Sopenharmony_ci			       ctx->dir, DMA_ATTR_SKIP_CPU_SYNC);
34478c2ecf20Sopenharmony_ci	caam_jr_free(ctx->jrdev);
34488c2ecf20Sopenharmony_ci}
34498c2ecf20Sopenharmony_ci
34508c2ecf20Sopenharmony_cistatic void caam_cra_exit(struct crypto_skcipher *tfm)
34518c2ecf20Sopenharmony_ci{
34528c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(tfm);
34538c2ecf20Sopenharmony_ci
34548c2ecf20Sopenharmony_ci	if (ctx->fallback)
34558c2ecf20Sopenharmony_ci		crypto_free_skcipher(ctx->fallback);
34568c2ecf20Sopenharmony_ci	caam_exit_common(ctx);
34578c2ecf20Sopenharmony_ci}
34588c2ecf20Sopenharmony_ci
34598c2ecf20Sopenharmony_cistatic void caam_aead_exit(struct crypto_aead *tfm)
34608c2ecf20Sopenharmony_ci{
34618c2ecf20Sopenharmony_ci	caam_exit_common(crypto_aead_ctx(tfm));
34628c2ecf20Sopenharmony_ci}
34638c2ecf20Sopenharmony_ci
34648c2ecf20Sopenharmony_civoid caam_algapi_exit(void)
34658c2ecf20Sopenharmony_ci{
34668c2ecf20Sopenharmony_ci	int i;
34678c2ecf20Sopenharmony_ci
34688c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {
34698c2ecf20Sopenharmony_ci		struct caam_aead_alg *t_alg = driver_aeads + i;
34708c2ecf20Sopenharmony_ci
34718c2ecf20Sopenharmony_ci		if (t_alg->registered)
34728c2ecf20Sopenharmony_ci			crypto_unregister_aead(&t_alg->aead);
34738c2ecf20Sopenharmony_ci	}
34748c2ecf20Sopenharmony_ci
34758c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
34768c2ecf20Sopenharmony_ci		struct caam_skcipher_alg *t_alg = driver_algs + i;
34778c2ecf20Sopenharmony_ci
34788c2ecf20Sopenharmony_ci		if (t_alg->registered)
34798c2ecf20Sopenharmony_ci			crypto_unregister_skcipher(&t_alg->skcipher);
34808c2ecf20Sopenharmony_ci	}
34818c2ecf20Sopenharmony_ci}
34828c2ecf20Sopenharmony_ci
34838c2ecf20Sopenharmony_cistatic void caam_skcipher_alg_init(struct caam_skcipher_alg *t_alg)
34848c2ecf20Sopenharmony_ci{
34858c2ecf20Sopenharmony_ci	struct skcipher_alg *alg = &t_alg->skcipher;
34868c2ecf20Sopenharmony_ci
34878c2ecf20Sopenharmony_ci	alg->base.cra_module = THIS_MODULE;
34888c2ecf20Sopenharmony_ci	alg->base.cra_priority = CAAM_CRA_PRIORITY;
34898c2ecf20Sopenharmony_ci	alg->base.cra_ctxsize = sizeof(struct caam_ctx);
34908c2ecf20Sopenharmony_ci	alg->base.cra_flags |= (CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY |
34918c2ecf20Sopenharmony_ci			      CRYPTO_ALG_KERN_DRIVER_ONLY);
34928c2ecf20Sopenharmony_ci
34938c2ecf20Sopenharmony_ci	alg->init = caam_cra_init;
34948c2ecf20Sopenharmony_ci	alg->exit = caam_cra_exit;
34958c2ecf20Sopenharmony_ci}
34968c2ecf20Sopenharmony_ci
34978c2ecf20Sopenharmony_cistatic void caam_aead_alg_init(struct caam_aead_alg *t_alg)
34988c2ecf20Sopenharmony_ci{
34998c2ecf20Sopenharmony_ci	struct aead_alg *alg = &t_alg->aead;
35008c2ecf20Sopenharmony_ci
35018c2ecf20Sopenharmony_ci	alg->base.cra_module = THIS_MODULE;
35028c2ecf20Sopenharmony_ci	alg->base.cra_priority = CAAM_CRA_PRIORITY;
35038c2ecf20Sopenharmony_ci	alg->base.cra_ctxsize = sizeof(struct caam_ctx);
35048c2ecf20Sopenharmony_ci	alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY |
35058c2ecf20Sopenharmony_ci			      CRYPTO_ALG_KERN_DRIVER_ONLY;
35068c2ecf20Sopenharmony_ci
35078c2ecf20Sopenharmony_ci	alg->init = caam_aead_init;
35088c2ecf20Sopenharmony_ci	alg->exit = caam_aead_exit;
35098c2ecf20Sopenharmony_ci}
35108c2ecf20Sopenharmony_ci
35118c2ecf20Sopenharmony_ciint caam_algapi_init(struct device *ctrldev)
35128c2ecf20Sopenharmony_ci{
35138c2ecf20Sopenharmony_ci	struct caam_drv_private *priv = dev_get_drvdata(ctrldev);
35148c2ecf20Sopenharmony_ci	int i = 0, err = 0;
35158c2ecf20Sopenharmony_ci	u32 aes_vid, aes_inst, des_inst, md_vid, md_inst, ccha_inst, ptha_inst;
35168c2ecf20Sopenharmony_ci	unsigned int md_limit = SHA512_DIGEST_SIZE;
35178c2ecf20Sopenharmony_ci	bool registered = false, gcm_support;
35188c2ecf20Sopenharmony_ci
35198c2ecf20Sopenharmony_ci	/*
35208c2ecf20Sopenharmony_ci	 * Register crypto algorithms the device supports.
35218c2ecf20Sopenharmony_ci	 * First, detect presence and attributes of DES, AES, and MD blocks.
35228c2ecf20Sopenharmony_ci	 */
35238c2ecf20Sopenharmony_ci	if (priv->era < 10) {
35248c2ecf20Sopenharmony_ci		u32 cha_vid, cha_inst, aes_rn;
35258c2ecf20Sopenharmony_ci
35268c2ecf20Sopenharmony_ci		cha_vid = rd_reg32(&priv->ctrl->perfmon.cha_id_ls);
35278c2ecf20Sopenharmony_ci		aes_vid = cha_vid & CHA_ID_LS_AES_MASK;
35288c2ecf20Sopenharmony_ci		md_vid = (cha_vid & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT;
35298c2ecf20Sopenharmony_ci
35308c2ecf20Sopenharmony_ci		cha_inst = rd_reg32(&priv->ctrl->perfmon.cha_num_ls);
35318c2ecf20Sopenharmony_ci		des_inst = (cha_inst & CHA_ID_LS_DES_MASK) >>
35328c2ecf20Sopenharmony_ci			   CHA_ID_LS_DES_SHIFT;
35338c2ecf20Sopenharmony_ci		aes_inst = cha_inst & CHA_ID_LS_AES_MASK;
35348c2ecf20Sopenharmony_ci		md_inst = (cha_inst & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT;
35358c2ecf20Sopenharmony_ci		ccha_inst = 0;
35368c2ecf20Sopenharmony_ci		ptha_inst = 0;
35378c2ecf20Sopenharmony_ci
35388c2ecf20Sopenharmony_ci		aes_rn = rd_reg32(&priv->ctrl->perfmon.cha_rev_ls) &
35398c2ecf20Sopenharmony_ci			 CHA_ID_LS_AES_MASK;
35408c2ecf20Sopenharmony_ci		gcm_support = !(aes_vid == CHA_VER_VID_AES_LP && aes_rn < 8);
35418c2ecf20Sopenharmony_ci	} else {
35428c2ecf20Sopenharmony_ci		u32 aesa, mdha;
35438c2ecf20Sopenharmony_ci
35448c2ecf20Sopenharmony_ci		aesa = rd_reg32(&priv->ctrl->vreg.aesa);
35458c2ecf20Sopenharmony_ci		mdha = rd_reg32(&priv->ctrl->vreg.mdha);
35468c2ecf20Sopenharmony_ci
35478c2ecf20Sopenharmony_ci		aes_vid = (aesa & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT;
35488c2ecf20Sopenharmony_ci		md_vid = (mdha & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT;
35498c2ecf20Sopenharmony_ci
35508c2ecf20Sopenharmony_ci		des_inst = rd_reg32(&priv->ctrl->vreg.desa) & CHA_VER_NUM_MASK;
35518c2ecf20Sopenharmony_ci		aes_inst = aesa & CHA_VER_NUM_MASK;
35528c2ecf20Sopenharmony_ci		md_inst = mdha & CHA_VER_NUM_MASK;
35538c2ecf20Sopenharmony_ci		ccha_inst = rd_reg32(&priv->ctrl->vreg.ccha) & CHA_VER_NUM_MASK;
35548c2ecf20Sopenharmony_ci		ptha_inst = rd_reg32(&priv->ctrl->vreg.ptha) & CHA_VER_NUM_MASK;
35558c2ecf20Sopenharmony_ci
35568c2ecf20Sopenharmony_ci		gcm_support = aesa & CHA_VER_MISC_AES_GCM;
35578c2ecf20Sopenharmony_ci	}
35588c2ecf20Sopenharmony_ci
35598c2ecf20Sopenharmony_ci	/* If MD is present, limit digest size based on LP256 */
35608c2ecf20Sopenharmony_ci	if (md_inst && md_vid  == CHA_VER_VID_MD_LP256)
35618c2ecf20Sopenharmony_ci		md_limit = SHA256_DIGEST_SIZE;
35628c2ecf20Sopenharmony_ci
35638c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
35648c2ecf20Sopenharmony_ci		struct caam_skcipher_alg *t_alg = driver_algs + i;
35658c2ecf20Sopenharmony_ci		u32 alg_sel = t_alg->caam.class1_alg_type & OP_ALG_ALGSEL_MASK;
35668c2ecf20Sopenharmony_ci
35678c2ecf20Sopenharmony_ci		/* Skip DES algorithms if not supported by device */
35688c2ecf20Sopenharmony_ci		if (!des_inst &&
35698c2ecf20Sopenharmony_ci		    ((alg_sel == OP_ALG_ALGSEL_3DES) ||
35708c2ecf20Sopenharmony_ci		     (alg_sel == OP_ALG_ALGSEL_DES)))
35718c2ecf20Sopenharmony_ci				continue;
35728c2ecf20Sopenharmony_ci
35738c2ecf20Sopenharmony_ci		/* Skip AES algorithms if not supported by device */
35748c2ecf20Sopenharmony_ci		if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES))
35758c2ecf20Sopenharmony_ci				continue;
35768c2ecf20Sopenharmony_ci
35778c2ecf20Sopenharmony_ci		/*
35788c2ecf20Sopenharmony_ci		 * Check support for AES modes not available
35798c2ecf20Sopenharmony_ci		 * on LP devices.
35808c2ecf20Sopenharmony_ci		 */
35818c2ecf20Sopenharmony_ci		if (aes_vid == CHA_VER_VID_AES_LP &&
35828c2ecf20Sopenharmony_ci		    (t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK) ==
35838c2ecf20Sopenharmony_ci		    OP_ALG_AAI_XTS)
35848c2ecf20Sopenharmony_ci			continue;
35858c2ecf20Sopenharmony_ci
35868c2ecf20Sopenharmony_ci		caam_skcipher_alg_init(t_alg);
35878c2ecf20Sopenharmony_ci
35888c2ecf20Sopenharmony_ci		err = crypto_register_skcipher(&t_alg->skcipher);
35898c2ecf20Sopenharmony_ci		if (err) {
35908c2ecf20Sopenharmony_ci			pr_warn("%s alg registration failed\n",
35918c2ecf20Sopenharmony_ci				t_alg->skcipher.base.cra_driver_name);
35928c2ecf20Sopenharmony_ci			continue;
35938c2ecf20Sopenharmony_ci		}
35948c2ecf20Sopenharmony_ci
35958c2ecf20Sopenharmony_ci		t_alg->registered = true;
35968c2ecf20Sopenharmony_ci		registered = true;
35978c2ecf20Sopenharmony_ci	}
35988c2ecf20Sopenharmony_ci
35998c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {
36008c2ecf20Sopenharmony_ci		struct caam_aead_alg *t_alg = driver_aeads + i;
36018c2ecf20Sopenharmony_ci		u32 c1_alg_sel = t_alg->caam.class1_alg_type &
36028c2ecf20Sopenharmony_ci				 OP_ALG_ALGSEL_MASK;
36038c2ecf20Sopenharmony_ci		u32 c2_alg_sel = t_alg->caam.class2_alg_type &
36048c2ecf20Sopenharmony_ci				 OP_ALG_ALGSEL_MASK;
36058c2ecf20Sopenharmony_ci		u32 alg_aai = t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK;
36068c2ecf20Sopenharmony_ci
36078c2ecf20Sopenharmony_ci		/* Skip DES algorithms if not supported by device */
36088c2ecf20Sopenharmony_ci		if (!des_inst &&
36098c2ecf20Sopenharmony_ci		    ((c1_alg_sel == OP_ALG_ALGSEL_3DES) ||
36108c2ecf20Sopenharmony_ci		     (c1_alg_sel == OP_ALG_ALGSEL_DES)))
36118c2ecf20Sopenharmony_ci				continue;
36128c2ecf20Sopenharmony_ci
36138c2ecf20Sopenharmony_ci		/* Skip AES algorithms if not supported by device */
36148c2ecf20Sopenharmony_ci		if (!aes_inst && (c1_alg_sel == OP_ALG_ALGSEL_AES))
36158c2ecf20Sopenharmony_ci				continue;
36168c2ecf20Sopenharmony_ci
36178c2ecf20Sopenharmony_ci		/* Skip CHACHA20 algorithms if not supported by device */
36188c2ecf20Sopenharmony_ci		if (c1_alg_sel == OP_ALG_ALGSEL_CHACHA20 && !ccha_inst)
36198c2ecf20Sopenharmony_ci			continue;
36208c2ecf20Sopenharmony_ci
36218c2ecf20Sopenharmony_ci		/* Skip POLY1305 algorithms if not supported by device */
36228c2ecf20Sopenharmony_ci		if (c2_alg_sel == OP_ALG_ALGSEL_POLY1305 && !ptha_inst)
36238c2ecf20Sopenharmony_ci			continue;
36248c2ecf20Sopenharmony_ci
36258c2ecf20Sopenharmony_ci		/* Skip GCM algorithms if not supported by device */
36268c2ecf20Sopenharmony_ci		if (c1_alg_sel == OP_ALG_ALGSEL_AES &&
36278c2ecf20Sopenharmony_ci		    alg_aai == OP_ALG_AAI_GCM && !gcm_support)
36288c2ecf20Sopenharmony_ci			continue;
36298c2ecf20Sopenharmony_ci
36308c2ecf20Sopenharmony_ci		/*
36318c2ecf20Sopenharmony_ci		 * Skip algorithms requiring message digests
36328c2ecf20Sopenharmony_ci		 * if MD or MD size is not supported by device.
36338c2ecf20Sopenharmony_ci		 */
36348c2ecf20Sopenharmony_ci		if (is_mdha(c2_alg_sel) &&
36358c2ecf20Sopenharmony_ci		    (!md_inst || t_alg->aead.maxauthsize > md_limit))
36368c2ecf20Sopenharmony_ci			continue;
36378c2ecf20Sopenharmony_ci
36388c2ecf20Sopenharmony_ci		caam_aead_alg_init(t_alg);
36398c2ecf20Sopenharmony_ci
36408c2ecf20Sopenharmony_ci		err = crypto_register_aead(&t_alg->aead);
36418c2ecf20Sopenharmony_ci		if (err) {
36428c2ecf20Sopenharmony_ci			pr_warn("%s alg registration failed\n",
36438c2ecf20Sopenharmony_ci				t_alg->aead.base.cra_driver_name);
36448c2ecf20Sopenharmony_ci			continue;
36458c2ecf20Sopenharmony_ci		}
36468c2ecf20Sopenharmony_ci
36478c2ecf20Sopenharmony_ci		t_alg->registered = true;
36488c2ecf20Sopenharmony_ci		registered = true;
36498c2ecf20Sopenharmony_ci	}
36508c2ecf20Sopenharmony_ci
36518c2ecf20Sopenharmony_ci	if (registered)
36528c2ecf20Sopenharmony_ci		pr_info("caam algorithms registered in /proc/crypto\n");
36538c2ecf20Sopenharmony_ci
36548c2ecf20Sopenharmony_ci	return err;
36558c2ecf20Sopenharmony_ci}
3656