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_dma(req);
287	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
288	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(req);
305	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
306	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(req);
325	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
326	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(req);
345	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
346	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(req);
368	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
369	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(req);
421	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
422	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(req);
559	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
560	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(req);
635	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
636	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(req);
715	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
716	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(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_dma(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_dma(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_dma(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_dma(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_dma(__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_dma(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_dma(req);
1153	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1154	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(req);
1221	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1222	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(req);
1342	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1343	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(req);
1423	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1424	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(ahash);
1503	struct ahash_req_ctx *state = ahash_request_ctx_dma(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_dma(ahash);
1529	struct device *dev = drvdata_to_dev(ctx->drvdata);
1530	struct ahash_req_ctx *state = ahash_request_ctx_dma(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) + crypto_dma_padding();
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_dma(areq);
2077	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2078	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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_dma(areq);
2134	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2135	struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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}
2316