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

sec_algs.c (30071B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright (c) 2016-2017 HiSilicon Limited. */
      3#include <linux/crypto.h>
      4#include <linux/dma-mapping.h>
      5#include <linux/dmapool.h>
      6#include <linux/module.h>
      7#include <linux/mutex.h>
      8#include <linux/slab.h>
      9
     10#include <crypto/aes.h>
     11#include <crypto/algapi.h>
     12#include <crypto/internal/des.h>
     13#include <crypto/skcipher.h>
     14#include <crypto/xts.h>
     15#include <crypto/internal/skcipher.h>
     16
     17#include "sec_drv.h"
     18
     19#define SEC_MAX_CIPHER_KEY		64
     20#define SEC_REQ_LIMIT SZ_32M
     21
     22struct sec_c_alg_cfg {
     23	unsigned c_alg		: 3;
     24	unsigned c_mode		: 3;
     25	unsigned key_len	: 2;
     26	unsigned c_width	: 2;
     27};
     28
     29static const struct sec_c_alg_cfg sec_c_alg_cfgs[] =  {
     30	[SEC_C_DES_ECB_64] = {
     31		.c_alg = SEC_C_ALG_DES,
     32		.c_mode = SEC_C_MODE_ECB,
     33		.key_len = SEC_KEY_LEN_DES,
     34	},
     35	[SEC_C_DES_CBC_64] = {
     36		.c_alg = SEC_C_ALG_DES,
     37		.c_mode = SEC_C_MODE_CBC,
     38		.key_len = SEC_KEY_LEN_DES,
     39	},
     40	[SEC_C_3DES_ECB_192_3KEY] = {
     41		.c_alg = SEC_C_ALG_3DES,
     42		.c_mode = SEC_C_MODE_ECB,
     43		.key_len = SEC_KEY_LEN_3DES_3_KEY,
     44	},
     45	[SEC_C_3DES_ECB_192_2KEY] = {
     46		.c_alg = SEC_C_ALG_3DES,
     47		.c_mode = SEC_C_MODE_ECB,
     48		.key_len = SEC_KEY_LEN_3DES_2_KEY,
     49	},
     50	[SEC_C_3DES_CBC_192_3KEY] = {
     51		.c_alg = SEC_C_ALG_3DES,
     52		.c_mode = SEC_C_MODE_CBC,
     53		.key_len = SEC_KEY_LEN_3DES_3_KEY,
     54	},
     55	[SEC_C_3DES_CBC_192_2KEY] = {
     56		.c_alg = SEC_C_ALG_3DES,
     57		.c_mode = SEC_C_MODE_CBC,
     58		.key_len = SEC_KEY_LEN_3DES_2_KEY,
     59	},
     60	[SEC_C_AES_ECB_128] = {
     61		.c_alg = SEC_C_ALG_AES,
     62		.c_mode = SEC_C_MODE_ECB,
     63		.key_len = SEC_KEY_LEN_AES_128,
     64	},
     65	[SEC_C_AES_ECB_192] = {
     66		.c_alg = SEC_C_ALG_AES,
     67		.c_mode = SEC_C_MODE_ECB,
     68		.key_len = SEC_KEY_LEN_AES_192,
     69	},
     70	[SEC_C_AES_ECB_256] = {
     71		.c_alg = SEC_C_ALG_AES,
     72		.c_mode = SEC_C_MODE_ECB,
     73		.key_len = SEC_KEY_LEN_AES_256,
     74	},
     75	[SEC_C_AES_CBC_128] = {
     76		.c_alg = SEC_C_ALG_AES,
     77		.c_mode = SEC_C_MODE_CBC,
     78		.key_len = SEC_KEY_LEN_AES_128,
     79	},
     80	[SEC_C_AES_CBC_192] = {
     81		.c_alg = SEC_C_ALG_AES,
     82		.c_mode = SEC_C_MODE_CBC,
     83		.key_len = SEC_KEY_LEN_AES_192,
     84	},
     85	[SEC_C_AES_CBC_256] = {
     86		.c_alg = SEC_C_ALG_AES,
     87		.c_mode = SEC_C_MODE_CBC,
     88		.key_len = SEC_KEY_LEN_AES_256,
     89	},
     90	[SEC_C_AES_CTR_128] = {
     91		.c_alg = SEC_C_ALG_AES,
     92		.c_mode = SEC_C_MODE_CTR,
     93		.key_len = SEC_KEY_LEN_AES_128,
     94	},
     95	[SEC_C_AES_CTR_192] = {
     96		.c_alg = SEC_C_ALG_AES,
     97		.c_mode = SEC_C_MODE_CTR,
     98		.key_len = SEC_KEY_LEN_AES_192,
     99	},
    100	[SEC_C_AES_CTR_256] = {
    101		.c_alg = SEC_C_ALG_AES,
    102		.c_mode = SEC_C_MODE_CTR,
    103		.key_len = SEC_KEY_LEN_AES_256,
    104	},
    105	[SEC_C_AES_XTS_128] = {
    106		.c_alg = SEC_C_ALG_AES,
    107		.c_mode = SEC_C_MODE_XTS,
    108		.key_len = SEC_KEY_LEN_AES_128,
    109	},
    110	[SEC_C_AES_XTS_256] = {
    111		.c_alg = SEC_C_ALG_AES,
    112		.c_mode = SEC_C_MODE_XTS,
    113		.key_len = SEC_KEY_LEN_AES_256,
    114	},
    115	[SEC_C_NULL] = {
    116	},
    117};
    118
    119/*
    120 * Mutex used to ensure safe operation of reference count of
    121 * alg providers
    122 */
    123static DEFINE_MUTEX(algs_lock);
    124static unsigned int active_devs;
    125
    126static void sec_alg_skcipher_init_template(struct sec_alg_tfm_ctx *ctx,
    127					   struct sec_bd_info *req,
    128					   enum sec_cipher_alg alg)
    129{
    130	const struct sec_c_alg_cfg *cfg = &sec_c_alg_cfgs[alg];
    131
    132	memset(req, 0, sizeof(*req));
    133	req->w0 |= cfg->c_mode << SEC_BD_W0_C_MODE_S;
    134	req->w1 |= cfg->c_alg << SEC_BD_W1_C_ALG_S;
    135	req->w3 |= cfg->key_len << SEC_BD_W3_C_KEY_LEN_S;
    136	req->w0 |= cfg->c_width << SEC_BD_W0_C_WIDTH_S;
    137
    138	req->cipher_key_addr_lo = lower_32_bits(ctx->pkey);
    139	req->cipher_key_addr_hi = upper_32_bits(ctx->pkey);
    140}
    141
    142static void sec_alg_skcipher_init_context(struct crypto_skcipher *atfm,
    143					  const u8 *key,
    144					  unsigned int keylen,
    145					  enum sec_cipher_alg alg)
    146{
    147	struct crypto_tfm *tfm = crypto_skcipher_tfm(atfm);
    148	struct sec_alg_tfm_ctx *ctx = crypto_tfm_ctx(tfm);
    149
    150	ctx->cipher_alg = alg;
    151	memcpy(ctx->key, key, keylen);
    152	sec_alg_skcipher_init_template(ctx, &ctx->req_template,
    153				       ctx->cipher_alg);
    154}
    155
    156static void sec_free_hw_sgl(struct sec_hw_sgl *hw_sgl,
    157			    dma_addr_t psec_sgl, struct sec_dev_info *info)
    158{
    159	struct sec_hw_sgl *sgl_current, *sgl_next;
    160	dma_addr_t sgl_next_dma;
    161
    162	sgl_current = hw_sgl;
    163	while (sgl_current) {
    164		sgl_next = sgl_current->next;
    165		sgl_next_dma = sgl_current->next_sgl;
    166
    167		dma_pool_free(info->hw_sgl_pool, sgl_current, psec_sgl);
    168
    169		sgl_current = sgl_next;
    170		psec_sgl = sgl_next_dma;
    171	}
    172}
    173
    174static int sec_alloc_and_fill_hw_sgl(struct sec_hw_sgl **sec_sgl,
    175				     dma_addr_t *psec_sgl,
    176				     struct scatterlist *sgl,
    177				     int count,
    178				     struct sec_dev_info *info,
    179				     gfp_t gfp)
    180{
    181	struct sec_hw_sgl *sgl_current = NULL;
    182	struct sec_hw_sgl *sgl_next;
    183	dma_addr_t sgl_next_dma;
    184	struct scatterlist *sg;
    185	int ret, sge_index, i;
    186
    187	if (!count)
    188		return -EINVAL;
    189
    190	for_each_sg(sgl, sg, count, i) {
    191		sge_index = i % SEC_MAX_SGE_NUM;
    192		if (sge_index == 0) {
    193			sgl_next = dma_pool_zalloc(info->hw_sgl_pool,
    194						   gfp, &sgl_next_dma);
    195			if (!sgl_next) {
    196				ret = -ENOMEM;
    197				goto err_free_hw_sgls;
    198			}
    199
    200			if (!sgl_current) { /* First one */
    201				*psec_sgl = sgl_next_dma;
    202				*sec_sgl = sgl_next;
    203			} else { /* Chained */
    204				sgl_current->entry_sum_in_sgl = SEC_MAX_SGE_NUM;
    205				sgl_current->next_sgl = sgl_next_dma;
    206				sgl_current->next = sgl_next;
    207			}
    208			sgl_current = sgl_next;
    209		}
    210		sgl_current->sge_entries[sge_index].buf = sg_dma_address(sg);
    211		sgl_current->sge_entries[sge_index].len = sg_dma_len(sg);
    212		sgl_current->data_bytes_in_sgl += sg_dma_len(sg);
    213	}
    214	sgl_current->entry_sum_in_sgl = count % SEC_MAX_SGE_NUM;
    215	sgl_current->next_sgl = 0;
    216	(*sec_sgl)->entry_sum_in_chain = count;
    217
    218	return 0;
    219
    220err_free_hw_sgls:
    221	sec_free_hw_sgl(*sec_sgl, *psec_sgl, info);
    222	*psec_sgl = 0;
    223
    224	return ret;
    225}
    226
    227static int sec_alg_skcipher_setkey(struct crypto_skcipher *tfm,
    228				   const u8 *key, unsigned int keylen,
    229				   enum sec_cipher_alg alg)
    230{
    231	struct sec_alg_tfm_ctx *ctx = crypto_skcipher_ctx(tfm);
    232	struct device *dev = ctx->queue->dev_info->dev;
    233
    234	mutex_lock(&ctx->lock);
    235	if (ctx->key) {
    236		/* rekeying */
    237		memset(ctx->key, 0, SEC_MAX_CIPHER_KEY);
    238	} else {
    239		/* new key */
    240		ctx->key = dma_alloc_coherent(dev, SEC_MAX_CIPHER_KEY,
    241					      &ctx->pkey, GFP_KERNEL);
    242		if (!ctx->key) {
    243			mutex_unlock(&ctx->lock);
    244			return -ENOMEM;
    245		}
    246	}
    247	mutex_unlock(&ctx->lock);
    248	sec_alg_skcipher_init_context(tfm, key, keylen, alg);
    249
    250	return 0;
    251}
    252
    253static int sec_alg_skcipher_setkey_aes_ecb(struct crypto_skcipher *tfm,
    254					   const u8 *key, unsigned int keylen)
    255{
    256	enum sec_cipher_alg alg;
    257
    258	switch (keylen) {
    259	case AES_KEYSIZE_128:
    260		alg = SEC_C_AES_ECB_128;
    261		break;
    262	case AES_KEYSIZE_192:
    263		alg = SEC_C_AES_ECB_192;
    264		break;
    265	case AES_KEYSIZE_256:
    266		alg = SEC_C_AES_ECB_256;
    267		break;
    268	default:
    269		return -EINVAL;
    270	}
    271
    272	return sec_alg_skcipher_setkey(tfm, key, keylen, alg);
    273}
    274
    275static int sec_alg_skcipher_setkey_aes_cbc(struct crypto_skcipher *tfm,
    276					   const u8 *key, unsigned int keylen)
    277{
    278	enum sec_cipher_alg alg;
    279
    280	switch (keylen) {
    281	case AES_KEYSIZE_128:
    282		alg = SEC_C_AES_CBC_128;
    283		break;
    284	case AES_KEYSIZE_192:
    285		alg = SEC_C_AES_CBC_192;
    286		break;
    287	case AES_KEYSIZE_256:
    288		alg = SEC_C_AES_CBC_256;
    289		break;
    290	default:
    291		return -EINVAL;
    292	}
    293
    294	return sec_alg_skcipher_setkey(tfm, key, keylen, alg);
    295}
    296
    297static int sec_alg_skcipher_setkey_aes_ctr(struct crypto_skcipher *tfm,
    298					   const u8 *key, unsigned int keylen)
    299{
    300	enum sec_cipher_alg alg;
    301
    302	switch (keylen) {
    303	case AES_KEYSIZE_128:
    304		alg = SEC_C_AES_CTR_128;
    305		break;
    306	case AES_KEYSIZE_192:
    307		alg = SEC_C_AES_CTR_192;
    308		break;
    309	case AES_KEYSIZE_256:
    310		alg = SEC_C_AES_CTR_256;
    311		break;
    312	default:
    313		return -EINVAL;
    314	}
    315
    316	return sec_alg_skcipher_setkey(tfm, key, keylen, alg);
    317}
    318
    319static int sec_alg_skcipher_setkey_aes_xts(struct crypto_skcipher *tfm,
    320					   const u8 *key, unsigned int keylen)
    321{
    322	enum sec_cipher_alg alg;
    323	int ret;
    324
    325	ret = xts_verify_key(tfm, key, keylen);
    326	if (ret)
    327		return ret;
    328
    329	switch (keylen) {
    330	case AES_KEYSIZE_128 * 2:
    331		alg = SEC_C_AES_XTS_128;
    332		break;
    333	case AES_KEYSIZE_256 * 2:
    334		alg = SEC_C_AES_XTS_256;
    335		break;
    336	default:
    337		return -EINVAL;
    338	}
    339
    340	return sec_alg_skcipher_setkey(tfm, key, keylen, alg);
    341}
    342
    343static int sec_alg_skcipher_setkey_des_ecb(struct crypto_skcipher *tfm,
    344					   const u8 *key, unsigned int keylen)
    345{
    346	return verify_skcipher_des_key(tfm, key) ?:
    347	       sec_alg_skcipher_setkey(tfm, key, keylen, SEC_C_DES_ECB_64);
    348}
    349
    350static int sec_alg_skcipher_setkey_des_cbc(struct crypto_skcipher *tfm,
    351					   const u8 *key, unsigned int keylen)
    352{
    353	return verify_skcipher_des_key(tfm, key) ?:
    354	       sec_alg_skcipher_setkey(tfm, key, keylen, SEC_C_DES_CBC_64);
    355}
    356
    357static int sec_alg_skcipher_setkey_3des_ecb(struct crypto_skcipher *tfm,
    358					    const u8 *key, unsigned int keylen)
    359{
    360	return verify_skcipher_des3_key(tfm, key) ?:
    361	       sec_alg_skcipher_setkey(tfm, key, keylen,
    362				       SEC_C_3DES_ECB_192_3KEY);
    363}
    364
    365static int sec_alg_skcipher_setkey_3des_cbc(struct crypto_skcipher *tfm,
    366					    const u8 *key, unsigned int keylen)
    367{
    368	return verify_skcipher_des3_key(tfm, key) ?:
    369	       sec_alg_skcipher_setkey(tfm, key, keylen,
    370				       SEC_C_3DES_CBC_192_3KEY);
    371}
    372
    373static void sec_alg_free_el(struct sec_request_el *el,
    374			    struct sec_dev_info *info)
    375{
    376	sec_free_hw_sgl(el->out, el->dma_out, info);
    377	sec_free_hw_sgl(el->in, el->dma_in, info);
    378	kfree(el->sgl_in);
    379	kfree(el->sgl_out);
    380	kfree(el);
    381}
    382
    383/* queuelock must be held */
    384static int sec_send_request(struct sec_request *sec_req, struct sec_queue *queue)
    385{
    386	struct sec_request_el *el, *temp;
    387	int ret = 0;
    388
    389	mutex_lock(&sec_req->lock);
    390	list_for_each_entry_safe(el, temp, &sec_req->elements, head) {
    391		/*
    392		 * Add to hardware queue only under following circumstances
    393		 * 1) Software and hardware queue empty so no chain dependencies
    394		 * 2) No dependencies as new IV - (check software queue empty
    395		 *    to maintain order)
    396		 * 3) No dependencies because the mode does no chaining.
    397		 *
    398		 * In other cases first insert onto the software queue which
    399		 * is then emptied as requests complete
    400		 */
    401		if (!queue->havesoftqueue ||
    402		    (kfifo_is_empty(&queue->softqueue) &&
    403		     sec_queue_empty(queue))) {
    404			ret = sec_queue_send(queue, &el->req, sec_req);
    405			if (ret == -EAGAIN) {
    406				/* Wait unti we can send then try again */
    407				/* DEAD if here - should not happen */
    408				ret = -EBUSY;
    409				goto err_unlock;
    410			}
    411		} else {
    412			kfifo_put(&queue->softqueue, el);
    413		}
    414	}
    415err_unlock:
    416	mutex_unlock(&sec_req->lock);
    417
    418	return ret;
    419}
    420
    421static void sec_skcipher_alg_callback(struct sec_bd_info *sec_resp,
    422				      struct crypto_async_request *req_base)
    423{
    424	struct skcipher_request *skreq = container_of(req_base,
    425						      struct skcipher_request,
    426						      base);
    427	struct sec_request *sec_req = skcipher_request_ctx(skreq);
    428	struct sec_request *backlog_req;
    429	struct sec_request_el *sec_req_el, *nextrequest;
    430	struct sec_alg_tfm_ctx *ctx = sec_req->tfm_ctx;
    431	struct crypto_skcipher *atfm = crypto_skcipher_reqtfm(skreq);
    432	struct device *dev = ctx->queue->dev_info->dev;
    433	int icv_or_skey_en, ret;
    434	bool done;
    435
    436	sec_req_el = list_first_entry(&sec_req->elements, struct sec_request_el,
    437				      head);
    438	icv_or_skey_en = (sec_resp->w0 & SEC_BD_W0_ICV_OR_SKEY_EN_M) >>
    439		SEC_BD_W0_ICV_OR_SKEY_EN_S;
    440	if (sec_resp->w1 & SEC_BD_W1_BD_INVALID || icv_or_skey_en == 3) {
    441		dev_err(dev, "Got an invalid answer %lu %d\n",
    442			sec_resp->w1 & SEC_BD_W1_BD_INVALID,
    443			icv_or_skey_en);
    444		sec_req->err = -EINVAL;
    445		/*
    446		 * We need to muddle on to avoid getting stuck with elements
    447		 * on the queue. Error will be reported so requester so
    448		 * it should be able to handle appropriately.
    449		 */
    450	}
    451
    452	mutex_lock(&ctx->queue->queuelock);
    453	/* Put the IV in place for chained cases */
    454	switch (ctx->cipher_alg) {
    455	case SEC_C_AES_CBC_128:
    456	case SEC_C_AES_CBC_192:
    457	case SEC_C_AES_CBC_256:
    458		if (sec_req_el->req.w0 & SEC_BD_W0_DE)
    459			sg_pcopy_to_buffer(sec_req_el->sgl_out,
    460					   sg_nents(sec_req_el->sgl_out),
    461					   skreq->iv,
    462					   crypto_skcipher_ivsize(atfm),
    463					   sec_req_el->el_length -
    464					   crypto_skcipher_ivsize(atfm));
    465		else
    466			sg_pcopy_to_buffer(sec_req_el->sgl_in,
    467					   sg_nents(sec_req_el->sgl_in),
    468					   skreq->iv,
    469					   crypto_skcipher_ivsize(atfm),
    470					   sec_req_el->el_length -
    471					   crypto_skcipher_ivsize(atfm));
    472		/* No need to sync to the device as coherent DMA */
    473		break;
    474	case SEC_C_AES_CTR_128:
    475	case SEC_C_AES_CTR_192:
    476	case SEC_C_AES_CTR_256:
    477		crypto_inc(skreq->iv, 16);
    478		break;
    479	default:
    480		/* Do not update */
    481		break;
    482	}
    483
    484	if (ctx->queue->havesoftqueue &&
    485	    !kfifo_is_empty(&ctx->queue->softqueue) &&
    486	    sec_queue_empty(ctx->queue)) {
    487		ret = kfifo_get(&ctx->queue->softqueue, &nextrequest);
    488		if (ret <= 0)
    489			dev_err(dev,
    490				"Error getting next element from kfifo %d\n",
    491				ret);
    492		else
    493			/* We know there is space so this cannot fail */
    494			sec_queue_send(ctx->queue, &nextrequest->req,
    495				       nextrequest->sec_req);
    496	} else if (!list_empty(&ctx->backlog)) {
    497		/* Need to verify there is room first */
    498		backlog_req = list_first_entry(&ctx->backlog,
    499					       typeof(*backlog_req),
    500					       backlog_head);
    501		if (sec_queue_can_enqueue(ctx->queue,
    502		    backlog_req->num_elements) ||
    503		    (ctx->queue->havesoftqueue &&
    504		     kfifo_avail(&ctx->queue->softqueue) >
    505		     backlog_req->num_elements)) {
    506			sec_send_request(backlog_req, ctx->queue);
    507			backlog_req->req_base->complete(backlog_req->req_base,
    508							-EINPROGRESS);
    509			list_del(&backlog_req->backlog_head);
    510		}
    511	}
    512	mutex_unlock(&ctx->queue->queuelock);
    513
    514	mutex_lock(&sec_req->lock);
    515	list_del(&sec_req_el->head);
    516	mutex_unlock(&sec_req->lock);
    517	sec_alg_free_el(sec_req_el, ctx->queue->dev_info);
    518
    519	/*
    520	 * Request is done.
    521	 * The dance is needed as the lock is freed in the completion
    522	 */
    523	mutex_lock(&sec_req->lock);
    524	done = list_empty(&sec_req->elements);
    525	mutex_unlock(&sec_req->lock);
    526	if (done) {
    527		if (crypto_skcipher_ivsize(atfm)) {
    528			dma_unmap_single(dev, sec_req->dma_iv,
    529					 crypto_skcipher_ivsize(atfm),
    530					 DMA_TO_DEVICE);
    531		}
    532		dma_unmap_sg(dev, skreq->src, sec_req->len_in,
    533			     DMA_BIDIRECTIONAL);
    534		if (skreq->src != skreq->dst)
    535			dma_unmap_sg(dev, skreq->dst, sec_req->len_out,
    536				     DMA_BIDIRECTIONAL);
    537		skreq->base.complete(&skreq->base, sec_req->err);
    538	}
    539}
    540
    541void sec_alg_callback(struct sec_bd_info *resp, void *shadow)
    542{
    543	struct sec_request *sec_req = shadow;
    544
    545	sec_req->cb(resp, sec_req->req_base);
    546}
    547
    548static int sec_alg_alloc_and_calc_split_sizes(int length, size_t **split_sizes,
    549					      int *steps, gfp_t gfp)
    550{
    551	size_t *sizes;
    552	int i;
    553
    554	/* Split into suitable sized blocks */
    555	*steps = roundup(length, SEC_REQ_LIMIT) / SEC_REQ_LIMIT;
    556	sizes = kcalloc(*steps, sizeof(*sizes), gfp);
    557	if (!sizes)
    558		return -ENOMEM;
    559
    560	for (i = 0; i < *steps - 1; i++)
    561		sizes[i] = SEC_REQ_LIMIT;
    562	sizes[*steps - 1] = length - SEC_REQ_LIMIT * (*steps - 1);
    563	*split_sizes = sizes;
    564
    565	return 0;
    566}
    567
    568static int sec_map_and_split_sg(struct scatterlist *sgl, size_t *split_sizes,
    569				int steps, struct scatterlist ***splits,
    570				int **splits_nents,
    571				int sgl_len_in,
    572				struct device *dev, gfp_t gfp)
    573{
    574	int ret, count;
    575
    576	count = dma_map_sg(dev, sgl, sgl_len_in, DMA_BIDIRECTIONAL);
    577	if (!count)
    578		return -EINVAL;
    579
    580	*splits = kcalloc(steps, sizeof(struct scatterlist *), gfp);
    581	if (!*splits) {
    582		ret = -ENOMEM;
    583		goto err_unmap_sg;
    584	}
    585	*splits_nents = kcalloc(steps, sizeof(int), gfp);
    586	if (!*splits_nents) {
    587		ret = -ENOMEM;
    588		goto err_free_splits;
    589	}
    590
    591	/* output the scatter list before and after this */
    592	ret = sg_split(sgl, count, 0, steps, split_sizes,
    593		       *splits, *splits_nents, gfp);
    594	if (ret) {
    595		ret = -ENOMEM;
    596		goto err_free_splits_nents;
    597	}
    598
    599	return 0;
    600
    601err_free_splits_nents:
    602	kfree(*splits_nents);
    603err_free_splits:
    604	kfree(*splits);
    605err_unmap_sg:
    606	dma_unmap_sg(dev, sgl, sgl_len_in, DMA_BIDIRECTIONAL);
    607
    608	return ret;
    609}
    610
    611/*
    612 * Reverses the sec_map_and_split_sg call for messages not yet added to
    613 * the queues.
    614 */
    615static void sec_unmap_sg_on_err(struct scatterlist *sgl, int steps,
    616				struct scatterlist **splits, int *splits_nents,
    617				int sgl_len_in, struct device *dev)
    618{
    619	int i;
    620
    621	for (i = 0; i < steps; i++)
    622		kfree(splits[i]);
    623	kfree(splits_nents);
    624	kfree(splits);
    625
    626	dma_unmap_sg(dev, sgl, sgl_len_in, DMA_BIDIRECTIONAL);
    627}
    628
    629static struct sec_request_el
    630*sec_alg_alloc_and_fill_el(struct sec_bd_info *template, int encrypt,
    631			   int el_size, bool different_dest,
    632			   struct scatterlist *sgl_in, int n_ents_in,
    633			   struct scatterlist *sgl_out, int n_ents_out,
    634			   struct sec_dev_info *info, gfp_t gfp)
    635{
    636	struct sec_request_el *el;
    637	struct sec_bd_info *req;
    638	int ret;
    639
    640	el = kzalloc(sizeof(*el), gfp);
    641	if (!el)
    642		return ERR_PTR(-ENOMEM);
    643	el->el_length = el_size;
    644	req = &el->req;
    645	memcpy(req, template, sizeof(*req));
    646
    647	req->w0 &= ~SEC_BD_W0_CIPHER_M;
    648	if (encrypt)
    649		req->w0 |= SEC_CIPHER_ENCRYPT << SEC_BD_W0_CIPHER_S;
    650	else
    651		req->w0 |= SEC_CIPHER_DECRYPT << SEC_BD_W0_CIPHER_S;
    652
    653	req->w0 &= ~SEC_BD_W0_C_GRAN_SIZE_19_16_M;
    654	req->w0 |= ((el_size >> 16) << SEC_BD_W0_C_GRAN_SIZE_19_16_S) &
    655		SEC_BD_W0_C_GRAN_SIZE_19_16_M;
    656
    657	req->w0 &= ~SEC_BD_W0_C_GRAN_SIZE_21_20_M;
    658	req->w0 |= ((el_size >> 20) << SEC_BD_W0_C_GRAN_SIZE_21_20_S) &
    659		SEC_BD_W0_C_GRAN_SIZE_21_20_M;
    660
    661	/* Writing whole u32 so no need to take care of masking */
    662	req->w2 = ((1 << SEC_BD_W2_GRAN_NUM_S) & SEC_BD_W2_GRAN_NUM_M) |
    663		((el_size << SEC_BD_W2_C_GRAN_SIZE_15_0_S) &
    664		 SEC_BD_W2_C_GRAN_SIZE_15_0_M);
    665
    666	req->w3 &= ~SEC_BD_W3_CIPHER_LEN_OFFSET_M;
    667	req->w1 |= SEC_BD_W1_ADDR_TYPE;
    668
    669	el->sgl_in = sgl_in;
    670
    671	ret = sec_alloc_and_fill_hw_sgl(&el->in, &el->dma_in, el->sgl_in,
    672					n_ents_in, info, gfp);
    673	if (ret)
    674		goto err_free_el;
    675
    676	req->data_addr_lo = lower_32_bits(el->dma_in);
    677	req->data_addr_hi = upper_32_bits(el->dma_in);
    678
    679	if (different_dest) {
    680		el->sgl_out = sgl_out;
    681		ret = sec_alloc_and_fill_hw_sgl(&el->out, &el->dma_out,
    682						el->sgl_out,
    683						n_ents_out, info, gfp);
    684		if (ret)
    685			goto err_free_hw_sgl_in;
    686
    687		req->w0 |= SEC_BD_W0_DE;
    688		req->cipher_destin_addr_lo = lower_32_bits(el->dma_out);
    689		req->cipher_destin_addr_hi = upper_32_bits(el->dma_out);
    690
    691	} else {
    692		req->w0 &= ~SEC_BD_W0_DE;
    693		req->cipher_destin_addr_lo = lower_32_bits(el->dma_in);
    694		req->cipher_destin_addr_hi = upper_32_bits(el->dma_in);
    695	}
    696
    697	return el;
    698
    699err_free_hw_sgl_in:
    700	sec_free_hw_sgl(el->in, el->dma_in, info);
    701err_free_el:
    702	kfree(el);
    703
    704	return ERR_PTR(ret);
    705}
    706
    707static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,
    708				   bool encrypt)
    709{
    710	struct crypto_skcipher *atfm = crypto_skcipher_reqtfm(skreq);
    711	struct crypto_tfm *tfm = crypto_skcipher_tfm(atfm);
    712	struct sec_alg_tfm_ctx *ctx = crypto_tfm_ctx(tfm);
    713	struct sec_queue *queue = ctx->queue;
    714	struct sec_request *sec_req = skcipher_request_ctx(skreq);
    715	struct sec_dev_info *info = queue->dev_info;
    716	int i, ret, steps;
    717	size_t *split_sizes;
    718	struct scatterlist **splits_in;
    719	struct scatterlist **splits_out = NULL;
    720	int *splits_in_nents;
    721	int *splits_out_nents = NULL;
    722	struct sec_request_el *el, *temp;
    723	bool split = skreq->src != skreq->dst;
    724	gfp_t gfp = skreq->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL : GFP_ATOMIC;
    725
    726	mutex_init(&sec_req->lock);
    727	sec_req->req_base = &skreq->base;
    728	sec_req->err = 0;
    729	/* SGL mapping out here to allow us to break it up as necessary */
    730	sec_req->len_in = sg_nents(skreq->src);
    731
    732	ret = sec_alg_alloc_and_calc_split_sizes(skreq->cryptlen, &split_sizes,
    733						 &steps, gfp);
    734	if (ret)
    735		return ret;
    736	sec_req->num_elements = steps;
    737	ret = sec_map_and_split_sg(skreq->src, split_sizes, steps, &splits_in,
    738				   &splits_in_nents, sec_req->len_in,
    739				   info->dev, gfp);
    740	if (ret)
    741		goto err_free_split_sizes;
    742
    743	if (split) {
    744		sec_req->len_out = sg_nents(skreq->dst);
    745		ret = sec_map_and_split_sg(skreq->dst, split_sizes, steps,
    746					   &splits_out, &splits_out_nents,
    747					   sec_req->len_out, info->dev, gfp);
    748		if (ret)
    749			goto err_unmap_in_sg;
    750	}
    751	/* Shared info stored in seq_req - applies to all BDs */
    752	sec_req->tfm_ctx = ctx;
    753	sec_req->cb = sec_skcipher_alg_callback;
    754	INIT_LIST_HEAD(&sec_req->elements);
    755
    756	/*
    757	 * Future optimization.
    758	 * In the chaining case we can't use a dma pool bounce buffer
    759	 * but in the case where we know there is no chaining we can
    760	 */
    761	if (crypto_skcipher_ivsize(atfm)) {
    762		sec_req->dma_iv = dma_map_single(info->dev, skreq->iv,
    763						 crypto_skcipher_ivsize(atfm),
    764						 DMA_TO_DEVICE);
    765		if (dma_mapping_error(info->dev, sec_req->dma_iv)) {
    766			ret = -ENOMEM;
    767			goto err_unmap_out_sg;
    768		}
    769	}
    770
    771	/* Set them all up then queue - cleaner error handling. */
    772	for (i = 0; i < steps; i++) {
    773		el = sec_alg_alloc_and_fill_el(&ctx->req_template,
    774					       encrypt ? 1 : 0,
    775					       split_sizes[i],
    776					       skreq->src != skreq->dst,
    777					       splits_in[i], splits_in_nents[i],
    778					       split ? splits_out[i] : NULL,
    779					       split ? splits_out_nents[i] : 0,
    780					       info, gfp);
    781		if (IS_ERR(el)) {
    782			ret = PTR_ERR(el);
    783			goto err_free_elements;
    784		}
    785		el->req.cipher_iv_addr_lo = lower_32_bits(sec_req->dma_iv);
    786		el->req.cipher_iv_addr_hi = upper_32_bits(sec_req->dma_iv);
    787		el->sec_req = sec_req;
    788		list_add_tail(&el->head, &sec_req->elements);
    789	}
    790
    791	/*
    792	 * Only attempt to queue if the whole lot can fit in the queue -
    793	 * we can't successfully cleanup after a partial queing so this
    794	 * must succeed or fail atomically.
    795	 *
    796	 * Big hammer test of both software and hardware queues - could be
    797	 * more refined but this is unlikely to happen so no need.
    798	 */
    799
    800	/* Grab a big lock for a long time to avoid concurrency issues */
    801	mutex_lock(&queue->queuelock);
    802
    803	/*
    804	 * Can go on to queue if we have space in either:
    805	 * 1) The hardware queue and no software queue
    806	 * 2) The software queue
    807	 * AND there is nothing in the backlog.  If there is backlog we
    808	 * have to only queue to the backlog queue and return busy.
    809	 */
    810	if ((!sec_queue_can_enqueue(queue, steps) &&
    811	     (!queue->havesoftqueue ||
    812	      kfifo_avail(&queue->softqueue) > steps)) ||
    813	    !list_empty(&ctx->backlog)) {
    814		ret = -EBUSY;
    815		if ((skreq->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {
    816			list_add_tail(&sec_req->backlog_head, &ctx->backlog);
    817			mutex_unlock(&queue->queuelock);
    818			goto out;
    819		}
    820
    821		mutex_unlock(&queue->queuelock);
    822		goto err_free_elements;
    823	}
    824	ret = sec_send_request(sec_req, queue);
    825	mutex_unlock(&queue->queuelock);
    826	if (ret)
    827		goto err_free_elements;
    828
    829	ret = -EINPROGRESS;
    830out:
    831	/* Cleanup - all elements in pointer arrays have been copied */
    832	kfree(splits_in_nents);
    833	kfree(splits_in);
    834	kfree(splits_out_nents);
    835	kfree(splits_out);
    836	kfree(split_sizes);
    837	return ret;
    838
    839err_free_elements:
    840	list_for_each_entry_safe(el, temp, &sec_req->elements, head) {
    841		list_del(&el->head);
    842		sec_alg_free_el(el, info);
    843	}
    844	if (crypto_skcipher_ivsize(atfm))
    845		dma_unmap_single(info->dev, sec_req->dma_iv,
    846				 crypto_skcipher_ivsize(atfm),
    847				 DMA_BIDIRECTIONAL);
    848err_unmap_out_sg:
    849	if (split)
    850		sec_unmap_sg_on_err(skreq->dst, steps, splits_out,
    851				    splits_out_nents, sec_req->len_out,
    852				    info->dev);
    853err_unmap_in_sg:
    854	sec_unmap_sg_on_err(skreq->src, steps, splits_in, splits_in_nents,
    855			    sec_req->len_in, info->dev);
    856err_free_split_sizes:
    857	kfree(split_sizes);
    858
    859	return ret;
    860}
    861
    862static int sec_alg_skcipher_encrypt(struct skcipher_request *req)
    863{
    864	return sec_alg_skcipher_crypto(req, true);
    865}
    866
    867static int sec_alg_skcipher_decrypt(struct skcipher_request *req)
    868{
    869	return sec_alg_skcipher_crypto(req, false);
    870}
    871
    872static int sec_alg_skcipher_init(struct crypto_skcipher *tfm)
    873{
    874	struct sec_alg_tfm_ctx *ctx = crypto_skcipher_ctx(tfm);
    875
    876	mutex_init(&ctx->lock);
    877	INIT_LIST_HEAD(&ctx->backlog);
    878	crypto_skcipher_set_reqsize(tfm, sizeof(struct sec_request));
    879
    880	ctx->queue = sec_queue_alloc_start_safe();
    881	if (IS_ERR(ctx->queue))
    882		return PTR_ERR(ctx->queue);
    883
    884	mutex_init(&ctx->queue->queuelock);
    885	ctx->queue->havesoftqueue = false;
    886
    887	return 0;
    888}
    889
    890static void sec_alg_skcipher_exit(struct crypto_skcipher *tfm)
    891{
    892	struct sec_alg_tfm_ctx *ctx = crypto_skcipher_ctx(tfm);
    893	struct device *dev = ctx->queue->dev_info->dev;
    894
    895	if (ctx->key) {
    896		memzero_explicit(ctx->key, SEC_MAX_CIPHER_KEY);
    897		dma_free_coherent(dev, SEC_MAX_CIPHER_KEY, ctx->key,
    898				  ctx->pkey);
    899	}
    900	sec_queue_stop_release(ctx->queue);
    901}
    902
    903static int sec_alg_skcipher_init_with_queue(struct crypto_skcipher *tfm)
    904{
    905	struct sec_alg_tfm_ctx *ctx = crypto_skcipher_ctx(tfm);
    906	int ret;
    907
    908	ret = sec_alg_skcipher_init(tfm);
    909	if (ret)
    910		return ret;
    911
    912	INIT_KFIFO(ctx->queue->softqueue);
    913	ret = kfifo_alloc(&ctx->queue->softqueue, 512, GFP_KERNEL);
    914	if (ret) {
    915		sec_alg_skcipher_exit(tfm);
    916		return ret;
    917	}
    918	ctx->queue->havesoftqueue = true;
    919
    920	return 0;
    921}
    922
    923static void sec_alg_skcipher_exit_with_queue(struct crypto_skcipher *tfm)
    924{
    925	struct sec_alg_tfm_ctx *ctx = crypto_skcipher_ctx(tfm);
    926
    927	kfifo_free(&ctx->queue->softqueue);
    928	sec_alg_skcipher_exit(tfm);
    929}
    930
    931static struct skcipher_alg sec_algs[] = {
    932	{
    933		.base = {
    934			.cra_name = "ecb(aes)",
    935			.cra_driver_name = "hisi_sec_aes_ecb",
    936			.cra_priority = 4001,
    937			.cra_flags = CRYPTO_ALG_ASYNC |
    938				     CRYPTO_ALG_ALLOCATES_MEMORY,
    939			.cra_blocksize = AES_BLOCK_SIZE,
    940			.cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
    941			.cra_alignmask = 0,
    942			.cra_module = THIS_MODULE,
    943		},
    944		.init = sec_alg_skcipher_init,
    945		.exit = sec_alg_skcipher_exit,
    946		.setkey = sec_alg_skcipher_setkey_aes_ecb,
    947		.decrypt = sec_alg_skcipher_decrypt,
    948		.encrypt = sec_alg_skcipher_encrypt,
    949		.min_keysize = AES_MIN_KEY_SIZE,
    950		.max_keysize = AES_MAX_KEY_SIZE,
    951		.ivsize = 0,
    952	}, {
    953		.base = {
    954			.cra_name = "cbc(aes)",
    955			.cra_driver_name = "hisi_sec_aes_cbc",
    956			.cra_priority = 4001,
    957			.cra_flags = CRYPTO_ALG_ASYNC |
    958				     CRYPTO_ALG_ALLOCATES_MEMORY,
    959			.cra_blocksize = AES_BLOCK_SIZE,
    960			.cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
    961			.cra_alignmask = 0,
    962			.cra_module = THIS_MODULE,
    963		},
    964		.init = sec_alg_skcipher_init_with_queue,
    965		.exit = sec_alg_skcipher_exit_with_queue,
    966		.setkey = sec_alg_skcipher_setkey_aes_cbc,
    967		.decrypt = sec_alg_skcipher_decrypt,
    968		.encrypt = sec_alg_skcipher_encrypt,
    969		.min_keysize = AES_MIN_KEY_SIZE,
    970		.max_keysize = AES_MAX_KEY_SIZE,
    971		.ivsize = AES_BLOCK_SIZE,
    972	}, {
    973		.base = {
    974			.cra_name = "ctr(aes)",
    975			.cra_driver_name = "hisi_sec_aes_ctr",
    976			.cra_priority = 4001,
    977			.cra_flags = CRYPTO_ALG_ASYNC |
    978				     CRYPTO_ALG_ALLOCATES_MEMORY,
    979			.cra_blocksize = AES_BLOCK_SIZE,
    980			.cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
    981			.cra_alignmask = 0,
    982			.cra_module = THIS_MODULE,
    983		},
    984		.init = sec_alg_skcipher_init_with_queue,
    985		.exit = sec_alg_skcipher_exit_with_queue,
    986		.setkey = sec_alg_skcipher_setkey_aes_ctr,
    987		.decrypt = sec_alg_skcipher_decrypt,
    988		.encrypt = sec_alg_skcipher_encrypt,
    989		.min_keysize = AES_MIN_KEY_SIZE,
    990		.max_keysize = AES_MAX_KEY_SIZE,
    991		.ivsize = AES_BLOCK_SIZE,
    992	}, {
    993		.base = {
    994			.cra_name = "xts(aes)",
    995			.cra_driver_name = "hisi_sec_aes_xts",
    996			.cra_priority = 4001,
    997			.cra_flags = CRYPTO_ALG_ASYNC |
    998				     CRYPTO_ALG_ALLOCATES_MEMORY,
    999			.cra_blocksize = AES_BLOCK_SIZE,
   1000			.cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
   1001			.cra_alignmask = 0,
   1002			.cra_module = THIS_MODULE,
   1003		},
   1004		.init = sec_alg_skcipher_init,
   1005		.exit = sec_alg_skcipher_exit,
   1006		.setkey = sec_alg_skcipher_setkey_aes_xts,
   1007		.decrypt = sec_alg_skcipher_decrypt,
   1008		.encrypt = sec_alg_skcipher_encrypt,
   1009		.min_keysize = 2 * AES_MIN_KEY_SIZE,
   1010		.max_keysize = 2 * AES_MAX_KEY_SIZE,
   1011		.ivsize = AES_BLOCK_SIZE,
   1012	}, {
   1013	/* Unable to find any test vectors so untested */
   1014		.base = {
   1015			.cra_name = "ecb(des)",
   1016			.cra_driver_name = "hisi_sec_des_ecb",
   1017			.cra_priority = 4001,
   1018			.cra_flags = CRYPTO_ALG_ASYNC |
   1019				     CRYPTO_ALG_ALLOCATES_MEMORY,
   1020			.cra_blocksize = DES_BLOCK_SIZE,
   1021			.cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
   1022			.cra_alignmask = 0,
   1023			.cra_module = THIS_MODULE,
   1024		},
   1025		.init = sec_alg_skcipher_init,
   1026		.exit = sec_alg_skcipher_exit,
   1027		.setkey = sec_alg_skcipher_setkey_des_ecb,
   1028		.decrypt = sec_alg_skcipher_decrypt,
   1029		.encrypt = sec_alg_skcipher_encrypt,
   1030		.min_keysize = DES_KEY_SIZE,
   1031		.max_keysize = DES_KEY_SIZE,
   1032		.ivsize = 0,
   1033	}, {
   1034		.base = {
   1035			.cra_name = "cbc(des)",
   1036			.cra_driver_name = "hisi_sec_des_cbc",
   1037			.cra_priority = 4001,
   1038			.cra_flags = CRYPTO_ALG_ASYNC |
   1039				     CRYPTO_ALG_ALLOCATES_MEMORY,
   1040			.cra_blocksize = DES_BLOCK_SIZE,
   1041			.cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
   1042			.cra_alignmask = 0,
   1043			.cra_module = THIS_MODULE,
   1044		},
   1045		.init = sec_alg_skcipher_init_with_queue,
   1046		.exit = sec_alg_skcipher_exit_with_queue,
   1047		.setkey = sec_alg_skcipher_setkey_des_cbc,
   1048		.decrypt = sec_alg_skcipher_decrypt,
   1049		.encrypt = sec_alg_skcipher_encrypt,
   1050		.min_keysize = DES_KEY_SIZE,
   1051		.max_keysize = DES_KEY_SIZE,
   1052		.ivsize = DES_BLOCK_SIZE,
   1053	}, {
   1054		.base = {
   1055			.cra_name = "cbc(des3_ede)",
   1056			.cra_driver_name = "hisi_sec_3des_cbc",
   1057			.cra_priority = 4001,
   1058			.cra_flags = CRYPTO_ALG_ASYNC |
   1059				     CRYPTO_ALG_ALLOCATES_MEMORY,
   1060			.cra_blocksize = DES3_EDE_BLOCK_SIZE,
   1061			.cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
   1062			.cra_alignmask = 0,
   1063			.cra_module = THIS_MODULE,
   1064		},
   1065		.init = sec_alg_skcipher_init_with_queue,
   1066		.exit = sec_alg_skcipher_exit_with_queue,
   1067		.setkey = sec_alg_skcipher_setkey_3des_cbc,
   1068		.decrypt = sec_alg_skcipher_decrypt,
   1069		.encrypt = sec_alg_skcipher_encrypt,
   1070		.min_keysize = DES3_EDE_KEY_SIZE,
   1071		.max_keysize = DES3_EDE_KEY_SIZE,
   1072		.ivsize = DES3_EDE_BLOCK_SIZE,
   1073	}, {
   1074		.base = {
   1075			.cra_name = "ecb(des3_ede)",
   1076			.cra_driver_name = "hisi_sec_3des_ecb",
   1077			.cra_priority = 4001,
   1078			.cra_flags = CRYPTO_ALG_ASYNC |
   1079				     CRYPTO_ALG_ALLOCATES_MEMORY,
   1080			.cra_blocksize = DES3_EDE_BLOCK_SIZE,
   1081			.cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
   1082			.cra_alignmask = 0,
   1083			.cra_module = THIS_MODULE,
   1084		},
   1085		.init = sec_alg_skcipher_init,
   1086		.exit = sec_alg_skcipher_exit,
   1087		.setkey = sec_alg_skcipher_setkey_3des_ecb,
   1088		.decrypt = sec_alg_skcipher_decrypt,
   1089		.encrypt = sec_alg_skcipher_encrypt,
   1090		.min_keysize = DES3_EDE_KEY_SIZE,
   1091		.max_keysize = DES3_EDE_KEY_SIZE,
   1092		.ivsize = 0,
   1093	}
   1094};
   1095
   1096int sec_algs_register(void)
   1097{
   1098	int ret = 0;
   1099
   1100	mutex_lock(&algs_lock);
   1101	if (++active_devs != 1)
   1102		goto unlock;
   1103
   1104	ret = crypto_register_skciphers(sec_algs, ARRAY_SIZE(sec_algs));
   1105	if (ret)
   1106		--active_devs;
   1107unlock:
   1108	mutex_unlock(&algs_lock);
   1109
   1110	return ret;
   1111}
   1112
   1113void sec_algs_unregister(void)
   1114{
   1115	mutex_lock(&algs_lock);
   1116	if (--active_devs != 0)
   1117		goto unlock;
   1118	crypto_unregister_skciphers(sec_algs, ARRAY_SIZE(sec_algs));
   1119
   1120unlock:
   1121	mutex_unlock(&algs_lock);
   1122}