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

cc_hash.c (68065B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright (C) 2012-2019 ARM Limited (or its affiliates). */
      3
      4#include <linux/kernel.h>
      5#include <linux/module.h>
      6#include <crypto/algapi.h>
      7#include <crypto/hash.h>
      8#include <crypto/md5.h>
      9#include <crypto/sm3.h>
     10#include <crypto/internal/hash.h>
     11
     12#include "cc_driver.h"
     13#include "cc_request_mgr.h"
     14#include "cc_buffer_mgr.h"
     15#include "cc_hash.h"
     16#include "cc_sram_mgr.h"
     17
     18#define CC_MAX_HASH_SEQ_LEN 12
     19#define CC_MAX_OPAD_KEYS_SIZE CC_MAX_HASH_BLCK_SIZE
     20#define CC_SM3_HASH_LEN_SIZE 8
     21
     22struct cc_hash_handle {
     23	u32 digest_len_sram_addr;	/* const value in SRAM*/
     24	u32 larval_digest_sram_addr;   /* const value in SRAM */
     25	struct list_head hash_list;
     26};
     27
     28static const u32 cc_digest_len_init[] = {
     29	0x00000040, 0x00000000, 0x00000000, 0x00000000 };
     30static const u32 cc_md5_init[] = {
     31	SHA1_H3, SHA1_H2, SHA1_H1, SHA1_H0 };
     32static const u32 cc_sha1_init[] = {
     33	SHA1_H4, SHA1_H3, SHA1_H2, SHA1_H1, SHA1_H0 };
     34static const u32 cc_sha224_init[] = {
     35	SHA224_H7, SHA224_H6, SHA224_H5, SHA224_H4,
     36	SHA224_H3, SHA224_H2, SHA224_H1, SHA224_H0 };
     37static const u32 cc_sha256_init[] = {
     38	SHA256_H7, SHA256_H6, SHA256_H5, SHA256_H4,
     39	SHA256_H3, SHA256_H2, SHA256_H1, SHA256_H0 };
     40static const u32 cc_digest_len_sha512_init[] = {
     41	0x00000080, 0x00000000, 0x00000000, 0x00000000 };
     42
     43/*
     44 * Due to the way the HW works, every double word in the SHA384 and SHA512
     45 * larval hashes must be stored in hi/lo order
     46 */
     47#define hilo(x)	upper_32_bits(x), lower_32_bits(x)
     48static const u32 cc_sha384_init[] = {
     49	hilo(SHA384_H7), hilo(SHA384_H6), hilo(SHA384_H5), hilo(SHA384_H4),
     50	hilo(SHA384_H3), hilo(SHA384_H2), hilo(SHA384_H1), hilo(SHA384_H0) };
     51static const u32 cc_sha512_init[] = {
     52	hilo(SHA512_H7), hilo(SHA512_H6), hilo(SHA512_H5), hilo(SHA512_H4),
     53	hilo(SHA512_H3), hilo(SHA512_H2), hilo(SHA512_H1), hilo(SHA512_H0) };
     54
     55static const u32 cc_sm3_init[] = {
     56	SM3_IVH, SM3_IVG, SM3_IVF, SM3_IVE,
     57	SM3_IVD, SM3_IVC, SM3_IVB, SM3_IVA };
     58
     59static void cc_setup_xcbc(struct ahash_request *areq, struct cc_hw_desc desc[],
     60			  unsigned int *seq_size);
     61
     62static void cc_setup_cmac(struct ahash_request *areq, struct cc_hw_desc desc[],
     63			  unsigned int *seq_size);
     64
     65static const void *cc_larval_digest(struct device *dev, u32 mode);
     66
     67struct cc_hash_alg {
     68	struct list_head entry;
     69	int hash_mode;
     70	int hw_mode;
     71	int inter_digestsize;
     72	struct cc_drvdata *drvdata;
     73	struct ahash_alg ahash_alg;
     74};
     75
     76struct hash_key_req_ctx {
     77	u32 keylen;
     78	dma_addr_t key_dma_addr;
     79	u8 *key;
     80};
     81
     82/* hash per-session context */
     83struct cc_hash_ctx {
     84	struct cc_drvdata *drvdata;
     85	/* holds the origin digest; the digest after "setkey" if HMAC,*
     86	 * the initial digest if HASH.
     87	 */
     88	u8 digest_buff[CC_MAX_HASH_DIGEST_SIZE]  ____cacheline_aligned;
     89	u8 opad_tmp_keys_buff[CC_MAX_OPAD_KEYS_SIZE]  ____cacheline_aligned;
     90
     91	dma_addr_t opad_tmp_keys_dma_addr  ____cacheline_aligned;
     92	dma_addr_t digest_buff_dma_addr;
     93	/* use for hmac with key large then mode block size */
     94	struct hash_key_req_ctx key_params;
     95	int hash_mode;
     96	int hw_mode;
     97	int inter_digestsize;
     98	unsigned int hash_len;
     99	struct completion setkey_comp;
    100	bool is_hmac;
    101};
    102
    103static void cc_set_desc(struct ahash_req_ctx *areq_ctx, struct cc_hash_ctx *ctx,
    104			unsigned int flow_mode, struct cc_hw_desc desc[],
    105			bool is_not_last_data, unsigned int *seq_size);
    106
    107static void cc_set_endianity(u32 mode, struct cc_hw_desc *desc)
    108{
    109	if (mode == DRV_HASH_MD5 || mode == DRV_HASH_SHA384 ||
    110	    mode == DRV_HASH_SHA512) {
    111		set_bytes_swap(desc, 1);
    112	} else {
    113		set_cipher_config0(desc, HASH_DIGEST_RESULT_LITTLE_ENDIAN);
    114	}
    115}
    116
    117static int cc_map_result(struct device *dev, struct ahash_req_ctx *state,
    118			 unsigned int digestsize)
    119{
    120	state->digest_result_dma_addr =
    121		dma_map_single(dev, state->digest_result_buff,
    122			       digestsize, DMA_BIDIRECTIONAL);
    123	if (dma_mapping_error(dev, state->digest_result_dma_addr)) {
    124		dev_err(dev, "Mapping digest result buffer %u B for DMA failed\n",
    125			digestsize);
    126		return -ENOMEM;
    127	}
    128	dev_dbg(dev, "Mapped digest result buffer %u B at va=%pK to dma=%pad\n",
    129		digestsize, state->digest_result_buff,
    130		&state->digest_result_dma_addr);
    131
    132	return 0;
    133}
    134
    135static void cc_init_req(struct device *dev, struct ahash_req_ctx *state,
    136			struct cc_hash_ctx *ctx)
    137{
    138	bool is_hmac = ctx->is_hmac;
    139
    140	memset(state, 0, sizeof(*state));
    141
    142	if (is_hmac) {
    143		if (ctx->hw_mode != DRV_CIPHER_XCBC_MAC &&
    144		    ctx->hw_mode != DRV_CIPHER_CMAC) {
    145			dma_sync_single_for_cpu(dev, ctx->digest_buff_dma_addr,
    146						ctx->inter_digestsize,
    147						DMA_BIDIRECTIONAL);
    148
    149			memcpy(state->digest_buff, ctx->digest_buff,
    150			       ctx->inter_digestsize);
    151			if (ctx->hash_mode == DRV_HASH_SHA512 ||
    152			    ctx->hash_mode == DRV_HASH_SHA384)
    153				memcpy(state->digest_bytes_len,
    154				       cc_digest_len_sha512_init,
    155				       ctx->hash_len);
    156			else
    157				memcpy(state->digest_bytes_len,
    158				       cc_digest_len_init,
    159				       ctx->hash_len);
    160		}
    161
    162		if (ctx->hash_mode != DRV_HASH_NULL) {
    163			dma_sync_single_for_cpu(dev,
    164						ctx->opad_tmp_keys_dma_addr,
    165						ctx->inter_digestsize,
    166						DMA_BIDIRECTIONAL);
    167			memcpy(state->opad_digest_buff,
    168			       ctx->opad_tmp_keys_buff, ctx->inter_digestsize);
    169		}
    170	} else { /*hash*/
    171		/* Copy the initial digests if hash flow. */
    172		const void *larval = cc_larval_digest(dev, ctx->hash_mode);
    173
    174		memcpy(state->digest_buff, larval, ctx->inter_digestsize);
    175	}
    176}
    177
    178static int cc_map_req(struct device *dev, struct ahash_req_ctx *state,
    179		      struct cc_hash_ctx *ctx)
    180{
    181	bool is_hmac = ctx->is_hmac;
    182
    183	state->digest_buff_dma_addr =
    184		dma_map_single(dev, state->digest_buff,
    185			       ctx->inter_digestsize, DMA_BIDIRECTIONAL);
    186	if (dma_mapping_error(dev, state->digest_buff_dma_addr)) {
    187		dev_err(dev, "Mapping digest len %d B at va=%pK for DMA failed\n",
    188			ctx->inter_digestsize, state->digest_buff);
    189		return -EINVAL;
    190	}
    191	dev_dbg(dev, "Mapped digest %d B at va=%pK to dma=%pad\n",
    192		ctx->inter_digestsize, state->digest_buff,
    193		&state->digest_buff_dma_addr);
    194
    195	if (ctx->hw_mode != DRV_CIPHER_XCBC_MAC) {
    196		state->digest_bytes_len_dma_addr =
    197			dma_map_single(dev, state->digest_bytes_len,
    198				       HASH_MAX_LEN_SIZE, DMA_BIDIRECTIONAL);
    199		if (dma_mapping_error(dev, state->digest_bytes_len_dma_addr)) {
    200			dev_err(dev, "Mapping digest len %u B at va=%pK for DMA failed\n",
    201				HASH_MAX_LEN_SIZE, state->digest_bytes_len);
    202			goto unmap_digest_buf;
    203		}
    204		dev_dbg(dev, "Mapped digest len %u B at va=%pK to dma=%pad\n",
    205			HASH_MAX_LEN_SIZE, state->digest_bytes_len,
    206			&state->digest_bytes_len_dma_addr);
    207	}
    208
    209	if (is_hmac && ctx->hash_mode != DRV_HASH_NULL) {
    210		state->opad_digest_dma_addr =
    211			dma_map_single(dev, state->opad_digest_buff,
    212				       ctx->inter_digestsize,
    213				       DMA_BIDIRECTIONAL);
    214		if (dma_mapping_error(dev, state->opad_digest_dma_addr)) {
    215			dev_err(dev, "Mapping opad digest %d B at va=%pK for DMA failed\n",
    216				ctx->inter_digestsize,
    217				state->opad_digest_buff);
    218			goto unmap_digest_len;
    219		}
    220		dev_dbg(dev, "Mapped opad digest %d B at va=%pK to dma=%pad\n",
    221			ctx->inter_digestsize, state->opad_digest_buff,
    222			&state->opad_digest_dma_addr);
    223	}
    224
    225	return 0;
    226
    227unmap_digest_len:
    228	if (state->digest_bytes_len_dma_addr) {
    229		dma_unmap_single(dev, state->digest_bytes_len_dma_addr,
    230				 HASH_MAX_LEN_SIZE, DMA_BIDIRECTIONAL);
    231		state->digest_bytes_len_dma_addr = 0;
    232	}
    233unmap_digest_buf:
    234	if (state->digest_buff_dma_addr) {
    235		dma_unmap_single(dev, state->digest_buff_dma_addr,
    236				 ctx->inter_digestsize, DMA_BIDIRECTIONAL);
    237		state->digest_buff_dma_addr = 0;
    238	}
    239
    240	return -EINVAL;
    241}
    242
    243static void cc_unmap_req(struct device *dev, struct ahash_req_ctx *state,
    244			 struct cc_hash_ctx *ctx)
    245{
    246	if (state->digest_buff_dma_addr) {
    247		dma_unmap_single(dev, state->digest_buff_dma_addr,
    248				 ctx->inter_digestsize, DMA_BIDIRECTIONAL);
    249		dev_dbg(dev, "Unmapped digest-buffer: digest_buff_dma_addr=%pad\n",
    250			&state->digest_buff_dma_addr);
    251		state->digest_buff_dma_addr = 0;
    252	}
    253	if (state->digest_bytes_len_dma_addr) {
    254		dma_unmap_single(dev, state->digest_bytes_len_dma_addr,
    255				 HASH_MAX_LEN_SIZE, DMA_BIDIRECTIONAL);
    256		dev_dbg(dev, "Unmapped digest-bytes-len buffer: digest_bytes_len_dma_addr=%pad\n",
    257			&state->digest_bytes_len_dma_addr);
    258		state->digest_bytes_len_dma_addr = 0;
    259	}
    260	if (state->opad_digest_dma_addr) {
    261		dma_unmap_single(dev, state->opad_digest_dma_addr,
    262				 ctx->inter_digestsize, DMA_BIDIRECTIONAL);
    263		dev_dbg(dev, "Unmapped opad-digest: opad_digest_dma_addr=%pad\n",
    264			&state->opad_digest_dma_addr);
    265		state->opad_digest_dma_addr = 0;
    266	}
    267}
    268
    269static void cc_unmap_result(struct device *dev, struct ahash_req_ctx *state,
    270			    unsigned int digestsize, u8 *result)
    271{
    272	if (state->digest_result_dma_addr) {
    273		dma_unmap_single(dev, state->digest_result_dma_addr, digestsize,
    274				 DMA_BIDIRECTIONAL);
    275		dev_dbg(dev, "unmpa digest result buffer va (%pK) pa (%pad) len %u\n",
    276			state->digest_result_buff,
    277			&state->digest_result_dma_addr, digestsize);
    278		memcpy(result, state->digest_result_buff, digestsize);
    279	}
    280	state->digest_result_dma_addr = 0;
    281}
    282
    283static void cc_update_complete(struct device *dev, void *cc_req, int err)
    284{
    285	struct ahash_request *req = (struct ahash_request *)cc_req;
    286	struct ahash_req_ctx *state = ahash_request_ctx(req);
    287	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
    288	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
    289
    290	dev_dbg(dev, "req=%pK\n", req);
    291
    292	if (err != -EINPROGRESS) {
    293		/* Not a BACKLOG notification */
    294		cc_unmap_hash_request(dev, state, req->src, false);
    295		cc_unmap_req(dev, state, ctx);
    296	}
    297
    298	ahash_request_complete(req, err);
    299}
    300
    301static void cc_digest_complete(struct device *dev, void *cc_req, int err)
    302{
    303	struct ahash_request *req = (struct ahash_request *)cc_req;
    304	struct ahash_req_ctx *state = ahash_request_ctx(req);
    305	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
    306	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
    307	u32 digestsize = crypto_ahash_digestsize(tfm);
    308
    309	dev_dbg(dev, "req=%pK\n", req);
    310
    311	if (err != -EINPROGRESS) {
    312		/* Not a BACKLOG notification */
    313		cc_unmap_hash_request(dev, state, req->src, false);
    314		cc_unmap_result(dev, state, digestsize, req->result);
    315		cc_unmap_req(dev, state, ctx);
    316	}
    317
    318	ahash_request_complete(req, err);
    319}
    320
    321static void cc_hash_complete(struct device *dev, void *cc_req, int err)
    322{
    323	struct ahash_request *req = (struct ahash_request *)cc_req;
    324	struct ahash_req_ctx *state = ahash_request_ctx(req);
    325	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
    326	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
    327	u32 digestsize = crypto_ahash_digestsize(tfm);
    328
    329	dev_dbg(dev, "req=%pK\n", req);
    330
    331	if (err != -EINPROGRESS) {
    332		/* Not a BACKLOG notification */
    333		cc_unmap_hash_request(dev, state, req->src, false);
    334		cc_unmap_result(dev, state, digestsize, req->result);
    335		cc_unmap_req(dev, state, ctx);
    336	}
    337
    338	ahash_request_complete(req, err);
    339}
    340
    341static int cc_fin_result(struct cc_hw_desc *desc, struct ahash_request *req,
    342			 int idx)
    343{
    344	struct ahash_req_ctx *state = ahash_request_ctx(req);
    345	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
    346	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
    347	u32 digestsize = crypto_ahash_digestsize(tfm);
    348
    349	/* Get final MAC result */
    350	hw_desc_init(&desc[idx]);
    351	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
    352	set_dout_dlli(&desc[idx], state->digest_result_dma_addr, digestsize,
    353		      NS_BIT, 1);
    354	set_queue_last_ind(ctx->drvdata, &desc[idx]);
    355	set_flow_mode(&desc[idx], S_HASH_to_DOUT);
    356	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
    357	set_cipher_config1(&desc[idx], HASH_PADDING_DISABLED);
    358	cc_set_endianity(ctx->hash_mode, &desc[idx]);
    359	idx++;
    360
    361	return idx;
    362}
    363
    364static int cc_fin_hmac(struct cc_hw_desc *desc, struct ahash_request *req,
    365		       int idx)
    366{
    367	struct ahash_req_ctx *state = ahash_request_ctx(req);
    368	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
    369	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
    370	u32 digestsize = crypto_ahash_digestsize(tfm);
    371
    372	/* store the hash digest result in the context */
    373	hw_desc_init(&desc[idx]);
    374	set_cipher_mode(&desc[idx], ctx->hw_mode);
    375	set_dout_dlli(&desc[idx], state->digest_buff_dma_addr, digestsize,
    376		      NS_BIT, 0);
    377	set_flow_mode(&desc[idx], S_HASH_to_DOUT);
    378	cc_set_endianity(ctx->hash_mode, &desc[idx]);
    379	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
    380	idx++;
    381
    382	/* Loading hash opad xor key state */
    383	hw_desc_init(&desc[idx]);
    384	set_cipher_mode(&desc[idx], ctx->hw_mode);
    385	set_din_type(&desc[idx], DMA_DLLI, state->opad_digest_dma_addr,
    386		     ctx->inter_digestsize, NS_BIT);
    387	set_flow_mode(&desc[idx], S_DIN_to_HASH);
    388	set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
    389	idx++;
    390
    391	/* Load the hash current length */
    392	hw_desc_init(&desc[idx]);
    393	set_cipher_mode(&desc[idx], ctx->hw_mode);
    394	set_din_sram(&desc[idx],
    395		     cc_digest_len_addr(ctx->drvdata, ctx->hash_mode),
    396		     ctx->hash_len);
    397	set_cipher_config1(&desc[idx], HASH_PADDING_ENABLED);
    398	set_flow_mode(&desc[idx], S_DIN_to_HASH);
    399	set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
    400	idx++;
    401
    402	/* Memory Barrier: wait for IPAD/OPAD axi write to complete */
    403	hw_desc_init(&desc[idx]);
    404	set_din_no_dma(&desc[idx], 0, 0xfffff0);
    405	set_dout_no_dma(&desc[idx], 0, 0, 1);
    406	idx++;
    407
    408	/* Perform HASH update */
    409	hw_desc_init(&desc[idx]);
    410	set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
    411		     digestsize, NS_BIT);
    412	set_flow_mode(&desc[idx], DIN_HASH);
    413	idx++;
    414
    415	return idx;
    416}
    417
    418static int cc_hash_digest(struct ahash_request *req)
    419{
    420	struct ahash_req_ctx *state = ahash_request_ctx(req);
    421	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
    422	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
    423	u32 digestsize = crypto_ahash_digestsize(tfm);
    424	struct scatterlist *src = req->src;
    425	unsigned int nbytes = req->nbytes;
    426	u8 *result = req->result;
    427	struct device *dev = drvdata_to_dev(ctx->drvdata);
    428	bool is_hmac = ctx->is_hmac;
    429	struct cc_crypto_req cc_req = {};
    430	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
    431	u32 larval_digest_addr;
    432	int idx = 0;
    433	int rc = 0;
    434	gfp_t flags = cc_gfp_flags(&req->base);
    435
    436	dev_dbg(dev, "===== %s-digest (%d) ====\n", is_hmac ? "hmac" : "hash",
    437		nbytes);
    438
    439	cc_init_req(dev, state, ctx);
    440
    441	if (cc_map_req(dev, state, ctx)) {
    442		dev_err(dev, "map_ahash_source() failed\n");
    443		return -ENOMEM;
    444	}
    445
    446	if (cc_map_result(dev, state, digestsize)) {
    447		dev_err(dev, "map_ahash_digest() failed\n");
    448		cc_unmap_req(dev, state, ctx);
    449		return -ENOMEM;
    450	}
    451
    452	if (cc_map_hash_request_final(ctx->drvdata, state, src, nbytes, 1,
    453				      flags)) {
    454		dev_err(dev, "map_ahash_request_final() failed\n");
    455		cc_unmap_result(dev, state, digestsize, result);
    456		cc_unmap_req(dev, state, ctx);
    457		return -ENOMEM;
    458	}
    459
    460	/* Setup request structure */
    461	cc_req.user_cb = cc_digest_complete;
    462	cc_req.user_arg = req;
    463
    464	/* If HMAC then load hash IPAD xor key, if HASH then load initial
    465	 * digest
    466	 */
    467	hw_desc_init(&desc[idx]);
    468	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
    469	if (is_hmac) {
    470		set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
    471			     ctx->inter_digestsize, NS_BIT);
    472	} else {
    473		larval_digest_addr = cc_larval_digest_addr(ctx->drvdata,
    474							   ctx->hash_mode);
    475		set_din_sram(&desc[idx], larval_digest_addr,
    476			     ctx->inter_digestsize);
    477	}
    478	set_flow_mode(&desc[idx], S_DIN_to_HASH);
    479	set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
    480	idx++;
    481
    482	/* Load the hash current length */
    483	hw_desc_init(&desc[idx]);
    484	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
    485
    486	if (is_hmac) {
    487		set_din_type(&desc[idx], DMA_DLLI,
    488			     state->digest_bytes_len_dma_addr,
    489			     ctx->hash_len, NS_BIT);
    490	} else {
    491		set_din_const(&desc[idx], 0, ctx->hash_len);
    492		if (nbytes)
    493			set_cipher_config1(&desc[idx], HASH_PADDING_ENABLED);
    494		else
    495			set_cipher_do(&desc[idx], DO_PAD);
    496	}
    497	set_flow_mode(&desc[idx], S_DIN_to_HASH);
    498	set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
    499	idx++;
    500
    501	cc_set_desc(state, ctx, DIN_HASH, desc, false, &idx);
    502
    503	if (is_hmac) {
    504		/* HW last hash block padding (aka. "DO_PAD") */
    505		hw_desc_init(&desc[idx]);
    506		set_cipher_mode(&desc[idx], ctx->hw_mode);
    507		set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
    508			      ctx->hash_len, NS_BIT, 0);
    509		set_flow_mode(&desc[idx], S_HASH_to_DOUT);
    510		set_setup_mode(&desc[idx], SETUP_WRITE_STATE1);
    511		set_cipher_do(&desc[idx], DO_PAD);
    512		idx++;
    513
    514		idx = cc_fin_hmac(desc, req, idx);
    515	}
    516
    517	idx = cc_fin_result(desc, req, idx);
    518
    519	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
    520	if (rc != -EINPROGRESS && rc != -EBUSY) {
    521		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
    522		cc_unmap_hash_request(dev, state, src, true);
    523		cc_unmap_result(dev, state, digestsize, result);
    524		cc_unmap_req(dev, state, ctx);
    525	}
    526	return rc;
    527}
    528
    529static int cc_restore_hash(struct cc_hw_desc *desc, struct cc_hash_ctx *ctx,
    530			   struct ahash_req_ctx *state, unsigned int idx)
    531{
    532	/* Restore hash digest */
    533	hw_desc_init(&desc[idx]);
    534	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
    535	set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
    536		     ctx->inter_digestsize, NS_BIT);
    537	set_flow_mode(&desc[idx], S_DIN_to_HASH);
    538	set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
    539	idx++;
    540
    541	/* Restore hash current length */
    542	hw_desc_init(&desc[idx]);
    543	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
    544	set_cipher_config1(&desc[idx], HASH_PADDING_DISABLED);
    545	set_din_type(&desc[idx], DMA_DLLI, state->digest_bytes_len_dma_addr,
    546		     ctx->hash_len, NS_BIT);
    547	set_flow_mode(&desc[idx], S_DIN_to_HASH);
    548	set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
    549	idx++;
    550
    551	cc_set_desc(state, ctx, DIN_HASH, desc, false, &idx);
    552
    553	return idx;
    554}
    555
    556static int cc_hash_update(struct ahash_request *req)
    557{
    558	struct ahash_req_ctx *state = ahash_request_ctx(req);
    559	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
    560	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
    561	unsigned int block_size = crypto_tfm_alg_blocksize(&tfm->base);
    562	struct scatterlist *src = req->src;
    563	unsigned int nbytes = req->nbytes;
    564	struct device *dev = drvdata_to_dev(ctx->drvdata);
    565	struct cc_crypto_req cc_req = {};
    566	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
    567	u32 idx = 0;
    568	int rc;
    569	gfp_t flags = cc_gfp_flags(&req->base);
    570
    571	dev_dbg(dev, "===== %s-update (%d) ====\n", ctx->is_hmac ?
    572		"hmac" : "hash", nbytes);
    573
    574	if (nbytes == 0) {
    575		/* no real updates required */
    576		return 0;
    577	}
    578
    579	rc = cc_map_hash_request_update(ctx->drvdata, state, src, nbytes,
    580					block_size, flags);
    581	if (rc) {
    582		if (rc == 1) {
    583			dev_dbg(dev, " data size not require HW update %x\n",
    584				nbytes);
    585			/* No hardware updates are required */
    586			return 0;
    587		}
    588		dev_err(dev, "map_ahash_request_update() failed\n");
    589		return -ENOMEM;
    590	}
    591
    592	if (cc_map_req(dev, state, ctx)) {
    593		dev_err(dev, "map_ahash_source() failed\n");
    594		cc_unmap_hash_request(dev, state, src, true);
    595		return -EINVAL;
    596	}
    597
    598	/* Setup request structure */
    599	cc_req.user_cb = cc_update_complete;
    600	cc_req.user_arg = req;
    601
    602	idx = cc_restore_hash(desc, ctx, state, idx);
    603
    604	/* store the hash digest result in context */
    605	hw_desc_init(&desc[idx]);
    606	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
    607	set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
    608		      ctx->inter_digestsize, NS_BIT, 0);
    609	set_flow_mode(&desc[idx], S_HASH_to_DOUT);
    610	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
    611	idx++;
    612
    613	/* store current hash length in context */
    614	hw_desc_init(&desc[idx]);
    615	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
    616	set_dout_dlli(&desc[idx], state->digest_bytes_len_dma_addr,
    617		      ctx->hash_len, NS_BIT, 1);
    618	set_queue_last_ind(ctx->drvdata, &desc[idx]);
    619	set_flow_mode(&desc[idx], S_HASH_to_DOUT);
    620	set_setup_mode(&desc[idx], SETUP_WRITE_STATE1);
    621	idx++;
    622
    623	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
    624	if (rc != -EINPROGRESS && rc != -EBUSY) {
    625		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
    626		cc_unmap_hash_request(dev, state, src, true);
    627		cc_unmap_req(dev, state, ctx);
    628	}
    629	return rc;
    630}
    631
    632static int cc_do_finup(struct ahash_request *req, bool update)
    633{
    634	struct ahash_req_ctx *state = ahash_request_ctx(req);
    635	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
    636	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
    637	u32 digestsize = crypto_ahash_digestsize(tfm);
    638	struct scatterlist *src = req->src;
    639	unsigned int nbytes = req->nbytes;
    640	u8 *result = req->result;
    641	struct device *dev = drvdata_to_dev(ctx->drvdata);
    642	bool is_hmac = ctx->is_hmac;
    643	struct cc_crypto_req cc_req = {};
    644	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
    645	unsigned int idx = 0;
    646	int rc;
    647	gfp_t flags = cc_gfp_flags(&req->base);
    648
    649	dev_dbg(dev, "===== %s-%s (%d) ====\n", is_hmac ? "hmac" : "hash",
    650		update ? "finup" : "final", nbytes);
    651
    652	if (cc_map_req(dev, state, ctx)) {
    653		dev_err(dev, "map_ahash_source() failed\n");
    654		return -EINVAL;
    655	}
    656
    657	if (cc_map_hash_request_final(ctx->drvdata, state, src, nbytes, update,
    658				      flags)) {
    659		dev_err(dev, "map_ahash_request_final() failed\n");
    660		cc_unmap_req(dev, state, ctx);
    661		return -ENOMEM;
    662	}
    663	if (cc_map_result(dev, state, digestsize)) {
    664		dev_err(dev, "map_ahash_digest() failed\n");
    665		cc_unmap_hash_request(dev, state, src, true);
    666		cc_unmap_req(dev, state, ctx);
    667		return -ENOMEM;
    668	}
    669
    670	/* Setup request structure */
    671	cc_req.user_cb = cc_hash_complete;
    672	cc_req.user_arg = req;
    673
    674	idx = cc_restore_hash(desc, ctx, state, idx);
    675
    676	/* Pad the hash */
    677	hw_desc_init(&desc[idx]);
    678	set_cipher_do(&desc[idx], DO_PAD);
    679	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
    680	set_dout_dlli(&desc[idx], state->digest_bytes_len_dma_addr,
    681		      ctx->hash_len, NS_BIT, 0);
    682	set_setup_mode(&desc[idx], SETUP_WRITE_STATE1);
    683	set_flow_mode(&desc[idx], S_HASH_to_DOUT);
    684	idx++;
    685
    686	if (is_hmac)
    687		idx = cc_fin_hmac(desc, req, idx);
    688
    689	idx = cc_fin_result(desc, req, idx);
    690
    691	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
    692	if (rc != -EINPROGRESS && rc != -EBUSY) {
    693		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
    694		cc_unmap_hash_request(dev, state, src, true);
    695		cc_unmap_result(dev, state, digestsize, result);
    696		cc_unmap_req(dev, state, ctx);
    697	}
    698	return rc;
    699}
    700
    701static int cc_hash_finup(struct ahash_request *req)
    702{
    703	return cc_do_finup(req, true);
    704}
    705
    706
    707static int cc_hash_final(struct ahash_request *req)
    708{
    709	return cc_do_finup(req, false);
    710}
    711
    712static int cc_hash_init(struct ahash_request *req)
    713{
    714	struct ahash_req_ctx *state = ahash_request_ctx(req);
    715	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
    716	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
    717	struct device *dev = drvdata_to_dev(ctx->drvdata);
    718
    719	dev_dbg(dev, "===== init (%d) ====\n", req->nbytes);
    720
    721	cc_init_req(dev, state, ctx);
    722
    723	return 0;
    724}
    725
    726static int cc_hash_setkey(struct crypto_ahash *ahash, const u8 *key,
    727			  unsigned int keylen)
    728{
    729	unsigned int hmac_pad_const[2] = { HMAC_IPAD_CONST, HMAC_OPAD_CONST };
    730	struct cc_crypto_req cc_req = {};
    731	struct cc_hash_ctx *ctx = NULL;
    732	int blocksize = 0;
    733	int digestsize = 0;
    734	int i, idx = 0, rc = 0;
    735	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
    736	u32 larval_addr;
    737	struct device *dev;
    738
    739	ctx = crypto_ahash_ctx(ahash);
    740	dev = drvdata_to_dev(ctx->drvdata);
    741	dev_dbg(dev, "start keylen: %d", keylen);
    742
    743	blocksize = crypto_tfm_alg_blocksize(&ahash->base);
    744	digestsize = crypto_ahash_digestsize(ahash);
    745
    746	larval_addr = cc_larval_digest_addr(ctx->drvdata, ctx->hash_mode);
    747
    748	/* The keylen value distinguishes HASH in case keylen is ZERO bytes,
    749	 * any NON-ZERO value utilizes HMAC flow
    750	 */
    751	ctx->key_params.keylen = keylen;
    752	ctx->key_params.key_dma_addr = 0;
    753	ctx->is_hmac = true;
    754	ctx->key_params.key = NULL;
    755
    756	if (keylen) {
    757		ctx->key_params.key = kmemdup(key, keylen, GFP_KERNEL);
    758		if (!ctx->key_params.key)
    759			return -ENOMEM;
    760
    761		ctx->key_params.key_dma_addr =
    762			dma_map_single(dev, ctx->key_params.key, keylen,
    763				       DMA_TO_DEVICE);
    764		if (dma_mapping_error(dev, ctx->key_params.key_dma_addr)) {
    765			dev_err(dev, "Mapping key va=0x%p len=%u for DMA failed\n",
    766				ctx->key_params.key, keylen);
    767			kfree_sensitive(ctx->key_params.key);
    768			return -ENOMEM;
    769		}
    770		dev_dbg(dev, "mapping key-buffer: key_dma_addr=%pad keylen=%u\n",
    771			&ctx->key_params.key_dma_addr, ctx->key_params.keylen);
    772
    773		if (keylen > blocksize) {
    774			/* Load hash initial state */
    775			hw_desc_init(&desc[idx]);
    776			set_cipher_mode(&desc[idx], ctx->hw_mode);
    777			set_din_sram(&desc[idx], larval_addr,
    778				     ctx->inter_digestsize);
    779			set_flow_mode(&desc[idx], S_DIN_to_HASH);
    780			set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
    781			idx++;
    782
    783			/* Load the hash current length*/
    784			hw_desc_init(&desc[idx]);
    785			set_cipher_mode(&desc[idx], ctx->hw_mode);
    786			set_din_const(&desc[idx], 0, ctx->hash_len);
    787			set_cipher_config1(&desc[idx], HASH_PADDING_ENABLED);
    788			set_flow_mode(&desc[idx], S_DIN_to_HASH);
    789			set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
    790			idx++;
    791
    792			hw_desc_init(&desc[idx]);
    793			set_din_type(&desc[idx], DMA_DLLI,
    794				     ctx->key_params.key_dma_addr, keylen,
    795				     NS_BIT);
    796			set_flow_mode(&desc[idx], DIN_HASH);
    797			idx++;
    798
    799			/* Get hashed key */
    800			hw_desc_init(&desc[idx]);
    801			set_cipher_mode(&desc[idx], ctx->hw_mode);
    802			set_dout_dlli(&desc[idx], ctx->opad_tmp_keys_dma_addr,
    803				      digestsize, NS_BIT, 0);
    804			set_flow_mode(&desc[idx], S_HASH_to_DOUT);
    805			set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
    806			set_cipher_config1(&desc[idx], HASH_PADDING_DISABLED);
    807			cc_set_endianity(ctx->hash_mode, &desc[idx]);
    808			idx++;
    809
    810			hw_desc_init(&desc[idx]);
    811			set_din_const(&desc[idx], 0, (blocksize - digestsize));
    812			set_flow_mode(&desc[idx], BYPASS);
    813			set_dout_dlli(&desc[idx],
    814				      (ctx->opad_tmp_keys_dma_addr +
    815				       digestsize),
    816				      (blocksize - digestsize), NS_BIT, 0);
    817			idx++;
    818		} else {
    819			hw_desc_init(&desc[idx]);
    820			set_din_type(&desc[idx], DMA_DLLI,
    821				     ctx->key_params.key_dma_addr, keylen,
    822				     NS_BIT);
    823			set_flow_mode(&desc[idx], BYPASS);
    824			set_dout_dlli(&desc[idx], ctx->opad_tmp_keys_dma_addr,
    825				      keylen, NS_BIT, 0);
    826			idx++;
    827
    828			if ((blocksize - keylen)) {
    829				hw_desc_init(&desc[idx]);
    830				set_din_const(&desc[idx], 0,
    831					      (blocksize - keylen));
    832				set_flow_mode(&desc[idx], BYPASS);
    833				set_dout_dlli(&desc[idx],
    834					      (ctx->opad_tmp_keys_dma_addr +
    835					       keylen), (blocksize - keylen),
    836					      NS_BIT, 0);
    837				idx++;
    838			}
    839		}
    840	} else {
    841		hw_desc_init(&desc[idx]);
    842		set_din_const(&desc[idx], 0, blocksize);
    843		set_flow_mode(&desc[idx], BYPASS);
    844		set_dout_dlli(&desc[idx], (ctx->opad_tmp_keys_dma_addr),
    845			      blocksize, NS_BIT, 0);
    846		idx++;
    847	}
    848
    849	rc = cc_send_sync_request(ctx->drvdata, &cc_req, desc, idx);
    850	if (rc) {
    851		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
    852		goto out;
    853	}
    854
    855	/* calc derived HMAC key */
    856	for (idx = 0, i = 0; i < 2; i++) {
    857		/* Load hash initial state */
    858		hw_desc_init(&desc[idx]);
    859		set_cipher_mode(&desc[idx], ctx->hw_mode);
    860		set_din_sram(&desc[idx], larval_addr, ctx->inter_digestsize);
    861		set_flow_mode(&desc[idx], S_DIN_to_HASH);
    862		set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
    863		idx++;
    864
    865		/* Load the hash current length*/
    866		hw_desc_init(&desc[idx]);
    867		set_cipher_mode(&desc[idx], ctx->hw_mode);
    868		set_din_const(&desc[idx], 0, ctx->hash_len);
    869		set_flow_mode(&desc[idx], S_DIN_to_HASH);
    870		set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
    871		idx++;
    872
    873		/* Prepare ipad key */
    874		hw_desc_init(&desc[idx]);
    875		set_xor_val(&desc[idx], hmac_pad_const[i]);
    876		set_cipher_mode(&desc[idx], ctx->hw_mode);
    877		set_flow_mode(&desc[idx], S_DIN_to_HASH);
    878		set_setup_mode(&desc[idx], SETUP_LOAD_STATE1);
    879		idx++;
    880
    881		/* Perform HASH update */
    882		hw_desc_init(&desc[idx]);
    883		set_din_type(&desc[idx], DMA_DLLI, ctx->opad_tmp_keys_dma_addr,
    884			     blocksize, NS_BIT);
    885		set_cipher_mode(&desc[idx], ctx->hw_mode);
    886		set_xor_active(&desc[idx]);
    887		set_flow_mode(&desc[idx], DIN_HASH);
    888		idx++;
    889
    890		/* Get the IPAD/OPAD xor key (Note, IPAD is the initial digest
    891		 * of the first HASH "update" state)
    892		 */
    893		hw_desc_init(&desc[idx]);
    894		set_cipher_mode(&desc[idx], ctx->hw_mode);
    895		if (i > 0) /* Not first iteration */
    896			set_dout_dlli(&desc[idx], ctx->opad_tmp_keys_dma_addr,
    897				      ctx->inter_digestsize, NS_BIT, 0);
    898		else /* First iteration */
    899			set_dout_dlli(&desc[idx], ctx->digest_buff_dma_addr,
    900				      ctx->inter_digestsize, NS_BIT, 0);
    901		set_flow_mode(&desc[idx], S_HASH_to_DOUT);
    902		set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
    903		idx++;
    904	}
    905
    906	rc = cc_send_sync_request(ctx->drvdata, &cc_req, desc, idx);
    907
    908out:
    909	if (ctx->key_params.key_dma_addr) {
    910		dma_unmap_single(dev, ctx->key_params.key_dma_addr,
    911				 ctx->key_params.keylen, DMA_TO_DEVICE);
    912		dev_dbg(dev, "Unmapped key-buffer: key_dma_addr=%pad keylen=%u\n",
    913			&ctx->key_params.key_dma_addr, ctx->key_params.keylen);
    914	}
    915
    916	kfree_sensitive(ctx->key_params.key);
    917
    918	return rc;
    919}
    920
    921static int cc_xcbc_setkey(struct crypto_ahash *ahash,
    922			  const u8 *key, unsigned int keylen)
    923{
    924	struct cc_crypto_req cc_req = {};
    925	struct cc_hash_ctx *ctx = crypto_ahash_ctx(ahash);
    926	struct device *dev = drvdata_to_dev(ctx->drvdata);
    927	int rc = 0;
    928	unsigned int idx = 0;
    929	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
    930
    931	dev_dbg(dev, "===== setkey (%d) ====\n", keylen);
    932
    933	switch (keylen) {
    934	case AES_KEYSIZE_128:
    935	case AES_KEYSIZE_192:
    936	case AES_KEYSIZE_256:
    937		break;
    938	default:
    939		return -EINVAL;
    940	}
    941
    942	ctx->key_params.keylen = keylen;
    943
    944	ctx->key_params.key = kmemdup(key, keylen, GFP_KERNEL);
    945	if (!ctx->key_params.key)
    946		return -ENOMEM;
    947
    948	ctx->key_params.key_dma_addr =
    949		dma_map_single(dev, ctx->key_params.key, keylen, DMA_TO_DEVICE);
    950	if (dma_mapping_error(dev, ctx->key_params.key_dma_addr)) {
    951		dev_err(dev, "Mapping key va=0x%p len=%u for DMA failed\n",
    952			key, keylen);
    953		kfree_sensitive(ctx->key_params.key);
    954		return -ENOMEM;
    955	}
    956	dev_dbg(dev, "mapping key-buffer: key_dma_addr=%pad keylen=%u\n",
    957		&ctx->key_params.key_dma_addr, ctx->key_params.keylen);
    958
    959	ctx->is_hmac = true;
    960	/* 1. Load the AES key */
    961	hw_desc_init(&desc[idx]);
    962	set_din_type(&desc[idx], DMA_DLLI, ctx->key_params.key_dma_addr,
    963		     keylen, NS_BIT);
    964	set_cipher_mode(&desc[idx], DRV_CIPHER_ECB);
    965	set_cipher_config0(&desc[idx], DRV_CRYPTO_DIRECTION_ENCRYPT);
    966	set_key_size_aes(&desc[idx], keylen);
    967	set_flow_mode(&desc[idx], S_DIN_to_AES);
    968	set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
    969	idx++;
    970
    971	hw_desc_init(&desc[idx]);
    972	set_din_const(&desc[idx], 0x01010101, CC_AES_128_BIT_KEY_SIZE);
    973	set_flow_mode(&desc[idx], DIN_AES_DOUT);
    974	set_dout_dlli(&desc[idx],
    975		      (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K1_OFFSET),
    976		      CC_AES_128_BIT_KEY_SIZE, NS_BIT, 0);
    977	idx++;
    978
    979	hw_desc_init(&desc[idx]);
    980	set_din_const(&desc[idx], 0x02020202, CC_AES_128_BIT_KEY_SIZE);
    981	set_flow_mode(&desc[idx], DIN_AES_DOUT);
    982	set_dout_dlli(&desc[idx],
    983		      (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K2_OFFSET),
    984		      CC_AES_128_BIT_KEY_SIZE, NS_BIT, 0);
    985	idx++;
    986
    987	hw_desc_init(&desc[idx]);
    988	set_din_const(&desc[idx], 0x03030303, CC_AES_128_BIT_KEY_SIZE);
    989	set_flow_mode(&desc[idx], DIN_AES_DOUT);
    990	set_dout_dlli(&desc[idx],
    991		      (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K3_OFFSET),
    992		      CC_AES_128_BIT_KEY_SIZE, NS_BIT, 0);
    993	idx++;
    994
    995	rc = cc_send_sync_request(ctx->drvdata, &cc_req, desc, idx);
    996
    997	dma_unmap_single(dev, ctx->key_params.key_dma_addr,
    998			 ctx->key_params.keylen, DMA_TO_DEVICE);
    999	dev_dbg(dev, "Unmapped key-buffer: key_dma_addr=%pad keylen=%u\n",
   1000		&ctx->key_params.key_dma_addr, ctx->key_params.keylen);
   1001
   1002	kfree_sensitive(ctx->key_params.key);
   1003
   1004	return rc;
   1005}
   1006
   1007static int cc_cmac_setkey(struct crypto_ahash *ahash,
   1008			  const u8 *key, unsigned int keylen)
   1009{
   1010	struct cc_hash_ctx *ctx = crypto_ahash_ctx(ahash);
   1011	struct device *dev = drvdata_to_dev(ctx->drvdata);
   1012
   1013	dev_dbg(dev, "===== setkey (%d) ====\n", keylen);
   1014
   1015	ctx->is_hmac = true;
   1016
   1017	switch (keylen) {
   1018	case AES_KEYSIZE_128:
   1019	case AES_KEYSIZE_192:
   1020	case AES_KEYSIZE_256:
   1021		break;
   1022	default:
   1023		return -EINVAL;
   1024	}
   1025
   1026	ctx->key_params.keylen = keylen;
   1027
   1028	/* STAT_PHASE_1: Copy key to ctx */
   1029
   1030	dma_sync_single_for_cpu(dev, ctx->opad_tmp_keys_dma_addr,
   1031				keylen, DMA_TO_DEVICE);
   1032
   1033	memcpy(ctx->opad_tmp_keys_buff, key, keylen);
   1034	if (keylen == 24) {
   1035		memset(ctx->opad_tmp_keys_buff + 24, 0,
   1036		       CC_AES_KEY_SIZE_MAX - 24);
   1037	}
   1038
   1039	dma_sync_single_for_device(dev, ctx->opad_tmp_keys_dma_addr,
   1040				   keylen, DMA_TO_DEVICE);
   1041
   1042	ctx->key_params.keylen = keylen;
   1043
   1044	return 0;
   1045}
   1046
   1047static void cc_free_ctx(struct cc_hash_ctx *ctx)
   1048{
   1049	struct device *dev = drvdata_to_dev(ctx->drvdata);
   1050
   1051	if (ctx->digest_buff_dma_addr) {
   1052		dma_unmap_single(dev, ctx->digest_buff_dma_addr,
   1053				 sizeof(ctx->digest_buff), DMA_BIDIRECTIONAL);
   1054		dev_dbg(dev, "Unmapped digest-buffer: digest_buff_dma_addr=%pad\n",
   1055			&ctx->digest_buff_dma_addr);
   1056		ctx->digest_buff_dma_addr = 0;
   1057	}
   1058	if (ctx->opad_tmp_keys_dma_addr) {
   1059		dma_unmap_single(dev, ctx->opad_tmp_keys_dma_addr,
   1060				 sizeof(ctx->opad_tmp_keys_buff),
   1061				 DMA_BIDIRECTIONAL);
   1062		dev_dbg(dev, "Unmapped opad-digest: opad_tmp_keys_dma_addr=%pad\n",
   1063			&ctx->opad_tmp_keys_dma_addr);
   1064		ctx->opad_tmp_keys_dma_addr = 0;
   1065	}
   1066
   1067	ctx->key_params.keylen = 0;
   1068}
   1069
   1070static int cc_alloc_ctx(struct cc_hash_ctx *ctx)
   1071{
   1072	struct device *dev = drvdata_to_dev(ctx->drvdata);
   1073
   1074	ctx->key_params.keylen = 0;
   1075
   1076	ctx->digest_buff_dma_addr =
   1077		dma_map_single(dev, ctx->digest_buff, sizeof(ctx->digest_buff),
   1078			       DMA_BIDIRECTIONAL);
   1079	if (dma_mapping_error(dev, ctx->digest_buff_dma_addr)) {
   1080		dev_err(dev, "Mapping digest len %zu B at va=%pK for DMA failed\n",
   1081			sizeof(ctx->digest_buff), ctx->digest_buff);
   1082		goto fail;
   1083	}
   1084	dev_dbg(dev, "Mapped digest %zu B at va=%pK to dma=%pad\n",
   1085		sizeof(ctx->digest_buff), ctx->digest_buff,
   1086		&ctx->digest_buff_dma_addr);
   1087
   1088	ctx->opad_tmp_keys_dma_addr =
   1089		dma_map_single(dev, ctx->opad_tmp_keys_buff,
   1090			       sizeof(ctx->opad_tmp_keys_buff),
   1091			       DMA_BIDIRECTIONAL);
   1092	if (dma_mapping_error(dev, ctx->opad_tmp_keys_dma_addr)) {
   1093		dev_err(dev, "Mapping opad digest %zu B at va=%pK for DMA failed\n",
   1094			sizeof(ctx->opad_tmp_keys_buff),
   1095			ctx->opad_tmp_keys_buff);
   1096		goto fail;
   1097	}
   1098	dev_dbg(dev, "Mapped opad_tmp_keys %zu B at va=%pK to dma=%pad\n",
   1099		sizeof(ctx->opad_tmp_keys_buff), ctx->opad_tmp_keys_buff,
   1100		&ctx->opad_tmp_keys_dma_addr);
   1101
   1102	ctx->is_hmac = false;
   1103	return 0;
   1104
   1105fail:
   1106	cc_free_ctx(ctx);
   1107	return -ENOMEM;
   1108}
   1109
   1110static int cc_get_hash_len(struct crypto_tfm *tfm)
   1111{
   1112	struct cc_hash_ctx *ctx = crypto_tfm_ctx(tfm);
   1113
   1114	if (ctx->hash_mode == DRV_HASH_SM3)
   1115		return CC_SM3_HASH_LEN_SIZE;
   1116	else
   1117		return cc_get_default_hash_len(ctx->drvdata);
   1118}
   1119
   1120static int cc_cra_init(struct crypto_tfm *tfm)
   1121{
   1122	struct cc_hash_ctx *ctx = crypto_tfm_ctx(tfm);
   1123	struct hash_alg_common *hash_alg_common =
   1124		container_of(tfm->__crt_alg, struct hash_alg_common, base);
   1125	struct ahash_alg *ahash_alg =
   1126		container_of(hash_alg_common, struct ahash_alg, halg);
   1127	struct cc_hash_alg *cc_alg =
   1128			container_of(ahash_alg, struct cc_hash_alg, ahash_alg);
   1129
   1130	crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
   1131				 sizeof(struct ahash_req_ctx));
   1132
   1133	ctx->hash_mode = cc_alg->hash_mode;
   1134	ctx->hw_mode = cc_alg->hw_mode;
   1135	ctx->inter_digestsize = cc_alg->inter_digestsize;
   1136	ctx->drvdata = cc_alg->drvdata;
   1137	ctx->hash_len = cc_get_hash_len(tfm);
   1138	return cc_alloc_ctx(ctx);
   1139}
   1140
   1141static void cc_cra_exit(struct crypto_tfm *tfm)
   1142{
   1143	struct cc_hash_ctx *ctx = crypto_tfm_ctx(tfm);
   1144	struct device *dev = drvdata_to_dev(ctx->drvdata);
   1145
   1146	dev_dbg(dev, "cc_cra_exit");
   1147	cc_free_ctx(ctx);
   1148}
   1149
   1150static int cc_mac_update(struct ahash_request *req)
   1151{
   1152	struct ahash_req_ctx *state = ahash_request_ctx(req);
   1153	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
   1154	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
   1155	struct device *dev = drvdata_to_dev(ctx->drvdata);
   1156	unsigned int block_size = crypto_tfm_alg_blocksize(&tfm->base);
   1157	struct cc_crypto_req cc_req = {};
   1158	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
   1159	int rc;
   1160	u32 idx = 0;
   1161	gfp_t flags = cc_gfp_flags(&req->base);
   1162
   1163	if (req->nbytes == 0) {
   1164		/* no real updates required */
   1165		return 0;
   1166	}
   1167
   1168	state->xcbc_count++;
   1169
   1170	rc = cc_map_hash_request_update(ctx->drvdata, state, req->src,
   1171					req->nbytes, block_size, flags);
   1172	if (rc) {
   1173		if (rc == 1) {
   1174			dev_dbg(dev, " data size not require HW update %x\n",
   1175				req->nbytes);
   1176			/* No hardware updates are required */
   1177			return 0;
   1178		}
   1179		dev_err(dev, "map_ahash_request_update() failed\n");
   1180		return -ENOMEM;
   1181	}
   1182
   1183	if (cc_map_req(dev, state, ctx)) {
   1184		dev_err(dev, "map_ahash_source() failed\n");
   1185		return -EINVAL;
   1186	}
   1187
   1188	if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC)
   1189		cc_setup_xcbc(req, desc, &idx);
   1190	else
   1191		cc_setup_cmac(req, desc, &idx);
   1192
   1193	cc_set_desc(state, ctx, DIN_AES_DOUT, desc, true, &idx);
   1194
   1195	/* store the hash digest result in context */
   1196	hw_desc_init(&desc[idx]);
   1197	set_cipher_mode(&desc[idx], ctx->hw_mode);
   1198	set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
   1199		      ctx->inter_digestsize, NS_BIT, 1);
   1200	set_queue_last_ind(ctx->drvdata, &desc[idx]);
   1201	set_flow_mode(&desc[idx], S_AES_to_DOUT);
   1202	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
   1203	idx++;
   1204
   1205	/* Setup request structure */
   1206	cc_req.user_cb = cc_update_complete;
   1207	cc_req.user_arg = req;
   1208
   1209	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
   1210	if (rc != -EINPROGRESS && rc != -EBUSY) {
   1211		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
   1212		cc_unmap_hash_request(dev, state, req->src, true);
   1213		cc_unmap_req(dev, state, ctx);
   1214	}
   1215	return rc;
   1216}
   1217
   1218static int cc_mac_final(struct ahash_request *req)
   1219{
   1220	struct ahash_req_ctx *state = ahash_request_ctx(req);
   1221	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
   1222	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
   1223	struct device *dev = drvdata_to_dev(ctx->drvdata);
   1224	struct cc_crypto_req cc_req = {};
   1225	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
   1226	int idx = 0;
   1227	int rc = 0;
   1228	u32 key_size, key_len;
   1229	u32 digestsize = crypto_ahash_digestsize(tfm);
   1230	gfp_t flags = cc_gfp_flags(&req->base);
   1231	u32 rem_cnt = *cc_hash_buf_cnt(state);
   1232
   1233	if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC) {
   1234		key_size = CC_AES_128_BIT_KEY_SIZE;
   1235		key_len  = CC_AES_128_BIT_KEY_SIZE;
   1236	} else {
   1237		key_size = (ctx->key_params.keylen == 24) ? AES_MAX_KEY_SIZE :
   1238			ctx->key_params.keylen;
   1239		key_len =  ctx->key_params.keylen;
   1240	}
   1241
   1242	dev_dbg(dev, "===== final  xcbc reminder (%d) ====\n", rem_cnt);
   1243
   1244	if (cc_map_req(dev, state, ctx)) {
   1245		dev_err(dev, "map_ahash_source() failed\n");
   1246		return -EINVAL;
   1247	}
   1248
   1249	if (cc_map_hash_request_final(ctx->drvdata, state, req->src,
   1250				      req->nbytes, 0, flags)) {
   1251		dev_err(dev, "map_ahash_request_final() failed\n");
   1252		cc_unmap_req(dev, state, ctx);
   1253		return -ENOMEM;
   1254	}
   1255
   1256	if (cc_map_result(dev, state, digestsize)) {
   1257		dev_err(dev, "map_ahash_digest() failed\n");
   1258		cc_unmap_hash_request(dev, state, req->src, true);
   1259		cc_unmap_req(dev, state, ctx);
   1260		return -ENOMEM;
   1261	}
   1262
   1263	/* Setup request structure */
   1264	cc_req.user_cb = cc_hash_complete;
   1265	cc_req.user_arg = req;
   1266
   1267	if (state->xcbc_count && rem_cnt == 0) {
   1268		/* Load key for ECB decryption */
   1269		hw_desc_init(&desc[idx]);
   1270		set_cipher_mode(&desc[idx], DRV_CIPHER_ECB);
   1271		set_cipher_config0(&desc[idx], DRV_CRYPTO_DIRECTION_DECRYPT);
   1272		set_din_type(&desc[idx], DMA_DLLI,
   1273			     (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K1_OFFSET),
   1274			     key_size, NS_BIT);
   1275		set_key_size_aes(&desc[idx], key_len);
   1276		set_flow_mode(&desc[idx], S_DIN_to_AES);
   1277		set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
   1278		idx++;
   1279
   1280		/* Initiate decryption of block state to previous
   1281		 * block_state-XOR-M[n]
   1282		 */
   1283		hw_desc_init(&desc[idx]);
   1284		set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
   1285			     CC_AES_BLOCK_SIZE, NS_BIT);
   1286		set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
   1287			      CC_AES_BLOCK_SIZE, NS_BIT, 0);
   1288		set_flow_mode(&desc[idx], DIN_AES_DOUT);
   1289		idx++;
   1290
   1291		/* Memory Barrier: wait for axi write to complete */
   1292		hw_desc_init(&desc[idx]);
   1293		set_din_no_dma(&desc[idx], 0, 0xfffff0);
   1294		set_dout_no_dma(&desc[idx], 0, 0, 1);
   1295		idx++;
   1296	}
   1297
   1298	if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC)
   1299		cc_setup_xcbc(req, desc, &idx);
   1300	else
   1301		cc_setup_cmac(req, desc, &idx);
   1302
   1303	if (state->xcbc_count == 0) {
   1304		hw_desc_init(&desc[idx]);
   1305		set_cipher_mode(&desc[idx], ctx->hw_mode);
   1306		set_key_size_aes(&desc[idx], key_len);
   1307		set_cmac_size0_mode(&desc[idx]);
   1308		set_flow_mode(&desc[idx], S_DIN_to_AES);
   1309		idx++;
   1310	} else if (rem_cnt > 0) {
   1311		cc_set_desc(state, ctx, DIN_AES_DOUT, desc, false, &idx);
   1312	} else {
   1313		hw_desc_init(&desc[idx]);
   1314		set_din_const(&desc[idx], 0x00, CC_AES_BLOCK_SIZE);
   1315		set_flow_mode(&desc[idx], DIN_AES_DOUT);
   1316		idx++;
   1317	}
   1318
   1319	/* Get final MAC result */
   1320	hw_desc_init(&desc[idx]);
   1321	set_dout_dlli(&desc[idx], state->digest_result_dma_addr,
   1322		      digestsize, NS_BIT, 1);
   1323	set_queue_last_ind(ctx->drvdata, &desc[idx]);
   1324	set_flow_mode(&desc[idx], S_AES_to_DOUT);
   1325	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
   1326	set_cipher_mode(&desc[idx], ctx->hw_mode);
   1327	idx++;
   1328
   1329	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
   1330	if (rc != -EINPROGRESS && rc != -EBUSY) {
   1331		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
   1332		cc_unmap_hash_request(dev, state, req->src, true);
   1333		cc_unmap_result(dev, state, digestsize, req->result);
   1334		cc_unmap_req(dev, state, ctx);
   1335	}
   1336	return rc;
   1337}
   1338
   1339static int cc_mac_finup(struct ahash_request *req)
   1340{
   1341	struct ahash_req_ctx *state = ahash_request_ctx(req);
   1342	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
   1343	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
   1344	struct device *dev = drvdata_to_dev(ctx->drvdata);
   1345	struct cc_crypto_req cc_req = {};
   1346	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
   1347	int idx = 0;
   1348	int rc = 0;
   1349	u32 key_len = 0;
   1350	u32 digestsize = crypto_ahash_digestsize(tfm);
   1351	gfp_t flags = cc_gfp_flags(&req->base);
   1352
   1353	dev_dbg(dev, "===== finup xcbc(%d) ====\n", req->nbytes);
   1354	if (state->xcbc_count > 0 && req->nbytes == 0) {
   1355		dev_dbg(dev, "No data to update. Call to fdx_mac_final\n");
   1356		return cc_mac_final(req);
   1357	}
   1358
   1359	if (cc_map_req(dev, state, ctx)) {
   1360		dev_err(dev, "map_ahash_source() failed\n");
   1361		return -EINVAL;
   1362	}
   1363
   1364	if (cc_map_hash_request_final(ctx->drvdata, state, req->src,
   1365				      req->nbytes, 1, flags)) {
   1366		dev_err(dev, "map_ahash_request_final() failed\n");
   1367		cc_unmap_req(dev, state, ctx);
   1368		return -ENOMEM;
   1369	}
   1370	if (cc_map_result(dev, state, digestsize)) {
   1371		dev_err(dev, "map_ahash_digest() failed\n");
   1372		cc_unmap_hash_request(dev, state, req->src, true);
   1373		cc_unmap_req(dev, state, ctx);
   1374		return -ENOMEM;
   1375	}
   1376
   1377	/* Setup request structure */
   1378	cc_req.user_cb = cc_hash_complete;
   1379	cc_req.user_arg = req;
   1380
   1381	if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC) {
   1382		key_len = CC_AES_128_BIT_KEY_SIZE;
   1383		cc_setup_xcbc(req, desc, &idx);
   1384	} else {
   1385		key_len = ctx->key_params.keylen;
   1386		cc_setup_cmac(req, desc, &idx);
   1387	}
   1388
   1389	if (req->nbytes == 0) {
   1390		hw_desc_init(&desc[idx]);
   1391		set_cipher_mode(&desc[idx], ctx->hw_mode);
   1392		set_key_size_aes(&desc[idx], key_len);
   1393		set_cmac_size0_mode(&desc[idx]);
   1394		set_flow_mode(&desc[idx], S_DIN_to_AES);
   1395		idx++;
   1396	} else {
   1397		cc_set_desc(state, ctx, DIN_AES_DOUT, desc, false, &idx);
   1398	}
   1399
   1400	/* Get final MAC result */
   1401	hw_desc_init(&desc[idx]);
   1402	set_dout_dlli(&desc[idx], state->digest_result_dma_addr,
   1403		      digestsize, NS_BIT, 1);
   1404	set_queue_last_ind(ctx->drvdata, &desc[idx]);
   1405	set_flow_mode(&desc[idx], S_AES_to_DOUT);
   1406	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
   1407	set_cipher_mode(&desc[idx], ctx->hw_mode);
   1408	idx++;
   1409
   1410	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
   1411	if (rc != -EINPROGRESS && rc != -EBUSY) {
   1412		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
   1413		cc_unmap_hash_request(dev, state, req->src, true);
   1414		cc_unmap_result(dev, state, digestsize, req->result);
   1415		cc_unmap_req(dev, state, ctx);
   1416	}
   1417	return rc;
   1418}
   1419
   1420static int cc_mac_digest(struct ahash_request *req)
   1421{
   1422	struct ahash_req_ctx *state = ahash_request_ctx(req);
   1423	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
   1424	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
   1425	struct device *dev = drvdata_to_dev(ctx->drvdata);
   1426	u32 digestsize = crypto_ahash_digestsize(tfm);
   1427	struct cc_crypto_req cc_req = {};
   1428	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
   1429	u32 key_len;
   1430	unsigned int idx = 0;
   1431	int rc;
   1432	gfp_t flags = cc_gfp_flags(&req->base);
   1433
   1434	dev_dbg(dev, "===== -digest mac (%d) ====\n",  req->nbytes);
   1435
   1436	cc_init_req(dev, state, ctx);
   1437
   1438	if (cc_map_req(dev, state, ctx)) {
   1439		dev_err(dev, "map_ahash_source() failed\n");
   1440		return -ENOMEM;
   1441	}
   1442	if (cc_map_result(dev, state, digestsize)) {
   1443		dev_err(dev, "map_ahash_digest() failed\n");
   1444		cc_unmap_req(dev, state, ctx);
   1445		return -ENOMEM;
   1446	}
   1447
   1448	if (cc_map_hash_request_final(ctx->drvdata, state, req->src,
   1449				      req->nbytes, 1, flags)) {
   1450		dev_err(dev, "map_ahash_request_final() failed\n");
   1451		cc_unmap_req(dev, state, ctx);
   1452		return -ENOMEM;
   1453	}
   1454
   1455	/* Setup request structure */
   1456	cc_req.user_cb = cc_digest_complete;
   1457	cc_req.user_arg = req;
   1458
   1459	if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC) {
   1460		key_len = CC_AES_128_BIT_KEY_SIZE;
   1461		cc_setup_xcbc(req, desc, &idx);
   1462	} else {
   1463		key_len = ctx->key_params.keylen;
   1464		cc_setup_cmac(req, desc, &idx);
   1465	}
   1466
   1467	if (req->nbytes == 0) {
   1468		hw_desc_init(&desc[idx]);
   1469		set_cipher_mode(&desc[idx], ctx->hw_mode);
   1470		set_key_size_aes(&desc[idx], key_len);
   1471		set_cmac_size0_mode(&desc[idx]);
   1472		set_flow_mode(&desc[idx], S_DIN_to_AES);
   1473		idx++;
   1474	} else {
   1475		cc_set_desc(state, ctx, DIN_AES_DOUT, desc, false, &idx);
   1476	}
   1477
   1478	/* Get final MAC result */
   1479	hw_desc_init(&desc[idx]);
   1480	set_dout_dlli(&desc[idx], state->digest_result_dma_addr,
   1481		      CC_AES_BLOCK_SIZE, NS_BIT, 1);
   1482	set_queue_last_ind(ctx->drvdata, &desc[idx]);
   1483	set_flow_mode(&desc[idx], S_AES_to_DOUT);
   1484	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
   1485	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
   1486	set_cipher_mode(&desc[idx], ctx->hw_mode);
   1487	idx++;
   1488
   1489	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
   1490	if (rc != -EINPROGRESS && rc != -EBUSY) {
   1491		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
   1492		cc_unmap_hash_request(dev, state, req->src, true);
   1493		cc_unmap_result(dev, state, digestsize, req->result);
   1494		cc_unmap_req(dev, state, ctx);
   1495	}
   1496	return rc;
   1497}
   1498
   1499static int cc_hash_export(struct ahash_request *req, void *out)
   1500{
   1501	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
   1502	struct cc_hash_ctx *ctx = crypto_ahash_ctx(ahash);
   1503	struct ahash_req_ctx *state = ahash_request_ctx(req);
   1504	u8 *curr_buff = cc_hash_buf(state);
   1505	u32 curr_buff_cnt = *cc_hash_buf_cnt(state);
   1506	const u32 tmp = CC_EXPORT_MAGIC;
   1507
   1508	memcpy(out, &tmp, sizeof(u32));
   1509	out += sizeof(u32);
   1510
   1511	memcpy(out, state->digest_buff, ctx->inter_digestsize);
   1512	out += ctx->inter_digestsize;
   1513
   1514	memcpy(out, state->digest_bytes_len, ctx->hash_len);
   1515	out += ctx->hash_len;
   1516
   1517	memcpy(out, &curr_buff_cnt, sizeof(u32));
   1518	out += sizeof(u32);
   1519
   1520	memcpy(out, curr_buff, curr_buff_cnt);
   1521
   1522	return 0;
   1523}
   1524
   1525static int cc_hash_import(struct ahash_request *req, const void *in)
   1526{
   1527	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
   1528	struct cc_hash_ctx *ctx = crypto_ahash_ctx(ahash);
   1529	struct device *dev = drvdata_to_dev(ctx->drvdata);
   1530	struct ahash_req_ctx *state = ahash_request_ctx(req);
   1531	u32 tmp;
   1532
   1533	memcpy(&tmp, in, sizeof(u32));
   1534	if (tmp != CC_EXPORT_MAGIC)
   1535		return -EINVAL;
   1536	in += sizeof(u32);
   1537
   1538	cc_init_req(dev, state, ctx);
   1539
   1540	memcpy(state->digest_buff, in, ctx->inter_digestsize);
   1541	in += ctx->inter_digestsize;
   1542
   1543	memcpy(state->digest_bytes_len, in, ctx->hash_len);
   1544	in += ctx->hash_len;
   1545
   1546	/* Sanity check the data as much as possible */
   1547	memcpy(&tmp, in, sizeof(u32));
   1548	if (tmp > CC_MAX_HASH_BLCK_SIZE)
   1549		return -EINVAL;
   1550	in += sizeof(u32);
   1551
   1552	state->buf_cnt[0] = tmp;
   1553	memcpy(state->buffers[0], in, tmp);
   1554
   1555	return 0;
   1556}
   1557
   1558struct cc_hash_template {
   1559	char name[CRYPTO_MAX_ALG_NAME];
   1560	char driver_name[CRYPTO_MAX_ALG_NAME];
   1561	char mac_name[CRYPTO_MAX_ALG_NAME];
   1562	char mac_driver_name[CRYPTO_MAX_ALG_NAME];
   1563	unsigned int blocksize;
   1564	bool is_mac;
   1565	bool synchronize;
   1566	struct ahash_alg template_ahash;
   1567	int hash_mode;
   1568	int hw_mode;
   1569	int inter_digestsize;
   1570	struct cc_drvdata *drvdata;
   1571	u32 min_hw_rev;
   1572	enum cc_std_body std_body;
   1573};
   1574
   1575#define CC_STATE_SIZE(_x) \
   1576	((_x) + HASH_MAX_LEN_SIZE + CC_MAX_HASH_BLCK_SIZE + (2 * sizeof(u32)))
   1577
   1578/* hash descriptors */
   1579static struct cc_hash_template driver_hash[] = {
   1580	//Asynchronize hash template
   1581	{
   1582		.name = "sha1",
   1583		.driver_name = "sha1-ccree",
   1584		.mac_name = "hmac(sha1)",
   1585		.mac_driver_name = "hmac-sha1-ccree",
   1586		.blocksize = SHA1_BLOCK_SIZE,
   1587		.is_mac = true,
   1588		.synchronize = false,
   1589		.template_ahash = {
   1590			.init = cc_hash_init,
   1591			.update = cc_hash_update,
   1592			.final = cc_hash_final,
   1593			.finup = cc_hash_finup,
   1594			.digest = cc_hash_digest,
   1595			.export = cc_hash_export,
   1596			.import = cc_hash_import,
   1597			.setkey = cc_hash_setkey,
   1598			.halg = {
   1599				.digestsize = SHA1_DIGEST_SIZE,
   1600				.statesize = CC_STATE_SIZE(SHA1_DIGEST_SIZE),
   1601			},
   1602		},
   1603		.hash_mode = DRV_HASH_SHA1,
   1604		.hw_mode = DRV_HASH_HW_SHA1,
   1605		.inter_digestsize = SHA1_DIGEST_SIZE,
   1606		.min_hw_rev = CC_HW_REV_630,
   1607		.std_body = CC_STD_NIST,
   1608	},
   1609	{
   1610		.name = "sha256",
   1611		.driver_name = "sha256-ccree",
   1612		.mac_name = "hmac(sha256)",
   1613		.mac_driver_name = "hmac-sha256-ccree",
   1614		.blocksize = SHA256_BLOCK_SIZE,
   1615		.is_mac = true,
   1616		.template_ahash = {
   1617			.init = cc_hash_init,
   1618			.update = cc_hash_update,
   1619			.final = cc_hash_final,
   1620			.finup = cc_hash_finup,
   1621			.digest = cc_hash_digest,
   1622			.export = cc_hash_export,
   1623			.import = cc_hash_import,
   1624			.setkey = cc_hash_setkey,
   1625			.halg = {
   1626				.digestsize = SHA256_DIGEST_SIZE,
   1627				.statesize = CC_STATE_SIZE(SHA256_DIGEST_SIZE)
   1628			},
   1629		},
   1630		.hash_mode = DRV_HASH_SHA256,
   1631		.hw_mode = DRV_HASH_HW_SHA256,
   1632		.inter_digestsize = SHA256_DIGEST_SIZE,
   1633		.min_hw_rev = CC_HW_REV_630,
   1634		.std_body = CC_STD_NIST,
   1635	},
   1636	{
   1637		.name = "sha224",
   1638		.driver_name = "sha224-ccree",
   1639		.mac_name = "hmac(sha224)",
   1640		.mac_driver_name = "hmac-sha224-ccree",
   1641		.blocksize = SHA224_BLOCK_SIZE,
   1642		.is_mac = true,
   1643		.template_ahash = {
   1644			.init = cc_hash_init,
   1645			.update = cc_hash_update,
   1646			.final = cc_hash_final,
   1647			.finup = cc_hash_finup,
   1648			.digest = cc_hash_digest,
   1649			.export = cc_hash_export,
   1650			.import = cc_hash_import,
   1651			.setkey = cc_hash_setkey,
   1652			.halg = {
   1653				.digestsize = SHA224_DIGEST_SIZE,
   1654				.statesize = CC_STATE_SIZE(SHA256_DIGEST_SIZE),
   1655			},
   1656		},
   1657		.hash_mode = DRV_HASH_SHA224,
   1658		.hw_mode = DRV_HASH_HW_SHA256,
   1659		.inter_digestsize = SHA256_DIGEST_SIZE,
   1660		.min_hw_rev = CC_HW_REV_630,
   1661		.std_body = CC_STD_NIST,
   1662	},
   1663	{
   1664		.name = "sha384",
   1665		.driver_name = "sha384-ccree",
   1666		.mac_name = "hmac(sha384)",
   1667		.mac_driver_name = "hmac-sha384-ccree",
   1668		.blocksize = SHA384_BLOCK_SIZE,
   1669		.is_mac = true,
   1670		.template_ahash = {
   1671			.init = cc_hash_init,
   1672			.update = cc_hash_update,
   1673			.final = cc_hash_final,
   1674			.finup = cc_hash_finup,
   1675			.digest = cc_hash_digest,
   1676			.export = cc_hash_export,
   1677			.import = cc_hash_import,
   1678			.setkey = cc_hash_setkey,
   1679			.halg = {
   1680				.digestsize = SHA384_DIGEST_SIZE,
   1681				.statesize = CC_STATE_SIZE(SHA512_DIGEST_SIZE),
   1682			},
   1683		},
   1684		.hash_mode = DRV_HASH_SHA384,
   1685		.hw_mode = DRV_HASH_HW_SHA512,
   1686		.inter_digestsize = SHA512_DIGEST_SIZE,
   1687		.min_hw_rev = CC_HW_REV_712,
   1688		.std_body = CC_STD_NIST,
   1689	},
   1690	{
   1691		.name = "sha512",
   1692		.driver_name = "sha512-ccree",
   1693		.mac_name = "hmac(sha512)",
   1694		.mac_driver_name = "hmac-sha512-ccree",
   1695		.blocksize = SHA512_BLOCK_SIZE,
   1696		.is_mac = true,
   1697		.template_ahash = {
   1698			.init = cc_hash_init,
   1699			.update = cc_hash_update,
   1700			.final = cc_hash_final,
   1701			.finup = cc_hash_finup,
   1702			.digest = cc_hash_digest,
   1703			.export = cc_hash_export,
   1704			.import = cc_hash_import,
   1705			.setkey = cc_hash_setkey,
   1706			.halg = {
   1707				.digestsize = SHA512_DIGEST_SIZE,
   1708				.statesize = CC_STATE_SIZE(SHA512_DIGEST_SIZE),
   1709			},
   1710		},
   1711		.hash_mode = DRV_HASH_SHA512,
   1712		.hw_mode = DRV_HASH_HW_SHA512,
   1713		.inter_digestsize = SHA512_DIGEST_SIZE,
   1714		.min_hw_rev = CC_HW_REV_712,
   1715		.std_body = CC_STD_NIST,
   1716	},
   1717	{
   1718		.name = "md5",
   1719		.driver_name = "md5-ccree",
   1720		.mac_name = "hmac(md5)",
   1721		.mac_driver_name = "hmac-md5-ccree",
   1722		.blocksize = MD5_HMAC_BLOCK_SIZE,
   1723		.is_mac = true,
   1724		.template_ahash = {
   1725			.init = cc_hash_init,
   1726			.update = cc_hash_update,
   1727			.final = cc_hash_final,
   1728			.finup = cc_hash_finup,
   1729			.digest = cc_hash_digest,
   1730			.export = cc_hash_export,
   1731			.import = cc_hash_import,
   1732			.setkey = cc_hash_setkey,
   1733			.halg = {
   1734				.digestsize = MD5_DIGEST_SIZE,
   1735				.statesize = CC_STATE_SIZE(MD5_DIGEST_SIZE),
   1736			},
   1737		},
   1738		.hash_mode = DRV_HASH_MD5,
   1739		.hw_mode = DRV_HASH_HW_MD5,
   1740		.inter_digestsize = MD5_DIGEST_SIZE,
   1741		.min_hw_rev = CC_HW_REV_630,
   1742		.std_body = CC_STD_NIST,
   1743	},
   1744	{
   1745		.name = "sm3",
   1746		.driver_name = "sm3-ccree",
   1747		.blocksize = SM3_BLOCK_SIZE,
   1748		.is_mac = false,
   1749		.template_ahash = {
   1750			.init = cc_hash_init,
   1751			.update = cc_hash_update,
   1752			.final = cc_hash_final,
   1753			.finup = cc_hash_finup,
   1754			.digest = cc_hash_digest,
   1755			.export = cc_hash_export,
   1756			.import = cc_hash_import,
   1757			.setkey = cc_hash_setkey,
   1758			.halg = {
   1759				.digestsize = SM3_DIGEST_SIZE,
   1760				.statesize = CC_STATE_SIZE(SM3_DIGEST_SIZE),
   1761			},
   1762		},
   1763		.hash_mode = DRV_HASH_SM3,
   1764		.hw_mode = DRV_HASH_HW_SM3,
   1765		.inter_digestsize = SM3_DIGEST_SIZE,
   1766		.min_hw_rev = CC_HW_REV_713,
   1767		.std_body = CC_STD_OSCCA,
   1768	},
   1769	{
   1770		.mac_name = "xcbc(aes)",
   1771		.mac_driver_name = "xcbc-aes-ccree",
   1772		.blocksize = AES_BLOCK_SIZE,
   1773		.is_mac = true,
   1774		.template_ahash = {
   1775			.init = cc_hash_init,
   1776			.update = cc_mac_update,
   1777			.final = cc_mac_final,
   1778			.finup = cc_mac_finup,
   1779			.digest = cc_mac_digest,
   1780			.setkey = cc_xcbc_setkey,
   1781			.export = cc_hash_export,
   1782			.import = cc_hash_import,
   1783			.halg = {
   1784				.digestsize = AES_BLOCK_SIZE,
   1785				.statesize = CC_STATE_SIZE(AES_BLOCK_SIZE),
   1786			},
   1787		},
   1788		.hash_mode = DRV_HASH_NULL,
   1789		.hw_mode = DRV_CIPHER_XCBC_MAC,
   1790		.inter_digestsize = AES_BLOCK_SIZE,
   1791		.min_hw_rev = CC_HW_REV_630,
   1792		.std_body = CC_STD_NIST,
   1793	},
   1794	{
   1795		.mac_name = "cmac(aes)",
   1796		.mac_driver_name = "cmac-aes-ccree",
   1797		.blocksize = AES_BLOCK_SIZE,
   1798		.is_mac = true,
   1799		.template_ahash = {
   1800			.init = cc_hash_init,
   1801			.update = cc_mac_update,
   1802			.final = cc_mac_final,
   1803			.finup = cc_mac_finup,
   1804			.digest = cc_mac_digest,
   1805			.setkey = cc_cmac_setkey,
   1806			.export = cc_hash_export,
   1807			.import = cc_hash_import,
   1808			.halg = {
   1809				.digestsize = AES_BLOCK_SIZE,
   1810				.statesize = CC_STATE_SIZE(AES_BLOCK_SIZE),
   1811			},
   1812		},
   1813		.hash_mode = DRV_HASH_NULL,
   1814		.hw_mode = DRV_CIPHER_CMAC,
   1815		.inter_digestsize = AES_BLOCK_SIZE,
   1816		.min_hw_rev = CC_HW_REV_630,
   1817		.std_body = CC_STD_NIST,
   1818	},
   1819};
   1820
   1821static struct cc_hash_alg *cc_alloc_hash_alg(struct cc_hash_template *template,
   1822					     struct device *dev, bool keyed)
   1823{
   1824	struct cc_hash_alg *t_crypto_alg;
   1825	struct crypto_alg *alg;
   1826	struct ahash_alg *halg;
   1827
   1828	t_crypto_alg = devm_kzalloc(dev, sizeof(*t_crypto_alg), GFP_KERNEL);
   1829	if (!t_crypto_alg)
   1830		return ERR_PTR(-ENOMEM);
   1831
   1832	t_crypto_alg->ahash_alg = template->template_ahash;
   1833	halg = &t_crypto_alg->ahash_alg;
   1834	alg = &halg->halg.base;
   1835
   1836	if (keyed) {
   1837		snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
   1838			 template->mac_name);
   1839		snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
   1840			 template->mac_driver_name);
   1841	} else {
   1842		halg->setkey = NULL;
   1843		snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
   1844			 template->name);
   1845		snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
   1846			 template->driver_name);
   1847	}
   1848	alg->cra_module = THIS_MODULE;
   1849	alg->cra_ctxsize = sizeof(struct cc_hash_ctx);
   1850	alg->cra_priority = CC_CRA_PRIO;
   1851	alg->cra_blocksize = template->blocksize;
   1852	alg->cra_alignmask = 0;
   1853	alg->cra_exit = cc_cra_exit;
   1854
   1855	alg->cra_init = cc_cra_init;
   1856	alg->cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY;
   1857
   1858	t_crypto_alg->hash_mode = template->hash_mode;
   1859	t_crypto_alg->hw_mode = template->hw_mode;
   1860	t_crypto_alg->inter_digestsize = template->inter_digestsize;
   1861
   1862	return t_crypto_alg;
   1863}
   1864
   1865static int cc_init_copy_sram(struct cc_drvdata *drvdata, const u32 *data,
   1866			     unsigned int size, u32 *sram_buff_ofs)
   1867{
   1868	struct cc_hw_desc larval_seq[CC_DIGEST_SIZE_MAX / sizeof(u32)];
   1869	unsigned int larval_seq_len = 0;
   1870	int rc;
   1871
   1872	cc_set_sram_desc(data, *sram_buff_ofs, size / sizeof(*data),
   1873			 larval_seq, &larval_seq_len);
   1874	rc = send_request_init(drvdata, larval_seq, larval_seq_len);
   1875	if (rc)
   1876		return rc;
   1877
   1878	*sram_buff_ofs += size;
   1879	return 0;
   1880}
   1881
   1882int cc_init_hash_sram(struct cc_drvdata *drvdata)
   1883{
   1884	struct cc_hash_handle *hash_handle = drvdata->hash_handle;
   1885	u32 sram_buff_ofs = hash_handle->digest_len_sram_addr;
   1886	bool large_sha_supported = (drvdata->hw_rev >= CC_HW_REV_712);
   1887	bool sm3_supported = (drvdata->hw_rev >= CC_HW_REV_713);
   1888	int rc = 0;
   1889
   1890	/* Copy-to-sram digest-len */
   1891	rc = cc_init_copy_sram(drvdata, cc_digest_len_init,
   1892			       sizeof(cc_digest_len_init), &sram_buff_ofs);
   1893	if (rc)
   1894		goto init_digest_const_err;
   1895
   1896	if (large_sha_supported) {
   1897		/* Copy-to-sram digest-len for sha384/512 */
   1898		rc = cc_init_copy_sram(drvdata, cc_digest_len_sha512_init,
   1899				       sizeof(cc_digest_len_sha512_init),
   1900				       &sram_buff_ofs);
   1901		if (rc)
   1902			goto init_digest_const_err;
   1903	}
   1904
   1905	/* The initial digests offset */
   1906	hash_handle->larval_digest_sram_addr = sram_buff_ofs;
   1907
   1908	/* Copy-to-sram initial SHA* digests */
   1909	rc = cc_init_copy_sram(drvdata, cc_md5_init, sizeof(cc_md5_init),
   1910			       &sram_buff_ofs);
   1911	if (rc)
   1912		goto init_digest_const_err;
   1913
   1914	rc = cc_init_copy_sram(drvdata, cc_sha1_init, sizeof(cc_sha1_init),
   1915			       &sram_buff_ofs);
   1916	if (rc)
   1917		goto init_digest_const_err;
   1918
   1919	rc = cc_init_copy_sram(drvdata, cc_sha224_init, sizeof(cc_sha224_init),
   1920			       &sram_buff_ofs);
   1921	if (rc)
   1922		goto init_digest_const_err;
   1923
   1924	rc = cc_init_copy_sram(drvdata, cc_sha256_init, sizeof(cc_sha256_init),
   1925			       &sram_buff_ofs);
   1926	if (rc)
   1927		goto init_digest_const_err;
   1928
   1929	if (sm3_supported) {
   1930		rc = cc_init_copy_sram(drvdata, cc_sm3_init,
   1931				       sizeof(cc_sm3_init), &sram_buff_ofs);
   1932		if (rc)
   1933			goto init_digest_const_err;
   1934	}
   1935
   1936	if (large_sha_supported) {
   1937		rc = cc_init_copy_sram(drvdata, cc_sha384_init,
   1938				       sizeof(cc_sha384_init), &sram_buff_ofs);
   1939		if (rc)
   1940			goto init_digest_const_err;
   1941
   1942		rc = cc_init_copy_sram(drvdata, cc_sha512_init,
   1943				       sizeof(cc_sha512_init), &sram_buff_ofs);
   1944		if (rc)
   1945			goto init_digest_const_err;
   1946	}
   1947
   1948init_digest_const_err:
   1949	return rc;
   1950}
   1951
   1952int cc_hash_alloc(struct cc_drvdata *drvdata)
   1953{
   1954	struct cc_hash_handle *hash_handle;
   1955	u32 sram_buff;
   1956	u32 sram_size_to_alloc;
   1957	struct device *dev = drvdata_to_dev(drvdata);
   1958	int rc = 0;
   1959	int alg;
   1960
   1961	hash_handle = devm_kzalloc(dev, sizeof(*hash_handle), GFP_KERNEL);
   1962	if (!hash_handle)
   1963		return -ENOMEM;
   1964
   1965	INIT_LIST_HEAD(&hash_handle->hash_list);
   1966	drvdata->hash_handle = hash_handle;
   1967
   1968	sram_size_to_alloc = sizeof(cc_digest_len_init) +
   1969			sizeof(cc_md5_init) +
   1970			sizeof(cc_sha1_init) +
   1971			sizeof(cc_sha224_init) +
   1972			sizeof(cc_sha256_init);
   1973
   1974	if (drvdata->hw_rev >= CC_HW_REV_713)
   1975		sram_size_to_alloc += sizeof(cc_sm3_init);
   1976
   1977	if (drvdata->hw_rev >= CC_HW_REV_712)
   1978		sram_size_to_alloc += sizeof(cc_digest_len_sha512_init) +
   1979			sizeof(cc_sha384_init) + sizeof(cc_sha512_init);
   1980
   1981	sram_buff = cc_sram_alloc(drvdata, sram_size_to_alloc);
   1982	if (sram_buff == NULL_SRAM_ADDR) {
   1983		rc = -ENOMEM;
   1984		goto fail;
   1985	}
   1986
   1987	/* The initial digest-len offset */
   1988	hash_handle->digest_len_sram_addr = sram_buff;
   1989
   1990	/*must be set before the alg registration as it is being used there*/
   1991	rc = cc_init_hash_sram(drvdata);
   1992	if (rc) {
   1993		dev_err(dev, "Init digest CONST failed (rc=%d)\n", rc);
   1994		goto fail;
   1995	}
   1996
   1997	/* ahash registration */
   1998	for (alg = 0; alg < ARRAY_SIZE(driver_hash); alg++) {
   1999		struct cc_hash_alg *t_alg;
   2000		int hw_mode = driver_hash[alg].hw_mode;
   2001
   2002		/* Check that the HW revision and variants are suitable */
   2003		if ((driver_hash[alg].min_hw_rev > drvdata->hw_rev) ||
   2004		    !(drvdata->std_bodies & driver_hash[alg].std_body))
   2005			continue;
   2006
   2007		if (driver_hash[alg].is_mac) {
   2008			/* register hmac version */
   2009			t_alg = cc_alloc_hash_alg(&driver_hash[alg], dev, true);
   2010			if (IS_ERR(t_alg)) {
   2011				rc = PTR_ERR(t_alg);
   2012				dev_err(dev, "%s alg allocation failed\n",
   2013					driver_hash[alg].driver_name);
   2014				goto fail;
   2015			}
   2016			t_alg->drvdata = drvdata;
   2017
   2018			rc = crypto_register_ahash(&t_alg->ahash_alg);
   2019			if (rc) {
   2020				dev_err(dev, "%s alg registration failed\n",
   2021					driver_hash[alg].driver_name);
   2022				goto fail;
   2023			}
   2024
   2025			list_add_tail(&t_alg->entry, &hash_handle->hash_list);
   2026		}
   2027		if (hw_mode == DRV_CIPHER_XCBC_MAC ||
   2028		    hw_mode == DRV_CIPHER_CMAC)
   2029			continue;
   2030
   2031		/* register hash version */
   2032		t_alg = cc_alloc_hash_alg(&driver_hash[alg], dev, false);
   2033		if (IS_ERR(t_alg)) {
   2034			rc = PTR_ERR(t_alg);
   2035			dev_err(dev, "%s alg allocation failed\n",
   2036				driver_hash[alg].driver_name);
   2037			goto fail;
   2038		}
   2039		t_alg->drvdata = drvdata;
   2040
   2041		rc = crypto_register_ahash(&t_alg->ahash_alg);
   2042		if (rc) {
   2043			dev_err(dev, "%s alg registration failed\n",
   2044				driver_hash[alg].driver_name);
   2045			goto fail;
   2046		}
   2047
   2048		list_add_tail(&t_alg->entry, &hash_handle->hash_list);
   2049	}
   2050
   2051	return 0;
   2052
   2053fail:
   2054	cc_hash_free(drvdata);
   2055	return rc;
   2056}
   2057
   2058int cc_hash_free(struct cc_drvdata *drvdata)
   2059{
   2060	struct cc_hash_alg *t_hash_alg, *hash_n;
   2061	struct cc_hash_handle *hash_handle = drvdata->hash_handle;
   2062
   2063	list_for_each_entry_safe(t_hash_alg, hash_n, &hash_handle->hash_list,
   2064				 entry) {
   2065		crypto_unregister_ahash(&t_hash_alg->ahash_alg);
   2066		list_del(&t_hash_alg->entry);
   2067	}
   2068
   2069	return 0;
   2070}
   2071
   2072static void cc_setup_xcbc(struct ahash_request *areq, struct cc_hw_desc desc[],
   2073			  unsigned int *seq_size)
   2074{
   2075	unsigned int idx = *seq_size;
   2076	struct ahash_req_ctx *state = ahash_request_ctx(areq);
   2077	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
   2078	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
   2079
   2080	/* Setup XCBC MAC K1 */
   2081	hw_desc_init(&desc[idx]);
   2082	set_din_type(&desc[idx], DMA_DLLI, (ctx->opad_tmp_keys_dma_addr +
   2083					    XCBC_MAC_K1_OFFSET),
   2084		     CC_AES_128_BIT_KEY_SIZE, NS_BIT);
   2085	set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
   2086	set_hash_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC, ctx->hash_mode);
   2087	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
   2088	set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
   2089	set_flow_mode(&desc[idx], S_DIN_to_AES);
   2090	idx++;
   2091
   2092	/* Setup XCBC MAC K2 */
   2093	hw_desc_init(&desc[idx]);
   2094	set_din_type(&desc[idx], DMA_DLLI,
   2095		     (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K2_OFFSET),
   2096		     CC_AES_128_BIT_KEY_SIZE, NS_BIT);
   2097	set_setup_mode(&desc[idx], SETUP_LOAD_STATE1);
   2098	set_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC);
   2099	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
   2100	set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
   2101	set_flow_mode(&desc[idx], S_DIN_to_AES);
   2102	idx++;
   2103
   2104	/* Setup XCBC MAC K3 */
   2105	hw_desc_init(&desc[idx]);
   2106	set_din_type(&desc[idx], DMA_DLLI,
   2107		     (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K3_OFFSET),
   2108		     CC_AES_128_BIT_KEY_SIZE, NS_BIT);
   2109	set_setup_mode(&desc[idx], SETUP_LOAD_STATE2);
   2110	set_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC);
   2111	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
   2112	set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
   2113	set_flow_mode(&desc[idx], S_DIN_to_AES);
   2114	idx++;
   2115
   2116	/* Loading MAC state */
   2117	hw_desc_init(&desc[idx]);
   2118	set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
   2119		     CC_AES_BLOCK_SIZE, NS_BIT);
   2120	set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
   2121	set_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC);
   2122	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
   2123	set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
   2124	set_flow_mode(&desc[idx], S_DIN_to_AES);
   2125	idx++;
   2126	*seq_size = idx;
   2127}
   2128
   2129static void cc_setup_cmac(struct ahash_request *areq, struct cc_hw_desc desc[],
   2130			  unsigned int *seq_size)
   2131{
   2132	unsigned int idx = *seq_size;
   2133	struct ahash_req_ctx *state = ahash_request_ctx(areq);
   2134	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
   2135	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
   2136
   2137	/* Setup CMAC Key */
   2138	hw_desc_init(&desc[idx]);
   2139	set_din_type(&desc[idx], DMA_DLLI, ctx->opad_tmp_keys_dma_addr,
   2140		     ((ctx->key_params.keylen == 24) ? AES_MAX_KEY_SIZE :
   2141		      ctx->key_params.keylen), NS_BIT);
   2142	set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
   2143	set_cipher_mode(&desc[idx], DRV_CIPHER_CMAC);
   2144	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
   2145	set_key_size_aes(&desc[idx], ctx->key_params.keylen);
   2146	set_flow_mode(&desc[idx], S_DIN_to_AES);
   2147	idx++;
   2148
   2149	/* Load MAC state */
   2150	hw_desc_init(&desc[idx]);
   2151	set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
   2152		     CC_AES_BLOCK_SIZE, NS_BIT);
   2153	set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
   2154	set_cipher_mode(&desc[idx], DRV_CIPHER_CMAC);
   2155	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
   2156	set_key_size_aes(&desc[idx], ctx->key_params.keylen);
   2157	set_flow_mode(&desc[idx], S_DIN_to_AES);
   2158	idx++;
   2159	*seq_size = idx;
   2160}
   2161
   2162static void cc_set_desc(struct ahash_req_ctx *areq_ctx,
   2163			struct cc_hash_ctx *ctx, unsigned int flow_mode,
   2164			struct cc_hw_desc desc[], bool is_not_last_data,
   2165			unsigned int *seq_size)
   2166{
   2167	unsigned int idx = *seq_size;
   2168	struct device *dev = drvdata_to_dev(ctx->drvdata);
   2169
   2170	if (areq_ctx->data_dma_buf_type == CC_DMA_BUF_DLLI) {
   2171		hw_desc_init(&desc[idx]);
   2172		set_din_type(&desc[idx], DMA_DLLI,
   2173			     sg_dma_address(areq_ctx->curr_sg),
   2174			     areq_ctx->curr_sg->length, NS_BIT);
   2175		set_flow_mode(&desc[idx], flow_mode);
   2176		idx++;
   2177	} else {
   2178		if (areq_ctx->data_dma_buf_type == CC_DMA_BUF_NULL) {
   2179			dev_dbg(dev, " NULL mode\n");
   2180			/* nothing to build */
   2181			return;
   2182		}
   2183		/* bypass */
   2184		hw_desc_init(&desc[idx]);
   2185		set_din_type(&desc[idx], DMA_DLLI,
   2186			     areq_ctx->mlli_params.mlli_dma_addr,
   2187			     areq_ctx->mlli_params.mlli_len, NS_BIT);
   2188		set_dout_sram(&desc[idx], ctx->drvdata->mlli_sram_addr,
   2189			      areq_ctx->mlli_params.mlli_len);
   2190		set_flow_mode(&desc[idx], BYPASS);
   2191		idx++;
   2192		/* process */
   2193		hw_desc_init(&desc[idx]);
   2194		set_din_type(&desc[idx], DMA_MLLI,
   2195			     ctx->drvdata->mlli_sram_addr,
   2196			     areq_ctx->mlli_nents, NS_BIT);
   2197		set_flow_mode(&desc[idx], flow_mode);
   2198		idx++;
   2199	}
   2200	if (is_not_last_data)
   2201		set_din_not_last_indication(&desc[(idx - 1)]);
   2202	/* return updated desc sequence size */
   2203	*seq_size = idx;
   2204}
   2205
   2206static const void *cc_larval_digest(struct device *dev, u32 mode)
   2207{
   2208	switch (mode) {
   2209	case DRV_HASH_MD5:
   2210		return cc_md5_init;
   2211	case DRV_HASH_SHA1:
   2212		return cc_sha1_init;
   2213	case DRV_HASH_SHA224:
   2214		return cc_sha224_init;
   2215	case DRV_HASH_SHA256:
   2216		return cc_sha256_init;
   2217	case DRV_HASH_SHA384:
   2218		return cc_sha384_init;
   2219	case DRV_HASH_SHA512:
   2220		return cc_sha512_init;
   2221	case DRV_HASH_SM3:
   2222		return cc_sm3_init;
   2223	default:
   2224		dev_err(dev, "Invalid hash mode (%d)\n", mode);
   2225		return cc_md5_init;
   2226	}
   2227}
   2228
   2229/**
   2230 * cc_larval_digest_addr() - Get the address of the initial digest in SRAM
   2231 * according to the given hash mode
   2232 *
   2233 * @drvdata: Associated device driver context
   2234 * @mode: The Hash mode. Supported modes: MD5/SHA1/SHA224/SHA256
   2235 *
   2236 * Return:
   2237 * The address of the initial digest in SRAM
   2238 */
   2239u32 cc_larval_digest_addr(void *drvdata, u32 mode)
   2240{
   2241	struct cc_drvdata *_drvdata = (struct cc_drvdata *)drvdata;
   2242	struct cc_hash_handle *hash_handle = _drvdata->hash_handle;
   2243	struct device *dev = drvdata_to_dev(_drvdata);
   2244	bool sm3_supported = (_drvdata->hw_rev >= CC_HW_REV_713);
   2245	u32 addr;
   2246
   2247	switch (mode) {
   2248	case DRV_HASH_NULL:
   2249		break; /*Ignore*/
   2250	case DRV_HASH_MD5:
   2251		return (hash_handle->larval_digest_sram_addr);
   2252	case DRV_HASH_SHA1:
   2253		return (hash_handle->larval_digest_sram_addr +
   2254			sizeof(cc_md5_init));
   2255	case DRV_HASH_SHA224:
   2256		return (hash_handle->larval_digest_sram_addr +
   2257			sizeof(cc_md5_init) +
   2258			sizeof(cc_sha1_init));
   2259	case DRV_HASH_SHA256:
   2260		return (hash_handle->larval_digest_sram_addr +
   2261			sizeof(cc_md5_init) +
   2262			sizeof(cc_sha1_init) +
   2263			sizeof(cc_sha224_init));
   2264	case DRV_HASH_SM3:
   2265		return (hash_handle->larval_digest_sram_addr +
   2266			sizeof(cc_md5_init) +
   2267			sizeof(cc_sha1_init) +
   2268			sizeof(cc_sha224_init) +
   2269			sizeof(cc_sha256_init));
   2270	case DRV_HASH_SHA384:
   2271		addr = (hash_handle->larval_digest_sram_addr +
   2272			sizeof(cc_md5_init) +
   2273			sizeof(cc_sha1_init) +
   2274			sizeof(cc_sha224_init) +
   2275			sizeof(cc_sha256_init));
   2276		if (sm3_supported)
   2277			addr += sizeof(cc_sm3_init);
   2278		return addr;
   2279	case DRV_HASH_SHA512:
   2280		addr = (hash_handle->larval_digest_sram_addr +
   2281			sizeof(cc_md5_init) +
   2282			sizeof(cc_sha1_init) +
   2283			sizeof(cc_sha224_init) +
   2284			sizeof(cc_sha256_init) +
   2285			sizeof(cc_sha384_init));
   2286		if (sm3_supported)
   2287			addr += sizeof(cc_sm3_init);
   2288		return addr;
   2289	default:
   2290		dev_err(dev, "Invalid hash mode (%d)\n", mode);
   2291	}
   2292
   2293	/*This is valid wrong value to avoid kernel crash*/
   2294	return hash_handle->larval_digest_sram_addr;
   2295}
   2296
   2297u32 cc_digest_len_addr(void *drvdata, u32 mode)
   2298{
   2299	struct cc_drvdata *_drvdata = (struct cc_drvdata *)drvdata;
   2300	struct cc_hash_handle *hash_handle = _drvdata->hash_handle;
   2301	u32 digest_len_addr = hash_handle->digest_len_sram_addr;
   2302
   2303	switch (mode) {
   2304	case DRV_HASH_SHA1:
   2305	case DRV_HASH_SHA224:
   2306	case DRV_HASH_SHA256:
   2307	case DRV_HASH_MD5:
   2308		return digest_len_addr;
   2309	case DRV_HASH_SHA384:
   2310	case DRV_HASH_SHA512:
   2311		return  digest_len_addr + sizeof(cc_digest_len_init);
   2312	default:
   2313		return digest_len_addr; /*to avoid kernel crash*/
   2314	}
   2315}