1 // SPDX-License-Identifier: GPL-2.0
2 /* Marvell OcteonTX CPT driver
3  *
4  * Copyright (C) 2019 Marvell International Ltd.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 
11 #include <crypto/aes.h>
12 #include <crypto/authenc.h>
13 #include <crypto/cryptd.h>
14 #include <crypto/des.h>
15 #include <crypto/internal/aead.h>
16 #include <crypto/sha.h>
17 #include <crypto/xts.h>
18 #include <crypto/scatterwalk.h>
19 #include <linux/rtnetlink.h>
20 #include <linux/sort.h>
21 #include <linux/module.h>
22 #include "otx_cptvf.h"
23 #include "otx_cptvf_algs.h"
24 #include "otx_cptvf_reqmgr.h"
25 
26 #define CPT_MAX_VF_NUM	64
27 /* Size of salt in AES GCM mode */
28 #define AES_GCM_SALT_SIZE	4
29 /* Size of IV in AES GCM mode */
30 #define AES_GCM_IV_SIZE		8
31 /* Size of ICV (Integrity Check Value) in AES GCM mode */
32 #define AES_GCM_ICV_SIZE	16
33 /* Offset of IV in AES GCM mode */
34 #define AES_GCM_IV_OFFSET	8
35 #define CONTROL_WORD_LEN	8
36 #define KEY2_OFFSET		48
37 #define DMA_MODE_FLAG(dma_mode) \
38 	(((dma_mode) == OTX_CPT_DMA_GATHER_SCATTER) ? (1 << 7) : 0)
39 
40 /* Truncated SHA digest size */
41 #define SHA1_TRUNC_DIGEST_SIZE		12
42 #define SHA256_TRUNC_DIGEST_SIZE	16
43 #define SHA384_TRUNC_DIGEST_SIZE	24
44 #define SHA512_TRUNC_DIGEST_SIZE	32
45 
46 static DEFINE_MUTEX(mutex);
47 static int is_crypto_registered;
48 
49 struct cpt_device_desc {
50 	enum otx_cptpf_type pf_type;
51 	struct pci_dev *dev;
52 	int num_queues;
53 };
54 
55 struct cpt_device_table {
56 	atomic_t count;
57 	struct cpt_device_desc desc[CPT_MAX_VF_NUM];
58 };
59 
60 static struct cpt_device_table se_devices = {
61 	.count = ATOMIC_INIT(0)
62 };
63 
64 static struct cpt_device_table ae_devices = {
65 	.count = ATOMIC_INIT(0)
66 };
67 
68 static inline int get_se_device(struct pci_dev **pdev, int *cpu_num)
69 {
70 	int count, ret = 0;
71 
72 	count = atomic_read(&se_devices.count);
73 	if (count < 1)
74 		return -ENODEV;
75 
76 	*cpu_num = get_cpu();
77 
78 	if (se_devices.desc[0].pf_type == OTX_CPT_SE) {
79 		/*
80 		 * On OcteonTX platform there is one CPT instruction queue bound
81 		 * to each VF. We get maximum performance if one CPT queue
82 		 * is available for each cpu otherwise CPT queues need to be
83 		 * shared between cpus.
84 		 */
85 		if (*cpu_num >= count)
86 			*cpu_num %= count;
87 		*pdev = se_devices.desc[*cpu_num].dev;
88 	} else {
89 		pr_err("Unknown PF type %d\n", se_devices.desc[0].pf_type);
90 		ret = -EINVAL;
91 	}
92 	put_cpu();
93 
94 	return ret;
95 }
96 
97 static inline int validate_hmac_cipher_null(struct otx_cpt_req_info *cpt_req)
98 {
99 	struct otx_cpt_req_ctx *rctx;
100 	struct aead_request *req;
101 	struct crypto_aead *tfm;
102 
103 	req = container_of(cpt_req->areq, struct aead_request, base);
104 	tfm = crypto_aead_reqtfm(req);
105 	rctx = aead_request_ctx(req);
106 	if (memcmp(rctx->fctx.hmac.s.hmac_calc,
107 		   rctx->fctx.hmac.s.hmac_recv,
108 		   crypto_aead_authsize(tfm)) != 0)
109 		return -EBADMSG;
110 
111 	return 0;
112 }
113 
114 static void otx_cpt_aead_callback(int status, void *arg1, void *arg2)
115 {
116 	struct otx_cpt_info_buffer *cpt_info = arg2;
117 	struct crypto_async_request *areq = arg1;
118 	struct otx_cpt_req_info *cpt_req;
119 	struct pci_dev *pdev;
120 
121 	if (!cpt_info)
122 		goto complete;
123 
124 	cpt_req = cpt_info->req;
125 	if (!status) {
126 		/*
127 		 * When selected cipher is NULL we need to manually
128 		 * verify whether calculated hmac value matches
129 		 * received hmac value
130 		 */
131 		if (cpt_req->req_type == OTX_CPT_AEAD_ENC_DEC_NULL_REQ &&
132 		    !cpt_req->is_enc)
133 			status = validate_hmac_cipher_null(cpt_req);
134 	}
135 	pdev = cpt_info->pdev;
136 	do_request_cleanup(pdev, cpt_info);
137 
138 complete:
139 	if (areq)
140 		areq->complete(areq, status);
141 }
142 
143 static void output_iv_copyback(struct crypto_async_request *areq)
144 {
145 	struct otx_cpt_req_info *req_info;
146 	struct skcipher_request *sreq;
147 	struct crypto_skcipher *stfm;
148 	struct otx_cpt_req_ctx *rctx;
149 	struct otx_cpt_enc_ctx *ctx;
150 	u32 start, ivsize;
151 
152 	sreq = container_of(areq, struct skcipher_request, base);
153 	stfm = crypto_skcipher_reqtfm(sreq);
154 	ctx = crypto_skcipher_ctx(stfm);
155 	if (ctx->cipher_type == OTX_CPT_AES_CBC ||
156 	    ctx->cipher_type == OTX_CPT_DES3_CBC) {
157 		rctx = skcipher_request_ctx(sreq);
158 		req_info = &rctx->cpt_req;
159 		ivsize = crypto_skcipher_ivsize(stfm);
160 		start = sreq->cryptlen - ivsize;
161 
162 		if (req_info->is_enc) {
163 			scatterwalk_map_and_copy(sreq->iv, sreq->dst, start,
164 						 ivsize, 0);
165 		} else {
166 			if (sreq->src != sreq->dst) {
167 				scatterwalk_map_and_copy(sreq->iv, sreq->src,
168 							 start, ivsize, 0);
169 			} else {
170 				memcpy(sreq->iv, req_info->iv_out, ivsize);
171 				kfree(req_info->iv_out);
172 			}
173 		}
174 	}
175 }
176 
177 static void otx_cpt_skcipher_callback(int status, void *arg1, void *arg2)
178 {
179 	struct otx_cpt_info_buffer *cpt_info = arg2;
180 	struct crypto_async_request *areq = arg1;
181 	struct pci_dev *pdev;
182 
183 	if (areq) {
184 		if (!status)
185 			output_iv_copyback(areq);
186 		if (cpt_info) {
187 			pdev = cpt_info->pdev;
188 			do_request_cleanup(pdev, cpt_info);
189 		}
190 		areq->complete(areq, status);
191 	}
192 }
193 
194 static inline void update_input_data(struct otx_cpt_req_info *req_info,
195 				     struct scatterlist *inp_sg,
196 				     u32 nbytes, u32 *argcnt)
197 {
198 	req_info->req.dlen += nbytes;
199 
200 	while (nbytes) {
201 		u32 len = min(nbytes, inp_sg->length);
202 		u8 *ptr = sg_virt(inp_sg);
203 
204 		req_info->in[*argcnt].vptr = (void *)ptr;
205 		req_info->in[*argcnt].size = len;
206 		nbytes -= len;
207 		++(*argcnt);
208 		inp_sg = sg_next(inp_sg);
209 	}
210 }
211 
212 static inline void update_output_data(struct otx_cpt_req_info *req_info,
213 				      struct scatterlist *outp_sg,
214 				      u32 offset, u32 nbytes, u32 *argcnt)
215 {
216 	req_info->rlen += nbytes;
217 
218 	while (nbytes) {
219 		u32 len = min(nbytes, outp_sg->length - offset);
220 		u8 *ptr = sg_virt(outp_sg);
221 
222 		req_info->out[*argcnt].vptr = (void *) (ptr + offset);
223 		req_info->out[*argcnt].size = len;
224 		nbytes -= len;
225 		++(*argcnt);
226 		offset = 0;
227 		outp_sg = sg_next(outp_sg);
228 	}
229 }
230 
231 static inline u32 create_ctx_hdr(struct skcipher_request *req, u32 enc,
232 				 u32 *argcnt)
233 {
234 	struct crypto_skcipher *stfm = crypto_skcipher_reqtfm(req);
235 	struct otx_cpt_req_ctx *rctx = skcipher_request_ctx(req);
236 	struct otx_cpt_req_info *req_info = &rctx->cpt_req;
237 	struct crypto_tfm *tfm = crypto_skcipher_tfm(stfm);
238 	struct otx_cpt_enc_ctx *ctx = crypto_tfm_ctx(tfm);
239 	struct otx_cpt_fc_ctx *fctx = &rctx->fctx;
240 	int ivsize = crypto_skcipher_ivsize(stfm);
241 	u32 start = req->cryptlen - ivsize;
242 	gfp_t flags;
243 
244 	flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
245 			GFP_KERNEL : GFP_ATOMIC;
246 	req_info->ctrl.s.dma_mode = OTX_CPT_DMA_GATHER_SCATTER;
247 	req_info->ctrl.s.se_req = OTX_CPT_SE_CORE_REQ;
248 
249 	req_info->req.opcode.s.major = OTX_CPT_MAJOR_OP_FC |
250 				DMA_MODE_FLAG(OTX_CPT_DMA_GATHER_SCATTER);
251 	if (enc) {
252 		req_info->req.opcode.s.minor = 2;
253 	} else {
254 		req_info->req.opcode.s.minor = 3;
255 		if ((ctx->cipher_type == OTX_CPT_AES_CBC ||
256 		    ctx->cipher_type == OTX_CPT_DES3_CBC) &&
257 		    req->src == req->dst) {
258 			req_info->iv_out = kmalloc(ivsize, flags);
259 			if (!req_info->iv_out)
260 				return -ENOMEM;
261 
262 			scatterwalk_map_and_copy(req_info->iv_out, req->src,
263 						 start, ivsize, 0);
264 		}
265 	}
266 	/* Encryption data length */
267 	req_info->req.param1 = req->cryptlen;
268 	/* Authentication data length */
269 	req_info->req.param2 = 0;
270 
271 	fctx->enc.enc_ctrl.e.enc_cipher = ctx->cipher_type;
272 	fctx->enc.enc_ctrl.e.aes_key = ctx->key_type;
273 	fctx->enc.enc_ctrl.e.iv_source = OTX_CPT_FROM_CPTR;
274 
275 	if (ctx->cipher_type == OTX_CPT_AES_XTS)
276 		memcpy(fctx->enc.encr_key, ctx->enc_key, ctx->key_len * 2);
277 	else
278 		memcpy(fctx->enc.encr_key, ctx->enc_key, ctx->key_len);
279 
280 	memcpy(fctx->enc.encr_iv, req->iv, crypto_skcipher_ivsize(stfm));
281 
282 	fctx->enc.enc_ctrl.flags = cpu_to_be64(fctx->enc.enc_ctrl.cflags);
283 
284 	/*
285 	 * Storing  Packet Data Information in offset
286 	 * Control Word First 8 bytes
287 	 */
288 	req_info->in[*argcnt].vptr = (u8 *)&rctx->ctrl_word;
289 	req_info->in[*argcnt].size = CONTROL_WORD_LEN;
290 	req_info->req.dlen += CONTROL_WORD_LEN;
291 	++(*argcnt);
292 
293 	req_info->in[*argcnt].vptr = (u8 *)fctx;
294 	req_info->in[*argcnt].size = sizeof(struct otx_cpt_fc_ctx);
295 	req_info->req.dlen += sizeof(struct otx_cpt_fc_ctx);
296 
297 	++(*argcnt);
298 
299 	return 0;
300 }
301 
302 static inline u32 create_input_list(struct skcipher_request *req, u32 enc,
303 				    u32 enc_iv_len)
304 {
305 	struct otx_cpt_req_ctx *rctx = skcipher_request_ctx(req);
306 	struct otx_cpt_req_info *req_info = &rctx->cpt_req;
307 	u32 argcnt =  0;
308 	int ret;
309 
310 	ret = create_ctx_hdr(req, enc, &argcnt);
311 	if (ret)
312 		return ret;
313 
314 	update_input_data(req_info, req->src, req->cryptlen, &argcnt);
315 	req_info->incnt = argcnt;
316 
317 	return 0;
318 }
319 
320 static inline void create_output_list(struct skcipher_request *req,
321 				      u32 enc_iv_len)
322 {
323 	struct otx_cpt_req_ctx *rctx = skcipher_request_ctx(req);
324 	struct otx_cpt_req_info *req_info = &rctx->cpt_req;
325 	u32 argcnt = 0;
326 
327 	/*
328 	 * OUTPUT Buffer Processing
329 	 * AES encryption/decryption output would be
330 	 * received in the following format
331 	 *
332 	 * ------IV--------|------ENCRYPTED/DECRYPTED DATA-----|
333 	 * [ 16 Bytes/     [   Request Enc/Dec/ DATA Len AES CBC ]
334 	 */
335 	update_output_data(req_info, req->dst, 0, req->cryptlen, &argcnt);
336 	req_info->outcnt = argcnt;
337 }
338 
339 static inline int cpt_enc_dec(struct skcipher_request *req, u32 enc)
340 {
341 	struct crypto_skcipher *stfm = crypto_skcipher_reqtfm(req);
342 	struct otx_cpt_req_ctx *rctx = skcipher_request_ctx(req);
343 	struct otx_cpt_req_info *req_info = &rctx->cpt_req;
344 	u32 enc_iv_len = crypto_skcipher_ivsize(stfm);
345 	struct pci_dev *pdev;
346 	int status, cpu_num;
347 
348 	/* Validate that request doesn't exceed maximum CPT supported size */
349 	if (req->cryptlen > OTX_CPT_MAX_REQ_SIZE)
350 		return -E2BIG;
351 
352 	/* Clear control words */
353 	rctx->ctrl_word.flags = 0;
354 	rctx->fctx.enc.enc_ctrl.flags = 0;
355 
356 	status = create_input_list(req, enc, enc_iv_len);
357 	if (status)
358 		return status;
359 	create_output_list(req, enc_iv_len);
360 
361 	status = get_se_device(&pdev, &cpu_num);
362 	if (status)
363 		return status;
364 
365 	req_info->callback = (void *)otx_cpt_skcipher_callback;
366 	req_info->areq = &req->base;
367 	req_info->req_type = OTX_CPT_ENC_DEC_REQ;
368 	req_info->is_enc = enc;
369 	req_info->is_trunc_hmac = false;
370 	req_info->ctrl.s.grp = 0;
371 
372 	/*
373 	 * We perform an asynchronous send and once
374 	 * the request is completed the driver would
375 	 * intimate through registered call back functions
376 	 */
377 	status = otx_cpt_do_request(pdev, req_info, cpu_num);
378 
379 	return status;
380 }
381 
382 static int otx_cpt_skcipher_encrypt(struct skcipher_request *req)
383 {
384 	return cpt_enc_dec(req, true);
385 }
386 
387 static int otx_cpt_skcipher_decrypt(struct skcipher_request *req)
388 {
389 	return cpt_enc_dec(req, false);
390 }
391 
392 static int otx_cpt_skcipher_xts_setkey(struct crypto_skcipher *tfm,
393 				       const u8 *key, u32 keylen)
394 {
395 	struct otx_cpt_enc_ctx *ctx = crypto_skcipher_ctx(tfm);
396 	const u8 *key2 = key + (keylen / 2);
397 	const u8 *key1 = key;
398 	int ret;
399 
400 	ret = xts_check_key(crypto_skcipher_tfm(tfm), key, keylen);
401 	if (ret)
402 		return ret;
403 	ctx->key_len = keylen;
404 	memcpy(ctx->enc_key, key1, keylen / 2);
405 	memcpy(ctx->enc_key + KEY2_OFFSET, key2, keylen / 2);
406 	ctx->cipher_type = OTX_CPT_AES_XTS;
407 	switch (ctx->key_len) {
408 	case 2 * AES_KEYSIZE_128:
409 		ctx->key_type = OTX_CPT_AES_128_BIT;
410 		break;
411 	case 2 * AES_KEYSIZE_256:
412 		ctx->key_type = OTX_CPT_AES_256_BIT;
413 		break;
414 	default:
415 		return -EINVAL;
416 	}
417 
418 	return 0;
419 }
420 
421 static int cpt_des_setkey(struct crypto_skcipher *tfm, const u8 *key,
422 			  u32 keylen, u8 cipher_type)
423 {
424 	struct otx_cpt_enc_ctx *ctx = crypto_skcipher_ctx(tfm);
425 
426 	if (keylen != DES3_EDE_KEY_SIZE)
427 		return -EINVAL;
428 
429 	ctx->key_len = keylen;
430 	ctx->cipher_type = cipher_type;
431 
432 	memcpy(ctx->enc_key, key, keylen);
433 
434 	return 0;
435 }
436 
437 static int cpt_aes_setkey(struct crypto_skcipher *tfm, const u8 *key,
438 			  u32 keylen, u8 cipher_type)
439 {
440 	struct otx_cpt_enc_ctx *ctx = crypto_skcipher_ctx(tfm);
441 
442 	switch (keylen) {
443 	case AES_KEYSIZE_128:
444 		ctx->key_type = OTX_CPT_AES_128_BIT;
445 		break;
446 	case AES_KEYSIZE_192:
447 		ctx->key_type = OTX_CPT_AES_192_BIT;
448 		break;
449 	case AES_KEYSIZE_256:
450 		ctx->key_type = OTX_CPT_AES_256_BIT;
451 		break;
452 	default:
453 		return -EINVAL;
454 	}
455 	ctx->key_len = keylen;
456 	ctx->cipher_type = cipher_type;
457 
458 	memcpy(ctx->enc_key, key, keylen);
459 
460 	return 0;
461 }
462 
463 static int otx_cpt_skcipher_cbc_aes_setkey(struct crypto_skcipher *tfm,
464 					   const u8 *key, u32 keylen)
465 {
466 	return cpt_aes_setkey(tfm, key, keylen, OTX_CPT_AES_CBC);
467 }
468 
469 static int otx_cpt_skcipher_ecb_aes_setkey(struct crypto_skcipher *tfm,
470 					   const u8 *key, u32 keylen)
471 {
472 	return cpt_aes_setkey(tfm, key, keylen, OTX_CPT_AES_ECB);
473 }
474 
475 static int otx_cpt_skcipher_cfb_aes_setkey(struct crypto_skcipher *tfm,
476 					   const u8 *key, u32 keylen)
477 {
478 	return cpt_aes_setkey(tfm, key, keylen, OTX_CPT_AES_CFB);
479 }
480 
481 static int otx_cpt_skcipher_cbc_des3_setkey(struct crypto_skcipher *tfm,
482 					    const u8 *key, u32 keylen)
483 {
484 	return cpt_des_setkey(tfm, key, keylen, OTX_CPT_DES3_CBC);
485 }
486 
487 static int otx_cpt_skcipher_ecb_des3_setkey(struct crypto_skcipher *tfm,
488 					    const u8 *key, u32 keylen)
489 {
490 	return cpt_des_setkey(tfm, key, keylen, OTX_CPT_DES3_ECB);
491 }
492 
493 static int otx_cpt_enc_dec_init(struct crypto_skcipher *tfm)
494 {
495 	struct otx_cpt_enc_ctx *ctx = crypto_skcipher_ctx(tfm);
496 
497 	memset(ctx, 0, sizeof(*ctx));
498 	/*
499 	 * Additional memory for skcipher_request is
500 	 * allocated since the cryptd daemon uses
501 	 * this memory for request_ctx information
502 	 */
503 	crypto_skcipher_set_reqsize(tfm, sizeof(struct otx_cpt_req_ctx) +
504 					sizeof(struct skcipher_request));
505 
506 	return 0;
507 }
508 
509 static int cpt_aead_init(struct crypto_aead *tfm, u8 cipher_type, u8 mac_type)
510 {
511 	struct otx_cpt_aead_ctx *ctx = crypto_aead_ctx(tfm);
512 
513 	ctx->cipher_type = cipher_type;
514 	ctx->mac_type = mac_type;
515 
516 	/*
517 	 * When selected cipher is NULL we use HMAC opcode instead of
518 	 * FLEXICRYPTO opcode therefore we don't need to use HASH algorithms
519 	 * for calculating ipad and opad
520 	 */
521 	if (ctx->cipher_type != OTX_CPT_CIPHER_NULL) {
522 		switch (ctx->mac_type) {
523 		case OTX_CPT_SHA1:
524 			ctx->hashalg = crypto_alloc_shash("sha1", 0,
525 							  CRYPTO_ALG_ASYNC);
526 			if (IS_ERR(ctx->hashalg))
527 				return PTR_ERR(ctx->hashalg);
528 			break;
529 
530 		case OTX_CPT_SHA256:
531 			ctx->hashalg = crypto_alloc_shash("sha256", 0,
532 							  CRYPTO_ALG_ASYNC);
533 			if (IS_ERR(ctx->hashalg))
534 				return PTR_ERR(ctx->hashalg);
535 			break;
536 
537 		case OTX_CPT_SHA384:
538 			ctx->hashalg = crypto_alloc_shash("sha384", 0,
539 							  CRYPTO_ALG_ASYNC);
540 			if (IS_ERR(ctx->hashalg))
541 				return PTR_ERR(ctx->hashalg);
542 			break;
543 
544 		case OTX_CPT_SHA512:
545 			ctx->hashalg = crypto_alloc_shash("sha512", 0,
546 							  CRYPTO_ALG_ASYNC);
547 			if (IS_ERR(ctx->hashalg))
548 				return PTR_ERR(ctx->hashalg);
549 			break;
550 		}
551 	}
552 
553 	crypto_aead_set_reqsize(tfm, sizeof(struct otx_cpt_req_ctx));
554 
555 	return 0;
556 }
557 
558 static int otx_cpt_aead_cbc_aes_sha1_init(struct crypto_aead *tfm)
559 {
560 	return cpt_aead_init(tfm, OTX_CPT_AES_CBC, OTX_CPT_SHA1);
561 }
562 
563 static int otx_cpt_aead_cbc_aes_sha256_init(struct crypto_aead *tfm)
564 {
565 	return cpt_aead_init(tfm, OTX_CPT_AES_CBC, OTX_CPT_SHA256);
566 }
567 
568 static int otx_cpt_aead_cbc_aes_sha384_init(struct crypto_aead *tfm)
569 {
570 	return cpt_aead_init(tfm, OTX_CPT_AES_CBC, OTX_CPT_SHA384);
571 }
572 
573 static int otx_cpt_aead_cbc_aes_sha512_init(struct crypto_aead *tfm)
574 {
575 	return cpt_aead_init(tfm, OTX_CPT_AES_CBC, OTX_CPT_SHA512);
576 }
577 
578 static int otx_cpt_aead_ecb_null_sha1_init(struct crypto_aead *tfm)
579 {
580 	return cpt_aead_init(tfm, OTX_CPT_CIPHER_NULL, OTX_CPT_SHA1);
581 }
582 
583 static int otx_cpt_aead_ecb_null_sha256_init(struct crypto_aead *tfm)
584 {
585 	return cpt_aead_init(tfm, OTX_CPT_CIPHER_NULL, OTX_CPT_SHA256);
586 }
587 
588 static int otx_cpt_aead_ecb_null_sha384_init(struct crypto_aead *tfm)
589 {
590 	return cpt_aead_init(tfm, OTX_CPT_CIPHER_NULL, OTX_CPT_SHA384);
591 }
592 
593 static int otx_cpt_aead_ecb_null_sha512_init(struct crypto_aead *tfm)
594 {
595 	return cpt_aead_init(tfm, OTX_CPT_CIPHER_NULL, OTX_CPT_SHA512);
596 }
597 
598 static int otx_cpt_aead_gcm_aes_init(struct crypto_aead *tfm)
599 {
600 	return cpt_aead_init(tfm, OTX_CPT_AES_GCM, OTX_CPT_MAC_NULL);
601 }
602 
603 static void otx_cpt_aead_exit(struct crypto_aead *tfm)
604 {
605 	struct otx_cpt_aead_ctx *ctx = crypto_aead_ctx(tfm);
606 
607 	kfree(ctx->ipad);
608 	kfree(ctx->opad);
609 	if (ctx->hashalg)
610 		crypto_free_shash(ctx->hashalg);
611 	kfree(ctx->sdesc);
612 }
613 
614 /*
615  * This is the Integrity Check Value validation (aka the authentication tag
616  * length)
617  */
618 static int otx_cpt_aead_set_authsize(struct crypto_aead *tfm,
619 				     unsigned int authsize)
620 {
621 	struct otx_cpt_aead_ctx *ctx = crypto_aead_ctx(tfm);
622 
623 	switch (ctx->mac_type) {
624 	case OTX_CPT_SHA1:
625 		if (authsize != SHA1_DIGEST_SIZE &&
626 		    authsize != SHA1_TRUNC_DIGEST_SIZE)
627 			return -EINVAL;
628 
629 		if (authsize == SHA1_TRUNC_DIGEST_SIZE)
630 			ctx->is_trunc_hmac = true;
631 		break;
632 
633 	case OTX_CPT_SHA256:
634 		if (authsize != SHA256_DIGEST_SIZE &&
635 		    authsize != SHA256_TRUNC_DIGEST_SIZE)
636 			return -EINVAL;
637 
638 		if (authsize == SHA256_TRUNC_DIGEST_SIZE)
639 			ctx->is_trunc_hmac = true;
640 		break;
641 
642 	case OTX_CPT_SHA384:
643 		if (authsize != SHA384_DIGEST_SIZE &&
644 		    authsize != SHA384_TRUNC_DIGEST_SIZE)
645 			return -EINVAL;
646 
647 		if (authsize == SHA384_TRUNC_DIGEST_SIZE)
648 			ctx->is_trunc_hmac = true;
649 		break;
650 
651 	case OTX_CPT_SHA512:
652 		if (authsize != SHA512_DIGEST_SIZE &&
653 		    authsize != SHA512_TRUNC_DIGEST_SIZE)
654 			return -EINVAL;
655 
656 		if (authsize == SHA512_TRUNC_DIGEST_SIZE)
657 			ctx->is_trunc_hmac = true;
658 		break;
659 
660 	case OTX_CPT_MAC_NULL:
661 		if (ctx->cipher_type == OTX_CPT_AES_GCM) {
662 			if (authsize != AES_GCM_ICV_SIZE)
663 				return -EINVAL;
664 		} else
665 			return -EINVAL;
666 		break;
667 
668 	default:
669 		return -EINVAL;
670 	}
671 
672 	tfm->authsize = authsize;
673 	return 0;
674 }
675 
676 static struct otx_cpt_sdesc *alloc_sdesc(struct crypto_shash *alg)
677 {
678 	struct otx_cpt_sdesc *sdesc;
679 	int size;
680 
681 	size = sizeof(struct shash_desc) + crypto_shash_descsize(alg);
682 	sdesc = kmalloc(size, GFP_KERNEL);
683 	if (!sdesc)
684 		return NULL;
685 
686 	sdesc->shash.tfm = alg;
687 
688 	return sdesc;
689 }
690 
691 static inline void swap_data32(void *buf, u32 len)
692 {
693 	cpu_to_be32_array(buf, buf, len / 4);
694 }
695 
696 static inline void swap_data64(void *buf, u32 len)
697 {
698 	__be64 *dst = buf;
699 	u64 *src = buf;
700 	int i = 0;
701 
702 	for (i = 0 ; i < len / 8; i++, src++, dst++)
703 		*dst = cpu_to_be64p(src);
704 }
705 
706 static int copy_pad(u8 mac_type, u8 *out_pad, u8 *in_pad)
707 {
708 	struct sha512_state *sha512;
709 	struct sha256_state *sha256;
710 	struct sha1_state *sha1;
711 
712 	switch (mac_type) {
713 	case OTX_CPT_SHA1:
714 		sha1 = (struct sha1_state *) in_pad;
715 		swap_data32(sha1->state, SHA1_DIGEST_SIZE);
716 		memcpy(out_pad, &sha1->state, SHA1_DIGEST_SIZE);
717 		break;
718 
719 	case OTX_CPT_SHA256:
720 		sha256 = (struct sha256_state *) in_pad;
721 		swap_data32(sha256->state, SHA256_DIGEST_SIZE);
722 		memcpy(out_pad, &sha256->state, SHA256_DIGEST_SIZE);
723 		break;
724 
725 	case OTX_CPT_SHA384:
726 	case OTX_CPT_SHA512:
727 		sha512 = (struct sha512_state *) in_pad;
728 		swap_data64(sha512->state, SHA512_DIGEST_SIZE);
729 		memcpy(out_pad, &sha512->state, SHA512_DIGEST_SIZE);
730 		break;
731 
732 	default:
733 		return -EINVAL;
734 	}
735 
736 	return 0;
737 }
738 
739 static int aead_hmac_init(struct crypto_aead *cipher)
740 {
741 	struct otx_cpt_aead_ctx *ctx = crypto_aead_ctx(cipher);
742 	int state_size = crypto_shash_statesize(ctx->hashalg);
743 	int ds = crypto_shash_digestsize(ctx->hashalg);
744 	int bs = crypto_shash_blocksize(ctx->hashalg);
745 	int authkeylen = ctx->auth_key_len;
746 	u8 *ipad = NULL, *opad = NULL;
747 	int ret = 0, icount = 0;
748 
749 	ctx->sdesc = alloc_sdesc(ctx->hashalg);
750 	if (!ctx->sdesc)
751 		return -ENOMEM;
752 
753 	ctx->ipad = kzalloc(bs, GFP_KERNEL);
754 	if (!ctx->ipad) {
755 		ret = -ENOMEM;
756 		goto calc_fail;
757 	}
758 
759 	ctx->opad = kzalloc(bs, GFP_KERNEL);
760 	if (!ctx->opad) {
761 		ret = -ENOMEM;
762 		goto calc_fail;
763 	}
764 
765 	ipad = kzalloc(state_size, GFP_KERNEL);
766 	if (!ipad) {
767 		ret = -ENOMEM;
768 		goto calc_fail;
769 	}
770 
771 	opad = kzalloc(state_size, GFP_KERNEL);
772 	if (!opad) {
773 		ret = -ENOMEM;
774 		goto calc_fail;
775 	}
776 
777 	if (authkeylen > bs) {
778 		ret = crypto_shash_digest(&ctx->sdesc->shash, ctx->key,
779 					  authkeylen, ipad);
780 		if (ret)
781 			goto calc_fail;
782 
783 		authkeylen = ds;
784 	} else {
785 		memcpy(ipad, ctx->key, authkeylen);
786 	}
787 
788 	memset(ipad + authkeylen, 0, bs - authkeylen);
789 	memcpy(opad, ipad, bs);
790 
791 	for (icount = 0; icount < bs; icount++) {
792 		ipad[icount] ^= 0x36;
793 		opad[icount] ^= 0x5c;
794 	}
795 
796 	/*
797 	 * Partial Hash calculated from the software
798 	 * algorithm is retrieved for IPAD & OPAD
799 	 */
800 
801 	/* IPAD Calculation */
802 	crypto_shash_init(&ctx->sdesc->shash);
803 	crypto_shash_update(&ctx->sdesc->shash, ipad, bs);
804 	crypto_shash_export(&ctx->sdesc->shash, ipad);
805 	ret = copy_pad(ctx->mac_type, ctx->ipad, ipad);
806 	if (ret)
807 		goto calc_fail;
808 
809 	/* OPAD Calculation */
810 	crypto_shash_init(&ctx->sdesc->shash);
811 	crypto_shash_update(&ctx->sdesc->shash, opad, bs);
812 	crypto_shash_export(&ctx->sdesc->shash, opad);
813 	ret = copy_pad(ctx->mac_type, ctx->opad, opad);
814 	if (ret)
815 		goto calc_fail;
816 
817 	kfree(ipad);
818 	kfree(opad);
819 
820 	return 0;
821 
822 calc_fail:
823 	kfree(ctx->ipad);
824 	ctx->ipad = NULL;
825 	kfree(ctx->opad);
826 	ctx->opad = NULL;
827 	kfree(ipad);
828 	kfree(opad);
829 	kfree(ctx->sdesc);
830 	ctx->sdesc = NULL;
831 
832 	return ret;
833 }
834 
835 static int otx_cpt_aead_cbc_aes_sha_setkey(struct crypto_aead *cipher,
836 					   const unsigned char *key,
837 					   unsigned int keylen)
838 {
839 	struct otx_cpt_aead_ctx *ctx = crypto_aead_ctx(cipher);
840 	struct crypto_authenc_key_param *param;
841 	int enckeylen = 0, authkeylen = 0;
842 	struct rtattr *rta = (void *)key;
843 	int status = -EINVAL;
844 
845 	if (!RTA_OK(rta, keylen))
846 		goto badkey;
847 
848 	if (rta->rta_type != CRYPTO_AUTHENC_KEYA_PARAM)
849 		goto badkey;
850 
851 	if (RTA_PAYLOAD(rta) < sizeof(*param))
852 		goto badkey;
853 
854 	param = RTA_DATA(rta);
855 	enckeylen = be32_to_cpu(param->enckeylen);
856 	key += RTA_ALIGN(rta->rta_len);
857 	keylen -= RTA_ALIGN(rta->rta_len);
858 	if (keylen < enckeylen)
859 		goto badkey;
860 
861 	if (keylen > OTX_CPT_MAX_KEY_SIZE)
862 		goto badkey;
863 
864 	authkeylen = keylen - enckeylen;
865 	memcpy(ctx->key, key, keylen);
866 
867 	switch (enckeylen) {
868 	case AES_KEYSIZE_128:
869 		ctx->key_type = OTX_CPT_AES_128_BIT;
870 		break;
871 	case AES_KEYSIZE_192:
872 		ctx->key_type = OTX_CPT_AES_192_BIT;
873 		break;
874 	case AES_KEYSIZE_256:
875 		ctx->key_type = OTX_CPT_AES_256_BIT;
876 		break;
877 	default:
878 		/* Invalid key length */
879 		goto badkey;
880 	}
881 
882 	ctx->enc_key_len = enckeylen;
883 	ctx->auth_key_len = authkeylen;
884 
885 	status = aead_hmac_init(cipher);
886 	if (status)
887 		goto badkey;
888 
889 	return 0;
890 badkey:
891 	return status;
892 }
893 
894 static int otx_cpt_aead_ecb_null_sha_setkey(struct crypto_aead *cipher,
895 					    const unsigned char *key,
896 					    unsigned int keylen)
897 {
898 	struct otx_cpt_aead_ctx *ctx = crypto_aead_ctx(cipher);
899 	struct crypto_authenc_key_param *param;
900 	struct rtattr *rta = (void *)key;
901 	int enckeylen = 0;
902 
903 	if (!RTA_OK(rta, keylen))
904 		goto badkey;
905 
906 	if (rta->rta_type != CRYPTO_AUTHENC_KEYA_PARAM)
907 		goto badkey;
908 
909 	if (RTA_PAYLOAD(rta) < sizeof(*param))
910 		goto badkey;
911 
912 	param = RTA_DATA(rta);
913 	enckeylen = be32_to_cpu(param->enckeylen);
914 	key += RTA_ALIGN(rta->rta_len);
915 	keylen -= RTA_ALIGN(rta->rta_len);
916 	if (enckeylen != 0)
917 		goto badkey;
918 
919 	if (keylen > OTX_CPT_MAX_KEY_SIZE)
920 		goto badkey;
921 
922 	memcpy(ctx->key, key, keylen);
923 	ctx->enc_key_len = enckeylen;
924 	ctx->auth_key_len = keylen;
925 	return 0;
926 badkey:
927 	return -EINVAL;
928 }
929 
930 static int otx_cpt_aead_gcm_aes_setkey(struct crypto_aead *cipher,
931 				       const unsigned char *key,
932 				       unsigned int keylen)
933 {
934 	struct otx_cpt_aead_ctx *ctx = crypto_aead_ctx(cipher);
935 
936 	/*
937 	 * For aes gcm we expect to get encryption key (16, 24, 32 bytes)
938 	 * and salt (4 bytes)
939 	 */
940 	switch (keylen) {
941 	case AES_KEYSIZE_128 + AES_GCM_SALT_SIZE:
942 		ctx->key_type = OTX_CPT_AES_128_BIT;
943 		ctx->enc_key_len = AES_KEYSIZE_128;
944 		break;
945 	case AES_KEYSIZE_192 + AES_GCM_SALT_SIZE:
946 		ctx->key_type = OTX_CPT_AES_192_BIT;
947 		ctx->enc_key_len = AES_KEYSIZE_192;
948 		break;
949 	case AES_KEYSIZE_256 + AES_GCM_SALT_SIZE:
950 		ctx->key_type = OTX_CPT_AES_256_BIT;
951 		ctx->enc_key_len = AES_KEYSIZE_256;
952 		break;
953 	default:
954 		/* Invalid key and salt length */
955 		return -EINVAL;
956 	}
957 
958 	/* Store encryption key and salt */
959 	memcpy(ctx->key, key, keylen);
960 
961 	return 0;
962 }
963 
964 static inline u32 create_aead_ctx_hdr(struct aead_request *req, u32 enc,
965 				      u32 *argcnt)
966 {
967 	struct otx_cpt_req_ctx *rctx = aead_request_ctx(req);
968 	struct crypto_aead *tfm = crypto_aead_reqtfm(req);
969 	struct otx_cpt_aead_ctx *ctx = crypto_aead_ctx(tfm);
970 	struct otx_cpt_req_info *req_info = &rctx->cpt_req;
971 	struct otx_cpt_fc_ctx *fctx = &rctx->fctx;
972 	int mac_len = crypto_aead_authsize(tfm);
973 	int ds;
974 
975 	rctx->ctrl_word.e.enc_data_offset = req->assoclen;
976 
977 	switch (ctx->cipher_type) {
978 	case OTX_CPT_AES_CBC:
979 		fctx->enc.enc_ctrl.e.iv_source = OTX_CPT_FROM_CPTR;
980 		/* Copy encryption key to context */
981 		memcpy(fctx->enc.encr_key, ctx->key + ctx->auth_key_len,
982 		       ctx->enc_key_len);
983 		/* Copy IV to context */
984 		memcpy(fctx->enc.encr_iv, req->iv, crypto_aead_ivsize(tfm));
985 
986 		ds = crypto_shash_digestsize(ctx->hashalg);
987 		if (ctx->mac_type == OTX_CPT_SHA384)
988 			ds = SHA512_DIGEST_SIZE;
989 		if (ctx->ipad)
990 			memcpy(fctx->hmac.e.ipad, ctx->ipad, ds);
991 		if (ctx->opad)
992 			memcpy(fctx->hmac.e.opad, ctx->opad, ds);
993 		break;
994 
995 	case OTX_CPT_AES_GCM:
996 		fctx->enc.enc_ctrl.e.iv_source = OTX_CPT_FROM_DPTR;
997 		/* Copy encryption key to context */
998 		memcpy(fctx->enc.encr_key, ctx->key, ctx->enc_key_len);
999 		/* Copy salt to context */
1000 		memcpy(fctx->enc.encr_iv, ctx->key + ctx->enc_key_len,
1001 		       AES_GCM_SALT_SIZE);
1002 
1003 		rctx->ctrl_word.e.iv_offset = req->assoclen - AES_GCM_IV_OFFSET;
1004 		break;
1005 
1006 	default:
1007 		/* Unknown cipher type */
1008 		return -EINVAL;
1009 	}
1010 	rctx->ctrl_word.flags = cpu_to_be64(rctx->ctrl_word.cflags);
1011 
1012 	req_info->ctrl.s.dma_mode = OTX_CPT_DMA_GATHER_SCATTER;
1013 	req_info->ctrl.s.se_req = OTX_CPT_SE_CORE_REQ;
1014 	req_info->req.opcode.s.major = OTX_CPT_MAJOR_OP_FC |
1015 				 DMA_MODE_FLAG(OTX_CPT_DMA_GATHER_SCATTER);
1016 	if (enc) {
1017 		req_info->req.opcode.s.minor = 2;
1018 		req_info->req.param1 = req->cryptlen;
1019 		req_info->req.param2 = req->cryptlen + req->assoclen;
1020 	} else {
1021 		req_info->req.opcode.s.minor = 3;
1022 		req_info->req.param1 = req->cryptlen - mac_len;
1023 		req_info->req.param2 = req->cryptlen + req->assoclen - mac_len;
1024 	}
1025 
1026 	fctx->enc.enc_ctrl.e.enc_cipher = ctx->cipher_type;
1027 	fctx->enc.enc_ctrl.e.aes_key = ctx->key_type;
1028 	fctx->enc.enc_ctrl.e.mac_type = ctx->mac_type;
1029 	fctx->enc.enc_ctrl.e.mac_len = mac_len;
1030 	fctx->enc.enc_ctrl.flags = cpu_to_be64(fctx->enc.enc_ctrl.cflags);
1031 
1032 	/*
1033 	 * Storing Packet Data Information in offset
1034 	 * Control Word First 8 bytes
1035 	 */
1036 	req_info->in[*argcnt].vptr = (u8 *)&rctx->ctrl_word;
1037 	req_info->in[*argcnt].size = CONTROL_WORD_LEN;
1038 	req_info->req.dlen += CONTROL_WORD_LEN;
1039 	++(*argcnt);
1040 
1041 	req_info->in[*argcnt].vptr = (u8 *)fctx;
1042 	req_info->in[*argcnt].size = sizeof(struct otx_cpt_fc_ctx);
1043 	req_info->req.dlen += sizeof(struct otx_cpt_fc_ctx);
1044 	++(*argcnt);
1045 
1046 	return 0;
1047 }
1048 
1049 static inline u32 create_hmac_ctx_hdr(struct aead_request *req, u32 *argcnt,
1050 				      u32 enc)
1051 {
1052 	struct otx_cpt_req_ctx *rctx = aead_request_ctx(req);
1053 	struct crypto_aead *tfm = crypto_aead_reqtfm(req);
1054 	struct otx_cpt_aead_ctx *ctx = crypto_aead_ctx(tfm);
1055 	struct otx_cpt_req_info *req_info = &rctx->cpt_req;
1056 
1057 	req_info->ctrl.s.dma_mode = OTX_CPT_DMA_GATHER_SCATTER;
1058 	req_info->ctrl.s.se_req = OTX_CPT_SE_CORE_REQ;
1059 	req_info->req.opcode.s.major = OTX_CPT_MAJOR_OP_HMAC |
1060 				 DMA_MODE_FLAG(OTX_CPT_DMA_GATHER_SCATTER);
1061 	req_info->is_trunc_hmac = ctx->is_trunc_hmac;
1062 
1063 	req_info->req.opcode.s.minor = 0;
1064 	req_info->req.param1 = ctx->auth_key_len;
1065 	req_info->req.param2 = ctx->mac_type << 8;
1066 
1067 	/* Add authentication key */
1068 	req_info->in[*argcnt].vptr = ctx->key;
1069 	req_info->in[*argcnt].size = round_up(ctx->auth_key_len, 8);
1070 	req_info->req.dlen += round_up(ctx->auth_key_len, 8);
1071 	++(*argcnt);
1072 
1073 	return 0;
1074 }
1075 
1076 static inline u32 create_aead_input_list(struct aead_request *req, u32 enc)
1077 {
1078 	struct otx_cpt_req_ctx *rctx = aead_request_ctx(req);
1079 	struct otx_cpt_req_info *req_info = &rctx->cpt_req;
1080 	u32 inputlen =  req->cryptlen + req->assoclen;
1081 	u32 status, argcnt = 0;
1082 
1083 	status = create_aead_ctx_hdr(req, enc, &argcnt);
1084 	if (status)
1085 		return status;
1086 	update_input_data(req_info, req->src, inputlen, &argcnt);
1087 	req_info->incnt = argcnt;
1088 
1089 	return 0;
1090 }
1091 
1092 static inline u32 create_aead_output_list(struct aead_request *req, u32 enc,
1093 					  u32 mac_len)
1094 {
1095 	struct otx_cpt_req_ctx *rctx = aead_request_ctx(req);
1096 	struct otx_cpt_req_info *req_info =  &rctx->cpt_req;
1097 	u32 argcnt = 0, outputlen = 0;
1098 
1099 	if (enc)
1100 		outputlen = req->cryptlen +  req->assoclen + mac_len;
1101 	else
1102 		outputlen = req->cryptlen + req->assoclen - mac_len;
1103 
1104 	update_output_data(req_info, req->dst, 0, outputlen, &argcnt);
1105 	req_info->outcnt = argcnt;
1106 
1107 	return 0;
1108 }
1109 
1110 static inline u32 create_aead_null_input_list(struct aead_request *req,
1111 					      u32 enc, u32 mac_len)
1112 {
1113 	struct otx_cpt_req_ctx *rctx = aead_request_ctx(req);
1114 	struct otx_cpt_req_info *req_info = &rctx->cpt_req;
1115 	u32 inputlen, argcnt = 0;
1116 
1117 	if (enc)
1118 		inputlen =  req->cryptlen + req->assoclen;
1119 	else
1120 		inputlen =  req->cryptlen + req->assoclen - mac_len;
1121 
1122 	create_hmac_ctx_hdr(req, &argcnt, enc);
1123 	update_input_data(req_info, req->src, inputlen, &argcnt);
1124 	req_info->incnt = argcnt;
1125 
1126 	return 0;
1127 }
1128 
1129 static inline u32 create_aead_null_output_list(struct aead_request *req,
1130 					       u32 enc, u32 mac_len)
1131 {
1132 	struct otx_cpt_req_ctx *rctx = aead_request_ctx(req);
1133 	struct otx_cpt_req_info *req_info =  &rctx->cpt_req;
1134 	struct scatterlist *dst;
1135 	u8 *ptr = NULL;
1136 	int argcnt = 0, status, offset;
1137 	u32 inputlen;
1138 
1139 	if (enc)
1140 		inputlen =  req->cryptlen + req->assoclen;
1141 	else
1142 		inputlen =  req->cryptlen + req->assoclen - mac_len;
1143 
1144 	/*
1145 	 * If source and destination are different
1146 	 * then copy payload to destination
1147 	 */
1148 	if (req->src != req->dst) {
1149 
1150 		ptr = kmalloc(inputlen, (req_info->areq->flags &
1151 					 CRYPTO_TFM_REQ_MAY_SLEEP) ?
1152 					 GFP_KERNEL : GFP_ATOMIC);
1153 		if (!ptr) {
1154 			status = -ENOMEM;
1155 			goto error;
1156 		}
1157 
1158 		status = sg_copy_to_buffer(req->src, sg_nents(req->src), ptr,
1159 					   inputlen);
1160 		if (status != inputlen) {
1161 			status = -EINVAL;
1162 			goto error_free;
1163 		}
1164 		status = sg_copy_from_buffer(req->dst, sg_nents(req->dst), ptr,
1165 					     inputlen);
1166 		if (status != inputlen) {
1167 			status = -EINVAL;
1168 			goto error_free;
1169 		}
1170 		kfree(ptr);
1171 	}
1172 
1173 	if (enc) {
1174 		/*
1175 		 * In an encryption scenario hmac needs
1176 		 * to be appended after payload
1177 		 */
1178 		dst = req->dst;
1179 		offset = inputlen;
1180 		while (offset >= dst->length) {
1181 			offset -= dst->length;
1182 			dst = sg_next(dst);
1183 			if (!dst) {
1184 				status = -ENOENT;
1185 				goto error;
1186 			}
1187 		}
1188 
1189 		update_output_data(req_info, dst, offset, mac_len, &argcnt);
1190 	} else {
1191 		/*
1192 		 * In a decryption scenario calculated hmac for received
1193 		 * payload needs to be compare with hmac received
1194 		 */
1195 		status = sg_copy_buffer(req->src, sg_nents(req->src),
1196 					rctx->fctx.hmac.s.hmac_recv, mac_len,
1197 					inputlen, true);
1198 		if (status != mac_len) {
1199 			status = -EINVAL;
1200 			goto error;
1201 		}
1202 
1203 		req_info->out[argcnt].vptr = rctx->fctx.hmac.s.hmac_calc;
1204 		req_info->out[argcnt].size = mac_len;
1205 		argcnt++;
1206 	}
1207 
1208 	req_info->outcnt = argcnt;
1209 	return 0;
1210 
1211 error_free:
1212 	kfree(ptr);
1213 error:
1214 	return status;
1215 }
1216 
1217 static u32 cpt_aead_enc_dec(struct aead_request *req, u8 reg_type, u8 enc)
1218 {
1219 	struct otx_cpt_req_ctx *rctx = aead_request_ctx(req);
1220 	struct otx_cpt_req_info *req_info = &rctx->cpt_req;
1221 	struct crypto_aead *tfm = crypto_aead_reqtfm(req);
1222 	struct pci_dev *pdev;
1223 	u32 status, cpu_num;
1224 
1225 	/* Clear control words */
1226 	rctx->ctrl_word.flags = 0;
1227 	rctx->fctx.enc.enc_ctrl.flags = 0;
1228 
1229 	req_info->callback = otx_cpt_aead_callback;
1230 	req_info->areq = &req->base;
1231 	req_info->req_type = reg_type;
1232 	req_info->is_enc = enc;
1233 	req_info->is_trunc_hmac = false;
1234 
1235 	switch (reg_type) {
1236 	case OTX_CPT_AEAD_ENC_DEC_REQ:
1237 		status = create_aead_input_list(req, enc);
1238 		if (status)
1239 			return status;
1240 		status = create_aead_output_list(req, enc,
1241 						 crypto_aead_authsize(tfm));
1242 		if (status)
1243 			return status;
1244 		break;
1245 
1246 	case OTX_CPT_AEAD_ENC_DEC_NULL_REQ:
1247 		status = create_aead_null_input_list(req, enc,
1248 						     crypto_aead_authsize(tfm));
1249 		if (status)
1250 			return status;
1251 		status = create_aead_null_output_list(req, enc,
1252 						crypto_aead_authsize(tfm));
1253 		if (status)
1254 			return status;
1255 		break;
1256 
1257 	default:
1258 		return -EINVAL;
1259 	}
1260 
1261 	/* Validate that request doesn't exceed maximum CPT supported size */
1262 	if (req_info->req.param1 > OTX_CPT_MAX_REQ_SIZE ||
1263 	    req_info->req.param2 > OTX_CPT_MAX_REQ_SIZE)
1264 		return -E2BIG;
1265 
1266 	status = get_se_device(&pdev, &cpu_num);
1267 	if (status)
1268 		return status;
1269 
1270 	req_info->ctrl.s.grp = 0;
1271 
1272 	status = otx_cpt_do_request(pdev, req_info, cpu_num);
1273 	/*
1274 	 * We perform an asynchronous send and once
1275 	 * the request is completed the driver would
1276 	 * intimate through registered call back functions
1277 	 */
1278 	return status;
1279 }
1280 
1281 static int otx_cpt_aead_encrypt(struct aead_request *req)
1282 {
1283 	return cpt_aead_enc_dec(req, OTX_CPT_AEAD_ENC_DEC_REQ, true);
1284 }
1285 
1286 static int otx_cpt_aead_decrypt(struct aead_request *req)
1287 {
1288 	return cpt_aead_enc_dec(req, OTX_CPT_AEAD_ENC_DEC_REQ, false);
1289 }
1290 
1291 static int otx_cpt_aead_null_encrypt(struct aead_request *req)
1292 {
1293 	return cpt_aead_enc_dec(req, OTX_CPT_AEAD_ENC_DEC_NULL_REQ, true);
1294 }
1295 
1296 static int otx_cpt_aead_null_decrypt(struct aead_request *req)
1297 {
1298 	return cpt_aead_enc_dec(req, OTX_CPT_AEAD_ENC_DEC_NULL_REQ, false);
1299 }
1300 
1301 static struct skcipher_alg otx_cpt_skciphers[] = { {
1302 	.base.cra_name = "xts(aes)",
1303 	.base.cra_driver_name = "cpt_xts_aes",
1304 	.base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1305 	.base.cra_blocksize = AES_BLOCK_SIZE,
1306 	.base.cra_ctxsize = sizeof(struct otx_cpt_enc_ctx),
1307 	.base.cra_alignmask = 7,
1308 	.base.cra_priority = 4001,
1309 	.base.cra_module = THIS_MODULE,
1310 
1311 	.init = otx_cpt_enc_dec_init,
1312 	.ivsize = AES_BLOCK_SIZE,
1313 	.min_keysize = 2 * AES_MIN_KEY_SIZE,
1314 	.max_keysize = 2 * AES_MAX_KEY_SIZE,
1315 	.setkey = otx_cpt_skcipher_xts_setkey,
1316 	.encrypt = otx_cpt_skcipher_encrypt,
1317 	.decrypt = otx_cpt_skcipher_decrypt,
1318 }, {
1319 	.base.cra_name = "cbc(aes)",
1320 	.base.cra_driver_name = "cpt_cbc_aes",
1321 	.base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1322 	.base.cra_blocksize = AES_BLOCK_SIZE,
1323 	.base.cra_ctxsize = sizeof(struct otx_cpt_enc_ctx),
1324 	.base.cra_alignmask = 7,
1325 	.base.cra_priority = 4001,
1326 	.base.cra_module = THIS_MODULE,
1327 
1328 	.init = otx_cpt_enc_dec_init,
1329 	.ivsize = AES_BLOCK_SIZE,
1330 	.min_keysize = AES_MIN_KEY_SIZE,
1331 	.max_keysize = AES_MAX_KEY_SIZE,
1332 	.setkey = otx_cpt_skcipher_cbc_aes_setkey,
1333 	.encrypt = otx_cpt_skcipher_encrypt,
1334 	.decrypt = otx_cpt_skcipher_decrypt,
1335 }, {
1336 	.base.cra_name = "ecb(aes)",
1337 	.base.cra_driver_name = "cpt_ecb_aes",
1338 	.base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1339 	.base.cra_blocksize = AES_BLOCK_SIZE,
1340 	.base.cra_ctxsize = sizeof(struct otx_cpt_enc_ctx),
1341 	.base.cra_alignmask = 7,
1342 	.base.cra_priority = 4001,
1343 	.base.cra_module = THIS_MODULE,
1344 
1345 	.init = otx_cpt_enc_dec_init,
1346 	.ivsize = 0,
1347 	.min_keysize = AES_MIN_KEY_SIZE,
1348 	.max_keysize = AES_MAX_KEY_SIZE,
1349 	.setkey = otx_cpt_skcipher_ecb_aes_setkey,
1350 	.encrypt = otx_cpt_skcipher_encrypt,
1351 	.decrypt = otx_cpt_skcipher_decrypt,
1352 }, {
1353 	.base.cra_name = "cfb(aes)",
1354 	.base.cra_driver_name = "cpt_cfb_aes",
1355 	.base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1356 	.base.cra_blocksize = AES_BLOCK_SIZE,
1357 	.base.cra_ctxsize = sizeof(struct otx_cpt_enc_ctx),
1358 	.base.cra_alignmask = 7,
1359 	.base.cra_priority = 4001,
1360 	.base.cra_module = THIS_MODULE,
1361 
1362 	.init = otx_cpt_enc_dec_init,
1363 	.ivsize = AES_BLOCK_SIZE,
1364 	.min_keysize = AES_MIN_KEY_SIZE,
1365 	.max_keysize = AES_MAX_KEY_SIZE,
1366 	.setkey = otx_cpt_skcipher_cfb_aes_setkey,
1367 	.encrypt = otx_cpt_skcipher_encrypt,
1368 	.decrypt = otx_cpt_skcipher_decrypt,
1369 }, {
1370 	.base.cra_name = "cbc(des3_ede)",
1371 	.base.cra_driver_name = "cpt_cbc_des3_ede",
1372 	.base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1373 	.base.cra_blocksize = DES3_EDE_BLOCK_SIZE,
1374 	.base.cra_ctxsize = sizeof(struct otx_cpt_des3_ctx),
1375 	.base.cra_alignmask = 7,
1376 	.base.cra_priority = 4001,
1377 	.base.cra_module = THIS_MODULE,
1378 
1379 	.init = otx_cpt_enc_dec_init,
1380 	.min_keysize = DES3_EDE_KEY_SIZE,
1381 	.max_keysize = DES3_EDE_KEY_SIZE,
1382 	.ivsize = DES_BLOCK_SIZE,
1383 	.setkey = otx_cpt_skcipher_cbc_des3_setkey,
1384 	.encrypt = otx_cpt_skcipher_encrypt,
1385 	.decrypt = otx_cpt_skcipher_decrypt,
1386 }, {
1387 	.base.cra_name = "ecb(des3_ede)",
1388 	.base.cra_driver_name = "cpt_ecb_des3_ede",
1389 	.base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1390 	.base.cra_blocksize = DES3_EDE_BLOCK_SIZE,
1391 	.base.cra_ctxsize = sizeof(struct otx_cpt_des3_ctx),
1392 	.base.cra_alignmask = 7,
1393 	.base.cra_priority = 4001,
1394 	.base.cra_module = THIS_MODULE,
1395 
1396 	.init = otx_cpt_enc_dec_init,
1397 	.min_keysize = DES3_EDE_KEY_SIZE,
1398 	.max_keysize = DES3_EDE_KEY_SIZE,
1399 	.ivsize = 0,
1400 	.setkey = otx_cpt_skcipher_ecb_des3_setkey,
1401 	.encrypt = otx_cpt_skcipher_encrypt,
1402 	.decrypt = otx_cpt_skcipher_decrypt,
1403 } };
1404 
1405 static struct aead_alg otx_cpt_aeads[] = { {
1406 	.base = {
1407 		.cra_name = "authenc(hmac(sha1),cbc(aes))",
1408 		.cra_driver_name = "cpt_hmac_sha1_cbc_aes",
1409 		.cra_blocksize = AES_BLOCK_SIZE,
1410 		.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1411 		.cra_ctxsize = sizeof(struct otx_cpt_aead_ctx),
1412 		.cra_priority = 4001,
1413 		.cra_alignmask = 0,
1414 		.cra_module = THIS_MODULE,
1415 	},
1416 	.init = otx_cpt_aead_cbc_aes_sha1_init,
1417 	.exit = otx_cpt_aead_exit,
1418 	.setkey = otx_cpt_aead_cbc_aes_sha_setkey,
1419 	.setauthsize = otx_cpt_aead_set_authsize,
1420 	.encrypt = otx_cpt_aead_encrypt,
1421 	.decrypt = otx_cpt_aead_decrypt,
1422 	.ivsize = AES_BLOCK_SIZE,
1423 	.maxauthsize = SHA1_DIGEST_SIZE,
1424 }, {
1425 	.base = {
1426 		.cra_name = "authenc(hmac(sha256),cbc(aes))",
1427 		.cra_driver_name = "cpt_hmac_sha256_cbc_aes",
1428 		.cra_blocksize = AES_BLOCK_SIZE,
1429 		.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1430 		.cra_ctxsize = sizeof(struct otx_cpt_aead_ctx),
1431 		.cra_priority = 4001,
1432 		.cra_alignmask = 0,
1433 		.cra_module = THIS_MODULE,
1434 	},
1435 	.init = otx_cpt_aead_cbc_aes_sha256_init,
1436 	.exit = otx_cpt_aead_exit,
1437 	.setkey = otx_cpt_aead_cbc_aes_sha_setkey,
1438 	.setauthsize = otx_cpt_aead_set_authsize,
1439 	.encrypt = otx_cpt_aead_encrypt,
1440 	.decrypt = otx_cpt_aead_decrypt,
1441 	.ivsize = AES_BLOCK_SIZE,
1442 	.maxauthsize = SHA256_DIGEST_SIZE,
1443 }, {
1444 	.base = {
1445 		.cra_name = "authenc(hmac(sha384),cbc(aes))",
1446 		.cra_driver_name = "cpt_hmac_sha384_cbc_aes",
1447 		.cra_blocksize = AES_BLOCK_SIZE,
1448 		.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1449 		.cra_ctxsize = sizeof(struct otx_cpt_aead_ctx),
1450 		.cra_priority = 4001,
1451 		.cra_alignmask = 0,
1452 		.cra_module = THIS_MODULE,
1453 	},
1454 	.init = otx_cpt_aead_cbc_aes_sha384_init,
1455 	.exit = otx_cpt_aead_exit,
1456 	.setkey = otx_cpt_aead_cbc_aes_sha_setkey,
1457 	.setauthsize = otx_cpt_aead_set_authsize,
1458 	.encrypt = otx_cpt_aead_encrypt,
1459 	.decrypt = otx_cpt_aead_decrypt,
1460 	.ivsize = AES_BLOCK_SIZE,
1461 	.maxauthsize = SHA384_DIGEST_SIZE,
1462 }, {
1463 	.base = {
1464 		.cra_name = "authenc(hmac(sha512),cbc(aes))",
1465 		.cra_driver_name = "cpt_hmac_sha512_cbc_aes",
1466 		.cra_blocksize = AES_BLOCK_SIZE,
1467 		.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1468 		.cra_ctxsize = sizeof(struct otx_cpt_aead_ctx),
1469 		.cra_priority = 4001,
1470 		.cra_alignmask = 0,
1471 		.cra_module = THIS_MODULE,
1472 	},
1473 	.init = otx_cpt_aead_cbc_aes_sha512_init,
1474 	.exit = otx_cpt_aead_exit,
1475 	.setkey = otx_cpt_aead_cbc_aes_sha_setkey,
1476 	.setauthsize = otx_cpt_aead_set_authsize,
1477 	.encrypt = otx_cpt_aead_encrypt,
1478 	.decrypt = otx_cpt_aead_decrypt,
1479 	.ivsize = AES_BLOCK_SIZE,
1480 	.maxauthsize = SHA512_DIGEST_SIZE,
1481 }, {
1482 	.base = {
1483 		.cra_name = "authenc(hmac(sha1),ecb(cipher_null))",
1484 		.cra_driver_name = "cpt_hmac_sha1_ecb_null",
1485 		.cra_blocksize = 1,
1486 		.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1487 		.cra_ctxsize = sizeof(struct otx_cpt_aead_ctx),
1488 		.cra_priority = 4001,
1489 		.cra_alignmask = 0,
1490 		.cra_module = THIS_MODULE,
1491 	},
1492 	.init = otx_cpt_aead_ecb_null_sha1_init,
1493 	.exit = otx_cpt_aead_exit,
1494 	.setkey = otx_cpt_aead_ecb_null_sha_setkey,
1495 	.setauthsize = otx_cpt_aead_set_authsize,
1496 	.encrypt = otx_cpt_aead_null_encrypt,
1497 	.decrypt = otx_cpt_aead_null_decrypt,
1498 	.ivsize = 0,
1499 	.maxauthsize = SHA1_DIGEST_SIZE,
1500 }, {
1501 	.base = {
1502 		.cra_name = "authenc(hmac(sha256),ecb(cipher_null))",
1503 		.cra_driver_name = "cpt_hmac_sha256_ecb_null",
1504 		.cra_blocksize = 1,
1505 		.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1506 		.cra_ctxsize = sizeof(struct otx_cpt_aead_ctx),
1507 		.cra_priority = 4001,
1508 		.cra_alignmask = 0,
1509 		.cra_module = THIS_MODULE,
1510 	},
1511 	.init = otx_cpt_aead_ecb_null_sha256_init,
1512 	.exit = otx_cpt_aead_exit,
1513 	.setkey = otx_cpt_aead_ecb_null_sha_setkey,
1514 	.setauthsize = otx_cpt_aead_set_authsize,
1515 	.encrypt = otx_cpt_aead_null_encrypt,
1516 	.decrypt = otx_cpt_aead_null_decrypt,
1517 	.ivsize = 0,
1518 	.maxauthsize = SHA256_DIGEST_SIZE,
1519 }, {
1520 	.base = {
1521 		.cra_name = "authenc(hmac(sha384),ecb(cipher_null))",
1522 		.cra_driver_name = "cpt_hmac_sha384_ecb_null",
1523 		.cra_blocksize = 1,
1524 		.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1525 		.cra_ctxsize = sizeof(struct otx_cpt_aead_ctx),
1526 		.cra_priority = 4001,
1527 		.cra_alignmask = 0,
1528 		.cra_module = THIS_MODULE,
1529 	},
1530 	.init = otx_cpt_aead_ecb_null_sha384_init,
1531 	.exit = otx_cpt_aead_exit,
1532 	.setkey = otx_cpt_aead_ecb_null_sha_setkey,
1533 	.setauthsize = otx_cpt_aead_set_authsize,
1534 	.encrypt = otx_cpt_aead_null_encrypt,
1535 	.decrypt = otx_cpt_aead_null_decrypt,
1536 	.ivsize = 0,
1537 	.maxauthsize = SHA384_DIGEST_SIZE,
1538 }, {
1539 	.base = {
1540 		.cra_name = "authenc(hmac(sha512),ecb(cipher_null))",
1541 		.cra_driver_name = "cpt_hmac_sha512_ecb_null",
1542 		.cra_blocksize = 1,
1543 		.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1544 		.cra_ctxsize = sizeof(struct otx_cpt_aead_ctx),
1545 		.cra_priority = 4001,
1546 		.cra_alignmask = 0,
1547 		.cra_module = THIS_MODULE,
1548 	},
1549 	.init = otx_cpt_aead_ecb_null_sha512_init,
1550 	.exit = otx_cpt_aead_exit,
1551 	.setkey = otx_cpt_aead_ecb_null_sha_setkey,
1552 	.setauthsize = otx_cpt_aead_set_authsize,
1553 	.encrypt = otx_cpt_aead_null_encrypt,
1554 	.decrypt = otx_cpt_aead_null_decrypt,
1555 	.ivsize = 0,
1556 	.maxauthsize = SHA512_DIGEST_SIZE,
1557 }, {
1558 	.base = {
1559 		.cra_name = "rfc4106(gcm(aes))",
1560 		.cra_driver_name = "cpt_rfc4106_gcm_aes",
1561 		.cra_blocksize = 1,
1562 		.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY,
1563 		.cra_ctxsize = sizeof(struct otx_cpt_aead_ctx),
1564 		.cra_priority = 4001,
1565 		.cra_alignmask = 0,
1566 		.cra_module = THIS_MODULE,
1567 	},
1568 	.init = otx_cpt_aead_gcm_aes_init,
1569 	.exit = otx_cpt_aead_exit,
1570 	.setkey = otx_cpt_aead_gcm_aes_setkey,
1571 	.setauthsize = otx_cpt_aead_set_authsize,
1572 	.encrypt = otx_cpt_aead_encrypt,
1573 	.decrypt = otx_cpt_aead_decrypt,
1574 	.ivsize = AES_GCM_IV_SIZE,
1575 	.maxauthsize = AES_GCM_ICV_SIZE,
1576 } };
1577 
1578 static inline int is_any_alg_used(void)
1579 {
1580 	int i;
1581 
1582 	for (i = 0; i < ARRAY_SIZE(otx_cpt_skciphers); i++)
1583 		if (refcount_read(&otx_cpt_skciphers[i].base.cra_refcnt) != 1)
1584 			return true;
1585 	for (i = 0; i < ARRAY_SIZE(otx_cpt_aeads); i++)
1586 		if (refcount_read(&otx_cpt_aeads[i].base.cra_refcnt) != 1)
1587 			return true;
1588 	return false;
1589 }
1590 
1591 static inline int cpt_register_algs(void)
1592 {
1593 	int i, err = 0;
1594 
1595 	if (!IS_ENABLED(CONFIG_DM_CRYPT)) {
1596 		for (i = 0; i < ARRAY_SIZE(otx_cpt_skciphers); i++)
1597 			otx_cpt_skciphers[i].base.cra_flags &= ~CRYPTO_ALG_DEAD;
1598 
1599 		err = crypto_register_skciphers(otx_cpt_skciphers,
1600 						ARRAY_SIZE(otx_cpt_skciphers));
1601 		if (err)
1602 			return err;
1603 	}
1604 
1605 	for (i = 0; i < ARRAY_SIZE(otx_cpt_aeads); i++)
1606 		otx_cpt_aeads[i].base.cra_flags &= ~CRYPTO_ALG_DEAD;
1607 
1608 	err = crypto_register_aeads(otx_cpt_aeads, ARRAY_SIZE(otx_cpt_aeads));
1609 	if (err) {
1610 		crypto_unregister_skciphers(otx_cpt_skciphers,
1611 					    ARRAY_SIZE(otx_cpt_skciphers));
1612 		return err;
1613 	}
1614 
1615 	return 0;
1616 }
1617 
1618 static inline void cpt_unregister_algs(void)
1619 {
1620 	crypto_unregister_skciphers(otx_cpt_skciphers,
1621 				    ARRAY_SIZE(otx_cpt_skciphers));
1622 	crypto_unregister_aeads(otx_cpt_aeads, ARRAY_SIZE(otx_cpt_aeads));
1623 }
1624 
1625 static int compare_func(const void *lptr, const void *rptr)
1626 {
1627 	struct cpt_device_desc *ldesc = (struct cpt_device_desc *) lptr;
1628 	struct cpt_device_desc *rdesc = (struct cpt_device_desc *) rptr;
1629 
1630 	if (ldesc->dev->devfn < rdesc->dev->devfn)
1631 		return -1;
1632 	if (ldesc->dev->devfn > rdesc->dev->devfn)
1633 		return 1;
1634 	return 0;
1635 }
1636 
1637 static void swap_func(void *lptr, void *rptr, int size)
1638 {
1639 	struct cpt_device_desc *ldesc = (struct cpt_device_desc *) lptr;
1640 	struct cpt_device_desc *rdesc = (struct cpt_device_desc *) rptr;
1641 	struct cpt_device_desc desc;
1642 
1643 	desc = *ldesc;
1644 	*ldesc = *rdesc;
1645 	*rdesc = desc;
1646 }
1647 
1648 int otx_cpt_crypto_init(struct pci_dev *pdev, struct module *mod,
1649 			enum otx_cptpf_type pf_type,
1650 			enum otx_cptvf_type engine_type,
1651 			int num_queues, int num_devices)
1652 {
1653 	int ret = 0;
1654 	int count;
1655 
1656 	mutex_lock(&mutex);
1657 	switch (engine_type) {
1658 	case OTX_CPT_SE_TYPES:
1659 		count = atomic_read(&se_devices.count);
1660 		if (count >= CPT_MAX_VF_NUM) {
1661 			dev_err(&pdev->dev, "No space to add a new device\n");
1662 			ret = -ENOSPC;
1663 			goto err;
1664 		}
1665 		se_devices.desc[count].pf_type = pf_type;
1666 		se_devices.desc[count].num_queues = num_queues;
1667 		se_devices.desc[count++].dev = pdev;
1668 		atomic_inc(&se_devices.count);
1669 
1670 		if (atomic_read(&se_devices.count) == num_devices &&
1671 		    is_crypto_registered == false) {
1672 			if (cpt_register_algs()) {
1673 				dev_err(&pdev->dev,
1674 				   "Error in registering crypto algorithms\n");
1675 				ret =  -EINVAL;
1676 				goto err;
1677 			}
1678 			try_module_get(mod);
1679 			is_crypto_registered = true;
1680 		}
1681 		sort(se_devices.desc, count, sizeof(struct cpt_device_desc),
1682 		     compare_func, swap_func);
1683 		break;
1684 
1685 	case OTX_CPT_AE_TYPES:
1686 		count = atomic_read(&ae_devices.count);
1687 		if (count >= CPT_MAX_VF_NUM) {
1688 			dev_err(&pdev->dev, "No space to a add new device\n");
1689 			ret = -ENOSPC;
1690 			goto err;
1691 		}
1692 		ae_devices.desc[count].pf_type = pf_type;
1693 		ae_devices.desc[count].num_queues = num_queues;
1694 		ae_devices.desc[count++].dev = pdev;
1695 		atomic_inc(&ae_devices.count);
1696 		sort(ae_devices.desc, count, sizeof(struct cpt_device_desc),
1697 		     compare_func, swap_func);
1698 		break;
1699 
1700 	default:
1701 		dev_err(&pdev->dev, "Unknown VF type %d\n", engine_type);
1702 		ret = BAD_OTX_CPTVF_TYPE;
1703 	}
1704 err:
1705 	mutex_unlock(&mutex);
1706 	return ret;
1707 }
1708 
1709 void otx_cpt_crypto_exit(struct pci_dev *pdev, struct module *mod,
1710 			 enum otx_cptvf_type engine_type)
1711 {
1712 	struct cpt_device_table *dev_tbl;
1713 	bool dev_found = false;
1714 	int i, j, count;
1715 
1716 	mutex_lock(&mutex);
1717 
1718 	dev_tbl = (engine_type == OTX_CPT_AE_TYPES) ? &ae_devices : &se_devices;
1719 	count = atomic_read(&dev_tbl->count);
1720 	for (i = 0; i < count; i++)
1721 		if (pdev == dev_tbl->desc[i].dev) {
1722 			for (j = i; j < count-1; j++)
1723 				dev_tbl->desc[j] = dev_tbl->desc[j+1];
1724 			dev_found = true;
1725 			break;
1726 		}
1727 
1728 	if (!dev_found) {
1729 		dev_err(&pdev->dev, "%s device not found\n", __func__);
1730 		goto exit;
1731 	}
1732 
1733 	if (engine_type != OTX_CPT_AE_TYPES) {
1734 		if (atomic_dec_and_test(&se_devices.count) &&
1735 		    !is_any_alg_used()) {
1736 			cpt_unregister_algs();
1737 			module_put(mod);
1738 			is_crypto_registered = false;
1739 		}
1740 	} else
1741 		atomic_dec(&ae_devices.count);
1742 exit:
1743 	mutex_unlock(&mutex);
1744 }
1745