18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright 2015-2016 Freescale Semiconductor Inc.
48c2ecf20Sopenharmony_ci * Copyright 2017-2019 NXP
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include "compat.h"
88c2ecf20Sopenharmony_ci#include "regs.h"
98c2ecf20Sopenharmony_ci#include "caamalg_qi2.h"
108c2ecf20Sopenharmony_ci#include "dpseci_cmd.h"
118c2ecf20Sopenharmony_ci#include "desc_constr.h"
128c2ecf20Sopenharmony_ci#include "error.h"
138c2ecf20Sopenharmony_ci#include "sg_sw_sec4.h"
148c2ecf20Sopenharmony_ci#include "sg_sw_qm2.h"
158c2ecf20Sopenharmony_ci#include "key_gen.h"
168c2ecf20Sopenharmony_ci#include "caamalg_desc.h"
178c2ecf20Sopenharmony_ci#include "caamhash_desc.h"
188c2ecf20Sopenharmony_ci#include "dpseci-debugfs.h"
198c2ecf20Sopenharmony_ci#include <linux/fsl/mc.h>
208c2ecf20Sopenharmony_ci#include <soc/fsl/dpaa2-io.h>
218c2ecf20Sopenharmony_ci#include <soc/fsl/dpaa2-fd.h>
228c2ecf20Sopenharmony_ci#include <crypto/xts.h>
238c2ecf20Sopenharmony_ci#include <asm/unaligned.h>
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci#define CAAM_CRA_PRIORITY	2000
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci/* max key is sum of AES_MAX_KEY_SIZE, max split key size */
288c2ecf20Sopenharmony_ci#define CAAM_MAX_KEY_SIZE	(AES_MAX_KEY_SIZE + CTR_RFC3686_NONCE_SIZE + \
298c2ecf20Sopenharmony_ci				 SHA512_DIGEST_SIZE * 2)
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci/*
328c2ecf20Sopenharmony_ci * This is a a cache of buffers, from which the users of CAAM QI driver
338c2ecf20Sopenharmony_ci * can allocate short buffers. It's speedier than doing kmalloc on the hotpath.
348c2ecf20Sopenharmony_ci * NOTE: A more elegant solution would be to have some headroom in the frames
358c2ecf20Sopenharmony_ci *       being processed. This can be added by the dpaa2-eth driver. This would
368c2ecf20Sopenharmony_ci *       pose a problem for userspace application processing which cannot
378c2ecf20Sopenharmony_ci *       know of this limitation. So for now, this will work.
388c2ecf20Sopenharmony_ci * NOTE: The memcache is SMP-safe. No need to handle spinlocks in-here
398c2ecf20Sopenharmony_ci */
408c2ecf20Sopenharmony_cistatic struct kmem_cache *qi_cache;
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_cistruct caam_alg_entry {
438c2ecf20Sopenharmony_ci	struct device *dev;
448c2ecf20Sopenharmony_ci	int class1_alg_type;
458c2ecf20Sopenharmony_ci	int class2_alg_type;
468c2ecf20Sopenharmony_ci	bool rfc3686;
478c2ecf20Sopenharmony_ci	bool geniv;
488c2ecf20Sopenharmony_ci	bool nodkp;
498c2ecf20Sopenharmony_ci};
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cistruct caam_aead_alg {
528c2ecf20Sopenharmony_ci	struct aead_alg aead;
538c2ecf20Sopenharmony_ci	struct caam_alg_entry caam;
548c2ecf20Sopenharmony_ci	bool registered;
558c2ecf20Sopenharmony_ci};
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_cistruct caam_skcipher_alg {
588c2ecf20Sopenharmony_ci	struct skcipher_alg skcipher;
598c2ecf20Sopenharmony_ci	struct caam_alg_entry caam;
608c2ecf20Sopenharmony_ci	bool registered;
618c2ecf20Sopenharmony_ci};
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci/**
648c2ecf20Sopenharmony_ci * struct caam_ctx - per-session context
658c2ecf20Sopenharmony_ci * @flc: Flow Contexts array
668c2ecf20Sopenharmony_ci * @key:  [authentication key], encryption key
678c2ecf20Sopenharmony_ci * @flc_dma: I/O virtual addresses of the Flow Contexts
688c2ecf20Sopenharmony_ci * @key_dma: I/O virtual address of the key
698c2ecf20Sopenharmony_ci * @dir: DMA direction for mapping key and Flow Contexts
708c2ecf20Sopenharmony_ci * @dev: dpseci device
718c2ecf20Sopenharmony_ci * @adata: authentication algorithm details
728c2ecf20Sopenharmony_ci * @cdata: encryption algorithm details
738c2ecf20Sopenharmony_ci * @authsize: authentication tag (a.k.a. ICV / MAC) size
748c2ecf20Sopenharmony_ci */
758c2ecf20Sopenharmony_cistruct caam_ctx {
768c2ecf20Sopenharmony_ci	struct caam_flc flc[NUM_OP];
778c2ecf20Sopenharmony_ci	u8 key[CAAM_MAX_KEY_SIZE];
788c2ecf20Sopenharmony_ci	dma_addr_t flc_dma[NUM_OP];
798c2ecf20Sopenharmony_ci	dma_addr_t key_dma;
808c2ecf20Sopenharmony_ci	enum dma_data_direction dir;
818c2ecf20Sopenharmony_ci	struct device *dev;
828c2ecf20Sopenharmony_ci	struct alginfo adata;
838c2ecf20Sopenharmony_ci	struct alginfo cdata;
848c2ecf20Sopenharmony_ci	unsigned int authsize;
858c2ecf20Sopenharmony_ci	bool xts_key_fallback;
868c2ecf20Sopenharmony_ci	struct crypto_skcipher *fallback;
878c2ecf20Sopenharmony_ci};
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_cistatic void *dpaa2_caam_iova_to_virt(struct dpaa2_caam_priv *priv,
908c2ecf20Sopenharmony_ci				     dma_addr_t iova_addr)
918c2ecf20Sopenharmony_ci{
928c2ecf20Sopenharmony_ci	phys_addr_t phys_addr;
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci	phys_addr = priv->domain ? iommu_iova_to_phys(priv->domain, iova_addr) :
958c2ecf20Sopenharmony_ci				   iova_addr;
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci	return phys_to_virt(phys_addr);
988c2ecf20Sopenharmony_ci}
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci/*
1018c2ecf20Sopenharmony_ci * qi_cache_zalloc - Allocate buffers from CAAM-QI cache
1028c2ecf20Sopenharmony_ci *
1038c2ecf20Sopenharmony_ci * Allocate data on the hotpath. Instead of using kzalloc, one can use the
1048c2ecf20Sopenharmony_ci * services of the CAAM QI memory cache (backed by kmem_cache). The buffers
1058c2ecf20Sopenharmony_ci * will have a size of CAAM_QI_MEMCACHE_SIZE, which should be sufficient for
1068c2ecf20Sopenharmony_ci * hosting 16 SG entries.
1078c2ecf20Sopenharmony_ci *
1088c2ecf20Sopenharmony_ci * @flags - flags that would be used for the equivalent kmalloc(..) call
1098c2ecf20Sopenharmony_ci *
1108c2ecf20Sopenharmony_ci * Returns a pointer to a retrieved buffer on success or NULL on failure.
1118c2ecf20Sopenharmony_ci */
1128c2ecf20Sopenharmony_cistatic inline void *qi_cache_zalloc(gfp_t flags)
1138c2ecf20Sopenharmony_ci{
1148c2ecf20Sopenharmony_ci	return kmem_cache_zalloc(qi_cache, flags);
1158c2ecf20Sopenharmony_ci}
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci/*
1188c2ecf20Sopenharmony_ci * qi_cache_free - Frees buffers allocated from CAAM-QI cache
1198c2ecf20Sopenharmony_ci *
1208c2ecf20Sopenharmony_ci * @obj - buffer previously allocated by qi_cache_zalloc
1218c2ecf20Sopenharmony_ci *
1228c2ecf20Sopenharmony_ci * No checking is being done, the call is a passthrough call to
1238c2ecf20Sopenharmony_ci * kmem_cache_free(...)
1248c2ecf20Sopenharmony_ci */
1258c2ecf20Sopenharmony_cistatic inline void qi_cache_free(void *obj)
1268c2ecf20Sopenharmony_ci{
1278c2ecf20Sopenharmony_ci	kmem_cache_free(qi_cache, obj);
1288c2ecf20Sopenharmony_ci}
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_cistatic struct caam_request *to_caam_req(struct crypto_async_request *areq)
1318c2ecf20Sopenharmony_ci{
1328c2ecf20Sopenharmony_ci	switch (crypto_tfm_alg_type(areq->tfm)) {
1338c2ecf20Sopenharmony_ci	case CRYPTO_ALG_TYPE_SKCIPHER:
1348c2ecf20Sopenharmony_ci		return skcipher_request_ctx(skcipher_request_cast(areq));
1358c2ecf20Sopenharmony_ci	case CRYPTO_ALG_TYPE_AEAD:
1368c2ecf20Sopenharmony_ci		return aead_request_ctx(container_of(areq, struct aead_request,
1378c2ecf20Sopenharmony_ci						     base));
1388c2ecf20Sopenharmony_ci	case CRYPTO_ALG_TYPE_AHASH:
1398c2ecf20Sopenharmony_ci		return ahash_request_ctx(ahash_request_cast(areq));
1408c2ecf20Sopenharmony_ci	default:
1418c2ecf20Sopenharmony_ci		return ERR_PTR(-EINVAL);
1428c2ecf20Sopenharmony_ci	}
1438c2ecf20Sopenharmony_ci}
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_cistatic void caam_unmap(struct device *dev, struct scatterlist *src,
1468c2ecf20Sopenharmony_ci		       struct scatterlist *dst, int src_nents,
1478c2ecf20Sopenharmony_ci		       int dst_nents, dma_addr_t iv_dma, int ivsize,
1488c2ecf20Sopenharmony_ci		       enum dma_data_direction iv_dir, dma_addr_t qm_sg_dma,
1498c2ecf20Sopenharmony_ci		       int qm_sg_bytes)
1508c2ecf20Sopenharmony_ci{
1518c2ecf20Sopenharmony_ci	if (dst != src) {
1528c2ecf20Sopenharmony_ci		if (src_nents)
1538c2ecf20Sopenharmony_ci			dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE);
1548c2ecf20Sopenharmony_ci		if (dst_nents)
1558c2ecf20Sopenharmony_ci			dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE);
1568c2ecf20Sopenharmony_ci	} else {
1578c2ecf20Sopenharmony_ci		dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL);
1588c2ecf20Sopenharmony_ci	}
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci	if (iv_dma)
1618c2ecf20Sopenharmony_ci		dma_unmap_single(dev, iv_dma, ivsize, iv_dir);
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	if (qm_sg_bytes)
1648c2ecf20Sopenharmony_ci		dma_unmap_single(dev, qm_sg_dma, qm_sg_bytes, DMA_TO_DEVICE);
1658c2ecf20Sopenharmony_ci}
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_cistatic int aead_set_sh_desc(struct crypto_aead *aead)
1688c2ecf20Sopenharmony_ci{
1698c2ecf20Sopenharmony_ci	struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),
1708c2ecf20Sopenharmony_ci						 typeof(*alg), aead);
1718c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
1728c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
1738c2ecf20Sopenharmony_ci	struct device *dev = ctx->dev;
1748c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv *priv = dev_get_drvdata(dev);
1758c2ecf20Sopenharmony_ci	struct caam_flc *flc;
1768c2ecf20Sopenharmony_ci	u32 *desc;
1778c2ecf20Sopenharmony_ci	u32 ctx1_iv_off = 0;
1788c2ecf20Sopenharmony_ci	u32 *nonce = NULL;
1798c2ecf20Sopenharmony_ci	unsigned int data_len[2];
1808c2ecf20Sopenharmony_ci	u32 inl_mask;
1818c2ecf20Sopenharmony_ci	const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) ==
1828c2ecf20Sopenharmony_ci			       OP_ALG_AAI_CTR_MOD128);
1838c2ecf20Sopenharmony_ci	const bool is_rfc3686 = alg->caam.rfc3686;
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen || !ctx->authsize)
1868c2ecf20Sopenharmony_ci		return 0;
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ci	/*
1898c2ecf20Sopenharmony_ci	 * AES-CTR needs to load IV in CONTEXT1 reg
1908c2ecf20Sopenharmony_ci	 * at an offset of 128bits (16bytes)
1918c2ecf20Sopenharmony_ci	 * CONTEXT1[255:128] = IV
1928c2ecf20Sopenharmony_ci	 */
1938c2ecf20Sopenharmony_ci	if (ctr_mode)
1948c2ecf20Sopenharmony_ci		ctx1_iv_off = 16;
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ci	/*
1978c2ecf20Sopenharmony_ci	 * RFC3686 specific:
1988c2ecf20Sopenharmony_ci	 *	CONTEXT1[255:128] = {NONCE, IV, COUNTER}
1998c2ecf20Sopenharmony_ci	 */
2008c2ecf20Sopenharmony_ci	if (is_rfc3686) {
2018c2ecf20Sopenharmony_ci		ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;
2028c2ecf20Sopenharmony_ci		nonce = (u32 *)((void *)ctx->key + ctx->adata.keylen_pad +
2038c2ecf20Sopenharmony_ci				ctx->cdata.keylen - CTR_RFC3686_NONCE_SIZE);
2048c2ecf20Sopenharmony_ci	}
2058c2ecf20Sopenharmony_ci
2068c2ecf20Sopenharmony_ci	/*
2078c2ecf20Sopenharmony_ci	 * In case |user key| > |derived key|, using DKP<imm,imm> would result
2088c2ecf20Sopenharmony_ci	 * in invalid opcodes (last bytes of user key) in the resulting
2098c2ecf20Sopenharmony_ci	 * descriptor. Use DKP<ptr,imm> instead => both virtual and dma key
2108c2ecf20Sopenharmony_ci	 * addresses are needed.
2118c2ecf20Sopenharmony_ci	 */
2128c2ecf20Sopenharmony_ci	ctx->adata.key_virt = ctx->key;
2138c2ecf20Sopenharmony_ci	ctx->adata.key_dma = ctx->key_dma;
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = ctx->key + ctx->adata.keylen_pad;
2168c2ecf20Sopenharmony_ci	ctx->cdata.key_dma = ctx->key_dma + ctx->adata.keylen_pad;
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci	data_len[0] = ctx->adata.keylen_pad;
2198c2ecf20Sopenharmony_ci	data_len[1] = ctx->cdata.keylen;
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ci	/* aead_encrypt shared descriptor */
2228c2ecf20Sopenharmony_ci	if (desc_inline_query((alg->caam.geniv ? DESC_QI_AEAD_GIVENC_LEN :
2238c2ecf20Sopenharmony_ci						 DESC_QI_AEAD_ENC_LEN) +
2248c2ecf20Sopenharmony_ci			      (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
2258c2ecf20Sopenharmony_ci			      DESC_JOB_IO_LEN, data_len, &inl_mask,
2268c2ecf20Sopenharmony_ci			      ARRAY_SIZE(data_len)) < 0)
2278c2ecf20Sopenharmony_ci		return -EINVAL;
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_ci	ctx->adata.key_inline = !!(inl_mask & 1);
2308c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = !!(inl_mask & 2);
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_ci	flc = &ctx->flc[ENCRYPT];
2338c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci	if (alg->caam.geniv)
2368c2ecf20Sopenharmony_ci		cnstr_shdsc_aead_givencap(desc, &ctx->cdata, &ctx->adata,
2378c2ecf20Sopenharmony_ci					  ivsize, ctx->authsize, is_rfc3686,
2388c2ecf20Sopenharmony_ci					  nonce, ctx1_iv_off, true,
2398c2ecf20Sopenharmony_ci					  priv->sec_attr.era);
2408c2ecf20Sopenharmony_ci	else
2418c2ecf20Sopenharmony_ci		cnstr_shdsc_aead_encap(desc, &ctx->cdata, &ctx->adata,
2428c2ecf20Sopenharmony_ci				       ivsize, ctx->authsize, is_rfc3686, nonce,
2438c2ecf20Sopenharmony_ci				       ctx1_iv_off, true, priv->sec_attr.era);
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
2468c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],
2478c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
2488c2ecf20Sopenharmony_ci				   ctx->dir);
2498c2ecf20Sopenharmony_ci
2508c2ecf20Sopenharmony_ci	/* aead_decrypt shared descriptor */
2518c2ecf20Sopenharmony_ci	if (desc_inline_query(DESC_QI_AEAD_DEC_LEN +
2528c2ecf20Sopenharmony_ci			      (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
2538c2ecf20Sopenharmony_ci			      DESC_JOB_IO_LEN, data_len, &inl_mask,
2548c2ecf20Sopenharmony_ci			      ARRAY_SIZE(data_len)) < 0)
2558c2ecf20Sopenharmony_ci		return -EINVAL;
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_ci	ctx->adata.key_inline = !!(inl_mask & 1);
2588c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = !!(inl_mask & 2);
2598c2ecf20Sopenharmony_ci
2608c2ecf20Sopenharmony_ci	flc = &ctx->flc[DECRYPT];
2618c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
2628c2ecf20Sopenharmony_ci	cnstr_shdsc_aead_decap(desc, &ctx->cdata, &ctx->adata,
2638c2ecf20Sopenharmony_ci			       ivsize, ctx->authsize, alg->caam.geniv,
2648c2ecf20Sopenharmony_ci			       is_rfc3686, nonce, ctx1_iv_off, true,
2658c2ecf20Sopenharmony_ci			       priv->sec_attr.era);
2668c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
2678c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],
2688c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
2698c2ecf20Sopenharmony_ci				   ctx->dir);
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_ci	return 0;
2728c2ecf20Sopenharmony_ci}
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_cistatic int aead_setauthsize(struct crypto_aead *authenc, unsigned int authsize)
2758c2ecf20Sopenharmony_ci{
2768c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
2778c2ecf20Sopenharmony_ci
2788c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
2798c2ecf20Sopenharmony_ci	aead_set_sh_desc(authenc);
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_ci	return 0;
2828c2ecf20Sopenharmony_ci}
2838c2ecf20Sopenharmony_ci
2848c2ecf20Sopenharmony_cistatic int aead_setkey(struct crypto_aead *aead, const u8 *key,
2858c2ecf20Sopenharmony_ci		       unsigned int keylen)
2868c2ecf20Sopenharmony_ci{
2878c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
2888c2ecf20Sopenharmony_ci	struct device *dev = ctx->dev;
2898c2ecf20Sopenharmony_ci	struct crypto_authenc_keys keys;
2908c2ecf20Sopenharmony_ci
2918c2ecf20Sopenharmony_ci	if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
2928c2ecf20Sopenharmony_ci		goto badkey;
2938c2ecf20Sopenharmony_ci
2948c2ecf20Sopenharmony_ci	dev_dbg(dev, "keylen %d enckeylen %d authkeylen %d\n",
2958c2ecf20Sopenharmony_ci		keys.authkeylen + keys.enckeylen, keys.enckeylen,
2968c2ecf20Sopenharmony_ci		keys.authkeylen);
2978c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",
2988c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_ci	ctx->adata.keylen = keys.authkeylen;
3018c2ecf20Sopenharmony_ci	ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype &
3028c2ecf20Sopenharmony_ci					      OP_ALG_ALGSEL_MASK);
3038c2ecf20Sopenharmony_ci
3048c2ecf20Sopenharmony_ci	if (ctx->adata.keylen_pad + keys.enckeylen > CAAM_MAX_KEY_SIZE)
3058c2ecf20Sopenharmony_ci		goto badkey;
3068c2ecf20Sopenharmony_ci
3078c2ecf20Sopenharmony_ci	memcpy(ctx->key, keys.authkey, keys.authkeylen);
3088c2ecf20Sopenharmony_ci	memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, keys.enckeylen);
3098c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->key_dma, ctx->adata.keylen_pad +
3108c2ecf20Sopenharmony_ci				   keys.enckeylen, ctx->dir);
3118c2ecf20Sopenharmony_ci	print_hex_dump_debug("ctx.key@" __stringify(__LINE__)": ",
3128c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, ctx->key,
3138c2ecf20Sopenharmony_ci			     ctx->adata.keylen_pad + keys.enckeylen, 1);
3148c2ecf20Sopenharmony_ci
3158c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keys.enckeylen;
3168c2ecf20Sopenharmony_ci
3178c2ecf20Sopenharmony_ci	memzero_explicit(&keys, sizeof(keys));
3188c2ecf20Sopenharmony_ci	return aead_set_sh_desc(aead);
3198c2ecf20Sopenharmony_cibadkey:
3208c2ecf20Sopenharmony_ci	memzero_explicit(&keys, sizeof(keys));
3218c2ecf20Sopenharmony_ci	return -EINVAL;
3228c2ecf20Sopenharmony_ci}
3238c2ecf20Sopenharmony_ci
3248c2ecf20Sopenharmony_cistatic int des3_aead_setkey(struct crypto_aead *aead, const u8 *key,
3258c2ecf20Sopenharmony_ci			    unsigned int keylen)
3268c2ecf20Sopenharmony_ci{
3278c2ecf20Sopenharmony_ci	struct crypto_authenc_keys keys;
3288c2ecf20Sopenharmony_ci	int err;
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_ci	err = crypto_authenc_extractkeys(&keys, key, keylen);
3318c2ecf20Sopenharmony_ci	if (unlikely(err))
3328c2ecf20Sopenharmony_ci		goto out;
3338c2ecf20Sopenharmony_ci
3348c2ecf20Sopenharmony_ci	err = -EINVAL;
3358c2ecf20Sopenharmony_ci	if (keys.enckeylen != DES3_EDE_KEY_SIZE)
3368c2ecf20Sopenharmony_ci		goto out;
3378c2ecf20Sopenharmony_ci
3388c2ecf20Sopenharmony_ci	err = crypto_des3_ede_verify_key(crypto_aead_tfm(aead), keys.enckey) ?:
3398c2ecf20Sopenharmony_ci	      aead_setkey(aead, key, keylen);
3408c2ecf20Sopenharmony_ci
3418c2ecf20Sopenharmony_ciout:
3428c2ecf20Sopenharmony_ci	memzero_explicit(&keys, sizeof(keys));
3438c2ecf20Sopenharmony_ci	return err;
3448c2ecf20Sopenharmony_ci}
3458c2ecf20Sopenharmony_ci
3468c2ecf20Sopenharmony_cistatic struct aead_edesc *aead_edesc_alloc(struct aead_request *req,
3478c2ecf20Sopenharmony_ci					   bool encrypt)
3488c2ecf20Sopenharmony_ci{
3498c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
3508c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = aead_request_ctx(req);
3518c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];
3528c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];
3538c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
3548c2ecf20Sopenharmony_ci	struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),
3558c2ecf20Sopenharmony_ci						 typeof(*alg), aead);
3568c2ecf20Sopenharmony_ci	struct device *dev = ctx->dev;
3578c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
3588c2ecf20Sopenharmony_ci		      GFP_KERNEL : GFP_ATOMIC;
3598c2ecf20Sopenharmony_ci	int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0;
3608c2ecf20Sopenharmony_ci	int src_len, dst_len = 0;
3618c2ecf20Sopenharmony_ci	struct aead_edesc *edesc;
3628c2ecf20Sopenharmony_ci	dma_addr_t qm_sg_dma, iv_dma = 0;
3638c2ecf20Sopenharmony_ci	int ivsize = 0;
3648c2ecf20Sopenharmony_ci	unsigned int authsize = ctx->authsize;
3658c2ecf20Sopenharmony_ci	int qm_sg_index = 0, qm_sg_nents = 0, qm_sg_bytes;
3668c2ecf20Sopenharmony_ci	int in_len, out_len;
3678c2ecf20Sopenharmony_ci	struct dpaa2_sg_entry *sg_table;
3688c2ecf20Sopenharmony_ci
3698c2ecf20Sopenharmony_ci	/* allocate space for base edesc, link tables and IV */
3708c2ecf20Sopenharmony_ci	edesc = qi_cache_zalloc(GFP_DMA | flags);
3718c2ecf20Sopenharmony_ci	if (unlikely(!edesc)) {
3728c2ecf20Sopenharmony_ci		dev_err(dev, "could not allocate extended descriptor\n");
3738c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
3748c2ecf20Sopenharmony_ci	}
3758c2ecf20Sopenharmony_ci
3768c2ecf20Sopenharmony_ci	if (unlikely(req->dst != req->src)) {
3778c2ecf20Sopenharmony_ci		src_len = req->assoclen + req->cryptlen;
3788c2ecf20Sopenharmony_ci		dst_len = src_len + (encrypt ? authsize : (-authsize));
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci		src_nents = sg_nents_for_len(req->src, src_len);
3818c2ecf20Sopenharmony_ci		if (unlikely(src_nents < 0)) {
3828c2ecf20Sopenharmony_ci			dev_err(dev, "Insufficient bytes (%d) in src S/G\n",
3838c2ecf20Sopenharmony_ci				src_len);
3848c2ecf20Sopenharmony_ci			qi_cache_free(edesc);
3858c2ecf20Sopenharmony_ci			return ERR_PTR(src_nents);
3868c2ecf20Sopenharmony_ci		}
3878c2ecf20Sopenharmony_ci
3888c2ecf20Sopenharmony_ci		dst_nents = sg_nents_for_len(req->dst, dst_len);
3898c2ecf20Sopenharmony_ci		if (unlikely(dst_nents < 0)) {
3908c2ecf20Sopenharmony_ci			dev_err(dev, "Insufficient bytes (%d) in dst S/G\n",
3918c2ecf20Sopenharmony_ci				dst_len);
3928c2ecf20Sopenharmony_ci			qi_cache_free(edesc);
3938c2ecf20Sopenharmony_ci			return ERR_PTR(dst_nents);
3948c2ecf20Sopenharmony_ci		}
3958c2ecf20Sopenharmony_ci
3968c2ecf20Sopenharmony_ci		if (src_nents) {
3978c2ecf20Sopenharmony_ci			mapped_src_nents = dma_map_sg(dev, req->src, src_nents,
3988c2ecf20Sopenharmony_ci						      DMA_TO_DEVICE);
3998c2ecf20Sopenharmony_ci			if (unlikely(!mapped_src_nents)) {
4008c2ecf20Sopenharmony_ci				dev_err(dev, "unable to map source\n");
4018c2ecf20Sopenharmony_ci				qi_cache_free(edesc);
4028c2ecf20Sopenharmony_ci				return ERR_PTR(-ENOMEM);
4038c2ecf20Sopenharmony_ci			}
4048c2ecf20Sopenharmony_ci		} else {
4058c2ecf20Sopenharmony_ci			mapped_src_nents = 0;
4068c2ecf20Sopenharmony_ci		}
4078c2ecf20Sopenharmony_ci
4088c2ecf20Sopenharmony_ci		if (dst_nents) {
4098c2ecf20Sopenharmony_ci			mapped_dst_nents = dma_map_sg(dev, req->dst, dst_nents,
4108c2ecf20Sopenharmony_ci						      DMA_FROM_DEVICE);
4118c2ecf20Sopenharmony_ci			if (unlikely(!mapped_dst_nents)) {
4128c2ecf20Sopenharmony_ci				dev_err(dev, "unable to map destination\n");
4138c2ecf20Sopenharmony_ci				dma_unmap_sg(dev, req->src, src_nents,
4148c2ecf20Sopenharmony_ci					     DMA_TO_DEVICE);
4158c2ecf20Sopenharmony_ci				qi_cache_free(edesc);
4168c2ecf20Sopenharmony_ci				return ERR_PTR(-ENOMEM);
4178c2ecf20Sopenharmony_ci			}
4188c2ecf20Sopenharmony_ci		} else {
4198c2ecf20Sopenharmony_ci			mapped_dst_nents = 0;
4208c2ecf20Sopenharmony_ci		}
4218c2ecf20Sopenharmony_ci	} else {
4228c2ecf20Sopenharmony_ci		src_len = req->assoclen + req->cryptlen +
4238c2ecf20Sopenharmony_ci			  (encrypt ? authsize : 0);
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_ci		src_nents = sg_nents_for_len(req->src, src_len);
4268c2ecf20Sopenharmony_ci		if (unlikely(src_nents < 0)) {
4278c2ecf20Sopenharmony_ci			dev_err(dev, "Insufficient bytes (%d) in src S/G\n",
4288c2ecf20Sopenharmony_ci				src_len);
4298c2ecf20Sopenharmony_ci			qi_cache_free(edesc);
4308c2ecf20Sopenharmony_ci			return ERR_PTR(src_nents);
4318c2ecf20Sopenharmony_ci		}
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_ci		mapped_src_nents = dma_map_sg(dev, req->src, src_nents,
4348c2ecf20Sopenharmony_ci					      DMA_BIDIRECTIONAL);
4358c2ecf20Sopenharmony_ci		if (unlikely(!mapped_src_nents)) {
4368c2ecf20Sopenharmony_ci			dev_err(dev, "unable to map source\n");
4378c2ecf20Sopenharmony_ci			qi_cache_free(edesc);
4388c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
4398c2ecf20Sopenharmony_ci		}
4408c2ecf20Sopenharmony_ci	}
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci	if ((alg->caam.rfc3686 && encrypt) || !alg->caam.geniv)
4438c2ecf20Sopenharmony_ci		ivsize = crypto_aead_ivsize(aead);
4448c2ecf20Sopenharmony_ci
4458c2ecf20Sopenharmony_ci	/*
4468c2ecf20Sopenharmony_ci	 * Create S/G table: req->assoclen, [IV,] req->src [, req->dst].
4478c2ecf20Sopenharmony_ci	 * Input is not contiguous.
4488c2ecf20Sopenharmony_ci	 * HW reads 4 S/G entries at a time; make sure the reads don't go beyond
4498c2ecf20Sopenharmony_ci	 * the end of the table by allocating more S/G entries. Logic:
4508c2ecf20Sopenharmony_ci	 * if (src != dst && output S/G)
4518c2ecf20Sopenharmony_ci	 *      pad output S/G, if needed
4528c2ecf20Sopenharmony_ci	 * else if (src == dst && S/G)
4538c2ecf20Sopenharmony_ci	 *      overlapping S/Gs; pad one of them
4548c2ecf20Sopenharmony_ci	 * else if (input S/G) ...
4558c2ecf20Sopenharmony_ci	 *      pad input S/G, if needed
4568c2ecf20Sopenharmony_ci	 */
4578c2ecf20Sopenharmony_ci	qm_sg_nents = 1 + !!ivsize + mapped_src_nents;
4588c2ecf20Sopenharmony_ci	if (mapped_dst_nents > 1)
4598c2ecf20Sopenharmony_ci		qm_sg_nents += pad_sg_nents(mapped_dst_nents);
4608c2ecf20Sopenharmony_ci	else if ((req->src == req->dst) && (mapped_src_nents > 1))
4618c2ecf20Sopenharmony_ci		qm_sg_nents = max(pad_sg_nents(qm_sg_nents),
4628c2ecf20Sopenharmony_ci				  1 + !!ivsize +
4638c2ecf20Sopenharmony_ci				  pad_sg_nents(mapped_src_nents));
4648c2ecf20Sopenharmony_ci	else
4658c2ecf20Sopenharmony_ci		qm_sg_nents = pad_sg_nents(qm_sg_nents);
4668c2ecf20Sopenharmony_ci
4678c2ecf20Sopenharmony_ci	sg_table = &edesc->sgt[0];
4688c2ecf20Sopenharmony_ci	qm_sg_bytes = qm_sg_nents * sizeof(*sg_table);
4698c2ecf20Sopenharmony_ci	if (unlikely(offsetof(struct aead_edesc, sgt) + qm_sg_bytes + ivsize >
4708c2ecf20Sopenharmony_ci		     CAAM_QI_MEMCACHE_SIZE)) {
4718c2ecf20Sopenharmony_ci		dev_err(dev, "No space for %d S/G entries and/or %dB IV\n",
4728c2ecf20Sopenharmony_ci			qm_sg_nents, ivsize);
4738c2ecf20Sopenharmony_ci		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 0,
4748c2ecf20Sopenharmony_ci			   0, DMA_NONE, 0, 0);
4758c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
4768c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
4778c2ecf20Sopenharmony_ci	}
4788c2ecf20Sopenharmony_ci
4798c2ecf20Sopenharmony_ci	if (ivsize) {
4808c2ecf20Sopenharmony_ci		u8 *iv = (u8 *)(sg_table + qm_sg_nents);
4818c2ecf20Sopenharmony_ci
4828c2ecf20Sopenharmony_ci		/* Make sure IV is located in a DMAable area */
4838c2ecf20Sopenharmony_ci		memcpy(iv, req->iv, ivsize);
4848c2ecf20Sopenharmony_ci
4858c2ecf20Sopenharmony_ci		iv_dma = dma_map_single(dev, iv, ivsize, DMA_TO_DEVICE);
4868c2ecf20Sopenharmony_ci		if (dma_mapping_error(dev, iv_dma)) {
4878c2ecf20Sopenharmony_ci			dev_err(dev, "unable to map IV\n");
4888c2ecf20Sopenharmony_ci			caam_unmap(dev, req->src, req->dst, src_nents,
4898c2ecf20Sopenharmony_ci				   dst_nents, 0, 0, DMA_NONE, 0, 0);
4908c2ecf20Sopenharmony_ci			qi_cache_free(edesc);
4918c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
4928c2ecf20Sopenharmony_ci		}
4938c2ecf20Sopenharmony_ci	}
4948c2ecf20Sopenharmony_ci
4958c2ecf20Sopenharmony_ci	edesc->src_nents = src_nents;
4968c2ecf20Sopenharmony_ci	edesc->dst_nents = dst_nents;
4978c2ecf20Sopenharmony_ci	edesc->iv_dma = iv_dma;
4988c2ecf20Sopenharmony_ci
4998c2ecf20Sopenharmony_ci	if ((alg->caam.class1_alg_type & OP_ALG_ALGSEL_MASK) ==
5008c2ecf20Sopenharmony_ci	    OP_ALG_ALGSEL_CHACHA20 && ivsize != CHACHAPOLY_IV_SIZE)
5018c2ecf20Sopenharmony_ci		/*
5028c2ecf20Sopenharmony_ci		 * The associated data comes already with the IV but we need
5038c2ecf20Sopenharmony_ci		 * to skip it when we authenticate or encrypt...
5048c2ecf20Sopenharmony_ci		 */
5058c2ecf20Sopenharmony_ci		edesc->assoclen = cpu_to_caam32(req->assoclen - ivsize);
5068c2ecf20Sopenharmony_ci	else
5078c2ecf20Sopenharmony_ci		edesc->assoclen = cpu_to_caam32(req->assoclen);
5088c2ecf20Sopenharmony_ci	edesc->assoclen_dma = dma_map_single(dev, &edesc->assoclen, 4,
5098c2ecf20Sopenharmony_ci					     DMA_TO_DEVICE);
5108c2ecf20Sopenharmony_ci	if (dma_mapping_error(dev, edesc->assoclen_dma)) {
5118c2ecf20Sopenharmony_ci		dev_err(dev, "unable to map assoclen\n");
5128c2ecf20Sopenharmony_ci		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents,
5138c2ecf20Sopenharmony_ci			   iv_dma, ivsize, DMA_TO_DEVICE, 0, 0);
5148c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
5158c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
5168c2ecf20Sopenharmony_ci	}
5178c2ecf20Sopenharmony_ci
5188c2ecf20Sopenharmony_ci	dma_to_qm_sg_one(sg_table, edesc->assoclen_dma, 4, 0);
5198c2ecf20Sopenharmony_ci	qm_sg_index++;
5208c2ecf20Sopenharmony_ci	if (ivsize) {
5218c2ecf20Sopenharmony_ci		dma_to_qm_sg_one(sg_table + qm_sg_index, iv_dma, ivsize, 0);
5228c2ecf20Sopenharmony_ci		qm_sg_index++;
5238c2ecf20Sopenharmony_ci	}
5248c2ecf20Sopenharmony_ci	sg_to_qm_sg_last(req->src, src_len, sg_table + qm_sg_index, 0);
5258c2ecf20Sopenharmony_ci	qm_sg_index += mapped_src_nents;
5268c2ecf20Sopenharmony_ci
5278c2ecf20Sopenharmony_ci	if (mapped_dst_nents > 1)
5288c2ecf20Sopenharmony_ci		sg_to_qm_sg_last(req->dst, dst_len, sg_table + qm_sg_index, 0);
5298c2ecf20Sopenharmony_ci
5308c2ecf20Sopenharmony_ci	qm_sg_dma = dma_map_single(dev, sg_table, qm_sg_bytes, DMA_TO_DEVICE);
5318c2ecf20Sopenharmony_ci	if (dma_mapping_error(dev, qm_sg_dma)) {
5328c2ecf20Sopenharmony_ci		dev_err(dev, "unable to map S/G table\n");
5338c2ecf20Sopenharmony_ci		dma_unmap_single(dev, edesc->assoclen_dma, 4, DMA_TO_DEVICE);
5348c2ecf20Sopenharmony_ci		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents,
5358c2ecf20Sopenharmony_ci			   iv_dma, ivsize, DMA_TO_DEVICE, 0, 0);
5368c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
5378c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
5388c2ecf20Sopenharmony_ci	}
5398c2ecf20Sopenharmony_ci
5408c2ecf20Sopenharmony_ci	edesc->qm_sg_dma = qm_sg_dma;
5418c2ecf20Sopenharmony_ci	edesc->qm_sg_bytes = qm_sg_bytes;
5428c2ecf20Sopenharmony_ci
5438c2ecf20Sopenharmony_ci	out_len = req->assoclen + req->cryptlen +
5448c2ecf20Sopenharmony_ci		  (encrypt ? ctx->authsize : (-ctx->authsize));
5458c2ecf20Sopenharmony_ci	in_len = 4 + ivsize + req->assoclen + req->cryptlen;
5468c2ecf20Sopenharmony_ci
5478c2ecf20Sopenharmony_ci	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));
5488c2ecf20Sopenharmony_ci	dpaa2_fl_set_final(in_fle, true);
5498c2ecf20Sopenharmony_ci	dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);
5508c2ecf20Sopenharmony_ci	dpaa2_fl_set_addr(in_fle, qm_sg_dma);
5518c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(in_fle, in_len);
5528c2ecf20Sopenharmony_ci
5538c2ecf20Sopenharmony_ci	if (req->dst == req->src) {
5548c2ecf20Sopenharmony_ci		if (mapped_src_nents == 1) {
5558c2ecf20Sopenharmony_ci			dpaa2_fl_set_format(out_fle, dpaa2_fl_single);
5568c2ecf20Sopenharmony_ci			dpaa2_fl_set_addr(out_fle, sg_dma_address(req->src));
5578c2ecf20Sopenharmony_ci		} else {
5588c2ecf20Sopenharmony_ci			dpaa2_fl_set_format(out_fle, dpaa2_fl_sg);
5598c2ecf20Sopenharmony_ci			dpaa2_fl_set_addr(out_fle, qm_sg_dma +
5608c2ecf20Sopenharmony_ci					  (1 + !!ivsize) * sizeof(*sg_table));
5618c2ecf20Sopenharmony_ci		}
5628c2ecf20Sopenharmony_ci	} else if (!mapped_dst_nents) {
5638c2ecf20Sopenharmony_ci		/*
5648c2ecf20Sopenharmony_ci		 * crypto engine requires the output entry to be present when
5658c2ecf20Sopenharmony_ci		 * "frame list" FD is used.
5668c2ecf20Sopenharmony_ci		 * Since engine does not support FMT=2'b11 (unused entry type),
5678c2ecf20Sopenharmony_ci		 * leaving out_fle zeroized is the best option.
5688c2ecf20Sopenharmony_ci		 */
5698c2ecf20Sopenharmony_ci		goto skip_out_fle;
5708c2ecf20Sopenharmony_ci	} else if (mapped_dst_nents == 1) {
5718c2ecf20Sopenharmony_ci		dpaa2_fl_set_format(out_fle, dpaa2_fl_single);
5728c2ecf20Sopenharmony_ci		dpaa2_fl_set_addr(out_fle, sg_dma_address(req->dst));
5738c2ecf20Sopenharmony_ci	} else {
5748c2ecf20Sopenharmony_ci		dpaa2_fl_set_format(out_fle, dpaa2_fl_sg);
5758c2ecf20Sopenharmony_ci		dpaa2_fl_set_addr(out_fle, qm_sg_dma + qm_sg_index *
5768c2ecf20Sopenharmony_ci				  sizeof(*sg_table));
5778c2ecf20Sopenharmony_ci	}
5788c2ecf20Sopenharmony_ci
5798c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(out_fle, out_len);
5808c2ecf20Sopenharmony_ci
5818c2ecf20Sopenharmony_ciskip_out_fle:
5828c2ecf20Sopenharmony_ci	return edesc;
5838c2ecf20Sopenharmony_ci}
5848c2ecf20Sopenharmony_ci
5858c2ecf20Sopenharmony_cistatic int chachapoly_set_sh_desc(struct crypto_aead *aead)
5868c2ecf20Sopenharmony_ci{
5878c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
5888c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
5898c2ecf20Sopenharmony_ci	struct device *dev = ctx->dev;
5908c2ecf20Sopenharmony_ci	struct caam_flc *flc;
5918c2ecf20Sopenharmony_ci	u32 *desc;
5928c2ecf20Sopenharmony_ci
5938c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen || !ctx->authsize)
5948c2ecf20Sopenharmony_ci		return 0;
5958c2ecf20Sopenharmony_ci
5968c2ecf20Sopenharmony_ci	flc = &ctx->flc[ENCRYPT];
5978c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
5988c2ecf20Sopenharmony_ci	cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize,
5998c2ecf20Sopenharmony_ci			       ctx->authsize, true, true);
6008c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
6018c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],
6028c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
6038c2ecf20Sopenharmony_ci				   ctx->dir);
6048c2ecf20Sopenharmony_ci
6058c2ecf20Sopenharmony_ci	flc = &ctx->flc[DECRYPT];
6068c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
6078c2ecf20Sopenharmony_ci	cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize,
6088c2ecf20Sopenharmony_ci			       ctx->authsize, false, true);
6098c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
6108c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],
6118c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
6128c2ecf20Sopenharmony_ci				   ctx->dir);
6138c2ecf20Sopenharmony_ci
6148c2ecf20Sopenharmony_ci	return 0;
6158c2ecf20Sopenharmony_ci}
6168c2ecf20Sopenharmony_ci
6178c2ecf20Sopenharmony_cistatic int chachapoly_setauthsize(struct crypto_aead *aead,
6188c2ecf20Sopenharmony_ci				  unsigned int authsize)
6198c2ecf20Sopenharmony_ci{
6208c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
6218c2ecf20Sopenharmony_ci
6228c2ecf20Sopenharmony_ci	if (authsize != POLY1305_DIGEST_SIZE)
6238c2ecf20Sopenharmony_ci		return -EINVAL;
6248c2ecf20Sopenharmony_ci
6258c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
6268c2ecf20Sopenharmony_ci	return chachapoly_set_sh_desc(aead);
6278c2ecf20Sopenharmony_ci}
6288c2ecf20Sopenharmony_ci
6298c2ecf20Sopenharmony_cistatic int chachapoly_setkey(struct crypto_aead *aead, const u8 *key,
6308c2ecf20Sopenharmony_ci			     unsigned int keylen)
6318c2ecf20Sopenharmony_ci{
6328c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
6338c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
6348c2ecf20Sopenharmony_ci	unsigned int saltlen = CHACHAPOLY_IV_SIZE - ivsize;
6358c2ecf20Sopenharmony_ci
6368c2ecf20Sopenharmony_ci	if (keylen != CHACHA_KEY_SIZE + saltlen)
6378c2ecf20Sopenharmony_ci		return -EINVAL;
6388c2ecf20Sopenharmony_ci
6398c2ecf20Sopenharmony_ci	memcpy(ctx->key, key, keylen);
6408c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = ctx->key;
6418c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen - saltlen;
6428c2ecf20Sopenharmony_ci
6438c2ecf20Sopenharmony_ci	return chachapoly_set_sh_desc(aead);
6448c2ecf20Sopenharmony_ci}
6458c2ecf20Sopenharmony_ci
6468c2ecf20Sopenharmony_cistatic int gcm_set_sh_desc(struct crypto_aead *aead)
6478c2ecf20Sopenharmony_ci{
6488c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
6498c2ecf20Sopenharmony_ci	struct device *dev = ctx->dev;
6508c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
6518c2ecf20Sopenharmony_ci	struct caam_flc *flc;
6528c2ecf20Sopenharmony_ci	u32 *desc;
6538c2ecf20Sopenharmony_ci	int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN -
6548c2ecf20Sopenharmony_ci			ctx->cdata.keylen;
6558c2ecf20Sopenharmony_ci
6568c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen || !ctx->authsize)
6578c2ecf20Sopenharmony_ci		return 0;
6588c2ecf20Sopenharmony_ci
6598c2ecf20Sopenharmony_ci	/*
6608c2ecf20Sopenharmony_ci	 * AES GCM encrypt shared descriptor
6618c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptor
6628c2ecf20Sopenharmony_ci	 * must fit into the 64-word Descriptor h/w Buffer
6638c2ecf20Sopenharmony_ci	 */
6648c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_QI_GCM_ENC_LEN) {
6658c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
6668c2ecf20Sopenharmony_ci		ctx->cdata.key_virt = ctx->key;
6678c2ecf20Sopenharmony_ci	} else {
6688c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
6698c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
6708c2ecf20Sopenharmony_ci	}
6718c2ecf20Sopenharmony_ci
6728c2ecf20Sopenharmony_ci	flc = &ctx->flc[ENCRYPT];
6738c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
6748c2ecf20Sopenharmony_ci	cnstr_shdsc_gcm_encap(desc, &ctx->cdata, ivsize, ctx->authsize, true);
6758c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
6768c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],
6778c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
6788c2ecf20Sopenharmony_ci				   ctx->dir);
6798c2ecf20Sopenharmony_ci
6808c2ecf20Sopenharmony_ci	/*
6818c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptors
6828c2ecf20Sopenharmony_ci	 * must all fit into the 64-word Descriptor h/w Buffer
6838c2ecf20Sopenharmony_ci	 */
6848c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_QI_GCM_DEC_LEN) {
6858c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
6868c2ecf20Sopenharmony_ci		ctx->cdata.key_virt = ctx->key;
6878c2ecf20Sopenharmony_ci	} else {
6888c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
6898c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
6908c2ecf20Sopenharmony_ci	}
6918c2ecf20Sopenharmony_ci
6928c2ecf20Sopenharmony_ci	flc = &ctx->flc[DECRYPT];
6938c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
6948c2ecf20Sopenharmony_ci	cnstr_shdsc_gcm_decap(desc, &ctx->cdata, ivsize, ctx->authsize, true);
6958c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
6968c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],
6978c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
6988c2ecf20Sopenharmony_ci				   ctx->dir);
6998c2ecf20Sopenharmony_ci
7008c2ecf20Sopenharmony_ci	return 0;
7018c2ecf20Sopenharmony_ci}
7028c2ecf20Sopenharmony_ci
7038c2ecf20Sopenharmony_cistatic int gcm_setauthsize(struct crypto_aead *authenc, unsigned int authsize)
7048c2ecf20Sopenharmony_ci{
7058c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
7068c2ecf20Sopenharmony_ci	int err;
7078c2ecf20Sopenharmony_ci
7088c2ecf20Sopenharmony_ci	err = crypto_gcm_check_authsize(authsize);
7098c2ecf20Sopenharmony_ci	if (err)
7108c2ecf20Sopenharmony_ci		return err;
7118c2ecf20Sopenharmony_ci
7128c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
7138c2ecf20Sopenharmony_ci	gcm_set_sh_desc(authenc);
7148c2ecf20Sopenharmony_ci
7158c2ecf20Sopenharmony_ci	return 0;
7168c2ecf20Sopenharmony_ci}
7178c2ecf20Sopenharmony_ci
7188c2ecf20Sopenharmony_cistatic int gcm_setkey(struct crypto_aead *aead,
7198c2ecf20Sopenharmony_ci		      const u8 *key, unsigned int keylen)
7208c2ecf20Sopenharmony_ci{
7218c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
7228c2ecf20Sopenharmony_ci	struct device *dev = ctx->dev;
7238c2ecf20Sopenharmony_ci	int ret;
7248c2ecf20Sopenharmony_ci
7258c2ecf20Sopenharmony_ci	ret = aes_check_keylen(keylen);
7268c2ecf20Sopenharmony_ci	if (ret)
7278c2ecf20Sopenharmony_ci		return ret;
7288c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",
7298c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
7308c2ecf20Sopenharmony_ci
7318c2ecf20Sopenharmony_ci	memcpy(ctx->key, key, keylen);
7328c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->key_dma, keylen, ctx->dir);
7338c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen;
7348c2ecf20Sopenharmony_ci
7358c2ecf20Sopenharmony_ci	return gcm_set_sh_desc(aead);
7368c2ecf20Sopenharmony_ci}
7378c2ecf20Sopenharmony_ci
7388c2ecf20Sopenharmony_cistatic int rfc4106_set_sh_desc(struct crypto_aead *aead)
7398c2ecf20Sopenharmony_ci{
7408c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
7418c2ecf20Sopenharmony_ci	struct device *dev = ctx->dev;
7428c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
7438c2ecf20Sopenharmony_ci	struct caam_flc *flc;
7448c2ecf20Sopenharmony_ci	u32 *desc;
7458c2ecf20Sopenharmony_ci	int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN -
7468c2ecf20Sopenharmony_ci			ctx->cdata.keylen;
7478c2ecf20Sopenharmony_ci
7488c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen || !ctx->authsize)
7498c2ecf20Sopenharmony_ci		return 0;
7508c2ecf20Sopenharmony_ci
7518c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = ctx->key;
7528c2ecf20Sopenharmony_ci
7538c2ecf20Sopenharmony_ci	/*
7548c2ecf20Sopenharmony_ci	 * RFC4106 encrypt shared descriptor
7558c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptor
7568c2ecf20Sopenharmony_ci	 * must fit into the 64-word Descriptor h/w Buffer
7578c2ecf20Sopenharmony_ci	 */
7588c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_QI_RFC4106_ENC_LEN) {
7598c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
7608c2ecf20Sopenharmony_ci	} else {
7618c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
7628c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
7638c2ecf20Sopenharmony_ci	}
7648c2ecf20Sopenharmony_ci
7658c2ecf20Sopenharmony_ci	flc = &ctx->flc[ENCRYPT];
7668c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
7678c2ecf20Sopenharmony_ci	cnstr_shdsc_rfc4106_encap(desc, &ctx->cdata, ivsize, ctx->authsize,
7688c2ecf20Sopenharmony_ci				  true);
7698c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
7708c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],
7718c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
7728c2ecf20Sopenharmony_ci				   ctx->dir);
7738c2ecf20Sopenharmony_ci
7748c2ecf20Sopenharmony_ci	/*
7758c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptors
7768c2ecf20Sopenharmony_ci	 * must all fit into the 64-word Descriptor h/w Buffer
7778c2ecf20Sopenharmony_ci	 */
7788c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_QI_RFC4106_DEC_LEN) {
7798c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
7808c2ecf20Sopenharmony_ci	} else {
7818c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
7828c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
7838c2ecf20Sopenharmony_ci	}
7848c2ecf20Sopenharmony_ci
7858c2ecf20Sopenharmony_ci	flc = &ctx->flc[DECRYPT];
7868c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
7878c2ecf20Sopenharmony_ci	cnstr_shdsc_rfc4106_decap(desc, &ctx->cdata, ivsize, ctx->authsize,
7888c2ecf20Sopenharmony_ci				  true);
7898c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
7908c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],
7918c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
7928c2ecf20Sopenharmony_ci				   ctx->dir);
7938c2ecf20Sopenharmony_ci
7948c2ecf20Sopenharmony_ci	return 0;
7958c2ecf20Sopenharmony_ci}
7968c2ecf20Sopenharmony_ci
7978c2ecf20Sopenharmony_cistatic int rfc4106_setauthsize(struct crypto_aead *authenc,
7988c2ecf20Sopenharmony_ci			       unsigned int authsize)
7998c2ecf20Sopenharmony_ci{
8008c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
8018c2ecf20Sopenharmony_ci	int err;
8028c2ecf20Sopenharmony_ci
8038c2ecf20Sopenharmony_ci	err = crypto_rfc4106_check_authsize(authsize);
8048c2ecf20Sopenharmony_ci	if (err)
8058c2ecf20Sopenharmony_ci		return err;
8068c2ecf20Sopenharmony_ci
8078c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
8088c2ecf20Sopenharmony_ci	rfc4106_set_sh_desc(authenc);
8098c2ecf20Sopenharmony_ci
8108c2ecf20Sopenharmony_ci	return 0;
8118c2ecf20Sopenharmony_ci}
8128c2ecf20Sopenharmony_ci
8138c2ecf20Sopenharmony_cistatic int rfc4106_setkey(struct crypto_aead *aead,
8148c2ecf20Sopenharmony_ci			  const u8 *key, unsigned int keylen)
8158c2ecf20Sopenharmony_ci{
8168c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
8178c2ecf20Sopenharmony_ci	struct device *dev = ctx->dev;
8188c2ecf20Sopenharmony_ci	int ret;
8198c2ecf20Sopenharmony_ci
8208c2ecf20Sopenharmony_ci	ret = aes_check_keylen(keylen - 4);
8218c2ecf20Sopenharmony_ci	if (ret)
8228c2ecf20Sopenharmony_ci		return ret;
8238c2ecf20Sopenharmony_ci
8248c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",
8258c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
8268c2ecf20Sopenharmony_ci
8278c2ecf20Sopenharmony_ci	memcpy(ctx->key, key, keylen);
8288c2ecf20Sopenharmony_ci	/*
8298c2ecf20Sopenharmony_ci	 * The last four bytes of the key material are used as the salt value
8308c2ecf20Sopenharmony_ci	 * in the nonce. Update the AES key length.
8318c2ecf20Sopenharmony_ci	 */
8328c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen - 4;
8338c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->key_dma, ctx->cdata.keylen,
8348c2ecf20Sopenharmony_ci				   ctx->dir);
8358c2ecf20Sopenharmony_ci
8368c2ecf20Sopenharmony_ci	return rfc4106_set_sh_desc(aead);
8378c2ecf20Sopenharmony_ci}
8388c2ecf20Sopenharmony_ci
8398c2ecf20Sopenharmony_cistatic int rfc4543_set_sh_desc(struct crypto_aead *aead)
8408c2ecf20Sopenharmony_ci{
8418c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
8428c2ecf20Sopenharmony_ci	struct device *dev = ctx->dev;
8438c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_aead_ivsize(aead);
8448c2ecf20Sopenharmony_ci	struct caam_flc *flc;
8458c2ecf20Sopenharmony_ci	u32 *desc;
8468c2ecf20Sopenharmony_ci	int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN -
8478c2ecf20Sopenharmony_ci			ctx->cdata.keylen;
8488c2ecf20Sopenharmony_ci
8498c2ecf20Sopenharmony_ci	if (!ctx->cdata.keylen || !ctx->authsize)
8508c2ecf20Sopenharmony_ci		return 0;
8518c2ecf20Sopenharmony_ci
8528c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = ctx->key;
8538c2ecf20Sopenharmony_ci
8548c2ecf20Sopenharmony_ci	/*
8558c2ecf20Sopenharmony_ci	 * RFC4543 encrypt shared descriptor
8568c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptor
8578c2ecf20Sopenharmony_ci	 * must fit into the 64-word Descriptor h/w Buffer
8588c2ecf20Sopenharmony_ci	 */
8598c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_QI_RFC4543_ENC_LEN) {
8608c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
8618c2ecf20Sopenharmony_ci	} else {
8628c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
8638c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
8648c2ecf20Sopenharmony_ci	}
8658c2ecf20Sopenharmony_ci
8668c2ecf20Sopenharmony_ci	flc = &ctx->flc[ENCRYPT];
8678c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
8688c2ecf20Sopenharmony_ci	cnstr_shdsc_rfc4543_encap(desc, &ctx->cdata, ivsize, ctx->authsize,
8698c2ecf20Sopenharmony_ci				  true);
8708c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
8718c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],
8728c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
8738c2ecf20Sopenharmony_ci				   ctx->dir);
8748c2ecf20Sopenharmony_ci
8758c2ecf20Sopenharmony_ci	/*
8768c2ecf20Sopenharmony_ci	 * Job Descriptor and Shared Descriptors
8778c2ecf20Sopenharmony_ci	 * must all fit into the 64-word Descriptor h/w Buffer
8788c2ecf20Sopenharmony_ci	 */
8798c2ecf20Sopenharmony_ci	if (rem_bytes >= DESC_QI_RFC4543_DEC_LEN) {
8808c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = true;
8818c2ecf20Sopenharmony_ci	} else {
8828c2ecf20Sopenharmony_ci		ctx->cdata.key_inline = false;
8838c2ecf20Sopenharmony_ci		ctx->cdata.key_dma = ctx->key_dma;
8848c2ecf20Sopenharmony_ci	}
8858c2ecf20Sopenharmony_ci
8868c2ecf20Sopenharmony_ci	flc = &ctx->flc[DECRYPT];
8878c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
8888c2ecf20Sopenharmony_ci	cnstr_shdsc_rfc4543_decap(desc, &ctx->cdata, ivsize, ctx->authsize,
8898c2ecf20Sopenharmony_ci				  true);
8908c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
8918c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],
8928c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
8938c2ecf20Sopenharmony_ci				   ctx->dir);
8948c2ecf20Sopenharmony_ci
8958c2ecf20Sopenharmony_ci	return 0;
8968c2ecf20Sopenharmony_ci}
8978c2ecf20Sopenharmony_ci
8988c2ecf20Sopenharmony_cistatic int rfc4543_setauthsize(struct crypto_aead *authenc,
8998c2ecf20Sopenharmony_ci			       unsigned int authsize)
9008c2ecf20Sopenharmony_ci{
9018c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
9028c2ecf20Sopenharmony_ci
9038c2ecf20Sopenharmony_ci	if (authsize != 16)
9048c2ecf20Sopenharmony_ci		return -EINVAL;
9058c2ecf20Sopenharmony_ci
9068c2ecf20Sopenharmony_ci	ctx->authsize = authsize;
9078c2ecf20Sopenharmony_ci	rfc4543_set_sh_desc(authenc);
9088c2ecf20Sopenharmony_ci
9098c2ecf20Sopenharmony_ci	return 0;
9108c2ecf20Sopenharmony_ci}
9118c2ecf20Sopenharmony_ci
9128c2ecf20Sopenharmony_cistatic int rfc4543_setkey(struct crypto_aead *aead,
9138c2ecf20Sopenharmony_ci			  const u8 *key, unsigned int keylen)
9148c2ecf20Sopenharmony_ci{
9158c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
9168c2ecf20Sopenharmony_ci	struct device *dev = ctx->dev;
9178c2ecf20Sopenharmony_ci	int ret;
9188c2ecf20Sopenharmony_ci
9198c2ecf20Sopenharmony_ci	ret = aes_check_keylen(keylen - 4);
9208c2ecf20Sopenharmony_ci	if (ret)
9218c2ecf20Sopenharmony_ci		return ret;
9228c2ecf20Sopenharmony_ci
9238c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",
9248c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
9258c2ecf20Sopenharmony_ci
9268c2ecf20Sopenharmony_ci	memcpy(ctx->key, key, keylen);
9278c2ecf20Sopenharmony_ci	/*
9288c2ecf20Sopenharmony_ci	 * The last four bytes of the key material are used as the salt value
9298c2ecf20Sopenharmony_ci	 * in the nonce. Update the AES key length.
9308c2ecf20Sopenharmony_ci	 */
9318c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen - 4;
9328c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->key_dma, ctx->cdata.keylen,
9338c2ecf20Sopenharmony_ci				   ctx->dir);
9348c2ecf20Sopenharmony_ci
9358c2ecf20Sopenharmony_ci	return rfc4543_set_sh_desc(aead);
9368c2ecf20Sopenharmony_ci}
9378c2ecf20Sopenharmony_ci
9388c2ecf20Sopenharmony_cistatic int skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key,
9398c2ecf20Sopenharmony_ci			   unsigned int keylen, const u32 ctx1_iv_off)
9408c2ecf20Sopenharmony_ci{
9418c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
9428c2ecf20Sopenharmony_ci	struct caam_skcipher_alg *alg =
9438c2ecf20Sopenharmony_ci		container_of(crypto_skcipher_alg(skcipher),
9448c2ecf20Sopenharmony_ci			     struct caam_skcipher_alg, skcipher);
9458c2ecf20Sopenharmony_ci	struct device *dev = ctx->dev;
9468c2ecf20Sopenharmony_ci	struct caam_flc *flc;
9478c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_skcipher_ivsize(skcipher);
9488c2ecf20Sopenharmony_ci	u32 *desc;
9498c2ecf20Sopenharmony_ci	const bool is_rfc3686 = alg->caam.rfc3686;
9508c2ecf20Sopenharmony_ci
9518c2ecf20Sopenharmony_ci	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",
9528c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
9538c2ecf20Sopenharmony_ci
9548c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen;
9558c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = key;
9568c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = true;
9578c2ecf20Sopenharmony_ci
9588c2ecf20Sopenharmony_ci	/* skcipher_encrypt shared descriptor */
9598c2ecf20Sopenharmony_ci	flc = &ctx->flc[ENCRYPT];
9608c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
9618c2ecf20Sopenharmony_ci	cnstr_shdsc_skcipher_encap(desc, &ctx->cdata, ivsize, is_rfc3686,
9628c2ecf20Sopenharmony_ci				   ctx1_iv_off);
9638c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
9648c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],
9658c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
9668c2ecf20Sopenharmony_ci				   ctx->dir);
9678c2ecf20Sopenharmony_ci
9688c2ecf20Sopenharmony_ci	/* skcipher_decrypt shared descriptor */
9698c2ecf20Sopenharmony_ci	flc = &ctx->flc[DECRYPT];
9708c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
9718c2ecf20Sopenharmony_ci	cnstr_shdsc_skcipher_decap(desc, &ctx->cdata, ivsize, is_rfc3686,
9728c2ecf20Sopenharmony_ci				   ctx1_iv_off);
9738c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
9748c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],
9758c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
9768c2ecf20Sopenharmony_ci				   ctx->dir);
9778c2ecf20Sopenharmony_ci
9788c2ecf20Sopenharmony_ci	return 0;
9798c2ecf20Sopenharmony_ci}
9808c2ecf20Sopenharmony_ci
9818c2ecf20Sopenharmony_cistatic int aes_skcipher_setkey(struct crypto_skcipher *skcipher,
9828c2ecf20Sopenharmony_ci			       const u8 *key, unsigned int keylen)
9838c2ecf20Sopenharmony_ci{
9848c2ecf20Sopenharmony_ci	int err;
9858c2ecf20Sopenharmony_ci
9868c2ecf20Sopenharmony_ci	err = aes_check_keylen(keylen);
9878c2ecf20Sopenharmony_ci	if (err)
9888c2ecf20Sopenharmony_ci		return err;
9898c2ecf20Sopenharmony_ci
9908c2ecf20Sopenharmony_ci	return skcipher_setkey(skcipher, key, keylen, 0);
9918c2ecf20Sopenharmony_ci}
9928c2ecf20Sopenharmony_ci
9938c2ecf20Sopenharmony_cistatic int rfc3686_skcipher_setkey(struct crypto_skcipher *skcipher,
9948c2ecf20Sopenharmony_ci				   const u8 *key, unsigned int keylen)
9958c2ecf20Sopenharmony_ci{
9968c2ecf20Sopenharmony_ci	u32 ctx1_iv_off;
9978c2ecf20Sopenharmony_ci	int err;
9988c2ecf20Sopenharmony_ci
9998c2ecf20Sopenharmony_ci	/*
10008c2ecf20Sopenharmony_ci	 * RFC3686 specific:
10018c2ecf20Sopenharmony_ci	 *	| CONTEXT1[255:128] = {NONCE, IV, COUNTER}
10028c2ecf20Sopenharmony_ci	 *	| *key = {KEY, NONCE}
10038c2ecf20Sopenharmony_ci	 */
10048c2ecf20Sopenharmony_ci	ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;
10058c2ecf20Sopenharmony_ci	keylen -= CTR_RFC3686_NONCE_SIZE;
10068c2ecf20Sopenharmony_ci
10078c2ecf20Sopenharmony_ci	err = aes_check_keylen(keylen);
10088c2ecf20Sopenharmony_ci	if (err)
10098c2ecf20Sopenharmony_ci		return err;
10108c2ecf20Sopenharmony_ci
10118c2ecf20Sopenharmony_ci	return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off);
10128c2ecf20Sopenharmony_ci}
10138c2ecf20Sopenharmony_ci
10148c2ecf20Sopenharmony_cistatic int ctr_skcipher_setkey(struct crypto_skcipher *skcipher,
10158c2ecf20Sopenharmony_ci			       const u8 *key, unsigned int keylen)
10168c2ecf20Sopenharmony_ci{
10178c2ecf20Sopenharmony_ci	u32 ctx1_iv_off;
10188c2ecf20Sopenharmony_ci	int err;
10198c2ecf20Sopenharmony_ci
10208c2ecf20Sopenharmony_ci	/*
10218c2ecf20Sopenharmony_ci	 * AES-CTR needs to load IV in CONTEXT1 reg
10228c2ecf20Sopenharmony_ci	 * at an offset of 128bits (16bytes)
10238c2ecf20Sopenharmony_ci	 * CONTEXT1[255:128] = IV
10248c2ecf20Sopenharmony_ci	 */
10258c2ecf20Sopenharmony_ci	ctx1_iv_off = 16;
10268c2ecf20Sopenharmony_ci
10278c2ecf20Sopenharmony_ci	err = aes_check_keylen(keylen);
10288c2ecf20Sopenharmony_ci	if (err)
10298c2ecf20Sopenharmony_ci		return err;
10308c2ecf20Sopenharmony_ci
10318c2ecf20Sopenharmony_ci	return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off);
10328c2ecf20Sopenharmony_ci}
10338c2ecf20Sopenharmony_ci
10348c2ecf20Sopenharmony_cistatic int chacha20_skcipher_setkey(struct crypto_skcipher *skcipher,
10358c2ecf20Sopenharmony_ci				    const u8 *key, unsigned int keylen)
10368c2ecf20Sopenharmony_ci{
10378c2ecf20Sopenharmony_ci	if (keylen != CHACHA_KEY_SIZE)
10388c2ecf20Sopenharmony_ci		return -EINVAL;
10398c2ecf20Sopenharmony_ci
10408c2ecf20Sopenharmony_ci	return skcipher_setkey(skcipher, key, keylen, 0);
10418c2ecf20Sopenharmony_ci}
10428c2ecf20Sopenharmony_ci
10438c2ecf20Sopenharmony_cistatic int des_skcipher_setkey(struct crypto_skcipher *skcipher,
10448c2ecf20Sopenharmony_ci			       const u8 *key, unsigned int keylen)
10458c2ecf20Sopenharmony_ci{
10468c2ecf20Sopenharmony_ci	return verify_skcipher_des_key(skcipher, key) ?:
10478c2ecf20Sopenharmony_ci	       skcipher_setkey(skcipher, key, keylen, 0);
10488c2ecf20Sopenharmony_ci}
10498c2ecf20Sopenharmony_ci
10508c2ecf20Sopenharmony_cistatic int des3_skcipher_setkey(struct crypto_skcipher *skcipher,
10518c2ecf20Sopenharmony_ci			        const u8 *key, unsigned int keylen)
10528c2ecf20Sopenharmony_ci{
10538c2ecf20Sopenharmony_ci	return verify_skcipher_des3_key(skcipher, key) ?:
10548c2ecf20Sopenharmony_ci	       skcipher_setkey(skcipher, key, keylen, 0);
10558c2ecf20Sopenharmony_ci}
10568c2ecf20Sopenharmony_ci
10578c2ecf20Sopenharmony_cistatic int xts_skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key,
10588c2ecf20Sopenharmony_ci			       unsigned int keylen)
10598c2ecf20Sopenharmony_ci{
10608c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
10618c2ecf20Sopenharmony_ci	struct device *dev = ctx->dev;
10628c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv *priv = dev_get_drvdata(dev);
10638c2ecf20Sopenharmony_ci	struct caam_flc *flc;
10648c2ecf20Sopenharmony_ci	u32 *desc;
10658c2ecf20Sopenharmony_ci	int err;
10668c2ecf20Sopenharmony_ci
10678c2ecf20Sopenharmony_ci	err = xts_verify_key(skcipher, key, keylen);
10688c2ecf20Sopenharmony_ci	if (err) {
10698c2ecf20Sopenharmony_ci		dev_dbg(dev, "key size mismatch\n");
10708c2ecf20Sopenharmony_ci		return err;
10718c2ecf20Sopenharmony_ci	}
10728c2ecf20Sopenharmony_ci
10738c2ecf20Sopenharmony_ci	if (keylen != 2 * AES_KEYSIZE_128 && keylen != 2 * AES_KEYSIZE_256)
10748c2ecf20Sopenharmony_ci		ctx->xts_key_fallback = true;
10758c2ecf20Sopenharmony_ci
10768c2ecf20Sopenharmony_ci	if (priv->sec_attr.era <= 8 || ctx->xts_key_fallback) {
10778c2ecf20Sopenharmony_ci		err = crypto_skcipher_setkey(ctx->fallback, key, keylen);
10788c2ecf20Sopenharmony_ci		if (err)
10798c2ecf20Sopenharmony_ci			return err;
10808c2ecf20Sopenharmony_ci	}
10818c2ecf20Sopenharmony_ci
10828c2ecf20Sopenharmony_ci	ctx->cdata.keylen = keylen;
10838c2ecf20Sopenharmony_ci	ctx->cdata.key_virt = key;
10848c2ecf20Sopenharmony_ci	ctx->cdata.key_inline = true;
10858c2ecf20Sopenharmony_ci
10868c2ecf20Sopenharmony_ci	/* xts_skcipher_encrypt shared descriptor */
10878c2ecf20Sopenharmony_ci	flc = &ctx->flc[ENCRYPT];
10888c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
10898c2ecf20Sopenharmony_ci	cnstr_shdsc_xts_skcipher_encap(desc, &ctx->cdata);
10908c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
10918c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],
10928c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
10938c2ecf20Sopenharmony_ci				   ctx->dir);
10948c2ecf20Sopenharmony_ci
10958c2ecf20Sopenharmony_ci	/* xts_skcipher_decrypt shared descriptor */
10968c2ecf20Sopenharmony_ci	flc = &ctx->flc[DECRYPT];
10978c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
10988c2ecf20Sopenharmony_ci	cnstr_shdsc_xts_skcipher_decap(desc, &ctx->cdata);
10998c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
11008c2ecf20Sopenharmony_ci	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],
11018c2ecf20Sopenharmony_ci				   sizeof(flc->flc) + desc_bytes(desc),
11028c2ecf20Sopenharmony_ci				   ctx->dir);
11038c2ecf20Sopenharmony_ci
11048c2ecf20Sopenharmony_ci	return 0;
11058c2ecf20Sopenharmony_ci}
11068c2ecf20Sopenharmony_ci
11078c2ecf20Sopenharmony_cistatic struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req)
11088c2ecf20Sopenharmony_ci{
11098c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
11108c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = skcipher_request_ctx(req);
11118c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];
11128c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];
11138c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
11148c2ecf20Sopenharmony_ci	struct device *dev = ctx->dev;
11158c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
11168c2ecf20Sopenharmony_ci		       GFP_KERNEL : GFP_ATOMIC;
11178c2ecf20Sopenharmony_ci	int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0;
11188c2ecf20Sopenharmony_ci	struct skcipher_edesc *edesc;
11198c2ecf20Sopenharmony_ci	dma_addr_t iv_dma;
11208c2ecf20Sopenharmony_ci	u8 *iv;
11218c2ecf20Sopenharmony_ci	int ivsize = crypto_skcipher_ivsize(skcipher);
11228c2ecf20Sopenharmony_ci	int dst_sg_idx, qm_sg_ents, qm_sg_bytes;
11238c2ecf20Sopenharmony_ci	struct dpaa2_sg_entry *sg_table;
11248c2ecf20Sopenharmony_ci
11258c2ecf20Sopenharmony_ci	src_nents = sg_nents_for_len(req->src, req->cryptlen);
11268c2ecf20Sopenharmony_ci	if (unlikely(src_nents < 0)) {
11278c2ecf20Sopenharmony_ci		dev_err(dev, "Insufficient bytes (%d) in src S/G\n",
11288c2ecf20Sopenharmony_ci			req->cryptlen);
11298c2ecf20Sopenharmony_ci		return ERR_PTR(src_nents);
11308c2ecf20Sopenharmony_ci	}
11318c2ecf20Sopenharmony_ci
11328c2ecf20Sopenharmony_ci	if (unlikely(req->dst != req->src)) {
11338c2ecf20Sopenharmony_ci		dst_nents = sg_nents_for_len(req->dst, req->cryptlen);
11348c2ecf20Sopenharmony_ci		if (unlikely(dst_nents < 0)) {
11358c2ecf20Sopenharmony_ci			dev_err(dev, "Insufficient bytes (%d) in dst S/G\n",
11368c2ecf20Sopenharmony_ci				req->cryptlen);
11378c2ecf20Sopenharmony_ci			return ERR_PTR(dst_nents);
11388c2ecf20Sopenharmony_ci		}
11398c2ecf20Sopenharmony_ci
11408c2ecf20Sopenharmony_ci		mapped_src_nents = dma_map_sg(dev, req->src, src_nents,
11418c2ecf20Sopenharmony_ci					      DMA_TO_DEVICE);
11428c2ecf20Sopenharmony_ci		if (unlikely(!mapped_src_nents)) {
11438c2ecf20Sopenharmony_ci			dev_err(dev, "unable to map source\n");
11448c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
11458c2ecf20Sopenharmony_ci		}
11468c2ecf20Sopenharmony_ci
11478c2ecf20Sopenharmony_ci		mapped_dst_nents = dma_map_sg(dev, req->dst, dst_nents,
11488c2ecf20Sopenharmony_ci					      DMA_FROM_DEVICE);
11498c2ecf20Sopenharmony_ci		if (unlikely(!mapped_dst_nents)) {
11508c2ecf20Sopenharmony_ci			dev_err(dev, "unable to map destination\n");
11518c2ecf20Sopenharmony_ci			dma_unmap_sg(dev, req->src, src_nents, DMA_TO_DEVICE);
11528c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
11538c2ecf20Sopenharmony_ci		}
11548c2ecf20Sopenharmony_ci	} else {
11558c2ecf20Sopenharmony_ci		mapped_src_nents = dma_map_sg(dev, req->src, src_nents,
11568c2ecf20Sopenharmony_ci					      DMA_BIDIRECTIONAL);
11578c2ecf20Sopenharmony_ci		if (unlikely(!mapped_src_nents)) {
11588c2ecf20Sopenharmony_ci			dev_err(dev, "unable to map source\n");
11598c2ecf20Sopenharmony_ci			return ERR_PTR(-ENOMEM);
11608c2ecf20Sopenharmony_ci		}
11618c2ecf20Sopenharmony_ci	}
11628c2ecf20Sopenharmony_ci
11638c2ecf20Sopenharmony_ci	qm_sg_ents = 1 + mapped_src_nents;
11648c2ecf20Sopenharmony_ci	dst_sg_idx = qm_sg_ents;
11658c2ecf20Sopenharmony_ci
11668c2ecf20Sopenharmony_ci	/*
11678c2ecf20Sopenharmony_ci	 * Input, output HW S/G tables: [IV, src][dst, IV]
11688c2ecf20Sopenharmony_ci	 * IV entries point to the same buffer
11698c2ecf20Sopenharmony_ci	 * If src == dst, S/G entries are reused (S/G tables overlap)
11708c2ecf20Sopenharmony_ci	 *
11718c2ecf20Sopenharmony_ci	 * HW reads 4 S/G entries at a time; make sure the reads don't go beyond
11728c2ecf20Sopenharmony_ci	 * the end of the table by allocating more S/G entries.
11738c2ecf20Sopenharmony_ci	 */
11748c2ecf20Sopenharmony_ci	if (req->src != req->dst)
11758c2ecf20Sopenharmony_ci		qm_sg_ents += pad_sg_nents(mapped_dst_nents + 1);
11768c2ecf20Sopenharmony_ci	else
11778c2ecf20Sopenharmony_ci		qm_sg_ents = 1 + pad_sg_nents(qm_sg_ents);
11788c2ecf20Sopenharmony_ci
11798c2ecf20Sopenharmony_ci	qm_sg_bytes = qm_sg_ents * sizeof(struct dpaa2_sg_entry);
11808c2ecf20Sopenharmony_ci	if (unlikely(offsetof(struct skcipher_edesc, sgt) + qm_sg_bytes +
11818c2ecf20Sopenharmony_ci		     ivsize > CAAM_QI_MEMCACHE_SIZE)) {
11828c2ecf20Sopenharmony_ci		dev_err(dev, "No space for %d S/G entries and/or %dB IV\n",
11838c2ecf20Sopenharmony_ci			qm_sg_ents, ivsize);
11848c2ecf20Sopenharmony_ci		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 0,
11858c2ecf20Sopenharmony_ci			   0, DMA_NONE, 0, 0);
11868c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
11878c2ecf20Sopenharmony_ci	}
11888c2ecf20Sopenharmony_ci
11898c2ecf20Sopenharmony_ci	/* allocate space for base edesc, link tables and IV */
11908c2ecf20Sopenharmony_ci	edesc = qi_cache_zalloc(GFP_DMA | flags);
11918c2ecf20Sopenharmony_ci	if (unlikely(!edesc)) {
11928c2ecf20Sopenharmony_ci		dev_err(dev, "could not allocate extended descriptor\n");
11938c2ecf20Sopenharmony_ci		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 0,
11948c2ecf20Sopenharmony_ci			   0, DMA_NONE, 0, 0);
11958c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
11968c2ecf20Sopenharmony_ci	}
11978c2ecf20Sopenharmony_ci
11988c2ecf20Sopenharmony_ci	/* Make sure IV is located in a DMAable area */
11998c2ecf20Sopenharmony_ci	sg_table = &edesc->sgt[0];
12008c2ecf20Sopenharmony_ci	iv = (u8 *)(sg_table + qm_sg_ents);
12018c2ecf20Sopenharmony_ci	memcpy(iv, req->iv, ivsize);
12028c2ecf20Sopenharmony_ci
12038c2ecf20Sopenharmony_ci	iv_dma = dma_map_single(dev, iv, ivsize, DMA_BIDIRECTIONAL);
12048c2ecf20Sopenharmony_ci	if (dma_mapping_error(dev, iv_dma)) {
12058c2ecf20Sopenharmony_ci		dev_err(dev, "unable to map IV\n");
12068c2ecf20Sopenharmony_ci		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 0,
12078c2ecf20Sopenharmony_ci			   0, DMA_NONE, 0, 0);
12088c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
12098c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
12108c2ecf20Sopenharmony_ci	}
12118c2ecf20Sopenharmony_ci
12128c2ecf20Sopenharmony_ci	edesc->src_nents = src_nents;
12138c2ecf20Sopenharmony_ci	edesc->dst_nents = dst_nents;
12148c2ecf20Sopenharmony_ci	edesc->iv_dma = iv_dma;
12158c2ecf20Sopenharmony_ci	edesc->qm_sg_bytes = qm_sg_bytes;
12168c2ecf20Sopenharmony_ci
12178c2ecf20Sopenharmony_ci	dma_to_qm_sg_one(sg_table, iv_dma, ivsize, 0);
12188c2ecf20Sopenharmony_ci	sg_to_qm_sg(req->src, req->cryptlen, sg_table + 1, 0);
12198c2ecf20Sopenharmony_ci
12208c2ecf20Sopenharmony_ci	if (req->src != req->dst)
12218c2ecf20Sopenharmony_ci		sg_to_qm_sg(req->dst, req->cryptlen, sg_table + dst_sg_idx, 0);
12228c2ecf20Sopenharmony_ci
12238c2ecf20Sopenharmony_ci	dma_to_qm_sg_one(sg_table + dst_sg_idx + mapped_dst_nents, iv_dma,
12248c2ecf20Sopenharmony_ci			 ivsize, 0);
12258c2ecf20Sopenharmony_ci
12268c2ecf20Sopenharmony_ci	edesc->qm_sg_dma = dma_map_single(dev, sg_table, edesc->qm_sg_bytes,
12278c2ecf20Sopenharmony_ci					  DMA_TO_DEVICE);
12288c2ecf20Sopenharmony_ci	if (dma_mapping_error(dev, edesc->qm_sg_dma)) {
12298c2ecf20Sopenharmony_ci		dev_err(dev, "unable to map S/G table\n");
12308c2ecf20Sopenharmony_ci		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents,
12318c2ecf20Sopenharmony_ci			   iv_dma, ivsize, DMA_BIDIRECTIONAL, 0, 0);
12328c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
12338c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
12348c2ecf20Sopenharmony_ci	}
12358c2ecf20Sopenharmony_ci
12368c2ecf20Sopenharmony_ci	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));
12378c2ecf20Sopenharmony_ci	dpaa2_fl_set_final(in_fle, true);
12388c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(in_fle, req->cryptlen + ivsize);
12398c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(out_fle, req->cryptlen + ivsize);
12408c2ecf20Sopenharmony_ci
12418c2ecf20Sopenharmony_ci	dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);
12428c2ecf20Sopenharmony_ci	dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);
12438c2ecf20Sopenharmony_ci
12448c2ecf20Sopenharmony_ci	dpaa2_fl_set_format(out_fle, dpaa2_fl_sg);
12458c2ecf20Sopenharmony_ci
12468c2ecf20Sopenharmony_ci	if (req->src == req->dst)
12478c2ecf20Sopenharmony_ci		dpaa2_fl_set_addr(out_fle, edesc->qm_sg_dma +
12488c2ecf20Sopenharmony_ci				  sizeof(*sg_table));
12498c2ecf20Sopenharmony_ci	else
12508c2ecf20Sopenharmony_ci		dpaa2_fl_set_addr(out_fle, edesc->qm_sg_dma + dst_sg_idx *
12518c2ecf20Sopenharmony_ci				  sizeof(*sg_table));
12528c2ecf20Sopenharmony_ci
12538c2ecf20Sopenharmony_ci	return edesc;
12548c2ecf20Sopenharmony_ci}
12558c2ecf20Sopenharmony_ci
12568c2ecf20Sopenharmony_cistatic void aead_unmap(struct device *dev, struct aead_edesc *edesc,
12578c2ecf20Sopenharmony_ci		       struct aead_request *req)
12588c2ecf20Sopenharmony_ci{
12598c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
12608c2ecf20Sopenharmony_ci	int ivsize = crypto_aead_ivsize(aead);
12618c2ecf20Sopenharmony_ci
12628c2ecf20Sopenharmony_ci	caam_unmap(dev, req->src, req->dst, edesc->src_nents, edesc->dst_nents,
12638c2ecf20Sopenharmony_ci		   edesc->iv_dma, ivsize, DMA_TO_DEVICE, edesc->qm_sg_dma,
12648c2ecf20Sopenharmony_ci		   edesc->qm_sg_bytes);
12658c2ecf20Sopenharmony_ci	dma_unmap_single(dev, edesc->assoclen_dma, 4, DMA_TO_DEVICE);
12668c2ecf20Sopenharmony_ci}
12678c2ecf20Sopenharmony_ci
12688c2ecf20Sopenharmony_cistatic void skcipher_unmap(struct device *dev, struct skcipher_edesc *edesc,
12698c2ecf20Sopenharmony_ci			   struct skcipher_request *req)
12708c2ecf20Sopenharmony_ci{
12718c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
12728c2ecf20Sopenharmony_ci	int ivsize = crypto_skcipher_ivsize(skcipher);
12738c2ecf20Sopenharmony_ci
12748c2ecf20Sopenharmony_ci	caam_unmap(dev, req->src, req->dst, edesc->src_nents, edesc->dst_nents,
12758c2ecf20Sopenharmony_ci		   edesc->iv_dma, ivsize, DMA_BIDIRECTIONAL, edesc->qm_sg_dma,
12768c2ecf20Sopenharmony_ci		   edesc->qm_sg_bytes);
12778c2ecf20Sopenharmony_ci}
12788c2ecf20Sopenharmony_ci
12798c2ecf20Sopenharmony_cistatic void aead_encrypt_done(void *cbk_ctx, u32 status)
12808c2ecf20Sopenharmony_ci{
12818c2ecf20Sopenharmony_ci	struct crypto_async_request *areq = cbk_ctx;
12828c2ecf20Sopenharmony_ci	struct aead_request *req = container_of(areq, struct aead_request,
12838c2ecf20Sopenharmony_ci						base);
12848c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = to_caam_req(areq);
12858c2ecf20Sopenharmony_ci	struct aead_edesc *edesc = req_ctx->edesc;
12868c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
12878c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
12888c2ecf20Sopenharmony_ci	int ecode = 0;
12898c2ecf20Sopenharmony_ci
12908c2ecf20Sopenharmony_ci	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);
12918c2ecf20Sopenharmony_ci
12928c2ecf20Sopenharmony_ci	if (unlikely(status))
12938c2ecf20Sopenharmony_ci		ecode = caam_qi2_strstatus(ctx->dev, status);
12948c2ecf20Sopenharmony_ci
12958c2ecf20Sopenharmony_ci	aead_unmap(ctx->dev, edesc, req);
12968c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
12978c2ecf20Sopenharmony_ci	aead_request_complete(req, ecode);
12988c2ecf20Sopenharmony_ci}
12998c2ecf20Sopenharmony_ci
13008c2ecf20Sopenharmony_cistatic void aead_decrypt_done(void *cbk_ctx, u32 status)
13018c2ecf20Sopenharmony_ci{
13028c2ecf20Sopenharmony_ci	struct crypto_async_request *areq = cbk_ctx;
13038c2ecf20Sopenharmony_ci	struct aead_request *req = container_of(areq, struct aead_request,
13048c2ecf20Sopenharmony_ci						base);
13058c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = to_caam_req(areq);
13068c2ecf20Sopenharmony_ci	struct aead_edesc *edesc = req_ctx->edesc;
13078c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
13088c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
13098c2ecf20Sopenharmony_ci	int ecode = 0;
13108c2ecf20Sopenharmony_ci
13118c2ecf20Sopenharmony_ci	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);
13128c2ecf20Sopenharmony_ci
13138c2ecf20Sopenharmony_ci	if (unlikely(status))
13148c2ecf20Sopenharmony_ci		ecode = caam_qi2_strstatus(ctx->dev, status);
13158c2ecf20Sopenharmony_ci
13168c2ecf20Sopenharmony_ci	aead_unmap(ctx->dev, edesc, req);
13178c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
13188c2ecf20Sopenharmony_ci	aead_request_complete(req, ecode);
13198c2ecf20Sopenharmony_ci}
13208c2ecf20Sopenharmony_ci
13218c2ecf20Sopenharmony_cistatic int aead_encrypt(struct aead_request *req)
13228c2ecf20Sopenharmony_ci{
13238c2ecf20Sopenharmony_ci	struct aead_edesc *edesc;
13248c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
13258c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
13268c2ecf20Sopenharmony_ci	struct caam_request *caam_req = aead_request_ctx(req);
13278c2ecf20Sopenharmony_ci	int ret;
13288c2ecf20Sopenharmony_ci
13298c2ecf20Sopenharmony_ci	/* allocate extended descriptor */
13308c2ecf20Sopenharmony_ci	edesc = aead_edesc_alloc(req, true);
13318c2ecf20Sopenharmony_ci	if (IS_ERR(edesc))
13328c2ecf20Sopenharmony_ci		return PTR_ERR(edesc);
13338c2ecf20Sopenharmony_ci
13348c2ecf20Sopenharmony_ci	caam_req->flc = &ctx->flc[ENCRYPT];
13358c2ecf20Sopenharmony_ci	caam_req->flc_dma = ctx->flc_dma[ENCRYPT];
13368c2ecf20Sopenharmony_ci	caam_req->cbk = aead_encrypt_done;
13378c2ecf20Sopenharmony_ci	caam_req->ctx = &req->base;
13388c2ecf20Sopenharmony_ci	caam_req->edesc = edesc;
13398c2ecf20Sopenharmony_ci	ret = dpaa2_caam_enqueue(ctx->dev, caam_req);
13408c2ecf20Sopenharmony_ci	if (ret != -EINPROGRESS &&
13418c2ecf20Sopenharmony_ci	    !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {
13428c2ecf20Sopenharmony_ci		aead_unmap(ctx->dev, edesc, req);
13438c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
13448c2ecf20Sopenharmony_ci	}
13458c2ecf20Sopenharmony_ci
13468c2ecf20Sopenharmony_ci	return ret;
13478c2ecf20Sopenharmony_ci}
13488c2ecf20Sopenharmony_ci
13498c2ecf20Sopenharmony_cistatic int aead_decrypt(struct aead_request *req)
13508c2ecf20Sopenharmony_ci{
13518c2ecf20Sopenharmony_ci	struct aead_edesc *edesc;
13528c2ecf20Sopenharmony_ci	struct crypto_aead *aead = crypto_aead_reqtfm(req);
13538c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_aead_ctx(aead);
13548c2ecf20Sopenharmony_ci	struct caam_request *caam_req = aead_request_ctx(req);
13558c2ecf20Sopenharmony_ci	int ret;
13568c2ecf20Sopenharmony_ci
13578c2ecf20Sopenharmony_ci	/* allocate extended descriptor */
13588c2ecf20Sopenharmony_ci	edesc = aead_edesc_alloc(req, false);
13598c2ecf20Sopenharmony_ci	if (IS_ERR(edesc))
13608c2ecf20Sopenharmony_ci		return PTR_ERR(edesc);
13618c2ecf20Sopenharmony_ci
13628c2ecf20Sopenharmony_ci	caam_req->flc = &ctx->flc[DECRYPT];
13638c2ecf20Sopenharmony_ci	caam_req->flc_dma = ctx->flc_dma[DECRYPT];
13648c2ecf20Sopenharmony_ci	caam_req->cbk = aead_decrypt_done;
13658c2ecf20Sopenharmony_ci	caam_req->ctx = &req->base;
13668c2ecf20Sopenharmony_ci	caam_req->edesc = edesc;
13678c2ecf20Sopenharmony_ci	ret = dpaa2_caam_enqueue(ctx->dev, caam_req);
13688c2ecf20Sopenharmony_ci	if (ret != -EINPROGRESS &&
13698c2ecf20Sopenharmony_ci	    !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {
13708c2ecf20Sopenharmony_ci		aead_unmap(ctx->dev, edesc, req);
13718c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
13728c2ecf20Sopenharmony_ci	}
13738c2ecf20Sopenharmony_ci
13748c2ecf20Sopenharmony_ci	return ret;
13758c2ecf20Sopenharmony_ci}
13768c2ecf20Sopenharmony_ci
13778c2ecf20Sopenharmony_cistatic int ipsec_gcm_encrypt(struct aead_request *req)
13788c2ecf20Sopenharmony_ci{
13798c2ecf20Sopenharmony_ci	return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_encrypt(req);
13808c2ecf20Sopenharmony_ci}
13818c2ecf20Sopenharmony_ci
13828c2ecf20Sopenharmony_cistatic int ipsec_gcm_decrypt(struct aead_request *req)
13838c2ecf20Sopenharmony_ci{
13848c2ecf20Sopenharmony_ci	return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_decrypt(req);
13858c2ecf20Sopenharmony_ci}
13868c2ecf20Sopenharmony_ci
13878c2ecf20Sopenharmony_cistatic void skcipher_encrypt_done(void *cbk_ctx, u32 status)
13888c2ecf20Sopenharmony_ci{
13898c2ecf20Sopenharmony_ci	struct crypto_async_request *areq = cbk_ctx;
13908c2ecf20Sopenharmony_ci	struct skcipher_request *req = skcipher_request_cast(areq);
13918c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = to_caam_req(areq);
13928c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
13938c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
13948c2ecf20Sopenharmony_ci	struct skcipher_edesc *edesc = req_ctx->edesc;
13958c2ecf20Sopenharmony_ci	int ecode = 0;
13968c2ecf20Sopenharmony_ci	int ivsize = crypto_skcipher_ivsize(skcipher);
13978c2ecf20Sopenharmony_ci
13988c2ecf20Sopenharmony_ci	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);
13998c2ecf20Sopenharmony_ci
14008c2ecf20Sopenharmony_ci	if (unlikely(status))
14018c2ecf20Sopenharmony_ci		ecode = caam_qi2_strstatus(ctx->dev, status);
14028c2ecf20Sopenharmony_ci
14038c2ecf20Sopenharmony_ci	print_hex_dump_debug("dstiv  @" __stringify(__LINE__)": ",
14048c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, req->iv,
14058c2ecf20Sopenharmony_ci			     edesc->src_nents > 1 ? 100 : ivsize, 1);
14068c2ecf20Sopenharmony_ci	caam_dump_sg("dst    @" __stringify(__LINE__)": ",
14078c2ecf20Sopenharmony_ci		     DUMP_PREFIX_ADDRESS, 16, 4, req->dst,
14088c2ecf20Sopenharmony_ci		     edesc->dst_nents > 1 ? 100 : req->cryptlen, 1);
14098c2ecf20Sopenharmony_ci
14108c2ecf20Sopenharmony_ci	skcipher_unmap(ctx->dev, edesc, req);
14118c2ecf20Sopenharmony_ci
14128c2ecf20Sopenharmony_ci	/*
14138c2ecf20Sopenharmony_ci	 * The crypto API expects us to set the IV (req->iv) to the last
14148c2ecf20Sopenharmony_ci	 * ciphertext block (CBC mode) or last counter (CTR mode).
14158c2ecf20Sopenharmony_ci	 * This is used e.g. by the CTS mode.
14168c2ecf20Sopenharmony_ci	 */
14178c2ecf20Sopenharmony_ci	if (!ecode)
14188c2ecf20Sopenharmony_ci		memcpy(req->iv, (u8 *)&edesc->sgt[0] + edesc->qm_sg_bytes,
14198c2ecf20Sopenharmony_ci		       ivsize);
14208c2ecf20Sopenharmony_ci
14218c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
14228c2ecf20Sopenharmony_ci	skcipher_request_complete(req, ecode);
14238c2ecf20Sopenharmony_ci}
14248c2ecf20Sopenharmony_ci
14258c2ecf20Sopenharmony_cistatic void skcipher_decrypt_done(void *cbk_ctx, u32 status)
14268c2ecf20Sopenharmony_ci{
14278c2ecf20Sopenharmony_ci	struct crypto_async_request *areq = cbk_ctx;
14288c2ecf20Sopenharmony_ci	struct skcipher_request *req = skcipher_request_cast(areq);
14298c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = to_caam_req(areq);
14308c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
14318c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
14328c2ecf20Sopenharmony_ci	struct skcipher_edesc *edesc = req_ctx->edesc;
14338c2ecf20Sopenharmony_ci	int ecode = 0;
14348c2ecf20Sopenharmony_ci	int ivsize = crypto_skcipher_ivsize(skcipher);
14358c2ecf20Sopenharmony_ci
14368c2ecf20Sopenharmony_ci	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);
14378c2ecf20Sopenharmony_ci
14388c2ecf20Sopenharmony_ci	if (unlikely(status))
14398c2ecf20Sopenharmony_ci		ecode = caam_qi2_strstatus(ctx->dev, status);
14408c2ecf20Sopenharmony_ci
14418c2ecf20Sopenharmony_ci	print_hex_dump_debug("dstiv  @" __stringify(__LINE__)": ",
14428c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, req->iv,
14438c2ecf20Sopenharmony_ci			     edesc->src_nents > 1 ? 100 : ivsize, 1);
14448c2ecf20Sopenharmony_ci	caam_dump_sg("dst    @" __stringify(__LINE__)": ",
14458c2ecf20Sopenharmony_ci		     DUMP_PREFIX_ADDRESS, 16, 4, req->dst,
14468c2ecf20Sopenharmony_ci		     edesc->dst_nents > 1 ? 100 : req->cryptlen, 1);
14478c2ecf20Sopenharmony_ci
14488c2ecf20Sopenharmony_ci	skcipher_unmap(ctx->dev, edesc, req);
14498c2ecf20Sopenharmony_ci
14508c2ecf20Sopenharmony_ci	/*
14518c2ecf20Sopenharmony_ci	 * The crypto API expects us to set the IV (req->iv) to the last
14528c2ecf20Sopenharmony_ci	 * ciphertext block (CBC mode) or last counter (CTR mode).
14538c2ecf20Sopenharmony_ci	 * This is used e.g. by the CTS mode.
14548c2ecf20Sopenharmony_ci	 */
14558c2ecf20Sopenharmony_ci	if (!ecode)
14568c2ecf20Sopenharmony_ci		memcpy(req->iv, (u8 *)&edesc->sgt[0] + edesc->qm_sg_bytes,
14578c2ecf20Sopenharmony_ci		       ivsize);
14588c2ecf20Sopenharmony_ci
14598c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
14608c2ecf20Sopenharmony_ci	skcipher_request_complete(req, ecode);
14618c2ecf20Sopenharmony_ci}
14628c2ecf20Sopenharmony_ci
14638c2ecf20Sopenharmony_cistatic inline bool xts_skcipher_ivsize(struct skcipher_request *req)
14648c2ecf20Sopenharmony_ci{
14658c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
14668c2ecf20Sopenharmony_ci	unsigned int ivsize = crypto_skcipher_ivsize(skcipher);
14678c2ecf20Sopenharmony_ci
14688c2ecf20Sopenharmony_ci	return !!get_unaligned((u64 *)(req->iv + (ivsize / 2)));
14698c2ecf20Sopenharmony_ci}
14708c2ecf20Sopenharmony_ci
14718c2ecf20Sopenharmony_cistatic int skcipher_encrypt(struct skcipher_request *req)
14728c2ecf20Sopenharmony_ci{
14738c2ecf20Sopenharmony_ci	struct skcipher_edesc *edesc;
14748c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
14758c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
14768c2ecf20Sopenharmony_ci	struct caam_request *caam_req = skcipher_request_ctx(req);
14778c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv *priv = dev_get_drvdata(ctx->dev);
14788c2ecf20Sopenharmony_ci	int ret;
14798c2ecf20Sopenharmony_ci
14808c2ecf20Sopenharmony_ci	/*
14818c2ecf20Sopenharmony_ci	 * XTS is expected to return an error even for input length = 0
14828c2ecf20Sopenharmony_ci	 * Note that the case input length < block size will be caught during
14838c2ecf20Sopenharmony_ci	 * HW offloading and return an error.
14848c2ecf20Sopenharmony_ci	 */
14858c2ecf20Sopenharmony_ci	if (!req->cryptlen && !ctx->fallback)
14868c2ecf20Sopenharmony_ci		return 0;
14878c2ecf20Sopenharmony_ci
14888c2ecf20Sopenharmony_ci	if (ctx->fallback && ((priv->sec_attr.era <= 8 && xts_skcipher_ivsize(req)) ||
14898c2ecf20Sopenharmony_ci			      ctx->xts_key_fallback)) {
14908c2ecf20Sopenharmony_ci		skcipher_request_set_tfm(&caam_req->fallback_req, ctx->fallback);
14918c2ecf20Sopenharmony_ci		skcipher_request_set_callback(&caam_req->fallback_req,
14928c2ecf20Sopenharmony_ci					      req->base.flags,
14938c2ecf20Sopenharmony_ci					      req->base.complete,
14948c2ecf20Sopenharmony_ci					      req->base.data);
14958c2ecf20Sopenharmony_ci		skcipher_request_set_crypt(&caam_req->fallback_req, req->src,
14968c2ecf20Sopenharmony_ci					   req->dst, req->cryptlen, req->iv);
14978c2ecf20Sopenharmony_ci
14988c2ecf20Sopenharmony_ci		return crypto_skcipher_encrypt(&caam_req->fallback_req);
14998c2ecf20Sopenharmony_ci	}
15008c2ecf20Sopenharmony_ci
15018c2ecf20Sopenharmony_ci	/* allocate extended descriptor */
15028c2ecf20Sopenharmony_ci	edesc = skcipher_edesc_alloc(req);
15038c2ecf20Sopenharmony_ci	if (IS_ERR(edesc))
15048c2ecf20Sopenharmony_ci		return PTR_ERR(edesc);
15058c2ecf20Sopenharmony_ci
15068c2ecf20Sopenharmony_ci	caam_req->flc = &ctx->flc[ENCRYPT];
15078c2ecf20Sopenharmony_ci	caam_req->flc_dma = ctx->flc_dma[ENCRYPT];
15088c2ecf20Sopenharmony_ci	caam_req->cbk = skcipher_encrypt_done;
15098c2ecf20Sopenharmony_ci	caam_req->ctx = &req->base;
15108c2ecf20Sopenharmony_ci	caam_req->edesc = edesc;
15118c2ecf20Sopenharmony_ci	ret = dpaa2_caam_enqueue(ctx->dev, caam_req);
15128c2ecf20Sopenharmony_ci	if (ret != -EINPROGRESS &&
15138c2ecf20Sopenharmony_ci	    !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {
15148c2ecf20Sopenharmony_ci		skcipher_unmap(ctx->dev, edesc, req);
15158c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
15168c2ecf20Sopenharmony_ci	}
15178c2ecf20Sopenharmony_ci
15188c2ecf20Sopenharmony_ci	return ret;
15198c2ecf20Sopenharmony_ci}
15208c2ecf20Sopenharmony_ci
15218c2ecf20Sopenharmony_cistatic int skcipher_decrypt(struct skcipher_request *req)
15228c2ecf20Sopenharmony_ci{
15238c2ecf20Sopenharmony_ci	struct skcipher_edesc *edesc;
15248c2ecf20Sopenharmony_ci	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
15258c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
15268c2ecf20Sopenharmony_ci	struct caam_request *caam_req = skcipher_request_ctx(req);
15278c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv *priv = dev_get_drvdata(ctx->dev);
15288c2ecf20Sopenharmony_ci	int ret;
15298c2ecf20Sopenharmony_ci
15308c2ecf20Sopenharmony_ci	/*
15318c2ecf20Sopenharmony_ci	 * XTS is expected to return an error even for input length = 0
15328c2ecf20Sopenharmony_ci	 * Note that the case input length < block size will be caught during
15338c2ecf20Sopenharmony_ci	 * HW offloading and return an error.
15348c2ecf20Sopenharmony_ci	 */
15358c2ecf20Sopenharmony_ci	if (!req->cryptlen && !ctx->fallback)
15368c2ecf20Sopenharmony_ci		return 0;
15378c2ecf20Sopenharmony_ci
15388c2ecf20Sopenharmony_ci	if (ctx->fallback && ((priv->sec_attr.era <= 8 && xts_skcipher_ivsize(req)) ||
15398c2ecf20Sopenharmony_ci			      ctx->xts_key_fallback)) {
15408c2ecf20Sopenharmony_ci		skcipher_request_set_tfm(&caam_req->fallback_req, ctx->fallback);
15418c2ecf20Sopenharmony_ci		skcipher_request_set_callback(&caam_req->fallback_req,
15428c2ecf20Sopenharmony_ci					      req->base.flags,
15438c2ecf20Sopenharmony_ci					      req->base.complete,
15448c2ecf20Sopenharmony_ci					      req->base.data);
15458c2ecf20Sopenharmony_ci		skcipher_request_set_crypt(&caam_req->fallback_req, req->src,
15468c2ecf20Sopenharmony_ci					   req->dst, req->cryptlen, req->iv);
15478c2ecf20Sopenharmony_ci
15488c2ecf20Sopenharmony_ci		return crypto_skcipher_decrypt(&caam_req->fallback_req);
15498c2ecf20Sopenharmony_ci	}
15508c2ecf20Sopenharmony_ci
15518c2ecf20Sopenharmony_ci	/* allocate extended descriptor */
15528c2ecf20Sopenharmony_ci	edesc = skcipher_edesc_alloc(req);
15538c2ecf20Sopenharmony_ci	if (IS_ERR(edesc))
15548c2ecf20Sopenharmony_ci		return PTR_ERR(edesc);
15558c2ecf20Sopenharmony_ci
15568c2ecf20Sopenharmony_ci	caam_req->flc = &ctx->flc[DECRYPT];
15578c2ecf20Sopenharmony_ci	caam_req->flc_dma = ctx->flc_dma[DECRYPT];
15588c2ecf20Sopenharmony_ci	caam_req->cbk = skcipher_decrypt_done;
15598c2ecf20Sopenharmony_ci	caam_req->ctx = &req->base;
15608c2ecf20Sopenharmony_ci	caam_req->edesc = edesc;
15618c2ecf20Sopenharmony_ci	ret = dpaa2_caam_enqueue(ctx->dev, caam_req);
15628c2ecf20Sopenharmony_ci	if (ret != -EINPROGRESS &&
15638c2ecf20Sopenharmony_ci	    !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {
15648c2ecf20Sopenharmony_ci		skcipher_unmap(ctx->dev, edesc, req);
15658c2ecf20Sopenharmony_ci		qi_cache_free(edesc);
15668c2ecf20Sopenharmony_ci	}
15678c2ecf20Sopenharmony_ci
15688c2ecf20Sopenharmony_ci	return ret;
15698c2ecf20Sopenharmony_ci}
15708c2ecf20Sopenharmony_ci
15718c2ecf20Sopenharmony_cistatic int caam_cra_init(struct caam_ctx *ctx, struct caam_alg_entry *caam,
15728c2ecf20Sopenharmony_ci			 bool uses_dkp)
15738c2ecf20Sopenharmony_ci{
15748c2ecf20Sopenharmony_ci	dma_addr_t dma_addr;
15758c2ecf20Sopenharmony_ci	int i;
15768c2ecf20Sopenharmony_ci
15778c2ecf20Sopenharmony_ci	/* copy descriptor header template value */
15788c2ecf20Sopenharmony_ci	ctx->cdata.algtype = OP_TYPE_CLASS1_ALG | caam->class1_alg_type;
15798c2ecf20Sopenharmony_ci	ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam->class2_alg_type;
15808c2ecf20Sopenharmony_ci
15818c2ecf20Sopenharmony_ci	ctx->dev = caam->dev;
15828c2ecf20Sopenharmony_ci	ctx->dir = uses_dkp ? DMA_BIDIRECTIONAL : DMA_TO_DEVICE;
15838c2ecf20Sopenharmony_ci
15848c2ecf20Sopenharmony_ci	dma_addr = dma_map_single_attrs(ctx->dev, ctx->flc,
15858c2ecf20Sopenharmony_ci					offsetof(struct caam_ctx, flc_dma),
15868c2ecf20Sopenharmony_ci					ctx->dir, DMA_ATTR_SKIP_CPU_SYNC);
15878c2ecf20Sopenharmony_ci	if (dma_mapping_error(ctx->dev, dma_addr)) {
15888c2ecf20Sopenharmony_ci		dev_err(ctx->dev, "unable to map key, shared descriptors\n");
15898c2ecf20Sopenharmony_ci		return -ENOMEM;
15908c2ecf20Sopenharmony_ci	}
15918c2ecf20Sopenharmony_ci
15928c2ecf20Sopenharmony_ci	for (i = 0; i < NUM_OP; i++)
15938c2ecf20Sopenharmony_ci		ctx->flc_dma[i] = dma_addr + i * sizeof(ctx->flc[i]);
15948c2ecf20Sopenharmony_ci	ctx->key_dma = dma_addr + NUM_OP * sizeof(ctx->flc[0]);
15958c2ecf20Sopenharmony_ci
15968c2ecf20Sopenharmony_ci	return 0;
15978c2ecf20Sopenharmony_ci}
15988c2ecf20Sopenharmony_ci
15998c2ecf20Sopenharmony_cistatic int caam_cra_init_skcipher(struct crypto_skcipher *tfm)
16008c2ecf20Sopenharmony_ci{
16018c2ecf20Sopenharmony_ci	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
16028c2ecf20Sopenharmony_ci	struct caam_skcipher_alg *caam_alg =
16038c2ecf20Sopenharmony_ci		container_of(alg, typeof(*caam_alg), skcipher);
16048c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(tfm);
16058c2ecf20Sopenharmony_ci	u32 alg_aai = caam_alg->caam.class1_alg_type & OP_ALG_AAI_MASK;
16068c2ecf20Sopenharmony_ci	int ret = 0;
16078c2ecf20Sopenharmony_ci
16088c2ecf20Sopenharmony_ci	if (alg_aai == OP_ALG_AAI_XTS) {
16098c2ecf20Sopenharmony_ci		const char *tfm_name = crypto_tfm_alg_name(&tfm->base);
16108c2ecf20Sopenharmony_ci		struct crypto_skcipher *fallback;
16118c2ecf20Sopenharmony_ci
16128c2ecf20Sopenharmony_ci		fallback = crypto_alloc_skcipher(tfm_name, 0,
16138c2ecf20Sopenharmony_ci						 CRYPTO_ALG_NEED_FALLBACK);
16148c2ecf20Sopenharmony_ci		if (IS_ERR(fallback)) {
16158c2ecf20Sopenharmony_ci			dev_err(caam_alg->caam.dev,
16168c2ecf20Sopenharmony_ci				"Failed to allocate %s fallback: %ld\n",
16178c2ecf20Sopenharmony_ci				tfm_name, PTR_ERR(fallback));
16188c2ecf20Sopenharmony_ci			return PTR_ERR(fallback);
16198c2ecf20Sopenharmony_ci		}
16208c2ecf20Sopenharmony_ci
16218c2ecf20Sopenharmony_ci		ctx->fallback = fallback;
16228c2ecf20Sopenharmony_ci		crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_request) +
16238c2ecf20Sopenharmony_ci					    crypto_skcipher_reqsize(fallback));
16248c2ecf20Sopenharmony_ci	} else {
16258c2ecf20Sopenharmony_ci		crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_request));
16268c2ecf20Sopenharmony_ci	}
16278c2ecf20Sopenharmony_ci
16288c2ecf20Sopenharmony_ci	ret = caam_cra_init(ctx, &caam_alg->caam, false);
16298c2ecf20Sopenharmony_ci	if (ret && ctx->fallback)
16308c2ecf20Sopenharmony_ci		crypto_free_skcipher(ctx->fallback);
16318c2ecf20Sopenharmony_ci
16328c2ecf20Sopenharmony_ci	return ret;
16338c2ecf20Sopenharmony_ci}
16348c2ecf20Sopenharmony_ci
16358c2ecf20Sopenharmony_cistatic int caam_cra_init_aead(struct crypto_aead *tfm)
16368c2ecf20Sopenharmony_ci{
16378c2ecf20Sopenharmony_ci	struct aead_alg *alg = crypto_aead_alg(tfm);
16388c2ecf20Sopenharmony_ci	struct caam_aead_alg *caam_alg = container_of(alg, typeof(*caam_alg),
16398c2ecf20Sopenharmony_ci						      aead);
16408c2ecf20Sopenharmony_ci
16418c2ecf20Sopenharmony_ci	crypto_aead_set_reqsize(tfm, sizeof(struct caam_request));
16428c2ecf20Sopenharmony_ci	return caam_cra_init(crypto_aead_ctx(tfm), &caam_alg->caam,
16438c2ecf20Sopenharmony_ci			     !caam_alg->caam.nodkp);
16448c2ecf20Sopenharmony_ci}
16458c2ecf20Sopenharmony_ci
16468c2ecf20Sopenharmony_cistatic void caam_exit_common(struct caam_ctx *ctx)
16478c2ecf20Sopenharmony_ci{
16488c2ecf20Sopenharmony_ci	dma_unmap_single_attrs(ctx->dev, ctx->flc_dma[0],
16498c2ecf20Sopenharmony_ci			       offsetof(struct caam_ctx, flc_dma), ctx->dir,
16508c2ecf20Sopenharmony_ci			       DMA_ATTR_SKIP_CPU_SYNC);
16518c2ecf20Sopenharmony_ci}
16528c2ecf20Sopenharmony_ci
16538c2ecf20Sopenharmony_cistatic void caam_cra_exit(struct crypto_skcipher *tfm)
16548c2ecf20Sopenharmony_ci{
16558c2ecf20Sopenharmony_ci	struct caam_ctx *ctx = crypto_skcipher_ctx(tfm);
16568c2ecf20Sopenharmony_ci
16578c2ecf20Sopenharmony_ci	if (ctx->fallback)
16588c2ecf20Sopenharmony_ci		crypto_free_skcipher(ctx->fallback);
16598c2ecf20Sopenharmony_ci	caam_exit_common(ctx);
16608c2ecf20Sopenharmony_ci}
16618c2ecf20Sopenharmony_ci
16628c2ecf20Sopenharmony_cistatic void caam_cra_exit_aead(struct crypto_aead *tfm)
16638c2ecf20Sopenharmony_ci{
16648c2ecf20Sopenharmony_ci	caam_exit_common(crypto_aead_ctx(tfm));
16658c2ecf20Sopenharmony_ci}
16668c2ecf20Sopenharmony_ci
16678c2ecf20Sopenharmony_cistatic struct caam_skcipher_alg driver_algs[] = {
16688c2ecf20Sopenharmony_ci	{
16698c2ecf20Sopenharmony_ci		.skcipher = {
16708c2ecf20Sopenharmony_ci			.base = {
16718c2ecf20Sopenharmony_ci				.cra_name = "cbc(aes)",
16728c2ecf20Sopenharmony_ci				.cra_driver_name = "cbc-aes-caam-qi2",
16738c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
16748c2ecf20Sopenharmony_ci			},
16758c2ecf20Sopenharmony_ci			.setkey = aes_skcipher_setkey,
16768c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
16778c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
16788c2ecf20Sopenharmony_ci			.min_keysize = AES_MIN_KEY_SIZE,
16798c2ecf20Sopenharmony_ci			.max_keysize = AES_MAX_KEY_SIZE,
16808c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
16818c2ecf20Sopenharmony_ci		},
16828c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
16838c2ecf20Sopenharmony_ci	},
16848c2ecf20Sopenharmony_ci	{
16858c2ecf20Sopenharmony_ci		.skcipher = {
16868c2ecf20Sopenharmony_ci			.base = {
16878c2ecf20Sopenharmony_ci				.cra_name = "cbc(des3_ede)",
16888c2ecf20Sopenharmony_ci				.cra_driver_name = "cbc-3des-caam-qi2",
16898c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
16908c2ecf20Sopenharmony_ci			},
16918c2ecf20Sopenharmony_ci			.setkey = des3_skcipher_setkey,
16928c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
16938c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
16948c2ecf20Sopenharmony_ci			.min_keysize = DES3_EDE_KEY_SIZE,
16958c2ecf20Sopenharmony_ci			.max_keysize = DES3_EDE_KEY_SIZE,
16968c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
16978c2ecf20Sopenharmony_ci		},
16988c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
16998c2ecf20Sopenharmony_ci	},
17008c2ecf20Sopenharmony_ci	{
17018c2ecf20Sopenharmony_ci		.skcipher = {
17028c2ecf20Sopenharmony_ci			.base = {
17038c2ecf20Sopenharmony_ci				.cra_name = "cbc(des)",
17048c2ecf20Sopenharmony_ci				.cra_driver_name = "cbc-des-caam-qi2",
17058c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
17068c2ecf20Sopenharmony_ci			},
17078c2ecf20Sopenharmony_ci			.setkey = des_skcipher_setkey,
17088c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
17098c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
17108c2ecf20Sopenharmony_ci			.min_keysize = DES_KEY_SIZE,
17118c2ecf20Sopenharmony_ci			.max_keysize = DES_KEY_SIZE,
17128c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
17138c2ecf20Sopenharmony_ci		},
17148c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
17158c2ecf20Sopenharmony_ci	},
17168c2ecf20Sopenharmony_ci	{
17178c2ecf20Sopenharmony_ci		.skcipher = {
17188c2ecf20Sopenharmony_ci			.base = {
17198c2ecf20Sopenharmony_ci				.cra_name = "ctr(aes)",
17208c2ecf20Sopenharmony_ci				.cra_driver_name = "ctr-aes-caam-qi2",
17218c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
17228c2ecf20Sopenharmony_ci			},
17238c2ecf20Sopenharmony_ci			.setkey = ctr_skcipher_setkey,
17248c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
17258c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
17268c2ecf20Sopenharmony_ci			.min_keysize = AES_MIN_KEY_SIZE,
17278c2ecf20Sopenharmony_ci			.max_keysize = AES_MAX_KEY_SIZE,
17288c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
17298c2ecf20Sopenharmony_ci			.chunksize = AES_BLOCK_SIZE,
17308c2ecf20Sopenharmony_ci		},
17318c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_AES |
17328c2ecf20Sopenharmony_ci					OP_ALG_AAI_CTR_MOD128,
17338c2ecf20Sopenharmony_ci	},
17348c2ecf20Sopenharmony_ci	{
17358c2ecf20Sopenharmony_ci		.skcipher = {
17368c2ecf20Sopenharmony_ci			.base = {
17378c2ecf20Sopenharmony_ci				.cra_name = "rfc3686(ctr(aes))",
17388c2ecf20Sopenharmony_ci				.cra_driver_name = "rfc3686-ctr-aes-caam-qi2",
17398c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
17408c2ecf20Sopenharmony_ci			},
17418c2ecf20Sopenharmony_ci			.setkey = rfc3686_skcipher_setkey,
17428c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
17438c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
17448c2ecf20Sopenharmony_ci			.min_keysize = AES_MIN_KEY_SIZE +
17458c2ecf20Sopenharmony_ci				       CTR_RFC3686_NONCE_SIZE,
17468c2ecf20Sopenharmony_ci			.max_keysize = AES_MAX_KEY_SIZE +
17478c2ecf20Sopenharmony_ci				       CTR_RFC3686_NONCE_SIZE,
17488c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
17498c2ecf20Sopenharmony_ci			.chunksize = AES_BLOCK_SIZE,
17508c2ecf20Sopenharmony_ci		},
17518c2ecf20Sopenharmony_ci		.caam = {
17528c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
17538c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
17548c2ecf20Sopenharmony_ci			.rfc3686 = true,
17558c2ecf20Sopenharmony_ci		},
17568c2ecf20Sopenharmony_ci	},
17578c2ecf20Sopenharmony_ci	{
17588c2ecf20Sopenharmony_ci		.skcipher = {
17598c2ecf20Sopenharmony_ci			.base = {
17608c2ecf20Sopenharmony_ci				.cra_name = "xts(aes)",
17618c2ecf20Sopenharmony_ci				.cra_driver_name = "xts-aes-caam-qi2",
17628c2ecf20Sopenharmony_ci				.cra_flags = CRYPTO_ALG_NEED_FALLBACK,
17638c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
17648c2ecf20Sopenharmony_ci			},
17658c2ecf20Sopenharmony_ci			.setkey = xts_skcipher_setkey,
17668c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
17678c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
17688c2ecf20Sopenharmony_ci			.min_keysize = 2 * AES_MIN_KEY_SIZE,
17698c2ecf20Sopenharmony_ci			.max_keysize = 2 * AES_MAX_KEY_SIZE,
17708c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
17718c2ecf20Sopenharmony_ci		},
17728c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_XTS,
17738c2ecf20Sopenharmony_ci	},
17748c2ecf20Sopenharmony_ci	{
17758c2ecf20Sopenharmony_ci		.skcipher = {
17768c2ecf20Sopenharmony_ci			.base = {
17778c2ecf20Sopenharmony_ci				.cra_name = "chacha20",
17788c2ecf20Sopenharmony_ci				.cra_driver_name = "chacha20-caam-qi2",
17798c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
17808c2ecf20Sopenharmony_ci			},
17818c2ecf20Sopenharmony_ci			.setkey = chacha20_skcipher_setkey,
17828c2ecf20Sopenharmony_ci			.encrypt = skcipher_encrypt,
17838c2ecf20Sopenharmony_ci			.decrypt = skcipher_decrypt,
17848c2ecf20Sopenharmony_ci			.min_keysize = CHACHA_KEY_SIZE,
17858c2ecf20Sopenharmony_ci			.max_keysize = CHACHA_KEY_SIZE,
17868c2ecf20Sopenharmony_ci			.ivsize = CHACHA_IV_SIZE,
17878c2ecf20Sopenharmony_ci		},
17888c2ecf20Sopenharmony_ci		.caam.class1_alg_type = OP_ALG_ALGSEL_CHACHA20,
17898c2ecf20Sopenharmony_ci	},
17908c2ecf20Sopenharmony_ci};
17918c2ecf20Sopenharmony_ci
17928c2ecf20Sopenharmony_cistatic struct caam_aead_alg driver_aeads[] = {
17938c2ecf20Sopenharmony_ci	{
17948c2ecf20Sopenharmony_ci		.aead = {
17958c2ecf20Sopenharmony_ci			.base = {
17968c2ecf20Sopenharmony_ci				.cra_name = "rfc4106(gcm(aes))",
17978c2ecf20Sopenharmony_ci				.cra_driver_name = "rfc4106-gcm-aes-caam-qi2",
17988c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
17998c2ecf20Sopenharmony_ci			},
18008c2ecf20Sopenharmony_ci			.setkey = rfc4106_setkey,
18018c2ecf20Sopenharmony_ci			.setauthsize = rfc4106_setauthsize,
18028c2ecf20Sopenharmony_ci			.encrypt = ipsec_gcm_encrypt,
18038c2ecf20Sopenharmony_ci			.decrypt = ipsec_gcm_decrypt,
18048c2ecf20Sopenharmony_ci			.ivsize = 8,
18058c2ecf20Sopenharmony_ci			.maxauthsize = AES_BLOCK_SIZE,
18068c2ecf20Sopenharmony_ci		},
18078c2ecf20Sopenharmony_ci		.caam = {
18088c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
18098c2ecf20Sopenharmony_ci			.nodkp = true,
18108c2ecf20Sopenharmony_ci		},
18118c2ecf20Sopenharmony_ci	},
18128c2ecf20Sopenharmony_ci	{
18138c2ecf20Sopenharmony_ci		.aead = {
18148c2ecf20Sopenharmony_ci			.base = {
18158c2ecf20Sopenharmony_ci				.cra_name = "rfc4543(gcm(aes))",
18168c2ecf20Sopenharmony_ci				.cra_driver_name = "rfc4543-gcm-aes-caam-qi2",
18178c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
18188c2ecf20Sopenharmony_ci			},
18198c2ecf20Sopenharmony_ci			.setkey = rfc4543_setkey,
18208c2ecf20Sopenharmony_ci			.setauthsize = rfc4543_setauthsize,
18218c2ecf20Sopenharmony_ci			.encrypt = ipsec_gcm_encrypt,
18228c2ecf20Sopenharmony_ci			.decrypt = ipsec_gcm_decrypt,
18238c2ecf20Sopenharmony_ci			.ivsize = 8,
18248c2ecf20Sopenharmony_ci			.maxauthsize = AES_BLOCK_SIZE,
18258c2ecf20Sopenharmony_ci		},
18268c2ecf20Sopenharmony_ci		.caam = {
18278c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
18288c2ecf20Sopenharmony_ci			.nodkp = true,
18298c2ecf20Sopenharmony_ci		},
18308c2ecf20Sopenharmony_ci	},
18318c2ecf20Sopenharmony_ci	/* Galois Counter Mode */
18328c2ecf20Sopenharmony_ci	{
18338c2ecf20Sopenharmony_ci		.aead = {
18348c2ecf20Sopenharmony_ci			.base = {
18358c2ecf20Sopenharmony_ci				.cra_name = "gcm(aes)",
18368c2ecf20Sopenharmony_ci				.cra_driver_name = "gcm-aes-caam-qi2",
18378c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
18388c2ecf20Sopenharmony_ci			},
18398c2ecf20Sopenharmony_ci			.setkey = gcm_setkey,
18408c2ecf20Sopenharmony_ci			.setauthsize = gcm_setauthsize,
18418c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
18428c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
18438c2ecf20Sopenharmony_ci			.ivsize = 12,
18448c2ecf20Sopenharmony_ci			.maxauthsize = AES_BLOCK_SIZE,
18458c2ecf20Sopenharmony_ci		},
18468c2ecf20Sopenharmony_ci		.caam = {
18478c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
18488c2ecf20Sopenharmony_ci			.nodkp = true,
18498c2ecf20Sopenharmony_ci		}
18508c2ecf20Sopenharmony_ci	},
18518c2ecf20Sopenharmony_ci	/* single-pass ipsec_esp descriptor */
18528c2ecf20Sopenharmony_ci	{
18538c2ecf20Sopenharmony_ci		.aead = {
18548c2ecf20Sopenharmony_ci			.base = {
18558c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(md5),cbc(aes))",
18568c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-md5-"
18578c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi2",
18588c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
18598c2ecf20Sopenharmony_ci			},
18608c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
18618c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
18628c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
18638c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
18648c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
18658c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
18668c2ecf20Sopenharmony_ci		},
18678c2ecf20Sopenharmony_ci		.caam = {
18688c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
18698c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
18708c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
18718c2ecf20Sopenharmony_ci		}
18728c2ecf20Sopenharmony_ci	},
18738c2ecf20Sopenharmony_ci	{
18748c2ecf20Sopenharmony_ci		.aead = {
18758c2ecf20Sopenharmony_ci			.base = {
18768c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(md5),"
18778c2ecf20Sopenharmony_ci					    "cbc(aes)))",
18788c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-hmac-md5-"
18798c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi2",
18808c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
18818c2ecf20Sopenharmony_ci			},
18828c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
18838c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
18848c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
18858c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
18868c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
18878c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
18888c2ecf20Sopenharmony_ci		},
18898c2ecf20Sopenharmony_ci		.caam = {
18908c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
18918c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
18928c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
18938c2ecf20Sopenharmony_ci			.geniv = true,
18948c2ecf20Sopenharmony_ci		}
18958c2ecf20Sopenharmony_ci	},
18968c2ecf20Sopenharmony_ci	{
18978c2ecf20Sopenharmony_ci		.aead = {
18988c2ecf20Sopenharmony_ci			.base = {
18998c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha1),cbc(aes))",
19008c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha1-"
19018c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi2",
19028c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
19038c2ecf20Sopenharmony_ci			},
19048c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
19058c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
19068c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
19078c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
19088c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
19098c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
19108c2ecf20Sopenharmony_ci		},
19118c2ecf20Sopenharmony_ci		.caam = {
19128c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
19138c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
19148c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
19158c2ecf20Sopenharmony_ci		}
19168c2ecf20Sopenharmony_ci	},
19178c2ecf20Sopenharmony_ci	{
19188c2ecf20Sopenharmony_ci		.aead = {
19198c2ecf20Sopenharmony_ci			.base = {
19208c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha1),"
19218c2ecf20Sopenharmony_ci					    "cbc(aes)))",
19228c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
19238c2ecf20Sopenharmony_ci						   "hmac-sha1-cbc-aes-caam-qi2",
19248c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
19258c2ecf20Sopenharmony_ci			},
19268c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
19278c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
19288c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
19298c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
19308c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
19318c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
19328c2ecf20Sopenharmony_ci		},
19338c2ecf20Sopenharmony_ci		.caam = {
19348c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
19358c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
19368c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
19378c2ecf20Sopenharmony_ci			.geniv = true,
19388c2ecf20Sopenharmony_ci		},
19398c2ecf20Sopenharmony_ci	},
19408c2ecf20Sopenharmony_ci	{
19418c2ecf20Sopenharmony_ci		.aead = {
19428c2ecf20Sopenharmony_ci			.base = {
19438c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha224),cbc(aes))",
19448c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha224-"
19458c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi2",
19468c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
19478c2ecf20Sopenharmony_ci			},
19488c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
19498c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
19508c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
19518c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
19528c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
19538c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
19548c2ecf20Sopenharmony_ci		},
19558c2ecf20Sopenharmony_ci		.caam = {
19568c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
19578c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
19588c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
19598c2ecf20Sopenharmony_ci		}
19608c2ecf20Sopenharmony_ci	},
19618c2ecf20Sopenharmony_ci	{
19628c2ecf20Sopenharmony_ci		.aead = {
19638c2ecf20Sopenharmony_ci			.base = {
19648c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha224),"
19658c2ecf20Sopenharmony_ci					    "cbc(aes)))",
19668c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
19678c2ecf20Sopenharmony_ci						   "hmac-sha224-cbc-aes-caam-qi2",
19688c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
19698c2ecf20Sopenharmony_ci			},
19708c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
19718c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
19728c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
19738c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
19748c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
19758c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
19768c2ecf20Sopenharmony_ci		},
19778c2ecf20Sopenharmony_ci		.caam = {
19788c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
19798c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
19808c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
19818c2ecf20Sopenharmony_ci			.geniv = true,
19828c2ecf20Sopenharmony_ci		}
19838c2ecf20Sopenharmony_ci	},
19848c2ecf20Sopenharmony_ci	{
19858c2ecf20Sopenharmony_ci		.aead = {
19868c2ecf20Sopenharmony_ci			.base = {
19878c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha256),cbc(aes))",
19888c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha256-"
19898c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi2",
19908c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
19918c2ecf20Sopenharmony_ci			},
19928c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
19938c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
19948c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
19958c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
19968c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
19978c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
19988c2ecf20Sopenharmony_ci		},
19998c2ecf20Sopenharmony_ci		.caam = {
20008c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
20018c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
20028c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
20038c2ecf20Sopenharmony_ci		}
20048c2ecf20Sopenharmony_ci	},
20058c2ecf20Sopenharmony_ci	{
20068c2ecf20Sopenharmony_ci		.aead = {
20078c2ecf20Sopenharmony_ci			.base = {
20088c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha256),"
20098c2ecf20Sopenharmony_ci					    "cbc(aes)))",
20108c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
20118c2ecf20Sopenharmony_ci						   "hmac-sha256-cbc-aes-"
20128c2ecf20Sopenharmony_ci						   "caam-qi2",
20138c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
20148c2ecf20Sopenharmony_ci			},
20158c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
20168c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
20178c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
20188c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
20198c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
20208c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
20218c2ecf20Sopenharmony_ci		},
20228c2ecf20Sopenharmony_ci		.caam = {
20238c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
20248c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
20258c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
20268c2ecf20Sopenharmony_ci			.geniv = true,
20278c2ecf20Sopenharmony_ci		}
20288c2ecf20Sopenharmony_ci	},
20298c2ecf20Sopenharmony_ci	{
20308c2ecf20Sopenharmony_ci		.aead = {
20318c2ecf20Sopenharmony_ci			.base = {
20328c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha384),cbc(aes))",
20338c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha384-"
20348c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi2",
20358c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
20368c2ecf20Sopenharmony_ci			},
20378c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
20388c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
20398c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
20408c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
20418c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
20428c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
20438c2ecf20Sopenharmony_ci		},
20448c2ecf20Sopenharmony_ci		.caam = {
20458c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
20468c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
20478c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
20488c2ecf20Sopenharmony_ci		}
20498c2ecf20Sopenharmony_ci	},
20508c2ecf20Sopenharmony_ci	{
20518c2ecf20Sopenharmony_ci		.aead = {
20528c2ecf20Sopenharmony_ci			.base = {
20538c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha384),"
20548c2ecf20Sopenharmony_ci					    "cbc(aes)))",
20558c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
20568c2ecf20Sopenharmony_ci						   "hmac-sha384-cbc-aes-"
20578c2ecf20Sopenharmony_ci						   "caam-qi2",
20588c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
20598c2ecf20Sopenharmony_ci			},
20608c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
20618c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
20628c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
20638c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
20648c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
20658c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
20668c2ecf20Sopenharmony_ci		},
20678c2ecf20Sopenharmony_ci		.caam = {
20688c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
20698c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
20708c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
20718c2ecf20Sopenharmony_ci			.geniv = true,
20728c2ecf20Sopenharmony_ci		}
20738c2ecf20Sopenharmony_ci	},
20748c2ecf20Sopenharmony_ci	{
20758c2ecf20Sopenharmony_ci		.aead = {
20768c2ecf20Sopenharmony_ci			.base = {
20778c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha512),cbc(aes))",
20788c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha512-"
20798c2ecf20Sopenharmony_ci						   "cbc-aes-caam-qi2",
20808c2ecf20Sopenharmony_ci				.cra_blocksize = AES_BLOCK_SIZE,
20818c2ecf20Sopenharmony_ci			},
20828c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
20838c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
20848c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
20858c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
20868c2ecf20Sopenharmony_ci			.ivsize = AES_BLOCK_SIZE,
20878c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
20888c2ecf20Sopenharmony_ci		},
20898c2ecf20Sopenharmony_ci		.caam = {
20908c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
20918c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
20928c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
20938c2ecf20Sopenharmony_ci		}
20948c2ecf20Sopenharmony_ci	},
20958c2ecf20Sopenharmony_ci	{
20968c2ecf20Sopenharmony_ci		.aead = {
20978c2ecf20Sopenharmony_ci			.base = {
20988c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha512),"
20998c2ecf20Sopenharmony_ci					    "cbc(aes)))",
21008c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
21018c2ecf20Sopenharmony_ci						   "hmac-sha512-cbc-aes-"
21028c2ecf20Sopenharmony_ci						   "caam-qi2",
21038c2ecf20Sopenharmony_ci				.cra_blocksize = AES_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 = AES_BLOCK_SIZE,
21108c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
21118c2ecf20Sopenharmony_ci		},
21128c2ecf20Sopenharmony_ci		.caam = {
21138c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
21148c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
21158c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21168c2ecf20Sopenharmony_ci			.geniv = true,
21178c2ecf20Sopenharmony_ci		}
21188c2ecf20Sopenharmony_ci	},
21198c2ecf20Sopenharmony_ci	{
21208c2ecf20Sopenharmony_ci		.aead = {
21218c2ecf20Sopenharmony_ci			.base = {
21228c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(md5),cbc(des3_ede))",
21238c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-md5-"
21248c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi2",
21258c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
21268c2ecf20Sopenharmony_ci			},
21278c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
21288c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
21298c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
21308c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
21318c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
21328c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
21338c2ecf20Sopenharmony_ci		},
21348c2ecf20Sopenharmony_ci		.caam = {
21358c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
21368c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
21378c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21388c2ecf20Sopenharmony_ci		}
21398c2ecf20Sopenharmony_ci	},
21408c2ecf20Sopenharmony_ci	{
21418c2ecf20Sopenharmony_ci		.aead = {
21428c2ecf20Sopenharmony_ci			.base = {
21438c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(md5),"
21448c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
21458c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-hmac-md5-"
21468c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi2",
21478c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
21488c2ecf20Sopenharmony_ci			},
21498c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
21508c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
21518c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
21528c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
21538c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
21548c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
21558c2ecf20Sopenharmony_ci		},
21568c2ecf20Sopenharmony_ci		.caam = {
21578c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
21588c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
21598c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21608c2ecf20Sopenharmony_ci			.geniv = true,
21618c2ecf20Sopenharmony_ci		}
21628c2ecf20Sopenharmony_ci	},
21638c2ecf20Sopenharmony_ci	{
21648c2ecf20Sopenharmony_ci		.aead = {
21658c2ecf20Sopenharmony_ci			.base = {
21668c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha1),"
21678c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
21688c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha1-"
21698c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi2",
21708c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
21718c2ecf20Sopenharmony_ci			},
21728c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
21738c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
21748c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
21758c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
21768c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
21778c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
21788c2ecf20Sopenharmony_ci		},
21798c2ecf20Sopenharmony_ci		.caam = {
21808c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
21818c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
21828c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
21838c2ecf20Sopenharmony_ci		},
21848c2ecf20Sopenharmony_ci	},
21858c2ecf20Sopenharmony_ci	{
21868c2ecf20Sopenharmony_ci		.aead = {
21878c2ecf20Sopenharmony_ci			.base = {
21888c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha1),"
21898c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
21908c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
21918c2ecf20Sopenharmony_ci						   "hmac-sha1-"
21928c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi2",
21938c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
21948c2ecf20Sopenharmony_ci			},
21958c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
21968c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
21978c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
21988c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
21998c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
22008c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
22018c2ecf20Sopenharmony_ci		},
22028c2ecf20Sopenharmony_ci		.caam = {
22038c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
22048c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
22058c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
22068c2ecf20Sopenharmony_ci			.geniv = true,
22078c2ecf20Sopenharmony_ci		}
22088c2ecf20Sopenharmony_ci	},
22098c2ecf20Sopenharmony_ci	{
22108c2ecf20Sopenharmony_ci		.aead = {
22118c2ecf20Sopenharmony_ci			.base = {
22128c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha224),"
22138c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
22148c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha224-"
22158c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi2",
22168c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
22178c2ecf20Sopenharmony_ci			},
22188c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
22198c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22208c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
22218c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
22228c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
22238c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
22248c2ecf20Sopenharmony_ci		},
22258c2ecf20Sopenharmony_ci		.caam = {
22268c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
22278c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
22288c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
22298c2ecf20Sopenharmony_ci		},
22308c2ecf20Sopenharmony_ci	},
22318c2ecf20Sopenharmony_ci	{
22328c2ecf20Sopenharmony_ci		.aead = {
22338c2ecf20Sopenharmony_ci			.base = {
22348c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha224),"
22358c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
22368c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
22378c2ecf20Sopenharmony_ci						   "hmac-sha224-"
22388c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi2",
22398c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
22408c2ecf20Sopenharmony_ci			},
22418c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
22428c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22438c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
22448c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
22458c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
22468c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
22478c2ecf20Sopenharmony_ci		},
22488c2ecf20Sopenharmony_ci		.caam = {
22498c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
22508c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
22518c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
22528c2ecf20Sopenharmony_ci			.geniv = true,
22538c2ecf20Sopenharmony_ci		}
22548c2ecf20Sopenharmony_ci	},
22558c2ecf20Sopenharmony_ci	{
22568c2ecf20Sopenharmony_ci		.aead = {
22578c2ecf20Sopenharmony_ci			.base = {
22588c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha256),"
22598c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
22608c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha256-"
22618c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi2",
22628c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
22638c2ecf20Sopenharmony_ci			},
22648c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
22658c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22668c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
22678c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
22688c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
22698c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
22708c2ecf20Sopenharmony_ci		},
22718c2ecf20Sopenharmony_ci		.caam = {
22728c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
22738c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
22748c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
22758c2ecf20Sopenharmony_ci		},
22768c2ecf20Sopenharmony_ci	},
22778c2ecf20Sopenharmony_ci	{
22788c2ecf20Sopenharmony_ci		.aead = {
22798c2ecf20Sopenharmony_ci			.base = {
22808c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha256),"
22818c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
22828c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
22838c2ecf20Sopenharmony_ci						   "hmac-sha256-"
22848c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi2",
22858c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
22868c2ecf20Sopenharmony_ci			},
22878c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
22888c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
22898c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
22908c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
22918c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
22928c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
22938c2ecf20Sopenharmony_ci		},
22948c2ecf20Sopenharmony_ci		.caam = {
22958c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
22968c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
22978c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
22988c2ecf20Sopenharmony_ci			.geniv = true,
22998c2ecf20Sopenharmony_ci		}
23008c2ecf20Sopenharmony_ci	},
23018c2ecf20Sopenharmony_ci	{
23028c2ecf20Sopenharmony_ci		.aead = {
23038c2ecf20Sopenharmony_ci			.base = {
23048c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha384),"
23058c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
23068c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha384-"
23078c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi2",
23088c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
23098c2ecf20Sopenharmony_ci			},
23108c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
23118c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
23128c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
23138c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
23148c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
23158c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
23168c2ecf20Sopenharmony_ci		},
23178c2ecf20Sopenharmony_ci		.caam = {
23188c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
23198c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
23208c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23218c2ecf20Sopenharmony_ci		},
23228c2ecf20Sopenharmony_ci	},
23238c2ecf20Sopenharmony_ci	{
23248c2ecf20Sopenharmony_ci		.aead = {
23258c2ecf20Sopenharmony_ci			.base = {
23268c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha384),"
23278c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
23288c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
23298c2ecf20Sopenharmony_ci						   "hmac-sha384-"
23308c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi2",
23318c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
23328c2ecf20Sopenharmony_ci			},
23338c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
23348c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
23358c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
23368c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
23378c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
23388c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
23398c2ecf20Sopenharmony_ci		},
23408c2ecf20Sopenharmony_ci		.caam = {
23418c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
23428c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
23438c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23448c2ecf20Sopenharmony_ci			.geniv = true,
23458c2ecf20Sopenharmony_ci		}
23468c2ecf20Sopenharmony_ci	},
23478c2ecf20Sopenharmony_ci	{
23488c2ecf20Sopenharmony_ci		.aead = {
23498c2ecf20Sopenharmony_ci			.base = {
23508c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha512),"
23518c2ecf20Sopenharmony_ci					    "cbc(des3_ede))",
23528c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha512-"
23538c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi2",
23548c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
23558c2ecf20Sopenharmony_ci			},
23568c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
23578c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
23588c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
23598c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
23608c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
23618c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
23628c2ecf20Sopenharmony_ci		},
23638c2ecf20Sopenharmony_ci		.caam = {
23648c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
23658c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
23668c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23678c2ecf20Sopenharmony_ci		},
23688c2ecf20Sopenharmony_ci	},
23698c2ecf20Sopenharmony_ci	{
23708c2ecf20Sopenharmony_ci		.aead = {
23718c2ecf20Sopenharmony_ci			.base = {
23728c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha512),"
23738c2ecf20Sopenharmony_ci					    "cbc(des3_ede)))",
23748c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
23758c2ecf20Sopenharmony_ci						   "hmac-sha512-"
23768c2ecf20Sopenharmony_ci						   "cbc-des3_ede-caam-qi2",
23778c2ecf20Sopenharmony_ci				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
23788c2ecf20Sopenharmony_ci			},
23798c2ecf20Sopenharmony_ci			.setkey = des3_aead_setkey,
23808c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
23818c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
23828c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
23838c2ecf20Sopenharmony_ci			.ivsize = DES3_EDE_BLOCK_SIZE,
23848c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
23858c2ecf20Sopenharmony_ci		},
23868c2ecf20Sopenharmony_ci		.caam = {
23878c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
23888c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
23898c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
23908c2ecf20Sopenharmony_ci			.geniv = true,
23918c2ecf20Sopenharmony_ci		}
23928c2ecf20Sopenharmony_ci	},
23938c2ecf20Sopenharmony_ci	{
23948c2ecf20Sopenharmony_ci		.aead = {
23958c2ecf20Sopenharmony_ci			.base = {
23968c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(md5),cbc(des))",
23978c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-md5-"
23988c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi2",
23998c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
24008c2ecf20Sopenharmony_ci			},
24018c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
24028c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
24038c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
24048c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
24058c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
24068c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
24078c2ecf20Sopenharmony_ci		},
24088c2ecf20Sopenharmony_ci		.caam = {
24098c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
24108c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
24118c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
24128c2ecf20Sopenharmony_ci		},
24138c2ecf20Sopenharmony_ci	},
24148c2ecf20Sopenharmony_ci	{
24158c2ecf20Sopenharmony_ci		.aead = {
24168c2ecf20Sopenharmony_ci			.base = {
24178c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(md5),"
24188c2ecf20Sopenharmony_ci					    "cbc(des)))",
24198c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-hmac-md5-"
24208c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi2",
24218c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
24228c2ecf20Sopenharmony_ci			},
24238c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
24248c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
24258c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
24268c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
24278c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
24288c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
24298c2ecf20Sopenharmony_ci		},
24308c2ecf20Sopenharmony_ci		.caam = {
24318c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
24328c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
24338c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
24348c2ecf20Sopenharmony_ci			.geniv = true,
24358c2ecf20Sopenharmony_ci		}
24368c2ecf20Sopenharmony_ci	},
24378c2ecf20Sopenharmony_ci	{
24388c2ecf20Sopenharmony_ci		.aead = {
24398c2ecf20Sopenharmony_ci			.base = {
24408c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha1),cbc(des))",
24418c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha1-"
24428c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi2",
24438c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
24448c2ecf20Sopenharmony_ci			},
24458c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
24468c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
24478c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
24488c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
24498c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
24508c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
24518c2ecf20Sopenharmony_ci		},
24528c2ecf20Sopenharmony_ci		.caam = {
24538c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
24548c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
24558c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
24568c2ecf20Sopenharmony_ci		},
24578c2ecf20Sopenharmony_ci	},
24588c2ecf20Sopenharmony_ci	{
24598c2ecf20Sopenharmony_ci		.aead = {
24608c2ecf20Sopenharmony_ci			.base = {
24618c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha1),"
24628c2ecf20Sopenharmony_ci					    "cbc(des)))",
24638c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
24648c2ecf20Sopenharmony_ci						   "hmac-sha1-cbc-des-caam-qi2",
24658c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
24668c2ecf20Sopenharmony_ci			},
24678c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
24688c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
24698c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
24708c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
24718c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
24728c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
24738c2ecf20Sopenharmony_ci		},
24748c2ecf20Sopenharmony_ci		.caam = {
24758c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
24768c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
24778c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
24788c2ecf20Sopenharmony_ci			.geniv = true,
24798c2ecf20Sopenharmony_ci		}
24808c2ecf20Sopenharmony_ci	},
24818c2ecf20Sopenharmony_ci	{
24828c2ecf20Sopenharmony_ci		.aead = {
24838c2ecf20Sopenharmony_ci			.base = {
24848c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha224),cbc(des))",
24858c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha224-"
24868c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi2",
24878c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
24888c2ecf20Sopenharmony_ci			},
24898c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
24908c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
24918c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
24928c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
24938c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
24948c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
24958c2ecf20Sopenharmony_ci		},
24968c2ecf20Sopenharmony_ci		.caam = {
24978c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
24988c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
24998c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
25008c2ecf20Sopenharmony_ci		},
25018c2ecf20Sopenharmony_ci	},
25028c2ecf20Sopenharmony_ci	{
25038c2ecf20Sopenharmony_ci		.aead = {
25048c2ecf20Sopenharmony_ci			.base = {
25058c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha224),"
25068c2ecf20Sopenharmony_ci					    "cbc(des)))",
25078c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
25088c2ecf20Sopenharmony_ci						   "hmac-sha224-cbc-des-"
25098c2ecf20Sopenharmony_ci						   "caam-qi2",
25108c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
25118c2ecf20Sopenharmony_ci			},
25128c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
25138c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
25148c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
25158c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
25168c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
25178c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
25188c2ecf20Sopenharmony_ci		},
25198c2ecf20Sopenharmony_ci		.caam = {
25208c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
25218c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
25228c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
25238c2ecf20Sopenharmony_ci			.geniv = true,
25248c2ecf20Sopenharmony_ci		}
25258c2ecf20Sopenharmony_ci	},
25268c2ecf20Sopenharmony_ci	{
25278c2ecf20Sopenharmony_ci		.aead = {
25288c2ecf20Sopenharmony_ci			.base = {
25298c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha256),cbc(des))",
25308c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha256-"
25318c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi2",
25328c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
25338c2ecf20Sopenharmony_ci			},
25348c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
25358c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
25368c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
25378c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
25388c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
25398c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
25408c2ecf20Sopenharmony_ci		},
25418c2ecf20Sopenharmony_ci		.caam = {
25428c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
25438c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
25448c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
25458c2ecf20Sopenharmony_ci		},
25468c2ecf20Sopenharmony_ci	},
25478c2ecf20Sopenharmony_ci	{
25488c2ecf20Sopenharmony_ci		.aead = {
25498c2ecf20Sopenharmony_ci			.base = {
25508c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha256),"
25518c2ecf20Sopenharmony_ci					    "cbc(des)))",
25528c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
25538c2ecf20Sopenharmony_ci						   "hmac-sha256-cbc-des-"
25548c2ecf20Sopenharmony_ci						   "caam-qi2",
25558c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
25568c2ecf20Sopenharmony_ci			},
25578c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
25588c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
25598c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
25608c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
25618c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
25628c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
25638c2ecf20Sopenharmony_ci		},
25648c2ecf20Sopenharmony_ci		.caam = {
25658c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
25668c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
25678c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
25688c2ecf20Sopenharmony_ci			.geniv = true,
25698c2ecf20Sopenharmony_ci		},
25708c2ecf20Sopenharmony_ci	},
25718c2ecf20Sopenharmony_ci	{
25728c2ecf20Sopenharmony_ci		.aead = {
25738c2ecf20Sopenharmony_ci			.base = {
25748c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha384),cbc(des))",
25758c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha384-"
25768c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi2",
25778c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
25788c2ecf20Sopenharmony_ci			},
25798c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
25808c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
25818c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
25828c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
25838c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
25848c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
25858c2ecf20Sopenharmony_ci		},
25868c2ecf20Sopenharmony_ci		.caam = {
25878c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
25888c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
25898c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
25908c2ecf20Sopenharmony_ci		},
25918c2ecf20Sopenharmony_ci	},
25928c2ecf20Sopenharmony_ci	{
25938c2ecf20Sopenharmony_ci		.aead = {
25948c2ecf20Sopenharmony_ci			.base = {
25958c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha384),"
25968c2ecf20Sopenharmony_ci					    "cbc(des)))",
25978c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
25988c2ecf20Sopenharmony_ci						   "hmac-sha384-cbc-des-"
25998c2ecf20Sopenharmony_ci						   "caam-qi2",
26008c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
26018c2ecf20Sopenharmony_ci			},
26028c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
26038c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
26048c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
26058c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
26068c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
26078c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
26088c2ecf20Sopenharmony_ci		},
26098c2ecf20Sopenharmony_ci		.caam = {
26108c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
26118c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
26128c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
26138c2ecf20Sopenharmony_ci			.geniv = true,
26148c2ecf20Sopenharmony_ci		}
26158c2ecf20Sopenharmony_ci	},
26168c2ecf20Sopenharmony_ci	{
26178c2ecf20Sopenharmony_ci		.aead = {
26188c2ecf20Sopenharmony_ci			.base = {
26198c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha512),cbc(des))",
26208c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha512-"
26218c2ecf20Sopenharmony_ci						   "cbc-des-caam-qi2",
26228c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
26238c2ecf20Sopenharmony_ci			},
26248c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
26258c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
26268c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
26278c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
26288c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
26298c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
26308c2ecf20Sopenharmony_ci		},
26318c2ecf20Sopenharmony_ci		.caam = {
26328c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
26338c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
26348c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
26358c2ecf20Sopenharmony_ci		}
26368c2ecf20Sopenharmony_ci	},
26378c2ecf20Sopenharmony_ci	{
26388c2ecf20Sopenharmony_ci		.aead = {
26398c2ecf20Sopenharmony_ci			.base = {
26408c2ecf20Sopenharmony_ci				.cra_name = "echainiv(authenc(hmac(sha512),"
26418c2ecf20Sopenharmony_ci					    "cbc(des)))",
26428c2ecf20Sopenharmony_ci				.cra_driver_name = "echainiv-authenc-"
26438c2ecf20Sopenharmony_ci						   "hmac-sha512-cbc-des-"
26448c2ecf20Sopenharmony_ci						   "caam-qi2",
26458c2ecf20Sopenharmony_ci				.cra_blocksize = DES_BLOCK_SIZE,
26468c2ecf20Sopenharmony_ci			},
26478c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
26488c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
26498c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
26508c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
26518c2ecf20Sopenharmony_ci			.ivsize = DES_BLOCK_SIZE,
26528c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
26538c2ecf20Sopenharmony_ci		},
26548c2ecf20Sopenharmony_ci		.caam = {
26558c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
26568c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
26578c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
26588c2ecf20Sopenharmony_ci			.geniv = true,
26598c2ecf20Sopenharmony_ci		}
26608c2ecf20Sopenharmony_ci	},
26618c2ecf20Sopenharmony_ci	{
26628c2ecf20Sopenharmony_ci		.aead = {
26638c2ecf20Sopenharmony_ci			.base = {
26648c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(md5),"
26658c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes)))",
26668c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-md5-"
26678c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam-qi2",
26688c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
26698c2ecf20Sopenharmony_ci			},
26708c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
26718c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
26728c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
26738c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
26748c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
26758c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
26768c2ecf20Sopenharmony_ci		},
26778c2ecf20Sopenharmony_ci		.caam = {
26788c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
26798c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
26808c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
26818c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
26828c2ecf20Sopenharmony_ci			.rfc3686 = true,
26838c2ecf20Sopenharmony_ci		},
26848c2ecf20Sopenharmony_ci	},
26858c2ecf20Sopenharmony_ci	{
26868c2ecf20Sopenharmony_ci		.aead = {
26878c2ecf20Sopenharmony_ci			.base = {
26888c2ecf20Sopenharmony_ci				.cra_name = "seqiv(authenc("
26898c2ecf20Sopenharmony_ci					    "hmac(md5),rfc3686(ctr(aes))))",
26908c2ecf20Sopenharmony_ci				.cra_driver_name = "seqiv-authenc-hmac-md5-"
26918c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam-qi2",
26928c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
26938c2ecf20Sopenharmony_ci			},
26948c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
26958c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
26968c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
26978c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
26988c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
26998c2ecf20Sopenharmony_ci			.maxauthsize = MD5_DIGEST_SIZE,
27008c2ecf20Sopenharmony_ci		},
27018c2ecf20Sopenharmony_ci		.caam = {
27028c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
27038c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
27048c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
27058c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
27068c2ecf20Sopenharmony_ci			.rfc3686 = true,
27078c2ecf20Sopenharmony_ci			.geniv = true,
27088c2ecf20Sopenharmony_ci		},
27098c2ecf20Sopenharmony_ci	},
27108c2ecf20Sopenharmony_ci	{
27118c2ecf20Sopenharmony_ci		.aead = {
27128c2ecf20Sopenharmony_ci			.base = {
27138c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha1),"
27148c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes)))",
27158c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha1-"
27168c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam-qi2",
27178c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
27188c2ecf20Sopenharmony_ci			},
27198c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
27208c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
27218c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
27228c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
27238c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
27248c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
27258c2ecf20Sopenharmony_ci		},
27268c2ecf20Sopenharmony_ci		.caam = {
27278c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
27288c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
27298c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
27308c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
27318c2ecf20Sopenharmony_ci			.rfc3686 = true,
27328c2ecf20Sopenharmony_ci		},
27338c2ecf20Sopenharmony_ci	},
27348c2ecf20Sopenharmony_ci	{
27358c2ecf20Sopenharmony_ci		.aead = {
27368c2ecf20Sopenharmony_ci			.base = {
27378c2ecf20Sopenharmony_ci				.cra_name = "seqiv(authenc("
27388c2ecf20Sopenharmony_ci					    "hmac(sha1),rfc3686(ctr(aes))))",
27398c2ecf20Sopenharmony_ci				.cra_driver_name = "seqiv-authenc-hmac-sha1-"
27408c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam-qi2",
27418c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
27428c2ecf20Sopenharmony_ci			},
27438c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
27448c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
27458c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
27468c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
27478c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
27488c2ecf20Sopenharmony_ci			.maxauthsize = SHA1_DIGEST_SIZE,
27498c2ecf20Sopenharmony_ci		},
27508c2ecf20Sopenharmony_ci		.caam = {
27518c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
27528c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
27538c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
27548c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
27558c2ecf20Sopenharmony_ci			.rfc3686 = true,
27568c2ecf20Sopenharmony_ci			.geniv = true,
27578c2ecf20Sopenharmony_ci		},
27588c2ecf20Sopenharmony_ci	},
27598c2ecf20Sopenharmony_ci	{
27608c2ecf20Sopenharmony_ci		.aead = {
27618c2ecf20Sopenharmony_ci			.base = {
27628c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha224),"
27638c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes)))",
27648c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha224-"
27658c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam-qi2",
27668c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
27678c2ecf20Sopenharmony_ci			},
27688c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
27698c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
27708c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
27718c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
27728c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
27738c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
27748c2ecf20Sopenharmony_ci		},
27758c2ecf20Sopenharmony_ci		.caam = {
27768c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
27778c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
27788c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
27798c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
27808c2ecf20Sopenharmony_ci			.rfc3686 = true,
27818c2ecf20Sopenharmony_ci		},
27828c2ecf20Sopenharmony_ci	},
27838c2ecf20Sopenharmony_ci	{
27848c2ecf20Sopenharmony_ci		.aead = {
27858c2ecf20Sopenharmony_ci			.base = {
27868c2ecf20Sopenharmony_ci				.cra_name = "seqiv(authenc("
27878c2ecf20Sopenharmony_ci					    "hmac(sha224),rfc3686(ctr(aes))))",
27888c2ecf20Sopenharmony_ci				.cra_driver_name = "seqiv-authenc-hmac-sha224-"
27898c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam-qi2",
27908c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
27918c2ecf20Sopenharmony_ci			},
27928c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
27938c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
27948c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
27958c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
27968c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
27978c2ecf20Sopenharmony_ci			.maxauthsize = SHA224_DIGEST_SIZE,
27988c2ecf20Sopenharmony_ci		},
27998c2ecf20Sopenharmony_ci		.caam = {
28008c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
28018c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
28028c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
28038c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
28048c2ecf20Sopenharmony_ci			.rfc3686 = true,
28058c2ecf20Sopenharmony_ci			.geniv = true,
28068c2ecf20Sopenharmony_ci		},
28078c2ecf20Sopenharmony_ci	},
28088c2ecf20Sopenharmony_ci	{
28098c2ecf20Sopenharmony_ci		.aead = {
28108c2ecf20Sopenharmony_ci			.base = {
28118c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha256),"
28128c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes)))",
28138c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha256-"
28148c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam-qi2",
28158c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
28168c2ecf20Sopenharmony_ci			},
28178c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
28188c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
28198c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
28208c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
28218c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
28228c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
28238c2ecf20Sopenharmony_ci		},
28248c2ecf20Sopenharmony_ci		.caam = {
28258c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
28268c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
28278c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
28288c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
28298c2ecf20Sopenharmony_ci			.rfc3686 = true,
28308c2ecf20Sopenharmony_ci		},
28318c2ecf20Sopenharmony_ci	},
28328c2ecf20Sopenharmony_ci	{
28338c2ecf20Sopenharmony_ci		.aead = {
28348c2ecf20Sopenharmony_ci			.base = {
28358c2ecf20Sopenharmony_ci				.cra_name = "seqiv(authenc(hmac(sha256),"
28368c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes))))",
28378c2ecf20Sopenharmony_ci				.cra_driver_name = "seqiv-authenc-hmac-sha256-"
28388c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam-qi2",
28398c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
28408c2ecf20Sopenharmony_ci			},
28418c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
28428c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
28438c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
28448c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
28458c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
28468c2ecf20Sopenharmony_ci			.maxauthsize = SHA256_DIGEST_SIZE,
28478c2ecf20Sopenharmony_ci		},
28488c2ecf20Sopenharmony_ci		.caam = {
28498c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
28508c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
28518c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
28528c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
28538c2ecf20Sopenharmony_ci			.rfc3686 = true,
28548c2ecf20Sopenharmony_ci			.geniv = true,
28558c2ecf20Sopenharmony_ci		},
28568c2ecf20Sopenharmony_ci	},
28578c2ecf20Sopenharmony_ci	{
28588c2ecf20Sopenharmony_ci		.aead = {
28598c2ecf20Sopenharmony_ci			.base = {
28608c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha384),"
28618c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes)))",
28628c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha384-"
28638c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam-qi2",
28648c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
28658c2ecf20Sopenharmony_ci			},
28668c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
28678c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
28688c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
28698c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
28708c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
28718c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
28728c2ecf20Sopenharmony_ci		},
28738c2ecf20Sopenharmony_ci		.caam = {
28748c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
28758c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
28768c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
28778c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
28788c2ecf20Sopenharmony_ci			.rfc3686 = true,
28798c2ecf20Sopenharmony_ci		},
28808c2ecf20Sopenharmony_ci	},
28818c2ecf20Sopenharmony_ci	{
28828c2ecf20Sopenharmony_ci		.aead = {
28838c2ecf20Sopenharmony_ci			.base = {
28848c2ecf20Sopenharmony_ci				.cra_name = "seqiv(authenc(hmac(sha384),"
28858c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes))))",
28868c2ecf20Sopenharmony_ci				.cra_driver_name = "seqiv-authenc-hmac-sha384-"
28878c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam-qi2",
28888c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
28898c2ecf20Sopenharmony_ci			},
28908c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
28918c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
28928c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
28938c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
28948c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
28958c2ecf20Sopenharmony_ci			.maxauthsize = SHA384_DIGEST_SIZE,
28968c2ecf20Sopenharmony_ci		},
28978c2ecf20Sopenharmony_ci		.caam = {
28988c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
28998c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
29008c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
29018c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
29028c2ecf20Sopenharmony_ci			.rfc3686 = true,
29038c2ecf20Sopenharmony_ci			.geniv = true,
29048c2ecf20Sopenharmony_ci		},
29058c2ecf20Sopenharmony_ci	},
29068c2ecf20Sopenharmony_ci	{
29078c2ecf20Sopenharmony_ci		.aead = {
29088c2ecf20Sopenharmony_ci			.base = {
29098c2ecf20Sopenharmony_ci				.cra_name = "rfc7539(chacha20,poly1305)",
29108c2ecf20Sopenharmony_ci				.cra_driver_name = "rfc7539-chacha20-poly1305-"
29118c2ecf20Sopenharmony_ci						   "caam-qi2",
29128c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
29138c2ecf20Sopenharmony_ci			},
29148c2ecf20Sopenharmony_ci			.setkey = chachapoly_setkey,
29158c2ecf20Sopenharmony_ci			.setauthsize = chachapoly_setauthsize,
29168c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
29178c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
29188c2ecf20Sopenharmony_ci			.ivsize = CHACHAPOLY_IV_SIZE,
29198c2ecf20Sopenharmony_ci			.maxauthsize = POLY1305_DIGEST_SIZE,
29208c2ecf20Sopenharmony_ci		},
29218c2ecf20Sopenharmony_ci		.caam = {
29228c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_CHACHA20 |
29238c2ecf20Sopenharmony_ci					   OP_ALG_AAI_AEAD,
29248c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_POLY1305 |
29258c2ecf20Sopenharmony_ci					   OP_ALG_AAI_AEAD,
29268c2ecf20Sopenharmony_ci			.nodkp = true,
29278c2ecf20Sopenharmony_ci		},
29288c2ecf20Sopenharmony_ci	},
29298c2ecf20Sopenharmony_ci	{
29308c2ecf20Sopenharmony_ci		.aead = {
29318c2ecf20Sopenharmony_ci			.base = {
29328c2ecf20Sopenharmony_ci				.cra_name = "rfc7539esp(chacha20,poly1305)",
29338c2ecf20Sopenharmony_ci				.cra_driver_name = "rfc7539esp-chacha20-"
29348c2ecf20Sopenharmony_ci						   "poly1305-caam-qi2",
29358c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
29368c2ecf20Sopenharmony_ci			},
29378c2ecf20Sopenharmony_ci			.setkey = chachapoly_setkey,
29388c2ecf20Sopenharmony_ci			.setauthsize = chachapoly_setauthsize,
29398c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
29408c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
29418c2ecf20Sopenharmony_ci			.ivsize = 8,
29428c2ecf20Sopenharmony_ci			.maxauthsize = POLY1305_DIGEST_SIZE,
29438c2ecf20Sopenharmony_ci		},
29448c2ecf20Sopenharmony_ci		.caam = {
29458c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_CHACHA20 |
29468c2ecf20Sopenharmony_ci					   OP_ALG_AAI_AEAD,
29478c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_POLY1305 |
29488c2ecf20Sopenharmony_ci					   OP_ALG_AAI_AEAD,
29498c2ecf20Sopenharmony_ci			.nodkp = true,
29508c2ecf20Sopenharmony_ci		},
29518c2ecf20Sopenharmony_ci	},
29528c2ecf20Sopenharmony_ci	{
29538c2ecf20Sopenharmony_ci		.aead = {
29548c2ecf20Sopenharmony_ci			.base = {
29558c2ecf20Sopenharmony_ci				.cra_name = "authenc(hmac(sha512),"
29568c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes)))",
29578c2ecf20Sopenharmony_ci				.cra_driver_name = "authenc-hmac-sha512-"
29588c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam-qi2",
29598c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
29608c2ecf20Sopenharmony_ci			},
29618c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
29628c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
29638c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
29648c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
29658c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
29668c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
29678c2ecf20Sopenharmony_ci		},
29688c2ecf20Sopenharmony_ci		.caam = {
29698c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
29708c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
29718c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
29728c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
29738c2ecf20Sopenharmony_ci			.rfc3686 = true,
29748c2ecf20Sopenharmony_ci		},
29758c2ecf20Sopenharmony_ci	},
29768c2ecf20Sopenharmony_ci	{
29778c2ecf20Sopenharmony_ci		.aead = {
29788c2ecf20Sopenharmony_ci			.base = {
29798c2ecf20Sopenharmony_ci				.cra_name = "seqiv(authenc(hmac(sha512),"
29808c2ecf20Sopenharmony_ci					    "rfc3686(ctr(aes))))",
29818c2ecf20Sopenharmony_ci				.cra_driver_name = "seqiv-authenc-hmac-sha512-"
29828c2ecf20Sopenharmony_ci						   "rfc3686-ctr-aes-caam-qi2",
29838c2ecf20Sopenharmony_ci				.cra_blocksize = 1,
29848c2ecf20Sopenharmony_ci			},
29858c2ecf20Sopenharmony_ci			.setkey = aead_setkey,
29868c2ecf20Sopenharmony_ci			.setauthsize = aead_setauthsize,
29878c2ecf20Sopenharmony_ci			.encrypt = aead_encrypt,
29888c2ecf20Sopenharmony_ci			.decrypt = aead_decrypt,
29898c2ecf20Sopenharmony_ci			.ivsize = CTR_RFC3686_IV_SIZE,
29908c2ecf20Sopenharmony_ci			.maxauthsize = SHA512_DIGEST_SIZE,
29918c2ecf20Sopenharmony_ci		},
29928c2ecf20Sopenharmony_ci		.caam = {
29938c2ecf20Sopenharmony_ci			.class1_alg_type = OP_ALG_ALGSEL_AES |
29948c2ecf20Sopenharmony_ci					   OP_ALG_AAI_CTR_MOD128,
29958c2ecf20Sopenharmony_ci			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
29968c2ecf20Sopenharmony_ci					   OP_ALG_AAI_HMAC_PRECOMP,
29978c2ecf20Sopenharmony_ci			.rfc3686 = true,
29988c2ecf20Sopenharmony_ci			.geniv = true,
29998c2ecf20Sopenharmony_ci		},
30008c2ecf20Sopenharmony_ci	},
30018c2ecf20Sopenharmony_ci};
30028c2ecf20Sopenharmony_ci
30038c2ecf20Sopenharmony_cistatic void caam_skcipher_alg_init(struct caam_skcipher_alg *t_alg)
30048c2ecf20Sopenharmony_ci{
30058c2ecf20Sopenharmony_ci	struct skcipher_alg *alg = &t_alg->skcipher;
30068c2ecf20Sopenharmony_ci
30078c2ecf20Sopenharmony_ci	alg->base.cra_module = THIS_MODULE;
30088c2ecf20Sopenharmony_ci	alg->base.cra_priority = CAAM_CRA_PRIORITY;
30098c2ecf20Sopenharmony_ci	alg->base.cra_ctxsize = sizeof(struct caam_ctx);
30108c2ecf20Sopenharmony_ci	alg->base.cra_flags |= (CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY |
30118c2ecf20Sopenharmony_ci			      CRYPTO_ALG_KERN_DRIVER_ONLY);
30128c2ecf20Sopenharmony_ci
30138c2ecf20Sopenharmony_ci	alg->init = caam_cra_init_skcipher;
30148c2ecf20Sopenharmony_ci	alg->exit = caam_cra_exit;
30158c2ecf20Sopenharmony_ci}
30168c2ecf20Sopenharmony_ci
30178c2ecf20Sopenharmony_cistatic void caam_aead_alg_init(struct caam_aead_alg *t_alg)
30188c2ecf20Sopenharmony_ci{
30198c2ecf20Sopenharmony_ci	struct aead_alg *alg = &t_alg->aead;
30208c2ecf20Sopenharmony_ci
30218c2ecf20Sopenharmony_ci	alg->base.cra_module = THIS_MODULE;
30228c2ecf20Sopenharmony_ci	alg->base.cra_priority = CAAM_CRA_PRIORITY;
30238c2ecf20Sopenharmony_ci	alg->base.cra_ctxsize = sizeof(struct caam_ctx);
30248c2ecf20Sopenharmony_ci	alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY |
30258c2ecf20Sopenharmony_ci			      CRYPTO_ALG_KERN_DRIVER_ONLY;
30268c2ecf20Sopenharmony_ci
30278c2ecf20Sopenharmony_ci	alg->init = caam_cra_init_aead;
30288c2ecf20Sopenharmony_ci	alg->exit = caam_cra_exit_aead;
30298c2ecf20Sopenharmony_ci}
30308c2ecf20Sopenharmony_ci
30318c2ecf20Sopenharmony_ci/* max hash key is max split key size */
30328c2ecf20Sopenharmony_ci#define CAAM_MAX_HASH_KEY_SIZE		(SHA512_DIGEST_SIZE * 2)
30338c2ecf20Sopenharmony_ci
30348c2ecf20Sopenharmony_ci#define CAAM_MAX_HASH_BLOCK_SIZE	SHA512_BLOCK_SIZE
30358c2ecf20Sopenharmony_ci
30368c2ecf20Sopenharmony_ci/* caam context sizes for hashes: running digest + 8 */
30378c2ecf20Sopenharmony_ci#define HASH_MSG_LEN			8
30388c2ecf20Sopenharmony_ci#define MAX_CTX_LEN			(HASH_MSG_LEN + SHA512_DIGEST_SIZE)
30398c2ecf20Sopenharmony_ci
30408c2ecf20Sopenharmony_cienum hash_optype {
30418c2ecf20Sopenharmony_ci	UPDATE = 0,
30428c2ecf20Sopenharmony_ci	UPDATE_FIRST,
30438c2ecf20Sopenharmony_ci	FINALIZE,
30448c2ecf20Sopenharmony_ci	DIGEST,
30458c2ecf20Sopenharmony_ci	HASH_NUM_OP
30468c2ecf20Sopenharmony_ci};
30478c2ecf20Sopenharmony_ci
30488c2ecf20Sopenharmony_ci/**
30498c2ecf20Sopenharmony_ci * struct caam_hash_ctx - ahash per-session context
30508c2ecf20Sopenharmony_ci * @flc: Flow Contexts array
30518c2ecf20Sopenharmony_ci * @key: authentication key
30528c2ecf20Sopenharmony_ci * @flc_dma: I/O virtual addresses of the Flow Contexts
30538c2ecf20Sopenharmony_ci * @dev: dpseci device
30548c2ecf20Sopenharmony_ci * @ctx_len: size of Context Register
30558c2ecf20Sopenharmony_ci * @adata: hashing algorithm details
30568c2ecf20Sopenharmony_ci */
30578c2ecf20Sopenharmony_cistruct caam_hash_ctx {
30588c2ecf20Sopenharmony_ci	struct caam_flc flc[HASH_NUM_OP];
30598c2ecf20Sopenharmony_ci	u8 key[CAAM_MAX_HASH_BLOCK_SIZE] ____cacheline_aligned;
30608c2ecf20Sopenharmony_ci	dma_addr_t flc_dma[HASH_NUM_OP];
30618c2ecf20Sopenharmony_ci	struct device *dev;
30628c2ecf20Sopenharmony_ci	int ctx_len;
30638c2ecf20Sopenharmony_ci	struct alginfo adata;
30648c2ecf20Sopenharmony_ci};
30658c2ecf20Sopenharmony_ci
30668c2ecf20Sopenharmony_ci/* ahash state */
30678c2ecf20Sopenharmony_cistruct caam_hash_state {
30688c2ecf20Sopenharmony_ci	struct caam_request caam_req;
30698c2ecf20Sopenharmony_ci	dma_addr_t buf_dma;
30708c2ecf20Sopenharmony_ci	dma_addr_t ctx_dma;
30718c2ecf20Sopenharmony_ci	int ctx_dma_len;
30728c2ecf20Sopenharmony_ci	u8 buf[CAAM_MAX_HASH_BLOCK_SIZE] ____cacheline_aligned;
30738c2ecf20Sopenharmony_ci	int buflen;
30748c2ecf20Sopenharmony_ci	int next_buflen;
30758c2ecf20Sopenharmony_ci	u8 caam_ctx[MAX_CTX_LEN] ____cacheline_aligned;
30768c2ecf20Sopenharmony_ci	int (*update)(struct ahash_request *req);
30778c2ecf20Sopenharmony_ci	int (*final)(struct ahash_request *req);
30788c2ecf20Sopenharmony_ci	int (*finup)(struct ahash_request *req);
30798c2ecf20Sopenharmony_ci};
30808c2ecf20Sopenharmony_ci
30818c2ecf20Sopenharmony_cistruct caam_export_state {
30828c2ecf20Sopenharmony_ci	u8 buf[CAAM_MAX_HASH_BLOCK_SIZE];
30838c2ecf20Sopenharmony_ci	u8 caam_ctx[MAX_CTX_LEN];
30848c2ecf20Sopenharmony_ci	int buflen;
30858c2ecf20Sopenharmony_ci	int (*update)(struct ahash_request *req);
30868c2ecf20Sopenharmony_ci	int (*final)(struct ahash_request *req);
30878c2ecf20Sopenharmony_ci	int (*finup)(struct ahash_request *req);
30888c2ecf20Sopenharmony_ci};
30898c2ecf20Sopenharmony_ci
30908c2ecf20Sopenharmony_ci/* Map current buffer in state (if length > 0) and put it in link table */
30918c2ecf20Sopenharmony_cistatic inline int buf_map_to_qm_sg(struct device *dev,
30928c2ecf20Sopenharmony_ci				   struct dpaa2_sg_entry *qm_sg,
30938c2ecf20Sopenharmony_ci				   struct caam_hash_state *state)
30948c2ecf20Sopenharmony_ci{
30958c2ecf20Sopenharmony_ci	int buflen = state->buflen;
30968c2ecf20Sopenharmony_ci
30978c2ecf20Sopenharmony_ci	if (!buflen)
30988c2ecf20Sopenharmony_ci		return 0;
30998c2ecf20Sopenharmony_ci
31008c2ecf20Sopenharmony_ci	state->buf_dma = dma_map_single(dev, state->buf, buflen,
31018c2ecf20Sopenharmony_ci					DMA_TO_DEVICE);
31028c2ecf20Sopenharmony_ci	if (dma_mapping_error(dev, state->buf_dma)) {
31038c2ecf20Sopenharmony_ci		dev_err(dev, "unable to map buf\n");
31048c2ecf20Sopenharmony_ci		state->buf_dma = 0;
31058c2ecf20Sopenharmony_ci		return -ENOMEM;
31068c2ecf20Sopenharmony_ci	}
31078c2ecf20Sopenharmony_ci
31088c2ecf20Sopenharmony_ci	dma_to_qm_sg_one(qm_sg, state->buf_dma, buflen, 0);
31098c2ecf20Sopenharmony_ci
31108c2ecf20Sopenharmony_ci	return 0;
31118c2ecf20Sopenharmony_ci}
31128c2ecf20Sopenharmony_ci
31138c2ecf20Sopenharmony_ci/* Map state->caam_ctx, and add it to link table */
31148c2ecf20Sopenharmony_cistatic inline int ctx_map_to_qm_sg(struct device *dev,
31158c2ecf20Sopenharmony_ci				   struct caam_hash_state *state, int ctx_len,
31168c2ecf20Sopenharmony_ci				   struct dpaa2_sg_entry *qm_sg, u32 flag)
31178c2ecf20Sopenharmony_ci{
31188c2ecf20Sopenharmony_ci	state->ctx_dma_len = ctx_len;
31198c2ecf20Sopenharmony_ci	state->ctx_dma = dma_map_single(dev, state->caam_ctx, ctx_len, flag);
31208c2ecf20Sopenharmony_ci	if (dma_mapping_error(dev, state->ctx_dma)) {
31218c2ecf20Sopenharmony_ci		dev_err(dev, "unable to map ctx\n");
31228c2ecf20Sopenharmony_ci		state->ctx_dma = 0;
31238c2ecf20Sopenharmony_ci		return -ENOMEM;
31248c2ecf20Sopenharmony_ci	}
31258c2ecf20Sopenharmony_ci
31268c2ecf20Sopenharmony_ci	dma_to_qm_sg_one(qm_sg, state->ctx_dma, ctx_len, 0);
31278c2ecf20Sopenharmony_ci
31288c2ecf20Sopenharmony_ci	return 0;
31298c2ecf20Sopenharmony_ci}
31308c2ecf20Sopenharmony_ci
31318c2ecf20Sopenharmony_cistatic int ahash_set_sh_desc(struct crypto_ahash *ahash)
31328c2ecf20Sopenharmony_ci{
31338c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
31348c2ecf20Sopenharmony_ci	int digestsize = crypto_ahash_digestsize(ahash);
31358c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv *priv = dev_get_drvdata(ctx->dev);
31368c2ecf20Sopenharmony_ci	struct caam_flc *flc;
31378c2ecf20Sopenharmony_ci	u32 *desc;
31388c2ecf20Sopenharmony_ci
31398c2ecf20Sopenharmony_ci	/* ahash_update shared descriptor */
31408c2ecf20Sopenharmony_ci	flc = &ctx->flc[UPDATE];
31418c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
31428c2ecf20Sopenharmony_ci	cnstr_shdsc_ahash(desc, &ctx->adata, OP_ALG_AS_UPDATE, ctx->ctx_len,
31438c2ecf20Sopenharmony_ci			  ctx->ctx_len, true, priv->sec_attr.era);
31448c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
31458c2ecf20Sopenharmony_ci	dma_sync_single_for_device(ctx->dev, ctx->flc_dma[UPDATE],
31468c2ecf20Sopenharmony_ci				   desc_bytes(desc), DMA_BIDIRECTIONAL);
31478c2ecf20Sopenharmony_ci	print_hex_dump_debug("ahash update shdesc@" __stringify(__LINE__)": ",
31488c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
31498c2ecf20Sopenharmony_ci			     1);
31508c2ecf20Sopenharmony_ci
31518c2ecf20Sopenharmony_ci	/* ahash_update_first shared descriptor */
31528c2ecf20Sopenharmony_ci	flc = &ctx->flc[UPDATE_FIRST];
31538c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
31548c2ecf20Sopenharmony_ci	cnstr_shdsc_ahash(desc, &ctx->adata, OP_ALG_AS_INIT, ctx->ctx_len,
31558c2ecf20Sopenharmony_ci			  ctx->ctx_len, false, priv->sec_attr.era);
31568c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
31578c2ecf20Sopenharmony_ci	dma_sync_single_for_device(ctx->dev, ctx->flc_dma[UPDATE_FIRST],
31588c2ecf20Sopenharmony_ci				   desc_bytes(desc), DMA_BIDIRECTIONAL);
31598c2ecf20Sopenharmony_ci	print_hex_dump_debug("ahash update first shdesc@" __stringify(__LINE__)": ",
31608c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
31618c2ecf20Sopenharmony_ci			     1);
31628c2ecf20Sopenharmony_ci
31638c2ecf20Sopenharmony_ci	/* ahash_final shared descriptor */
31648c2ecf20Sopenharmony_ci	flc = &ctx->flc[FINALIZE];
31658c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
31668c2ecf20Sopenharmony_ci	cnstr_shdsc_ahash(desc, &ctx->adata, OP_ALG_AS_FINALIZE, digestsize,
31678c2ecf20Sopenharmony_ci			  ctx->ctx_len, true, priv->sec_attr.era);
31688c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
31698c2ecf20Sopenharmony_ci	dma_sync_single_for_device(ctx->dev, ctx->flc_dma[FINALIZE],
31708c2ecf20Sopenharmony_ci				   desc_bytes(desc), DMA_BIDIRECTIONAL);
31718c2ecf20Sopenharmony_ci	print_hex_dump_debug("ahash final shdesc@" __stringify(__LINE__)": ",
31728c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
31738c2ecf20Sopenharmony_ci			     1);
31748c2ecf20Sopenharmony_ci
31758c2ecf20Sopenharmony_ci	/* ahash_digest shared descriptor */
31768c2ecf20Sopenharmony_ci	flc = &ctx->flc[DIGEST];
31778c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
31788c2ecf20Sopenharmony_ci	cnstr_shdsc_ahash(desc, &ctx->adata, OP_ALG_AS_INITFINAL, digestsize,
31798c2ecf20Sopenharmony_ci			  ctx->ctx_len, false, priv->sec_attr.era);
31808c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
31818c2ecf20Sopenharmony_ci	dma_sync_single_for_device(ctx->dev, ctx->flc_dma[DIGEST],
31828c2ecf20Sopenharmony_ci				   desc_bytes(desc), DMA_BIDIRECTIONAL);
31838c2ecf20Sopenharmony_ci	print_hex_dump_debug("ahash digest shdesc@" __stringify(__LINE__)": ",
31848c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
31858c2ecf20Sopenharmony_ci			     1);
31868c2ecf20Sopenharmony_ci
31878c2ecf20Sopenharmony_ci	return 0;
31888c2ecf20Sopenharmony_ci}
31898c2ecf20Sopenharmony_ci
31908c2ecf20Sopenharmony_cistruct split_key_sh_result {
31918c2ecf20Sopenharmony_ci	struct completion completion;
31928c2ecf20Sopenharmony_ci	int err;
31938c2ecf20Sopenharmony_ci	struct device *dev;
31948c2ecf20Sopenharmony_ci};
31958c2ecf20Sopenharmony_ci
31968c2ecf20Sopenharmony_cistatic void split_key_sh_done(void *cbk_ctx, u32 err)
31978c2ecf20Sopenharmony_ci{
31988c2ecf20Sopenharmony_ci	struct split_key_sh_result *res = cbk_ctx;
31998c2ecf20Sopenharmony_ci
32008c2ecf20Sopenharmony_ci	dev_dbg(res->dev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
32018c2ecf20Sopenharmony_ci
32028c2ecf20Sopenharmony_ci	res->err = err ? caam_qi2_strstatus(res->dev, err) : 0;
32038c2ecf20Sopenharmony_ci	complete(&res->completion);
32048c2ecf20Sopenharmony_ci}
32058c2ecf20Sopenharmony_ci
32068c2ecf20Sopenharmony_ci/* Digest hash size if it is too large */
32078c2ecf20Sopenharmony_cistatic int hash_digest_key(struct caam_hash_ctx *ctx, u32 *keylen, u8 *key,
32088c2ecf20Sopenharmony_ci			   u32 digestsize)
32098c2ecf20Sopenharmony_ci{
32108c2ecf20Sopenharmony_ci	struct caam_request *req_ctx;
32118c2ecf20Sopenharmony_ci	u32 *desc;
32128c2ecf20Sopenharmony_ci	struct split_key_sh_result result;
32138c2ecf20Sopenharmony_ci	dma_addr_t key_dma;
32148c2ecf20Sopenharmony_ci	struct caam_flc *flc;
32158c2ecf20Sopenharmony_ci	dma_addr_t flc_dma;
32168c2ecf20Sopenharmony_ci	int ret = -ENOMEM;
32178c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *in_fle, *out_fle;
32188c2ecf20Sopenharmony_ci
32198c2ecf20Sopenharmony_ci	req_ctx = kzalloc(sizeof(*req_ctx), GFP_KERNEL | GFP_DMA);
32208c2ecf20Sopenharmony_ci	if (!req_ctx)
32218c2ecf20Sopenharmony_ci		return -ENOMEM;
32228c2ecf20Sopenharmony_ci
32238c2ecf20Sopenharmony_ci	in_fle = &req_ctx->fd_flt[1];
32248c2ecf20Sopenharmony_ci	out_fle = &req_ctx->fd_flt[0];
32258c2ecf20Sopenharmony_ci
32268c2ecf20Sopenharmony_ci	flc = kzalloc(sizeof(*flc), GFP_KERNEL | GFP_DMA);
32278c2ecf20Sopenharmony_ci	if (!flc)
32288c2ecf20Sopenharmony_ci		goto err_flc;
32298c2ecf20Sopenharmony_ci
32308c2ecf20Sopenharmony_ci	key_dma = dma_map_single(ctx->dev, key, *keylen, DMA_BIDIRECTIONAL);
32318c2ecf20Sopenharmony_ci	if (dma_mapping_error(ctx->dev, key_dma)) {
32328c2ecf20Sopenharmony_ci		dev_err(ctx->dev, "unable to map key memory\n");
32338c2ecf20Sopenharmony_ci		goto err_key_dma;
32348c2ecf20Sopenharmony_ci	}
32358c2ecf20Sopenharmony_ci
32368c2ecf20Sopenharmony_ci	desc = flc->sh_desc;
32378c2ecf20Sopenharmony_ci
32388c2ecf20Sopenharmony_ci	init_sh_desc(desc, 0);
32398c2ecf20Sopenharmony_ci
32408c2ecf20Sopenharmony_ci	/* descriptor to perform unkeyed hash on key_in */
32418c2ecf20Sopenharmony_ci	append_operation(desc, ctx->adata.algtype | OP_ALG_ENCRYPT |
32428c2ecf20Sopenharmony_ci			 OP_ALG_AS_INITFINAL);
32438c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, *keylen, FIFOLD_CLASS_CLASS2 |
32448c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_MSG);
32458c2ecf20Sopenharmony_ci	append_seq_store(desc, digestsize, LDST_CLASS_2_CCB |
32468c2ecf20Sopenharmony_ci			 LDST_SRCDST_BYTE_CONTEXT);
32478c2ecf20Sopenharmony_ci
32488c2ecf20Sopenharmony_ci	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */
32498c2ecf20Sopenharmony_ci	flc_dma = dma_map_single(ctx->dev, flc, sizeof(flc->flc) +
32508c2ecf20Sopenharmony_ci				 desc_bytes(desc), DMA_TO_DEVICE);
32518c2ecf20Sopenharmony_ci	if (dma_mapping_error(ctx->dev, flc_dma)) {
32528c2ecf20Sopenharmony_ci		dev_err(ctx->dev, "unable to map shared descriptor\n");
32538c2ecf20Sopenharmony_ci		goto err_flc_dma;
32548c2ecf20Sopenharmony_ci	}
32558c2ecf20Sopenharmony_ci
32568c2ecf20Sopenharmony_ci	dpaa2_fl_set_final(in_fle, true);
32578c2ecf20Sopenharmony_ci	dpaa2_fl_set_format(in_fle, dpaa2_fl_single);
32588c2ecf20Sopenharmony_ci	dpaa2_fl_set_addr(in_fle, key_dma);
32598c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(in_fle, *keylen);
32608c2ecf20Sopenharmony_ci	dpaa2_fl_set_format(out_fle, dpaa2_fl_single);
32618c2ecf20Sopenharmony_ci	dpaa2_fl_set_addr(out_fle, key_dma);
32628c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(out_fle, digestsize);
32638c2ecf20Sopenharmony_ci
32648c2ecf20Sopenharmony_ci	print_hex_dump_debug("key_in@" __stringify(__LINE__)": ",
32658c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, key, *keylen, 1);
32668c2ecf20Sopenharmony_ci	print_hex_dump_debug("shdesc@" __stringify(__LINE__)": ",
32678c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
32688c2ecf20Sopenharmony_ci			     1);
32698c2ecf20Sopenharmony_ci
32708c2ecf20Sopenharmony_ci	result.err = 0;
32718c2ecf20Sopenharmony_ci	init_completion(&result.completion);
32728c2ecf20Sopenharmony_ci	result.dev = ctx->dev;
32738c2ecf20Sopenharmony_ci
32748c2ecf20Sopenharmony_ci	req_ctx->flc = flc;
32758c2ecf20Sopenharmony_ci	req_ctx->flc_dma = flc_dma;
32768c2ecf20Sopenharmony_ci	req_ctx->cbk = split_key_sh_done;
32778c2ecf20Sopenharmony_ci	req_ctx->ctx = &result;
32788c2ecf20Sopenharmony_ci
32798c2ecf20Sopenharmony_ci	ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);
32808c2ecf20Sopenharmony_ci	if (ret == -EINPROGRESS) {
32818c2ecf20Sopenharmony_ci		/* in progress */
32828c2ecf20Sopenharmony_ci		wait_for_completion(&result.completion);
32838c2ecf20Sopenharmony_ci		ret = result.err;
32848c2ecf20Sopenharmony_ci		print_hex_dump_debug("digested key@" __stringify(__LINE__)": ",
32858c2ecf20Sopenharmony_ci				     DUMP_PREFIX_ADDRESS, 16, 4, key,
32868c2ecf20Sopenharmony_ci				     digestsize, 1);
32878c2ecf20Sopenharmony_ci	}
32888c2ecf20Sopenharmony_ci
32898c2ecf20Sopenharmony_ci	dma_unmap_single(ctx->dev, flc_dma, sizeof(flc->flc) + desc_bytes(desc),
32908c2ecf20Sopenharmony_ci			 DMA_TO_DEVICE);
32918c2ecf20Sopenharmony_cierr_flc_dma:
32928c2ecf20Sopenharmony_ci	dma_unmap_single(ctx->dev, key_dma, *keylen, DMA_BIDIRECTIONAL);
32938c2ecf20Sopenharmony_cierr_key_dma:
32948c2ecf20Sopenharmony_ci	kfree(flc);
32958c2ecf20Sopenharmony_cierr_flc:
32968c2ecf20Sopenharmony_ci	kfree(req_ctx);
32978c2ecf20Sopenharmony_ci
32988c2ecf20Sopenharmony_ci	*keylen = digestsize;
32998c2ecf20Sopenharmony_ci
33008c2ecf20Sopenharmony_ci	return ret;
33018c2ecf20Sopenharmony_ci}
33028c2ecf20Sopenharmony_ci
33038c2ecf20Sopenharmony_cistatic int ahash_setkey(struct crypto_ahash *ahash, const u8 *key,
33048c2ecf20Sopenharmony_ci			unsigned int keylen)
33058c2ecf20Sopenharmony_ci{
33068c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
33078c2ecf20Sopenharmony_ci	unsigned int blocksize = crypto_tfm_alg_blocksize(&ahash->base);
33088c2ecf20Sopenharmony_ci	unsigned int digestsize = crypto_ahash_digestsize(ahash);
33098c2ecf20Sopenharmony_ci	int ret;
33108c2ecf20Sopenharmony_ci	u8 *hashed_key = NULL;
33118c2ecf20Sopenharmony_ci
33128c2ecf20Sopenharmony_ci	dev_dbg(ctx->dev, "keylen %d blocksize %d\n", keylen, blocksize);
33138c2ecf20Sopenharmony_ci
33148c2ecf20Sopenharmony_ci	if (keylen > blocksize) {
33158c2ecf20Sopenharmony_ci		hashed_key = kmemdup(key, keylen, GFP_KERNEL | GFP_DMA);
33168c2ecf20Sopenharmony_ci		if (!hashed_key)
33178c2ecf20Sopenharmony_ci			return -ENOMEM;
33188c2ecf20Sopenharmony_ci		ret = hash_digest_key(ctx, &keylen, hashed_key, digestsize);
33198c2ecf20Sopenharmony_ci		if (ret)
33208c2ecf20Sopenharmony_ci			goto bad_free_key;
33218c2ecf20Sopenharmony_ci		key = hashed_key;
33228c2ecf20Sopenharmony_ci	}
33238c2ecf20Sopenharmony_ci
33248c2ecf20Sopenharmony_ci	ctx->adata.keylen = keylen;
33258c2ecf20Sopenharmony_ci	ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype &
33268c2ecf20Sopenharmony_ci					      OP_ALG_ALGSEL_MASK);
33278c2ecf20Sopenharmony_ci	if (ctx->adata.keylen_pad > CAAM_MAX_HASH_KEY_SIZE)
33288c2ecf20Sopenharmony_ci		goto bad_free_key;
33298c2ecf20Sopenharmony_ci
33308c2ecf20Sopenharmony_ci	ctx->adata.key_virt = key;
33318c2ecf20Sopenharmony_ci	ctx->adata.key_inline = true;
33328c2ecf20Sopenharmony_ci
33338c2ecf20Sopenharmony_ci	/*
33348c2ecf20Sopenharmony_ci	 * In case |user key| > |derived key|, using DKP<imm,imm> would result
33358c2ecf20Sopenharmony_ci	 * in invalid opcodes (last bytes of user key) in the resulting
33368c2ecf20Sopenharmony_ci	 * descriptor. Use DKP<ptr,imm> instead => both virtual and dma key
33378c2ecf20Sopenharmony_ci	 * addresses are needed.
33388c2ecf20Sopenharmony_ci	 */
33398c2ecf20Sopenharmony_ci	if (keylen > ctx->adata.keylen_pad) {
33408c2ecf20Sopenharmony_ci		memcpy(ctx->key, key, keylen);
33418c2ecf20Sopenharmony_ci		dma_sync_single_for_device(ctx->dev, ctx->adata.key_dma,
33428c2ecf20Sopenharmony_ci					   ctx->adata.keylen_pad,
33438c2ecf20Sopenharmony_ci					   DMA_TO_DEVICE);
33448c2ecf20Sopenharmony_ci	}
33458c2ecf20Sopenharmony_ci
33468c2ecf20Sopenharmony_ci	ret = ahash_set_sh_desc(ahash);
33478c2ecf20Sopenharmony_ci	kfree(hashed_key);
33488c2ecf20Sopenharmony_ci	return ret;
33498c2ecf20Sopenharmony_cibad_free_key:
33508c2ecf20Sopenharmony_ci	kfree(hashed_key);
33518c2ecf20Sopenharmony_ci	return -EINVAL;
33528c2ecf20Sopenharmony_ci}
33538c2ecf20Sopenharmony_ci
33548c2ecf20Sopenharmony_cistatic inline void ahash_unmap(struct device *dev, struct ahash_edesc *edesc,
33558c2ecf20Sopenharmony_ci			       struct ahash_request *req)
33568c2ecf20Sopenharmony_ci{
33578c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
33588c2ecf20Sopenharmony_ci
33598c2ecf20Sopenharmony_ci	if (edesc->src_nents)
33608c2ecf20Sopenharmony_ci		dma_unmap_sg(dev, req->src, edesc->src_nents, DMA_TO_DEVICE);
33618c2ecf20Sopenharmony_ci
33628c2ecf20Sopenharmony_ci	if (edesc->qm_sg_bytes)
33638c2ecf20Sopenharmony_ci		dma_unmap_single(dev, edesc->qm_sg_dma, edesc->qm_sg_bytes,
33648c2ecf20Sopenharmony_ci				 DMA_TO_DEVICE);
33658c2ecf20Sopenharmony_ci
33668c2ecf20Sopenharmony_ci	if (state->buf_dma) {
33678c2ecf20Sopenharmony_ci		dma_unmap_single(dev, state->buf_dma, state->buflen,
33688c2ecf20Sopenharmony_ci				 DMA_TO_DEVICE);
33698c2ecf20Sopenharmony_ci		state->buf_dma = 0;
33708c2ecf20Sopenharmony_ci	}
33718c2ecf20Sopenharmony_ci}
33728c2ecf20Sopenharmony_ci
33738c2ecf20Sopenharmony_cistatic inline void ahash_unmap_ctx(struct device *dev,
33748c2ecf20Sopenharmony_ci				   struct ahash_edesc *edesc,
33758c2ecf20Sopenharmony_ci				   struct ahash_request *req, u32 flag)
33768c2ecf20Sopenharmony_ci{
33778c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
33788c2ecf20Sopenharmony_ci
33798c2ecf20Sopenharmony_ci	if (state->ctx_dma) {
33808c2ecf20Sopenharmony_ci		dma_unmap_single(dev, state->ctx_dma, state->ctx_dma_len, flag);
33818c2ecf20Sopenharmony_ci		state->ctx_dma = 0;
33828c2ecf20Sopenharmony_ci	}
33838c2ecf20Sopenharmony_ci	ahash_unmap(dev, edesc, req);
33848c2ecf20Sopenharmony_ci}
33858c2ecf20Sopenharmony_ci
33868c2ecf20Sopenharmony_cistatic void ahash_done(void *cbk_ctx, u32 status)
33878c2ecf20Sopenharmony_ci{
33888c2ecf20Sopenharmony_ci	struct crypto_async_request *areq = cbk_ctx;
33898c2ecf20Sopenharmony_ci	struct ahash_request *req = ahash_request_cast(areq);
33908c2ecf20Sopenharmony_ci	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
33918c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
33928c2ecf20Sopenharmony_ci	struct ahash_edesc *edesc = state->caam_req.edesc;
33938c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
33948c2ecf20Sopenharmony_ci	int digestsize = crypto_ahash_digestsize(ahash);
33958c2ecf20Sopenharmony_ci	int ecode = 0;
33968c2ecf20Sopenharmony_ci
33978c2ecf20Sopenharmony_ci	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);
33988c2ecf20Sopenharmony_ci
33998c2ecf20Sopenharmony_ci	if (unlikely(status))
34008c2ecf20Sopenharmony_ci		ecode = caam_qi2_strstatus(ctx->dev, status);
34018c2ecf20Sopenharmony_ci
34028c2ecf20Sopenharmony_ci	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE);
34038c2ecf20Sopenharmony_ci	memcpy(req->result, state->caam_ctx, digestsize);
34048c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
34058c2ecf20Sopenharmony_ci
34068c2ecf20Sopenharmony_ci	print_hex_dump_debug("ctx@" __stringify(__LINE__)": ",
34078c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx,
34088c2ecf20Sopenharmony_ci			     ctx->ctx_len, 1);
34098c2ecf20Sopenharmony_ci
34108c2ecf20Sopenharmony_ci	req->base.complete(&req->base, ecode);
34118c2ecf20Sopenharmony_ci}
34128c2ecf20Sopenharmony_ci
34138c2ecf20Sopenharmony_cistatic void ahash_done_bi(void *cbk_ctx, u32 status)
34148c2ecf20Sopenharmony_ci{
34158c2ecf20Sopenharmony_ci	struct crypto_async_request *areq = cbk_ctx;
34168c2ecf20Sopenharmony_ci	struct ahash_request *req = ahash_request_cast(areq);
34178c2ecf20Sopenharmony_ci	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
34188c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
34198c2ecf20Sopenharmony_ci	struct ahash_edesc *edesc = state->caam_req.edesc;
34208c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
34218c2ecf20Sopenharmony_ci	int ecode = 0;
34228c2ecf20Sopenharmony_ci
34238c2ecf20Sopenharmony_ci	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);
34248c2ecf20Sopenharmony_ci
34258c2ecf20Sopenharmony_ci	if (unlikely(status))
34268c2ecf20Sopenharmony_ci		ecode = caam_qi2_strstatus(ctx->dev, status);
34278c2ecf20Sopenharmony_ci
34288c2ecf20Sopenharmony_ci	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL);
34298c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
34308c2ecf20Sopenharmony_ci
34318c2ecf20Sopenharmony_ci	scatterwalk_map_and_copy(state->buf, req->src,
34328c2ecf20Sopenharmony_ci				 req->nbytes - state->next_buflen,
34338c2ecf20Sopenharmony_ci				 state->next_buflen, 0);
34348c2ecf20Sopenharmony_ci	state->buflen = state->next_buflen;
34358c2ecf20Sopenharmony_ci
34368c2ecf20Sopenharmony_ci	print_hex_dump_debug("buf@" __stringify(__LINE__)": ",
34378c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, state->buf,
34388c2ecf20Sopenharmony_ci			     state->buflen, 1);
34398c2ecf20Sopenharmony_ci
34408c2ecf20Sopenharmony_ci	print_hex_dump_debug("ctx@" __stringify(__LINE__)": ",
34418c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx,
34428c2ecf20Sopenharmony_ci			     ctx->ctx_len, 1);
34438c2ecf20Sopenharmony_ci	if (req->result)
34448c2ecf20Sopenharmony_ci		print_hex_dump_debug("result@" __stringify(__LINE__)": ",
34458c2ecf20Sopenharmony_ci				     DUMP_PREFIX_ADDRESS, 16, 4, req->result,
34468c2ecf20Sopenharmony_ci				     crypto_ahash_digestsize(ahash), 1);
34478c2ecf20Sopenharmony_ci
34488c2ecf20Sopenharmony_ci	req->base.complete(&req->base, ecode);
34498c2ecf20Sopenharmony_ci}
34508c2ecf20Sopenharmony_ci
34518c2ecf20Sopenharmony_cistatic void ahash_done_ctx_src(void *cbk_ctx, u32 status)
34528c2ecf20Sopenharmony_ci{
34538c2ecf20Sopenharmony_ci	struct crypto_async_request *areq = cbk_ctx;
34548c2ecf20Sopenharmony_ci	struct ahash_request *req = ahash_request_cast(areq);
34558c2ecf20Sopenharmony_ci	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
34568c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
34578c2ecf20Sopenharmony_ci	struct ahash_edesc *edesc = state->caam_req.edesc;
34588c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
34598c2ecf20Sopenharmony_ci	int digestsize = crypto_ahash_digestsize(ahash);
34608c2ecf20Sopenharmony_ci	int ecode = 0;
34618c2ecf20Sopenharmony_ci
34628c2ecf20Sopenharmony_ci	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);
34638c2ecf20Sopenharmony_ci
34648c2ecf20Sopenharmony_ci	if (unlikely(status))
34658c2ecf20Sopenharmony_ci		ecode = caam_qi2_strstatus(ctx->dev, status);
34668c2ecf20Sopenharmony_ci
34678c2ecf20Sopenharmony_ci	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL);
34688c2ecf20Sopenharmony_ci	memcpy(req->result, state->caam_ctx, digestsize);
34698c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
34708c2ecf20Sopenharmony_ci
34718c2ecf20Sopenharmony_ci	print_hex_dump_debug("ctx@" __stringify(__LINE__)": ",
34728c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx,
34738c2ecf20Sopenharmony_ci			     ctx->ctx_len, 1);
34748c2ecf20Sopenharmony_ci
34758c2ecf20Sopenharmony_ci	req->base.complete(&req->base, ecode);
34768c2ecf20Sopenharmony_ci}
34778c2ecf20Sopenharmony_ci
34788c2ecf20Sopenharmony_cistatic void ahash_done_ctx_dst(void *cbk_ctx, u32 status)
34798c2ecf20Sopenharmony_ci{
34808c2ecf20Sopenharmony_ci	struct crypto_async_request *areq = cbk_ctx;
34818c2ecf20Sopenharmony_ci	struct ahash_request *req = ahash_request_cast(areq);
34828c2ecf20Sopenharmony_ci	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
34838c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
34848c2ecf20Sopenharmony_ci	struct ahash_edesc *edesc = state->caam_req.edesc;
34858c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
34868c2ecf20Sopenharmony_ci	int ecode = 0;
34878c2ecf20Sopenharmony_ci
34888c2ecf20Sopenharmony_ci	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);
34898c2ecf20Sopenharmony_ci
34908c2ecf20Sopenharmony_ci	if (unlikely(status))
34918c2ecf20Sopenharmony_ci		ecode = caam_qi2_strstatus(ctx->dev, status);
34928c2ecf20Sopenharmony_ci
34938c2ecf20Sopenharmony_ci	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE);
34948c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
34958c2ecf20Sopenharmony_ci
34968c2ecf20Sopenharmony_ci	scatterwalk_map_and_copy(state->buf, req->src,
34978c2ecf20Sopenharmony_ci				 req->nbytes - state->next_buflen,
34988c2ecf20Sopenharmony_ci				 state->next_buflen, 0);
34998c2ecf20Sopenharmony_ci	state->buflen = state->next_buflen;
35008c2ecf20Sopenharmony_ci
35018c2ecf20Sopenharmony_ci	print_hex_dump_debug("buf@" __stringify(__LINE__)": ",
35028c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, state->buf,
35038c2ecf20Sopenharmony_ci			     state->buflen, 1);
35048c2ecf20Sopenharmony_ci
35058c2ecf20Sopenharmony_ci	print_hex_dump_debug("ctx@" __stringify(__LINE__)": ",
35068c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx,
35078c2ecf20Sopenharmony_ci			     ctx->ctx_len, 1);
35088c2ecf20Sopenharmony_ci	if (req->result)
35098c2ecf20Sopenharmony_ci		print_hex_dump_debug("result@" __stringify(__LINE__)": ",
35108c2ecf20Sopenharmony_ci				     DUMP_PREFIX_ADDRESS, 16, 4, req->result,
35118c2ecf20Sopenharmony_ci				     crypto_ahash_digestsize(ahash), 1);
35128c2ecf20Sopenharmony_ci
35138c2ecf20Sopenharmony_ci	req->base.complete(&req->base, ecode);
35148c2ecf20Sopenharmony_ci}
35158c2ecf20Sopenharmony_ci
35168c2ecf20Sopenharmony_cistatic int ahash_update_ctx(struct ahash_request *req)
35178c2ecf20Sopenharmony_ci{
35188c2ecf20Sopenharmony_ci	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
35198c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
35208c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
35218c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = &state->caam_req;
35228c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];
35238c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];
35248c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
35258c2ecf20Sopenharmony_ci		      GFP_KERNEL : GFP_ATOMIC;
35268c2ecf20Sopenharmony_ci	u8 *buf = state->buf;
35278c2ecf20Sopenharmony_ci	int *buflen = &state->buflen;
35288c2ecf20Sopenharmony_ci	int *next_buflen = &state->next_buflen;
35298c2ecf20Sopenharmony_ci	int in_len = *buflen + req->nbytes, to_hash;
35308c2ecf20Sopenharmony_ci	int src_nents, mapped_nents, qm_sg_bytes, qm_sg_src_index;
35318c2ecf20Sopenharmony_ci	struct ahash_edesc *edesc;
35328c2ecf20Sopenharmony_ci	int ret = 0;
35338c2ecf20Sopenharmony_ci
35348c2ecf20Sopenharmony_ci	*next_buflen = in_len & (crypto_tfm_alg_blocksize(&ahash->base) - 1);
35358c2ecf20Sopenharmony_ci	to_hash = in_len - *next_buflen;
35368c2ecf20Sopenharmony_ci
35378c2ecf20Sopenharmony_ci	if (to_hash) {
35388c2ecf20Sopenharmony_ci		struct dpaa2_sg_entry *sg_table;
35398c2ecf20Sopenharmony_ci		int src_len = req->nbytes - *next_buflen;
35408c2ecf20Sopenharmony_ci
35418c2ecf20Sopenharmony_ci		src_nents = sg_nents_for_len(req->src, src_len);
35428c2ecf20Sopenharmony_ci		if (src_nents < 0) {
35438c2ecf20Sopenharmony_ci			dev_err(ctx->dev, "Invalid number of src SG.\n");
35448c2ecf20Sopenharmony_ci			return src_nents;
35458c2ecf20Sopenharmony_ci		}
35468c2ecf20Sopenharmony_ci
35478c2ecf20Sopenharmony_ci		if (src_nents) {
35488c2ecf20Sopenharmony_ci			mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents,
35498c2ecf20Sopenharmony_ci						  DMA_TO_DEVICE);
35508c2ecf20Sopenharmony_ci			if (!mapped_nents) {
35518c2ecf20Sopenharmony_ci				dev_err(ctx->dev, "unable to DMA map source\n");
35528c2ecf20Sopenharmony_ci				return -ENOMEM;
35538c2ecf20Sopenharmony_ci			}
35548c2ecf20Sopenharmony_ci		} else {
35558c2ecf20Sopenharmony_ci			mapped_nents = 0;
35568c2ecf20Sopenharmony_ci		}
35578c2ecf20Sopenharmony_ci
35588c2ecf20Sopenharmony_ci		/* allocate space for base edesc and link tables */
35598c2ecf20Sopenharmony_ci		edesc = qi_cache_zalloc(GFP_DMA | flags);
35608c2ecf20Sopenharmony_ci		if (!edesc) {
35618c2ecf20Sopenharmony_ci			dma_unmap_sg(ctx->dev, req->src, src_nents,
35628c2ecf20Sopenharmony_ci				     DMA_TO_DEVICE);
35638c2ecf20Sopenharmony_ci			return -ENOMEM;
35648c2ecf20Sopenharmony_ci		}
35658c2ecf20Sopenharmony_ci
35668c2ecf20Sopenharmony_ci		edesc->src_nents = src_nents;
35678c2ecf20Sopenharmony_ci		qm_sg_src_index = 1 + (*buflen ? 1 : 0);
35688c2ecf20Sopenharmony_ci		qm_sg_bytes = pad_sg_nents(qm_sg_src_index + mapped_nents) *
35698c2ecf20Sopenharmony_ci			      sizeof(*sg_table);
35708c2ecf20Sopenharmony_ci		sg_table = &edesc->sgt[0];
35718c2ecf20Sopenharmony_ci
35728c2ecf20Sopenharmony_ci		ret = ctx_map_to_qm_sg(ctx->dev, state, ctx->ctx_len, sg_table,
35738c2ecf20Sopenharmony_ci				       DMA_BIDIRECTIONAL);
35748c2ecf20Sopenharmony_ci		if (ret)
35758c2ecf20Sopenharmony_ci			goto unmap_ctx;
35768c2ecf20Sopenharmony_ci
35778c2ecf20Sopenharmony_ci		ret = buf_map_to_qm_sg(ctx->dev, sg_table + 1, state);
35788c2ecf20Sopenharmony_ci		if (ret)
35798c2ecf20Sopenharmony_ci			goto unmap_ctx;
35808c2ecf20Sopenharmony_ci
35818c2ecf20Sopenharmony_ci		if (mapped_nents) {
35828c2ecf20Sopenharmony_ci			sg_to_qm_sg_last(req->src, src_len,
35838c2ecf20Sopenharmony_ci					 sg_table + qm_sg_src_index, 0);
35848c2ecf20Sopenharmony_ci		} else {
35858c2ecf20Sopenharmony_ci			dpaa2_sg_set_final(sg_table + qm_sg_src_index - 1,
35868c2ecf20Sopenharmony_ci					   true);
35878c2ecf20Sopenharmony_ci		}
35888c2ecf20Sopenharmony_ci
35898c2ecf20Sopenharmony_ci		edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table,
35908c2ecf20Sopenharmony_ci						  qm_sg_bytes, DMA_TO_DEVICE);
35918c2ecf20Sopenharmony_ci		if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {
35928c2ecf20Sopenharmony_ci			dev_err(ctx->dev, "unable to map S/G table\n");
35938c2ecf20Sopenharmony_ci			ret = -ENOMEM;
35948c2ecf20Sopenharmony_ci			goto unmap_ctx;
35958c2ecf20Sopenharmony_ci		}
35968c2ecf20Sopenharmony_ci		edesc->qm_sg_bytes = qm_sg_bytes;
35978c2ecf20Sopenharmony_ci
35988c2ecf20Sopenharmony_ci		memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));
35998c2ecf20Sopenharmony_ci		dpaa2_fl_set_final(in_fle, true);
36008c2ecf20Sopenharmony_ci		dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);
36018c2ecf20Sopenharmony_ci		dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);
36028c2ecf20Sopenharmony_ci		dpaa2_fl_set_len(in_fle, ctx->ctx_len + to_hash);
36038c2ecf20Sopenharmony_ci		dpaa2_fl_set_format(out_fle, dpaa2_fl_single);
36048c2ecf20Sopenharmony_ci		dpaa2_fl_set_addr(out_fle, state->ctx_dma);
36058c2ecf20Sopenharmony_ci		dpaa2_fl_set_len(out_fle, ctx->ctx_len);
36068c2ecf20Sopenharmony_ci
36078c2ecf20Sopenharmony_ci		req_ctx->flc = &ctx->flc[UPDATE];
36088c2ecf20Sopenharmony_ci		req_ctx->flc_dma = ctx->flc_dma[UPDATE];
36098c2ecf20Sopenharmony_ci		req_ctx->cbk = ahash_done_bi;
36108c2ecf20Sopenharmony_ci		req_ctx->ctx = &req->base;
36118c2ecf20Sopenharmony_ci		req_ctx->edesc = edesc;
36128c2ecf20Sopenharmony_ci
36138c2ecf20Sopenharmony_ci		ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);
36148c2ecf20Sopenharmony_ci		if (ret != -EINPROGRESS &&
36158c2ecf20Sopenharmony_ci		    !(ret == -EBUSY &&
36168c2ecf20Sopenharmony_ci		      req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))
36178c2ecf20Sopenharmony_ci			goto unmap_ctx;
36188c2ecf20Sopenharmony_ci	} else if (*next_buflen) {
36198c2ecf20Sopenharmony_ci		scatterwalk_map_and_copy(buf + *buflen, req->src, 0,
36208c2ecf20Sopenharmony_ci					 req->nbytes, 0);
36218c2ecf20Sopenharmony_ci		*buflen = *next_buflen;
36228c2ecf20Sopenharmony_ci
36238c2ecf20Sopenharmony_ci		print_hex_dump_debug("buf@" __stringify(__LINE__)": ",
36248c2ecf20Sopenharmony_ci				     DUMP_PREFIX_ADDRESS, 16, 4, buf,
36258c2ecf20Sopenharmony_ci				     *buflen, 1);
36268c2ecf20Sopenharmony_ci	}
36278c2ecf20Sopenharmony_ci
36288c2ecf20Sopenharmony_ci	return ret;
36298c2ecf20Sopenharmony_ciunmap_ctx:
36308c2ecf20Sopenharmony_ci	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL);
36318c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
36328c2ecf20Sopenharmony_ci	return ret;
36338c2ecf20Sopenharmony_ci}
36348c2ecf20Sopenharmony_ci
36358c2ecf20Sopenharmony_cistatic int ahash_final_ctx(struct ahash_request *req)
36368c2ecf20Sopenharmony_ci{
36378c2ecf20Sopenharmony_ci	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
36388c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
36398c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
36408c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = &state->caam_req;
36418c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];
36428c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];
36438c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
36448c2ecf20Sopenharmony_ci		      GFP_KERNEL : GFP_ATOMIC;
36458c2ecf20Sopenharmony_ci	int buflen = state->buflen;
36468c2ecf20Sopenharmony_ci	int qm_sg_bytes;
36478c2ecf20Sopenharmony_ci	int digestsize = crypto_ahash_digestsize(ahash);
36488c2ecf20Sopenharmony_ci	struct ahash_edesc *edesc;
36498c2ecf20Sopenharmony_ci	struct dpaa2_sg_entry *sg_table;
36508c2ecf20Sopenharmony_ci	int ret;
36518c2ecf20Sopenharmony_ci
36528c2ecf20Sopenharmony_ci	/* allocate space for base edesc and link tables */
36538c2ecf20Sopenharmony_ci	edesc = qi_cache_zalloc(GFP_DMA | flags);
36548c2ecf20Sopenharmony_ci	if (!edesc)
36558c2ecf20Sopenharmony_ci		return -ENOMEM;
36568c2ecf20Sopenharmony_ci
36578c2ecf20Sopenharmony_ci	qm_sg_bytes = pad_sg_nents(1 + (buflen ? 1 : 0)) * sizeof(*sg_table);
36588c2ecf20Sopenharmony_ci	sg_table = &edesc->sgt[0];
36598c2ecf20Sopenharmony_ci
36608c2ecf20Sopenharmony_ci	ret = ctx_map_to_qm_sg(ctx->dev, state, ctx->ctx_len, sg_table,
36618c2ecf20Sopenharmony_ci			       DMA_BIDIRECTIONAL);
36628c2ecf20Sopenharmony_ci	if (ret)
36638c2ecf20Sopenharmony_ci		goto unmap_ctx;
36648c2ecf20Sopenharmony_ci
36658c2ecf20Sopenharmony_ci	ret = buf_map_to_qm_sg(ctx->dev, sg_table + 1, state);
36668c2ecf20Sopenharmony_ci	if (ret)
36678c2ecf20Sopenharmony_ci		goto unmap_ctx;
36688c2ecf20Sopenharmony_ci
36698c2ecf20Sopenharmony_ci	dpaa2_sg_set_final(sg_table + (buflen ? 1 : 0), true);
36708c2ecf20Sopenharmony_ci
36718c2ecf20Sopenharmony_ci	edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table, qm_sg_bytes,
36728c2ecf20Sopenharmony_ci					  DMA_TO_DEVICE);
36738c2ecf20Sopenharmony_ci	if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {
36748c2ecf20Sopenharmony_ci		dev_err(ctx->dev, "unable to map S/G table\n");
36758c2ecf20Sopenharmony_ci		ret = -ENOMEM;
36768c2ecf20Sopenharmony_ci		goto unmap_ctx;
36778c2ecf20Sopenharmony_ci	}
36788c2ecf20Sopenharmony_ci	edesc->qm_sg_bytes = qm_sg_bytes;
36798c2ecf20Sopenharmony_ci
36808c2ecf20Sopenharmony_ci	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));
36818c2ecf20Sopenharmony_ci	dpaa2_fl_set_final(in_fle, true);
36828c2ecf20Sopenharmony_ci	dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);
36838c2ecf20Sopenharmony_ci	dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);
36848c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(in_fle, ctx->ctx_len + buflen);
36858c2ecf20Sopenharmony_ci	dpaa2_fl_set_format(out_fle, dpaa2_fl_single);
36868c2ecf20Sopenharmony_ci	dpaa2_fl_set_addr(out_fle, state->ctx_dma);
36878c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(out_fle, digestsize);
36888c2ecf20Sopenharmony_ci
36898c2ecf20Sopenharmony_ci	req_ctx->flc = &ctx->flc[FINALIZE];
36908c2ecf20Sopenharmony_ci	req_ctx->flc_dma = ctx->flc_dma[FINALIZE];
36918c2ecf20Sopenharmony_ci	req_ctx->cbk = ahash_done_ctx_src;
36928c2ecf20Sopenharmony_ci	req_ctx->ctx = &req->base;
36938c2ecf20Sopenharmony_ci	req_ctx->edesc = edesc;
36948c2ecf20Sopenharmony_ci
36958c2ecf20Sopenharmony_ci	ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);
36968c2ecf20Sopenharmony_ci	if (ret == -EINPROGRESS ||
36978c2ecf20Sopenharmony_ci	    (ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))
36988c2ecf20Sopenharmony_ci		return ret;
36998c2ecf20Sopenharmony_ci
37008c2ecf20Sopenharmony_ciunmap_ctx:
37018c2ecf20Sopenharmony_ci	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL);
37028c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
37038c2ecf20Sopenharmony_ci	return ret;
37048c2ecf20Sopenharmony_ci}
37058c2ecf20Sopenharmony_ci
37068c2ecf20Sopenharmony_cistatic int ahash_finup_ctx(struct ahash_request *req)
37078c2ecf20Sopenharmony_ci{
37088c2ecf20Sopenharmony_ci	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
37098c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
37108c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
37118c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = &state->caam_req;
37128c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];
37138c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];
37148c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
37158c2ecf20Sopenharmony_ci		      GFP_KERNEL : GFP_ATOMIC;
37168c2ecf20Sopenharmony_ci	int buflen = state->buflen;
37178c2ecf20Sopenharmony_ci	int qm_sg_bytes, qm_sg_src_index;
37188c2ecf20Sopenharmony_ci	int src_nents, mapped_nents;
37198c2ecf20Sopenharmony_ci	int digestsize = crypto_ahash_digestsize(ahash);
37208c2ecf20Sopenharmony_ci	struct ahash_edesc *edesc;
37218c2ecf20Sopenharmony_ci	struct dpaa2_sg_entry *sg_table;
37228c2ecf20Sopenharmony_ci	int ret;
37238c2ecf20Sopenharmony_ci
37248c2ecf20Sopenharmony_ci	src_nents = sg_nents_for_len(req->src, req->nbytes);
37258c2ecf20Sopenharmony_ci	if (src_nents < 0) {
37268c2ecf20Sopenharmony_ci		dev_err(ctx->dev, "Invalid number of src SG.\n");
37278c2ecf20Sopenharmony_ci		return src_nents;
37288c2ecf20Sopenharmony_ci	}
37298c2ecf20Sopenharmony_ci
37308c2ecf20Sopenharmony_ci	if (src_nents) {
37318c2ecf20Sopenharmony_ci		mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents,
37328c2ecf20Sopenharmony_ci					  DMA_TO_DEVICE);
37338c2ecf20Sopenharmony_ci		if (!mapped_nents) {
37348c2ecf20Sopenharmony_ci			dev_err(ctx->dev, "unable to DMA map source\n");
37358c2ecf20Sopenharmony_ci			return -ENOMEM;
37368c2ecf20Sopenharmony_ci		}
37378c2ecf20Sopenharmony_ci	} else {
37388c2ecf20Sopenharmony_ci		mapped_nents = 0;
37398c2ecf20Sopenharmony_ci	}
37408c2ecf20Sopenharmony_ci
37418c2ecf20Sopenharmony_ci	/* allocate space for base edesc and link tables */
37428c2ecf20Sopenharmony_ci	edesc = qi_cache_zalloc(GFP_DMA | flags);
37438c2ecf20Sopenharmony_ci	if (!edesc) {
37448c2ecf20Sopenharmony_ci		dma_unmap_sg(ctx->dev, req->src, src_nents, DMA_TO_DEVICE);
37458c2ecf20Sopenharmony_ci		return -ENOMEM;
37468c2ecf20Sopenharmony_ci	}
37478c2ecf20Sopenharmony_ci
37488c2ecf20Sopenharmony_ci	edesc->src_nents = src_nents;
37498c2ecf20Sopenharmony_ci	qm_sg_src_index = 1 + (buflen ? 1 : 0);
37508c2ecf20Sopenharmony_ci	qm_sg_bytes = pad_sg_nents(qm_sg_src_index + mapped_nents) *
37518c2ecf20Sopenharmony_ci		      sizeof(*sg_table);
37528c2ecf20Sopenharmony_ci	sg_table = &edesc->sgt[0];
37538c2ecf20Sopenharmony_ci
37548c2ecf20Sopenharmony_ci	ret = ctx_map_to_qm_sg(ctx->dev, state, ctx->ctx_len, sg_table,
37558c2ecf20Sopenharmony_ci			       DMA_BIDIRECTIONAL);
37568c2ecf20Sopenharmony_ci	if (ret)
37578c2ecf20Sopenharmony_ci		goto unmap_ctx;
37588c2ecf20Sopenharmony_ci
37598c2ecf20Sopenharmony_ci	ret = buf_map_to_qm_sg(ctx->dev, sg_table + 1, state);
37608c2ecf20Sopenharmony_ci	if (ret)
37618c2ecf20Sopenharmony_ci		goto unmap_ctx;
37628c2ecf20Sopenharmony_ci
37638c2ecf20Sopenharmony_ci	sg_to_qm_sg_last(req->src, req->nbytes, sg_table + qm_sg_src_index, 0);
37648c2ecf20Sopenharmony_ci
37658c2ecf20Sopenharmony_ci	edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table, qm_sg_bytes,
37668c2ecf20Sopenharmony_ci					  DMA_TO_DEVICE);
37678c2ecf20Sopenharmony_ci	if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {
37688c2ecf20Sopenharmony_ci		dev_err(ctx->dev, "unable to map S/G table\n");
37698c2ecf20Sopenharmony_ci		ret = -ENOMEM;
37708c2ecf20Sopenharmony_ci		goto unmap_ctx;
37718c2ecf20Sopenharmony_ci	}
37728c2ecf20Sopenharmony_ci	edesc->qm_sg_bytes = qm_sg_bytes;
37738c2ecf20Sopenharmony_ci
37748c2ecf20Sopenharmony_ci	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));
37758c2ecf20Sopenharmony_ci	dpaa2_fl_set_final(in_fle, true);
37768c2ecf20Sopenharmony_ci	dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);
37778c2ecf20Sopenharmony_ci	dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);
37788c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(in_fle, ctx->ctx_len + buflen + req->nbytes);
37798c2ecf20Sopenharmony_ci	dpaa2_fl_set_format(out_fle, dpaa2_fl_single);
37808c2ecf20Sopenharmony_ci	dpaa2_fl_set_addr(out_fle, state->ctx_dma);
37818c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(out_fle, digestsize);
37828c2ecf20Sopenharmony_ci
37838c2ecf20Sopenharmony_ci	req_ctx->flc = &ctx->flc[FINALIZE];
37848c2ecf20Sopenharmony_ci	req_ctx->flc_dma = ctx->flc_dma[FINALIZE];
37858c2ecf20Sopenharmony_ci	req_ctx->cbk = ahash_done_ctx_src;
37868c2ecf20Sopenharmony_ci	req_ctx->ctx = &req->base;
37878c2ecf20Sopenharmony_ci	req_ctx->edesc = edesc;
37888c2ecf20Sopenharmony_ci
37898c2ecf20Sopenharmony_ci	ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);
37908c2ecf20Sopenharmony_ci	if (ret == -EINPROGRESS ||
37918c2ecf20Sopenharmony_ci	    (ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))
37928c2ecf20Sopenharmony_ci		return ret;
37938c2ecf20Sopenharmony_ci
37948c2ecf20Sopenharmony_ciunmap_ctx:
37958c2ecf20Sopenharmony_ci	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL);
37968c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
37978c2ecf20Sopenharmony_ci	return ret;
37988c2ecf20Sopenharmony_ci}
37998c2ecf20Sopenharmony_ci
38008c2ecf20Sopenharmony_cistatic int ahash_digest(struct ahash_request *req)
38018c2ecf20Sopenharmony_ci{
38028c2ecf20Sopenharmony_ci	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
38038c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
38048c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
38058c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = &state->caam_req;
38068c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];
38078c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];
38088c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
38098c2ecf20Sopenharmony_ci		      GFP_KERNEL : GFP_ATOMIC;
38108c2ecf20Sopenharmony_ci	int digestsize = crypto_ahash_digestsize(ahash);
38118c2ecf20Sopenharmony_ci	int src_nents, mapped_nents;
38128c2ecf20Sopenharmony_ci	struct ahash_edesc *edesc;
38138c2ecf20Sopenharmony_ci	int ret = -ENOMEM;
38148c2ecf20Sopenharmony_ci
38158c2ecf20Sopenharmony_ci	state->buf_dma = 0;
38168c2ecf20Sopenharmony_ci
38178c2ecf20Sopenharmony_ci	src_nents = sg_nents_for_len(req->src, req->nbytes);
38188c2ecf20Sopenharmony_ci	if (src_nents < 0) {
38198c2ecf20Sopenharmony_ci		dev_err(ctx->dev, "Invalid number of src SG.\n");
38208c2ecf20Sopenharmony_ci		return src_nents;
38218c2ecf20Sopenharmony_ci	}
38228c2ecf20Sopenharmony_ci
38238c2ecf20Sopenharmony_ci	if (src_nents) {
38248c2ecf20Sopenharmony_ci		mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents,
38258c2ecf20Sopenharmony_ci					  DMA_TO_DEVICE);
38268c2ecf20Sopenharmony_ci		if (!mapped_nents) {
38278c2ecf20Sopenharmony_ci			dev_err(ctx->dev, "unable to map source for DMA\n");
38288c2ecf20Sopenharmony_ci			return ret;
38298c2ecf20Sopenharmony_ci		}
38308c2ecf20Sopenharmony_ci	} else {
38318c2ecf20Sopenharmony_ci		mapped_nents = 0;
38328c2ecf20Sopenharmony_ci	}
38338c2ecf20Sopenharmony_ci
38348c2ecf20Sopenharmony_ci	/* allocate space for base edesc and link tables */
38358c2ecf20Sopenharmony_ci	edesc = qi_cache_zalloc(GFP_DMA | flags);
38368c2ecf20Sopenharmony_ci	if (!edesc) {
38378c2ecf20Sopenharmony_ci		dma_unmap_sg(ctx->dev, req->src, src_nents, DMA_TO_DEVICE);
38388c2ecf20Sopenharmony_ci		return ret;
38398c2ecf20Sopenharmony_ci	}
38408c2ecf20Sopenharmony_ci
38418c2ecf20Sopenharmony_ci	edesc->src_nents = src_nents;
38428c2ecf20Sopenharmony_ci	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));
38438c2ecf20Sopenharmony_ci
38448c2ecf20Sopenharmony_ci	if (mapped_nents > 1) {
38458c2ecf20Sopenharmony_ci		int qm_sg_bytes;
38468c2ecf20Sopenharmony_ci		struct dpaa2_sg_entry *sg_table = &edesc->sgt[0];
38478c2ecf20Sopenharmony_ci
38488c2ecf20Sopenharmony_ci		qm_sg_bytes = pad_sg_nents(mapped_nents) * sizeof(*sg_table);
38498c2ecf20Sopenharmony_ci		sg_to_qm_sg_last(req->src, req->nbytes, sg_table, 0);
38508c2ecf20Sopenharmony_ci		edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table,
38518c2ecf20Sopenharmony_ci						  qm_sg_bytes, DMA_TO_DEVICE);
38528c2ecf20Sopenharmony_ci		if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {
38538c2ecf20Sopenharmony_ci			dev_err(ctx->dev, "unable to map S/G table\n");
38548c2ecf20Sopenharmony_ci			goto unmap;
38558c2ecf20Sopenharmony_ci		}
38568c2ecf20Sopenharmony_ci		edesc->qm_sg_bytes = qm_sg_bytes;
38578c2ecf20Sopenharmony_ci		dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);
38588c2ecf20Sopenharmony_ci		dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);
38598c2ecf20Sopenharmony_ci	} else {
38608c2ecf20Sopenharmony_ci		dpaa2_fl_set_format(in_fle, dpaa2_fl_single);
38618c2ecf20Sopenharmony_ci		dpaa2_fl_set_addr(in_fle, sg_dma_address(req->src));
38628c2ecf20Sopenharmony_ci	}
38638c2ecf20Sopenharmony_ci
38648c2ecf20Sopenharmony_ci	state->ctx_dma_len = digestsize;
38658c2ecf20Sopenharmony_ci	state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx, digestsize,
38668c2ecf20Sopenharmony_ci					DMA_FROM_DEVICE);
38678c2ecf20Sopenharmony_ci	if (dma_mapping_error(ctx->dev, state->ctx_dma)) {
38688c2ecf20Sopenharmony_ci		dev_err(ctx->dev, "unable to map ctx\n");
38698c2ecf20Sopenharmony_ci		state->ctx_dma = 0;
38708c2ecf20Sopenharmony_ci		goto unmap;
38718c2ecf20Sopenharmony_ci	}
38728c2ecf20Sopenharmony_ci
38738c2ecf20Sopenharmony_ci	dpaa2_fl_set_final(in_fle, true);
38748c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(in_fle, req->nbytes);
38758c2ecf20Sopenharmony_ci	dpaa2_fl_set_format(out_fle, dpaa2_fl_single);
38768c2ecf20Sopenharmony_ci	dpaa2_fl_set_addr(out_fle, state->ctx_dma);
38778c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(out_fle, digestsize);
38788c2ecf20Sopenharmony_ci
38798c2ecf20Sopenharmony_ci	req_ctx->flc = &ctx->flc[DIGEST];
38808c2ecf20Sopenharmony_ci	req_ctx->flc_dma = ctx->flc_dma[DIGEST];
38818c2ecf20Sopenharmony_ci	req_ctx->cbk = ahash_done;
38828c2ecf20Sopenharmony_ci	req_ctx->ctx = &req->base;
38838c2ecf20Sopenharmony_ci	req_ctx->edesc = edesc;
38848c2ecf20Sopenharmony_ci	ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);
38858c2ecf20Sopenharmony_ci	if (ret == -EINPROGRESS ||
38868c2ecf20Sopenharmony_ci	    (ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))
38878c2ecf20Sopenharmony_ci		return ret;
38888c2ecf20Sopenharmony_ci
38898c2ecf20Sopenharmony_ciunmap:
38908c2ecf20Sopenharmony_ci	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE);
38918c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
38928c2ecf20Sopenharmony_ci	return ret;
38938c2ecf20Sopenharmony_ci}
38948c2ecf20Sopenharmony_ci
38958c2ecf20Sopenharmony_cistatic int ahash_final_no_ctx(struct ahash_request *req)
38968c2ecf20Sopenharmony_ci{
38978c2ecf20Sopenharmony_ci	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
38988c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
38998c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
39008c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = &state->caam_req;
39018c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];
39028c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];
39038c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
39048c2ecf20Sopenharmony_ci		      GFP_KERNEL : GFP_ATOMIC;
39058c2ecf20Sopenharmony_ci	u8 *buf = state->buf;
39068c2ecf20Sopenharmony_ci	int buflen = state->buflen;
39078c2ecf20Sopenharmony_ci	int digestsize = crypto_ahash_digestsize(ahash);
39088c2ecf20Sopenharmony_ci	struct ahash_edesc *edesc;
39098c2ecf20Sopenharmony_ci	int ret = -ENOMEM;
39108c2ecf20Sopenharmony_ci
39118c2ecf20Sopenharmony_ci	/* allocate space for base edesc and link tables */
39128c2ecf20Sopenharmony_ci	edesc = qi_cache_zalloc(GFP_DMA | flags);
39138c2ecf20Sopenharmony_ci	if (!edesc)
39148c2ecf20Sopenharmony_ci		return ret;
39158c2ecf20Sopenharmony_ci
39168c2ecf20Sopenharmony_ci	if (buflen) {
39178c2ecf20Sopenharmony_ci		state->buf_dma = dma_map_single(ctx->dev, buf, buflen,
39188c2ecf20Sopenharmony_ci						DMA_TO_DEVICE);
39198c2ecf20Sopenharmony_ci		if (dma_mapping_error(ctx->dev, state->buf_dma)) {
39208c2ecf20Sopenharmony_ci			dev_err(ctx->dev, "unable to map src\n");
39218c2ecf20Sopenharmony_ci			goto unmap;
39228c2ecf20Sopenharmony_ci		}
39238c2ecf20Sopenharmony_ci	}
39248c2ecf20Sopenharmony_ci
39258c2ecf20Sopenharmony_ci	state->ctx_dma_len = digestsize;
39268c2ecf20Sopenharmony_ci	state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx, digestsize,
39278c2ecf20Sopenharmony_ci					DMA_FROM_DEVICE);
39288c2ecf20Sopenharmony_ci	if (dma_mapping_error(ctx->dev, state->ctx_dma)) {
39298c2ecf20Sopenharmony_ci		dev_err(ctx->dev, "unable to map ctx\n");
39308c2ecf20Sopenharmony_ci		state->ctx_dma = 0;
39318c2ecf20Sopenharmony_ci		goto unmap;
39328c2ecf20Sopenharmony_ci	}
39338c2ecf20Sopenharmony_ci
39348c2ecf20Sopenharmony_ci	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));
39358c2ecf20Sopenharmony_ci	dpaa2_fl_set_final(in_fle, true);
39368c2ecf20Sopenharmony_ci	/*
39378c2ecf20Sopenharmony_ci	 * crypto engine requires the input entry to be present when
39388c2ecf20Sopenharmony_ci	 * "frame list" FD is used.
39398c2ecf20Sopenharmony_ci	 * Since engine does not support FMT=2'b11 (unused entry type), leaving
39408c2ecf20Sopenharmony_ci	 * in_fle zeroized (except for "Final" flag) is the best option.
39418c2ecf20Sopenharmony_ci	 */
39428c2ecf20Sopenharmony_ci	if (buflen) {
39438c2ecf20Sopenharmony_ci		dpaa2_fl_set_format(in_fle, dpaa2_fl_single);
39448c2ecf20Sopenharmony_ci		dpaa2_fl_set_addr(in_fle, state->buf_dma);
39458c2ecf20Sopenharmony_ci		dpaa2_fl_set_len(in_fle, buflen);
39468c2ecf20Sopenharmony_ci	}
39478c2ecf20Sopenharmony_ci	dpaa2_fl_set_format(out_fle, dpaa2_fl_single);
39488c2ecf20Sopenharmony_ci	dpaa2_fl_set_addr(out_fle, state->ctx_dma);
39498c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(out_fle, digestsize);
39508c2ecf20Sopenharmony_ci
39518c2ecf20Sopenharmony_ci	req_ctx->flc = &ctx->flc[DIGEST];
39528c2ecf20Sopenharmony_ci	req_ctx->flc_dma = ctx->flc_dma[DIGEST];
39538c2ecf20Sopenharmony_ci	req_ctx->cbk = ahash_done;
39548c2ecf20Sopenharmony_ci	req_ctx->ctx = &req->base;
39558c2ecf20Sopenharmony_ci	req_ctx->edesc = edesc;
39568c2ecf20Sopenharmony_ci
39578c2ecf20Sopenharmony_ci	ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);
39588c2ecf20Sopenharmony_ci	if (ret == -EINPROGRESS ||
39598c2ecf20Sopenharmony_ci	    (ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))
39608c2ecf20Sopenharmony_ci		return ret;
39618c2ecf20Sopenharmony_ci
39628c2ecf20Sopenharmony_ciunmap:
39638c2ecf20Sopenharmony_ci	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE);
39648c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
39658c2ecf20Sopenharmony_ci	return ret;
39668c2ecf20Sopenharmony_ci}
39678c2ecf20Sopenharmony_ci
39688c2ecf20Sopenharmony_cistatic int ahash_update_no_ctx(struct ahash_request *req)
39698c2ecf20Sopenharmony_ci{
39708c2ecf20Sopenharmony_ci	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
39718c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
39728c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
39738c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = &state->caam_req;
39748c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];
39758c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];
39768c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
39778c2ecf20Sopenharmony_ci		      GFP_KERNEL : GFP_ATOMIC;
39788c2ecf20Sopenharmony_ci	u8 *buf = state->buf;
39798c2ecf20Sopenharmony_ci	int *buflen = &state->buflen;
39808c2ecf20Sopenharmony_ci	int *next_buflen = &state->next_buflen;
39818c2ecf20Sopenharmony_ci	int in_len = *buflen + req->nbytes, to_hash;
39828c2ecf20Sopenharmony_ci	int qm_sg_bytes, src_nents, mapped_nents;
39838c2ecf20Sopenharmony_ci	struct ahash_edesc *edesc;
39848c2ecf20Sopenharmony_ci	int ret = 0;
39858c2ecf20Sopenharmony_ci
39868c2ecf20Sopenharmony_ci	*next_buflen = in_len & (crypto_tfm_alg_blocksize(&ahash->base) - 1);
39878c2ecf20Sopenharmony_ci	to_hash = in_len - *next_buflen;
39888c2ecf20Sopenharmony_ci
39898c2ecf20Sopenharmony_ci	if (to_hash) {
39908c2ecf20Sopenharmony_ci		struct dpaa2_sg_entry *sg_table;
39918c2ecf20Sopenharmony_ci		int src_len = req->nbytes - *next_buflen;
39928c2ecf20Sopenharmony_ci
39938c2ecf20Sopenharmony_ci		src_nents = sg_nents_for_len(req->src, src_len);
39948c2ecf20Sopenharmony_ci		if (src_nents < 0) {
39958c2ecf20Sopenharmony_ci			dev_err(ctx->dev, "Invalid number of src SG.\n");
39968c2ecf20Sopenharmony_ci			return src_nents;
39978c2ecf20Sopenharmony_ci		}
39988c2ecf20Sopenharmony_ci
39998c2ecf20Sopenharmony_ci		if (src_nents) {
40008c2ecf20Sopenharmony_ci			mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents,
40018c2ecf20Sopenharmony_ci						  DMA_TO_DEVICE);
40028c2ecf20Sopenharmony_ci			if (!mapped_nents) {
40038c2ecf20Sopenharmony_ci				dev_err(ctx->dev, "unable to DMA map source\n");
40048c2ecf20Sopenharmony_ci				return -ENOMEM;
40058c2ecf20Sopenharmony_ci			}
40068c2ecf20Sopenharmony_ci		} else {
40078c2ecf20Sopenharmony_ci			mapped_nents = 0;
40088c2ecf20Sopenharmony_ci		}
40098c2ecf20Sopenharmony_ci
40108c2ecf20Sopenharmony_ci		/* allocate space for base edesc and link tables */
40118c2ecf20Sopenharmony_ci		edesc = qi_cache_zalloc(GFP_DMA | flags);
40128c2ecf20Sopenharmony_ci		if (!edesc) {
40138c2ecf20Sopenharmony_ci			dma_unmap_sg(ctx->dev, req->src, src_nents,
40148c2ecf20Sopenharmony_ci				     DMA_TO_DEVICE);
40158c2ecf20Sopenharmony_ci			return -ENOMEM;
40168c2ecf20Sopenharmony_ci		}
40178c2ecf20Sopenharmony_ci
40188c2ecf20Sopenharmony_ci		edesc->src_nents = src_nents;
40198c2ecf20Sopenharmony_ci		qm_sg_bytes = pad_sg_nents(1 + mapped_nents) *
40208c2ecf20Sopenharmony_ci			      sizeof(*sg_table);
40218c2ecf20Sopenharmony_ci		sg_table = &edesc->sgt[0];
40228c2ecf20Sopenharmony_ci
40238c2ecf20Sopenharmony_ci		ret = buf_map_to_qm_sg(ctx->dev, sg_table, state);
40248c2ecf20Sopenharmony_ci		if (ret)
40258c2ecf20Sopenharmony_ci			goto unmap_ctx;
40268c2ecf20Sopenharmony_ci
40278c2ecf20Sopenharmony_ci		sg_to_qm_sg_last(req->src, src_len, sg_table + 1, 0);
40288c2ecf20Sopenharmony_ci
40298c2ecf20Sopenharmony_ci		edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table,
40308c2ecf20Sopenharmony_ci						  qm_sg_bytes, DMA_TO_DEVICE);
40318c2ecf20Sopenharmony_ci		if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {
40328c2ecf20Sopenharmony_ci			dev_err(ctx->dev, "unable to map S/G table\n");
40338c2ecf20Sopenharmony_ci			ret = -ENOMEM;
40348c2ecf20Sopenharmony_ci			goto unmap_ctx;
40358c2ecf20Sopenharmony_ci		}
40368c2ecf20Sopenharmony_ci		edesc->qm_sg_bytes = qm_sg_bytes;
40378c2ecf20Sopenharmony_ci
40388c2ecf20Sopenharmony_ci		state->ctx_dma_len = ctx->ctx_len;
40398c2ecf20Sopenharmony_ci		state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx,
40408c2ecf20Sopenharmony_ci						ctx->ctx_len, DMA_FROM_DEVICE);
40418c2ecf20Sopenharmony_ci		if (dma_mapping_error(ctx->dev, state->ctx_dma)) {
40428c2ecf20Sopenharmony_ci			dev_err(ctx->dev, "unable to map ctx\n");
40438c2ecf20Sopenharmony_ci			state->ctx_dma = 0;
40448c2ecf20Sopenharmony_ci			ret = -ENOMEM;
40458c2ecf20Sopenharmony_ci			goto unmap_ctx;
40468c2ecf20Sopenharmony_ci		}
40478c2ecf20Sopenharmony_ci
40488c2ecf20Sopenharmony_ci		memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));
40498c2ecf20Sopenharmony_ci		dpaa2_fl_set_final(in_fle, true);
40508c2ecf20Sopenharmony_ci		dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);
40518c2ecf20Sopenharmony_ci		dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);
40528c2ecf20Sopenharmony_ci		dpaa2_fl_set_len(in_fle, to_hash);
40538c2ecf20Sopenharmony_ci		dpaa2_fl_set_format(out_fle, dpaa2_fl_single);
40548c2ecf20Sopenharmony_ci		dpaa2_fl_set_addr(out_fle, state->ctx_dma);
40558c2ecf20Sopenharmony_ci		dpaa2_fl_set_len(out_fle, ctx->ctx_len);
40568c2ecf20Sopenharmony_ci
40578c2ecf20Sopenharmony_ci		req_ctx->flc = &ctx->flc[UPDATE_FIRST];
40588c2ecf20Sopenharmony_ci		req_ctx->flc_dma = ctx->flc_dma[UPDATE_FIRST];
40598c2ecf20Sopenharmony_ci		req_ctx->cbk = ahash_done_ctx_dst;
40608c2ecf20Sopenharmony_ci		req_ctx->ctx = &req->base;
40618c2ecf20Sopenharmony_ci		req_ctx->edesc = edesc;
40628c2ecf20Sopenharmony_ci
40638c2ecf20Sopenharmony_ci		ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);
40648c2ecf20Sopenharmony_ci		if (ret != -EINPROGRESS &&
40658c2ecf20Sopenharmony_ci		    !(ret == -EBUSY &&
40668c2ecf20Sopenharmony_ci		      req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))
40678c2ecf20Sopenharmony_ci			goto unmap_ctx;
40688c2ecf20Sopenharmony_ci
40698c2ecf20Sopenharmony_ci		state->update = ahash_update_ctx;
40708c2ecf20Sopenharmony_ci		state->finup = ahash_finup_ctx;
40718c2ecf20Sopenharmony_ci		state->final = ahash_final_ctx;
40728c2ecf20Sopenharmony_ci	} else if (*next_buflen) {
40738c2ecf20Sopenharmony_ci		scatterwalk_map_and_copy(buf + *buflen, req->src, 0,
40748c2ecf20Sopenharmony_ci					 req->nbytes, 0);
40758c2ecf20Sopenharmony_ci		*buflen = *next_buflen;
40768c2ecf20Sopenharmony_ci
40778c2ecf20Sopenharmony_ci		print_hex_dump_debug("buf@" __stringify(__LINE__)": ",
40788c2ecf20Sopenharmony_ci				     DUMP_PREFIX_ADDRESS, 16, 4, buf,
40798c2ecf20Sopenharmony_ci				     *buflen, 1);
40808c2ecf20Sopenharmony_ci	}
40818c2ecf20Sopenharmony_ci
40828c2ecf20Sopenharmony_ci	return ret;
40838c2ecf20Sopenharmony_ciunmap_ctx:
40848c2ecf20Sopenharmony_ci	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_TO_DEVICE);
40858c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
40868c2ecf20Sopenharmony_ci	return ret;
40878c2ecf20Sopenharmony_ci}
40888c2ecf20Sopenharmony_ci
40898c2ecf20Sopenharmony_cistatic int ahash_finup_no_ctx(struct ahash_request *req)
40908c2ecf20Sopenharmony_ci{
40918c2ecf20Sopenharmony_ci	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
40928c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
40938c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
40948c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = &state->caam_req;
40958c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];
40968c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];
40978c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
40988c2ecf20Sopenharmony_ci		      GFP_KERNEL : GFP_ATOMIC;
40998c2ecf20Sopenharmony_ci	int buflen = state->buflen;
41008c2ecf20Sopenharmony_ci	int qm_sg_bytes, src_nents, mapped_nents;
41018c2ecf20Sopenharmony_ci	int digestsize = crypto_ahash_digestsize(ahash);
41028c2ecf20Sopenharmony_ci	struct ahash_edesc *edesc;
41038c2ecf20Sopenharmony_ci	struct dpaa2_sg_entry *sg_table;
41048c2ecf20Sopenharmony_ci	int ret = -ENOMEM;
41058c2ecf20Sopenharmony_ci
41068c2ecf20Sopenharmony_ci	src_nents = sg_nents_for_len(req->src, req->nbytes);
41078c2ecf20Sopenharmony_ci	if (src_nents < 0) {
41088c2ecf20Sopenharmony_ci		dev_err(ctx->dev, "Invalid number of src SG.\n");
41098c2ecf20Sopenharmony_ci		return src_nents;
41108c2ecf20Sopenharmony_ci	}
41118c2ecf20Sopenharmony_ci
41128c2ecf20Sopenharmony_ci	if (src_nents) {
41138c2ecf20Sopenharmony_ci		mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents,
41148c2ecf20Sopenharmony_ci					  DMA_TO_DEVICE);
41158c2ecf20Sopenharmony_ci		if (!mapped_nents) {
41168c2ecf20Sopenharmony_ci			dev_err(ctx->dev, "unable to DMA map source\n");
41178c2ecf20Sopenharmony_ci			return ret;
41188c2ecf20Sopenharmony_ci		}
41198c2ecf20Sopenharmony_ci	} else {
41208c2ecf20Sopenharmony_ci		mapped_nents = 0;
41218c2ecf20Sopenharmony_ci	}
41228c2ecf20Sopenharmony_ci
41238c2ecf20Sopenharmony_ci	/* allocate space for base edesc and link tables */
41248c2ecf20Sopenharmony_ci	edesc = qi_cache_zalloc(GFP_DMA | flags);
41258c2ecf20Sopenharmony_ci	if (!edesc) {
41268c2ecf20Sopenharmony_ci		dma_unmap_sg(ctx->dev, req->src, src_nents, DMA_TO_DEVICE);
41278c2ecf20Sopenharmony_ci		return ret;
41288c2ecf20Sopenharmony_ci	}
41298c2ecf20Sopenharmony_ci
41308c2ecf20Sopenharmony_ci	edesc->src_nents = src_nents;
41318c2ecf20Sopenharmony_ci	qm_sg_bytes = pad_sg_nents(2 + mapped_nents) * sizeof(*sg_table);
41328c2ecf20Sopenharmony_ci	sg_table = &edesc->sgt[0];
41338c2ecf20Sopenharmony_ci
41348c2ecf20Sopenharmony_ci	ret = buf_map_to_qm_sg(ctx->dev, sg_table, state);
41358c2ecf20Sopenharmony_ci	if (ret)
41368c2ecf20Sopenharmony_ci		goto unmap;
41378c2ecf20Sopenharmony_ci
41388c2ecf20Sopenharmony_ci	sg_to_qm_sg_last(req->src, req->nbytes, sg_table + 1, 0);
41398c2ecf20Sopenharmony_ci
41408c2ecf20Sopenharmony_ci	edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table, qm_sg_bytes,
41418c2ecf20Sopenharmony_ci					  DMA_TO_DEVICE);
41428c2ecf20Sopenharmony_ci	if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {
41438c2ecf20Sopenharmony_ci		dev_err(ctx->dev, "unable to map S/G table\n");
41448c2ecf20Sopenharmony_ci		ret = -ENOMEM;
41458c2ecf20Sopenharmony_ci		goto unmap;
41468c2ecf20Sopenharmony_ci	}
41478c2ecf20Sopenharmony_ci	edesc->qm_sg_bytes = qm_sg_bytes;
41488c2ecf20Sopenharmony_ci
41498c2ecf20Sopenharmony_ci	state->ctx_dma_len = digestsize;
41508c2ecf20Sopenharmony_ci	state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx, digestsize,
41518c2ecf20Sopenharmony_ci					DMA_FROM_DEVICE);
41528c2ecf20Sopenharmony_ci	if (dma_mapping_error(ctx->dev, state->ctx_dma)) {
41538c2ecf20Sopenharmony_ci		dev_err(ctx->dev, "unable to map ctx\n");
41548c2ecf20Sopenharmony_ci		state->ctx_dma = 0;
41558c2ecf20Sopenharmony_ci		ret = -ENOMEM;
41568c2ecf20Sopenharmony_ci		goto unmap;
41578c2ecf20Sopenharmony_ci	}
41588c2ecf20Sopenharmony_ci
41598c2ecf20Sopenharmony_ci	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));
41608c2ecf20Sopenharmony_ci	dpaa2_fl_set_final(in_fle, true);
41618c2ecf20Sopenharmony_ci	dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);
41628c2ecf20Sopenharmony_ci	dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);
41638c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(in_fle, buflen + req->nbytes);
41648c2ecf20Sopenharmony_ci	dpaa2_fl_set_format(out_fle, dpaa2_fl_single);
41658c2ecf20Sopenharmony_ci	dpaa2_fl_set_addr(out_fle, state->ctx_dma);
41668c2ecf20Sopenharmony_ci	dpaa2_fl_set_len(out_fle, digestsize);
41678c2ecf20Sopenharmony_ci
41688c2ecf20Sopenharmony_ci	req_ctx->flc = &ctx->flc[DIGEST];
41698c2ecf20Sopenharmony_ci	req_ctx->flc_dma = ctx->flc_dma[DIGEST];
41708c2ecf20Sopenharmony_ci	req_ctx->cbk = ahash_done;
41718c2ecf20Sopenharmony_ci	req_ctx->ctx = &req->base;
41728c2ecf20Sopenharmony_ci	req_ctx->edesc = edesc;
41738c2ecf20Sopenharmony_ci	ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);
41748c2ecf20Sopenharmony_ci	if (ret != -EINPROGRESS &&
41758c2ecf20Sopenharmony_ci	    !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))
41768c2ecf20Sopenharmony_ci		goto unmap;
41778c2ecf20Sopenharmony_ci
41788c2ecf20Sopenharmony_ci	return ret;
41798c2ecf20Sopenharmony_ciunmap:
41808c2ecf20Sopenharmony_ci	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE);
41818c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
41828c2ecf20Sopenharmony_ci	return ret;
41838c2ecf20Sopenharmony_ci}
41848c2ecf20Sopenharmony_ci
41858c2ecf20Sopenharmony_cistatic int ahash_update_first(struct ahash_request *req)
41868c2ecf20Sopenharmony_ci{
41878c2ecf20Sopenharmony_ci	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
41888c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
41898c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
41908c2ecf20Sopenharmony_ci	struct caam_request *req_ctx = &state->caam_req;
41918c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];
41928c2ecf20Sopenharmony_ci	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];
41938c2ecf20Sopenharmony_ci	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
41948c2ecf20Sopenharmony_ci		      GFP_KERNEL : GFP_ATOMIC;
41958c2ecf20Sopenharmony_ci	u8 *buf = state->buf;
41968c2ecf20Sopenharmony_ci	int *buflen = &state->buflen;
41978c2ecf20Sopenharmony_ci	int *next_buflen = &state->next_buflen;
41988c2ecf20Sopenharmony_ci	int to_hash;
41998c2ecf20Sopenharmony_ci	int src_nents, mapped_nents;
42008c2ecf20Sopenharmony_ci	struct ahash_edesc *edesc;
42018c2ecf20Sopenharmony_ci	int ret = 0;
42028c2ecf20Sopenharmony_ci
42038c2ecf20Sopenharmony_ci	*next_buflen = req->nbytes & (crypto_tfm_alg_blocksize(&ahash->base) -
42048c2ecf20Sopenharmony_ci				      1);
42058c2ecf20Sopenharmony_ci	to_hash = req->nbytes - *next_buflen;
42068c2ecf20Sopenharmony_ci
42078c2ecf20Sopenharmony_ci	if (to_hash) {
42088c2ecf20Sopenharmony_ci		struct dpaa2_sg_entry *sg_table;
42098c2ecf20Sopenharmony_ci		int src_len = req->nbytes - *next_buflen;
42108c2ecf20Sopenharmony_ci
42118c2ecf20Sopenharmony_ci		src_nents = sg_nents_for_len(req->src, src_len);
42128c2ecf20Sopenharmony_ci		if (src_nents < 0) {
42138c2ecf20Sopenharmony_ci			dev_err(ctx->dev, "Invalid number of src SG.\n");
42148c2ecf20Sopenharmony_ci			return src_nents;
42158c2ecf20Sopenharmony_ci		}
42168c2ecf20Sopenharmony_ci
42178c2ecf20Sopenharmony_ci		if (src_nents) {
42188c2ecf20Sopenharmony_ci			mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents,
42198c2ecf20Sopenharmony_ci						  DMA_TO_DEVICE);
42208c2ecf20Sopenharmony_ci			if (!mapped_nents) {
42218c2ecf20Sopenharmony_ci				dev_err(ctx->dev, "unable to map source for DMA\n");
42228c2ecf20Sopenharmony_ci				return -ENOMEM;
42238c2ecf20Sopenharmony_ci			}
42248c2ecf20Sopenharmony_ci		} else {
42258c2ecf20Sopenharmony_ci			mapped_nents = 0;
42268c2ecf20Sopenharmony_ci		}
42278c2ecf20Sopenharmony_ci
42288c2ecf20Sopenharmony_ci		/* allocate space for base edesc and link tables */
42298c2ecf20Sopenharmony_ci		edesc = qi_cache_zalloc(GFP_DMA | flags);
42308c2ecf20Sopenharmony_ci		if (!edesc) {
42318c2ecf20Sopenharmony_ci			dma_unmap_sg(ctx->dev, req->src, src_nents,
42328c2ecf20Sopenharmony_ci				     DMA_TO_DEVICE);
42338c2ecf20Sopenharmony_ci			return -ENOMEM;
42348c2ecf20Sopenharmony_ci		}
42358c2ecf20Sopenharmony_ci
42368c2ecf20Sopenharmony_ci		edesc->src_nents = src_nents;
42378c2ecf20Sopenharmony_ci		sg_table = &edesc->sgt[0];
42388c2ecf20Sopenharmony_ci
42398c2ecf20Sopenharmony_ci		memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));
42408c2ecf20Sopenharmony_ci		dpaa2_fl_set_final(in_fle, true);
42418c2ecf20Sopenharmony_ci		dpaa2_fl_set_len(in_fle, to_hash);
42428c2ecf20Sopenharmony_ci
42438c2ecf20Sopenharmony_ci		if (mapped_nents > 1) {
42448c2ecf20Sopenharmony_ci			int qm_sg_bytes;
42458c2ecf20Sopenharmony_ci
42468c2ecf20Sopenharmony_ci			sg_to_qm_sg_last(req->src, src_len, sg_table, 0);
42478c2ecf20Sopenharmony_ci			qm_sg_bytes = pad_sg_nents(mapped_nents) *
42488c2ecf20Sopenharmony_ci				      sizeof(*sg_table);
42498c2ecf20Sopenharmony_ci			edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table,
42508c2ecf20Sopenharmony_ci							  qm_sg_bytes,
42518c2ecf20Sopenharmony_ci							  DMA_TO_DEVICE);
42528c2ecf20Sopenharmony_ci			if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {
42538c2ecf20Sopenharmony_ci				dev_err(ctx->dev, "unable to map S/G table\n");
42548c2ecf20Sopenharmony_ci				ret = -ENOMEM;
42558c2ecf20Sopenharmony_ci				goto unmap_ctx;
42568c2ecf20Sopenharmony_ci			}
42578c2ecf20Sopenharmony_ci			edesc->qm_sg_bytes = qm_sg_bytes;
42588c2ecf20Sopenharmony_ci			dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);
42598c2ecf20Sopenharmony_ci			dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);
42608c2ecf20Sopenharmony_ci		} else {
42618c2ecf20Sopenharmony_ci			dpaa2_fl_set_format(in_fle, dpaa2_fl_single);
42628c2ecf20Sopenharmony_ci			dpaa2_fl_set_addr(in_fle, sg_dma_address(req->src));
42638c2ecf20Sopenharmony_ci		}
42648c2ecf20Sopenharmony_ci
42658c2ecf20Sopenharmony_ci		state->ctx_dma_len = ctx->ctx_len;
42668c2ecf20Sopenharmony_ci		state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx,
42678c2ecf20Sopenharmony_ci						ctx->ctx_len, DMA_FROM_DEVICE);
42688c2ecf20Sopenharmony_ci		if (dma_mapping_error(ctx->dev, state->ctx_dma)) {
42698c2ecf20Sopenharmony_ci			dev_err(ctx->dev, "unable to map ctx\n");
42708c2ecf20Sopenharmony_ci			state->ctx_dma = 0;
42718c2ecf20Sopenharmony_ci			ret = -ENOMEM;
42728c2ecf20Sopenharmony_ci			goto unmap_ctx;
42738c2ecf20Sopenharmony_ci		}
42748c2ecf20Sopenharmony_ci
42758c2ecf20Sopenharmony_ci		dpaa2_fl_set_format(out_fle, dpaa2_fl_single);
42768c2ecf20Sopenharmony_ci		dpaa2_fl_set_addr(out_fle, state->ctx_dma);
42778c2ecf20Sopenharmony_ci		dpaa2_fl_set_len(out_fle, ctx->ctx_len);
42788c2ecf20Sopenharmony_ci
42798c2ecf20Sopenharmony_ci		req_ctx->flc = &ctx->flc[UPDATE_FIRST];
42808c2ecf20Sopenharmony_ci		req_ctx->flc_dma = ctx->flc_dma[UPDATE_FIRST];
42818c2ecf20Sopenharmony_ci		req_ctx->cbk = ahash_done_ctx_dst;
42828c2ecf20Sopenharmony_ci		req_ctx->ctx = &req->base;
42838c2ecf20Sopenharmony_ci		req_ctx->edesc = edesc;
42848c2ecf20Sopenharmony_ci
42858c2ecf20Sopenharmony_ci		ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);
42868c2ecf20Sopenharmony_ci		if (ret != -EINPROGRESS &&
42878c2ecf20Sopenharmony_ci		    !(ret == -EBUSY && req->base.flags &
42888c2ecf20Sopenharmony_ci		      CRYPTO_TFM_REQ_MAY_BACKLOG))
42898c2ecf20Sopenharmony_ci			goto unmap_ctx;
42908c2ecf20Sopenharmony_ci
42918c2ecf20Sopenharmony_ci		state->update = ahash_update_ctx;
42928c2ecf20Sopenharmony_ci		state->finup = ahash_finup_ctx;
42938c2ecf20Sopenharmony_ci		state->final = ahash_final_ctx;
42948c2ecf20Sopenharmony_ci	} else if (*next_buflen) {
42958c2ecf20Sopenharmony_ci		state->update = ahash_update_no_ctx;
42968c2ecf20Sopenharmony_ci		state->finup = ahash_finup_no_ctx;
42978c2ecf20Sopenharmony_ci		state->final = ahash_final_no_ctx;
42988c2ecf20Sopenharmony_ci		scatterwalk_map_and_copy(buf, req->src, 0,
42998c2ecf20Sopenharmony_ci					 req->nbytes, 0);
43008c2ecf20Sopenharmony_ci		*buflen = *next_buflen;
43018c2ecf20Sopenharmony_ci
43028c2ecf20Sopenharmony_ci		print_hex_dump_debug("buf@" __stringify(__LINE__)": ",
43038c2ecf20Sopenharmony_ci				     DUMP_PREFIX_ADDRESS, 16, 4, buf,
43048c2ecf20Sopenharmony_ci				     *buflen, 1);
43058c2ecf20Sopenharmony_ci	}
43068c2ecf20Sopenharmony_ci
43078c2ecf20Sopenharmony_ci	return ret;
43088c2ecf20Sopenharmony_ciunmap_ctx:
43098c2ecf20Sopenharmony_ci	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_TO_DEVICE);
43108c2ecf20Sopenharmony_ci	qi_cache_free(edesc);
43118c2ecf20Sopenharmony_ci	return ret;
43128c2ecf20Sopenharmony_ci}
43138c2ecf20Sopenharmony_ci
43148c2ecf20Sopenharmony_cistatic int ahash_finup_first(struct ahash_request *req)
43158c2ecf20Sopenharmony_ci{
43168c2ecf20Sopenharmony_ci	return ahash_digest(req);
43178c2ecf20Sopenharmony_ci}
43188c2ecf20Sopenharmony_ci
43198c2ecf20Sopenharmony_cistatic int ahash_init(struct ahash_request *req)
43208c2ecf20Sopenharmony_ci{
43218c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
43228c2ecf20Sopenharmony_ci
43238c2ecf20Sopenharmony_ci	state->update = ahash_update_first;
43248c2ecf20Sopenharmony_ci	state->finup = ahash_finup_first;
43258c2ecf20Sopenharmony_ci	state->final = ahash_final_no_ctx;
43268c2ecf20Sopenharmony_ci
43278c2ecf20Sopenharmony_ci	state->ctx_dma = 0;
43288c2ecf20Sopenharmony_ci	state->ctx_dma_len = 0;
43298c2ecf20Sopenharmony_ci	state->buf_dma = 0;
43308c2ecf20Sopenharmony_ci	state->buflen = 0;
43318c2ecf20Sopenharmony_ci	state->next_buflen = 0;
43328c2ecf20Sopenharmony_ci
43338c2ecf20Sopenharmony_ci	return 0;
43348c2ecf20Sopenharmony_ci}
43358c2ecf20Sopenharmony_ci
43368c2ecf20Sopenharmony_cistatic int ahash_update(struct ahash_request *req)
43378c2ecf20Sopenharmony_ci{
43388c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
43398c2ecf20Sopenharmony_ci
43408c2ecf20Sopenharmony_ci	return state->update(req);
43418c2ecf20Sopenharmony_ci}
43428c2ecf20Sopenharmony_ci
43438c2ecf20Sopenharmony_cistatic int ahash_finup(struct ahash_request *req)
43448c2ecf20Sopenharmony_ci{
43458c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
43468c2ecf20Sopenharmony_ci
43478c2ecf20Sopenharmony_ci	return state->finup(req);
43488c2ecf20Sopenharmony_ci}
43498c2ecf20Sopenharmony_ci
43508c2ecf20Sopenharmony_cistatic int ahash_final(struct ahash_request *req)
43518c2ecf20Sopenharmony_ci{
43528c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
43538c2ecf20Sopenharmony_ci
43548c2ecf20Sopenharmony_ci	return state->final(req);
43558c2ecf20Sopenharmony_ci}
43568c2ecf20Sopenharmony_ci
43578c2ecf20Sopenharmony_cistatic int ahash_export(struct ahash_request *req, void *out)
43588c2ecf20Sopenharmony_ci{
43598c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
43608c2ecf20Sopenharmony_ci	struct caam_export_state *export = out;
43618c2ecf20Sopenharmony_ci	u8 *buf = state->buf;
43628c2ecf20Sopenharmony_ci	int len = state->buflen;
43638c2ecf20Sopenharmony_ci
43648c2ecf20Sopenharmony_ci	memcpy(export->buf, buf, len);
43658c2ecf20Sopenharmony_ci	memcpy(export->caam_ctx, state->caam_ctx, sizeof(export->caam_ctx));
43668c2ecf20Sopenharmony_ci	export->buflen = len;
43678c2ecf20Sopenharmony_ci	export->update = state->update;
43688c2ecf20Sopenharmony_ci	export->final = state->final;
43698c2ecf20Sopenharmony_ci	export->finup = state->finup;
43708c2ecf20Sopenharmony_ci
43718c2ecf20Sopenharmony_ci	return 0;
43728c2ecf20Sopenharmony_ci}
43738c2ecf20Sopenharmony_ci
43748c2ecf20Sopenharmony_cistatic int ahash_import(struct ahash_request *req, const void *in)
43758c2ecf20Sopenharmony_ci{
43768c2ecf20Sopenharmony_ci	struct caam_hash_state *state = ahash_request_ctx(req);
43778c2ecf20Sopenharmony_ci	const struct caam_export_state *export = in;
43788c2ecf20Sopenharmony_ci
43798c2ecf20Sopenharmony_ci	memset(state, 0, sizeof(*state));
43808c2ecf20Sopenharmony_ci	memcpy(state->buf, export->buf, export->buflen);
43818c2ecf20Sopenharmony_ci	memcpy(state->caam_ctx, export->caam_ctx, sizeof(state->caam_ctx));
43828c2ecf20Sopenharmony_ci	state->buflen = export->buflen;
43838c2ecf20Sopenharmony_ci	state->update = export->update;
43848c2ecf20Sopenharmony_ci	state->final = export->final;
43858c2ecf20Sopenharmony_ci	state->finup = export->finup;
43868c2ecf20Sopenharmony_ci
43878c2ecf20Sopenharmony_ci	return 0;
43888c2ecf20Sopenharmony_ci}
43898c2ecf20Sopenharmony_ci
43908c2ecf20Sopenharmony_cistruct caam_hash_template {
43918c2ecf20Sopenharmony_ci	char name[CRYPTO_MAX_ALG_NAME];
43928c2ecf20Sopenharmony_ci	char driver_name[CRYPTO_MAX_ALG_NAME];
43938c2ecf20Sopenharmony_ci	char hmac_name[CRYPTO_MAX_ALG_NAME];
43948c2ecf20Sopenharmony_ci	char hmac_driver_name[CRYPTO_MAX_ALG_NAME];
43958c2ecf20Sopenharmony_ci	unsigned int blocksize;
43968c2ecf20Sopenharmony_ci	struct ahash_alg template_ahash;
43978c2ecf20Sopenharmony_ci	u32 alg_type;
43988c2ecf20Sopenharmony_ci};
43998c2ecf20Sopenharmony_ci
44008c2ecf20Sopenharmony_ci/* ahash descriptors */
44018c2ecf20Sopenharmony_cistatic struct caam_hash_template driver_hash[] = {
44028c2ecf20Sopenharmony_ci	{
44038c2ecf20Sopenharmony_ci		.name = "sha1",
44048c2ecf20Sopenharmony_ci		.driver_name = "sha1-caam-qi2",
44058c2ecf20Sopenharmony_ci		.hmac_name = "hmac(sha1)",
44068c2ecf20Sopenharmony_ci		.hmac_driver_name = "hmac-sha1-caam-qi2",
44078c2ecf20Sopenharmony_ci		.blocksize = SHA1_BLOCK_SIZE,
44088c2ecf20Sopenharmony_ci		.template_ahash = {
44098c2ecf20Sopenharmony_ci			.init = ahash_init,
44108c2ecf20Sopenharmony_ci			.update = ahash_update,
44118c2ecf20Sopenharmony_ci			.final = ahash_final,
44128c2ecf20Sopenharmony_ci			.finup = ahash_finup,
44138c2ecf20Sopenharmony_ci			.digest = ahash_digest,
44148c2ecf20Sopenharmony_ci			.export = ahash_export,
44158c2ecf20Sopenharmony_ci			.import = ahash_import,
44168c2ecf20Sopenharmony_ci			.setkey = ahash_setkey,
44178c2ecf20Sopenharmony_ci			.halg = {
44188c2ecf20Sopenharmony_ci				.digestsize = SHA1_DIGEST_SIZE,
44198c2ecf20Sopenharmony_ci				.statesize = sizeof(struct caam_export_state),
44208c2ecf20Sopenharmony_ci			},
44218c2ecf20Sopenharmony_ci		},
44228c2ecf20Sopenharmony_ci		.alg_type = OP_ALG_ALGSEL_SHA1,
44238c2ecf20Sopenharmony_ci	}, {
44248c2ecf20Sopenharmony_ci		.name = "sha224",
44258c2ecf20Sopenharmony_ci		.driver_name = "sha224-caam-qi2",
44268c2ecf20Sopenharmony_ci		.hmac_name = "hmac(sha224)",
44278c2ecf20Sopenharmony_ci		.hmac_driver_name = "hmac-sha224-caam-qi2",
44288c2ecf20Sopenharmony_ci		.blocksize = SHA224_BLOCK_SIZE,
44298c2ecf20Sopenharmony_ci		.template_ahash = {
44308c2ecf20Sopenharmony_ci			.init = ahash_init,
44318c2ecf20Sopenharmony_ci			.update = ahash_update,
44328c2ecf20Sopenharmony_ci			.final = ahash_final,
44338c2ecf20Sopenharmony_ci			.finup = ahash_finup,
44348c2ecf20Sopenharmony_ci			.digest = ahash_digest,
44358c2ecf20Sopenharmony_ci			.export = ahash_export,
44368c2ecf20Sopenharmony_ci			.import = ahash_import,
44378c2ecf20Sopenharmony_ci			.setkey = ahash_setkey,
44388c2ecf20Sopenharmony_ci			.halg = {
44398c2ecf20Sopenharmony_ci				.digestsize = SHA224_DIGEST_SIZE,
44408c2ecf20Sopenharmony_ci				.statesize = sizeof(struct caam_export_state),
44418c2ecf20Sopenharmony_ci			},
44428c2ecf20Sopenharmony_ci		},
44438c2ecf20Sopenharmony_ci		.alg_type = OP_ALG_ALGSEL_SHA224,
44448c2ecf20Sopenharmony_ci	}, {
44458c2ecf20Sopenharmony_ci		.name = "sha256",
44468c2ecf20Sopenharmony_ci		.driver_name = "sha256-caam-qi2",
44478c2ecf20Sopenharmony_ci		.hmac_name = "hmac(sha256)",
44488c2ecf20Sopenharmony_ci		.hmac_driver_name = "hmac-sha256-caam-qi2",
44498c2ecf20Sopenharmony_ci		.blocksize = SHA256_BLOCK_SIZE,
44508c2ecf20Sopenharmony_ci		.template_ahash = {
44518c2ecf20Sopenharmony_ci			.init = ahash_init,
44528c2ecf20Sopenharmony_ci			.update = ahash_update,
44538c2ecf20Sopenharmony_ci			.final = ahash_final,
44548c2ecf20Sopenharmony_ci			.finup = ahash_finup,
44558c2ecf20Sopenharmony_ci			.digest = ahash_digest,
44568c2ecf20Sopenharmony_ci			.export = ahash_export,
44578c2ecf20Sopenharmony_ci			.import = ahash_import,
44588c2ecf20Sopenharmony_ci			.setkey = ahash_setkey,
44598c2ecf20Sopenharmony_ci			.halg = {
44608c2ecf20Sopenharmony_ci				.digestsize = SHA256_DIGEST_SIZE,
44618c2ecf20Sopenharmony_ci				.statesize = sizeof(struct caam_export_state),
44628c2ecf20Sopenharmony_ci			},
44638c2ecf20Sopenharmony_ci		},
44648c2ecf20Sopenharmony_ci		.alg_type = OP_ALG_ALGSEL_SHA256,
44658c2ecf20Sopenharmony_ci	}, {
44668c2ecf20Sopenharmony_ci		.name = "sha384",
44678c2ecf20Sopenharmony_ci		.driver_name = "sha384-caam-qi2",
44688c2ecf20Sopenharmony_ci		.hmac_name = "hmac(sha384)",
44698c2ecf20Sopenharmony_ci		.hmac_driver_name = "hmac-sha384-caam-qi2",
44708c2ecf20Sopenharmony_ci		.blocksize = SHA384_BLOCK_SIZE,
44718c2ecf20Sopenharmony_ci		.template_ahash = {
44728c2ecf20Sopenharmony_ci			.init = ahash_init,
44738c2ecf20Sopenharmony_ci			.update = ahash_update,
44748c2ecf20Sopenharmony_ci			.final = ahash_final,
44758c2ecf20Sopenharmony_ci			.finup = ahash_finup,
44768c2ecf20Sopenharmony_ci			.digest = ahash_digest,
44778c2ecf20Sopenharmony_ci			.export = ahash_export,
44788c2ecf20Sopenharmony_ci			.import = ahash_import,
44798c2ecf20Sopenharmony_ci			.setkey = ahash_setkey,
44808c2ecf20Sopenharmony_ci			.halg = {
44818c2ecf20Sopenharmony_ci				.digestsize = SHA384_DIGEST_SIZE,
44828c2ecf20Sopenharmony_ci				.statesize = sizeof(struct caam_export_state),
44838c2ecf20Sopenharmony_ci			},
44848c2ecf20Sopenharmony_ci		},
44858c2ecf20Sopenharmony_ci		.alg_type = OP_ALG_ALGSEL_SHA384,
44868c2ecf20Sopenharmony_ci	}, {
44878c2ecf20Sopenharmony_ci		.name = "sha512",
44888c2ecf20Sopenharmony_ci		.driver_name = "sha512-caam-qi2",
44898c2ecf20Sopenharmony_ci		.hmac_name = "hmac(sha512)",
44908c2ecf20Sopenharmony_ci		.hmac_driver_name = "hmac-sha512-caam-qi2",
44918c2ecf20Sopenharmony_ci		.blocksize = SHA512_BLOCK_SIZE,
44928c2ecf20Sopenharmony_ci		.template_ahash = {
44938c2ecf20Sopenharmony_ci			.init = ahash_init,
44948c2ecf20Sopenharmony_ci			.update = ahash_update,
44958c2ecf20Sopenharmony_ci			.final = ahash_final,
44968c2ecf20Sopenharmony_ci			.finup = ahash_finup,
44978c2ecf20Sopenharmony_ci			.digest = ahash_digest,
44988c2ecf20Sopenharmony_ci			.export = ahash_export,
44998c2ecf20Sopenharmony_ci			.import = ahash_import,
45008c2ecf20Sopenharmony_ci			.setkey = ahash_setkey,
45018c2ecf20Sopenharmony_ci			.halg = {
45028c2ecf20Sopenharmony_ci				.digestsize = SHA512_DIGEST_SIZE,
45038c2ecf20Sopenharmony_ci				.statesize = sizeof(struct caam_export_state),
45048c2ecf20Sopenharmony_ci			},
45058c2ecf20Sopenharmony_ci		},
45068c2ecf20Sopenharmony_ci		.alg_type = OP_ALG_ALGSEL_SHA512,
45078c2ecf20Sopenharmony_ci	}, {
45088c2ecf20Sopenharmony_ci		.name = "md5",
45098c2ecf20Sopenharmony_ci		.driver_name = "md5-caam-qi2",
45108c2ecf20Sopenharmony_ci		.hmac_name = "hmac(md5)",
45118c2ecf20Sopenharmony_ci		.hmac_driver_name = "hmac-md5-caam-qi2",
45128c2ecf20Sopenharmony_ci		.blocksize = MD5_BLOCK_WORDS * 4,
45138c2ecf20Sopenharmony_ci		.template_ahash = {
45148c2ecf20Sopenharmony_ci			.init = ahash_init,
45158c2ecf20Sopenharmony_ci			.update = ahash_update,
45168c2ecf20Sopenharmony_ci			.final = ahash_final,
45178c2ecf20Sopenharmony_ci			.finup = ahash_finup,
45188c2ecf20Sopenharmony_ci			.digest = ahash_digest,
45198c2ecf20Sopenharmony_ci			.export = ahash_export,
45208c2ecf20Sopenharmony_ci			.import = ahash_import,
45218c2ecf20Sopenharmony_ci			.setkey = ahash_setkey,
45228c2ecf20Sopenharmony_ci			.halg = {
45238c2ecf20Sopenharmony_ci				.digestsize = MD5_DIGEST_SIZE,
45248c2ecf20Sopenharmony_ci				.statesize = sizeof(struct caam_export_state),
45258c2ecf20Sopenharmony_ci			},
45268c2ecf20Sopenharmony_ci		},
45278c2ecf20Sopenharmony_ci		.alg_type = OP_ALG_ALGSEL_MD5,
45288c2ecf20Sopenharmony_ci	}
45298c2ecf20Sopenharmony_ci};
45308c2ecf20Sopenharmony_ci
45318c2ecf20Sopenharmony_cistruct caam_hash_alg {
45328c2ecf20Sopenharmony_ci	struct list_head entry;
45338c2ecf20Sopenharmony_ci	struct device *dev;
45348c2ecf20Sopenharmony_ci	int alg_type;
45358c2ecf20Sopenharmony_ci	struct ahash_alg ahash_alg;
45368c2ecf20Sopenharmony_ci};
45378c2ecf20Sopenharmony_ci
45388c2ecf20Sopenharmony_cistatic int caam_hash_cra_init(struct crypto_tfm *tfm)
45398c2ecf20Sopenharmony_ci{
45408c2ecf20Sopenharmony_ci	struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);
45418c2ecf20Sopenharmony_ci	struct crypto_alg *base = tfm->__crt_alg;
45428c2ecf20Sopenharmony_ci	struct hash_alg_common *halg =
45438c2ecf20Sopenharmony_ci		 container_of(base, struct hash_alg_common, base);
45448c2ecf20Sopenharmony_ci	struct ahash_alg *alg =
45458c2ecf20Sopenharmony_ci		 container_of(halg, struct ahash_alg, halg);
45468c2ecf20Sopenharmony_ci	struct caam_hash_alg *caam_hash =
45478c2ecf20Sopenharmony_ci		 container_of(alg, struct caam_hash_alg, ahash_alg);
45488c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_tfm_ctx(tfm);
45498c2ecf20Sopenharmony_ci	/* Sizes for MDHA running digests: MD5, SHA1, 224, 256, 384, 512 */
45508c2ecf20Sopenharmony_ci	static const u8 runninglen[] = { HASH_MSG_LEN + MD5_DIGEST_SIZE,
45518c2ecf20Sopenharmony_ci					 HASH_MSG_LEN + SHA1_DIGEST_SIZE,
45528c2ecf20Sopenharmony_ci					 HASH_MSG_LEN + 32,
45538c2ecf20Sopenharmony_ci					 HASH_MSG_LEN + SHA256_DIGEST_SIZE,
45548c2ecf20Sopenharmony_ci					 HASH_MSG_LEN + 64,
45558c2ecf20Sopenharmony_ci					 HASH_MSG_LEN + SHA512_DIGEST_SIZE };
45568c2ecf20Sopenharmony_ci	dma_addr_t dma_addr;
45578c2ecf20Sopenharmony_ci	int i;
45588c2ecf20Sopenharmony_ci
45598c2ecf20Sopenharmony_ci	ctx->dev = caam_hash->dev;
45608c2ecf20Sopenharmony_ci
45618c2ecf20Sopenharmony_ci	if (alg->setkey) {
45628c2ecf20Sopenharmony_ci		ctx->adata.key_dma = dma_map_single_attrs(ctx->dev, ctx->key,
45638c2ecf20Sopenharmony_ci							  ARRAY_SIZE(ctx->key),
45648c2ecf20Sopenharmony_ci							  DMA_TO_DEVICE,
45658c2ecf20Sopenharmony_ci							  DMA_ATTR_SKIP_CPU_SYNC);
45668c2ecf20Sopenharmony_ci		if (dma_mapping_error(ctx->dev, ctx->adata.key_dma)) {
45678c2ecf20Sopenharmony_ci			dev_err(ctx->dev, "unable to map key\n");
45688c2ecf20Sopenharmony_ci			return -ENOMEM;
45698c2ecf20Sopenharmony_ci		}
45708c2ecf20Sopenharmony_ci	}
45718c2ecf20Sopenharmony_ci
45728c2ecf20Sopenharmony_ci	dma_addr = dma_map_single_attrs(ctx->dev, ctx->flc, sizeof(ctx->flc),
45738c2ecf20Sopenharmony_ci					DMA_BIDIRECTIONAL,
45748c2ecf20Sopenharmony_ci					DMA_ATTR_SKIP_CPU_SYNC);
45758c2ecf20Sopenharmony_ci	if (dma_mapping_error(ctx->dev, dma_addr)) {
45768c2ecf20Sopenharmony_ci		dev_err(ctx->dev, "unable to map shared descriptors\n");
45778c2ecf20Sopenharmony_ci		if (ctx->adata.key_dma)
45788c2ecf20Sopenharmony_ci			dma_unmap_single_attrs(ctx->dev, ctx->adata.key_dma,
45798c2ecf20Sopenharmony_ci					       ARRAY_SIZE(ctx->key),
45808c2ecf20Sopenharmony_ci					       DMA_TO_DEVICE,
45818c2ecf20Sopenharmony_ci					       DMA_ATTR_SKIP_CPU_SYNC);
45828c2ecf20Sopenharmony_ci		return -ENOMEM;
45838c2ecf20Sopenharmony_ci	}
45848c2ecf20Sopenharmony_ci
45858c2ecf20Sopenharmony_ci	for (i = 0; i < HASH_NUM_OP; i++)
45868c2ecf20Sopenharmony_ci		ctx->flc_dma[i] = dma_addr + i * sizeof(ctx->flc[i]);
45878c2ecf20Sopenharmony_ci
45888c2ecf20Sopenharmony_ci	/* copy descriptor header template value */
45898c2ecf20Sopenharmony_ci	ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam_hash->alg_type;
45908c2ecf20Sopenharmony_ci
45918c2ecf20Sopenharmony_ci	ctx->ctx_len = runninglen[(ctx->adata.algtype &
45928c2ecf20Sopenharmony_ci				   OP_ALG_ALGSEL_SUBMASK) >>
45938c2ecf20Sopenharmony_ci				  OP_ALG_ALGSEL_SHIFT];
45948c2ecf20Sopenharmony_ci
45958c2ecf20Sopenharmony_ci	crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
45968c2ecf20Sopenharmony_ci				 sizeof(struct caam_hash_state));
45978c2ecf20Sopenharmony_ci
45988c2ecf20Sopenharmony_ci	/*
45998c2ecf20Sopenharmony_ci	 * For keyed hash algorithms shared descriptors
46008c2ecf20Sopenharmony_ci	 * will be created later in setkey() callback
46018c2ecf20Sopenharmony_ci	 */
46028c2ecf20Sopenharmony_ci	return alg->setkey ? 0 : ahash_set_sh_desc(ahash);
46038c2ecf20Sopenharmony_ci}
46048c2ecf20Sopenharmony_ci
46058c2ecf20Sopenharmony_cistatic void caam_hash_cra_exit(struct crypto_tfm *tfm)
46068c2ecf20Sopenharmony_ci{
46078c2ecf20Sopenharmony_ci	struct caam_hash_ctx *ctx = crypto_tfm_ctx(tfm);
46088c2ecf20Sopenharmony_ci
46098c2ecf20Sopenharmony_ci	dma_unmap_single_attrs(ctx->dev, ctx->flc_dma[0], sizeof(ctx->flc),
46108c2ecf20Sopenharmony_ci			       DMA_BIDIRECTIONAL, DMA_ATTR_SKIP_CPU_SYNC);
46118c2ecf20Sopenharmony_ci	if (ctx->adata.key_dma)
46128c2ecf20Sopenharmony_ci		dma_unmap_single_attrs(ctx->dev, ctx->adata.key_dma,
46138c2ecf20Sopenharmony_ci				       ARRAY_SIZE(ctx->key), DMA_TO_DEVICE,
46148c2ecf20Sopenharmony_ci				       DMA_ATTR_SKIP_CPU_SYNC);
46158c2ecf20Sopenharmony_ci}
46168c2ecf20Sopenharmony_ci
46178c2ecf20Sopenharmony_cistatic struct caam_hash_alg *caam_hash_alloc(struct device *dev,
46188c2ecf20Sopenharmony_ci	struct caam_hash_template *template, bool keyed)
46198c2ecf20Sopenharmony_ci{
46208c2ecf20Sopenharmony_ci	struct caam_hash_alg *t_alg;
46218c2ecf20Sopenharmony_ci	struct ahash_alg *halg;
46228c2ecf20Sopenharmony_ci	struct crypto_alg *alg;
46238c2ecf20Sopenharmony_ci
46248c2ecf20Sopenharmony_ci	t_alg = kzalloc(sizeof(*t_alg), GFP_KERNEL);
46258c2ecf20Sopenharmony_ci	if (!t_alg)
46268c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
46278c2ecf20Sopenharmony_ci
46288c2ecf20Sopenharmony_ci	t_alg->ahash_alg = template->template_ahash;
46298c2ecf20Sopenharmony_ci	halg = &t_alg->ahash_alg;
46308c2ecf20Sopenharmony_ci	alg = &halg->halg.base;
46318c2ecf20Sopenharmony_ci
46328c2ecf20Sopenharmony_ci	if (keyed) {
46338c2ecf20Sopenharmony_ci		snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
46348c2ecf20Sopenharmony_ci			 template->hmac_name);
46358c2ecf20Sopenharmony_ci		snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
46368c2ecf20Sopenharmony_ci			 template->hmac_driver_name);
46378c2ecf20Sopenharmony_ci	} else {
46388c2ecf20Sopenharmony_ci		snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
46398c2ecf20Sopenharmony_ci			 template->name);
46408c2ecf20Sopenharmony_ci		snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
46418c2ecf20Sopenharmony_ci			 template->driver_name);
46428c2ecf20Sopenharmony_ci		t_alg->ahash_alg.setkey = NULL;
46438c2ecf20Sopenharmony_ci	}
46448c2ecf20Sopenharmony_ci	alg->cra_module = THIS_MODULE;
46458c2ecf20Sopenharmony_ci	alg->cra_init = caam_hash_cra_init;
46468c2ecf20Sopenharmony_ci	alg->cra_exit = caam_hash_cra_exit;
46478c2ecf20Sopenharmony_ci	alg->cra_ctxsize = sizeof(struct caam_hash_ctx);
46488c2ecf20Sopenharmony_ci	alg->cra_priority = CAAM_CRA_PRIORITY;
46498c2ecf20Sopenharmony_ci	alg->cra_blocksize = template->blocksize;
46508c2ecf20Sopenharmony_ci	alg->cra_alignmask = 0;
46518c2ecf20Sopenharmony_ci	alg->cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY;
46528c2ecf20Sopenharmony_ci
46538c2ecf20Sopenharmony_ci	t_alg->alg_type = template->alg_type;
46548c2ecf20Sopenharmony_ci	t_alg->dev = dev;
46558c2ecf20Sopenharmony_ci
46568c2ecf20Sopenharmony_ci	return t_alg;
46578c2ecf20Sopenharmony_ci}
46588c2ecf20Sopenharmony_ci
46598c2ecf20Sopenharmony_cistatic void dpaa2_caam_fqdan_cb(struct dpaa2_io_notification_ctx *nctx)
46608c2ecf20Sopenharmony_ci{
46618c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv_per_cpu *ppriv;
46628c2ecf20Sopenharmony_ci
46638c2ecf20Sopenharmony_ci	ppriv = container_of(nctx, struct dpaa2_caam_priv_per_cpu, nctx);
46648c2ecf20Sopenharmony_ci	napi_schedule_irqoff(&ppriv->napi);
46658c2ecf20Sopenharmony_ci}
46668c2ecf20Sopenharmony_ci
46678c2ecf20Sopenharmony_cistatic int __cold dpaa2_dpseci_dpio_setup(struct dpaa2_caam_priv *priv)
46688c2ecf20Sopenharmony_ci{
46698c2ecf20Sopenharmony_ci	struct device *dev = priv->dev;
46708c2ecf20Sopenharmony_ci	struct dpaa2_io_notification_ctx *nctx;
46718c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv_per_cpu *ppriv;
46728c2ecf20Sopenharmony_ci	int err, i = 0, cpu;
46738c2ecf20Sopenharmony_ci
46748c2ecf20Sopenharmony_ci	for_each_online_cpu(cpu) {
46758c2ecf20Sopenharmony_ci		ppriv = per_cpu_ptr(priv->ppriv, cpu);
46768c2ecf20Sopenharmony_ci		ppriv->priv = priv;
46778c2ecf20Sopenharmony_ci		nctx = &ppriv->nctx;
46788c2ecf20Sopenharmony_ci		nctx->is_cdan = 0;
46798c2ecf20Sopenharmony_ci		nctx->id = ppriv->rsp_fqid;
46808c2ecf20Sopenharmony_ci		nctx->desired_cpu = cpu;
46818c2ecf20Sopenharmony_ci		nctx->cb = dpaa2_caam_fqdan_cb;
46828c2ecf20Sopenharmony_ci
46838c2ecf20Sopenharmony_ci		/* Register notification callbacks */
46848c2ecf20Sopenharmony_ci		ppriv->dpio = dpaa2_io_service_select(cpu);
46858c2ecf20Sopenharmony_ci		err = dpaa2_io_service_register(ppriv->dpio, nctx, dev);
46868c2ecf20Sopenharmony_ci		if (unlikely(err)) {
46878c2ecf20Sopenharmony_ci			dev_dbg(dev, "No affine DPIO for cpu %d\n", cpu);
46888c2ecf20Sopenharmony_ci			nctx->cb = NULL;
46898c2ecf20Sopenharmony_ci			/*
46908c2ecf20Sopenharmony_ci			 * If no affine DPIO for this core, there's probably
46918c2ecf20Sopenharmony_ci			 * none available for next cores either. Signal we want
46928c2ecf20Sopenharmony_ci			 * to retry later, in case the DPIO devices weren't
46938c2ecf20Sopenharmony_ci			 * probed yet.
46948c2ecf20Sopenharmony_ci			 */
46958c2ecf20Sopenharmony_ci			err = -EPROBE_DEFER;
46968c2ecf20Sopenharmony_ci			goto err;
46978c2ecf20Sopenharmony_ci		}
46988c2ecf20Sopenharmony_ci
46998c2ecf20Sopenharmony_ci		ppriv->store = dpaa2_io_store_create(DPAA2_CAAM_STORE_SIZE,
47008c2ecf20Sopenharmony_ci						     dev);
47018c2ecf20Sopenharmony_ci		if (unlikely(!ppriv->store)) {
47028c2ecf20Sopenharmony_ci			dev_err(dev, "dpaa2_io_store_create() failed\n");
47038c2ecf20Sopenharmony_ci			err = -ENOMEM;
47048c2ecf20Sopenharmony_ci			goto err;
47058c2ecf20Sopenharmony_ci		}
47068c2ecf20Sopenharmony_ci
47078c2ecf20Sopenharmony_ci		if (++i == priv->num_pairs)
47088c2ecf20Sopenharmony_ci			break;
47098c2ecf20Sopenharmony_ci	}
47108c2ecf20Sopenharmony_ci
47118c2ecf20Sopenharmony_ci	return 0;
47128c2ecf20Sopenharmony_ci
47138c2ecf20Sopenharmony_cierr:
47148c2ecf20Sopenharmony_ci	for_each_online_cpu(cpu) {
47158c2ecf20Sopenharmony_ci		ppriv = per_cpu_ptr(priv->ppriv, cpu);
47168c2ecf20Sopenharmony_ci		if (!ppriv->nctx.cb)
47178c2ecf20Sopenharmony_ci			break;
47188c2ecf20Sopenharmony_ci		dpaa2_io_service_deregister(ppriv->dpio, &ppriv->nctx, dev);
47198c2ecf20Sopenharmony_ci	}
47208c2ecf20Sopenharmony_ci
47218c2ecf20Sopenharmony_ci	for_each_online_cpu(cpu) {
47228c2ecf20Sopenharmony_ci		ppriv = per_cpu_ptr(priv->ppriv, cpu);
47238c2ecf20Sopenharmony_ci		if (!ppriv->store)
47248c2ecf20Sopenharmony_ci			break;
47258c2ecf20Sopenharmony_ci		dpaa2_io_store_destroy(ppriv->store);
47268c2ecf20Sopenharmony_ci	}
47278c2ecf20Sopenharmony_ci
47288c2ecf20Sopenharmony_ci	return err;
47298c2ecf20Sopenharmony_ci}
47308c2ecf20Sopenharmony_ci
47318c2ecf20Sopenharmony_cistatic void __cold dpaa2_dpseci_dpio_free(struct dpaa2_caam_priv *priv)
47328c2ecf20Sopenharmony_ci{
47338c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv_per_cpu *ppriv;
47348c2ecf20Sopenharmony_ci	int i = 0, cpu;
47358c2ecf20Sopenharmony_ci
47368c2ecf20Sopenharmony_ci	for_each_online_cpu(cpu) {
47378c2ecf20Sopenharmony_ci		ppriv = per_cpu_ptr(priv->ppriv, cpu);
47388c2ecf20Sopenharmony_ci		dpaa2_io_service_deregister(ppriv->dpio, &ppriv->nctx,
47398c2ecf20Sopenharmony_ci					    priv->dev);
47408c2ecf20Sopenharmony_ci		dpaa2_io_store_destroy(ppriv->store);
47418c2ecf20Sopenharmony_ci
47428c2ecf20Sopenharmony_ci		if (++i == priv->num_pairs)
47438c2ecf20Sopenharmony_ci			return;
47448c2ecf20Sopenharmony_ci	}
47458c2ecf20Sopenharmony_ci}
47468c2ecf20Sopenharmony_ci
47478c2ecf20Sopenharmony_cistatic int dpaa2_dpseci_bind(struct dpaa2_caam_priv *priv)
47488c2ecf20Sopenharmony_ci{
47498c2ecf20Sopenharmony_ci	struct dpseci_rx_queue_cfg rx_queue_cfg;
47508c2ecf20Sopenharmony_ci	struct device *dev = priv->dev;
47518c2ecf20Sopenharmony_ci	struct fsl_mc_device *ls_dev = to_fsl_mc_device(dev);
47528c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv_per_cpu *ppriv;
47538c2ecf20Sopenharmony_ci	int err = 0, i = 0, cpu;
47548c2ecf20Sopenharmony_ci
47558c2ecf20Sopenharmony_ci	/* Configure Rx queues */
47568c2ecf20Sopenharmony_ci	for_each_online_cpu(cpu) {
47578c2ecf20Sopenharmony_ci		ppriv = per_cpu_ptr(priv->ppriv, cpu);
47588c2ecf20Sopenharmony_ci
47598c2ecf20Sopenharmony_ci		rx_queue_cfg.options = DPSECI_QUEUE_OPT_DEST |
47608c2ecf20Sopenharmony_ci				       DPSECI_QUEUE_OPT_USER_CTX;
47618c2ecf20Sopenharmony_ci		rx_queue_cfg.order_preservation_en = 0;
47628c2ecf20Sopenharmony_ci		rx_queue_cfg.dest_cfg.dest_type = DPSECI_DEST_DPIO;
47638c2ecf20Sopenharmony_ci		rx_queue_cfg.dest_cfg.dest_id = ppriv->nctx.dpio_id;
47648c2ecf20Sopenharmony_ci		/*
47658c2ecf20Sopenharmony_ci		 * Rx priority (WQ) doesn't really matter, since we use
47668c2ecf20Sopenharmony_ci		 * pull mode, i.e. volatile dequeues from specific FQs
47678c2ecf20Sopenharmony_ci		 */
47688c2ecf20Sopenharmony_ci		rx_queue_cfg.dest_cfg.priority = 0;
47698c2ecf20Sopenharmony_ci		rx_queue_cfg.user_ctx = ppriv->nctx.qman64;
47708c2ecf20Sopenharmony_ci
47718c2ecf20Sopenharmony_ci		err = dpseci_set_rx_queue(priv->mc_io, 0, ls_dev->mc_handle, i,
47728c2ecf20Sopenharmony_ci					  &rx_queue_cfg);
47738c2ecf20Sopenharmony_ci		if (err) {
47748c2ecf20Sopenharmony_ci			dev_err(dev, "dpseci_set_rx_queue() failed with err %d\n",
47758c2ecf20Sopenharmony_ci				err);
47768c2ecf20Sopenharmony_ci			return err;
47778c2ecf20Sopenharmony_ci		}
47788c2ecf20Sopenharmony_ci
47798c2ecf20Sopenharmony_ci		if (++i == priv->num_pairs)
47808c2ecf20Sopenharmony_ci			break;
47818c2ecf20Sopenharmony_ci	}
47828c2ecf20Sopenharmony_ci
47838c2ecf20Sopenharmony_ci	return err;
47848c2ecf20Sopenharmony_ci}
47858c2ecf20Sopenharmony_ci
47868c2ecf20Sopenharmony_cistatic void dpaa2_dpseci_congestion_free(struct dpaa2_caam_priv *priv)
47878c2ecf20Sopenharmony_ci{
47888c2ecf20Sopenharmony_ci	struct device *dev = priv->dev;
47898c2ecf20Sopenharmony_ci
47908c2ecf20Sopenharmony_ci	if (!priv->cscn_mem)
47918c2ecf20Sopenharmony_ci		return;
47928c2ecf20Sopenharmony_ci
47938c2ecf20Sopenharmony_ci	dma_unmap_single(dev, priv->cscn_dma, DPAA2_CSCN_SIZE, DMA_FROM_DEVICE);
47948c2ecf20Sopenharmony_ci	kfree(priv->cscn_mem);
47958c2ecf20Sopenharmony_ci}
47968c2ecf20Sopenharmony_ci
47978c2ecf20Sopenharmony_cistatic void dpaa2_dpseci_free(struct dpaa2_caam_priv *priv)
47988c2ecf20Sopenharmony_ci{
47998c2ecf20Sopenharmony_ci	struct device *dev = priv->dev;
48008c2ecf20Sopenharmony_ci	struct fsl_mc_device *ls_dev = to_fsl_mc_device(dev);
48018c2ecf20Sopenharmony_ci	int err;
48028c2ecf20Sopenharmony_ci
48038c2ecf20Sopenharmony_ci	if (DPSECI_VER(priv->major_ver, priv->minor_ver) > DPSECI_VER(5, 3)) {
48048c2ecf20Sopenharmony_ci		err = dpseci_reset(priv->mc_io, 0, ls_dev->mc_handle);
48058c2ecf20Sopenharmony_ci		if (err)
48068c2ecf20Sopenharmony_ci			dev_err(dev, "dpseci_reset() failed\n");
48078c2ecf20Sopenharmony_ci	}
48088c2ecf20Sopenharmony_ci
48098c2ecf20Sopenharmony_ci	dpaa2_dpseci_congestion_free(priv);
48108c2ecf20Sopenharmony_ci	dpseci_close(priv->mc_io, 0, ls_dev->mc_handle);
48118c2ecf20Sopenharmony_ci}
48128c2ecf20Sopenharmony_ci
48138c2ecf20Sopenharmony_cistatic void dpaa2_caam_process_fd(struct dpaa2_caam_priv *priv,
48148c2ecf20Sopenharmony_ci				  const struct dpaa2_fd *fd)
48158c2ecf20Sopenharmony_ci{
48168c2ecf20Sopenharmony_ci	struct caam_request *req;
48178c2ecf20Sopenharmony_ci	u32 fd_err;
48188c2ecf20Sopenharmony_ci
48198c2ecf20Sopenharmony_ci	if (dpaa2_fd_get_format(fd) != dpaa2_fd_list) {
48208c2ecf20Sopenharmony_ci		dev_err(priv->dev, "Only Frame List FD format is supported!\n");
48218c2ecf20Sopenharmony_ci		return;
48228c2ecf20Sopenharmony_ci	}
48238c2ecf20Sopenharmony_ci
48248c2ecf20Sopenharmony_ci	fd_err = dpaa2_fd_get_ctrl(fd) & FD_CTRL_ERR_MASK;
48258c2ecf20Sopenharmony_ci	if (unlikely(fd_err))
48268c2ecf20Sopenharmony_ci		dev_err_ratelimited(priv->dev, "FD error: %08x\n", fd_err);
48278c2ecf20Sopenharmony_ci
48288c2ecf20Sopenharmony_ci	/*
48298c2ecf20Sopenharmony_ci	 * FD[ADDR] is guaranteed to be valid, irrespective of errors reported
48308c2ecf20Sopenharmony_ci	 * in FD[ERR] or FD[FRC].
48318c2ecf20Sopenharmony_ci	 */
48328c2ecf20Sopenharmony_ci	req = dpaa2_caam_iova_to_virt(priv, dpaa2_fd_get_addr(fd));
48338c2ecf20Sopenharmony_ci	dma_unmap_single(priv->dev, req->fd_flt_dma, sizeof(req->fd_flt),
48348c2ecf20Sopenharmony_ci			 DMA_BIDIRECTIONAL);
48358c2ecf20Sopenharmony_ci	req->cbk(req->ctx, dpaa2_fd_get_frc(fd));
48368c2ecf20Sopenharmony_ci}
48378c2ecf20Sopenharmony_ci
48388c2ecf20Sopenharmony_cistatic int dpaa2_caam_pull_fq(struct dpaa2_caam_priv_per_cpu *ppriv)
48398c2ecf20Sopenharmony_ci{
48408c2ecf20Sopenharmony_ci	int err;
48418c2ecf20Sopenharmony_ci
48428c2ecf20Sopenharmony_ci	/* Retry while portal is busy */
48438c2ecf20Sopenharmony_ci	do {
48448c2ecf20Sopenharmony_ci		err = dpaa2_io_service_pull_fq(ppriv->dpio, ppriv->rsp_fqid,
48458c2ecf20Sopenharmony_ci					       ppriv->store);
48468c2ecf20Sopenharmony_ci	} while (err == -EBUSY);
48478c2ecf20Sopenharmony_ci
48488c2ecf20Sopenharmony_ci	if (unlikely(err))
48498c2ecf20Sopenharmony_ci		dev_err(ppriv->priv->dev, "dpaa2_io_service_pull err %d", err);
48508c2ecf20Sopenharmony_ci
48518c2ecf20Sopenharmony_ci	return err;
48528c2ecf20Sopenharmony_ci}
48538c2ecf20Sopenharmony_ci
48548c2ecf20Sopenharmony_cistatic int dpaa2_caam_store_consume(struct dpaa2_caam_priv_per_cpu *ppriv)
48558c2ecf20Sopenharmony_ci{
48568c2ecf20Sopenharmony_ci	struct dpaa2_dq *dq;
48578c2ecf20Sopenharmony_ci	int cleaned = 0, is_last;
48588c2ecf20Sopenharmony_ci
48598c2ecf20Sopenharmony_ci	do {
48608c2ecf20Sopenharmony_ci		dq = dpaa2_io_store_next(ppriv->store, &is_last);
48618c2ecf20Sopenharmony_ci		if (unlikely(!dq)) {
48628c2ecf20Sopenharmony_ci			if (unlikely(!is_last)) {
48638c2ecf20Sopenharmony_ci				dev_dbg(ppriv->priv->dev,
48648c2ecf20Sopenharmony_ci					"FQ %d returned no valid frames\n",
48658c2ecf20Sopenharmony_ci					ppriv->rsp_fqid);
48668c2ecf20Sopenharmony_ci				/*
48678c2ecf20Sopenharmony_ci				 * MUST retry until we get some sort of
48688c2ecf20Sopenharmony_ci				 * valid response token (be it "empty dequeue"
48698c2ecf20Sopenharmony_ci				 * or a valid frame).
48708c2ecf20Sopenharmony_ci				 */
48718c2ecf20Sopenharmony_ci				continue;
48728c2ecf20Sopenharmony_ci			}
48738c2ecf20Sopenharmony_ci			break;
48748c2ecf20Sopenharmony_ci		}
48758c2ecf20Sopenharmony_ci
48768c2ecf20Sopenharmony_ci		/* Process FD */
48778c2ecf20Sopenharmony_ci		dpaa2_caam_process_fd(ppriv->priv, dpaa2_dq_fd(dq));
48788c2ecf20Sopenharmony_ci		cleaned++;
48798c2ecf20Sopenharmony_ci	} while (!is_last);
48808c2ecf20Sopenharmony_ci
48818c2ecf20Sopenharmony_ci	return cleaned;
48828c2ecf20Sopenharmony_ci}
48838c2ecf20Sopenharmony_ci
48848c2ecf20Sopenharmony_cistatic int dpaa2_dpseci_poll(struct napi_struct *napi, int budget)
48858c2ecf20Sopenharmony_ci{
48868c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv_per_cpu *ppriv;
48878c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv *priv;
48888c2ecf20Sopenharmony_ci	int err, cleaned = 0, store_cleaned;
48898c2ecf20Sopenharmony_ci
48908c2ecf20Sopenharmony_ci	ppriv = container_of(napi, struct dpaa2_caam_priv_per_cpu, napi);
48918c2ecf20Sopenharmony_ci	priv = ppriv->priv;
48928c2ecf20Sopenharmony_ci
48938c2ecf20Sopenharmony_ci	if (unlikely(dpaa2_caam_pull_fq(ppriv)))
48948c2ecf20Sopenharmony_ci		return 0;
48958c2ecf20Sopenharmony_ci
48968c2ecf20Sopenharmony_ci	do {
48978c2ecf20Sopenharmony_ci		store_cleaned = dpaa2_caam_store_consume(ppriv);
48988c2ecf20Sopenharmony_ci		cleaned += store_cleaned;
48998c2ecf20Sopenharmony_ci
49008c2ecf20Sopenharmony_ci		if (store_cleaned == 0 ||
49018c2ecf20Sopenharmony_ci		    cleaned > budget - DPAA2_CAAM_STORE_SIZE)
49028c2ecf20Sopenharmony_ci			break;
49038c2ecf20Sopenharmony_ci
49048c2ecf20Sopenharmony_ci		/* Try to dequeue some more */
49058c2ecf20Sopenharmony_ci		err = dpaa2_caam_pull_fq(ppriv);
49068c2ecf20Sopenharmony_ci		if (unlikely(err))
49078c2ecf20Sopenharmony_ci			break;
49088c2ecf20Sopenharmony_ci	} while (1);
49098c2ecf20Sopenharmony_ci
49108c2ecf20Sopenharmony_ci	if (cleaned < budget) {
49118c2ecf20Sopenharmony_ci		napi_complete_done(napi, cleaned);
49128c2ecf20Sopenharmony_ci		err = dpaa2_io_service_rearm(ppriv->dpio, &ppriv->nctx);
49138c2ecf20Sopenharmony_ci		if (unlikely(err))
49148c2ecf20Sopenharmony_ci			dev_err(priv->dev, "Notification rearm failed: %d\n",
49158c2ecf20Sopenharmony_ci				err);
49168c2ecf20Sopenharmony_ci	}
49178c2ecf20Sopenharmony_ci
49188c2ecf20Sopenharmony_ci	return cleaned;
49198c2ecf20Sopenharmony_ci}
49208c2ecf20Sopenharmony_ci
49218c2ecf20Sopenharmony_cistatic int dpaa2_dpseci_congestion_setup(struct dpaa2_caam_priv *priv,
49228c2ecf20Sopenharmony_ci					 u16 token)
49238c2ecf20Sopenharmony_ci{
49248c2ecf20Sopenharmony_ci	struct dpseci_congestion_notification_cfg cong_notif_cfg = { 0 };
49258c2ecf20Sopenharmony_ci	struct device *dev = priv->dev;
49268c2ecf20Sopenharmony_ci	int err;
49278c2ecf20Sopenharmony_ci
49288c2ecf20Sopenharmony_ci	/*
49298c2ecf20Sopenharmony_ci	 * Congestion group feature supported starting with DPSECI API v5.1
49308c2ecf20Sopenharmony_ci	 * and only when object has been created with this capability.
49318c2ecf20Sopenharmony_ci	 */
49328c2ecf20Sopenharmony_ci	if ((DPSECI_VER(priv->major_ver, priv->minor_ver) < DPSECI_VER(5, 1)) ||
49338c2ecf20Sopenharmony_ci	    !(priv->dpseci_attr.options & DPSECI_OPT_HAS_CG))
49348c2ecf20Sopenharmony_ci		return 0;
49358c2ecf20Sopenharmony_ci
49368c2ecf20Sopenharmony_ci	priv->cscn_mem = kzalloc(DPAA2_CSCN_SIZE + DPAA2_CSCN_ALIGN,
49378c2ecf20Sopenharmony_ci				 GFP_KERNEL | GFP_DMA);
49388c2ecf20Sopenharmony_ci	if (!priv->cscn_mem)
49398c2ecf20Sopenharmony_ci		return -ENOMEM;
49408c2ecf20Sopenharmony_ci
49418c2ecf20Sopenharmony_ci	priv->cscn_mem_aligned = PTR_ALIGN(priv->cscn_mem, DPAA2_CSCN_ALIGN);
49428c2ecf20Sopenharmony_ci	priv->cscn_dma = dma_map_single(dev, priv->cscn_mem_aligned,
49438c2ecf20Sopenharmony_ci					DPAA2_CSCN_SIZE, DMA_FROM_DEVICE);
49448c2ecf20Sopenharmony_ci	if (dma_mapping_error(dev, priv->cscn_dma)) {
49458c2ecf20Sopenharmony_ci		dev_err(dev, "Error mapping CSCN memory area\n");
49468c2ecf20Sopenharmony_ci		err = -ENOMEM;
49478c2ecf20Sopenharmony_ci		goto err_dma_map;
49488c2ecf20Sopenharmony_ci	}
49498c2ecf20Sopenharmony_ci
49508c2ecf20Sopenharmony_ci	cong_notif_cfg.units = DPSECI_CONGESTION_UNIT_BYTES;
49518c2ecf20Sopenharmony_ci	cong_notif_cfg.threshold_entry = DPAA2_SEC_CONG_ENTRY_THRESH;
49528c2ecf20Sopenharmony_ci	cong_notif_cfg.threshold_exit = DPAA2_SEC_CONG_EXIT_THRESH;
49538c2ecf20Sopenharmony_ci	cong_notif_cfg.message_ctx = (uintptr_t)priv;
49548c2ecf20Sopenharmony_ci	cong_notif_cfg.message_iova = priv->cscn_dma;
49558c2ecf20Sopenharmony_ci	cong_notif_cfg.notification_mode = DPSECI_CGN_MODE_WRITE_MEM_ON_ENTER |
49568c2ecf20Sopenharmony_ci					DPSECI_CGN_MODE_WRITE_MEM_ON_EXIT |
49578c2ecf20Sopenharmony_ci					DPSECI_CGN_MODE_COHERENT_WRITE;
49588c2ecf20Sopenharmony_ci
49598c2ecf20Sopenharmony_ci	err = dpseci_set_congestion_notification(priv->mc_io, 0, token,
49608c2ecf20Sopenharmony_ci						 &cong_notif_cfg);
49618c2ecf20Sopenharmony_ci	if (err) {
49628c2ecf20Sopenharmony_ci		dev_err(dev, "dpseci_set_congestion_notification failed\n");
49638c2ecf20Sopenharmony_ci		goto err_set_cong;
49648c2ecf20Sopenharmony_ci	}
49658c2ecf20Sopenharmony_ci
49668c2ecf20Sopenharmony_ci	return 0;
49678c2ecf20Sopenharmony_ci
49688c2ecf20Sopenharmony_cierr_set_cong:
49698c2ecf20Sopenharmony_ci	dma_unmap_single(dev, priv->cscn_dma, DPAA2_CSCN_SIZE, DMA_FROM_DEVICE);
49708c2ecf20Sopenharmony_cierr_dma_map:
49718c2ecf20Sopenharmony_ci	kfree(priv->cscn_mem);
49728c2ecf20Sopenharmony_ci
49738c2ecf20Sopenharmony_ci	return err;
49748c2ecf20Sopenharmony_ci}
49758c2ecf20Sopenharmony_ci
49768c2ecf20Sopenharmony_cistatic int __cold dpaa2_dpseci_setup(struct fsl_mc_device *ls_dev)
49778c2ecf20Sopenharmony_ci{
49788c2ecf20Sopenharmony_ci	struct device *dev = &ls_dev->dev;
49798c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv *priv;
49808c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv_per_cpu *ppriv;
49818c2ecf20Sopenharmony_ci	int err, cpu;
49828c2ecf20Sopenharmony_ci	u8 i;
49838c2ecf20Sopenharmony_ci
49848c2ecf20Sopenharmony_ci	priv = dev_get_drvdata(dev);
49858c2ecf20Sopenharmony_ci
49868c2ecf20Sopenharmony_ci	priv->dev = dev;
49878c2ecf20Sopenharmony_ci	priv->dpsec_id = ls_dev->obj_desc.id;
49888c2ecf20Sopenharmony_ci
49898c2ecf20Sopenharmony_ci	/* Get a handle for the DPSECI this interface is associate with */
49908c2ecf20Sopenharmony_ci	err = dpseci_open(priv->mc_io, 0, priv->dpsec_id, &ls_dev->mc_handle);
49918c2ecf20Sopenharmony_ci	if (err) {
49928c2ecf20Sopenharmony_ci		dev_err(dev, "dpseci_open() failed: %d\n", err);
49938c2ecf20Sopenharmony_ci		goto err_open;
49948c2ecf20Sopenharmony_ci	}
49958c2ecf20Sopenharmony_ci
49968c2ecf20Sopenharmony_ci	err = dpseci_get_api_version(priv->mc_io, 0, &priv->major_ver,
49978c2ecf20Sopenharmony_ci				     &priv->minor_ver);
49988c2ecf20Sopenharmony_ci	if (err) {
49998c2ecf20Sopenharmony_ci		dev_err(dev, "dpseci_get_api_version() failed\n");
50008c2ecf20Sopenharmony_ci		goto err_get_vers;
50018c2ecf20Sopenharmony_ci	}
50028c2ecf20Sopenharmony_ci
50038c2ecf20Sopenharmony_ci	dev_info(dev, "dpseci v%d.%d\n", priv->major_ver, priv->minor_ver);
50048c2ecf20Sopenharmony_ci
50058c2ecf20Sopenharmony_ci	if (DPSECI_VER(priv->major_ver, priv->minor_ver) > DPSECI_VER(5, 3)) {
50068c2ecf20Sopenharmony_ci		err = dpseci_reset(priv->mc_io, 0, ls_dev->mc_handle);
50078c2ecf20Sopenharmony_ci		if (err) {
50088c2ecf20Sopenharmony_ci			dev_err(dev, "dpseci_reset() failed\n");
50098c2ecf20Sopenharmony_ci			goto err_get_vers;
50108c2ecf20Sopenharmony_ci		}
50118c2ecf20Sopenharmony_ci	}
50128c2ecf20Sopenharmony_ci
50138c2ecf20Sopenharmony_ci	err = dpseci_get_attributes(priv->mc_io, 0, ls_dev->mc_handle,
50148c2ecf20Sopenharmony_ci				    &priv->dpseci_attr);
50158c2ecf20Sopenharmony_ci	if (err) {
50168c2ecf20Sopenharmony_ci		dev_err(dev, "dpseci_get_attributes() failed\n");
50178c2ecf20Sopenharmony_ci		goto err_get_vers;
50188c2ecf20Sopenharmony_ci	}
50198c2ecf20Sopenharmony_ci
50208c2ecf20Sopenharmony_ci	err = dpseci_get_sec_attr(priv->mc_io, 0, ls_dev->mc_handle,
50218c2ecf20Sopenharmony_ci				  &priv->sec_attr);
50228c2ecf20Sopenharmony_ci	if (err) {
50238c2ecf20Sopenharmony_ci		dev_err(dev, "dpseci_get_sec_attr() failed\n");
50248c2ecf20Sopenharmony_ci		goto err_get_vers;
50258c2ecf20Sopenharmony_ci	}
50268c2ecf20Sopenharmony_ci
50278c2ecf20Sopenharmony_ci	err = dpaa2_dpseci_congestion_setup(priv, ls_dev->mc_handle);
50288c2ecf20Sopenharmony_ci	if (err) {
50298c2ecf20Sopenharmony_ci		dev_err(dev, "setup_congestion() failed\n");
50308c2ecf20Sopenharmony_ci		goto err_get_vers;
50318c2ecf20Sopenharmony_ci	}
50328c2ecf20Sopenharmony_ci
50338c2ecf20Sopenharmony_ci	priv->num_pairs = min(priv->dpseci_attr.num_rx_queues,
50348c2ecf20Sopenharmony_ci			      priv->dpseci_attr.num_tx_queues);
50358c2ecf20Sopenharmony_ci	if (priv->num_pairs > num_online_cpus()) {
50368c2ecf20Sopenharmony_ci		dev_warn(dev, "%d queues won't be used\n",
50378c2ecf20Sopenharmony_ci			 priv->num_pairs - num_online_cpus());
50388c2ecf20Sopenharmony_ci		priv->num_pairs = num_online_cpus();
50398c2ecf20Sopenharmony_ci	}
50408c2ecf20Sopenharmony_ci
50418c2ecf20Sopenharmony_ci	for (i = 0; i < priv->dpseci_attr.num_rx_queues; i++) {
50428c2ecf20Sopenharmony_ci		err = dpseci_get_rx_queue(priv->mc_io, 0, ls_dev->mc_handle, i,
50438c2ecf20Sopenharmony_ci					  &priv->rx_queue_attr[i]);
50448c2ecf20Sopenharmony_ci		if (err) {
50458c2ecf20Sopenharmony_ci			dev_err(dev, "dpseci_get_rx_queue() failed\n");
50468c2ecf20Sopenharmony_ci			goto err_get_rx_queue;
50478c2ecf20Sopenharmony_ci		}
50488c2ecf20Sopenharmony_ci	}
50498c2ecf20Sopenharmony_ci
50508c2ecf20Sopenharmony_ci	for (i = 0; i < priv->dpseci_attr.num_tx_queues; i++) {
50518c2ecf20Sopenharmony_ci		err = dpseci_get_tx_queue(priv->mc_io, 0, ls_dev->mc_handle, i,
50528c2ecf20Sopenharmony_ci					  &priv->tx_queue_attr[i]);
50538c2ecf20Sopenharmony_ci		if (err) {
50548c2ecf20Sopenharmony_ci			dev_err(dev, "dpseci_get_tx_queue() failed\n");
50558c2ecf20Sopenharmony_ci			goto err_get_rx_queue;
50568c2ecf20Sopenharmony_ci		}
50578c2ecf20Sopenharmony_ci	}
50588c2ecf20Sopenharmony_ci
50598c2ecf20Sopenharmony_ci	i = 0;
50608c2ecf20Sopenharmony_ci	for_each_online_cpu(cpu) {
50618c2ecf20Sopenharmony_ci		u8 j;
50628c2ecf20Sopenharmony_ci
50638c2ecf20Sopenharmony_ci		j = i % priv->num_pairs;
50648c2ecf20Sopenharmony_ci
50658c2ecf20Sopenharmony_ci		ppriv = per_cpu_ptr(priv->ppriv, cpu);
50668c2ecf20Sopenharmony_ci		ppriv->req_fqid = priv->tx_queue_attr[j].fqid;
50678c2ecf20Sopenharmony_ci
50688c2ecf20Sopenharmony_ci		/*
50698c2ecf20Sopenharmony_ci		 * Allow all cores to enqueue, while only some of them
50708c2ecf20Sopenharmony_ci		 * will take part in dequeuing.
50718c2ecf20Sopenharmony_ci		 */
50728c2ecf20Sopenharmony_ci		if (++i > priv->num_pairs)
50738c2ecf20Sopenharmony_ci			continue;
50748c2ecf20Sopenharmony_ci
50758c2ecf20Sopenharmony_ci		ppriv->rsp_fqid = priv->rx_queue_attr[j].fqid;
50768c2ecf20Sopenharmony_ci		ppriv->prio = j;
50778c2ecf20Sopenharmony_ci
50788c2ecf20Sopenharmony_ci		dev_dbg(dev, "pair %d: rx queue %d, tx queue %d\n", j,
50798c2ecf20Sopenharmony_ci			priv->rx_queue_attr[j].fqid,
50808c2ecf20Sopenharmony_ci			priv->tx_queue_attr[j].fqid);
50818c2ecf20Sopenharmony_ci
50828c2ecf20Sopenharmony_ci		ppriv->net_dev.dev = *dev;
50838c2ecf20Sopenharmony_ci		INIT_LIST_HEAD(&ppriv->net_dev.napi_list);
50848c2ecf20Sopenharmony_ci		netif_napi_add(&ppriv->net_dev, &ppriv->napi, dpaa2_dpseci_poll,
50858c2ecf20Sopenharmony_ci			       DPAA2_CAAM_NAPI_WEIGHT);
50868c2ecf20Sopenharmony_ci	}
50878c2ecf20Sopenharmony_ci
50888c2ecf20Sopenharmony_ci	return 0;
50898c2ecf20Sopenharmony_ci
50908c2ecf20Sopenharmony_cierr_get_rx_queue:
50918c2ecf20Sopenharmony_ci	dpaa2_dpseci_congestion_free(priv);
50928c2ecf20Sopenharmony_cierr_get_vers:
50938c2ecf20Sopenharmony_ci	dpseci_close(priv->mc_io, 0, ls_dev->mc_handle);
50948c2ecf20Sopenharmony_cierr_open:
50958c2ecf20Sopenharmony_ci	return err;
50968c2ecf20Sopenharmony_ci}
50978c2ecf20Sopenharmony_ci
50988c2ecf20Sopenharmony_cistatic int dpaa2_dpseci_enable(struct dpaa2_caam_priv *priv)
50998c2ecf20Sopenharmony_ci{
51008c2ecf20Sopenharmony_ci	struct device *dev = priv->dev;
51018c2ecf20Sopenharmony_ci	struct fsl_mc_device *ls_dev = to_fsl_mc_device(dev);
51028c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv_per_cpu *ppriv;
51038c2ecf20Sopenharmony_ci	int i;
51048c2ecf20Sopenharmony_ci
51058c2ecf20Sopenharmony_ci	for (i = 0; i < priv->num_pairs; i++) {
51068c2ecf20Sopenharmony_ci		ppriv = per_cpu_ptr(priv->ppriv, i);
51078c2ecf20Sopenharmony_ci		napi_enable(&ppriv->napi);
51088c2ecf20Sopenharmony_ci	}
51098c2ecf20Sopenharmony_ci
51108c2ecf20Sopenharmony_ci	return dpseci_enable(priv->mc_io, 0, ls_dev->mc_handle);
51118c2ecf20Sopenharmony_ci}
51128c2ecf20Sopenharmony_ci
51138c2ecf20Sopenharmony_cistatic int __cold dpaa2_dpseci_disable(struct dpaa2_caam_priv *priv)
51148c2ecf20Sopenharmony_ci{
51158c2ecf20Sopenharmony_ci	struct device *dev = priv->dev;
51168c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv_per_cpu *ppriv;
51178c2ecf20Sopenharmony_ci	struct fsl_mc_device *ls_dev = to_fsl_mc_device(dev);
51188c2ecf20Sopenharmony_ci	int i, err = 0, enabled;
51198c2ecf20Sopenharmony_ci
51208c2ecf20Sopenharmony_ci	err = dpseci_disable(priv->mc_io, 0, ls_dev->mc_handle);
51218c2ecf20Sopenharmony_ci	if (err) {
51228c2ecf20Sopenharmony_ci		dev_err(dev, "dpseci_disable() failed\n");
51238c2ecf20Sopenharmony_ci		return err;
51248c2ecf20Sopenharmony_ci	}
51258c2ecf20Sopenharmony_ci
51268c2ecf20Sopenharmony_ci	err = dpseci_is_enabled(priv->mc_io, 0, ls_dev->mc_handle, &enabled);
51278c2ecf20Sopenharmony_ci	if (err) {
51288c2ecf20Sopenharmony_ci		dev_err(dev, "dpseci_is_enabled() failed\n");
51298c2ecf20Sopenharmony_ci		return err;
51308c2ecf20Sopenharmony_ci	}
51318c2ecf20Sopenharmony_ci
51328c2ecf20Sopenharmony_ci	dev_dbg(dev, "disable: %s\n", enabled ? "false" : "true");
51338c2ecf20Sopenharmony_ci
51348c2ecf20Sopenharmony_ci	for (i = 0; i < priv->num_pairs; i++) {
51358c2ecf20Sopenharmony_ci		ppriv = per_cpu_ptr(priv->ppriv, i);
51368c2ecf20Sopenharmony_ci		napi_disable(&ppriv->napi);
51378c2ecf20Sopenharmony_ci		netif_napi_del(&ppriv->napi);
51388c2ecf20Sopenharmony_ci	}
51398c2ecf20Sopenharmony_ci
51408c2ecf20Sopenharmony_ci	return 0;
51418c2ecf20Sopenharmony_ci}
51428c2ecf20Sopenharmony_ci
51438c2ecf20Sopenharmony_cistatic struct list_head hash_list;
51448c2ecf20Sopenharmony_ci
51458c2ecf20Sopenharmony_cistatic int dpaa2_caam_probe(struct fsl_mc_device *dpseci_dev)
51468c2ecf20Sopenharmony_ci{
51478c2ecf20Sopenharmony_ci	struct device *dev;
51488c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv *priv;
51498c2ecf20Sopenharmony_ci	int i, err = 0;
51508c2ecf20Sopenharmony_ci	bool registered = false;
51518c2ecf20Sopenharmony_ci
51528c2ecf20Sopenharmony_ci	/*
51538c2ecf20Sopenharmony_ci	 * There is no way to get CAAM endianness - there is no direct register
51548c2ecf20Sopenharmony_ci	 * space access and MC f/w does not provide this attribute.
51558c2ecf20Sopenharmony_ci	 * All DPAA2-based SoCs have little endian CAAM, thus hard-code this
51568c2ecf20Sopenharmony_ci	 * property.
51578c2ecf20Sopenharmony_ci	 */
51588c2ecf20Sopenharmony_ci	caam_little_end = true;
51598c2ecf20Sopenharmony_ci
51608c2ecf20Sopenharmony_ci	caam_imx = false;
51618c2ecf20Sopenharmony_ci
51628c2ecf20Sopenharmony_ci	dev = &dpseci_dev->dev;
51638c2ecf20Sopenharmony_ci
51648c2ecf20Sopenharmony_ci	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
51658c2ecf20Sopenharmony_ci	if (!priv)
51668c2ecf20Sopenharmony_ci		return -ENOMEM;
51678c2ecf20Sopenharmony_ci
51688c2ecf20Sopenharmony_ci	dev_set_drvdata(dev, priv);
51698c2ecf20Sopenharmony_ci
51708c2ecf20Sopenharmony_ci	priv->domain = iommu_get_domain_for_dev(dev);
51718c2ecf20Sopenharmony_ci
51728c2ecf20Sopenharmony_ci	qi_cache = kmem_cache_create("dpaa2_caamqicache", CAAM_QI_MEMCACHE_SIZE,
51738c2ecf20Sopenharmony_ci				     0, SLAB_CACHE_DMA, NULL);
51748c2ecf20Sopenharmony_ci	if (!qi_cache) {
51758c2ecf20Sopenharmony_ci		dev_err(dev, "Can't allocate SEC cache\n");
51768c2ecf20Sopenharmony_ci		return -ENOMEM;
51778c2ecf20Sopenharmony_ci	}
51788c2ecf20Sopenharmony_ci
51798c2ecf20Sopenharmony_ci	err = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(49));
51808c2ecf20Sopenharmony_ci	if (err) {
51818c2ecf20Sopenharmony_ci		dev_err(dev, "dma_set_mask_and_coherent() failed\n");
51828c2ecf20Sopenharmony_ci		goto err_dma_mask;
51838c2ecf20Sopenharmony_ci	}
51848c2ecf20Sopenharmony_ci
51858c2ecf20Sopenharmony_ci	/* Obtain a MC portal */
51868c2ecf20Sopenharmony_ci	err = fsl_mc_portal_allocate(dpseci_dev, 0, &priv->mc_io);
51878c2ecf20Sopenharmony_ci	if (err) {
51888c2ecf20Sopenharmony_ci		if (err == -ENXIO)
51898c2ecf20Sopenharmony_ci			err = -EPROBE_DEFER;
51908c2ecf20Sopenharmony_ci		else
51918c2ecf20Sopenharmony_ci			dev_err(dev, "MC portal allocation failed\n");
51928c2ecf20Sopenharmony_ci
51938c2ecf20Sopenharmony_ci		goto err_dma_mask;
51948c2ecf20Sopenharmony_ci	}
51958c2ecf20Sopenharmony_ci
51968c2ecf20Sopenharmony_ci	priv->ppriv = alloc_percpu(*priv->ppriv);
51978c2ecf20Sopenharmony_ci	if (!priv->ppriv) {
51988c2ecf20Sopenharmony_ci		dev_err(dev, "alloc_percpu() failed\n");
51998c2ecf20Sopenharmony_ci		err = -ENOMEM;
52008c2ecf20Sopenharmony_ci		goto err_alloc_ppriv;
52018c2ecf20Sopenharmony_ci	}
52028c2ecf20Sopenharmony_ci
52038c2ecf20Sopenharmony_ci	/* DPSECI initialization */
52048c2ecf20Sopenharmony_ci	err = dpaa2_dpseci_setup(dpseci_dev);
52058c2ecf20Sopenharmony_ci	if (err) {
52068c2ecf20Sopenharmony_ci		dev_err(dev, "dpaa2_dpseci_setup() failed\n");
52078c2ecf20Sopenharmony_ci		goto err_dpseci_setup;
52088c2ecf20Sopenharmony_ci	}
52098c2ecf20Sopenharmony_ci
52108c2ecf20Sopenharmony_ci	/* DPIO */
52118c2ecf20Sopenharmony_ci	err = dpaa2_dpseci_dpio_setup(priv);
52128c2ecf20Sopenharmony_ci	if (err) {
52138c2ecf20Sopenharmony_ci		dev_err_probe(dev, err, "dpaa2_dpseci_dpio_setup() failed\n");
52148c2ecf20Sopenharmony_ci		goto err_dpio_setup;
52158c2ecf20Sopenharmony_ci	}
52168c2ecf20Sopenharmony_ci
52178c2ecf20Sopenharmony_ci	/* DPSECI binding to DPIO */
52188c2ecf20Sopenharmony_ci	err = dpaa2_dpseci_bind(priv);
52198c2ecf20Sopenharmony_ci	if (err) {
52208c2ecf20Sopenharmony_ci		dev_err(dev, "dpaa2_dpseci_bind() failed\n");
52218c2ecf20Sopenharmony_ci		goto err_bind;
52228c2ecf20Sopenharmony_ci	}
52238c2ecf20Sopenharmony_ci
52248c2ecf20Sopenharmony_ci	/* DPSECI enable */
52258c2ecf20Sopenharmony_ci	err = dpaa2_dpseci_enable(priv);
52268c2ecf20Sopenharmony_ci	if (err) {
52278c2ecf20Sopenharmony_ci		dev_err(dev, "dpaa2_dpseci_enable() failed\n");
52288c2ecf20Sopenharmony_ci		goto err_bind;
52298c2ecf20Sopenharmony_ci	}
52308c2ecf20Sopenharmony_ci
52318c2ecf20Sopenharmony_ci	dpaa2_dpseci_debugfs_init(priv);
52328c2ecf20Sopenharmony_ci
52338c2ecf20Sopenharmony_ci	/* register crypto algorithms the device supports */
52348c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
52358c2ecf20Sopenharmony_ci		struct caam_skcipher_alg *t_alg = driver_algs + i;
52368c2ecf20Sopenharmony_ci		u32 alg_sel = t_alg->caam.class1_alg_type & OP_ALG_ALGSEL_MASK;
52378c2ecf20Sopenharmony_ci
52388c2ecf20Sopenharmony_ci		/* Skip DES algorithms if not supported by device */
52398c2ecf20Sopenharmony_ci		if (!priv->sec_attr.des_acc_num &&
52408c2ecf20Sopenharmony_ci		    (alg_sel == OP_ALG_ALGSEL_3DES ||
52418c2ecf20Sopenharmony_ci		     alg_sel == OP_ALG_ALGSEL_DES))
52428c2ecf20Sopenharmony_ci			continue;
52438c2ecf20Sopenharmony_ci
52448c2ecf20Sopenharmony_ci		/* Skip AES algorithms if not supported by device */
52458c2ecf20Sopenharmony_ci		if (!priv->sec_attr.aes_acc_num &&
52468c2ecf20Sopenharmony_ci		    alg_sel == OP_ALG_ALGSEL_AES)
52478c2ecf20Sopenharmony_ci			continue;
52488c2ecf20Sopenharmony_ci
52498c2ecf20Sopenharmony_ci		/* Skip CHACHA20 algorithms if not supported by device */
52508c2ecf20Sopenharmony_ci		if (alg_sel == OP_ALG_ALGSEL_CHACHA20 &&
52518c2ecf20Sopenharmony_ci		    !priv->sec_attr.ccha_acc_num)
52528c2ecf20Sopenharmony_ci			continue;
52538c2ecf20Sopenharmony_ci
52548c2ecf20Sopenharmony_ci		t_alg->caam.dev = dev;
52558c2ecf20Sopenharmony_ci		caam_skcipher_alg_init(t_alg);
52568c2ecf20Sopenharmony_ci
52578c2ecf20Sopenharmony_ci		err = crypto_register_skcipher(&t_alg->skcipher);
52588c2ecf20Sopenharmony_ci		if (err) {
52598c2ecf20Sopenharmony_ci			dev_warn(dev, "%s alg registration failed: %d\n",
52608c2ecf20Sopenharmony_ci				 t_alg->skcipher.base.cra_driver_name, err);
52618c2ecf20Sopenharmony_ci			continue;
52628c2ecf20Sopenharmony_ci		}
52638c2ecf20Sopenharmony_ci
52648c2ecf20Sopenharmony_ci		t_alg->registered = true;
52658c2ecf20Sopenharmony_ci		registered = true;
52668c2ecf20Sopenharmony_ci	}
52678c2ecf20Sopenharmony_ci
52688c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {
52698c2ecf20Sopenharmony_ci		struct caam_aead_alg *t_alg = driver_aeads + i;
52708c2ecf20Sopenharmony_ci		u32 c1_alg_sel = t_alg->caam.class1_alg_type &
52718c2ecf20Sopenharmony_ci				 OP_ALG_ALGSEL_MASK;
52728c2ecf20Sopenharmony_ci		u32 c2_alg_sel = t_alg->caam.class2_alg_type &
52738c2ecf20Sopenharmony_ci				 OP_ALG_ALGSEL_MASK;
52748c2ecf20Sopenharmony_ci
52758c2ecf20Sopenharmony_ci		/* Skip DES algorithms if not supported by device */
52768c2ecf20Sopenharmony_ci		if (!priv->sec_attr.des_acc_num &&
52778c2ecf20Sopenharmony_ci		    (c1_alg_sel == OP_ALG_ALGSEL_3DES ||
52788c2ecf20Sopenharmony_ci		     c1_alg_sel == OP_ALG_ALGSEL_DES))
52798c2ecf20Sopenharmony_ci			continue;
52808c2ecf20Sopenharmony_ci
52818c2ecf20Sopenharmony_ci		/* Skip AES algorithms if not supported by device */
52828c2ecf20Sopenharmony_ci		if (!priv->sec_attr.aes_acc_num &&
52838c2ecf20Sopenharmony_ci		    c1_alg_sel == OP_ALG_ALGSEL_AES)
52848c2ecf20Sopenharmony_ci			continue;
52858c2ecf20Sopenharmony_ci
52868c2ecf20Sopenharmony_ci		/* Skip CHACHA20 algorithms if not supported by device */
52878c2ecf20Sopenharmony_ci		if (c1_alg_sel == OP_ALG_ALGSEL_CHACHA20 &&
52888c2ecf20Sopenharmony_ci		    !priv->sec_attr.ccha_acc_num)
52898c2ecf20Sopenharmony_ci			continue;
52908c2ecf20Sopenharmony_ci
52918c2ecf20Sopenharmony_ci		/* Skip POLY1305 algorithms if not supported by device */
52928c2ecf20Sopenharmony_ci		if (c2_alg_sel == OP_ALG_ALGSEL_POLY1305 &&
52938c2ecf20Sopenharmony_ci		    !priv->sec_attr.ptha_acc_num)
52948c2ecf20Sopenharmony_ci			continue;
52958c2ecf20Sopenharmony_ci
52968c2ecf20Sopenharmony_ci		/*
52978c2ecf20Sopenharmony_ci		 * Skip algorithms requiring message digests
52988c2ecf20Sopenharmony_ci		 * if MD not supported by device.
52998c2ecf20Sopenharmony_ci		 */
53008c2ecf20Sopenharmony_ci		if ((c2_alg_sel & ~OP_ALG_ALGSEL_SUBMASK) == 0x40 &&
53018c2ecf20Sopenharmony_ci		    !priv->sec_attr.md_acc_num)
53028c2ecf20Sopenharmony_ci			continue;
53038c2ecf20Sopenharmony_ci
53048c2ecf20Sopenharmony_ci		t_alg->caam.dev = dev;
53058c2ecf20Sopenharmony_ci		caam_aead_alg_init(t_alg);
53068c2ecf20Sopenharmony_ci
53078c2ecf20Sopenharmony_ci		err = crypto_register_aead(&t_alg->aead);
53088c2ecf20Sopenharmony_ci		if (err) {
53098c2ecf20Sopenharmony_ci			dev_warn(dev, "%s alg registration failed: %d\n",
53108c2ecf20Sopenharmony_ci				 t_alg->aead.base.cra_driver_name, err);
53118c2ecf20Sopenharmony_ci			continue;
53128c2ecf20Sopenharmony_ci		}
53138c2ecf20Sopenharmony_ci
53148c2ecf20Sopenharmony_ci		t_alg->registered = true;
53158c2ecf20Sopenharmony_ci		registered = true;
53168c2ecf20Sopenharmony_ci	}
53178c2ecf20Sopenharmony_ci	if (registered)
53188c2ecf20Sopenharmony_ci		dev_info(dev, "algorithms registered in /proc/crypto\n");
53198c2ecf20Sopenharmony_ci
53208c2ecf20Sopenharmony_ci	/* register hash algorithms the device supports */
53218c2ecf20Sopenharmony_ci	INIT_LIST_HEAD(&hash_list);
53228c2ecf20Sopenharmony_ci
53238c2ecf20Sopenharmony_ci	/*
53248c2ecf20Sopenharmony_ci	 * Skip registration of any hashing algorithms if MD block
53258c2ecf20Sopenharmony_ci	 * is not present.
53268c2ecf20Sopenharmony_ci	 */
53278c2ecf20Sopenharmony_ci	if (!priv->sec_attr.md_acc_num)
53288c2ecf20Sopenharmony_ci		return 0;
53298c2ecf20Sopenharmony_ci
53308c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(driver_hash); i++) {
53318c2ecf20Sopenharmony_ci		struct caam_hash_alg *t_alg;
53328c2ecf20Sopenharmony_ci		struct caam_hash_template *alg = driver_hash + i;
53338c2ecf20Sopenharmony_ci
53348c2ecf20Sopenharmony_ci		/* register hmac version */
53358c2ecf20Sopenharmony_ci		t_alg = caam_hash_alloc(dev, alg, true);
53368c2ecf20Sopenharmony_ci		if (IS_ERR(t_alg)) {
53378c2ecf20Sopenharmony_ci			err = PTR_ERR(t_alg);
53388c2ecf20Sopenharmony_ci			dev_warn(dev, "%s hash alg allocation failed: %d\n",
53398c2ecf20Sopenharmony_ci				 alg->hmac_driver_name, err);
53408c2ecf20Sopenharmony_ci			continue;
53418c2ecf20Sopenharmony_ci		}
53428c2ecf20Sopenharmony_ci
53438c2ecf20Sopenharmony_ci		err = crypto_register_ahash(&t_alg->ahash_alg);
53448c2ecf20Sopenharmony_ci		if (err) {
53458c2ecf20Sopenharmony_ci			dev_warn(dev, "%s alg registration failed: %d\n",
53468c2ecf20Sopenharmony_ci				 t_alg->ahash_alg.halg.base.cra_driver_name,
53478c2ecf20Sopenharmony_ci				 err);
53488c2ecf20Sopenharmony_ci			kfree(t_alg);
53498c2ecf20Sopenharmony_ci		} else {
53508c2ecf20Sopenharmony_ci			list_add_tail(&t_alg->entry, &hash_list);
53518c2ecf20Sopenharmony_ci		}
53528c2ecf20Sopenharmony_ci
53538c2ecf20Sopenharmony_ci		/* register unkeyed version */
53548c2ecf20Sopenharmony_ci		t_alg = caam_hash_alloc(dev, alg, false);
53558c2ecf20Sopenharmony_ci		if (IS_ERR(t_alg)) {
53568c2ecf20Sopenharmony_ci			err = PTR_ERR(t_alg);
53578c2ecf20Sopenharmony_ci			dev_warn(dev, "%s alg allocation failed: %d\n",
53588c2ecf20Sopenharmony_ci				 alg->driver_name, err);
53598c2ecf20Sopenharmony_ci			continue;
53608c2ecf20Sopenharmony_ci		}
53618c2ecf20Sopenharmony_ci
53628c2ecf20Sopenharmony_ci		err = crypto_register_ahash(&t_alg->ahash_alg);
53638c2ecf20Sopenharmony_ci		if (err) {
53648c2ecf20Sopenharmony_ci			dev_warn(dev, "%s alg registration failed: %d\n",
53658c2ecf20Sopenharmony_ci				 t_alg->ahash_alg.halg.base.cra_driver_name,
53668c2ecf20Sopenharmony_ci				 err);
53678c2ecf20Sopenharmony_ci			kfree(t_alg);
53688c2ecf20Sopenharmony_ci		} else {
53698c2ecf20Sopenharmony_ci			list_add_tail(&t_alg->entry, &hash_list);
53708c2ecf20Sopenharmony_ci		}
53718c2ecf20Sopenharmony_ci	}
53728c2ecf20Sopenharmony_ci	if (!list_empty(&hash_list))
53738c2ecf20Sopenharmony_ci		dev_info(dev, "hash algorithms registered in /proc/crypto\n");
53748c2ecf20Sopenharmony_ci
53758c2ecf20Sopenharmony_ci	return err;
53768c2ecf20Sopenharmony_ci
53778c2ecf20Sopenharmony_cierr_bind:
53788c2ecf20Sopenharmony_ci	dpaa2_dpseci_dpio_free(priv);
53798c2ecf20Sopenharmony_cierr_dpio_setup:
53808c2ecf20Sopenharmony_ci	dpaa2_dpseci_free(priv);
53818c2ecf20Sopenharmony_cierr_dpseci_setup:
53828c2ecf20Sopenharmony_ci	free_percpu(priv->ppriv);
53838c2ecf20Sopenharmony_cierr_alloc_ppriv:
53848c2ecf20Sopenharmony_ci	fsl_mc_portal_free(priv->mc_io);
53858c2ecf20Sopenharmony_cierr_dma_mask:
53868c2ecf20Sopenharmony_ci	kmem_cache_destroy(qi_cache);
53878c2ecf20Sopenharmony_ci
53888c2ecf20Sopenharmony_ci	return err;
53898c2ecf20Sopenharmony_ci}
53908c2ecf20Sopenharmony_ci
53918c2ecf20Sopenharmony_cistatic int __cold dpaa2_caam_remove(struct fsl_mc_device *ls_dev)
53928c2ecf20Sopenharmony_ci{
53938c2ecf20Sopenharmony_ci	struct device *dev;
53948c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv *priv;
53958c2ecf20Sopenharmony_ci	int i;
53968c2ecf20Sopenharmony_ci
53978c2ecf20Sopenharmony_ci	dev = &ls_dev->dev;
53988c2ecf20Sopenharmony_ci	priv = dev_get_drvdata(dev);
53998c2ecf20Sopenharmony_ci
54008c2ecf20Sopenharmony_ci	dpaa2_dpseci_debugfs_exit(priv);
54018c2ecf20Sopenharmony_ci
54028c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {
54038c2ecf20Sopenharmony_ci		struct caam_aead_alg *t_alg = driver_aeads + i;
54048c2ecf20Sopenharmony_ci
54058c2ecf20Sopenharmony_ci		if (t_alg->registered)
54068c2ecf20Sopenharmony_ci			crypto_unregister_aead(&t_alg->aead);
54078c2ecf20Sopenharmony_ci	}
54088c2ecf20Sopenharmony_ci
54098c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
54108c2ecf20Sopenharmony_ci		struct caam_skcipher_alg *t_alg = driver_algs + i;
54118c2ecf20Sopenharmony_ci
54128c2ecf20Sopenharmony_ci		if (t_alg->registered)
54138c2ecf20Sopenharmony_ci			crypto_unregister_skcipher(&t_alg->skcipher);
54148c2ecf20Sopenharmony_ci	}
54158c2ecf20Sopenharmony_ci
54168c2ecf20Sopenharmony_ci	if (hash_list.next) {
54178c2ecf20Sopenharmony_ci		struct caam_hash_alg *t_hash_alg, *p;
54188c2ecf20Sopenharmony_ci
54198c2ecf20Sopenharmony_ci		list_for_each_entry_safe(t_hash_alg, p, &hash_list, entry) {
54208c2ecf20Sopenharmony_ci			crypto_unregister_ahash(&t_hash_alg->ahash_alg);
54218c2ecf20Sopenharmony_ci			list_del(&t_hash_alg->entry);
54228c2ecf20Sopenharmony_ci			kfree(t_hash_alg);
54238c2ecf20Sopenharmony_ci		}
54248c2ecf20Sopenharmony_ci	}
54258c2ecf20Sopenharmony_ci
54268c2ecf20Sopenharmony_ci	dpaa2_dpseci_disable(priv);
54278c2ecf20Sopenharmony_ci	dpaa2_dpseci_dpio_free(priv);
54288c2ecf20Sopenharmony_ci	dpaa2_dpseci_free(priv);
54298c2ecf20Sopenharmony_ci	free_percpu(priv->ppriv);
54308c2ecf20Sopenharmony_ci	fsl_mc_portal_free(priv->mc_io);
54318c2ecf20Sopenharmony_ci	kmem_cache_destroy(qi_cache);
54328c2ecf20Sopenharmony_ci
54338c2ecf20Sopenharmony_ci	return 0;
54348c2ecf20Sopenharmony_ci}
54358c2ecf20Sopenharmony_ci
54368c2ecf20Sopenharmony_ciint dpaa2_caam_enqueue(struct device *dev, struct caam_request *req)
54378c2ecf20Sopenharmony_ci{
54388c2ecf20Sopenharmony_ci	struct dpaa2_fd fd;
54398c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv *priv = dev_get_drvdata(dev);
54408c2ecf20Sopenharmony_ci	struct dpaa2_caam_priv_per_cpu *ppriv;
54418c2ecf20Sopenharmony_ci	int err = 0, i;
54428c2ecf20Sopenharmony_ci
54438c2ecf20Sopenharmony_ci	if (IS_ERR(req))
54448c2ecf20Sopenharmony_ci		return PTR_ERR(req);
54458c2ecf20Sopenharmony_ci
54468c2ecf20Sopenharmony_ci	if (priv->cscn_mem) {
54478c2ecf20Sopenharmony_ci		dma_sync_single_for_cpu(priv->dev, priv->cscn_dma,
54488c2ecf20Sopenharmony_ci					DPAA2_CSCN_SIZE,
54498c2ecf20Sopenharmony_ci					DMA_FROM_DEVICE);
54508c2ecf20Sopenharmony_ci		if (unlikely(dpaa2_cscn_state_congested(priv->cscn_mem_aligned))) {
54518c2ecf20Sopenharmony_ci			dev_dbg_ratelimited(dev, "Dropping request\n");
54528c2ecf20Sopenharmony_ci			return -EBUSY;
54538c2ecf20Sopenharmony_ci		}
54548c2ecf20Sopenharmony_ci	}
54558c2ecf20Sopenharmony_ci
54568c2ecf20Sopenharmony_ci	dpaa2_fl_set_flc(&req->fd_flt[1], req->flc_dma);
54578c2ecf20Sopenharmony_ci
54588c2ecf20Sopenharmony_ci	req->fd_flt_dma = dma_map_single(dev, req->fd_flt, sizeof(req->fd_flt),
54598c2ecf20Sopenharmony_ci					 DMA_BIDIRECTIONAL);
54608c2ecf20Sopenharmony_ci	if (dma_mapping_error(dev, req->fd_flt_dma)) {
54618c2ecf20Sopenharmony_ci		dev_err(dev, "DMA mapping error for QI enqueue request\n");
54628c2ecf20Sopenharmony_ci		goto err_out;
54638c2ecf20Sopenharmony_ci	}
54648c2ecf20Sopenharmony_ci
54658c2ecf20Sopenharmony_ci	memset(&fd, 0, sizeof(fd));
54668c2ecf20Sopenharmony_ci	dpaa2_fd_set_format(&fd, dpaa2_fd_list);
54678c2ecf20Sopenharmony_ci	dpaa2_fd_set_addr(&fd, req->fd_flt_dma);
54688c2ecf20Sopenharmony_ci	dpaa2_fd_set_len(&fd, dpaa2_fl_get_len(&req->fd_flt[1]));
54698c2ecf20Sopenharmony_ci	dpaa2_fd_set_flc(&fd, req->flc_dma);
54708c2ecf20Sopenharmony_ci
54718c2ecf20Sopenharmony_ci	ppriv = raw_cpu_ptr(priv->ppriv);
54728c2ecf20Sopenharmony_ci	for (i = 0; i < (priv->dpseci_attr.num_tx_queues << 1); i++) {
54738c2ecf20Sopenharmony_ci		err = dpaa2_io_service_enqueue_fq(ppriv->dpio, ppriv->req_fqid,
54748c2ecf20Sopenharmony_ci						  &fd);
54758c2ecf20Sopenharmony_ci		if (err != -EBUSY)
54768c2ecf20Sopenharmony_ci			break;
54778c2ecf20Sopenharmony_ci
54788c2ecf20Sopenharmony_ci		cpu_relax();
54798c2ecf20Sopenharmony_ci	}
54808c2ecf20Sopenharmony_ci
54818c2ecf20Sopenharmony_ci	if (unlikely(err)) {
54828c2ecf20Sopenharmony_ci		dev_err_ratelimited(dev, "Error enqueuing frame: %d\n", err);
54838c2ecf20Sopenharmony_ci		goto err_out;
54848c2ecf20Sopenharmony_ci	}
54858c2ecf20Sopenharmony_ci
54868c2ecf20Sopenharmony_ci	return -EINPROGRESS;
54878c2ecf20Sopenharmony_ci
54888c2ecf20Sopenharmony_cierr_out:
54898c2ecf20Sopenharmony_ci	dma_unmap_single(dev, req->fd_flt_dma, sizeof(req->fd_flt),
54908c2ecf20Sopenharmony_ci			 DMA_BIDIRECTIONAL);
54918c2ecf20Sopenharmony_ci	return -EIO;
54928c2ecf20Sopenharmony_ci}
54938c2ecf20Sopenharmony_ciEXPORT_SYMBOL(dpaa2_caam_enqueue);
54948c2ecf20Sopenharmony_ci
54958c2ecf20Sopenharmony_cistatic const struct fsl_mc_device_id dpaa2_caam_match_id_table[] = {
54968c2ecf20Sopenharmony_ci	{
54978c2ecf20Sopenharmony_ci		.vendor = FSL_MC_VENDOR_FREESCALE,
54988c2ecf20Sopenharmony_ci		.obj_type = "dpseci",
54998c2ecf20Sopenharmony_ci	},
55008c2ecf20Sopenharmony_ci	{ .vendor = 0x0 }
55018c2ecf20Sopenharmony_ci};
55028c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(fslmc, dpaa2_caam_match_id_table);
55038c2ecf20Sopenharmony_ci
55048c2ecf20Sopenharmony_cistatic struct fsl_mc_driver dpaa2_caam_driver = {
55058c2ecf20Sopenharmony_ci	.driver = {
55068c2ecf20Sopenharmony_ci		.name		= KBUILD_MODNAME,
55078c2ecf20Sopenharmony_ci		.owner		= THIS_MODULE,
55088c2ecf20Sopenharmony_ci	},
55098c2ecf20Sopenharmony_ci	.probe		= dpaa2_caam_probe,
55108c2ecf20Sopenharmony_ci	.remove		= dpaa2_caam_remove,
55118c2ecf20Sopenharmony_ci	.match_id_table = dpaa2_caam_match_id_table
55128c2ecf20Sopenharmony_ci};
55138c2ecf20Sopenharmony_ci
55148c2ecf20Sopenharmony_ciMODULE_LICENSE("Dual BSD/GPL");
55158c2ecf20Sopenharmony_ciMODULE_AUTHOR("Freescale Semiconductor, Inc");
55168c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Freescale DPAA2 CAAM Driver");
55178c2ecf20Sopenharmony_ci
55188c2ecf20Sopenharmony_cimodule_fsl_mc_driver(dpaa2_caam_driver);
5519