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