cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

otx2_cptvf_algs.c (46851B)


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