brintos

brintos / linux-shallow public Read only

0
0
Text · 149.9 KiB · e809d03 Raw
5564 lines · c
1// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)2/*3 * Copyright 2015-2016 Freescale Semiconductor Inc.4 * Copyright 2017-2019 NXP5 */6 7#include "compat.h"8#include "regs.h"9#include "caamalg_qi2.h"10#include "dpseci_cmd.h"11#include "desc_constr.h"12#include "error.h"13#include "sg_sw_sec4.h"14#include "sg_sw_qm2.h"15#include "key_gen.h"16#include "caamalg_desc.h"17#include "caamhash_desc.h"18#include "dpseci-debugfs.h"19#include <linux/dma-mapping.h>20#include <linux/fsl/mc.h>21#include <linux/kernel.h>22#include <soc/fsl/dpaa2-io.h>23#include <soc/fsl/dpaa2-fd.h>24#include <crypto/xts.h>25#include <linux/unaligned.h>26 27#define CAAM_CRA_PRIORITY	200028 29/* max key is sum of AES_MAX_KEY_SIZE, max split key size */30#define CAAM_MAX_KEY_SIZE	(AES_MAX_KEY_SIZE + CTR_RFC3686_NONCE_SIZE + \31				 SHA512_DIGEST_SIZE * 2)32 33/*34 * This is a cache of buffers, from which the users of CAAM QI driver35 * can allocate short buffers. It's speedier than doing kmalloc on the hotpath.36 * NOTE: A more elegant solution would be to have some headroom in the frames37 *       being processed. This can be added by the dpaa2-eth driver. This would38 *       pose a problem for userspace application processing which cannot39 *       know of this limitation. So for now, this will work.40 * NOTE: The memcache is SMP-safe. No need to handle spinlocks in-here41 */42static struct kmem_cache *qi_cache;43 44struct caam_alg_entry {45	struct device *dev;46	int class1_alg_type;47	int class2_alg_type;48	bool rfc3686;49	bool geniv;50	bool nodkp;51};52 53struct caam_aead_alg {54	struct aead_alg aead;55	struct caam_alg_entry caam;56	bool registered;57};58 59struct caam_skcipher_alg {60	struct skcipher_alg skcipher;61	struct caam_alg_entry caam;62	bool registered;63};64 65/**66 * struct caam_ctx - per-session context67 * @flc: Flow Contexts array68 * @key:  [authentication key], encryption key69 * @flc_dma: I/O virtual addresses of the Flow Contexts70 * @key_dma: I/O virtual address of the key71 * @dir: DMA direction for mapping key and Flow Contexts72 * @dev: dpseci device73 * @adata: authentication algorithm details74 * @cdata: encryption algorithm details75 * @authsize: authentication tag (a.k.a. ICV / MAC) size76 * @xts_key_fallback: true if fallback tfm needs to be used due77 *		      to unsupported xts key lengths78 * @fallback: xts fallback tfm79 */80struct caam_ctx {81	struct caam_flc flc[NUM_OP];82	u8 key[CAAM_MAX_KEY_SIZE];83	dma_addr_t flc_dma[NUM_OP];84	dma_addr_t key_dma;85	enum dma_data_direction dir;86	struct device *dev;87	struct alginfo adata;88	struct alginfo cdata;89	unsigned int authsize;90	bool xts_key_fallback;91	struct crypto_skcipher *fallback;92};93 94static void *dpaa2_caam_iova_to_virt(struct dpaa2_caam_priv *priv,95				     dma_addr_t iova_addr)96{97	phys_addr_t phys_addr;98 99	phys_addr = priv->domain ? iommu_iova_to_phys(priv->domain, iova_addr) :100				   iova_addr;101 102	return phys_to_virt(phys_addr);103}104 105/*106 * qi_cache_zalloc - Allocate buffers from CAAM-QI cache107 *108 * Allocate data on the hotpath. Instead of using kzalloc, one can use the109 * services of the CAAM QI memory cache (backed by kmem_cache). The buffers110 * will have a size of CAAM_QI_MEMCACHE_SIZE, which should be sufficient for111 * hosting 16 SG entries.112 *113 * @flags - flags that would be used for the equivalent kmalloc(..) call114 *115 * Returns a pointer to a retrieved buffer on success or NULL on failure.116 */117static inline void *qi_cache_zalloc(gfp_t flags)118{119	return kmem_cache_zalloc(qi_cache, flags);120}121 122/*123 * qi_cache_free - Frees buffers allocated from CAAM-QI cache124 *125 * @obj - buffer previously allocated by qi_cache_zalloc126 *127 * No checking is being done, the call is a passthrough call to128 * kmem_cache_free(...)129 */130static inline void qi_cache_free(void *obj)131{132	kmem_cache_free(qi_cache, obj);133}134 135static struct caam_request *to_caam_req(struct crypto_async_request *areq)136{137	switch (crypto_tfm_alg_type(areq->tfm)) {138	case CRYPTO_ALG_TYPE_SKCIPHER:139		return skcipher_request_ctx_dma(skcipher_request_cast(areq));140	case CRYPTO_ALG_TYPE_AEAD:141		return aead_request_ctx_dma(142			container_of(areq, struct aead_request, base));143	case CRYPTO_ALG_TYPE_AHASH:144		return ahash_request_ctx_dma(ahash_request_cast(areq));145	default:146		return ERR_PTR(-EINVAL);147	}148}149 150static void caam_unmap(struct device *dev, struct scatterlist *src,151		       struct scatterlist *dst, int src_nents,152		       int dst_nents, dma_addr_t iv_dma, int ivsize,153		       enum dma_data_direction iv_dir, dma_addr_t qm_sg_dma,154		       int qm_sg_bytes)155{156	if (dst != src) {157		if (src_nents)158			dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE);159		if (dst_nents)160			dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE);161	} else {162		dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL);163	}164 165	if (iv_dma)166		dma_unmap_single(dev, iv_dma, ivsize, iv_dir);167 168	if (qm_sg_bytes)169		dma_unmap_single(dev, qm_sg_dma, qm_sg_bytes, DMA_TO_DEVICE);170}171 172static int aead_set_sh_desc(struct crypto_aead *aead)173{174	struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),175						 typeof(*alg), aead);176	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);177	unsigned int ivsize = crypto_aead_ivsize(aead);178	struct device *dev = ctx->dev;179	struct dpaa2_caam_priv *priv = dev_get_drvdata(dev);180	struct caam_flc *flc;181	u32 *desc;182	u32 ctx1_iv_off = 0;183	u32 *nonce = NULL;184	unsigned int data_len[2];185	u32 inl_mask;186	const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) ==187			       OP_ALG_AAI_CTR_MOD128);188	const bool is_rfc3686 = alg->caam.rfc3686;189 190	if (!ctx->cdata.keylen || !ctx->authsize)191		return 0;192 193	/*194	 * AES-CTR needs to load IV in CONTEXT1 reg195	 * at an offset of 128bits (16bytes)196	 * CONTEXT1[255:128] = IV197	 */198	if (ctr_mode)199		ctx1_iv_off = 16;200 201	/*202	 * RFC3686 specific:203	 *	CONTEXT1[255:128] = {NONCE, IV, COUNTER}204	 */205	if (is_rfc3686) {206		ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;207		nonce = (u32 *)((void *)ctx->key + ctx->adata.keylen_pad +208				ctx->cdata.keylen - CTR_RFC3686_NONCE_SIZE);209	}210 211	/*212	 * In case |user key| > |derived key|, using DKP<imm,imm> would result213	 * in invalid opcodes (last bytes of user key) in the resulting214	 * descriptor. Use DKP<ptr,imm> instead => both virtual and dma key215	 * addresses are needed.216	 */217	ctx->adata.key_virt = ctx->key;218	ctx->adata.key_dma = ctx->key_dma;219 220	ctx->cdata.key_virt = ctx->key + ctx->adata.keylen_pad;221	ctx->cdata.key_dma = ctx->key_dma + ctx->adata.keylen_pad;222 223	data_len[0] = ctx->adata.keylen_pad;224	data_len[1] = ctx->cdata.keylen;225 226	/* aead_encrypt shared descriptor */227	if (desc_inline_query((alg->caam.geniv ? DESC_QI_AEAD_GIVENC_LEN :228						 DESC_QI_AEAD_ENC_LEN) +229			      (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),230			      DESC_JOB_IO_LEN, data_len, &inl_mask,231			      ARRAY_SIZE(data_len)) < 0)232		return -EINVAL;233 234	ctx->adata.key_inline = !!(inl_mask & 1);235	ctx->cdata.key_inline = !!(inl_mask & 2);236 237	flc = &ctx->flc[ENCRYPT];238	desc = flc->sh_desc;239 240	if (alg->caam.geniv)241		cnstr_shdsc_aead_givencap(desc, &ctx->cdata, &ctx->adata,242					  ivsize, ctx->authsize, is_rfc3686,243					  nonce, ctx1_iv_off, true,244					  priv->sec_attr.era);245	else246		cnstr_shdsc_aead_encap(desc, &ctx->cdata, &ctx->adata,247				       ivsize, ctx->authsize, is_rfc3686, nonce,248				       ctx1_iv_off, true, priv->sec_attr.era);249 250	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */251	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],252				   sizeof(flc->flc) + desc_bytes(desc),253				   ctx->dir);254 255	/* aead_decrypt shared descriptor */256	if (desc_inline_query(DESC_QI_AEAD_DEC_LEN +257			      (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),258			      DESC_JOB_IO_LEN, data_len, &inl_mask,259			      ARRAY_SIZE(data_len)) < 0)260		return -EINVAL;261 262	ctx->adata.key_inline = !!(inl_mask & 1);263	ctx->cdata.key_inline = !!(inl_mask & 2);264 265	flc = &ctx->flc[DECRYPT];266	desc = flc->sh_desc;267	cnstr_shdsc_aead_decap(desc, &ctx->cdata, &ctx->adata,268			       ivsize, ctx->authsize, alg->caam.geniv,269			       is_rfc3686, nonce, ctx1_iv_off, true,270			       priv->sec_attr.era);271	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */272	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],273				   sizeof(flc->flc) + desc_bytes(desc),274				   ctx->dir);275 276	return 0;277}278 279static int aead_setauthsize(struct crypto_aead *authenc, unsigned int authsize)280{281	struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc);282 283	ctx->authsize = authsize;284	aead_set_sh_desc(authenc);285 286	return 0;287}288 289static int aead_setkey(struct crypto_aead *aead, const u8 *key,290		       unsigned int keylen)291{292	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);293	struct device *dev = ctx->dev;294	struct crypto_authenc_keys keys;295 296	if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)297		goto badkey;298 299	dev_dbg(dev, "keylen %d enckeylen %d authkeylen %d\n",300		keys.authkeylen + keys.enckeylen, keys.enckeylen,301		keys.authkeylen);302	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",303			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);304 305	ctx->adata.keylen = keys.authkeylen;306	ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype &307					      OP_ALG_ALGSEL_MASK);308 309	if (ctx->adata.keylen_pad + keys.enckeylen > CAAM_MAX_KEY_SIZE)310		goto badkey;311 312	memcpy(ctx->key, keys.authkey, keys.authkeylen);313	memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, keys.enckeylen);314	dma_sync_single_for_device(dev, ctx->key_dma, ctx->adata.keylen_pad +315				   keys.enckeylen, ctx->dir);316	print_hex_dump_debug("ctx.key@" __stringify(__LINE__)": ",317			     DUMP_PREFIX_ADDRESS, 16, 4, ctx->key,318			     ctx->adata.keylen_pad + keys.enckeylen, 1);319 320	ctx->cdata.keylen = keys.enckeylen;321 322	memzero_explicit(&keys, sizeof(keys));323	return aead_set_sh_desc(aead);324badkey:325	memzero_explicit(&keys, sizeof(keys));326	return -EINVAL;327}328 329static int des3_aead_setkey(struct crypto_aead *aead, const u8 *key,330			    unsigned int keylen)331{332	struct crypto_authenc_keys keys;333	int err;334 335	err = crypto_authenc_extractkeys(&keys, key, keylen);336	if (unlikely(err))337		goto out;338 339	err = -EINVAL;340	if (keys.enckeylen != DES3_EDE_KEY_SIZE)341		goto out;342 343	err = crypto_des3_ede_verify_key(crypto_aead_tfm(aead), keys.enckey) ?:344	      aead_setkey(aead, key, keylen);345 346out:347	memzero_explicit(&keys, sizeof(keys));348	return err;349}350 351static struct aead_edesc *aead_edesc_alloc(struct aead_request *req,352					   bool encrypt)353{354	struct crypto_aead *aead = crypto_aead_reqtfm(req);355	struct caam_request *req_ctx = aead_request_ctx_dma(req);356	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];357	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];358	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);359	struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),360						 typeof(*alg), aead);361	struct device *dev = ctx->dev;362	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?363		      GFP_KERNEL : GFP_ATOMIC;364	int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0;365	int src_len, dst_len = 0;366	struct aead_edesc *edesc;367	dma_addr_t qm_sg_dma, iv_dma = 0;368	int ivsize = 0;369	unsigned int authsize = ctx->authsize;370	int qm_sg_index = 0, qm_sg_nents = 0, qm_sg_bytes;371	int in_len, out_len;372	struct dpaa2_sg_entry *sg_table;373 374	/* allocate space for base edesc, link tables and IV */375	edesc = qi_cache_zalloc(flags);376	if (unlikely(!edesc)) {377		dev_err(dev, "could not allocate extended descriptor\n");378		return ERR_PTR(-ENOMEM);379	}380 381	if (unlikely(req->dst != req->src)) {382		src_len = req->assoclen + req->cryptlen;383		dst_len = src_len + (encrypt ? authsize : (-authsize));384 385		src_nents = sg_nents_for_len(req->src, src_len);386		if (unlikely(src_nents < 0)) {387			dev_err(dev, "Insufficient bytes (%d) in src S/G\n",388				src_len);389			qi_cache_free(edesc);390			return ERR_PTR(src_nents);391		}392 393		dst_nents = sg_nents_for_len(req->dst, dst_len);394		if (unlikely(dst_nents < 0)) {395			dev_err(dev, "Insufficient bytes (%d) in dst S/G\n",396				dst_len);397			qi_cache_free(edesc);398			return ERR_PTR(dst_nents);399		}400 401		if (src_nents) {402			mapped_src_nents = dma_map_sg(dev, req->src, src_nents,403						      DMA_TO_DEVICE);404			if (unlikely(!mapped_src_nents)) {405				dev_err(dev, "unable to map source\n");406				qi_cache_free(edesc);407				return ERR_PTR(-ENOMEM);408			}409		} else {410			mapped_src_nents = 0;411		}412 413		if (dst_nents) {414			mapped_dst_nents = dma_map_sg(dev, req->dst, dst_nents,415						      DMA_FROM_DEVICE);416			if (unlikely(!mapped_dst_nents)) {417				dev_err(dev, "unable to map destination\n");418				dma_unmap_sg(dev, req->src, src_nents,419					     DMA_TO_DEVICE);420				qi_cache_free(edesc);421				return ERR_PTR(-ENOMEM);422			}423		} else {424			mapped_dst_nents = 0;425		}426	} else {427		src_len = req->assoclen + req->cryptlen +428			  (encrypt ? authsize : 0);429 430		src_nents = sg_nents_for_len(req->src, src_len);431		if (unlikely(src_nents < 0)) {432			dev_err(dev, "Insufficient bytes (%d) in src S/G\n",433				src_len);434			qi_cache_free(edesc);435			return ERR_PTR(src_nents);436		}437 438		mapped_src_nents = dma_map_sg(dev, req->src, src_nents,439					      DMA_BIDIRECTIONAL);440		if (unlikely(!mapped_src_nents)) {441			dev_err(dev, "unable to map source\n");442			qi_cache_free(edesc);443			return ERR_PTR(-ENOMEM);444		}445	}446 447	if ((alg->caam.rfc3686 && encrypt) || !alg->caam.geniv)448		ivsize = crypto_aead_ivsize(aead);449 450	/*451	 * Create S/G table: req->assoclen, [IV,] req->src [, req->dst].452	 * Input is not contiguous.453	 * HW reads 4 S/G entries at a time; make sure the reads don't go beyond454	 * the end of the table by allocating more S/G entries. Logic:455	 * if (src != dst && output S/G)456	 *      pad output S/G, if needed457	 * else if (src == dst && S/G)458	 *      overlapping S/Gs; pad one of them459	 * else if (input S/G) ...460	 *      pad input S/G, if needed461	 */462	qm_sg_nents = 1 + !!ivsize + mapped_src_nents;463	if (mapped_dst_nents > 1)464		qm_sg_nents += pad_sg_nents(mapped_dst_nents);465	else if ((req->src == req->dst) && (mapped_src_nents > 1))466		qm_sg_nents = max(pad_sg_nents(qm_sg_nents),467				  1 + !!ivsize +468				  pad_sg_nents(mapped_src_nents));469	else470		qm_sg_nents = pad_sg_nents(qm_sg_nents);471 472	sg_table = &edesc->sgt[0];473	qm_sg_bytes = qm_sg_nents * sizeof(*sg_table);474	if (unlikely(offsetof(struct aead_edesc, sgt) + qm_sg_bytes + ivsize >475		     CAAM_QI_MEMCACHE_SIZE)) {476		dev_err(dev, "No space for %d S/G entries and/or %dB IV\n",477			qm_sg_nents, ivsize);478		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 0,479			   0, DMA_NONE, 0, 0);480		qi_cache_free(edesc);481		return ERR_PTR(-ENOMEM);482	}483 484	if (ivsize) {485		u8 *iv = (u8 *)(sg_table + qm_sg_nents);486 487		/* Make sure IV is located in a DMAable area */488		memcpy(iv, req->iv, ivsize);489 490		iv_dma = dma_map_single(dev, iv, ivsize, DMA_TO_DEVICE);491		if (dma_mapping_error(dev, iv_dma)) {492			dev_err(dev, "unable to map IV\n");493			caam_unmap(dev, req->src, req->dst, src_nents,494				   dst_nents, 0, 0, DMA_NONE, 0, 0);495			qi_cache_free(edesc);496			return ERR_PTR(-ENOMEM);497		}498	}499 500	edesc->src_nents = src_nents;501	edesc->dst_nents = dst_nents;502	edesc->iv_dma = iv_dma;503 504	if ((alg->caam.class1_alg_type & OP_ALG_ALGSEL_MASK) ==505	    OP_ALG_ALGSEL_CHACHA20 && ivsize != CHACHAPOLY_IV_SIZE)506		/*507		 * The associated data comes already with the IV but we need508		 * to skip it when we authenticate or encrypt...509		 */510		edesc->assoclen = cpu_to_caam32(req->assoclen - ivsize);511	else512		edesc->assoclen = cpu_to_caam32(req->assoclen);513	edesc->assoclen_dma = dma_map_single(dev, &edesc->assoclen, 4,514					     DMA_TO_DEVICE);515	if (dma_mapping_error(dev, edesc->assoclen_dma)) {516		dev_err(dev, "unable to map assoclen\n");517		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents,518			   iv_dma, ivsize, DMA_TO_DEVICE, 0, 0);519		qi_cache_free(edesc);520		return ERR_PTR(-ENOMEM);521	}522 523	dma_to_qm_sg_one(sg_table, edesc->assoclen_dma, 4, 0);524	qm_sg_index++;525	if (ivsize) {526		dma_to_qm_sg_one(sg_table + qm_sg_index, iv_dma, ivsize, 0);527		qm_sg_index++;528	}529	sg_to_qm_sg_last(req->src, src_len, sg_table + qm_sg_index, 0);530	qm_sg_index += mapped_src_nents;531 532	if (mapped_dst_nents > 1)533		sg_to_qm_sg_last(req->dst, dst_len, sg_table + qm_sg_index, 0);534 535	qm_sg_dma = dma_map_single(dev, sg_table, qm_sg_bytes, DMA_TO_DEVICE);536	if (dma_mapping_error(dev, qm_sg_dma)) {537		dev_err(dev, "unable to map S/G table\n");538		dma_unmap_single(dev, edesc->assoclen_dma, 4, DMA_TO_DEVICE);539		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents,540			   iv_dma, ivsize, DMA_TO_DEVICE, 0, 0);541		qi_cache_free(edesc);542		return ERR_PTR(-ENOMEM);543	}544 545	edesc->qm_sg_dma = qm_sg_dma;546	edesc->qm_sg_bytes = qm_sg_bytes;547 548	out_len = req->assoclen + req->cryptlen +549		  (encrypt ? ctx->authsize : (-ctx->authsize));550	in_len = 4 + ivsize + req->assoclen + req->cryptlen;551 552	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));553	dpaa2_fl_set_final(in_fle, true);554	dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);555	dpaa2_fl_set_addr(in_fle, qm_sg_dma);556	dpaa2_fl_set_len(in_fle, in_len);557 558	if (req->dst == req->src) {559		if (mapped_src_nents == 1) {560			dpaa2_fl_set_format(out_fle, dpaa2_fl_single);561			dpaa2_fl_set_addr(out_fle, sg_dma_address(req->src));562		} else {563			dpaa2_fl_set_format(out_fle, dpaa2_fl_sg);564			dpaa2_fl_set_addr(out_fle, qm_sg_dma +565					  (1 + !!ivsize) * sizeof(*sg_table));566		}567	} else if (!mapped_dst_nents) {568		/*569		 * crypto engine requires the output entry to be present when570		 * "frame list" FD is used.571		 * Since engine does not support FMT=2'b11 (unused entry type),572		 * leaving out_fle zeroized is the best option.573		 */574		goto skip_out_fle;575	} else if (mapped_dst_nents == 1) {576		dpaa2_fl_set_format(out_fle, dpaa2_fl_single);577		dpaa2_fl_set_addr(out_fle, sg_dma_address(req->dst));578	} else {579		dpaa2_fl_set_format(out_fle, dpaa2_fl_sg);580		dpaa2_fl_set_addr(out_fle, qm_sg_dma + qm_sg_index *581				  sizeof(*sg_table));582	}583 584	dpaa2_fl_set_len(out_fle, out_len);585 586skip_out_fle:587	return edesc;588}589 590static int chachapoly_set_sh_desc(struct crypto_aead *aead)591{592	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);593	unsigned int ivsize = crypto_aead_ivsize(aead);594	struct device *dev = ctx->dev;595	struct caam_flc *flc;596	u32 *desc;597 598	if (!ctx->cdata.keylen || !ctx->authsize)599		return 0;600 601	flc = &ctx->flc[ENCRYPT];602	desc = flc->sh_desc;603	cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize,604			       ctx->authsize, true, true);605	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */606	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],607				   sizeof(flc->flc) + desc_bytes(desc),608				   ctx->dir);609 610	flc = &ctx->flc[DECRYPT];611	desc = flc->sh_desc;612	cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize,613			       ctx->authsize, false, true);614	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */615	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],616				   sizeof(flc->flc) + desc_bytes(desc),617				   ctx->dir);618 619	return 0;620}621 622static int chachapoly_setauthsize(struct crypto_aead *aead,623				  unsigned int authsize)624{625	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);626 627	if (authsize != POLY1305_DIGEST_SIZE)628		return -EINVAL;629 630	ctx->authsize = authsize;631	return chachapoly_set_sh_desc(aead);632}633 634static int chachapoly_setkey(struct crypto_aead *aead, const u8 *key,635			     unsigned int keylen)636{637	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);638	unsigned int ivsize = crypto_aead_ivsize(aead);639	unsigned int saltlen = CHACHAPOLY_IV_SIZE - ivsize;640 641	if (keylen != CHACHA_KEY_SIZE + saltlen)642		return -EINVAL;643 644	memcpy(ctx->key, key, keylen);645	ctx->cdata.key_virt = ctx->key;646	ctx->cdata.keylen = keylen - saltlen;647 648	return chachapoly_set_sh_desc(aead);649}650 651static int gcm_set_sh_desc(struct crypto_aead *aead)652{653	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);654	struct device *dev = ctx->dev;655	unsigned int ivsize = crypto_aead_ivsize(aead);656	struct caam_flc *flc;657	u32 *desc;658	int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN -659			ctx->cdata.keylen;660 661	if (!ctx->cdata.keylen || !ctx->authsize)662		return 0;663 664	/*665	 * AES GCM encrypt shared descriptor666	 * Job Descriptor and Shared Descriptor667	 * must fit into the 64-word Descriptor h/w Buffer668	 */669	if (rem_bytes >= DESC_QI_GCM_ENC_LEN) {670		ctx->cdata.key_inline = true;671		ctx->cdata.key_virt = ctx->key;672	} else {673		ctx->cdata.key_inline = false;674		ctx->cdata.key_dma = ctx->key_dma;675	}676 677	flc = &ctx->flc[ENCRYPT];678	desc = flc->sh_desc;679	cnstr_shdsc_gcm_encap(desc, &ctx->cdata, ivsize, ctx->authsize, true);680	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */681	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],682				   sizeof(flc->flc) + desc_bytes(desc),683				   ctx->dir);684 685	/*686	 * Job Descriptor and Shared Descriptors687	 * must all fit into the 64-word Descriptor h/w Buffer688	 */689	if (rem_bytes >= DESC_QI_GCM_DEC_LEN) {690		ctx->cdata.key_inline = true;691		ctx->cdata.key_virt = ctx->key;692	} else {693		ctx->cdata.key_inline = false;694		ctx->cdata.key_dma = ctx->key_dma;695	}696 697	flc = &ctx->flc[DECRYPT];698	desc = flc->sh_desc;699	cnstr_shdsc_gcm_decap(desc, &ctx->cdata, ivsize, ctx->authsize, true);700	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */701	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],702				   sizeof(flc->flc) + desc_bytes(desc),703				   ctx->dir);704 705	return 0;706}707 708static int gcm_setauthsize(struct crypto_aead *authenc, unsigned int authsize)709{710	struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc);711	int err;712 713	err = crypto_gcm_check_authsize(authsize);714	if (err)715		return err;716 717	ctx->authsize = authsize;718	gcm_set_sh_desc(authenc);719 720	return 0;721}722 723static int gcm_setkey(struct crypto_aead *aead,724		      const u8 *key, unsigned int keylen)725{726	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);727	struct device *dev = ctx->dev;728	int ret;729 730	ret = aes_check_keylen(keylen);731	if (ret)732		return ret;733	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",734			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);735 736	memcpy(ctx->key, key, keylen);737	dma_sync_single_for_device(dev, ctx->key_dma, keylen, ctx->dir);738	ctx->cdata.keylen = keylen;739 740	return gcm_set_sh_desc(aead);741}742 743static int rfc4106_set_sh_desc(struct crypto_aead *aead)744{745	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);746	struct device *dev = ctx->dev;747	unsigned int ivsize = crypto_aead_ivsize(aead);748	struct caam_flc *flc;749	u32 *desc;750	int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN -751			ctx->cdata.keylen;752 753	if (!ctx->cdata.keylen || !ctx->authsize)754		return 0;755 756	ctx->cdata.key_virt = ctx->key;757 758	/*759	 * RFC4106 encrypt shared descriptor760	 * Job Descriptor and Shared Descriptor761	 * must fit into the 64-word Descriptor h/w Buffer762	 */763	if (rem_bytes >= DESC_QI_RFC4106_ENC_LEN) {764		ctx->cdata.key_inline = true;765	} else {766		ctx->cdata.key_inline = false;767		ctx->cdata.key_dma = ctx->key_dma;768	}769 770	flc = &ctx->flc[ENCRYPT];771	desc = flc->sh_desc;772	cnstr_shdsc_rfc4106_encap(desc, &ctx->cdata, ivsize, ctx->authsize,773				  true);774	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */775	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],776				   sizeof(flc->flc) + desc_bytes(desc),777				   ctx->dir);778 779	/*780	 * Job Descriptor and Shared Descriptors781	 * must all fit into the 64-word Descriptor h/w Buffer782	 */783	if (rem_bytes >= DESC_QI_RFC4106_DEC_LEN) {784		ctx->cdata.key_inline = true;785	} else {786		ctx->cdata.key_inline = false;787		ctx->cdata.key_dma = ctx->key_dma;788	}789 790	flc = &ctx->flc[DECRYPT];791	desc = flc->sh_desc;792	cnstr_shdsc_rfc4106_decap(desc, &ctx->cdata, ivsize, ctx->authsize,793				  true);794	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */795	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],796				   sizeof(flc->flc) + desc_bytes(desc),797				   ctx->dir);798 799	return 0;800}801 802static int rfc4106_setauthsize(struct crypto_aead *authenc,803			       unsigned int authsize)804{805	struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc);806	int err;807 808	err = crypto_rfc4106_check_authsize(authsize);809	if (err)810		return err;811 812	ctx->authsize = authsize;813	rfc4106_set_sh_desc(authenc);814 815	return 0;816}817 818static int rfc4106_setkey(struct crypto_aead *aead,819			  const u8 *key, unsigned int keylen)820{821	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);822	struct device *dev = ctx->dev;823	int ret;824 825	ret = aes_check_keylen(keylen - 4);826	if (ret)827		return ret;828 829	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",830			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);831 832	memcpy(ctx->key, key, keylen);833	/*834	 * The last four bytes of the key material are used as the salt value835	 * in the nonce. Update the AES key length.836	 */837	ctx->cdata.keylen = keylen - 4;838	dma_sync_single_for_device(dev, ctx->key_dma, ctx->cdata.keylen,839				   ctx->dir);840 841	return rfc4106_set_sh_desc(aead);842}843 844static int rfc4543_set_sh_desc(struct crypto_aead *aead)845{846	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);847	struct device *dev = ctx->dev;848	unsigned int ivsize = crypto_aead_ivsize(aead);849	struct caam_flc *flc;850	u32 *desc;851	int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN -852			ctx->cdata.keylen;853 854	if (!ctx->cdata.keylen || !ctx->authsize)855		return 0;856 857	ctx->cdata.key_virt = ctx->key;858 859	/*860	 * RFC4543 encrypt shared descriptor861	 * Job Descriptor and Shared Descriptor862	 * must fit into the 64-word Descriptor h/w Buffer863	 */864	if (rem_bytes >= DESC_QI_RFC4543_ENC_LEN) {865		ctx->cdata.key_inline = true;866	} else {867		ctx->cdata.key_inline = false;868		ctx->cdata.key_dma = ctx->key_dma;869	}870 871	flc = &ctx->flc[ENCRYPT];872	desc = flc->sh_desc;873	cnstr_shdsc_rfc4543_encap(desc, &ctx->cdata, ivsize, ctx->authsize,874				  true);875	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */876	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],877				   sizeof(flc->flc) + desc_bytes(desc),878				   ctx->dir);879 880	/*881	 * Job Descriptor and Shared Descriptors882	 * must all fit into the 64-word Descriptor h/w Buffer883	 */884	if (rem_bytes >= DESC_QI_RFC4543_DEC_LEN) {885		ctx->cdata.key_inline = true;886	} else {887		ctx->cdata.key_inline = false;888		ctx->cdata.key_dma = ctx->key_dma;889	}890 891	flc = &ctx->flc[DECRYPT];892	desc = flc->sh_desc;893	cnstr_shdsc_rfc4543_decap(desc, &ctx->cdata, ivsize, ctx->authsize,894				  true);895	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */896	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],897				   sizeof(flc->flc) + desc_bytes(desc),898				   ctx->dir);899 900	return 0;901}902 903static int rfc4543_setauthsize(struct crypto_aead *authenc,904			       unsigned int authsize)905{906	struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc);907 908	if (authsize != 16)909		return -EINVAL;910 911	ctx->authsize = authsize;912	rfc4543_set_sh_desc(authenc);913 914	return 0;915}916 917static int rfc4543_setkey(struct crypto_aead *aead,918			  const u8 *key, unsigned int keylen)919{920	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);921	struct device *dev = ctx->dev;922	int ret;923 924	ret = aes_check_keylen(keylen - 4);925	if (ret)926		return ret;927 928	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",929			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);930 931	memcpy(ctx->key, key, keylen);932	/*933	 * The last four bytes of the key material are used as the salt value934	 * in the nonce. Update the AES key length.935	 */936	ctx->cdata.keylen = keylen - 4;937	dma_sync_single_for_device(dev, ctx->key_dma, ctx->cdata.keylen,938				   ctx->dir);939 940	return rfc4543_set_sh_desc(aead);941}942 943static int skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key,944			   unsigned int keylen, const u32 ctx1_iv_off)945{946	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher);947	struct caam_skcipher_alg *alg =948		container_of(crypto_skcipher_alg(skcipher),949			     struct caam_skcipher_alg, skcipher);950	struct device *dev = ctx->dev;951	struct caam_flc *flc;952	unsigned int ivsize = crypto_skcipher_ivsize(skcipher);953	u32 *desc;954	const bool is_rfc3686 = alg->caam.rfc3686;955 956	print_hex_dump_debug("key in @" __stringify(__LINE__)": ",957			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);958 959	ctx->cdata.keylen = keylen;960	ctx->cdata.key_virt = key;961	ctx->cdata.key_inline = true;962 963	/* skcipher_encrypt shared descriptor */964	flc = &ctx->flc[ENCRYPT];965	desc = flc->sh_desc;966	cnstr_shdsc_skcipher_encap(desc, &ctx->cdata, ivsize, is_rfc3686,967				   ctx1_iv_off);968	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */969	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],970				   sizeof(flc->flc) + desc_bytes(desc),971				   ctx->dir);972 973	/* skcipher_decrypt shared descriptor */974	flc = &ctx->flc[DECRYPT];975	desc = flc->sh_desc;976	cnstr_shdsc_skcipher_decap(desc, &ctx->cdata, ivsize, is_rfc3686,977				   ctx1_iv_off);978	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */979	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],980				   sizeof(flc->flc) + desc_bytes(desc),981				   ctx->dir);982 983	return 0;984}985 986static int aes_skcipher_setkey(struct crypto_skcipher *skcipher,987			       const u8 *key, unsigned int keylen)988{989	int err;990 991	err = aes_check_keylen(keylen);992	if (err)993		return err;994 995	return skcipher_setkey(skcipher, key, keylen, 0);996}997 998static int rfc3686_skcipher_setkey(struct crypto_skcipher *skcipher,999				   const u8 *key, unsigned int keylen)1000{1001	u32 ctx1_iv_off;1002	int err;1003 1004	/*1005	 * RFC3686 specific:1006	 *	| CONTEXT1[255:128] = {NONCE, IV, COUNTER}1007	 *	| *key = {KEY, NONCE}1008	 */1009	ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;1010	keylen -= CTR_RFC3686_NONCE_SIZE;1011 1012	err = aes_check_keylen(keylen);1013	if (err)1014		return err;1015 1016	return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off);1017}1018 1019static int ctr_skcipher_setkey(struct crypto_skcipher *skcipher,1020			       const u8 *key, unsigned int keylen)1021{1022	u32 ctx1_iv_off;1023	int err;1024 1025	/*1026	 * AES-CTR needs to load IV in CONTEXT1 reg1027	 * at an offset of 128bits (16bytes)1028	 * CONTEXT1[255:128] = IV1029	 */1030	ctx1_iv_off = 16;1031 1032	err = aes_check_keylen(keylen);1033	if (err)1034		return err;1035 1036	return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off);1037}1038 1039static int chacha20_skcipher_setkey(struct crypto_skcipher *skcipher,1040				    const u8 *key, unsigned int keylen)1041{1042	if (keylen != CHACHA_KEY_SIZE)1043		return -EINVAL;1044 1045	return skcipher_setkey(skcipher, key, keylen, 0);1046}1047 1048static int des_skcipher_setkey(struct crypto_skcipher *skcipher,1049			       const u8 *key, unsigned int keylen)1050{1051	return verify_skcipher_des_key(skcipher, key) ?:1052	       skcipher_setkey(skcipher, key, keylen, 0);1053}1054 1055static int des3_skcipher_setkey(struct crypto_skcipher *skcipher,1056			        const u8 *key, unsigned int keylen)1057{1058	return verify_skcipher_des3_key(skcipher, key) ?:1059	       skcipher_setkey(skcipher, key, keylen, 0);1060}1061 1062static int xts_skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key,1063			       unsigned int keylen)1064{1065	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher);1066	struct device *dev = ctx->dev;1067	struct dpaa2_caam_priv *priv = dev_get_drvdata(dev);1068	struct caam_flc *flc;1069	u32 *desc;1070	int err;1071 1072	err = xts_verify_key(skcipher, key, keylen);1073	if (err) {1074		dev_dbg(dev, "key size mismatch\n");1075		return err;1076	}1077 1078	if (keylen != 2 * AES_KEYSIZE_128 && keylen != 2 * AES_KEYSIZE_256)1079		ctx->xts_key_fallback = true;1080 1081	if (priv->sec_attr.era <= 8 || ctx->xts_key_fallback) {1082		err = crypto_skcipher_setkey(ctx->fallback, key, keylen);1083		if (err)1084			return err;1085	}1086 1087	ctx->cdata.keylen = keylen;1088	ctx->cdata.key_virt = key;1089	ctx->cdata.key_inline = true;1090 1091	/* xts_skcipher_encrypt shared descriptor */1092	flc = &ctx->flc[ENCRYPT];1093	desc = flc->sh_desc;1094	cnstr_shdsc_xts_skcipher_encap(desc, &ctx->cdata);1095	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */1096	dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT],1097				   sizeof(flc->flc) + desc_bytes(desc),1098				   ctx->dir);1099 1100	/* xts_skcipher_decrypt shared descriptor */1101	flc = &ctx->flc[DECRYPT];1102	desc = flc->sh_desc;1103	cnstr_shdsc_xts_skcipher_decap(desc, &ctx->cdata);1104	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */1105	dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT],1106				   sizeof(flc->flc) + desc_bytes(desc),1107				   ctx->dir);1108 1109	return 0;1110}1111 1112static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req)1113{1114	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);1115	struct caam_request *req_ctx = skcipher_request_ctx_dma(req);1116	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];1117	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];1118	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher);1119	struct device *dev = ctx->dev;1120	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?1121		       GFP_KERNEL : GFP_ATOMIC;1122	int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0;1123	struct skcipher_edesc *edesc;1124	dma_addr_t iv_dma;1125	u8 *iv;1126	int ivsize = crypto_skcipher_ivsize(skcipher);1127	int dst_sg_idx, qm_sg_ents, qm_sg_bytes;1128	struct dpaa2_sg_entry *sg_table;1129 1130	src_nents = sg_nents_for_len(req->src, req->cryptlen);1131	if (unlikely(src_nents < 0)) {1132		dev_err(dev, "Insufficient bytes (%d) in src S/G\n",1133			req->cryptlen);1134		return ERR_PTR(src_nents);1135	}1136 1137	if (unlikely(req->dst != req->src)) {1138		dst_nents = sg_nents_for_len(req->dst, req->cryptlen);1139		if (unlikely(dst_nents < 0)) {1140			dev_err(dev, "Insufficient bytes (%d) in dst S/G\n",1141				req->cryptlen);1142			return ERR_PTR(dst_nents);1143		}1144 1145		mapped_src_nents = dma_map_sg(dev, req->src, src_nents,1146					      DMA_TO_DEVICE);1147		if (unlikely(!mapped_src_nents)) {1148			dev_err(dev, "unable to map source\n");1149			return ERR_PTR(-ENOMEM);1150		}1151 1152		mapped_dst_nents = dma_map_sg(dev, req->dst, dst_nents,1153					      DMA_FROM_DEVICE);1154		if (unlikely(!mapped_dst_nents)) {1155			dev_err(dev, "unable to map destination\n");1156			dma_unmap_sg(dev, req->src, src_nents, DMA_TO_DEVICE);1157			return ERR_PTR(-ENOMEM);1158		}1159	} else {1160		mapped_src_nents = dma_map_sg(dev, req->src, src_nents,1161					      DMA_BIDIRECTIONAL);1162		if (unlikely(!mapped_src_nents)) {1163			dev_err(dev, "unable to map source\n");1164			return ERR_PTR(-ENOMEM);1165		}1166	}1167 1168	qm_sg_ents = 1 + mapped_src_nents;1169	dst_sg_idx = qm_sg_ents;1170 1171	/*1172	 * Input, output HW S/G tables: [IV, src][dst, IV]1173	 * IV entries point to the same buffer1174	 * If src == dst, S/G entries are reused (S/G tables overlap)1175	 *1176	 * HW reads 4 S/G entries at a time; make sure the reads don't go beyond1177	 * the end of the table by allocating more S/G entries.1178	 */1179	if (req->src != req->dst)1180		qm_sg_ents += pad_sg_nents(mapped_dst_nents + 1);1181	else1182		qm_sg_ents = 1 + pad_sg_nents(qm_sg_ents);1183 1184	qm_sg_bytes = qm_sg_ents * sizeof(struct dpaa2_sg_entry);1185	if (unlikely(offsetof(struct skcipher_edesc, sgt) + qm_sg_bytes +1186		     ivsize > CAAM_QI_MEMCACHE_SIZE)) {1187		dev_err(dev, "No space for %d S/G entries and/or %dB IV\n",1188			qm_sg_ents, ivsize);1189		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 0,1190			   0, DMA_NONE, 0, 0);1191		return ERR_PTR(-ENOMEM);1192	}1193 1194	/* allocate space for base edesc, link tables and IV */1195	edesc = qi_cache_zalloc(flags);1196	if (unlikely(!edesc)) {1197		dev_err(dev, "could not allocate extended descriptor\n");1198		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 0,1199			   0, DMA_NONE, 0, 0);1200		return ERR_PTR(-ENOMEM);1201	}1202 1203	/* Make sure IV is located in a DMAable area */1204	sg_table = &edesc->sgt[0];1205	iv = (u8 *)(sg_table + qm_sg_ents);1206	memcpy(iv, req->iv, ivsize);1207 1208	iv_dma = dma_map_single(dev, iv, ivsize, DMA_BIDIRECTIONAL);1209	if (dma_mapping_error(dev, iv_dma)) {1210		dev_err(dev, "unable to map IV\n");1211		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 0,1212			   0, DMA_NONE, 0, 0);1213		qi_cache_free(edesc);1214		return ERR_PTR(-ENOMEM);1215	}1216 1217	edesc->src_nents = src_nents;1218	edesc->dst_nents = dst_nents;1219	edesc->iv_dma = iv_dma;1220	edesc->qm_sg_bytes = qm_sg_bytes;1221 1222	dma_to_qm_sg_one(sg_table, iv_dma, ivsize, 0);1223	sg_to_qm_sg(req->src, req->cryptlen, sg_table + 1, 0);1224 1225	if (req->src != req->dst)1226		sg_to_qm_sg(req->dst, req->cryptlen, sg_table + dst_sg_idx, 0);1227 1228	dma_to_qm_sg_one(sg_table + dst_sg_idx + mapped_dst_nents, iv_dma,1229			 ivsize, 0);1230 1231	edesc->qm_sg_dma = dma_map_single(dev, sg_table, edesc->qm_sg_bytes,1232					  DMA_TO_DEVICE);1233	if (dma_mapping_error(dev, edesc->qm_sg_dma)) {1234		dev_err(dev, "unable to map S/G table\n");1235		caam_unmap(dev, req->src, req->dst, src_nents, dst_nents,1236			   iv_dma, ivsize, DMA_BIDIRECTIONAL, 0, 0);1237		qi_cache_free(edesc);1238		return ERR_PTR(-ENOMEM);1239	}1240 1241	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));1242	dpaa2_fl_set_final(in_fle, true);1243	dpaa2_fl_set_len(in_fle, req->cryptlen + ivsize);1244	dpaa2_fl_set_len(out_fle, req->cryptlen + ivsize);1245 1246	dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);1247	dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);1248 1249	dpaa2_fl_set_format(out_fle, dpaa2_fl_sg);1250 1251	if (req->src == req->dst)1252		dpaa2_fl_set_addr(out_fle, edesc->qm_sg_dma +1253				  sizeof(*sg_table));1254	else1255		dpaa2_fl_set_addr(out_fle, edesc->qm_sg_dma + dst_sg_idx *1256				  sizeof(*sg_table));1257 1258	return edesc;1259}1260 1261static void aead_unmap(struct device *dev, struct aead_edesc *edesc,1262		       struct aead_request *req)1263{1264	struct crypto_aead *aead = crypto_aead_reqtfm(req);1265	int ivsize = crypto_aead_ivsize(aead);1266 1267	caam_unmap(dev, req->src, req->dst, edesc->src_nents, edesc->dst_nents,1268		   edesc->iv_dma, ivsize, DMA_TO_DEVICE, edesc->qm_sg_dma,1269		   edesc->qm_sg_bytes);1270	dma_unmap_single(dev, edesc->assoclen_dma, 4, DMA_TO_DEVICE);1271}1272 1273static void skcipher_unmap(struct device *dev, struct skcipher_edesc *edesc,1274			   struct skcipher_request *req)1275{1276	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);1277	int ivsize = crypto_skcipher_ivsize(skcipher);1278 1279	caam_unmap(dev, req->src, req->dst, edesc->src_nents, edesc->dst_nents,1280		   edesc->iv_dma, ivsize, DMA_BIDIRECTIONAL, edesc->qm_sg_dma,1281		   edesc->qm_sg_bytes);1282}1283 1284static void aead_encrypt_done(void *cbk_ctx, u32 status)1285{1286	struct crypto_async_request *areq = cbk_ctx;1287	struct aead_request *req = container_of(areq, struct aead_request,1288						base);1289	struct caam_request *req_ctx = to_caam_req(areq);1290	struct aead_edesc *edesc = req_ctx->edesc;1291	struct crypto_aead *aead = crypto_aead_reqtfm(req);1292	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);1293	int ecode = 0;1294 1295	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);1296 1297	if (unlikely(status))1298		ecode = caam_qi2_strstatus(ctx->dev, status);1299 1300	aead_unmap(ctx->dev, edesc, req);1301	qi_cache_free(edesc);1302	aead_request_complete(req, ecode);1303}1304 1305static void aead_decrypt_done(void *cbk_ctx, u32 status)1306{1307	struct crypto_async_request *areq = cbk_ctx;1308	struct aead_request *req = container_of(areq, struct aead_request,1309						base);1310	struct caam_request *req_ctx = to_caam_req(areq);1311	struct aead_edesc *edesc = req_ctx->edesc;1312	struct crypto_aead *aead = crypto_aead_reqtfm(req);1313	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);1314	int ecode = 0;1315 1316	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);1317 1318	if (unlikely(status))1319		ecode = caam_qi2_strstatus(ctx->dev, status);1320 1321	aead_unmap(ctx->dev, edesc, req);1322	qi_cache_free(edesc);1323	aead_request_complete(req, ecode);1324}1325 1326static int aead_encrypt(struct aead_request *req)1327{1328	struct aead_edesc *edesc;1329	struct crypto_aead *aead = crypto_aead_reqtfm(req);1330	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);1331	struct caam_request *caam_req = aead_request_ctx_dma(req);1332	int ret;1333 1334	/* allocate extended descriptor */1335	edesc = aead_edesc_alloc(req, true);1336	if (IS_ERR(edesc))1337		return PTR_ERR(edesc);1338 1339	caam_req->flc = &ctx->flc[ENCRYPT];1340	caam_req->flc_dma = ctx->flc_dma[ENCRYPT];1341	caam_req->cbk = aead_encrypt_done;1342	caam_req->ctx = &req->base;1343	caam_req->edesc = edesc;1344	ret = dpaa2_caam_enqueue(ctx->dev, caam_req);1345	if (ret != -EINPROGRESS &&1346	    !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {1347		aead_unmap(ctx->dev, edesc, req);1348		qi_cache_free(edesc);1349	}1350 1351	return ret;1352}1353 1354static int aead_decrypt(struct aead_request *req)1355{1356	struct aead_edesc *edesc;1357	struct crypto_aead *aead = crypto_aead_reqtfm(req);1358	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);1359	struct caam_request *caam_req = aead_request_ctx_dma(req);1360	int ret;1361 1362	/* allocate extended descriptor */1363	edesc = aead_edesc_alloc(req, false);1364	if (IS_ERR(edesc))1365		return PTR_ERR(edesc);1366 1367	caam_req->flc = &ctx->flc[DECRYPT];1368	caam_req->flc_dma = ctx->flc_dma[DECRYPT];1369	caam_req->cbk = aead_decrypt_done;1370	caam_req->ctx = &req->base;1371	caam_req->edesc = edesc;1372	ret = dpaa2_caam_enqueue(ctx->dev, caam_req);1373	if (ret != -EINPROGRESS &&1374	    !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {1375		aead_unmap(ctx->dev, edesc, req);1376		qi_cache_free(edesc);1377	}1378 1379	return ret;1380}1381 1382static int ipsec_gcm_encrypt(struct aead_request *req)1383{1384	return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_encrypt(req);1385}1386 1387static int ipsec_gcm_decrypt(struct aead_request *req)1388{1389	return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_decrypt(req);1390}1391 1392static void skcipher_encrypt_done(void *cbk_ctx, u32 status)1393{1394	struct crypto_async_request *areq = cbk_ctx;1395	struct skcipher_request *req = skcipher_request_cast(areq);1396	struct caam_request *req_ctx = to_caam_req(areq);1397	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);1398	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher);1399	struct skcipher_edesc *edesc = req_ctx->edesc;1400	int ecode = 0;1401	int ivsize = crypto_skcipher_ivsize(skcipher);1402 1403	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);1404 1405	if (unlikely(status))1406		ecode = caam_qi2_strstatus(ctx->dev, status);1407 1408	print_hex_dump_debug("dstiv  @" __stringify(__LINE__)": ",1409			     DUMP_PREFIX_ADDRESS, 16, 4, req->iv,1410			     edesc->src_nents > 1 ? 100 : ivsize, 1);1411	caam_dump_sg("dst    @" __stringify(__LINE__)": ",1412		     DUMP_PREFIX_ADDRESS, 16, 4, req->dst,1413		     edesc->dst_nents > 1 ? 100 : req->cryptlen, 1);1414 1415	skcipher_unmap(ctx->dev, edesc, req);1416 1417	/*1418	 * The crypto API expects us to set the IV (req->iv) to the last1419	 * ciphertext block (CBC mode) or last counter (CTR mode).1420	 * This is used e.g. by the CTS mode.1421	 */1422	if (!ecode)1423		memcpy(req->iv, (u8 *)&edesc->sgt[0] + edesc->qm_sg_bytes,1424		       ivsize);1425 1426	qi_cache_free(edesc);1427	skcipher_request_complete(req, ecode);1428}1429 1430static void skcipher_decrypt_done(void *cbk_ctx, u32 status)1431{1432	struct crypto_async_request *areq = cbk_ctx;1433	struct skcipher_request *req = skcipher_request_cast(areq);1434	struct caam_request *req_ctx = to_caam_req(areq);1435	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);1436	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher);1437	struct skcipher_edesc *edesc = req_ctx->edesc;1438	int ecode = 0;1439	int ivsize = crypto_skcipher_ivsize(skcipher);1440 1441	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);1442 1443	if (unlikely(status))1444		ecode = caam_qi2_strstatus(ctx->dev, status);1445 1446	print_hex_dump_debug("dstiv  @" __stringify(__LINE__)": ",1447			     DUMP_PREFIX_ADDRESS, 16, 4, req->iv,1448			     edesc->src_nents > 1 ? 100 : ivsize, 1);1449	caam_dump_sg("dst    @" __stringify(__LINE__)": ",1450		     DUMP_PREFIX_ADDRESS, 16, 4, req->dst,1451		     edesc->dst_nents > 1 ? 100 : req->cryptlen, 1);1452 1453	skcipher_unmap(ctx->dev, edesc, req);1454 1455	/*1456	 * The crypto API expects us to set the IV (req->iv) to the last1457	 * ciphertext block (CBC mode) or last counter (CTR mode).1458	 * This is used e.g. by the CTS mode.1459	 */1460	if (!ecode)1461		memcpy(req->iv, (u8 *)&edesc->sgt[0] + edesc->qm_sg_bytes,1462		       ivsize);1463 1464	qi_cache_free(edesc);1465	skcipher_request_complete(req, ecode);1466}1467 1468static inline bool xts_skcipher_ivsize(struct skcipher_request *req)1469{1470	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);1471	unsigned int ivsize = crypto_skcipher_ivsize(skcipher);1472 1473	return !!get_unaligned((u64 *)(req->iv + (ivsize / 2)));1474}1475 1476static int skcipher_encrypt(struct skcipher_request *req)1477{1478	struct skcipher_edesc *edesc;1479	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);1480	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher);1481	struct caam_request *caam_req = skcipher_request_ctx_dma(req);1482	struct dpaa2_caam_priv *priv = dev_get_drvdata(ctx->dev);1483	int ret;1484 1485	/*1486	 * XTS is expected to return an error even for input length = 01487	 * Note that the case input length < block size will be caught during1488	 * HW offloading and return an error.1489	 */1490	if (!req->cryptlen && !ctx->fallback)1491		return 0;1492 1493	if (ctx->fallback && ((priv->sec_attr.era <= 8 && xts_skcipher_ivsize(req)) ||1494			      ctx->xts_key_fallback)) {1495		skcipher_request_set_tfm(&caam_req->fallback_req, ctx->fallback);1496		skcipher_request_set_callback(&caam_req->fallback_req,1497					      req->base.flags,1498					      req->base.complete,1499					      req->base.data);1500		skcipher_request_set_crypt(&caam_req->fallback_req, req->src,1501					   req->dst, req->cryptlen, req->iv);1502 1503		return crypto_skcipher_encrypt(&caam_req->fallback_req);1504	}1505 1506	/* allocate extended descriptor */1507	edesc = skcipher_edesc_alloc(req);1508	if (IS_ERR(edesc))1509		return PTR_ERR(edesc);1510 1511	caam_req->flc = &ctx->flc[ENCRYPT];1512	caam_req->flc_dma = ctx->flc_dma[ENCRYPT];1513	caam_req->cbk = skcipher_encrypt_done;1514	caam_req->ctx = &req->base;1515	caam_req->edesc = edesc;1516	ret = dpaa2_caam_enqueue(ctx->dev, caam_req);1517	if (ret != -EINPROGRESS &&1518	    !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {1519		skcipher_unmap(ctx->dev, edesc, req);1520		qi_cache_free(edesc);1521	}1522 1523	return ret;1524}1525 1526static int skcipher_decrypt(struct skcipher_request *req)1527{1528	struct skcipher_edesc *edesc;1529	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);1530	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher);1531	struct caam_request *caam_req = skcipher_request_ctx_dma(req);1532	struct dpaa2_caam_priv *priv = dev_get_drvdata(ctx->dev);1533	int ret;1534 1535	/*1536	 * XTS is expected to return an error even for input length = 01537	 * Note that the case input length < block size will be caught during1538	 * HW offloading and return an error.1539	 */1540	if (!req->cryptlen && !ctx->fallback)1541		return 0;1542 1543	if (ctx->fallback && ((priv->sec_attr.era <= 8 && xts_skcipher_ivsize(req)) ||1544			      ctx->xts_key_fallback)) {1545		skcipher_request_set_tfm(&caam_req->fallback_req, ctx->fallback);1546		skcipher_request_set_callback(&caam_req->fallback_req,1547					      req->base.flags,1548					      req->base.complete,1549					      req->base.data);1550		skcipher_request_set_crypt(&caam_req->fallback_req, req->src,1551					   req->dst, req->cryptlen, req->iv);1552 1553		return crypto_skcipher_decrypt(&caam_req->fallback_req);1554	}1555 1556	/* allocate extended descriptor */1557	edesc = skcipher_edesc_alloc(req);1558	if (IS_ERR(edesc))1559		return PTR_ERR(edesc);1560 1561	caam_req->flc = &ctx->flc[DECRYPT];1562	caam_req->flc_dma = ctx->flc_dma[DECRYPT];1563	caam_req->cbk = skcipher_decrypt_done;1564	caam_req->ctx = &req->base;1565	caam_req->edesc = edesc;1566	ret = dpaa2_caam_enqueue(ctx->dev, caam_req);1567	if (ret != -EINPROGRESS &&1568	    !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {1569		skcipher_unmap(ctx->dev, edesc, req);1570		qi_cache_free(edesc);1571	}1572 1573	return ret;1574}1575 1576static int caam_cra_init(struct caam_ctx *ctx, struct caam_alg_entry *caam,1577			 bool uses_dkp)1578{1579	dma_addr_t dma_addr;1580	int i;1581 1582	/* copy descriptor header template value */1583	ctx->cdata.algtype = OP_TYPE_CLASS1_ALG | caam->class1_alg_type;1584	ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam->class2_alg_type;1585 1586	ctx->dev = caam->dev;1587	ctx->dir = uses_dkp ? DMA_BIDIRECTIONAL : DMA_TO_DEVICE;1588 1589	dma_addr = dma_map_single_attrs(ctx->dev, ctx->flc,1590					offsetof(struct caam_ctx, flc_dma),1591					ctx->dir, DMA_ATTR_SKIP_CPU_SYNC);1592	if (dma_mapping_error(ctx->dev, dma_addr)) {1593		dev_err(ctx->dev, "unable to map key, shared descriptors\n");1594		return -ENOMEM;1595	}1596 1597	for (i = 0; i < NUM_OP; i++)1598		ctx->flc_dma[i] = dma_addr + i * sizeof(ctx->flc[i]);1599	ctx->key_dma = dma_addr + NUM_OP * sizeof(ctx->flc[0]);1600 1601	return 0;1602}1603 1604static int caam_cra_init_skcipher(struct crypto_skcipher *tfm)1605{1606	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);1607	struct caam_skcipher_alg *caam_alg =1608		container_of(alg, typeof(*caam_alg), skcipher);1609	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(tfm);1610	u32 alg_aai = caam_alg->caam.class1_alg_type & OP_ALG_AAI_MASK;1611	int ret = 0;1612 1613	if (alg_aai == OP_ALG_AAI_XTS) {1614		const char *tfm_name = crypto_tfm_alg_name(&tfm->base);1615		struct crypto_skcipher *fallback;1616 1617		fallback = crypto_alloc_skcipher(tfm_name, 0,1618						 CRYPTO_ALG_NEED_FALLBACK);1619		if (IS_ERR(fallback)) {1620			dev_err(caam_alg->caam.dev,1621				"Failed to allocate %s fallback: %ld\n",1622				tfm_name, PTR_ERR(fallback));1623			return PTR_ERR(fallback);1624		}1625 1626		ctx->fallback = fallback;1627		crypto_skcipher_set_reqsize_dma(1628			tfm, sizeof(struct caam_request) +1629			     crypto_skcipher_reqsize(fallback));1630	} else {1631		crypto_skcipher_set_reqsize_dma(tfm,1632						sizeof(struct caam_request));1633	}1634 1635	ret = caam_cra_init(ctx, &caam_alg->caam, false);1636	if (ret && ctx->fallback)1637		crypto_free_skcipher(ctx->fallback);1638 1639	return ret;1640}1641 1642static int caam_cra_init_aead(struct crypto_aead *tfm)1643{1644	struct aead_alg *alg = crypto_aead_alg(tfm);1645	struct caam_aead_alg *caam_alg = container_of(alg, typeof(*caam_alg),1646						      aead);1647 1648	crypto_aead_set_reqsize_dma(tfm, sizeof(struct caam_request));1649	return caam_cra_init(crypto_aead_ctx_dma(tfm), &caam_alg->caam,1650			     !caam_alg->caam.nodkp);1651}1652 1653static void caam_exit_common(struct caam_ctx *ctx)1654{1655	dma_unmap_single_attrs(ctx->dev, ctx->flc_dma[0],1656			       offsetof(struct caam_ctx, flc_dma), ctx->dir,1657			       DMA_ATTR_SKIP_CPU_SYNC);1658}1659 1660static void caam_cra_exit(struct crypto_skcipher *tfm)1661{1662	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(tfm);1663 1664	if (ctx->fallback)1665		crypto_free_skcipher(ctx->fallback);1666	caam_exit_common(ctx);1667}1668 1669static void caam_cra_exit_aead(struct crypto_aead *tfm)1670{1671	caam_exit_common(crypto_aead_ctx_dma(tfm));1672}1673 1674static struct caam_skcipher_alg driver_algs[] = {1675	{1676		.skcipher = {1677			.base = {1678				.cra_name = "cbc(aes)",1679				.cra_driver_name = "cbc-aes-caam-qi2",1680				.cra_blocksize = AES_BLOCK_SIZE,1681			},1682			.setkey = aes_skcipher_setkey,1683			.encrypt = skcipher_encrypt,1684			.decrypt = skcipher_decrypt,1685			.min_keysize = AES_MIN_KEY_SIZE,1686			.max_keysize = AES_MAX_KEY_SIZE,1687			.ivsize = AES_BLOCK_SIZE,1688		},1689		.caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,1690	},1691	{1692		.skcipher = {1693			.base = {1694				.cra_name = "cbc(des3_ede)",1695				.cra_driver_name = "cbc-3des-caam-qi2",1696				.cra_blocksize = DES3_EDE_BLOCK_SIZE,1697			},1698			.setkey = des3_skcipher_setkey,1699			.encrypt = skcipher_encrypt,1700			.decrypt = skcipher_decrypt,1701			.min_keysize = DES3_EDE_KEY_SIZE,1702			.max_keysize = DES3_EDE_KEY_SIZE,1703			.ivsize = DES3_EDE_BLOCK_SIZE,1704		},1705		.caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,1706	},1707	{1708		.skcipher = {1709			.base = {1710				.cra_name = "cbc(des)",1711				.cra_driver_name = "cbc-des-caam-qi2",1712				.cra_blocksize = DES_BLOCK_SIZE,1713			},1714			.setkey = des_skcipher_setkey,1715			.encrypt = skcipher_encrypt,1716			.decrypt = skcipher_decrypt,1717			.min_keysize = DES_KEY_SIZE,1718			.max_keysize = DES_KEY_SIZE,1719			.ivsize = DES_BLOCK_SIZE,1720		},1721		.caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,1722	},1723	{1724		.skcipher = {1725			.base = {1726				.cra_name = "ctr(aes)",1727				.cra_driver_name = "ctr-aes-caam-qi2",1728				.cra_blocksize = 1,1729			},1730			.setkey = ctr_skcipher_setkey,1731			.encrypt = skcipher_encrypt,1732			.decrypt = skcipher_decrypt,1733			.min_keysize = AES_MIN_KEY_SIZE,1734			.max_keysize = AES_MAX_KEY_SIZE,1735			.ivsize = AES_BLOCK_SIZE,1736			.chunksize = AES_BLOCK_SIZE,1737		},1738		.caam.class1_alg_type = OP_ALG_ALGSEL_AES |1739					OP_ALG_AAI_CTR_MOD128,1740	},1741	{1742		.skcipher = {1743			.base = {1744				.cra_name = "rfc3686(ctr(aes))",1745				.cra_driver_name = "rfc3686-ctr-aes-caam-qi2",1746				.cra_blocksize = 1,1747			},1748			.setkey = rfc3686_skcipher_setkey,1749			.encrypt = skcipher_encrypt,1750			.decrypt = skcipher_decrypt,1751			.min_keysize = AES_MIN_KEY_SIZE +1752				       CTR_RFC3686_NONCE_SIZE,1753			.max_keysize = AES_MAX_KEY_SIZE +1754				       CTR_RFC3686_NONCE_SIZE,1755			.ivsize = CTR_RFC3686_IV_SIZE,1756			.chunksize = AES_BLOCK_SIZE,1757		},1758		.caam = {1759			.class1_alg_type = OP_ALG_ALGSEL_AES |1760					   OP_ALG_AAI_CTR_MOD128,1761			.rfc3686 = true,1762		},1763	},1764	{1765		.skcipher = {1766			.base = {1767				.cra_name = "xts(aes)",1768				.cra_driver_name = "xts-aes-caam-qi2",1769				.cra_flags = CRYPTO_ALG_NEED_FALLBACK,1770				.cra_blocksize = AES_BLOCK_SIZE,1771			},1772			.setkey = xts_skcipher_setkey,1773			.encrypt = skcipher_encrypt,1774			.decrypt = skcipher_decrypt,1775			.min_keysize = 2 * AES_MIN_KEY_SIZE,1776			.max_keysize = 2 * AES_MAX_KEY_SIZE,1777			.ivsize = AES_BLOCK_SIZE,1778		},1779		.caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_XTS,1780	},1781	{1782		.skcipher = {1783			.base = {1784				.cra_name = "chacha20",1785				.cra_driver_name = "chacha20-caam-qi2",1786				.cra_blocksize = 1,1787			},1788			.setkey = chacha20_skcipher_setkey,1789			.encrypt = skcipher_encrypt,1790			.decrypt = skcipher_decrypt,1791			.min_keysize = CHACHA_KEY_SIZE,1792			.max_keysize = CHACHA_KEY_SIZE,1793			.ivsize = CHACHA_IV_SIZE,1794		},1795		.caam.class1_alg_type = OP_ALG_ALGSEL_CHACHA20,1796	},1797};1798 1799static struct caam_aead_alg driver_aeads[] = {1800	{1801		.aead = {1802			.base = {1803				.cra_name = "rfc4106(gcm(aes))",1804				.cra_driver_name = "rfc4106-gcm-aes-caam-qi2",1805				.cra_blocksize = 1,1806			},1807			.setkey = rfc4106_setkey,1808			.setauthsize = rfc4106_setauthsize,1809			.encrypt = ipsec_gcm_encrypt,1810			.decrypt = ipsec_gcm_decrypt,1811			.ivsize = 8,1812			.maxauthsize = AES_BLOCK_SIZE,1813		},1814		.caam = {1815			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,1816			.nodkp = true,1817		},1818	},1819	{1820		.aead = {1821			.base = {1822				.cra_name = "rfc4543(gcm(aes))",1823				.cra_driver_name = "rfc4543-gcm-aes-caam-qi2",1824				.cra_blocksize = 1,1825			},1826			.setkey = rfc4543_setkey,1827			.setauthsize = rfc4543_setauthsize,1828			.encrypt = ipsec_gcm_encrypt,1829			.decrypt = ipsec_gcm_decrypt,1830			.ivsize = 8,1831			.maxauthsize = AES_BLOCK_SIZE,1832		},1833		.caam = {1834			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,1835			.nodkp = true,1836		},1837	},1838	/* Galois Counter Mode */1839	{1840		.aead = {1841			.base = {1842				.cra_name = "gcm(aes)",1843				.cra_driver_name = "gcm-aes-caam-qi2",1844				.cra_blocksize = 1,1845			},1846			.setkey = gcm_setkey,1847			.setauthsize = gcm_setauthsize,1848			.encrypt = aead_encrypt,1849			.decrypt = aead_decrypt,1850			.ivsize = 12,1851			.maxauthsize = AES_BLOCK_SIZE,1852		},1853		.caam = {1854			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,1855			.nodkp = true,1856		}1857	},1858	/* single-pass ipsec_esp descriptor */1859	{1860		.aead = {1861			.base = {1862				.cra_name = "authenc(hmac(md5),cbc(aes))",1863				.cra_driver_name = "authenc-hmac-md5-"1864						   "cbc-aes-caam-qi2",1865				.cra_blocksize = AES_BLOCK_SIZE,1866			},1867			.setkey = aead_setkey,1868			.setauthsize = aead_setauthsize,1869			.encrypt = aead_encrypt,1870			.decrypt = aead_decrypt,1871			.ivsize = AES_BLOCK_SIZE,1872			.maxauthsize = MD5_DIGEST_SIZE,1873		},1874		.caam = {1875			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,1876			.class2_alg_type = OP_ALG_ALGSEL_MD5 |1877					   OP_ALG_AAI_HMAC_PRECOMP,1878		}1879	},1880	{1881		.aead = {1882			.base = {1883				.cra_name = "echainiv(authenc(hmac(md5),"1884					    "cbc(aes)))",1885				.cra_driver_name = "echainiv-authenc-hmac-md5-"1886						   "cbc-aes-caam-qi2",1887				.cra_blocksize = AES_BLOCK_SIZE,1888			},1889			.setkey = aead_setkey,1890			.setauthsize = aead_setauthsize,1891			.encrypt = aead_encrypt,1892			.decrypt = aead_decrypt,1893			.ivsize = AES_BLOCK_SIZE,1894			.maxauthsize = MD5_DIGEST_SIZE,1895		},1896		.caam = {1897			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,1898			.class2_alg_type = OP_ALG_ALGSEL_MD5 |1899					   OP_ALG_AAI_HMAC_PRECOMP,1900			.geniv = true,1901		}1902	},1903	{1904		.aead = {1905			.base = {1906				.cra_name = "authenc(hmac(sha1),cbc(aes))",1907				.cra_driver_name = "authenc-hmac-sha1-"1908						   "cbc-aes-caam-qi2",1909				.cra_blocksize = AES_BLOCK_SIZE,1910			},1911			.setkey = aead_setkey,1912			.setauthsize = aead_setauthsize,1913			.encrypt = aead_encrypt,1914			.decrypt = aead_decrypt,1915			.ivsize = AES_BLOCK_SIZE,1916			.maxauthsize = SHA1_DIGEST_SIZE,1917		},1918		.caam = {1919			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,1920			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |1921					   OP_ALG_AAI_HMAC_PRECOMP,1922		}1923	},1924	{1925		.aead = {1926			.base = {1927				.cra_name = "echainiv(authenc(hmac(sha1),"1928					    "cbc(aes)))",1929				.cra_driver_name = "echainiv-authenc-"1930						   "hmac-sha1-cbc-aes-caam-qi2",1931				.cra_blocksize = AES_BLOCK_SIZE,1932			},1933			.setkey = aead_setkey,1934			.setauthsize = aead_setauthsize,1935			.encrypt = aead_encrypt,1936			.decrypt = aead_decrypt,1937			.ivsize = AES_BLOCK_SIZE,1938			.maxauthsize = SHA1_DIGEST_SIZE,1939		},1940		.caam = {1941			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,1942			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |1943					   OP_ALG_AAI_HMAC_PRECOMP,1944			.geniv = true,1945		},1946	},1947	{1948		.aead = {1949			.base = {1950				.cra_name = "authenc(hmac(sha224),cbc(aes))",1951				.cra_driver_name = "authenc-hmac-sha224-"1952						   "cbc-aes-caam-qi2",1953				.cra_blocksize = AES_BLOCK_SIZE,1954			},1955			.setkey = aead_setkey,1956			.setauthsize = aead_setauthsize,1957			.encrypt = aead_encrypt,1958			.decrypt = aead_decrypt,1959			.ivsize = AES_BLOCK_SIZE,1960			.maxauthsize = SHA224_DIGEST_SIZE,1961		},1962		.caam = {1963			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,1964			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |1965					   OP_ALG_AAI_HMAC_PRECOMP,1966		}1967	},1968	{1969		.aead = {1970			.base = {1971				.cra_name = "echainiv(authenc(hmac(sha224),"1972					    "cbc(aes)))",1973				.cra_driver_name = "echainiv-authenc-"1974						   "hmac-sha224-cbc-aes-caam-qi2",1975				.cra_blocksize = AES_BLOCK_SIZE,1976			},1977			.setkey = aead_setkey,1978			.setauthsize = aead_setauthsize,1979			.encrypt = aead_encrypt,1980			.decrypt = aead_decrypt,1981			.ivsize = AES_BLOCK_SIZE,1982			.maxauthsize = SHA224_DIGEST_SIZE,1983		},1984		.caam = {1985			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,1986			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |1987					   OP_ALG_AAI_HMAC_PRECOMP,1988			.geniv = true,1989		}1990	},1991	{1992		.aead = {1993			.base = {1994				.cra_name = "authenc(hmac(sha256),cbc(aes))",1995				.cra_driver_name = "authenc-hmac-sha256-"1996						   "cbc-aes-caam-qi2",1997				.cra_blocksize = AES_BLOCK_SIZE,1998			},1999			.setkey = aead_setkey,2000			.setauthsize = aead_setauthsize,2001			.encrypt = aead_encrypt,2002			.decrypt = aead_decrypt,2003			.ivsize = AES_BLOCK_SIZE,2004			.maxauthsize = SHA256_DIGEST_SIZE,2005		},2006		.caam = {2007			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,2008			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |2009					   OP_ALG_AAI_HMAC_PRECOMP,2010		}2011	},2012	{2013		.aead = {2014			.base = {2015				.cra_name = "echainiv(authenc(hmac(sha256),"2016					    "cbc(aes)))",2017				.cra_driver_name = "echainiv-authenc-"2018						   "hmac-sha256-cbc-aes-"2019						   "caam-qi2",2020				.cra_blocksize = AES_BLOCK_SIZE,2021			},2022			.setkey = aead_setkey,2023			.setauthsize = aead_setauthsize,2024			.encrypt = aead_encrypt,2025			.decrypt = aead_decrypt,2026			.ivsize = AES_BLOCK_SIZE,2027			.maxauthsize = SHA256_DIGEST_SIZE,2028		},2029		.caam = {2030			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,2031			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |2032					   OP_ALG_AAI_HMAC_PRECOMP,2033			.geniv = true,2034		}2035	},2036	{2037		.aead = {2038			.base = {2039				.cra_name = "authenc(hmac(sha384),cbc(aes))",2040				.cra_driver_name = "authenc-hmac-sha384-"2041						   "cbc-aes-caam-qi2",2042				.cra_blocksize = AES_BLOCK_SIZE,2043			},2044			.setkey = aead_setkey,2045			.setauthsize = aead_setauthsize,2046			.encrypt = aead_encrypt,2047			.decrypt = aead_decrypt,2048			.ivsize = AES_BLOCK_SIZE,2049			.maxauthsize = SHA384_DIGEST_SIZE,2050		},2051		.caam = {2052			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,2053			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |2054					   OP_ALG_AAI_HMAC_PRECOMP,2055		}2056	},2057	{2058		.aead = {2059			.base = {2060				.cra_name = "echainiv(authenc(hmac(sha384),"2061					    "cbc(aes)))",2062				.cra_driver_name = "echainiv-authenc-"2063						   "hmac-sha384-cbc-aes-"2064						   "caam-qi2",2065				.cra_blocksize = AES_BLOCK_SIZE,2066			},2067			.setkey = aead_setkey,2068			.setauthsize = aead_setauthsize,2069			.encrypt = aead_encrypt,2070			.decrypt = aead_decrypt,2071			.ivsize = AES_BLOCK_SIZE,2072			.maxauthsize = SHA384_DIGEST_SIZE,2073		},2074		.caam = {2075			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,2076			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |2077					   OP_ALG_AAI_HMAC_PRECOMP,2078			.geniv = true,2079		}2080	},2081	{2082		.aead = {2083			.base = {2084				.cra_name = "authenc(hmac(sha512),cbc(aes))",2085				.cra_driver_name = "authenc-hmac-sha512-"2086						   "cbc-aes-caam-qi2",2087				.cra_blocksize = AES_BLOCK_SIZE,2088			},2089			.setkey = aead_setkey,2090			.setauthsize = aead_setauthsize,2091			.encrypt = aead_encrypt,2092			.decrypt = aead_decrypt,2093			.ivsize = AES_BLOCK_SIZE,2094			.maxauthsize = SHA512_DIGEST_SIZE,2095		},2096		.caam = {2097			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,2098			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |2099					   OP_ALG_AAI_HMAC_PRECOMP,2100		}2101	},2102	{2103		.aead = {2104			.base = {2105				.cra_name = "echainiv(authenc(hmac(sha512),"2106					    "cbc(aes)))",2107				.cra_driver_name = "echainiv-authenc-"2108						   "hmac-sha512-cbc-aes-"2109						   "caam-qi2",2110				.cra_blocksize = AES_BLOCK_SIZE,2111			},2112			.setkey = aead_setkey,2113			.setauthsize = aead_setauthsize,2114			.encrypt = aead_encrypt,2115			.decrypt = aead_decrypt,2116			.ivsize = AES_BLOCK_SIZE,2117			.maxauthsize = SHA512_DIGEST_SIZE,2118		},2119		.caam = {2120			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,2121			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |2122					   OP_ALG_AAI_HMAC_PRECOMP,2123			.geniv = true,2124		}2125	},2126	{2127		.aead = {2128			.base = {2129				.cra_name = "authenc(hmac(md5),cbc(des3_ede))",2130				.cra_driver_name = "authenc-hmac-md5-"2131						   "cbc-des3_ede-caam-qi2",2132				.cra_blocksize = DES3_EDE_BLOCK_SIZE,2133			},2134			.setkey = des3_aead_setkey,2135			.setauthsize = aead_setauthsize,2136			.encrypt = aead_encrypt,2137			.decrypt = aead_decrypt,2138			.ivsize = DES3_EDE_BLOCK_SIZE,2139			.maxauthsize = MD5_DIGEST_SIZE,2140		},2141		.caam = {2142			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,2143			.class2_alg_type = OP_ALG_ALGSEL_MD5 |2144					   OP_ALG_AAI_HMAC_PRECOMP,2145		}2146	},2147	{2148		.aead = {2149			.base = {2150				.cra_name = "echainiv(authenc(hmac(md5),"2151					    "cbc(des3_ede)))",2152				.cra_driver_name = "echainiv-authenc-hmac-md5-"2153						   "cbc-des3_ede-caam-qi2",2154				.cra_blocksize = DES3_EDE_BLOCK_SIZE,2155			},2156			.setkey = des3_aead_setkey,2157			.setauthsize = aead_setauthsize,2158			.encrypt = aead_encrypt,2159			.decrypt = aead_decrypt,2160			.ivsize = DES3_EDE_BLOCK_SIZE,2161			.maxauthsize = MD5_DIGEST_SIZE,2162		},2163		.caam = {2164			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,2165			.class2_alg_type = OP_ALG_ALGSEL_MD5 |2166					   OP_ALG_AAI_HMAC_PRECOMP,2167			.geniv = true,2168		}2169	},2170	{2171		.aead = {2172			.base = {2173				.cra_name = "authenc(hmac(sha1),"2174					    "cbc(des3_ede))",2175				.cra_driver_name = "authenc-hmac-sha1-"2176						   "cbc-des3_ede-caam-qi2",2177				.cra_blocksize = DES3_EDE_BLOCK_SIZE,2178			},2179			.setkey = des3_aead_setkey,2180			.setauthsize = aead_setauthsize,2181			.encrypt = aead_encrypt,2182			.decrypt = aead_decrypt,2183			.ivsize = DES3_EDE_BLOCK_SIZE,2184			.maxauthsize = SHA1_DIGEST_SIZE,2185		},2186		.caam = {2187			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,2188			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |2189					   OP_ALG_AAI_HMAC_PRECOMP,2190		},2191	},2192	{2193		.aead = {2194			.base = {2195				.cra_name = "echainiv(authenc(hmac(sha1),"2196					    "cbc(des3_ede)))",2197				.cra_driver_name = "echainiv-authenc-"2198						   "hmac-sha1-"2199						   "cbc-des3_ede-caam-qi2",2200				.cra_blocksize = DES3_EDE_BLOCK_SIZE,2201			},2202			.setkey = des3_aead_setkey,2203			.setauthsize = aead_setauthsize,2204			.encrypt = aead_encrypt,2205			.decrypt = aead_decrypt,2206			.ivsize = DES3_EDE_BLOCK_SIZE,2207			.maxauthsize = SHA1_DIGEST_SIZE,2208		},2209		.caam = {2210			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,2211			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |2212					   OP_ALG_AAI_HMAC_PRECOMP,2213			.geniv = true,2214		}2215	},2216	{2217		.aead = {2218			.base = {2219				.cra_name = "authenc(hmac(sha224),"2220					    "cbc(des3_ede))",2221				.cra_driver_name = "authenc-hmac-sha224-"2222						   "cbc-des3_ede-caam-qi2",2223				.cra_blocksize = DES3_EDE_BLOCK_SIZE,2224			},2225			.setkey = des3_aead_setkey,2226			.setauthsize = aead_setauthsize,2227			.encrypt = aead_encrypt,2228			.decrypt = aead_decrypt,2229			.ivsize = DES3_EDE_BLOCK_SIZE,2230			.maxauthsize = SHA224_DIGEST_SIZE,2231		},2232		.caam = {2233			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,2234			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |2235					   OP_ALG_AAI_HMAC_PRECOMP,2236		},2237	},2238	{2239		.aead = {2240			.base = {2241				.cra_name = "echainiv(authenc(hmac(sha224),"2242					    "cbc(des3_ede)))",2243				.cra_driver_name = "echainiv-authenc-"2244						   "hmac-sha224-"2245						   "cbc-des3_ede-caam-qi2",2246				.cra_blocksize = DES3_EDE_BLOCK_SIZE,2247			},2248			.setkey = des3_aead_setkey,2249			.setauthsize = aead_setauthsize,2250			.encrypt = aead_encrypt,2251			.decrypt = aead_decrypt,2252			.ivsize = DES3_EDE_BLOCK_SIZE,2253			.maxauthsize = SHA224_DIGEST_SIZE,2254		},2255		.caam = {2256			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,2257			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |2258					   OP_ALG_AAI_HMAC_PRECOMP,2259			.geniv = true,2260		}2261	},2262	{2263		.aead = {2264			.base = {2265				.cra_name = "authenc(hmac(sha256),"2266					    "cbc(des3_ede))",2267				.cra_driver_name = "authenc-hmac-sha256-"2268						   "cbc-des3_ede-caam-qi2",2269				.cra_blocksize = DES3_EDE_BLOCK_SIZE,2270			},2271			.setkey = des3_aead_setkey,2272			.setauthsize = aead_setauthsize,2273			.encrypt = aead_encrypt,2274			.decrypt = aead_decrypt,2275			.ivsize = DES3_EDE_BLOCK_SIZE,2276			.maxauthsize = SHA256_DIGEST_SIZE,2277		},2278		.caam = {2279			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,2280			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |2281					   OP_ALG_AAI_HMAC_PRECOMP,2282		},2283	},2284	{2285		.aead = {2286			.base = {2287				.cra_name = "echainiv(authenc(hmac(sha256),"2288					    "cbc(des3_ede)))",2289				.cra_driver_name = "echainiv-authenc-"2290						   "hmac-sha256-"2291						   "cbc-des3_ede-caam-qi2",2292				.cra_blocksize = DES3_EDE_BLOCK_SIZE,2293			},2294			.setkey = des3_aead_setkey,2295			.setauthsize = aead_setauthsize,2296			.encrypt = aead_encrypt,2297			.decrypt = aead_decrypt,2298			.ivsize = DES3_EDE_BLOCK_SIZE,2299			.maxauthsize = SHA256_DIGEST_SIZE,2300		},2301		.caam = {2302			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,2303			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |2304					   OP_ALG_AAI_HMAC_PRECOMP,2305			.geniv = true,2306		}2307	},2308	{2309		.aead = {2310			.base = {2311				.cra_name = "authenc(hmac(sha384),"2312					    "cbc(des3_ede))",2313				.cra_driver_name = "authenc-hmac-sha384-"2314						   "cbc-des3_ede-caam-qi2",2315				.cra_blocksize = DES3_EDE_BLOCK_SIZE,2316			},2317			.setkey = des3_aead_setkey,2318			.setauthsize = aead_setauthsize,2319			.encrypt = aead_encrypt,2320			.decrypt = aead_decrypt,2321			.ivsize = DES3_EDE_BLOCK_SIZE,2322			.maxauthsize = SHA384_DIGEST_SIZE,2323		},2324		.caam = {2325			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,2326			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |2327					   OP_ALG_AAI_HMAC_PRECOMP,2328		},2329	},2330	{2331		.aead = {2332			.base = {2333				.cra_name = "echainiv(authenc(hmac(sha384),"2334					    "cbc(des3_ede)))",2335				.cra_driver_name = "echainiv-authenc-"2336						   "hmac-sha384-"2337						   "cbc-des3_ede-caam-qi2",2338				.cra_blocksize = DES3_EDE_BLOCK_SIZE,2339			},2340			.setkey = des3_aead_setkey,2341			.setauthsize = aead_setauthsize,2342			.encrypt = aead_encrypt,2343			.decrypt = aead_decrypt,2344			.ivsize = DES3_EDE_BLOCK_SIZE,2345			.maxauthsize = SHA384_DIGEST_SIZE,2346		},2347		.caam = {2348			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,2349			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |2350					   OP_ALG_AAI_HMAC_PRECOMP,2351			.geniv = true,2352		}2353	},2354	{2355		.aead = {2356			.base = {2357				.cra_name = "authenc(hmac(sha512),"2358					    "cbc(des3_ede))",2359				.cra_driver_name = "authenc-hmac-sha512-"2360						   "cbc-des3_ede-caam-qi2",2361				.cra_blocksize = DES3_EDE_BLOCK_SIZE,2362			},2363			.setkey = des3_aead_setkey,2364			.setauthsize = aead_setauthsize,2365			.encrypt = aead_encrypt,2366			.decrypt = aead_decrypt,2367			.ivsize = DES3_EDE_BLOCK_SIZE,2368			.maxauthsize = SHA512_DIGEST_SIZE,2369		},2370		.caam = {2371			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,2372			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |2373					   OP_ALG_AAI_HMAC_PRECOMP,2374		},2375	},2376	{2377		.aead = {2378			.base = {2379				.cra_name = "echainiv(authenc(hmac(sha512),"2380					    "cbc(des3_ede)))",2381				.cra_driver_name = "echainiv-authenc-"2382						   "hmac-sha512-"2383						   "cbc-des3_ede-caam-qi2",2384				.cra_blocksize = DES3_EDE_BLOCK_SIZE,2385			},2386			.setkey = des3_aead_setkey,2387			.setauthsize = aead_setauthsize,2388			.encrypt = aead_encrypt,2389			.decrypt = aead_decrypt,2390			.ivsize = DES3_EDE_BLOCK_SIZE,2391			.maxauthsize = SHA512_DIGEST_SIZE,2392		},2393		.caam = {2394			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,2395			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |2396					   OP_ALG_AAI_HMAC_PRECOMP,2397			.geniv = true,2398		}2399	},2400	{2401		.aead = {2402			.base = {2403				.cra_name = "authenc(hmac(md5),cbc(des))",2404				.cra_driver_name = "authenc-hmac-md5-"2405						   "cbc-des-caam-qi2",2406				.cra_blocksize = DES_BLOCK_SIZE,2407			},2408			.setkey = aead_setkey,2409			.setauthsize = aead_setauthsize,2410			.encrypt = aead_encrypt,2411			.decrypt = aead_decrypt,2412			.ivsize = DES_BLOCK_SIZE,2413			.maxauthsize = MD5_DIGEST_SIZE,2414		},2415		.caam = {2416			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,2417			.class2_alg_type = OP_ALG_ALGSEL_MD5 |2418					   OP_ALG_AAI_HMAC_PRECOMP,2419		},2420	},2421	{2422		.aead = {2423			.base = {2424				.cra_name = "echainiv(authenc(hmac(md5),"2425					    "cbc(des)))",2426				.cra_driver_name = "echainiv-authenc-hmac-md5-"2427						   "cbc-des-caam-qi2",2428				.cra_blocksize = DES_BLOCK_SIZE,2429			},2430			.setkey = aead_setkey,2431			.setauthsize = aead_setauthsize,2432			.encrypt = aead_encrypt,2433			.decrypt = aead_decrypt,2434			.ivsize = DES_BLOCK_SIZE,2435			.maxauthsize = MD5_DIGEST_SIZE,2436		},2437		.caam = {2438			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,2439			.class2_alg_type = OP_ALG_ALGSEL_MD5 |2440					   OP_ALG_AAI_HMAC_PRECOMP,2441			.geniv = true,2442		}2443	},2444	{2445		.aead = {2446			.base = {2447				.cra_name = "authenc(hmac(sha1),cbc(des))",2448				.cra_driver_name = "authenc-hmac-sha1-"2449						   "cbc-des-caam-qi2",2450				.cra_blocksize = DES_BLOCK_SIZE,2451			},2452			.setkey = aead_setkey,2453			.setauthsize = aead_setauthsize,2454			.encrypt = aead_encrypt,2455			.decrypt = aead_decrypt,2456			.ivsize = DES_BLOCK_SIZE,2457			.maxauthsize = SHA1_DIGEST_SIZE,2458		},2459		.caam = {2460			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,2461			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |2462					   OP_ALG_AAI_HMAC_PRECOMP,2463		},2464	},2465	{2466		.aead = {2467			.base = {2468				.cra_name = "echainiv(authenc(hmac(sha1),"2469					    "cbc(des)))",2470				.cra_driver_name = "echainiv-authenc-"2471						   "hmac-sha1-cbc-des-caam-qi2",2472				.cra_blocksize = DES_BLOCK_SIZE,2473			},2474			.setkey = aead_setkey,2475			.setauthsize = aead_setauthsize,2476			.encrypt = aead_encrypt,2477			.decrypt = aead_decrypt,2478			.ivsize = DES_BLOCK_SIZE,2479			.maxauthsize = SHA1_DIGEST_SIZE,2480		},2481		.caam = {2482			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,2483			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |2484					   OP_ALG_AAI_HMAC_PRECOMP,2485			.geniv = true,2486		}2487	},2488	{2489		.aead = {2490			.base = {2491				.cra_name = "authenc(hmac(sha224),cbc(des))",2492				.cra_driver_name = "authenc-hmac-sha224-"2493						   "cbc-des-caam-qi2",2494				.cra_blocksize = DES_BLOCK_SIZE,2495			},2496			.setkey = aead_setkey,2497			.setauthsize = aead_setauthsize,2498			.encrypt = aead_encrypt,2499			.decrypt = aead_decrypt,2500			.ivsize = DES_BLOCK_SIZE,2501			.maxauthsize = SHA224_DIGEST_SIZE,2502		},2503		.caam = {2504			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,2505			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |2506					   OP_ALG_AAI_HMAC_PRECOMP,2507		},2508	},2509	{2510		.aead = {2511			.base = {2512				.cra_name = "echainiv(authenc(hmac(sha224),"2513					    "cbc(des)))",2514				.cra_driver_name = "echainiv-authenc-"2515						   "hmac-sha224-cbc-des-"2516						   "caam-qi2",2517				.cra_blocksize = DES_BLOCK_SIZE,2518			},2519			.setkey = aead_setkey,2520			.setauthsize = aead_setauthsize,2521			.encrypt = aead_encrypt,2522			.decrypt = aead_decrypt,2523			.ivsize = DES_BLOCK_SIZE,2524			.maxauthsize = SHA224_DIGEST_SIZE,2525		},2526		.caam = {2527			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,2528			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |2529					   OP_ALG_AAI_HMAC_PRECOMP,2530			.geniv = true,2531		}2532	},2533	{2534		.aead = {2535			.base = {2536				.cra_name = "authenc(hmac(sha256),cbc(des))",2537				.cra_driver_name = "authenc-hmac-sha256-"2538						   "cbc-des-caam-qi2",2539				.cra_blocksize = DES_BLOCK_SIZE,2540			},2541			.setkey = aead_setkey,2542			.setauthsize = aead_setauthsize,2543			.encrypt = aead_encrypt,2544			.decrypt = aead_decrypt,2545			.ivsize = DES_BLOCK_SIZE,2546			.maxauthsize = SHA256_DIGEST_SIZE,2547		},2548		.caam = {2549			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,2550			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |2551					   OP_ALG_AAI_HMAC_PRECOMP,2552		},2553	},2554	{2555		.aead = {2556			.base = {2557				.cra_name = "echainiv(authenc(hmac(sha256),"2558					    "cbc(des)))",2559				.cra_driver_name = "echainiv-authenc-"2560						   "hmac-sha256-cbc-des-"2561						   "caam-qi2",2562				.cra_blocksize = DES_BLOCK_SIZE,2563			},2564			.setkey = aead_setkey,2565			.setauthsize = aead_setauthsize,2566			.encrypt = aead_encrypt,2567			.decrypt = aead_decrypt,2568			.ivsize = DES_BLOCK_SIZE,2569			.maxauthsize = SHA256_DIGEST_SIZE,2570		},2571		.caam = {2572			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,2573			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |2574					   OP_ALG_AAI_HMAC_PRECOMP,2575			.geniv = true,2576		},2577	},2578	{2579		.aead = {2580			.base = {2581				.cra_name = "authenc(hmac(sha384),cbc(des))",2582				.cra_driver_name = "authenc-hmac-sha384-"2583						   "cbc-des-caam-qi2",2584				.cra_blocksize = DES_BLOCK_SIZE,2585			},2586			.setkey = aead_setkey,2587			.setauthsize = aead_setauthsize,2588			.encrypt = aead_encrypt,2589			.decrypt = aead_decrypt,2590			.ivsize = DES_BLOCK_SIZE,2591			.maxauthsize = SHA384_DIGEST_SIZE,2592		},2593		.caam = {2594			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,2595			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |2596					   OP_ALG_AAI_HMAC_PRECOMP,2597		},2598	},2599	{2600		.aead = {2601			.base = {2602				.cra_name = "echainiv(authenc(hmac(sha384),"2603					    "cbc(des)))",2604				.cra_driver_name = "echainiv-authenc-"2605						   "hmac-sha384-cbc-des-"2606						   "caam-qi2",2607				.cra_blocksize = DES_BLOCK_SIZE,2608			},2609			.setkey = aead_setkey,2610			.setauthsize = aead_setauthsize,2611			.encrypt = aead_encrypt,2612			.decrypt = aead_decrypt,2613			.ivsize = DES_BLOCK_SIZE,2614			.maxauthsize = SHA384_DIGEST_SIZE,2615		},2616		.caam = {2617			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,2618			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |2619					   OP_ALG_AAI_HMAC_PRECOMP,2620			.geniv = true,2621		}2622	},2623	{2624		.aead = {2625			.base = {2626				.cra_name = "authenc(hmac(sha512),cbc(des))",2627				.cra_driver_name = "authenc-hmac-sha512-"2628						   "cbc-des-caam-qi2",2629				.cra_blocksize = DES_BLOCK_SIZE,2630			},2631			.setkey = aead_setkey,2632			.setauthsize = aead_setauthsize,2633			.encrypt = aead_encrypt,2634			.decrypt = aead_decrypt,2635			.ivsize = DES_BLOCK_SIZE,2636			.maxauthsize = SHA512_DIGEST_SIZE,2637		},2638		.caam = {2639			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,2640			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |2641					   OP_ALG_AAI_HMAC_PRECOMP,2642		}2643	},2644	{2645		.aead = {2646			.base = {2647				.cra_name = "echainiv(authenc(hmac(sha512),"2648					    "cbc(des)))",2649				.cra_driver_name = "echainiv-authenc-"2650						   "hmac-sha512-cbc-des-"2651						   "caam-qi2",2652				.cra_blocksize = DES_BLOCK_SIZE,2653			},2654			.setkey = aead_setkey,2655			.setauthsize = aead_setauthsize,2656			.encrypt = aead_encrypt,2657			.decrypt = aead_decrypt,2658			.ivsize = DES_BLOCK_SIZE,2659			.maxauthsize = SHA512_DIGEST_SIZE,2660		},2661		.caam = {2662			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,2663			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |2664					   OP_ALG_AAI_HMAC_PRECOMP,2665			.geniv = true,2666		}2667	},2668	{2669		.aead = {2670			.base = {2671				.cra_name = "authenc(hmac(md5),"2672					    "rfc3686(ctr(aes)))",2673				.cra_driver_name = "authenc-hmac-md5-"2674						   "rfc3686-ctr-aes-caam-qi2",2675				.cra_blocksize = 1,2676			},2677			.setkey = aead_setkey,2678			.setauthsize = aead_setauthsize,2679			.encrypt = aead_encrypt,2680			.decrypt = aead_decrypt,2681			.ivsize = CTR_RFC3686_IV_SIZE,2682			.maxauthsize = MD5_DIGEST_SIZE,2683		},2684		.caam = {2685			.class1_alg_type = OP_ALG_ALGSEL_AES |2686					   OP_ALG_AAI_CTR_MOD128,2687			.class2_alg_type = OP_ALG_ALGSEL_MD5 |2688					   OP_ALG_AAI_HMAC_PRECOMP,2689			.rfc3686 = true,2690		},2691	},2692	{2693		.aead = {2694			.base = {2695				.cra_name = "seqiv(authenc("2696					    "hmac(md5),rfc3686(ctr(aes))))",2697				.cra_driver_name = "seqiv-authenc-hmac-md5-"2698						   "rfc3686-ctr-aes-caam-qi2",2699				.cra_blocksize = 1,2700			},2701			.setkey = aead_setkey,2702			.setauthsize = aead_setauthsize,2703			.encrypt = aead_encrypt,2704			.decrypt = aead_decrypt,2705			.ivsize = CTR_RFC3686_IV_SIZE,2706			.maxauthsize = MD5_DIGEST_SIZE,2707		},2708		.caam = {2709			.class1_alg_type = OP_ALG_ALGSEL_AES |2710					   OP_ALG_AAI_CTR_MOD128,2711			.class2_alg_type = OP_ALG_ALGSEL_MD5 |2712					   OP_ALG_AAI_HMAC_PRECOMP,2713			.rfc3686 = true,2714			.geniv = true,2715		},2716	},2717	{2718		.aead = {2719			.base = {2720				.cra_name = "authenc(hmac(sha1),"2721					    "rfc3686(ctr(aes)))",2722				.cra_driver_name = "authenc-hmac-sha1-"2723						   "rfc3686-ctr-aes-caam-qi2",2724				.cra_blocksize = 1,2725			},2726			.setkey = aead_setkey,2727			.setauthsize = aead_setauthsize,2728			.encrypt = aead_encrypt,2729			.decrypt = aead_decrypt,2730			.ivsize = CTR_RFC3686_IV_SIZE,2731			.maxauthsize = SHA1_DIGEST_SIZE,2732		},2733		.caam = {2734			.class1_alg_type = OP_ALG_ALGSEL_AES |2735					   OP_ALG_AAI_CTR_MOD128,2736			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |2737					   OP_ALG_AAI_HMAC_PRECOMP,2738			.rfc3686 = true,2739		},2740	},2741	{2742		.aead = {2743			.base = {2744				.cra_name = "seqiv(authenc("2745					    "hmac(sha1),rfc3686(ctr(aes))))",2746				.cra_driver_name = "seqiv-authenc-hmac-sha1-"2747						   "rfc3686-ctr-aes-caam-qi2",2748				.cra_blocksize = 1,2749			},2750			.setkey = aead_setkey,2751			.setauthsize = aead_setauthsize,2752			.encrypt = aead_encrypt,2753			.decrypt = aead_decrypt,2754			.ivsize = CTR_RFC3686_IV_SIZE,2755			.maxauthsize = SHA1_DIGEST_SIZE,2756		},2757		.caam = {2758			.class1_alg_type = OP_ALG_ALGSEL_AES |2759					   OP_ALG_AAI_CTR_MOD128,2760			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |2761					   OP_ALG_AAI_HMAC_PRECOMP,2762			.rfc3686 = true,2763			.geniv = true,2764		},2765	},2766	{2767		.aead = {2768			.base = {2769				.cra_name = "authenc(hmac(sha224),"2770					    "rfc3686(ctr(aes)))",2771				.cra_driver_name = "authenc-hmac-sha224-"2772						   "rfc3686-ctr-aes-caam-qi2",2773				.cra_blocksize = 1,2774			},2775			.setkey = aead_setkey,2776			.setauthsize = aead_setauthsize,2777			.encrypt = aead_encrypt,2778			.decrypt = aead_decrypt,2779			.ivsize = CTR_RFC3686_IV_SIZE,2780			.maxauthsize = SHA224_DIGEST_SIZE,2781		},2782		.caam = {2783			.class1_alg_type = OP_ALG_ALGSEL_AES |2784					   OP_ALG_AAI_CTR_MOD128,2785			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |2786					   OP_ALG_AAI_HMAC_PRECOMP,2787			.rfc3686 = true,2788		},2789	},2790	{2791		.aead = {2792			.base = {2793				.cra_name = "seqiv(authenc("2794					    "hmac(sha224),rfc3686(ctr(aes))))",2795				.cra_driver_name = "seqiv-authenc-hmac-sha224-"2796						   "rfc3686-ctr-aes-caam-qi2",2797				.cra_blocksize = 1,2798			},2799			.setkey = aead_setkey,2800			.setauthsize = aead_setauthsize,2801			.encrypt = aead_encrypt,2802			.decrypt = aead_decrypt,2803			.ivsize = CTR_RFC3686_IV_SIZE,2804			.maxauthsize = SHA224_DIGEST_SIZE,2805		},2806		.caam = {2807			.class1_alg_type = OP_ALG_ALGSEL_AES |2808					   OP_ALG_AAI_CTR_MOD128,2809			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |2810					   OP_ALG_AAI_HMAC_PRECOMP,2811			.rfc3686 = true,2812			.geniv = true,2813		},2814	},2815	{2816		.aead = {2817			.base = {2818				.cra_name = "authenc(hmac(sha256),"2819					    "rfc3686(ctr(aes)))",2820				.cra_driver_name = "authenc-hmac-sha256-"2821						   "rfc3686-ctr-aes-caam-qi2",2822				.cra_blocksize = 1,2823			},2824			.setkey = aead_setkey,2825			.setauthsize = aead_setauthsize,2826			.encrypt = aead_encrypt,2827			.decrypt = aead_decrypt,2828			.ivsize = CTR_RFC3686_IV_SIZE,2829			.maxauthsize = SHA256_DIGEST_SIZE,2830		},2831		.caam = {2832			.class1_alg_type = OP_ALG_ALGSEL_AES |2833					   OP_ALG_AAI_CTR_MOD128,2834			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |2835					   OP_ALG_AAI_HMAC_PRECOMP,2836			.rfc3686 = true,2837		},2838	},2839	{2840		.aead = {2841			.base = {2842				.cra_name = "seqiv(authenc(hmac(sha256),"2843					    "rfc3686(ctr(aes))))",2844				.cra_driver_name = "seqiv-authenc-hmac-sha256-"2845						   "rfc3686-ctr-aes-caam-qi2",2846				.cra_blocksize = 1,2847			},2848			.setkey = aead_setkey,2849			.setauthsize = aead_setauthsize,2850			.encrypt = aead_encrypt,2851			.decrypt = aead_decrypt,2852			.ivsize = CTR_RFC3686_IV_SIZE,2853			.maxauthsize = SHA256_DIGEST_SIZE,2854		},2855		.caam = {2856			.class1_alg_type = OP_ALG_ALGSEL_AES |2857					   OP_ALG_AAI_CTR_MOD128,2858			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |2859					   OP_ALG_AAI_HMAC_PRECOMP,2860			.rfc3686 = true,2861			.geniv = true,2862		},2863	},2864	{2865		.aead = {2866			.base = {2867				.cra_name = "authenc(hmac(sha384),"2868					    "rfc3686(ctr(aes)))",2869				.cra_driver_name = "authenc-hmac-sha384-"2870						   "rfc3686-ctr-aes-caam-qi2",2871				.cra_blocksize = 1,2872			},2873			.setkey = aead_setkey,2874			.setauthsize = aead_setauthsize,2875			.encrypt = aead_encrypt,2876			.decrypt = aead_decrypt,2877			.ivsize = CTR_RFC3686_IV_SIZE,2878			.maxauthsize = SHA384_DIGEST_SIZE,2879		},2880		.caam = {2881			.class1_alg_type = OP_ALG_ALGSEL_AES |2882					   OP_ALG_AAI_CTR_MOD128,2883			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |2884					   OP_ALG_AAI_HMAC_PRECOMP,2885			.rfc3686 = true,2886		},2887	},2888	{2889		.aead = {2890			.base = {2891				.cra_name = "seqiv(authenc(hmac(sha384),"2892					    "rfc3686(ctr(aes))))",2893				.cra_driver_name = "seqiv-authenc-hmac-sha384-"2894						   "rfc3686-ctr-aes-caam-qi2",2895				.cra_blocksize = 1,2896			},2897			.setkey = aead_setkey,2898			.setauthsize = aead_setauthsize,2899			.encrypt = aead_encrypt,2900			.decrypt = aead_decrypt,2901			.ivsize = CTR_RFC3686_IV_SIZE,2902			.maxauthsize = SHA384_DIGEST_SIZE,2903		},2904		.caam = {2905			.class1_alg_type = OP_ALG_ALGSEL_AES |2906					   OP_ALG_AAI_CTR_MOD128,2907			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |2908					   OP_ALG_AAI_HMAC_PRECOMP,2909			.rfc3686 = true,2910			.geniv = true,2911		},2912	},2913	{2914		.aead = {2915			.base = {2916				.cra_name = "rfc7539(chacha20,poly1305)",2917				.cra_driver_name = "rfc7539-chacha20-poly1305-"2918						   "caam-qi2",2919				.cra_blocksize = 1,2920			},2921			.setkey = chachapoly_setkey,2922			.setauthsize = chachapoly_setauthsize,2923			.encrypt = aead_encrypt,2924			.decrypt = aead_decrypt,2925			.ivsize = CHACHAPOLY_IV_SIZE,2926			.maxauthsize = POLY1305_DIGEST_SIZE,2927		},2928		.caam = {2929			.class1_alg_type = OP_ALG_ALGSEL_CHACHA20 |2930					   OP_ALG_AAI_AEAD,2931			.class2_alg_type = OP_ALG_ALGSEL_POLY1305 |2932					   OP_ALG_AAI_AEAD,2933			.nodkp = true,2934		},2935	},2936	{2937		.aead = {2938			.base = {2939				.cra_name = "rfc7539esp(chacha20,poly1305)",2940				.cra_driver_name = "rfc7539esp-chacha20-"2941						   "poly1305-caam-qi2",2942				.cra_blocksize = 1,2943			},2944			.setkey = chachapoly_setkey,2945			.setauthsize = chachapoly_setauthsize,2946			.encrypt = aead_encrypt,2947			.decrypt = aead_decrypt,2948			.ivsize = 8,2949			.maxauthsize = POLY1305_DIGEST_SIZE,2950		},2951		.caam = {2952			.class1_alg_type = OP_ALG_ALGSEL_CHACHA20 |2953					   OP_ALG_AAI_AEAD,2954			.class2_alg_type = OP_ALG_ALGSEL_POLY1305 |2955					   OP_ALG_AAI_AEAD,2956			.nodkp = true,2957		},2958	},2959	{2960		.aead = {2961			.base = {2962				.cra_name = "authenc(hmac(sha512),"2963					    "rfc3686(ctr(aes)))",2964				.cra_driver_name = "authenc-hmac-sha512-"2965						   "rfc3686-ctr-aes-caam-qi2",2966				.cra_blocksize = 1,2967			},2968			.setkey = aead_setkey,2969			.setauthsize = aead_setauthsize,2970			.encrypt = aead_encrypt,2971			.decrypt = aead_decrypt,2972			.ivsize = CTR_RFC3686_IV_SIZE,2973			.maxauthsize = SHA512_DIGEST_SIZE,2974		},2975		.caam = {2976			.class1_alg_type = OP_ALG_ALGSEL_AES |2977					   OP_ALG_AAI_CTR_MOD128,2978			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |2979					   OP_ALG_AAI_HMAC_PRECOMP,2980			.rfc3686 = true,2981		},2982	},2983	{2984		.aead = {2985			.base = {2986				.cra_name = "seqiv(authenc(hmac(sha512),"2987					    "rfc3686(ctr(aes))))",2988				.cra_driver_name = "seqiv-authenc-hmac-sha512-"2989						   "rfc3686-ctr-aes-caam-qi2",2990				.cra_blocksize = 1,2991			},2992			.setkey = aead_setkey,2993			.setauthsize = aead_setauthsize,2994			.encrypt = aead_encrypt,2995			.decrypt = aead_decrypt,2996			.ivsize = CTR_RFC3686_IV_SIZE,2997			.maxauthsize = SHA512_DIGEST_SIZE,2998		},2999		.caam = {3000			.class1_alg_type = OP_ALG_ALGSEL_AES |3001					   OP_ALG_AAI_CTR_MOD128,3002			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |3003					   OP_ALG_AAI_HMAC_PRECOMP,3004			.rfc3686 = true,3005			.geniv = true,3006		},3007	},3008};3009 3010static void caam_skcipher_alg_init(struct caam_skcipher_alg *t_alg)3011{3012	struct skcipher_alg *alg = &t_alg->skcipher;3013 3014	alg->base.cra_module = THIS_MODULE;3015	alg->base.cra_priority = CAAM_CRA_PRIORITY;3016	alg->base.cra_ctxsize = sizeof(struct caam_ctx) + crypto_dma_padding();3017	alg->base.cra_flags |= (CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY |3018			      CRYPTO_ALG_KERN_DRIVER_ONLY);3019 3020	alg->init = caam_cra_init_skcipher;3021	alg->exit = caam_cra_exit;3022}3023 3024static void caam_aead_alg_init(struct caam_aead_alg *t_alg)3025{3026	struct aead_alg *alg = &t_alg->aead;3027 3028	alg->base.cra_module = THIS_MODULE;3029	alg->base.cra_priority = CAAM_CRA_PRIORITY;3030	alg->base.cra_ctxsize = sizeof(struct caam_ctx) + crypto_dma_padding();3031	alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY |3032			      CRYPTO_ALG_KERN_DRIVER_ONLY;3033 3034	alg->init = caam_cra_init_aead;3035	alg->exit = caam_cra_exit_aead;3036}3037 3038/* max hash key is max split key size */3039#define CAAM_MAX_HASH_KEY_SIZE		(SHA512_DIGEST_SIZE * 2)3040 3041#define CAAM_MAX_HASH_BLOCK_SIZE	SHA512_BLOCK_SIZE3042 3043/* caam context sizes for hashes: running digest + 8 */3044#define HASH_MSG_LEN			83045#define MAX_CTX_LEN			(HASH_MSG_LEN + SHA512_DIGEST_SIZE)3046 3047enum hash_optype {3048	UPDATE = 0,3049	UPDATE_FIRST,3050	FINALIZE,3051	DIGEST,3052	HASH_NUM_OP3053};3054 3055/**3056 * struct caam_hash_ctx - ahash per-session context3057 * @flc: Flow Contexts array3058 * @key: authentication key3059 * @flc_dma: I/O virtual addresses of the Flow Contexts3060 * @dev: dpseci device3061 * @ctx_len: size of Context Register3062 * @adata: hashing algorithm details3063 */3064struct caam_hash_ctx {3065	struct caam_flc flc[HASH_NUM_OP];3066	u8 key[CAAM_MAX_HASH_BLOCK_SIZE] ____cacheline_aligned;3067	dma_addr_t flc_dma[HASH_NUM_OP];3068	struct device *dev;3069	int ctx_len;3070	struct alginfo adata;3071};3072 3073/* ahash state */3074struct caam_hash_state {3075	struct caam_request caam_req;3076	dma_addr_t buf_dma;3077	dma_addr_t ctx_dma;3078	int ctx_dma_len;3079	u8 buf[CAAM_MAX_HASH_BLOCK_SIZE] ____cacheline_aligned;3080	int buflen;3081	int next_buflen;3082	u8 caam_ctx[MAX_CTX_LEN] ____cacheline_aligned;3083	int (*update)(struct ahash_request *req);3084	int (*final)(struct ahash_request *req);3085	int (*finup)(struct ahash_request *req);3086};3087 3088struct caam_export_state {3089	u8 buf[CAAM_MAX_HASH_BLOCK_SIZE];3090	u8 caam_ctx[MAX_CTX_LEN];3091	int buflen;3092	int (*update)(struct ahash_request *req);3093	int (*final)(struct ahash_request *req);3094	int (*finup)(struct ahash_request *req);3095};3096 3097/* Map current buffer in state (if length > 0) and put it in link table */3098static inline int buf_map_to_qm_sg(struct device *dev,3099				   struct dpaa2_sg_entry *qm_sg,3100				   struct caam_hash_state *state)3101{3102	int buflen = state->buflen;3103 3104	if (!buflen)3105		return 0;3106 3107	state->buf_dma = dma_map_single(dev, state->buf, buflen,3108					DMA_TO_DEVICE);3109	if (dma_mapping_error(dev, state->buf_dma)) {3110		dev_err(dev, "unable to map buf\n");3111		state->buf_dma = 0;3112		return -ENOMEM;3113	}3114 3115	dma_to_qm_sg_one(qm_sg, state->buf_dma, buflen, 0);3116 3117	return 0;3118}3119 3120/* Map state->caam_ctx, and add it to link table */3121static inline int ctx_map_to_qm_sg(struct device *dev,3122				   struct caam_hash_state *state, int ctx_len,3123				   struct dpaa2_sg_entry *qm_sg, u32 flag)3124{3125	state->ctx_dma_len = ctx_len;3126	state->ctx_dma = dma_map_single(dev, state->caam_ctx, ctx_len, flag);3127	if (dma_mapping_error(dev, state->ctx_dma)) {3128		dev_err(dev, "unable to map ctx\n");3129		state->ctx_dma = 0;3130		return -ENOMEM;3131	}3132 3133	dma_to_qm_sg_one(qm_sg, state->ctx_dma, ctx_len, 0);3134 3135	return 0;3136}3137 3138static int ahash_set_sh_desc(struct crypto_ahash *ahash)3139{3140	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);3141	int digestsize = crypto_ahash_digestsize(ahash);3142	struct dpaa2_caam_priv *priv = dev_get_drvdata(ctx->dev);3143	struct caam_flc *flc;3144	u32 *desc;3145 3146	/* ahash_update shared descriptor */3147	flc = &ctx->flc[UPDATE];3148	desc = flc->sh_desc;3149	cnstr_shdsc_ahash(desc, &ctx->adata, OP_ALG_AS_UPDATE, ctx->ctx_len,3150			  ctx->ctx_len, true, priv->sec_attr.era);3151	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */3152	dma_sync_single_for_device(ctx->dev, ctx->flc_dma[UPDATE],3153				   desc_bytes(desc), DMA_BIDIRECTIONAL);3154	print_hex_dump_debug("ahash update shdesc@" __stringify(__LINE__)": ",3155			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),3156			     1);3157 3158	/* ahash_update_first shared descriptor */3159	flc = &ctx->flc[UPDATE_FIRST];3160	desc = flc->sh_desc;3161	cnstr_shdsc_ahash(desc, &ctx->adata, OP_ALG_AS_INIT, ctx->ctx_len,3162			  ctx->ctx_len, false, priv->sec_attr.era);3163	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */3164	dma_sync_single_for_device(ctx->dev, ctx->flc_dma[UPDATE_FIRST],3165				   desc_bytes(desc), DMA_BIDIRECTIONAL);3166	print_hex_dump_debug("ahash update first shdesc@" __stringify(__LINE__)": ",3167			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),3168			     1);3169 3170	/* ahash_final shared descriptor */3171	flc = &ctx->flc[FINALIZE];3172	desc = flc->sh_desc;3173	cnstr_shdsc_ahash(desc, &ctx->adata, OP_ALG_AS_FINALIZE, digestsize,3174			  ctx->ctx_len, true, priv->sec_attr.era);3175	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */3176	dma_sync_single_for_device(ctx->dev, ctx->flc_dma[FINALIZE],3177				   desc_bytes(desc), DMA_BIDIRECTIONAL);3178	print_hex_dump_debug("ahash final shdesc@" __stringify(__LINE__)": ",3179			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),3180			     1);3181 3182	/* ahash_digest shared descriptor */3183	flc = &ctx->flc[DIGEST];3184	desc = flc->sh_desc;3185	cnstr_shdsc_ahash(desc, &ctx->adata, OP_ALG_AS_INITFINAL, digestsize,3186			  ctx->ctx_len, false, priv->sec_attr.era);3187	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */3188	dma_sync_single_for_device(ctx->dev, ctx->flc_dma[DIGEST],3189				   desc_bytes(desc), DMA_BIDIRECTIONAL);3190	print_hex_dump_debug("ahash digest shdesc@" __stringify(__LINE__)": ",3191			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),3192			     1);3193 3194	return 0;3195}3196 3197struct split_key_sh_result {3198	struct completion completion;3199	int err;3200	struct device *dev;3201};3202 3203static void split_key_sh_done(void *cbk_ctx, u32 err)3204{3205	struct split_key_sh_result *res = cbk_ctx;3206 3207	dev_dbg(res->dev, "%s %d: err 0x%x\n", __func__, __LINE__, err);3208 3209	res->err = err ? caam_qi2_strstatus(res->dev, err) : 0;3210	complete(&res->completion);3211}3212 3213/* Digest hash size if it is too large */3214static int hash_digest_key(struct caam_hash_ctx *ctx, u32 *keylen, u8 *key,3215			   u32 digestsize)3216{3217	struct caam_request *req_ctx;3218	u32 *desc;3219	struct split_key_sh_result result;3220	dma_addr_t key_dma;3221	struct caam_flc *flc;3222	dma_addr_t flc_dma;3223	int ret = -ENOMEM;3224	struct dpaa2_fl_entry *in_fle, *out_fle;3225 3226	req_ctx = kzalloc(sizeof(*req_ctx), GFP_KERNEL);3227	if (!req_ctx)3228		return -ENOMEM;3229 3230	in_fle = &req_ctx->fd_flt[1];3231	out_fle = &req_ctx->fd_flt[0];3232 3233	flc = kzalloc(sizeof(*flc), GFP_KERNEL);3234	if (!flc)3235		goto err_flc;3236 3237	key_dma = dma_map_single(ctx->dev, key, *keylen, DMA_BIDIRECTIONAL);3238	if (dma_mapping_error(ctx->dev, key_dma)) {3239		dev_err(ctx->dev, "unable to map key memory\n");3240		goto err_key_dma;3241	}3242 3243	desc = flc->sh_desc;3244 3245	init_sh_desc(desc, 0);3246 3247	/* descriptor to perform unkeyed hash on key_in */3248	append_operation(desc, ctx->adata.algtype | OP_ALG_ENCRYPT |3249			 OP_ALG_AS_INITFINAL);3250	append_seq_fifo_load(desc, *keylen, FIFOLD_CLASS_CLASS2 |3251			     FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_MSG);3252	append_seq_store(desc, digestsize, LDST_CLASS_2_CCB |3253			 LDST_SRCDST_BYTE_CONTEXT);3254 3255	flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */3256	flc_dma = dma_map_single(ctx->dev, flc, sizeof(flc->flc) +3257				 desc_bytes(desc), DMA_TO_DEVICE);3258	if (dma_mapping_error(ctx->dev, flc_dma)) {3259		dev_err(ctx->dev, "unable to map shared descriptor\n");3260		goto err_flc_dma;3261	}3262 3263	dpaa2_fl_set_final(in_fle, true);3264	dpaa2_fl_set_format(in_fle, dpaa2_fl_single);3265	dpaa2_fl_set_addr(in_fle, key_dma);3266	dpaa2_fl_set_len(in_fle, *keylen);3267	dpaa2_fl_set_format(out_fle, dpaa2_fl_single);3268	dpaa2_fl_set_addr(out_fle, key_dma);3269	dpaa2_fl_set_len(out_fle, digestsize);3270 3271	print_hex_dump_debug("key_in@" __stringify(__LINE__)": ",3272			     DUMP_PREFIX_ADDRESS, 16, 4, key, *keylen, 1);3273	print_hex_dump_debug("shdesc@" __stringify(__LINE__)": ",3274			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),3275			     1);3276 3277	result.err = 0;3278	init_completion(&result.completion);3279	result.dev = ctx->dev;3280 3281	req_ctx->flc = flc;3282	req_ctx->flc_dma = flc_dma;3283	req_ctx->cbk = split_key_sh_done;3284	req_ctx->ctx = &result;3285 3286	ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);3287	if (ret == -EINPROGRESS) {3288		/* in progress */3289		wait_for_completion(&result.completion);3290		ret = result.err;3291		print_hex_dump_debug("digested key@" __stringify(__LINE__)": ",3292				     DUMP_PREFIX_ADDRESS, 16, 4, key,3293				     digestsize, 1);3294	}3295 3296	dma_unmap_single(ctx->dev, flc_dma, sizeof(flc->flc) + desc_bytes(desc),3297			 DMA_TO_DEVICE);3298err_flc_dma:3299	dma_unmap_single(ctx->dev, key_dma, *keylen, DMA_BIDIRECTIONAL);3300err_key_dma:3301	kfree(flc);3302err_flc:3303	kfree(req_ctx);3304 3305	*keylen = digestsize;3306 3307	return ret;3308}3309 3310static int ahash_setkey(struct crypto_ahash *ahash, const u8 *key,3311			unsigned int keylen)3312{3313	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);3314	unsigned int blocksize = crypto_tfm_alg_blocksize(&ahash->base);3315	unsigned int digestsize = crypto_ahash_digestsize(ahash);3316	int ret;3317	u8 *hashed_key = NULL;3318 3319	dev_dbg(ctx->dev, "keylen %d blocksize %d\n", keylen, blocksize);3320 3321	if (keylen > blocksize) {3322		unsigned int aligned_len =3323			ALIGN(keylen, dma_get_cache_alignment());3324 3325		if (aligned_len < keylen)3326			return -EOVERFLOW;3327 3328		hashed_key = kmemdup(key, aligned_len, GFP_KERNEL);3329		if (!hashed_key)3330			return -ENOMEM;3331		ret = hash_digest_key(ctx, &keylen, hashed_key, digestsize);3332		if (ret)3333			goto bad_free_key;3334		key = hashed_key;3335	}3336 3337	ctx->adata.keylen = keylen;3338	ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype &3339					      OP_ALG_ALGSEL_MASK);3340	if (ctx->adata.keylen_pad > CAAM_MAX_HASH_KEY_SIZE)3341		goto bad_free_key;3342 3343	ctx->adata.key_virt = key;3344	ctx->adata.key_inline = true;3345 3346	/*3347	 * In case |user key| > |derived key|, using DKP<imm,imm> would result3348	 * in invalid opcodes (last bytes of user key) in the resulting3349	 * descriptor. Use DKP<ptr,imm> instead => both virtual and dma key3350	 * addresses are needed.3351	 */3352	if (keylen > ctx->adata.keylen_pad) {3353		memcpy(ctx->key, key, keylen);3354		dma_sync_single_for_device(ctx->dev, ctx->adata.key_dma,3355					   ctx->adata.keylen_pad,3356					   DMA_TO_DEVICE);3357	}3358 3359	ret = ahash_set_sh_desc(ahash);3360	kfree(hashed_key);3361	return ret;3362bad_free_key:3363	kfree(hashed_key);3364	return -EINVAL;3365}3366 3367static inline void ahash_unmap(struct device *dev, struct ahash_edesc *edesc,3368			       struct ahash_request *req)3369{3370	struct caam_hash_state *state = ahash_request_ctx_dma(req);3371 3372	if (edesc->src_nents)3373		dma_unmap_sg(dev, req->src, edesc->src_nents, DMA_TO_DEVICE);3374 3375	if (edesc->qm_sg_bytes)3376		dma_unmap_single(dev, edesc->qm_sg_dma, edesc->qm_sg_bytes,3377				 DMA_TO_DEVICE);3378 3379	if (state->buf_dma) {3380		dma_unmap_single(dev, state->buf_dma, state->buflen,3381				 DMA_TO_DEVICE);3382		state->buf_dma = 0;3383	}3384}3385 3386static inline void ahash_unmap_ctx(struct device *dev,3387				   struct ahash_edesc *edesc,3388				   struct ahash_request *req, u32 flag)3389{3390	struct caam_hash_state *state = ahash_request_ctx_dma(req);3391 3392	if (state->ctx_dma) {3393		dma_unmap_single(dev, state->ctx_dma, state->ctx_dma_len, flag);3394		state->ctx_dma = 0;3395	}3396	ahash_unmap(dev, edesc, req);3397}3398 3399static void ahash_done(void *cbk_ctx, u32 status)3400{3401	struct crypto_async_request *areq = cbk_ctx;3402	struct ahash_request *req = ahash_request_cast(areq);3403	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);3404	struct caam_hash_state *state = ahash_request_ctx_dma(req);3405	struct ahash_edesc *edesc = state->caam_req.edesc;3406	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);3407	int digestsize = crypto_ahash_digestsize(ahash);3408	int ecode = 0;3409 3410	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);3411 3412	if (unlikely(status))3413		ecode = caam_qi2_strstatus(ctx->dev, status);3414 3415	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE);3416	memcpy(req->result, state->caam_ctx, digestsize);3417	qi_cache_free(edesc);3418 3419	print_hex_dump_debug("ctx@" __stringify(__LINE__)": ",3420			     DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx,3421			     ctx->ctx_len, 1);3422 3423	ahash_request_complete(req, ecode);3424}3425 3426static void ahash_done_bi(void *cbk_ctx, u32 status)3427{3428	struct crypto_async_request *areq = cbk_ctx;3429	struct ahash_request *req = ahash_request_cast(areq);3430	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);3431	struct caam_hash_state *state = ahash_request_ctx_dma(req);3432	struct ahash_edesc *edesc = state->caam_req.edesc;3433	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);3434	int ecode = 0;3435 3436	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);3437 3438	if (unlikely(status))3439		ecode = caam_qi2_strstatus(ctx->dev, status);3440 3441	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL);3442	qi_cache_free(edesc);3443 3444	scatterwalk_map_and_copy(state->buf, req->src,3445				 req->nbytes - state->next_buflen,3446				 state->next_buflen, 0);3447	state->buflen = state->next_buflen;3448 3449	print_hex_dump_debug("buf@" __stringify(__LINE__)": ",3450			     DUMP_PREFIX_ADDRESS, 16, 4, state->buf,3451			     state->buflen, 1);3452 3453	print_hex_dump_debug("ctx@" __stringify(__LINE__)": ",3454			     DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx,3455			     ctx->ctx_len, 1);3456	if (req->result)3457		print_hex_dump_debug("result@" __stringify(__LINE__)": ",3458				     DUMP_PREFIX_ADDRESS, 16, 4, req->result,3459				     crypto_ahash_digestsize(ahash), 1);3460 3461	ahash_request_complete(req, ecode);3462}3463 3464static void ahash_done_ctx_src(void *cbk_ctx, u32 status)3465{3466	struct crypto_async_request *areq = cbk_ctx;3467	struct ahash_request *req = ahash_request_cast(areq);3468	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);3469	struct caam_hash_state *state = ahash_request_ctx_dma(req);3470	struct ahash_edesc *edesc = state->caam_req.edesc;3471	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);3472	int digestsize = crypto_ahash_digestsize(ahash);3473	int ecode = 0;3474 3475	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);3476 3477	if (unlikely(status))3478		ecode = caam_qi2_strstatus(ctx->dev, status);3479 3480	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL);3481	memcpy(req->result, state->caam_ctx, digestsize);3482	qi_cache_free(edesc);3483 3484	print_hex_dump_debug("ctx@" __stringify(__LINE__)": ",3485			     DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx,3486			     ctx->ctx_len, 1);3487 3488	ahash_request_complete(req, ecode);3489}3490 3491static void ahash_done_ctx_dst(void *cbk_ctx, u32 status)3492{3493	struct crypto_async_request *areq = cbk_ctx;3494	struct ahash_request *req = ahash_request_cast(areq);3495	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);3496	struct caam_hash_state *state = ahash_request_ctx_dma(req);3497	struct ahash_edesc *edesc = state->caam_req.edesc;3498	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);3499	int ecode = 0;3500 3501	dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status);3502 3503	if (unlikely(status))3504		ecode = caam_qi2_strstatus(ctx->dev, status);3505 3506	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE);3507	qi_cache_free(edesc);3508 3509	scatterwalk_map_and_copy(state->buf, req->src,3510				 req->nbytes - state->next_buflen,3511				 state->next_buflen, 0);3512	state->buflen = state->next_buflen;3513 3514	print_hex_dump_debug("buf@" __stringify(__LINE__)": ",3515			     DUMP_PREFIX_ADDRESS, 16, 4, state->buf,3516			     state->buflen, 1);3517 3518	print_hex_dump_debug("ctx@" __stringify(__LINE__)": ",3519			     DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx,3520			     ctx->ctx_len, 1);3521	if (req->result)3522		print_hex_dump_debug("result@" __stringify(__LINE__)": ",3523				     DUMP_PREFIX_ADDRESS, 16, 4, req->result,3524				     crypto_ahash_digestsize(ahash), 1);3525 3526	ahash_request_complete(req, ecode);3527}3528 3529static int ahash_update_ctx(struct ahash_request *req)3530{3531	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);3532	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);3533	struct caam_hash_state *state = ahash_request_ctx_dma(req);3534	struct caam_request *req_ctx = &state->caam_req;3535	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];3536	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];3537	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?3538		      GFP_KERNEL : GFP_ATOMIC;3539	u8 *buf = state->buf;3540	int *buflen = &state->buflen;3541	int *next_buflen = &state->next_buflen;3542	int in_len = *buflen + req->nbytes, to_hash;3543	int src_nents, mapped_nents, qm_sg_bytes, qm_sg_src_index;3544	struct ahash_edesc *edesc;3545	int ret = 0;3546 3547	*next_buflen = in_len & (crypto_tfm_alg_blocksize(&ahash->base) - 1);3548	to_hash = in_len - *next_buflen;3549 3550	if (to_hash) {3551		struct dpaa2_sg_entry *sg_table;3552		int src_len = req->nbytes - *next_buflen;3553 3554		src_nents = sg_nents_for_len(req->src, src_len);3555		if (src_nents < 0) {3556			dev_err(ctx->dev, "Invalid number of src SG.\n");3557			return src_nents;3558		}3559 3560		if (src_nents) {3561			mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents,3562						  DMA_TO_DEVICE);3563			if (!mapped_nents) {3564				dev_err(ctx->dev, "unable to DMA map source\n");3565				return -ENOMEM;3566			}3567		} else {3568			mapped_nents = 0;3569		}3570 3571		/* allocate space for base edesc and link tables */3572		edesc = qi_cache_zalloc(flags);3573		if (!edesc) {3574			dma_unmap_sg(ctx->dev, req->src, src_nents,3575				     DMA_TO_DEVICE);3576			return -ENOMEM;3577		}3578 3579		edesc->src_nents = src_nents;3580		qm_sg_src_index = 1 + (*buflen ? 1 : 0);3581		qm_sg_bytes = pad_sg_nents(qm_sg_src_index + mapped_nents) *3582			      sizeof(*sg_table);3583		sg_table = &edesc->sgt[0];3584 3585		ret = ctx_map_to_qm_sg(ctx->dev, state, ctx->ctx_len, sg_table,3586				       DMA_BIDIRECTIONAL);3587		if (ret)3588			goto unmap_ctx;3589 3590		ret = buf_map_to_qm_sg(ctx->dev, sg_table + 1, state);3591		if (ret)3592			goto unmap_ctx;3593 3594		if (mapped_nents) {3595			sg_to_qm_sg_last(req->src, src_len,3596					 sg_table + qm_sg_src_index, 0);3597		} else {3598			dpaa2_sg_set_final(sg_table + qm_sg_src_index - 1,3599					   true);3600		}3601 3602		edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table,3603						  qm_sg_bytes, DMA_TO_DEVICE);3604		if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {3605			dev_err(ctx->dev, "unable to map S/G table\n");3606			ret = -ENOMEM;3607			goto unmap_ctx;3608		}3609		edesc->qm_sg_bytes = qm_sg_bytes;3610 3611		memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));3612		dpaa2_fl_set_final(in_fle, true);3613		dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);3614		dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);3615		dpaa2_fl_set_len(in_fle, ctx->ctx_len + to_hash);3616		dpaa2_fl_set_format(out_fle, dpaa2_fl_single);3617		dpaa2_fl_set_addr(out_fle, state->ctx_dma);3618		dpaa2_fl_set_len(out_fle, ctx->ctx_len);3619 3620		req_ctx->flc = &ctx->flc[UPDATE];3621		req_ctx->flc_dma = ctx->flc_dma[UPDATE];3622		req_ctx->cbk = ahash_done_bi;3623		req_ctx->ctx = &req->base;3624		req_ctx->edesc = edesc;3625 3626		ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);3627		if (ret != -EINPROGRESS &&3628		    !(ret == -EBUSY &&3629		      req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))3630			goto unmap_ctx;3631	} else if (*next_buflen) {3632		scatterwalk_map_and_copy(buf + *buflen, req->src, 0,3633					 req->nbytes, 0);3634		*buflen = *next_buflen;3635 3636		print_hex_dump_debug("buf@" __stringify(__LINE__)": ",3637				     DUMP_PREFIX_ADDRESS, 16, 4, buf,3638				     *buflen, 1);3639	}3640 3641	return ret;3642unmap_ctx:3643	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL);3644	qi_cache_free(edesc);3645	return ret;3646}3647 3648static int ahash_final_ctx(struct ahash_request *req)3649{3650	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);3651	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);3652	struct caam_hash_state *state = ahash_request_ctx_dma(req);3653	struct caam_request *req_ctx = &state->caam_req;3654	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];3655	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];3656	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?3657		      GFP_KERNEL : GFP_ATOMIC;3658	int buflen = state->buflen;3659	int qm_sg_bytes;3660	int digestsize = crypto_ahash_digestsize(ahash);3661	struct ahash_edesc *edesc;3662	struct dpaa2_sg_entry *sg_table;3663	int ret;3664 3665	/* allocate space for base edesc and link tables */3666	edesc = qi_cache_zalloc(flags);3667	if (!edesc)3668		return -ENOMEM;3669 3670	qm_sg_bytes = pad_sg_nents(1 + (buflen ? 1 : 0)) * sizeof(*sg_table);3671	sg_table = &edesc->sgt[0];3672 3673	ret = ctx_map_to_qm_sg(ctx->dev, state, ctx->ctx_len, sg_table,3674			       DMA_BIDIRECTIONAL);3675	if (ret)3676		goto unmap_ctx;3677 3678	ret = buf_map_to_qm_sg(ctx->dev, sg_table + 1, state);3679	if (ret)3680		goto unmap_ctx;3681 3682	dpaa2_sg_set_final(sg_table + (buflen ? 1 : 0), true);3683 3684	edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table, qm_sg_bytes,3685					  DMA_TO_DEVICE);3686	if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {3687		dev_err(ctx->dev, "unable to map S/G table\n");3688		ret = -ENOMEM;3689		goto unmap_ctx;3690	}3691	edesc->qm_sg_bytes = qm_sg_bytes;3692 3693	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));3694	dpaa2_fl_set_final(in_fle, true);3695	dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);3696	dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);3697	dpaa2_fl_set_len(in_fle, ctx->ctx_len + buflen);3698	dpaa2_fl_set_format(out_fle, dpaa2_fl_single);3699	dpaa2_fl_set_addr(out_fle, state->ctx_dma);3700	dpaa2_fl_set_len(out_fle, digestsize);3701 3702	req_ctx->flc = &ctx->flc[FINALIZE];3703	req_ctx->flc_dma = ctx->flc_dma[FINALIZE];3704	req_ctx->cbk = ahash_done_ctx_src;3705	req_ctx->ctx = &req->base;3706	req_ctx->edesc = edesc;3707 3708	ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);3709	if (ret == -EINPROGRESS ||3710	    (ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))3711		return ret;3712 3713unmap_ctx:3714	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL);3715	qi_cache_free(edesc);3716	return ret;3717}3718 3719static int ahash_finup_ctx(struct ahash_request *req)3720{3721	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);3722	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);3723	struct caam_hash_state *state = ahash_request_ctx_dma(req);3724	struct caam_request *req_ctx = &state->caam_req;3725	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];3726	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];3727	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?3728		      GFP_KERNEL : GFP_ATOMIC;3729	int buflen = state->buflen;3730	int qm_sg_bytes, qm_sg_src_index;3731	int src_nents, mapped_nents;3732	int digestsize = crypto_ahash_digestsize(ahash);3733	struct ahash_edesc *edesc;3734	struct dpaa2_sg_entry *sg_table;3735	int ret;3736 3737	src_nents = sg_nents_for_len(req->src, req->nbytes);3738	if (src_nents < 0) {3739		dev_err(ctx->dev, "Invalid number of src SG.\n");3740		return src_nents;3741	}3742 3743	if (src_nents) {3744		mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents,3745					  DMA_TO_DEVICE);3746		if (!mapped_nents) {3747			dev_err(ctx->dev, "unable to DMA map source\n");3748			return -ENOMEM;3749		}3750	} else {3751		mapped_nents = 0;3752	}3753 3754	/* allocate space for base edesc and link tables */3755	edesc = qi_cache_zalloc(flags);3756	if (!edesc) {3757		dma_unmap_sg(ctx->dev, req->src, src_nents, DMA_TO_DEVICE);3758		return -ENOMEM;3759	}3760 3761	edesc->src_nents = src_nents;3762	qm_sg_src_index = 1 + (buflen ? 1 : 0);3763	qm_sg_bytes = pad_sg_nents(qm_sg_src_index + mapped_nents) *3764		      sizeof(*sg_table);3765	sg_table = &edesc->sgt[0];3766 3767	ret = ctx_map_to_qm_sg(ctx->dev, state, ctx->ctx_len, sg_table,3768			       DMA_BIDIRECTIONAL);3769	if (ret)3770		goto unmap_ctx;3771 3772	ret = buf_map_to_qm_sg(ctx->dev, sg_table + 1, state);3773	if (ret)3774		goto unmap_ctx;3775 3776	sg_to_qm_sg_last(req->src, req->nbytes, sg_table + qm_sg_src_index, 0);3777 3778	edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table, qm_sg_bytes,3779					  DMA_TO_DEVICE);3780	if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {3781		dev_err(ctx->dev, "unable to map S/G table\n");3782		ret = -ENOMEM;3783		goto unmap_ctx;3784	}3785	edesc->qm_sg_bytes = qm_sg_bytes;3786 3787	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));3788	dpaa2_fl_set_final(in_fle, true);3789	dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);3790	dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);3791	dpaa2_fl_set_len(in_fle, ctx->ctx_len + buflen + req->nbytes);3792	dpaa2_fl_set_format(out_fle, dpaa2_fl_single);3793	dpaa2_fl_set_addr(out_fle, state->ctx_dma);3794	dpaa2_fl_set_len(out_fle, digestsize);3795 3796	req_ctx->flc = &ctx->flc[FINALIZE];3797	req_ctx->flc_dma = ctx->flc_dma[FINALIZE];3798	req_ctx->cbk = ahash_done_ctx_src;3799	req_ctx->ctx = &req->base;3800	req_ctx->edesc = edesc;3801 3802	ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);3803	if (ret == -EINPROGRESS ||3804	    (ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))3805		return ret;3806 3807unmap_ctx:3808	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL);3809	qi_cache_free(edesc);3810	return ret;3811}3812 3813static int ahash_digest(struct ahash_request *req)3814{3815	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);3816	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);3817	struct caam_hash_state *state = ahash_request_ctx_dma(req);3818	struct caam_request *req_ctx = &state->caam_req;3819	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];3820	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];3821	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?3822		      GFP_KERNEL : GFP_ATOMIC;3823	int digestsize = crypto_ahash_digestsize(ahash);3824	int src_nents, mapped_nents;3825	struct ahash_edesc *edesc;3826	int ret = -ENOMEM;3827 3828	state->buf_dma = 0;3829 3830	src_nents = sg_nents_for_len(req->src, req->nbytes);3831	if (src_nents < 0) {3832		dev_err(ctx->dev, "Invalid number of src SG.\n");3833		return src_nents;3834	}3835 3836	if (src_nents) {3837		mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents,3838					  DMA_TO_DEVICE);3839		if (!mapped_nents) {3840			dev_err(ctx->dev, "unable to map source for DMA\n");3841			return ret;3842		}3843	} else {3844		mapped_nents = 0;3845	}3846 3847	/* allocate space for base edesc and link tables */3848	edesc = qi_cache_zalloc(flags);3849	if (!edesc) {3850		dma_unmap_sg(ctx->dev, req->src, src_nents, DMA_TO_DEVICE);3851		return ret;3852	}3853 3854	edesc->src_nents = src_nents;3855	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));3856 3857	if (mapped_nents > 1) {3858		int qm_sg_bytes;3859		struct dpaa2_sg_entry *sg_table = &edesc->sgt[0];3860 3861		qm_sg_bytes = pad_sg_nents(mapped_nents) * sizeof(*sg_table);3862		sg_to_qm_sg_last(req->src, req->nbytes, sg_table, 0);3863		edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table,3864						  qm_sg_bytes, DMA_TO_DEVICE);3865		if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {3866			dev_err(ctx->dev, "unable to map S/G table\n");3867			goto unmap;3868		}3869		edesc->qm_sg_bytes = qm_sg_bytes;3870		dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);3871		dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);3872	} else {3873		dpaa2_fl_set_format(in_fle, dpaa2_fl_single);3874		dpaa2_fl_set_addr(in_fle, sg_dma_address(req->src));3875	}3876 3877	state->ctx_dma_len = digestsize;3878	state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx, digestsize,3879					DMA_FROM_DEVICE);3880	if (dma_mapping_error(ctx->dev, state->ctx_dma)) {3881		dev_err(ctx->dev, "unable to map ctx\n");3882		state->ctx_dma = 0;3883		goto unmap;3884	}3885 3886	dpaa2_fl_set_final(in_fle, true);3887	dpaa2_fl_set_len(in_fle, req->nbytes);3888	dpaa2_fl_set_format(out_fle, dpaa2_fl_single);3889	dpaa2_fl_set_addr(out_fle, state->ctx_dma);3890	dpaa2_fl_set_len(out_fle, digestsize);3891 3892	req_ctx->flc = &ctx->flc[DIGEST];3893	req_ctx->flc_dma = ctx->flc_dma[DIGEST];3894	req_ctx->cbk = ahash_done;3895	req_ctx->ctx = &req->base;3896	req_ctx->edesc = edesc;3897	ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);3898	if (ret == -EINPROGRESS ||3899	    (ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))3900		return ret;3901 3902unmap:3903	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE);3904	qi_cache_free(edesc);3905	return ret;3906}3907 3908static int ahash_final_no_ctx(struct ahash_request *req)3909{3910	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);3911	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);3912	struct caam_hash_state *state = ahash_request_ctx_dma(req);3913	struct caam_request *req_ctx = &state->caam_req;3914	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];3915	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];3916	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?3917		      GFP_KERNEL : GFP_ATOMIC;3918	u8 *buf = state->buf;3919	int buflen = state->buflen;3920	int digestsize = crypto_ahash_digestsize(ahash);3921	struct ahash_edesc *edesc;3922	int ret = -ENOMEM;3923 3924	/* allocate space for base edesc and link tables */3925	edesc = qi_cache_zalloc(flags);3926	if (!edesc)3927		return ret;3928 3929	if (buflen) {3930		state->buf_dma = dma_map_single(ctx->dev, buf, buflen,3931						DMA_TO_DEVICE);3932		if (dma_mapping_error(ctx->dev, state->buf_dma)) {3933			dev_err(ctx->dev, "unable to map src\n");3934			goto unmap;3935		}3936	}3937 3938	state->ctx_dma_len = digestsize;3939	state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx, digestsize,3940					DMA_FROM_DEVICE);3941	if (dma_mapping_error(ctx->dev, state->ctx_dma)) {3942		dev_err(ctx->dev, "unable to map ctx\n");3943		state->ctx_dma = 0;3944		goto unmap;3945	}3946 3947	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));3948	dpaa2_fl_set_final(in_fle, true);3949	/*3950	 * crypto engine requires the input entry to be present when3951	 * "frame list" FD is used.3952	 * Since engine does not support FMT=2'b11 (unused entry type), leaving3953	 * in_fle zeroized (except for "Final" flag) is the best option.3954	 */3955	if (buflen) {3956		dpaa2_fl_set_format(in_fle, dpaa2_fl_single);3957		dpaa2_fl_set_addr(in_fle, state->buf_dma);3958		dpaa2_fl_set_len(in_fle, buflen);3959	}3960	dpaa2_fl_set_format(out_fle, dpaa2_fl_single);3961	dpaa2_fl_set_addr(out_fle, state->ctx_dma);3962	dpaa2_fl_set_len(out_fle, digestsize);3963 3964	req_ctx->flc = &ctx->flc[DIGEST];3965	req_ctx->flc_dma = ctx->flc_dma[DIGEST];3966	req_ctx->cbk = ahash_done;3967	req_ctx->ctx = &req->base;3968	req_ctx->edesc = edesc;3969 3970	ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);3971	if (ret == -EINPROGRESS ||3972	    (ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))3973		return ret;3974 3975unmap:3976	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE);3977	qi_cache_free(edesc);3978	return ret;3979}3980 3981static int ahash_update_no_ctx(struct ahash_request *req)3982{3983	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);3984	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);3985	struct caam_hash_state *state = ahash_request_ctx_dma(req);3986	struct caam_request *req_ctx = &state->caam_req;3987	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];3988	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];3989	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?3990		      GFP_KERNEL : GFP_ATOMIC;3991	u8 *buf = state->buf;3992	int *buflen = &state->buflen;3993	int *next_buflen = &state->next_buflen;3994	int in_len = *buflen + req->nbytes, to_hash;3995	int qm_sg_bytes, src_nents, mapped_nents;3996	struct ahash_edesc *edesc;3997	int ret = 0;3998 3999	*next_buflen = in_len & (crypto_tfm_alg_blocksize(&ahash->base) - 1);4000	to_hash = in_len - *next_buflen;4001 4002	if (to_hash) {4003		struct dpaa2_sg_entry *sg_table;4004		int src_len = req->nbytes - *next_buflen;4005 4006		src_nents = sg_nents_for_len(req->src, src_len);4007		if (src_nents < 0) {4008			dev_err(ctx->dev, "Invalid number of src SG.\n");4009			return src_nents;4010		}4011 4012		if (src_nents) {4013			mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents,4014						  DMA_TO_DEVICE);4015			if (!mapped_nents) {4016				dev_err(ctx->dev, "unable to DMA map source\n");4017				return -ENOMEM;4018			}4019		} else {4020			mapped_nents = 0;4021		}4022 4023		/* allocate space for base edesc and link tables */4024		edesc = qi_cache_zalloc(flags);4025		if (!edesc) {4026			dma_unmap_sg(ctx->dev, req->src, src_nents,4027				     DMA_TO_DEVICE);4028			return -ENOMEM;4029		}4030 4031		edesc->src_nents = src_nents;4032		qm_sg_bytes = pad_sg_nents(1 + mapped_nents) *4033			      sizeof(*sg_table);4034		sg_table = &edesc->sgt[0];4035 4036		ret = buf_map_to_qm_sg(ctx->dev, sg_table, state);4037		if (ret)4038			goto unmap_ctx;4039 4040		sg_to_qm_sg_last(req->src, src_len, sg_table + 1, 0);4041 4042		edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table,4043						  qm_sg_bytes, DMA_TO_DEVICE);4044		if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {4045			dev_err(ctx->dev, "unable to map S/G table\n");4046			ret = -ENOMEM;4047			goto unmap_ctx;4048		}4049		edesc->qm_sg_bytes = qm_sg_bytes;4050 4051		state->ctx_dma_len = ctx->ctx_len;4052		state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx,4053						ctx->ctx_len, DMA_FROM_DEVICE);4054		if (dma_mapping_error(ctx->dev, state->ctx_dma)) {4055			dev_err(ctx->dev, "unable to map ctx\n");4056			state->ctx_dma = 0;4057			ret = -ENOMEM;4058			goto unmap_ctx;4059		}4060 4061		memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));4062		dpaa2_fl_set_final(in_fle, true);4063		dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);4064		dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);4065		dpaa2_fl_set_len(in_fle, to_hash);4066		dpaa2_fl_set_format(out_fle, dpaa2_fl_single);4067		dpaa2_fl_set_addr(out_fle, state->ctx_dma);4068		dpaa2_fl_set_len(out_fle, ctx->ctx_len);4069 4070		req_ctx->flc = &ctx->flc[UPDATE_FIRST];4071		req_ctx->flc_dma = ctx->flc_dma[UPDATE_FIRST];4072		req_ctx->cbk = ahash_done_ctx_dst;4073		req_ctx->ctx = &req->base;4074		req_ctx->edesc = edesc;4075 4076		ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);4077		if (ret != -EINPROGRESS &&4078		    !(ret == -EBUSY &&4079		      req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))4080			goto unmap_ctx;4081 4082		state->update = ahash_update_ctx;4083		state->finup = ahash_finup_ctx;4084		state->final = ahash_final_ctx;4085	} else if (*next_buflen) {4086		scatterwalk_map_and_copy(buf + *buflen, req->src, 0,4087					 req->nbytes, 0);4088		*buflen = *next_buflen;4089 4090		print_hex_dump_debug("buf@" __stringify(__LINE__)": ",4091				     DUMP_PREFIX_ADDRESS, 16, 4, buf,4092				     *buflen, 1);4093	}4094 4095	return ret;4096unmap_ctx:4097	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_TO_DEVICE);4098	qi_cache_free(edesc);4099	return ret;4100}4101 4102static int ahash_finup_no_ctx(struct ahash_request *req)4103{4104	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);4105	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);4106	struct caam_hash_state *state = ahash_request_ctx_dma(req);4107	struct caam_request *req_ctx = &state->caam_req;4108	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];4109	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];4110	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?4111		      GFP_KERNEL : GFP_ATOMIC;4112	int buflen = state->buflen;4113	int qm_sg_bytes, src_nents, mapped_nents;4114	int digestsize = crypto_ahash_digestsize(ahash);4115	struct ahash_edesc *edesc;4116	struct dpaa2_sg_entry *sg_table;4117	int ret = -ENOMEM;4118 4119	src_nents = sg_nents_for_len(req->src, req->nbytes);4120	if (src_nents < 0) {4121		dev_err(ctx->dev, "Invalid number of src SG.\n");4122		return src_nents;4123	}4124 4125	if (src_nents) {4126		mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents,4127					  DMA_TO_DEVICE);4128		if (!mapped_nents) {4129			dev_err(ctx->dev, "unable to DMA map source\n");4130			return ret;4131		}4132	} else {4133		mapped_nents = 0;4134	}4135 4136	/* allocate space for base edesc and link tables */4137	edesc = qi_cache_zalloc(flags);4138	if (!edesc) {4139		dma_unmap_sg(ctx->dev, req->src, src_nents, DMA_TO_DEVICE);4140		return ret;4141	}4142 4143	edesc->src_nents = src_nents;4144	qm_sg_bytes = pad_sg_nents(2 + mapped_nents) * sizeof(*sg_table);4145	sg_table = &edesc->sgt[0];4146 4147	ret = buf_map_to_qm_sg(ctx->dev, sg_table, state);4148	if (ret)4149		goto unmap;4150 4151	sg_to_qm_sg_last(req->src, req->nbytes, sg_table + 1, 0);4152 4153	edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table, qm_sg_bytes,4154					  DMA_TO_DEVICE);4155	if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {4156		dev_err(ctx->dev, "unable to map S/G table\n");4157		ret = -ENOMEM;4158		goto unmap;4159	}4160	edesc->qm_sg_bytes = qm_sg_bytes;4161 4162	state->ctx_dma_len = digestsize;4163	state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx, digestsize,4164					DMA_FROM_DEVICE);4165	if (dma_mapping_error(ctx->dev, state->ctx_dma)) {4166		dev_err(ctx->dev, "unable to map ctx\n");4167		state->ctx_dma = 0;4168		ret = -ENOMEM;4169		goto unmap;4170	}4171 4172	memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));4173	dpaa2_fl_set_final(in_fle, true);4174	dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);4175	dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);4176	dpaa2_fl_set_len(in_fle, buflen + req->nbytes);4177	dpaa2_fl_set_format(out_fle, dpaa2_fl_single);4178	dpaa2_fl_set_addr(out_fle, state->ctx_dma);4179	dpaa2_fl_set_len(out_fle, digestsize);4180 4181	req_ctx->flc = &ctx->flc[DIGEST];4182	req_ctx->flc_dma = ctx->flc_dma[DIGEST];4183	req_ctx->cbk = ahash_done;4184	req_ctx->ctx = &req->base;4185	req_ctx->edesc = edesc;4186	ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);4187	if (ret != -EINPROGRESS &&4188	    !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG))4189		goto unmap;4190 4191	return ret;4192unmap:4193	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE);4194	qi_cache_free(edesc);4195	return ret;4196}4197 4198static int ahash_update_first(struct ahash_request *req)4199{4200	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);4201	struct caam_hash_ctx *ctx = crypto_ahash_ctx_dma(ahash);4202	struct caam_hash_state *state = ahash_request_ctx_dma(req);4203	struct caam_request *req_ctx = &state->caam_req;4204	struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1];4205	struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0];4206	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?4207		      GFP_KERNEL : GFP_ATOMIC;4208	u8 *buf = state->buf;4209	int *buflen = &state->buflen;4210	int *next_buflen = &state->next_buflen;4211	int to_hash;4212	int src_nents, mapped_nents;4213	struct ahash_edesc *edesc;4214	int ret = 0;4215 4216	*next_buflen = req->nbytes & (crypto_tfm_alg_blocksize(&ahash->base) -4217				      1);4218	to_hash = req->nbytes - *next_buflen;4219 4220	if (to_hash) {4221		struct dpaa2_sg_entry *sg_table;4222		int src_len = req->nbytes - *next_buflen;4223 4224		src_nents = sg_nents_for_len(req->src, src_len);4225		if (src_nents < 0) {4226			dev_err(ctx->dev, "Invalid number of src SG.\n");4227			return src_nents;4228		}4229 4230		if (src_nents) {4231			mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents,4232						  DMA_TO_DEVICE);4233			if (!mapped_nents) {4234				dev_err(ctx->dev, "unable to map source for DMA\n");4235				return -ENOMEM;4236			}4237		} else {4238			mapped_nents = 0;4239		}4240 4241		/* allocate space for base edesc and link tables */4242		edesc = qi_cache_zalloc(flags);4243		if (!edesc) {4244			dma_unmap_sg(ctx->dev, req->src, src_nents,4245				     DMA_TO_DEVICE);4246			return -ENOMEM;4247		}4248 4249		edesc->src_nents = src_nents;4250		sg_table = &edesc->sgt[0];4251 4252		memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt));4253		dpaa2_fl_set_final(in_fle, true);4254		dpaa2_fl_set_len(in_fle, to_hash);4255 4256		if (mapped_nents > 1) {4257			int qm_sg_bytes;4258 4259			sg_to_qm_sg_last(req->src, src_len, sg_table, 0);4260			qm_sg_bytes = pad_sg_nents(mapped_nents) *4261				      sizeof(*sg_table);4262			edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table,4263							  qm_sg_bytes,4264							  DMA_TO_DEVICE);4265			if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) {4266				dev_err(ctx->dev, "unable to map S/G table\n");4267				ret = -ENOMEM;4268				goto unmap_ctx;4269			}4270			edesc->qm_sg_bytes = qm_sg_bytes;4271			dpaa2_fl_set_format(in_fle, dpaa2_fl_sg);4272			dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma);4273		} else {4274			dpaa2_fl_set_format(in_fle, dpaa2_fl_single);4275			dpaa2_fl_set_addr(in_fle, sg_dma_address(req->src));4276		}4277 4278		state->ctx_dma_len = ctx->ctx_len;4279		state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx,4280						ctx->ctx_len, DMA_FROM_DEVICE);4281		if (dma_mapping_error(ctx->dev, state->ctx_dma)) {4282			dev_err(ctx->dev, "unable to map ctx\n");4283			state->ctx_dma = 0;4284			ret = -ENOMEM;4285			goto unmap_ctx;4286		}4287 4288		dpaa2_fl_set_format(out_fle, dpaa2_fl_single);4289		dpaa2_fl_set_addr(out_fle, state->ctx_dma);4290		dpaa2_fl_set_len(out_fle, ctx->ctx_len);4291 4292		req_ctx->flc = &ctx->flc[UPDATE_FIRST];4293		req_ctx->flc_dma = ctx->flc_dma[UPDATE_FIRST];4294		req_ctx->cbk = ahash_done_ctx_dst;4295		req_ctx->ctx = &req->base;4296		req_ctx->edesc = edesc;4297 4298		ret = dpaa2_caam_enqueue(ctx->dev, req_ctx);4299		if (ret != -EINPROGRESS &&4300		    !(ret == -EBUSY && req->base.flags &4301		      CRYPTO_TFM_REQ_MAY_BACKLOG))4302			goto unmap_ctx;4303 4304		state->update = ahash_update_ctx;4305		state->finup = ahash_finup_ctx;4306		state->final = ahash_final_ctx;4307	} else if (*next_buflen) {4308		state->update = ahash_update_no_ctx;4309		state->finup = ahash_finup_no_ctx;4310		state->final = ahash_final_no_ctx;4311		scatterwalk_map_and_copy(buf, req->src, 0,4312					 req->nbytes, 0);4313		*buflen = *next_buflen;4314 4315		print_hex_dump_debug("buf@" __stringify(__LINE__)": ",4316				     DUMP_PREFIX_ADDRESS, 16, 4, buf,4317				     *buflen, 1);4318	}4319 4320	return ret;4321unmap_ctx:4322	ahash_unmap_ctx(ctx->dev, edesc, req, DMA_TO_DEVICE);4323	qi_cache_free(edesc);4324	return ret;4325}4326 4327static int ahash_finup_first(struct ahash_request *req)4328{4329	return ahash_digest(req);4330}4331 4332static int ahash_init(struct ahash_request *req)4333{4334	struct caam_hash_state *state = ahash_request_ctx_dma(req);4335 4336	state->update = ahash_update_first;4337	state->finup = ahash_finup_first;4338	state->final = ahash_final_no_ctx;4339 4340	state->ctx_dma = 0;4341	state->ctx_dma_len = 0;4342	state->buf_dma = 0;4343	state->buflen = 0;4344	state->next_buflen = 0;4345 4346	return 0;4347}4348 4349static int ahash_update(struct ahash_request *req)4350{4351	struct caam_hash_state *state = ahash_request_ctx_dma(req);4352 4353	return state->update(req);4354}4355 4356static int ahash_finup(struct ahash_request *req)4357{4358	struct caam_hash_state *state = ahash_request_ctx_dma(req);4359 4360	return state->finup(req);4361}4362 4363static int ahash_final(struct ahash_request *req)4364{4365	struct caam_hash_state *state = ahash_request_ctx_dma(req);4366 4367	return state->final(req);4368}4369 4370static int ahash_export(struct ahash_request *req, void *out)4371{4372	struct caam_hash_state *state = ahash_request_ctx_dma(req);4373	struct caam_export_state *export = out;4374	u8 *buf = state->buf;4375	int len = state->buflen;4376 4377	memcpy(export->buf, buf, len);4378	memcpy(export->caam_ctx, state->caam_ctx, sizeof(export->caam_ctx));4379	export->buflen = len;4380	export->update = state->update;4381	export->final = state->final;4382	export->finup = state->finup;4383 4384	return 0;4385}4386 4387static int ahash_import(struct ahash_request *req, const void *in)4388{4389	struct caam_hash_state *state = ahash_request_ctx_dma(req);4390	const struct caam_export_state *export = in;4391 4392	memset(state, 0, sizeof(*state));4393	memcpy(state->buf, export->buf, export->buflen);4394	memcpy(state->caam_ctx, export->caam_ctx, sizeof(state->caam_ctx));4395	state->buflen = export->buflen;4396	state->update = export->update;4397	state->final = export->final;4398	state->finup = export->finup;4399 4400	return 0;4401}4402 4403struct caam_hash_template {4404	char name[CRYPTO_MAX_ALG_NAME];4405	char driver_name[CRYPTO_MAX_ALG_NAME];4406	char hmac_name[CRYPTO_MAX_ALG_NAME];4407	char hmac_driver_name[CRYPTO_MAX_ALG_NAME];4408	unsigned int blocksize;4409	struct ahash_alg template_ahash;4410	u32 alg_type;4411};4412 4413/* ahash descriptors */4414static struct caam_hash_template driver_hash[] = {4415	{4416		.name = "sha1",4417		.driver_name = "sha1-caam-qi2",4418		.hmac_name = "hmac(sha1)",4419		.hmac_driver_name = "hmac-sha1-caam-qi2",4420		.blocksize = SHA1_BLOCK_SIZE,4421		.template_ahash = {4422			.init = ahash_init,4423			.update = ahash_update,4424			.final = ahash_final,4425			.finup = ahash_finup,4426			.digest = ahash_digest,4427			.export = ahash_export,4428			.import = ahash_import,4429			.setkey = ahash_setkey,4430			.halg = {4431				.digestsize = SHA1_DIGEST_SIZE,4432				.statesize = sizeof(struct caam_export_state),4433			},4434		},4435		.alg_type = OP_ALG_ALGSEL_SHA1,4436	}, {4437		.name = "sha224",4438		.driver_name = "sha224-caam-qi2",4439		.hmac_name = "hmac(sha224)",4440		.hmac_driver_name = "hmac-sha224-caam-qi2",4441		.blocksize = SHA224_BLOCK_SIZE,4442		.template_ahash = {4443			.init = ahash_init,4444			.update = ahash_update,4445			.final = ahash_final,4446			.finup = ahash_finup,4447			.digest = ahash_digest,4448			.export = ahash_export,4449			.import = ahash_import,4450			.setkey = ahash_setkey,4451			.halg = {4452				.digestsize = SHA224_DIGEST_SIZE,4453				.statesize = sizeof(struct caam_export_state),4454			},4455		},4456		.alg_type = OP_ALG_ALGSEL_SHA224,4457	}, {4458		.name = "sha256",4459		.driver_name = "sha256-caam-qi2",4460		.hmac_name = "hmac(sha256)",4461		.hmac_driver_name = "hmac-sha256-caam-qi2",4462		.blocksize = SHA256_BLOCK_SIZE,4463		.template_ahash = {4464			.init = ahash_init,4465			.update = ahash_update,4466			.final = ahash_final,4467			.finup = ahash_finup,4468			.digest = ahash_digest,4469			.export = ahash_export,4470			.import = ahash_import,4471			.setkey = ahash_setkey,4472			.halg = {4473				.digestsize = SHA256_DIGEST_SIZE,4474				.statesize = sizeof(struct caam_export_state),4475			},4476		},4477		.alg_type = OP_ALG_ALGSEL_SHA256,4478	}, {4479		.name = "sha384",4480		.driver_name = "sha384-caam-qi2",4481		.hmac_name = "hmac(sha384)",4482		.hmac_driver_name = "hmac-sha384-caam-qi2",4483		.blocksize = SHA384_BLOCK_SIZE,4484		.template_ahash = {4485			.init = ahash_init,4486			.update = ahash_update,4487			.final = ahash_final,4488			.finup = ahash_finup,4489			.digest = ahash_digest,4490			.export = ahash_export,4491			.import = ahash_import,4492			.setkey = ahash_setkey,4493			.halg = {4494				.digestsize = SHA384_DIGEST_SIZE,4495				.statesize = sizeof(struct caam_export_state),4496			},4497		},4498		.alg_type = OP_ALG_ALGSEL_SHA384,4499	}, {4500		.name = "sha512",4501		.driver_name = "sha512-caam-qi2",4502		.hmac_name = "hmac(sha512)",4503		.hmac_driver_name = "hmac-sha512-caam-qi2",4504		.blocksize = SHA512_BLOCK_SIZE,4505		.template_ahash = {4506			.init = ahash_init,4507			.update = ahash_update,4508			.final = ahash_final,4509			.finup = ahash_finup,4510			.digest = ahash_digest,4511			.export = ahash_export,4512			.import = ahash_import,4513			.setkey = ahash_setkey,4514			.halg = {4515				.digestsize = SHA512_DIGEST_SIZE,4516				.statesize = sizeof(struct caam_export_state),4517			},4518		},4519		.alg_type = OP_ALG_ALGSEL_SHA512,4520	}, {4521		.name = "md5",4522		.driver_name = "md5-caam-qi2",4523		.hmac_name = "hmac(md5)",4524		.hmac_driver_name = "hmac-md5-caam-qi2",4525		.blocksize = MD5_BLOCK_WORDS * 4,4526		.template_ahash = {4527			.init = ahash_init,4528			.update = ahash_update,4529			.final = ahash_final,4530			.finup = ahash_finup,4531			.digest = ahash_digest,4532			.export = ahash_export,4533			.import = ahash_import,4534			.setkey = ahash_setkey,4535			.halg = {4536				.digestsize = MD5_DIGEST_SIZE,4537				.statesize = sizeof(struct caam_export_state),4538			},4539		},4540		.alg_type = OP_ALG_ALGSEL_MD5,4541	}4542};4543 4544struct caam_hash_alg {4545	struct list_head entry;4546	struct device *dev;4547	int alg_type;4548	bool is_hmac;4549	struct ahash_alg ahash_alg;4550};4551 4552static int caam_hash_cra_init(struct crypto_tfm *tfm)4553{4554	struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);4555	struct crypto_alg *base = tfm->__crt_alg;4556	struct hash_alg_common *halg =4557		 container_of(base, struct hash_alg_common, base);4558	struct ahash_alg *alg =4559		 container_of(halg, struct ahash_alg, halg);4560	struct caam_hash_alg *caam_hash =4561		 container_of(alg, struct caam_hash_alg, ahash_alg);4562	struct caam_hash_ctx *ctx = crypto_tfm_ctx_dma(tfm);4563	/* Sizes for MDHA running digests: MD5, SHA1, 224, 256, 384, 512 */4564	static const u8 runninglen[] = { HASH_MSG_LEN + MD5_DIGEST_SIZE,4565					 HASH_MSG_LEN + SHA1_DIGEST_SIZE,4566					 HASH_MSG_LEN + 32,4567					 HASH_MSG_LEN + SHA256_DIGEST_SIZE,4568					 HASH_MSG_LEN + 64,4569					 HASH_MSG_LEN + SHA512_DIGEST_SIZE };4570	dma_addr_t dma_addr;4571	int i;4572 4573	ctx->dev = caam_hash->dev;4574 4575	if (caam_hash->is_hmac) {4576		ctx->adata.key_dma = dma_map_single_attrs(ctx->dev, ctx->key,4577							  ARRAY_SIZE(ctx->key),4578							  DMA_TO_DEVICE,4579							  DMA_ATTR_SKIP_CPU_SYNC);4580		if (dma_mapping_error(ctx->dev, ctx->adata.key_dma)) {4581			dev_err(ctx->dev, "unable to map key\n");4582			return -ENOMEM;4583		}4584	}4585 4586	dma_addr = dma_map_single_attrs(ctx->dev, ctx->flc, sizeof(ctx->flc),4587					DMA_BIDIRECTIONAL,4588					DMA_ATTR_SKIP_CPU_SYNC);4589	if (dma_mapping_error(ctx->dev, dma_addr)) {4590		dev_err(ctx->dev, "unable to map shared descriptors\n");4591		if (ctx->adata.key_dma)4592			dma_unmap_single_attrs(ctx->dev, ctx->adata.key_dma,4593					       ARRAY_SIZE(ctx->key),4594					       DMA_TO_DEVICE,4595					       DMA_ATTR_SKIP_CPU_SYNC);4596		return -ENOMEM;4597	}4598 4599	for (i = 0; i < HASH_NUM_OP; i++)4600		ctx->flc_dma[i] = dma_addr + i * sizeof(ctx->flc[i]);4601 4602	/* copy descriptor header template value */4603	ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam_hash->alg_type;4604 4605	ctx->ctx_len = runninglen[(ctx->adata.algtype &4606				   OP_ALG_ALGSEL_SUBMASK) >>4607				  OP_ALG_ALGSEL_SHIFT];4608 4609	crypto_ahash_set_reqsize_dma(ahash, sizeof(struct caam_hash_state));4610 4611	/*4612	 * For keyed hash algorithms shared descriptors4613	 * will be created later in setkey() callback4614	 */4615	return caam_hash->is_hmac ? 0 : ahash_set_sh_desc(ahash);4616}4617 4618static void caam_hash_cra_exit(struct crypto_tfm *tfm)4619{4620	struct caam_hash_ctx *ctx = crypto_tfm_ctx_dma(tfm);4621 4622	dma_unmap_single_attrs(ctx->dev, ctx->flc_dma[0], sizeof(ctx->flc),4623			       DMA_BIDIRECTIONAL, DMA_ATTR_SKIP_CPU_SYNC);4624	if (ctx->adata.key_dma)4625		dma_unmap_single_attrs(ctx->dev, ctx->adata.key_dma,4626				       ARRAY_SIZE(ctx->key), DMA_TO_DEVICE,4627				       DMA_ATTR_SKIP_CPU_SYNC);4628}4629 4630static struct caam_hash_alg *caam_hash_alloc(struct device *dev,4631	struct caam_hash_template *template, bool keyed)4632{4633	struct caam_hash_alg *t_alg;4634	struct ahash_alg *halg;4635	struct crypto_alg *alg;4636 4637	t_alg = kzalloc(sizeof(*t_alg), GFP_KERNEL);4638	if (!t_alg)4639		return ERR_PTR(-ENOMEM);4640 4641	t_alg->ahash_alg = template->template_ahash;4642	halg = &t_alg->ahash_alg;4643	alg = &halg->halg.base;4644 4645	if (keyed) {4646		snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",4647			 template->hmac_name);4648		snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",4649			 template->hmac_driver_name);4650		t_alg->is_hmac = true;4651	} else {4652		snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",4653			 template->name);4654		snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",4655			 template->driver_name);4656		t_alg->ahash_alg.setkey = NULL;4657		t_alg->is_hmac = false;4658	}4659	alg->cra_module = THIS_MODULE;4660	alg->cra_init = caam_hash_cra_init;4661	alg->cra_exit = caam_hash_cra_exit;4662	alg->cra_ctxsize = sizeof(struct caam_hash_ctx) + crypto_dma_padding();4663	alg->cra_priority = CAAM_CRA_PRIORITY;4664	alg->cra_blocksize = template->blocksize;4665	alg->cra_alignmask = 0;4666	alg->cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY;4667 4668	t_alg->alg_type = template->alg_type;4669	t_alg->dev = dev;4670 4671	return t_alg;4672}4673 4674static void dpaa2_caam_fqdan_cb(struct dpaa2_io_notification_ctx *nctx)4675{4676	struct dpaa2_caam_priv_per_cpu *ppriv;4677 4678	ppriv = container_of(nctx, struct dpaa2_caam_priv_per_cpu, nctx);4679	napi_schedule_irqoff(&ppriv->napi);4680}4681 4682static int __cold dpaa2_dpseci_dpio_setup(struct dpaa2_caam_priv *priv)4683{4684	struct device *dev = priv->dev;4685	struct dpaa2_io_notification_ctx *nctx;4686	struct dpaa2_caam_priv_per_cpu *ppriv;4687	int err, i = 0, cpu;4688 4689	for_each_online_cpu(cpu) {4690		ppriv = per_cpu_ptr(priv->ppriv, cpu);4691		ppriv->priv = priv;4692		nctx = &ppriv->nctx;4693		nctx->is_cdan = 0;4694		nctx->id = ppriv->rsp_fqid;4695		nctx->desired_cpu = cpu;4696		nctx->cb = dpaa2_caam_fqdan_cb;4697 4698		/* Register notification callbacks */4699		ppriv->dpio = dpaa2_io_service_select(cpu);4700		err = dpaa2_io_service_register(ppriv->dpio, nctx, dev);4701		if (unlikely(err)) {4702			dev_dbg(dev, "No affine DPIO for cpu %d\n", cpu);4703			nctx->cb = NULL;4704			/*4705			 * If no affine DPIO for this core, there's probably4706			 * none available for next cores either. Signal we want4707			 * to retry later, in case the DPIO devices weren't4708			 * probed yet.4709			 */4710			err = -EPROBE_DEFER;4711			goto err;4712		}4713 4714		ppriv->store = dpaa2_io_store_create(DPAA2_CAAM_STORE_SIZE,4715						     dev);4716		if (unlikely(!ppriv->store)) {4717			dev_err(dev, "dpaa2_io_store_create() failed\n");4718			err = -ENOMEM;4719			goto err;4720		}4721 4722		if (++i == priv->num_pairs)4723			break;4724	}4725 4726	return 0;4727 4728err:4729	for_each_online_cpu(cpu) {4730		ppriv = per_cpu_ptr(priv->ppriv, cpu);4731		if (!ppriv->nctx.cb)4732			break;4733		dpaa2_io_service_deregister(ppriv->dpio, &ppriv->nctx, dev);4734	}4735 4736	for_each_online_cpu(cpu) {4737		ppriv = per_cpu_ptr(priv->ppriv, cpu);4738		if (!ppriv->store)4739			break;4740		dpaa2_io_store_destroy(ppriv->store);4741	}4742 4743	return err;4744}4745 4746static void __cold dpaa2_dpseci_dpio_free(struct dpaa2_caam_priv *priv)4747{4748	struct dpaa2_caam_priv_per_cpu *ppriv;4749	int i = 0, cpu;4750 4751	for_each_online_cpu(cpu) {4752		ppriv = per_cpu_ptr(priv->ppriv, cpu);4753		dpaa2_io_service_deregister(ppriv->dpio, &ppriv->nctx,4754					    priv->dev);4755		dpaa2_io_store_destroy(ppriv->store);4756 4757		if (++i == priv->num_pairs)4758			return;4759	}4760}4761 4762static int dpaa2_dpseci_bind(struct dpaa2_caam_priv *priv)4763{4764	struct dpseci_rx_queue_cfg rx_queue_cfg;4765	struct device *dev = priv->dev;4766	struct fsl_mc_device *ls_dev = to_fsl_mc_device(dev);4767	struct dpaa2_caam_priv_per_cpu *ppriv;4768	int err = 0, i = 0, cpu;4769 4770	/* Configure Rx queues */4771	for_each_online_cpu(cpu) {4772		ppriv = per_cpu_ptr(priv->ppriv, cpu);4773 4774		rx_queue_cfg.options = DPSECI_QUEUE_OPT_DEST |4775				       DPSECI_QUEUE_OPT_USER_CTX;4776		rx_queue_cfg.order_preservation_en = 0;4777		rx_queue_cfg.dest_cfg.dest_type = DPSECI_DEST_DPIO;4778		rx_queue_cfg.dest_cfg.dest_id = ppriv->nctx.dpio_id;4779		/*4780		 * Rx priority (WQ) doesn't really matter, since we use4781		 * pull mode, i.e. volatile dequeues from specific FQs4782		 */4783		rx_queue_cfg.dest_cfg.priority = 0;4784		rx_queue_cfg.user_ctx = ppriv->nctx.qman64;4785 4786		err = dpseci_set_rx_queue(priv->mc_io, 0, ls_dev->mc_handle, i,4787					  &rx_queue_cfg);4788		if (err) {4789			dev_err(dev, "dpseci_set_rx_queue() failed with err %d\n",4790				err);4791			return err;4792		}4793 4794		if (++i == priv->num_pairs)4795			break;4796	}4797 4798	return err;4799}4800 4801static void dpaa2_dpseci_congestion_free(struct dpaa2_caam_priv *priv)4802{4803	struct device *dev = priv->dev;4804 4805	if (!priv->cscn_mem)4806		return;4807 4808	dma_unmap_single(dev, priv->cscn_dma, DPAA2_CSCN_SIZE, DMA_FROM_DEVICE);4809	kfree(priv->cscn_mem);4810}4811 4812static void dpaa2_dpseci_free(struct dpaa2_caam_priv *priv)4813{4814	struct device *dev = priv->dev;4815	struct fsl_mc_device *ls_dev = to_fsl_mc_device(dev);4816	int err;4817 4818	if (DPSECI_VER(priv->major_ver, priv->minor_ver) > DPSECI_VER(5, 3)) {4819		err = dpseci_reset(priv->mc_io, 0, ls_dev->mc_handle);4820		if (err)4821			dev_err(dev, "dpseci_reset() failed\n");4822	}4823 4824	dpaa2_dpseci_congestion_free(priv);4825	dpseci_close(priv->mc_io, 0, ls_dev->mc_handle);4826}4827 4828static void dpaa2_caam_process_fd(struct dpaa2_caam_priv *priv,4829				  const struct dpaa2_fd *fd)4830{4831	struct caam_request *req;4832	u32 fd_err;4833 4834	if (dpaa2_fd_get_format(fd) != dpaa2_fd_list) {4835		dev_err(priv->dev, "Only Frame List FD format is supported!\n");4836		return;4837	}4838 4839	fd_err = dpaa2_fd_get_ctrl(fd) & FD_CTRL_ERR_MASK;4840	if (unlikely(fd_err))4841		dev_err_ratelimited(priv->dev, "FD error: %08x\n", fd_err);4842 4843	/*4844	 * FD[ADDR] is guaranteed to be valid, irrespective of errors reported4845	 * in FD[ERR] or FD[FRC].4846	 */4847	req = dpaa2_caam_iova_to_virt(priv, dpaa2_fd_get_addr(fd));4848	dma_unmap_single(priv->dev, req->fd_flt_dma, sizeof(req->fd_flt),4849			 DMA_BIDIRECTIONAL);4850	req->cbk(req->ctx, dpaa2_fd_get_frc(fd));4851}4852 4853static int dpaa2_caam_pull_fq(struct dpaa2_caam_priv_per_cpu *ppriv)4854{4855	int err;4856 4857	/* Retry while portal is busy */4858	do {4859		err = dpaa2_io_service_pull_fq(ppriv->dpio, ppriv->rsp_fqid,4860					       ppriv->store);4861	} while (err == -EBUSY);4862 4863	if (unlikely(err))4864		dev_err(ppriv->priv->dev, "dpaa2_io_service_pull err %d", err);4865 4866	return err;4867}4868 4869static int dpaa2_caam_store_consume(struct dpaa2_caam_priv_per_cpu *ppriv)4870{4871	struct dpaa2_dq *dq;4872	int cleaned = 0, is_last;4873 4874	do {4875		dq = dpaa2_io_store_next(ppriv->store, &is_last);4876		if (unlikely(!dq)) {4877			if (unlikely(!is_last)) {4878				dev_dbg(ppriv->priv->dev,4879					"FQ %d returned no valid frames\n",4880					ppriv->rsp_fqid);4881				/*4882				 * MUST retry until we get some sort of4883				 * valid response token (be it "empty dequeue"4884				 * or a valid frame).4885				 */4886				continue;4887			}4888			break;4889		}4890 4891		/* Process FD */4892		dpaa2_caam_process_fd(ppriv->priv, dpaa2_dq_fd(dq));4893		cleaned++;4894	} while (!is_last);4895 4896	return cleaned;4897}4898 4899static int dpaa2_dpseci_poll(struct napi_struct *napi, int budget)4900{4901	struct dpaa2_caam_priv_per_cpu *ppriv;4902	struct dpaa2_caam_priv *priv;4903	int err, cleaned = 0, store_cleaned;4904 4905	ppriv = container_of(napi, struct dpaa2_caam_priv_per_cpu, napi);4906	priv = ppriv->priv;4907 4908	if (unlikely(dpaa2_caam_pull_fq(ppriv)))4909		return 0;4910 4911	do {4912		store_cleaned = dpaa2_caam_store_consume(ppriv);4913		cleaned += store_cleaned;4914 4915		if (store_cleaned == 0 ||4916		    cleaned > budget - DPAA2_CAAM_STORE_SIZE)4917			break;4918 4919		/* Try to dequeue some more */4920		err = dpaa2_caam_pull_fq(ppriv);4921		if (unlikely(err))4922			break;4923	} while (1);4924 4925	if (cleaned < budget) {4926		napi_complete_done(napi, cleaned);4927		err = dpaa2_io_service_rearm(ppriv->dpio, &ppriv->nctx);4928		if (unlikely(err))4929			dev_err(priv->dev, "Notification rearm failed: %d\n",4930				err);4931	}4932 4933	return cleaned;4934}4935 4936static int dpaa2_dpseci_congestion_setup(struct dpaa2_caam_priv *priv,4937					 u16 token)4938{4939	struct dpseci_congestion_notification_cfg cong_notif_cfg = { 0 };4940	struct device *dev = priv->dev;4941	unsigned int alignmask;4942	int err;4943 4944	/*4945	 * Congestion group feature supported starting with DPSECI API v5.14946	 * and only when object has been created with this capability.4947	 */4948	if ((DPSECI_VER(priv->major_ver, priv->minor_ver) < DPSECI_VER(5, 1)) ||4949	    !(priv->dpseci_attr.options & DPSECI_OPT_HAS_CG))4950		return 0;4951 4952	alignmask = DPAA2_CSCN_ALIGN - 1;4953	alignmask |= dma_get_cache_alignment() - 1;4954	priv->cscn_mem = kzalloc(ALIGN(DPAA2_CSCN_SIZE, alignmask + 1),4955				 GFP_KERNEL);4956	if (!priv->cscn_mem)4957		return -ENOMEM;4958 4959	priv->cscn_dma = dma_map_single(dev, priv->cscn_mem,4960					DPAA2_CSCN_SIZE, DMA_FROM_DEVICE);4961	if (dma_mapping_error(dev, priv->cscn_dma)) {4962		dev_err(dev, "Error mapping CSCN memory area\n");4963		err = -ENOMEM;4964		goto err_dma_map;4965	}4966 4967	cong_notif_cfg.units = DPSECI_CONGESTION_UNIT_BYTES;4968	cong_notif_cfg.threshold_entry = DPAA2_SEC_CONG_ENTRY_THRESH;4969	cong_notif_cfg.threshold_exit = DPAA2_SEC_CONG_EXIT_THRESH;4970	cong_notif_cfg.message_ctx = (uintptr_t)priv;4971	cong_notif_cfg.message_iova = priv->cscn_dma;4972	cong_notif_cfg.notification_mode = DPSECI_CGN_MODE_WRITE_MEM_ON_ENTER |4973					DPSECI_CGN_MODE_WRITE_MEM_ON_EXIT |4974					DPSECI_CGN_MODE_COHERENT_WRITE;4975 4976	err = dpseci_set_congestion_notification(priv->mc_io, 0, token,4977						 &cong_notif_cfg);4978	if (err) {4979		dev_err(dev, "dpseci_set_congestion_notification failed\n");4980		goto err_set_cong;4981	}4982 4983	return 0;4984 4985err_set_cong:4986	dma_unmap_single(dev, priv->cscn_dma, DPAA2_CSCN_SIZE, DMA_FROM_DEVICE);4987err_dma_map:4988	kfree(priv->cscn_mem);4989 4990	return err;4991}4992 4993static void free_dpaa2_pcpu_netdev(struct dpaa2_caam_priv *priv, const cpumask_t *cpus)4994{4995	struct dpaa2_caam_priv_per_cpu *ppriv;4996	int i;4997 4998	for_each_cpu(i, cpus) {4999		ppriv = per_cpu_ptr(priv->ppriv, i);5000		free_netdev(ppriv->net_dev);5001	}5002}5003 5004static int __cold dpaa2_dpseci_setup(struct fsl_mc_device *ls_dev)5005{5006	struct device *dev = &ls_dev->dev;5007	struct dpaa2_caam_priv *priv;5008	struct dpaa2_caam_priv_per_cpu *ppriv;5009	cpumask_var_t clean_mask;5010	int err, cpu;5011	u8 i;5012 5013	err = -ENOMEM;5014	if (!zalloc_cpumask_var(&clean_mask, GFP_KERNEL))5015		goto err_cpumask;5016 5017	priv = dev_get_drvdata(dev);5018 5019	priv->dev = dev;5020	priv->dpsec_id = ls_dev->obj_desc.id;5021 5022	/* Get a handle for the DPSECI this interface is associate with */5023	err = dpseci_open(priv->mc_io, 0, priv->dpsec_id, &ls_dev->mc_handle);5024	if (err) {5025		dev_err(dev, "dpseci_open() failed: %d\n", err);5026		goto err_open;5027	}5028 5029	err = dpseci_get_api_version(priv->mc_io, 0, &priv->major_ver,5030				     &priv->minor_ver);5031	if (err) {5032		dev_err(dev, "dpseci_get_api_version() failed\n");5033		goto err_get_vers;5034	}5035 5036	dev_info(dev, "dpseci v%d.%d\n", priv->major_ver, priv->minor_ver);5037 5038	if (DPSECI_VER(priv->major_ver, priv->minor_ver) > DPSECI_VER(5, 3)) {5039		err = dpseci_reset(priv->mc_io, 0, ls_dev->mc_handle);5040		if (err) {5041			dev_err(dev, "dpseci_reset() failed\n");5042			goto err_get_vers;5043		}5044	}5045 5046	err = dpseci_get_attributes(priv->mc_io, 0, ls_dev->mc_handle,5047				    &priv->dpseci_attr);5048	if (err) {5049		dev_err(dev, "dpseci_get_attributes() failed\n");5050		goto err_get_vers;5051	}5052 5053	err = dpseci_get_sec_attr(priv->mc_io, 0, ls_dev->mc_handle,5054				  &priv->sec_attr);5055	if (err) {5056		dev_err(dev, "dpseci_get_sec_attr() failed\n");5057		goto err_get_vers;5058	}5059 5060	err = dpaa2_dpseci_congestion_setup(priv, ls_dev->mc_handle);5061	if (err) {5062		dev_err(dev, "setup_congestion() failed\n");5063		goto err_get_vers;5064	}5065 5066	priv->num_pairs = min(priv->dpseci_attr.num_rx_queues,5067			      priv->dpseci_attr.num_tx_queues);5068	if (priv->num_pairs > num_online_cpus()) {5069		dev_warn(dev, "%d queues won't be used\n",5070			 priv->num_pairs - num_online_cpus());5071		priv->num_pairs = num_online_cpus();5072	}5073 5074	for (i = 0; i < priv->dpseci_attr.num_rx_queues; i++) {5075		err = dpseci_get_rx_queue(priv->mc_io, 0, ls_dev->mc_handle, i,5076					  &priv->rx_queue_attr[i]);5077		if (err) {5078			dev_err(dev, "dpseci_get_rx_queue() failed\n");5079			goto err_get_rx_queue;5080		}5081	}5082 5083	for (i = 0; i < priv->dpseci_attr.num_tx_queues; i++) {5084		err = dpseci_get_tx_queue(priv->mc_io, 0, ls_dev->mc_handle, i,5085					  &priv->tx_queue_attr[i]);5086		if (err) {5087			dev_err(dev, "dpseci_get_tx_queue() failed\n");5088			goto err_get_rx_queue;5089		}5090	}5091 5092	i = 0;5093	for_each_online_cpu(cpu) {5094		u8 j;5095 5096		j = i % priv->num_pairs;5097 5098		ppriv = per_cpu_ptr(priv->ppriv, cpu);5099		ppriv->req_fqid = priv->tx_queue_attr[j].fqid;5100 5101		/*5102		 * Allow all cores to enqueue, while only some of them5103		 * will take part in dequeuing.5104		 */5105		if (++i > priv->num_pairs)5106			continue;5107 5108		ppriv->rsp_fqid = priv->rx_queue_attr[j].fqid;5109		ppriv->prio = j;5110 5111		dev_dbg(dev, "pair %d: rx queue %d, tx queue %d\n", j,5112			priv->rx_queue_attr[j].fqid,5113			priv->tx_queue_attr[j].fqid);5114 5115		ppriv->net_dev = alloc_netdev_dummy(0);5116		if (!ppriv->net_dev) {5117			err = -ENOMEM;5118			goto err_alloc_netdev;5119		}5120		cpumask_set_cpu(cpu, clean_mask);5121		ppriv->net_dev->dev = *dev;5122 5123		netif_napi_add_tx_weight(ppriv->net_dev, &ppriv->napi,5124					 dpaa2_dpseci_poll,5125					 DPAA2_CAAM_NAPI_WEIGHT);5126	}5127 5128	err = 0;5129	goto free_cpumask;5130 5131err_alloc_netdev:5132	free_dpaa2_pcpu_netdev(priv, clean_mask);5133err_get_rx_queue:5134	dpaa2_dpseci_congestion_free(priv);5135err_get_vers:5136	dpseci_close(priv->mc_io, 0, ls_dev->mc_handle);5137err_open:5138free_cpumask:5139	free_cpumask_var(clean_mask);5140err_cpumask:5141	return err;5142}5143 5144static int dpaa2_dpseci_enable(struct dpaa2_caam_priv *priv)5145{5146	struct device *dev = priv->dev;5147	struct fsl_mc_device *ls_dev = to_fsl_mc_device(dev);5148	struct dpaa2_caam_priv_per_cpu *ppriv;5149	int i;5150 5151	for (i = 0; i < priv->num_pairs; i++) {5152		ppriv = per_cpu_ptr(priv->ppriv, i);5153		napi_enable(&ppriv->napi);5154	}5155 5156	return dpseci_enable(priv->mc_io, 0, ls_dev->mc_handle);5157}5158 5159static int __cold dpaa2_dpseci_disable(struct dpaa2_caam_priv *priv)5160{5161	struct device *dev = priv->dev;5162	struct dpaa2_caam_priv_per_cpu *ppriv;5163	struct fsl_mc_device *ls_dev = to_fsl_mc_device(dev);5164	int i, err = 0, enabled;5165 5166	err = dpseci_disable(priv->mc_io, 0, ls_dev->mc_handle);5167	if (err) {5168		dev_err(dev, "dpseci_disable() failed\n");5169		return err;5170	}5171 5172	err = dpseci_is_enabled(priv->mc_io, 0, ls_dev->mc_handle, &enabled);5173	if (err) {5174		dev_err(dev, "dpseci_is_enabled() failed\n");5175		return err;5176	}5177 5178	dev_dbg(dev, "disable: %s\n", enabled ? "false" : "true");5179 5180	for (i = 0; i < priv->num_pairs; i++) {5181		ppriv = per_cpu_ptr(priv->ppriv, i);5182		napi_disable(&ppriv->napi);5183		netif_napi_del(&ppriv->napi);5184		free_netdev(ppriv->net_dev);5185	}5186 5187	return 0;5188}5189 5190static struct list_head hash_list;5191 5192static int dpaa2_caam_probe(struct fsl_mc_device *dpseci_dev)5193{5194	struct device *dev;5195	struct dpaa2_caam_priv *priv;5196	int i, err = 0;5197	bool registered = false;5198 5199	/*5200	 * There is no way to get CAAM endianness - there is no direct register5201	 * space access and MC f/w does not provide this attribute.5202	 * All DPAA2-based SoCs have little endian CAAM, thus hard-code this5203	 * property.5204	 */5205	caam_little_end = true;5206 5207	caam_imx = false;5208 5209	dev = &dpseci_dev->dev;5210 5211	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);5212	if (!priv)5213		return -ENOMEM;5214 5215	dev_set_drvdata(dev, priv);5216 5217	priv->domain = iommu_get_domain_for_dev(dev);5218 5219	qi_cache = kmem_cache_create("dpaa2_caamqicache", CAAM_QI_MEMCACHE_SIZE,5220				     0, 0, NULL);5221	if (!qi_cache) {5222		dev_err(dev, "Can't allocate SEC cache\n");5223		return -ENOMEM;5224	}5225 5226	err = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(49));5227	if (err) {5228		dev_err(dev, "dma_set_mask_and_coherent() failed\n");5229		goto err_dma_mask;5230	}5231 5232	/* Obtain a MC portal */5233	err = fsl_mc_portal_allocate(dpseci_dev, 0, &priv->mc_io);5234	if (err) {5235		if (err == -ENXIO)5236			err = -EPROBE_DEFER;5237		else5238			dev_err(dev, "MC portal allocation failed\n");5239 5240		goto err_dma_mask;5241	}5242 5243	priv->ppriv = alloc_percpu(*priv->ppriv);5244	if (!priv->ppriv) {5245		dev_err(dev, "alloc_percpu() failed\n");5246		err = -ENOMEM;5247		goto err_alloc_ppriv;5248	}5249 5250	/* DPSECI initialization */5251	err = dpaa2_dpseci_setup(dpseci_dev);5252	if (err) {5253		dev_err(dev, "dpaa2_dpseci_setup() failed\n");5254		goto err_dpseci_setup;5255	}5256 5257	/* DPIO */5258	err = dpaa2_dpseci_dpio_setup(priv);5259	if (err) {5260		dev_err_probe(dev, err, "dpaa2_dpseci_dpio_setup() failed\n");5261		goto err_dpio_setup;5262	}5263 5264	/* DPSECI binding to DPIO */5265	err = dpaa2_dpseci_bind(priv);5266	if (err) {5267		dev_err(dev, "dpaa2_dpseci_bind() failed\n");5268		goto err_bind;5269	}5270 5271	/* DPSECI enable */5272	err = dpaa2_dpseci_enable(priv);5273	if (err) {5274		dev_err(dev, "dpaa2_dpseci_enable() failed\n");5275		goto err_bind;5276	}5277 5278	dpaa2_dpseci_debugfs_init(priv);5279 5280	/* register crypto algorithms the device supports */5281	for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {5282		struct caam_skcipher_alg *t_alg = driver_algs + i;5283		u32 alg_sel = t_alg->caam.class1_alg_type & OP_ALG_ALGSEL_MASK;5284 5285		/* Skip DES algorithms if not supported by device */5286		if (!priv->sec_attr.des_acc_num &&5287		    (alg_sel == OP_ALG_ALGSEL_3DES ||5288		     alg_sel == OP_ALG_ALGSEL_DES))5289			continue;5290 5291		/* Skip AES algorithms if not supported by device */5292		if (!priv->sec_attr.aes_acc_num &&5293		    alg_sel == OP_ALG_ALGSEL_AES)5294			continue;5295 5296		/* Skip CHACHA20 algorithms if not supported by device */5297		if (alg_sel == OP_ALG_ALGSEL_CHACHA20 &&5298		    !priv->sec_attr.ccha_acc_num)5299			continue;5300 5301		t_alg->caam.dev = dev;5302		caam_skcipher_alg_init(t_alg);5303 5304		err = crypto_register_skcipher(&t_alg->skcipher);5305		if (err) {5306			dev_warn(dev, "%s alg registration failed: %d\n",5307				 t_alg->skcipher.base.cra_driver_name, err);5308			continue;5309		}5310 5311		t_alg->registered = true;5312		registered = true;5313	}5314 5315	for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {5316		struct caam_aead_alg *t_alg = driver_aeads + i;5317		u32 c1_alg_sel = t_alg->caam.class1_alg_type &5318				 OP_ALG_ALGSEL_MASK;5319		u32 c2_alg_sel = t_alg->caam.class2_alg_type &5320				 OP_ALG_ALGSEL_MASK;5321 5322		/* Skip DES algorithms if not supported by device */5323		if (!priv->sec_attr.des_acc_num &&5324		    (c1_alg_sel == OP_ALG_ALGSEL_3DES ||5325		     c1_alg_sel == OP_ALG_ALGSEL_DES))5326			continue;5327 5328		/* Skip AES algorithms if not supported by device */5329		if (!priv->sec_attr.aes_acc_num &&5330		    c1_alg_sel == OP_ALG_ALGSEL_AES)5331			continue;5332 5333		/* Skip CHACHA20 algorithms if not supported by device */5334		if (c1_alg_sel == OP_ALG_ALGSEL_CHACHA20 &&5335		    !priv->sec_attr.ccha_acc_num)5336			continue;5337 5338		/* Skip POLY1305 algorithms if not supported by device */5339		if (c2_alg_sel == OP_ALG_ALGSEL_POLY1305 &&5340		    !priv->sec_attr.ptha_acc_num)5341			continue;5342 5343		/*5344		 * Skip algorithms requiring message digests5345		 * if MD not supported by device.5346		 */5347		if ((c2_alg_sel & ~OP_ALG_ALGSEL_SUBMASK) == 0x40 &&5348		    !priv->sec_attr.md_acc_num)5349			continue;5350 5351		t_alg->caam.dev = dev;5352		caam_aead_alg_init(t_alg);5353 5354		err = crypto_register_aead(&t_alg->aead);5355		if (err) {5356			dev_warn(dev, "%s alg registration failed: %d\n",5357				 t_alg->aead.base.cra_driver_name, err);5358			continue;5359		}5360 5361		t_alg->registered = true;5362		registered = true;5363	}5364	if (registered)5365		dev_info(dev, "algorithms registered in /proc/crypto\n");5366 5367	/* register hash algorithms the device supports */5368	INIT_LIST_HEAD(&hash_list);5369 5370	/*5371	 * Skip registration of any hashing algorithms if MD block5372	 * is not present.5373	 */5374	if (!priv->sec_attr.md_acc_num)5375		return 0;5376 5377	for (i = 0; i < ARRAY_SIZE(driver_hash); i++) {5378		struct caam_hash_alg *t_alg;5379		struct caam_hash_template *alg = driver_hash + i;5380 5381		/* register hmac version */5382		t_alg = caam_hash_alloc(dev, alg, true);5383		if (IS_ERR(t_alg)) {5384			err = PTR_ERR(t_alg);5385			dev_warn(dev, "%s hash alg allocation failed: %d\n",5386				 alg->hmac_driver_name, err);5387			continue;5388		}5389 5390		err = crypto_register_ahash(&t_alg->ahash_alg);5391		if (err) {5392			dev_warn(dev, "%s alg registration failed: %d\n",5393				 t_alg->ahash_alg.halg.base.cra_driver_name,5394				 err);5395			kfree(t_alg);5396		} else {5397			list_add_tail(&t_alg->entry, &hash_list);5398		}5399 5400		/* register unkeyed version */5401		t_alg = caam_hash_alloc(dev, alg, false);5402		if (IS_ERR(t_alg)) {5403			err = PTR_ERR(t_alg);5404			dev_warn(dev, "%s alg allocation failed: %d\n",5405				 alg->driver_name, err);5406			continue;5407		}5408 5409		err = crypto_register_ahash(&t_alg->ahash_alg);5410		if (err) {5411			dev_warn(dev, "%s alg registration failed: %d\n",5412				 t_alg->ahash_alg.halg.base.cra_driver_name,5413				 err);5414			kfree(t_alg);5415		} else {5416			list_add_tail(&t_alg->entry, &hash_list);5417		}5418	}5419	if (!list_empty(&hash_list))5420		dev_info(dev, "hash algorithms registered in /proc/crypto\n");5421 5422	return err;5423 5424err_bind:5425	dpaa2_dpseci_dpio_free(priv);5426err_dpio_setup:5427	dpaa2_dpseci_free(priv);5428err_dpseci_setup:5429	free_percpu(priv->ppriv);5430err_alloc_ppriv:5431	fsl_mc_portal_free(priv->mc_io);5432err_dma_mask:5433	kmem_cache_destroy(qi_cache);5434 5435	return err;5436}5437 5438static void __cold dpaa2_caam_remove(struct fsl_mc_device *ls_dev)5439{5440	struct device *dev;5441	struct dpaa2_caam_priv *priv;5442	int i;5443 5444	dev = &ls_dev->dev;5445	priv = dev_get_drvdata(dev);5446 5447	dpaa2_dpseci_debugfs_exit(priv);5448 5449	for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {5450		struct caam_aead_alg *t_alg = driver_aeads + i;5451 5452		if (t_alg->registered)5453			crypto_unregister_aead(&t_alg->aead);5454	}5455 5456	for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {5457		struct caam_skcipher_alg *t_alg = driver_algs + i;5458 5459		if (t_alg->registered)5460			crypto_unregister_skcipher(&t_alg->skcipher);5461	}5462 5463	if (hash_list.next) {5464		struct caam_hash_alg *t_hash_alg, *p;5465 5466		list_for_each_entry_safe(t_hash_alg, p, &hash_list, entry) {5467			crypto_unregister_ahash(&t_hash_alg->ahash_alg);5468			list_del(&t_hash_alg->entry);5469			kfree(t_hash_alg);5470		}5471	}5472 5473	dpaa2_dpseci_disable(priv);5474	dpaa2_dpseci_dpio_free(priv);5475	dpaa2_dpseci_free(priv);5476	free_percpu(priv->ppriv);5477	fsl_mc_portal_free(priv->mc_io);5478	kmem_cache_destroy(qi_cache);5479}5480 5481int dpaa2_caam_enqueue(struct device *dev, struct caam_request *req)5482{5483	struct dpaa2_fd fd;5484	struct dpaa2_caam_priv *priv = dev_get_drvdata(dev);5485	struct dpaa2_caam_priv_per_cpu *ppriv;5486	int err = 0, i;5487 5488	if (IS_ERR(req))5489		return PTR_ERR(req);5490 5491	if (priv->cscn_mem) {5492		dma_sync_single_for_cpu(priv->dev, priv->cscn_dma,5493					DPAA2_CSCN_SIZE,5494					DMA_FROM_DEVICE);5495		if (unlikely(dpaa2_cscn_state_congested(priv->cscn_mem))) {5496			dev_dbg_ratelimited(dev, "Dropping request\n");5497			return -EBUSY;5498		}5499	}5500 5501	dpaa2_fl_set_flc(&req->fd_flt[1], req->flc_dma);5502 5503	req->fd_flt_dma = dma_map_single(dev, req->fd_flt, sizeof(req->fd_flt),5504					 DMA_BIDIRECTIONAL);5505	if (dma_mapping_error(dev, req->fd_flt_dma)) {5506		dev_err(dev, "DMA mapping error for QI enqueue request\n");5507		goto err_out;5508	}5509 5510	memset(&fd, 0, sizeof(fd));5511	dpaa2_fd_set_format(&fd, dpaa2_fd_list);5512	dpaa2_fd_set_addr(&fd, req->fd_flt_dma);5513	dpaa2_fd_set_len(&fd, dpaa2_fl_get_len(&req->fd_flt[1]));5514	dpaa2_fd_set_flc(&fd, req->flc_dma);5515 5516	ppriv = raw_cpu_ptr(priv->ppriv);5517	for (i = 0; i < (priv->dpseci_attr.num_tx_queues << 1); i++) {5518		err = dpaa2_io_service_enqueue_fq(ppriv->dpio, ppriv->req_fqid,5519						  &fd);5520		if (err != -EBUSY)5521			break;5522 5523		cpu_relax();5524	}5525 5526	if (unlikely(err)) {5527		dev_err_ratelimited(dev, "Error enqueuing frame: %d\n", err);5528		goto err_out;5529	}5530 5531	return -EINPROGRESS;5532 5533err_out:5534	dma_unmap_single(dev, req->fd_flt_dma, sizeof(req->fd_flt),5535			 DMA_BIDIRECTIONAL);5536	return -EIO;5537}5538EXPORT_SYMBOL(dpaa2_caam_enqueue);5539 5540static const struct fsl_mc_device_id dpaa2_caam_match_id_table[] = {5541	{5542		.vendor = FSL_MC_VENDOR_FREESCALE,5543		.obj_type = "dpseci",5544	},5545	{ .vendor = 0x0 }5546};5547MODULE_DEVICE_TABLE(fslmc, dpaa2_caam_match_id_table);5548 5549static struct fsl_mc_driver dpaa2_caam_driver = {5550	.driver = {5551		.name		= KBUILD_MODNAME,5552		.owner		= THIS_MODULE,5553	},5554	.probe		= dpaa2_caam_probe,5555	.remove		= dpaa2_caam_remove,5556	.match_id_table = dpaa2_caam_match_id_table5557};5558 5559MODULE_LICENSE("Dual BSD/GPL");5560MODULE_AUTHOR("Freescale Semiconductor, Inc");5561MODULE_DESCRIPTION("Freescale DPAA2 CAAM Driver");5562 5563module_fsl_mc_driver(dpaa2_caam_driver);5564