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