Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-2.6-microblaze.git] / drivers / crypto / ccree / cc_hash.c
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         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
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
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)
48 static 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) };
51 static 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
55 static const u32 cc_sm3_init[] = {
56         SM3_IVH, SM3_IVG, SM3_IVF, SM3_IVE,
57         SM3_IVD, SM3_IVC, SM3_IVB, SM3_IVA };
58
59 static void cc_setup_xcbc(struct ahash_request *areq, struct cc_hw_desc desc[],
60                           unsigned int *seq_size);
61
62 static void cc_setup_cmac(struct ahash_request *areq, struct cc_hw_desc desc[],
63                           unsigned int *seq_size);
64
65 static const void *cc_larval_digest(struct device *dev, u32 mode);
66
67 struct 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
76 struct hash_key_req_ctx {
77         u32 keylen;
78         dma_addr_t key_dma_addr;
79         u8 *key;
80 };
81
82 /* hash per-session context */
83 struct 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
103 static 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
107 static 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
117 static 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
135 static 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
178 static 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
227 unmap_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         }
233 unmap_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
243 static 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
269 static 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
283 static void cc_update_complete(struct device *dev, void *cc_req, int err)
284 {
285         struct ahash_request *req = (struct ahash_request *)cc_req;
286         struct ahash_req_ctx *state = ahash_request_ctx(req);
287         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
288         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
289
290         dev_dbg(dev, "req=%pK\n", req);
291
292         if (err != -EINPROGRESS) {
293                 /* Not a BACKLOG notification */
294                 cc_unmap_hash_request(dev, state, req->src, false);
295                 cc_unmap_req(dev, state, ctx);
296         }
297
298         ahash_request_complete(req, err);
299 }
300
301 static void cc_digest_complete(struct device *dev, void *cc_req, int err)
302 {
303         struct ahash_request *req = (struct ahash_request *)cc_req;
304         struct ahash_req_ctx *state = ahash_request_ctx(req);
305         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
306         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
307         u32 digestsize = crypto_ahash_digestsize(tfm);
308
309         dev_dbg(dev, "req=%pK\n", req);
310
311         if (err != -EINPROGRESS) {
312                 /* Not a BACKLOG notification */
313                 cc_unmap_hash_request(dev, state, req->src, false);
314                 cc_unmap_result(dev, state, digestsize, req->result);
315                 cc_unmap_req(dev, state, ctx);
316         }
317
318         ahash_request_complete(req, err);
319 }
320
321 static void cc_hash_complete(struct device *dev, void *cc_req, int err)
322 {
323         struct ahash_request *req = (struct ahash_request *)cc_req;
324         struct ahash_req_ctx *state = ahash_request_ctx(req);
325         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
326         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
327         u32 digestsize = crypto_ahash_digestsize(tfm);
328
329         dev_dbg(dev, "req=%pK\n", req);
330
331         if (err != -EINPROGRESS) {
332                 /* Not a BACKLOG notification */
333                 cc_unmap_hash_request(dev, state, req->src, false);
334                 cc_unmap_result(dev, state, digestsize, req->result);
335                 cc_unmap_req(dev, state, ctx);
336         }
337
338         ahash_request_complete(req, err);
339 }
340
341 static int cc_fin_result(struct cc_hw_desc *desc, struct ahash_request *req,
342                          int idx)
343 {
344         struct ahash_req_ctx *state = ahash_request_ctx(req);
345         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
346         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
347         u32 digestsize = crypto_ahash_digestsize(tfm);
348
349         /* Get final MAC result */
350         hw_desc_init(&desc[idx]);
351         set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
352         set_dout_dlli(&desc[idx], state->digest_result_dma_addr, digestsize,
353                       NS_BIT, 1);
354         set_queue_last_ind(ctx->drvdata, &desc[idx]);
355         set_flow_mode(&desc[idx], S_HASH_to_DOUT);
356         set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
357         set_cipher_config1(&desc[idx], HASH_PADDING_DISABLED);
358         cc_set_endianity(ctx->hash_mode, &desc[idx]);
359         idx++;
360
361         return idx;
362 }
363
364 static int cc_fin_hmac(struct cc_hw_desc *desc, struct ahash_request *req,
365                        int idx)
366 {
367         struct ahash_req_ctx *state = ahash_request_ctx(req);
368         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
369         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
370         u32 digestsize = crypto_ahash_digestsize(tfm);
371
372         /* store the hash digest result in the context */
373         hw_desc_init(&desc[idx]);
374         set_cipher_mode(&desc[idx], ctx->hw_mode);
375         set_dout_dlli(&desc[idx], state->digest_buff_dma_addr, digestsize,
376                       NS_BIT, 0);
377         set_flow_mode(&desc[idx], S_HASH_to_DOUT);
378         cc_set_endianity(ctx->hash_mode, &desc[idx]);
379         set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
380         idx++;
381
382         /* Loading hash opad xor key state */
383         hw_desc_init(&desc[idx]);
384         set_cipher_mode(&desc[idx], ctx->hw_mode);
385         set_din_type(&desc[idx], DMA_DLLI, state->opad_digest_dma_addr,
386                      ctx->inter_digestsize, NS_BIT);
387         set_flow_mode(&desc[idx], S_DIN_to_HASH);
388         set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
389         idx++;
390
391         /* Load the hash current length */
392         hw_desc_init(&desc[idx]);
393         set_cipher_mode(&desc[idx], ctx->hw_mode);
394         set_din_sram(&desc[idx],
395                      cc_digest_len_addr(ctx->drvdata, ctx->hash_mode),
396                      ctx->hash_len);
397         set_cipher_config1(&desc[idx], HASH_PADDING_ENABLED);
398         set_flow_mode(&desc[idx], S_DIN_to_HASH);
399         set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
400         idx++;
401
402         /* Memory Barrier: wait for IPAD/OPAD axi write to complete */
403         hw_desc_init(&desc[idx]);
404         set_din_no_dma(&desc[idx], 0, 0xfffff0);
405         set_dout_no_dma(&desc[idx], 0, 0, 1);
406         idx++;
407
408         /* Perform HASH update */
409         hw_desc_init(&desc[idx]);
410         set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
411                      digestsize, NS_BIT);
412         set_flow_mode(&desc[idx], DIN_HASH);
413         idx++;
414
415         return idx;
416 }
417
418 static int cc_hash_digest(struct ahash_request *req)
419 {
420         struct ahash_req_ctx *state = ahash_request_ctx(req);
421         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
422         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
423         u32 digestsize = crypto_ahash_digestsize(tfm);
424         struct scatterlist *src = req->src;
425         unsigned int nbytes = req->nbytes;
426         u8 *result = req->result;
427         struct device *dev = drvdata_to_dev(ctx->drvdata);
428         bool is_hmac = ctx->is_hmac;
429         struct cc_crypto_req cc_req = {};
430         struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
431         u32 larval_digest_addr;
432         int idx = 0;
433         int rc = 0;
434         gfp_t flags = cc_gfp_flags(&req->base);
435
436         dev_dbg(dev, "===== %s-digest (%d) ====\n", is_hmac ? "hmac" : "hash",
437                 nbytes);
438
439         cc_init_req(dev, state, ctx);
440
441         if (cc_map_req(dev, state, ctx)) {
442                 dev_err(dev, "map_ahash_source() failed\n");
443                 return -ENOMEM;
444         }
445
446         if (cc_map_result(dev, state, digestsize)) {
447                 dev_err(dev, "map_ahash_digest() failed\n");
448                 cc_unmap_req(dev, state, ctx);
449                 return -ENOMEM;
450         }
451
452         if (cc_map_hash_request_final(ctx->drvdata, state, src, nbytes, 1,
453                                       flags)) {
454                 dev_err(dev, "map_ahash_request_final() failed\n");
455                 cc_unmap_result(dev, state, digestsize, result);
456                 cc_unmap_req(dev, state, ctx);
457                 return -ENOMEM;
458         }
459
460         /* Setup request structure */
461         cc_req.user_cb = cc_digest_complete;
462         cc_req.user_arg = req;
463
464         /* If HMAC then load hash IPAD xor key, if HASH then load initial
465          * digest
466          */
467         hw_desc_init(&desc[idx]);
468         set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
469         if (is_hmac) {
470                 set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
471                              ctx->inter_digestsize, NS_BIT);
472         } else {
473                 larval_digest_addr = cc_larval_digest_addr(ctx->drvdata,
474                                                            ctx->hash_mode);
475                 set_din_sram(&desc[idx], larval_digest_addr,
476                              ctx->inter_digestsize);
477         }
478         set_flow_mode(&desc[idx], S_DIN_to_HASH);
479         set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
480         idx++;
481
482         /* Load the hash current length */
483         hw_desc_init(&desc[idx]);
484         set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
485
486         if (is_hmac) {
487                 set_din_type(&desc[idx], DMA_DLLI,
488                              state->digest_bytes_len_dma_addr,
489                              ctx->hash_len, NS_BIT);
490         } else {
491                 set_din_const(&desc[idx], 0, ctx->hash_len);
492                 if (nbytes)
493                         set_cipher_config1(&desc[idx], HASH_PADDING_ENABLED);
494                 else
495                         set_cipher_do(&desc[idx], DO_PAD);
496         }
497         set_flow_mode(&desc[idx], S_DIN_to_HASH);
498         set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
499         idx++;
500
501         cc_set_desc(state, ctx, DIN_HASH, desc, false, &idx);
502
503         if (is_hmac) {
504                 /* HW last hash block padding (aka. "DO_PAD") */
505                 hw_desc_init(&desc[idx]);
506                 set_cipher_mode(&desc[idx], ctx->hw_mode);
507                 set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
508                               ctx->hash_len, NS_BIT, 0);
509                 set_flow_mode(&desc[idx], S_HASH_to_DOUT);
510                 set_setup_mode(&desc[idx], SETUP_WRITE_STATE1);
511                 set_cipher_do(&desc[idx], DO_PAD);
512                 idx++;
513
514                 idx = cc_fin_hmac(desc, req, idx);
515         }
516
517         idx = cc_fin_result(desc, req, idx);
518
519         rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
520         if (rc != -EINPROGRESS && rc != -EBUSY) {
521                 dev_err(dev, "send_request() failed (rc=%d)\n", rc);
522                 cc_unmap_hash_request(dev, state, src, true);
523                 cc_unmap_result(dev, state, digestsize, result);
524                 cc_unmap_req(dev, state, ctx);
525         }
526         return rc;
527 }
528
529 static 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
556 static int cc_hash_update(struct ahash_request *req)
557 {
558         struct ahash_req_ctx *state = ahash_request_ctx(req);
559         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
560         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
561         unsigned int block_size = crypto_tfm_alg_blocksize(&tfm->base);
562         struct scatterlist *src = req->src;
563         unsigned int nbytes = req->nbytes;
564         struct device *dev = drvdata_to_dev(ctx->drvdata);
565         struct cc_crypto_req cc_req = {};
566         struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
567         u32 idx = 0;
568         int rc;
569         gfp_t flags = cc_gfp_flags(&req->base);
570
571         dev_dbg(dev, "===== %s-update (%d) ====\n", ctx->is_hmac ?
572                 "hmac" : "hash", nbytes);
573
574         if (nbytes == 0) {
575                 /* no real updates required */
576                 return 0;
577         }
578
579         rc = cc_map_hash_request_update(ctx->drvdata, state, src, nbytes,
580                                         block_size, flags);
581         if (rc) {
582                 if (rc == 1) {
583                         dev_dbg(dev, " data size not require HW update %x\n",
584                                 nbytes);
585                         /* No hardware updates are required */
586                         return 0;
587                 }
588                 dev_err(dev, "map_ahash_request_update() failed\n");
589                 return -ENOMEM;
590         }
591
592         if (cc_map_req(dev, state, ctx)) {
593                 dev_err(dev, "map_ahash_source() failed\n");
594                 cc_unmap_hash_request(dev, state, src, true);
595                 return -EINVAL;
596         }
597
598         /* Setup request structure */
599         cc_req.user_cb = cc_update_complete;
600         cc_req.user_arg = req;
601
602         idx = cc_restore_hash(desc, ctx, state, idx);
603
604         /* store the hash digest result in context */
605         hw_desc_init(&desc[idx]);
606         set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
607         set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
608                       ctx->inter_digestsize, NS_BIT, 0);
609         set_flow_mode(&desc[idx], S_HASH_to_DOUT);
610         set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
611         idx++;
612
613         /* store current hash length in context */
614         hw_desc_init(&desc[idx]);
615         set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
616         set_dout_dlli(&desc[idx], state->digest_bytes_len_dma_addr,
617                       ctx->hash_len, NS_BIT, 1);
618         set_queue_last_ind(ctx->drvdata, &desc[idx]);
619         set_flow_mode(&desc[idx], S_HASH_to_DOUT);
620         set_setup_mode(&desc[idx], SETUP_WRITE_STATE1);
621         idx++;
622
623         rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
624         if (rc != -EINPROGRESS && rc != -EBUSY) {
625                 dev_err(dev, "send_request() failed (rc=%d)\n", rc);
626                 cc_unmap_hash_request(dev, state, src, true);
627                 cc_unmap_req(dev, state, ctx);
628         }
629         return rc;
630 }
631
632 static int cc_do_finup(struct ahash_request *req, bool update)
633 {
634         struct ahash_req_ctx *state = ahash_request_ctx(req);
635         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
636         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
637         u32 digestsize = crypto_ahash_digestsize(tfm);
638         struct scatterlist *src = req->src;
639         unsigned int nbytes = req->nbytes;
640         u8 *result = req->result;
641         struct device *dev = drvdata_to_dev(ctx->drvdata);
642         bool is_hmac = ctx->is_hmac;
643         struct cc_crypto_req cc_req = {};
644         struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
645         unsigned int idx = 0;
646         int rc;
647         gfp_t flags = cc_gfp_flags(&req->base);
648
649         dev_dbg(dev, "===== %s-%s (%d) ====\n", is_hmac ? "hmac" : "hash",
650                 update ? "finup" : "final", nbytes);
651
652         if (cc_map_req(dev, state, ctx)) {
653                 dev_err(dev, "map_ahash_source() failed\n");
654                 return -EINVAL;
655         }
656
657         if (cc_map_hash_request_final(ctx->drvdata, state, src, nbytes, update,
658                                       flags)) {
659                 dev_err(dev, "map_ahash_request_final() failed\n");
660                 cc_unmap_req(dev, state, ctx);
661                 return -ENOMEM;
662         }
663         if (cc_map_result(dev, state, digestsize)) {
664                 dev_err(dev, "map_ahash_digest() failed\n");
665                 cc_unmap_hash_request(dev, state, src, true);
666                 cc_unmap_req(dev, state, ctx);
667                 return -ENOMEM;
668         }
669
670         /* Setup request structure */
671         cc_req.user_cb = cc_hash_complete;
672         cc_req.user_arg = req;
673
674         idx = cc_restore_hash(desc, ctx, state, idx);
675
676         /* Pad the hash */
677         hw_desc_init(&desc[idx]);
678         set_cipher_do(&desc[idx], DO_PAD);
679         set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
680         set_dout_dlli(&desc[idx], state->digest_bytes_len_dma_addr,
681                       ctx->hash_len, NS_BIT, 0);
682         set_setup_mode(&desc[idx], SETUP_WRITE_STATE1);
683         set_flow_mode(&desc[idx], S_HASH_to_DOUT);
684         idx++;
685
686         if (is_hmac)
687                 idx = cc_fin_hmac(desc, req, idx);
688
689         idx = cc_fin_result(desc, req, idx);
690
691         rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
692         if (rc != -EINPROGRESS && rc != -EBUSY) {
693                 dev_err(dev, "send_request() failed (rc=%d)\n", rc);
694                 cc_unmap_hash_request(dev, state, src, true);
695                 cc_unmap_result(dev, state, digestsize, result);
696                 cc_unmap_req(dev, state, ctx);
697         }
698         return rc;
699 }
700
701 static int cc_hash_finup(struct ahash_request *req)
702 {
703         return cc_do_finup(req, true);
704 }
705
706
707 static int cc_hash_final(struct ahash_request *req)
708 {
709         return cc_do_finup(req, false);
710 }
711
712 static int cc_hash_init(struct ahash_request *req)
713 {
714         struct ahash_req_ctx *state = ahash_request_ctx(req);
715         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
716         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
717         struct device *dev = drvdata_to_dev(ctx->drvdata);
718
719         dev_dbg(dev, "===== init (%d) ====\n", req->nbytes);
720
721         cc_init_req(dev, state, ctx);
722
723         return 0;
724 }
725
726 static int cc_hash_setkey(struct crypto_ahash *ahash, const u8 *key,
727                           unsigned int keylen)
728 {
729         unsigned int hmac_pad_const[2] = { HMAC_IPAD_CONST, HMAC_OPAD_CONST };
730         struct cc_crypto_req cc_req = {};
731         struct cc_hash_ctx *ctx = NULL;
732         int blocksize = 0;
733         int digestsize = 0;
734         int i, idx = 0, rc = 0;
735         struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
736         u32 larval_addr;
737         struct device *dev;
738
739         ctx = crypto_ahash_ctx(ahash);
740         dev = drvdata_to_dev(ctx->drvdata);
741         dev_dbg(dev, "start keylen: %d", keylen);
742
743         blocksize = crypto_tfm_alg_blocksize(&ahash->base);
744         digestsize = crypto_ahash_digestsize(ahash);
745
746         larval_addr = cc_larval_digest_addr(ctx->drvdata, ctx->hash_mode);
747
748         /* The keylen value distinguishes HASH in case keylen is ZERO bytes,
749          * any NON-ZERO value utilizes HMAC flow
750          */
751         ctx->key_params.keylen = keylen;
752         ctx->key_params.key_dma_addr = 0;
753         ctx->is_hmac = true;
754         ctx->key_params.key = NULL;
755
756         if (keylen) {
757                 ctx->key_params.key = kmemdup(key, keylen, GFP_KERNEL);
758                 if (!ctx->key_params.key)
759                         return -ENOMEM;
760
761                 ctx->key_params.key_dma_addr =
762                         dma_map_single(dev, ctx->key_params.key, keylen,
763                                        DMA_TO_DEVICE);
764                 if (dma_mapping_error(dev, ctx->key_params.key_dma_addr)) {
765                         dev_err(dev, "Mapping key va=0x%p len=%u for DMA failed\n",
766                                 ctx->key_params.key, keylen);
767                         kfree_sensitive(ctx->key_params.key);
768                         return -ENOMEM;
769                 }
770                 dev_dbg(dev, "mapping key-buffer: key_dma_addr=%pad keylen=%u\n",
771                         &ctx->key_params.key_dma_addr, ctx->key_params.keylen);
772
773                 if (keylen > blocksize) {
774                         /* Load hash initial state */
775                         hw_desc_init(&desc[idx]);
776                         set_cipher_mode(&desc[idx], ctx->hw_mode);
777                         set_din_sram(&desc[idx], larval_addr,
778                                      ctx->inter_digestsize);
779                         set_flow_mode(&desc[idx], S_DIN_to_HASH);
780                         set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
781                         idx++;
782
783                         /* Load the hash current length*/
784                         hw_desc_init(&desc[idx]);
785                         set_cipher_mode(&desc[idx], ctx->hw_mode);
786                         set_din_const(&desc[idx], 0, ctx->hash_len);
787                         set_cipher_config1(&desc[idx], HASH_PADDING_ENABLED);
788                         set_flow_mode(&desc[idx], S_DIN_to_HASH);
789                         set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
790                         idx++;
791
792                         hw_desc_init(&desc[idx]);
793                         set_din_type(&desc[idx], DMA_DLLI,
794                                      ctx->key_params.key_dma_addr, keylen,
795                                      NS_BIT);
796                         set_flow_mode(&desc[idx], DIN_HASH);
797                         idx++;
798
799                         /* Get hashed key */
800                         hw_desc_init(&desc[idx]);
801                         set_cipher_mode(&desc[idx], ctx->hw_mode);
802                         set_dout_dlli(&desc[idx], ctx->opad_tmp_keys_dma_addr,
803                                       digestsize, NS_BIT, 0);
804                         set_flow_mode(&desc[idx], S_HASH_to_DOUT);
805                         set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
806                         set_cipher_config1(&desc[idx], HASH_PADDING_DISABLED);
807                         cc_set_endianity(ctx->hash_mode, &desc[idx]);
808                         idx++;
809
810                         hw_desc_init(&desc[idx]);
811                         set_din_const(&desc[idx], 0, (blocksize - digestsize));
812                         set_flow_mode(&desc[idx], BYPASS);
813                         set_dout_dlli(&desc[idx],
814                                       (ctx->opad_tmp_keys_dma_addr +
815                                        digestsize),
816                                       (blocksize - digestsize), NS_BIT, 0);
817                         idx++;
818                 } else {
819                         hw_desc_init(&desc[idx]);
820                         set_din_type(&desc[idx], DMA_DLLI,
821                                      ctx->key_params.key_dma_addr, keylen,
822                                      NS_BIT);
823                         set_flow_mode(&desc[idx], BYPASS);
824                         set_dout_dlli(&desc[idx], ctx->opad_tmp_keys_dma_addr,
825                                       keylen, NS_BIT, 0);
826                         idx++;
827
828                         if ((blocksize - keylen)) {
829                                 hw_desc_init(&desc[idx]);
830                                 set_din_const(&desc[idx], 0,
831                                               (blocksize - keylen));
832                                 set_flow_mode(&desc[idx], BYPASS);
833                                 set_dout_dlli(&desc[idx],
834                                               (ctx->opad_tmp_keys_dma_addr +
835                                                keylen), (blocksize - keylen),
836                                               NS_BIT, 0);
837                                 idx++;
838                         }
839                 }
840         } else {
841                 hw_desc_init(&desc[idx]);
842                 set_din_const(&desc[idx], 0, blocksize);
843                 set_flow_mode(&desc[idx], BYPASS);
844                 set_dout_dlli(&desc[idx], (ctx->opad_tmp_keys_dma_addr),
845                               blocksize, NS_BIT, 0);
846                 idx++;
847         }
848
849         rc = cc_send_sync_request(ctx->drvdata, &cc_req, desc, idx);
850         if (rc) {
851                 dev_err(dev, "send_request() failed (rc=%d)\n", rc);
852                 goto out;
853         }
854
855         /* calc derived HMAC key */
856         for (idx = 0, i = 0; i < 2; i++) {
857                 /* Load hash initial state */
858                 hw_desc_init(&desc[idx]);
859                 set_cipher_mode(&desc[idx], ctx->hw_mode);
860                 set_din_sram(&desc[idx], larval_addr, ctx->inter_digestsize);
861                 set_flow_mode(&desc[idx], S_DIN_to_HASH);
862                 set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
863                 idx++;
864
865                 /* Load the hash current length*/
866                 hw_desc_init(&desc[idx]);
867                 set_cipher_mode(&desc[idx], ctx->hw_mode);
868                 set_din_const(&desc[idx], 0, ctx->hash_len);
869                 set_flow_mode(&desc[idx], S_DIN_to_HASH);
870                 set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
871                 idx++;
872
873                 /* Prepare ipad key */
874                 hw_desc_init(&desc[idx]);
875                 set_xor_val(&desc[idx], hmac_pad_const[i]);
876                 set_cipher_mode(&desc[idx], ctx->hw_mode);
877                 set_flow_mode(&desc[idx], S_DIN_to_HASH);
878                 set_setup_mode(&desc[idx], SETUP_LOAD_STATE1);
879                 idx++;
880
881                 /* Perform HASH update */
882                 hw_desc_init(&desc[idx]);
883                 set_din_type(&desc[idx], DMA_DLLI, ctx->opad_tmp_keys_dma_addr,
884                              blocksize, NS_BIT);
885                 set_cipher_mode(&desc[idx], ctx->hw_mode);
886                 set_xor_active(&desc[idx]);
887                 set_flow_mode(&desc[idx], DIN_HASH);
888                 idx++;
889
890                 /* Get the IPAD/OPAD xor key (Note, IPAD is the initial digest
891                  * of the first HASH "update" state)
892                  */
893                 hw_desc_init(&desc[idx]);
894                 set_cipher_mode(&desc[idx], ctx->hw_mode);
895                 if (i > 0) /* Not first iteration */
896                         set_dout_dlli(&desc[idx], ctx->opad_tmp_keys_dma_addr,
897                                       ctx->inter_digestsize, NS_BIT, 0);
898                 else /* First iteration */
899                         set_dout_dlli(&desc[idx], ctx->digest_buff_dma_addr,
900                                       ctx->inter_digestsize, NS_BIT, 0);
901                 set_flow_mode(&desc[idx], S_HASH_to_DOUT);
902                 set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
903                 idx++;
904         }
905
906         rc = cc_send_sync_request(ctx->drvdata, &cc_req, desc, idx);
907
908 out:
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
921 static int cc_xcbc_setkey(struct crypto_ahash *ahash,
922                           const u8 *key, unsigned int keylen)
923 {
924         struct cc_crypto_req cc_req = {};
925         struct cc_hash_ctx *ctx = crypto_ahash_ctx(ahash);
926         struct device *dev = drvdata_to_dev(ctx->drvdata);
927         int rc = 0;
928         unsigned int idx = 0;
929         struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
930
931         dev_dbg(dev, "===== setkey (%d) ====\n", keylen);
932
933         switch (keylen) {
934         case AES_KEYSIZE_128:
935         case AES_KEYSIZE_192:
936         case AES_KEYSIZE_256:
937                 break;
938         default:
939                 return -EINVAL;
940         }
941
942         ctx->key_params.keylen = keylen;
943
944         ctx->key_params.key = kmemdup(key, keylen, GFP_KERNEL);
945         if (!ctx->key_params.key)
946                 return -ENOMEM;
947
948         ctx->key_params.key_dma_addr =
949                 dma_map_single(dev, ctx->key_params.key, keylen, DMA_TO_DEVICE);
950         if (dma_mapping_error(dev, ctx->key_params.key_dma_addr)) {
951                 dev_err(dev, "Mapping key va=0x%p len=%u for DMA failed\n",
952                         key, keylen);
953                 kfree_sensitive(ctx->key_params.key);
954                 return -ENOMEM;
955         }
956         dev_dbg(dev, "mapping key-buffer: key_dma_addr=%pad keylen=%u\n",
957                 &ctx->key_params.key_dma_addr, ctx->key_params.keylen);
958
959         ctx->is_hmac = true;
960         /* 1. Load the AES key */
961         hw_desc_init(&desc[idx]);
962         set_din_type(&desc[idx], DMA_DLLI, ctx->key_params.key_dma_addr,
963                      keylen, NS_BIT);
964         set_cipher_mode(&desc[idx], DRV_CIPHER_ECB);
965         set_cipher_config0(&desc[idx], DRV_CRYPTO_DIRECTION_ENCRYPT);
966         set_key_size_aes(&desc[idx], keylen);
967         set_flow_mode(&desc[idx], S_DIN_to_AES);
968         set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
969         idx++;
970
971         hw_desc_init(&desc[idx]);
972         set_din_const(&desc[idx], 0x01010101, CC_AES_128_BIT_KEY_SIZE);
973         set_flow_mode(&desc[idx], DIN_AES_DOUT);
974         set_dout_dlli(&desc[idx],
975                       (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K1_OFFSET),
976                       CC_AES_128_BIT_KEY_SIZE, NS_BIT, 0);
977         idx++;
978
979         hw_desc_init(&desc[idx]);
980         set_din_const(&desc[idx], 0x02020202, CC_AES_128_BIT_KEY_SIZE);
981         set_flow_mode(&desc[idx], DIN_AES_DOUT);
982         set_dout_dlli(&desc[idx],
983                       (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K2_OFFSET),
984                       CC_AES_128_BIT_KEY_SIZE, NS_BIT, 0);
985         idx++;
986
987         hw_desc_init(&desc[idx]);
988         set_din_const(&desc[idx], 0x03030303, CC_AES_128_BIT_KEY_SIZE);
989         set_flow_mode(&desc[idx], DIN_AES_DOUT);
990         set_dout_dlli(&desc[idx],
991                       (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K3_OFFSET),
992                       CC_AES_128_BIT_KEY_SIZE, NS_BIT, 0);
993         idx++;
994
995         rc = cc_send_sync_request(ctx->drvdata, &cc_req, desc, idx);
996
997         dma_unmap_single(dev, ctx->key_params.key_dma_addr,
998                          ctx->key_params.keylen, DMA_TO_DEVICE);
999         dev_dbg(dev, "Unmapped key-buffer: key_dma_addr=%pad keylen=%u\n",
1000                 &ctx->key_params.key_dma_addr, ctx->key_params.keylen);
1001
1002         kfree_sensitive(ctx->key_params.key);
1003
1004         return rc;
1005 }
1006
1007 static int cc_cmac_setkey(struct crypto_ahash *ahash,
1008                           const u8 *key, unsigned int keylen)
1009 {
1010         struct cc_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1011         struct device *dev = drvdata_to_dev(ctx->drvdata);
1012
1013         dev_dbg(dev, "===== setkey (%d) ====\n", keylen);
1014
1015         ctx->is_hmac = true;
1016
1017         switch (keylen) {
1018         case AES_KEYSIZE_128:
1019         case AES_KEYSIZE_192:
1020         case AES_KEYSIZE_256:
1021                 break;
1022         default:
1023                 return -EINVAL;
1024         }
1025
1026         ctx->key_params.keylen = keylen;
1027
1028         /* STAT_PHASE_1: Copy key to ctx */
1029
1030         dma_sync_single_for_cpu(dev, ctx->opad_tmp_keys_dma_addr,
1031                                 keylen, DMA_TO_DEVICE);
1032
1033         memcpy(ctx->opad_tmp_keys_buff, key, keylen);
1034         if (keylen == 24) {
1035                 memset(ctx->opad_tmp_keys_buff + 24, 0,
1036                        CC_AES_KEY_SIZE_MAX - 24);
1037         }
1038
1039         dma_sync_single_for_device(dev, ctx->opad_tmp_keys_dma_addr,
1040                                    keylen, DMA_TO_DEVICE);
1041
1042         ctx->key_params.keylen = keylen;
1043
1044         return 0;
1045 }
1046
1047 static 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
1070 static 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
1105 fail:
1106         cc_free_ctx(ctx);
1107         return -ENOMEM;
1108 }
1109
1110 static int cc_get_hash_len(struct crypto_tfm *tfm)
1111 {
1112         struct cc_hash_ctx *ctx = crypto_tfm_ctx(tfm);
1113
1114         if (ctx->hash_mode == DRV_HASH_SM3)
1115                 return CC_SM3_HASH_LEN_SIZE;
1116         else
1117                 return cc_get_default_hash_len(ctx->drvdata);
1118 }
1119
1120 static int cc_cra_init(struct crypto_tfm *tfm)
1121 {
1122         struct cc_hash_ctx *ctx = crypto_tfm_ctx(tfm);
1123         struct hash_alg_common *hash_alg_common =
1124                 container_of(tfm->__crt_alg, struct hash_alg_common, base);
1125         struct ahash_alg *ahash_alg =
1126                 container_of(hash_alg_common, struct ahash_alg, halg);
1127         struct cc_hash_alg *cc_alg =
1128                         container_of(ahash_alg, struct cc_hash_alg, ahash_alg);
1129
1130         crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
1131                                  sizeof(struct ahash_req_ctx));
1132
1133         ctx->hash_mode = cc_alg->hash_mode;
1134         ctx->hw_mode = cc_alg->hw_mode;
1135         ctx->inter_digestsize = cc_alg->inter_digestsize;
1136         ctx->drvdata = cc_alg->drvdata;
1137         ctx->hash_len = cc_get_hash_len(tfm);
1138         return cc_alloc_ctx(ctx);
1139 }
1140
1141 static void cc_cra_exit(struct crypto_tfm *tfm)
1142 {
1143         struct cc_hash_ctx *ctx = crypto_tfm_ctx(tfm);
1144         struct device *dev = drvdata_to_dev(ctx->drvdata);
1145
1146         dev_dbg(dev, "cc_cra_exit");
1147         cc_free_ctx(ctx);
1148 }
1149
1150 static int cc_mac_update(struct ahash_request *req)
1151 {
1152         struct ahash_req_ctx *state = ahash_request_ctx(req);
1153         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1154         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
1155         struct device *dev = drvdata_to_dev(ctx->drvdata);
1156         unsigned int block_size = crypto_tfm_alg_blocksize(&tfm->base);
1157         struct cc_crypto_req cc_req = {};
1158         struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
1159         int rc;
1160         u32 idx = 0;
1161         gfp_t flags = cc_gfp_flags(&req->base);
1162
1163         if (req->nbytes == 0) {
1164                 /* no real updates required */
1165                 return 0;
1166         }
1167
1168         state->xcbc_count++;
1169
1170         rc = cc_map_hash_request_update(ctx->drvdata, state, req->src,
1171                                         req->nbytes, block_size, flags);
1172         if (rc) {
1173                 if (rc == 1) {
1174                         dev_dbg(dev, " data size not require HW update %x\n",
1175                                 req->nbytes);
1176                         /* No hardware updates are required */
1177                         return 0;
1178                 }
1179                 dev_err(dev, "map_ahash_request_update() failed\n");
1180                 return -ENOMEM;
1181         }
1182
1183         if (cc_map_req(dev, state, ctx)) {
1184                 dev_err(dev, "map_ahash_source() failed\n");
1185                 return -EINVAL;
1186         }
1187
1188         if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC)
1189                 cc_setup_xcbc(req, desc, &idx);
1190         else
1191                 cc_setup_cmac(req, desc, &idx);
1192
1193         cc_set_desc(state, ctx, DIN_AES_DOUT, desc, true, &idx);
1194
1195         /* store the hash digest result in context */
1196         hw_desc_init(&desc[idx]);
1197         set_cipher_mode(&desc[idx], ctx->hw_mode);
1198         set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
1199                       ctx->inter_digestsize, NS_BIT, 1);
1200         set_queue_last_ind(ctx->drvdata, &desc[idx]);
1201         set_flow_mode(&desc[idx], S_AES_to_DOUT);
1202         set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
1203         idx++;
1204
1205         /* Setup request structure */
1206         cc_req.user_cb = cc_update_complete;
1207         cc_req.user_arg = req;
1208
1209         rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
1210         if (rc != -EINPROGRESS && rc != -EBUSY) {
1211                 dev_err(dev, "send_request() failed (rc=%d)\n", rc);
1212                 cc_unmap_hash_request(dev, state, req->src, true);
1213                 cc_unmap_req(dev, state, ctx);
1214         }
1215         return rc;
1216 }
1217
1218 static int cc_mac_final(struct ahash_request *req)
1219 {
1220         struct ahash_req_ctx *state = ahash_request_ctx(req);
1221         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1222         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
1223         struct device *dev = drvdata_to_dev(ctx->drvdata);
1224         struct cc_crypto_req cc_req = {};
1225         struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
1226         int idx = 0;
1227         int rc = 0;
1228         u32 key_size, key_len;
1229         u32 digestsize = crypto_ahash_digestsize(tfm);
1230         gfp_t flags = cc_gfp_flags(&req->base);
1231         u32 rem_cnt = *cc_hash_buf_cnt(state);
1232
1233         if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC) {
1234                 key_size = CC_AES_128_BIT_KEY_SIZE;
1235                 key_len  = CC_AES_128_BIT_KEY_SIZE;
1236         } else {
1237                 key_size = (ctx->key_params.keylen == 24) ? AES_MAX_KEY_SIZE :
1238                         ctx->key_params.keylen;
1239                 key_len =  ctx->key_params.keylen;
1240         }
1241
1242         dev_dbg(dev, "===== final  xcbc reminder (%d) ====\n", rem_cnt);
1243
1244         if (cc_map_req(dev, state, ctx)) {
1245                 dev_err(dev, "map_ahash_source() failed\n");
1246                 return -EINVAL;
1247         }
1248
1249         if (cc_map_hash_request_final(ctx->drvdata, state, req->src,
1250                                       req->nbytes, 0, flags)) {
1251                 dev_err(dev, "map_ahash_request_final() failed\n");
1252                 cc_unmap_req(dev, state, ctx);
1253                 return -ENOMEM;
1254         }
1255
1256         if (cc_map_result(dev, state, digestsize)) {
1257                 dev_err(dev, "map_ahash_digest() failed\n");
1258                 cc_unmap_hash_request(dev, state, req->src, true);
1259                 cc_unmap_req(dev, state, ctx);
1260                 return -ENOMEM;
1261         }
1262
1263         /* Setup request structure */
1264         cc_req.user_cb = cc_hash_complete;
1265         cc_req.user_arg = req;
1266
1267         if (state->xcbc_count && rem_cnt == 0) {
1268                 /* Load key for ECB decryption */
1269                 hw_desc_init(&desc[idx]);
1270                 set_cipher_mode(&desc[idx], DRV_CIPHER_ECB);
1271                 set_cipher_config0(&desc[idx], DRV_CRYPTO_DIRECTION_DECRYPT);
1272                 set_din_type(&desc[idx], DMA_DLLI,
1273                              (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K1_OFFSET),
1274                              key_size, NS_BIT);
1275                 set_key_size_aes(&desc[idx], key_len);
1276                 set_flow_mode(&desc[idx], S_DIN_to_AES);
1277                 set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
1278                 idx++;
1279
1280                 /* Initiate decryption of block state to previous
1281                  * block_state-XOR-M[n]
1282                  */
1283                 hw_desc_init(&desc[idx]);
1284                 set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
1285                              CC_AES_BLOCK_SIZE, NS_BIT);
1286                 set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
1287                               CC_AES_BLOCK_SIZE, NS_BIT, 0);
1288                 set_flow_mode(&desc[idx], DIN_AES_DOUT);
1289                 idx++;
1290
1291                 /* Memory Barrier: wait for axi write to complete */
1292                 hw_desc_init(&desc[idx]);
1293                 set_din_no_dma(&desc[idx], 0, 0xfffff0);
1294                 set_dout_no_dma(&desc[idx], 0, 0, 1);
1295                 idx++;
1296         }
1297
1298         if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC)
1299                 cc_setup_xcbc(req, desc, &idx);
1300         else
1301                 cc_setup_cmac(req, desc, &idx);
1302
1303         if (state->xcbc_count == 0) {
1304                 hw_desc_init(&desc[idx]);
1305                 set_cipher_mode(&desc[idx], ctx->hw_mode);
1306                 set_key_size_aes(&desc[idx], key_len);
1307                 set_cmac_size0_mode(&desc[idx]);
1308                 set_flow_mode(&desc[idx], S_DIN_to_AES);
1309                 idx++;
1310         } else if (rem_cnt > 0) {
1311                 cc_set_desc(state, ctx, DIN_AES_DOUT, desc, false, &idx);
1312         } else {
1313                 hw_desc_init(&desc[idx]);
1314                 set_din_const(&desc[idx], 0x00, CC_AES_BLOCK_SIZE);
1315                 set_flow_mode(&desc[idx], DIN_AES_DOUT);
1316                 idx++;
1317         }
1318
1319         /* Get final MAC result */
1320         hw_desc_init(&desc[idx]);
1321         set_dout_dlli(&desc[idx], state->digest_result_dma_addr,
1322                       digestsize, NS_BIT, 1);
1323         set_queue_last_ind(ctx->drvdata, &desc[idx]);
1324         set_flow_mode(&desc[idx], S_AES_to_DOUT);
1325         set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
1326         set_cipher_mode(&desc[idx], ctx->hw_mode);
1327         idx++;
1328
1329         rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
1330         if (rc != -EINPROGRESS && rc != -EBUSY) {
1331                 dev_err(dev, "send_request() failed (rc=%d)\n", rc);
1332                 cc_unmap_hash_request(dev, state, req->src, true);
1333                 cc_unmap_result(dev, state, digestsize, req->result);
1334                 cc_unmap_req(dev, state, ctx);
1335         }
1336         return rc;
1337 }
1338
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 = 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
1420 static int cc_mac_digest(struct ahash_request *req)
1421 {
1422         struct ahash_req_ctx *state = ahash_request_ctx(req);
1423         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1424         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
1425         struct device *dev = drvdata_to_dev(ctx->drvdata);
1426         u32 digestsize = crypto_ahash_digestsize(tfm);
1427         struct cc_crypto_req cc_req = {};
1428         struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
1429         u32 key_len;
1430         unsigned int idx = 0;
1431         int rc;
1432         gfp_t flags = cc_gfp_flags(&req->base);
1433
1434         dev_dbg(dev, "===== -digest mac (%d) ====\n",  req->nbytes);
1435
1436         cc_init_req(dev, state, ctx);
1437
1438         if (cc_map_req(dev, state, ctx)) {
1439                 dev_err(dev, "map_ahash_source() failed\n");
1440                 return -ENOMEM;
1441         }
1442         if (cc_map_result(dev, state, digestsize)) {
1443                 dev_err(dev, "map_ahash_digest() failed\n");
1444                 cc_unmap_req(dev, state, ctx);
1445                 return -ENOMEM;
1446         }
1447
1448         if (cc_map_hash_request_final(ctx->drvdata, state, req->src,
1449                                       req->nbytes, 1, flags)) {
1450                 dev_err(dev, "map_ahash_request_final() failed\n");
1451                 cc_unmap_req(dev, state, ctx);
1452                 return -ENOMEM;
1453         }
1454
1455         /* Setup request structure */
1456         cc_req.user_cb = cc_digest_complete;
1457         cc_req.user_arg = req;
1458
1459         if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC) {
1460                 key_len = CC_AES_128_BIT_KEY_SIZE;
1461                 cc_setup_xcbc(req, desc, &idx);
1462         } else {
1463                 key_len = ctx->key_params.keylen;
1464                 cc_setup_cmac(req, desc, &idx);
1465         }
1466
1467         if (req->nbytes == 0) {
1468                 hw_desc_init(&desc[idx]);
1469                 set_cipher_mode(&desc[idx], ctx->hw_mode);
1470                 set_key_size_aes(&desc[idx], key_len);
1471                 set_cmac_size0_mode(&desc[idx]);
1472                 set_flow_mode(&desc[idx], S_DIN_to_AES);
1473                 idx++;
1474         } else {
1475                 cc_set_desc(state, ctx, DIN_AES_DOUT, desc, false, &idx);
1476         }
1477
1478         /* Get final MAC result */
1479         hw_desc_init(&desc[idx]);
1480         set_dout_dlli(&desc[idx], state->digest_result_dma_addr,
1481                       CC_AES_BLOCK_SIZE, NS_BIT, 1);
1482         set_queue_last_ind(ctx->drvdata, &desc[idx]);
1483         set_flow_mode(&desc[idx], S_AES_to_DOUT);
1484         set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
1485         set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
1486         set_cipher_mode(&desc[idx], ctx->hw_mode);
1487         idx++;
1488
1489         rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
1490         if (rc != -EINPROGRESS && rc != -EBUSY) {
1491                 dev_err(dev, "send_request() failed (rc=%d)\n", rc);
1492                 cc_unmap_hash_request(dev, state, req->src, true);
1493                 cc_unmap_result(dev, state, digestsize, req->result);
1494                 cc_unmap_req(dev, state, ctx);
1495         }
1496         return rc;
1497 }
1498
1499 static int cc_hash_export(struct ahash_request *req, void *out)
1500 {
1501         struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
1502         struct cc_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1503         struct ahash_req_ctx *state = ahash_request_ctx(req);
1504         u8 *curr_buff = cc_hash_buf(state);
1505         u32 curr_buff_cnt = *cc_hash_buf_cnt(state);
1506         const u32 tmp = CC_EXPORT_MAGIC;
1507
1508         memcpy(out, &tmp, sizeof(u32));
1509         out += sizeof(u32);
1510
1511         memcpy(out, state->digest_buff, ctx->inter_digestsize);
1512         out += ctx->inter_digestsize;
1513
1514         memcpy(out, state->digest_bytes_len, ctx->hash_len);
1515         out += ctx->hash_len;
1516
1517         memcpy(out, &curr_buff_cnt, sizeof(u32));
1518         out += sizeof(u32);
1519
1520         memcpy(out, curr_buff, curr_buff_cnt);
1521
1522         return 0;
1523 }
1524
1525 static int cc_hash_import(struct ahash_request *req, const void *in)
1526 {
1527         struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
1528         struct cc_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1529         struct device *dev = drvdata_to_dev(ctx->drvdata);
1530         struct ahash_req_ctx *state = ahash_request_ctx(req);
1531         u32 tmp;
1532
1533         memcpy(&tmp, in, sizeof(u32));
1534         if (tmp != CC_EXPORT_MAGIC)
1535                 return -EINVAL;
1536         in += sizeof(u32);
1537
1538         cc_init_req(dev, state, ctx);
1539
1540         memcpy(state->digest_buff, in, ctx->inter_digestsize);
1541         in += ctx->inter_digestsize;
1542
1543         memcpy(state->digest_bytes_len, in, ctx->hash_len);
1544         in += ctx->hash_len;
1545
1546         /* Sanity check the data as much as possible */
1547         memcpy(&tmp, in, sizeof(u32));
1548         if (tmp > CC_MAX_HASH_BLCK_SIZE)
1549                 return -EINVAL;
1550         in += sizeof(u32);
1551
1552         state->buf_cnt[0] = tmp;
1553         memcpy(state->buffers[0], in, tmp);
1554
1555         return 0;
1556 }
1557
1558 struct 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 */
1579 static 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
1821 static struct cc_hash_alg *cc_alloc_hash_alg(struct cc_hash_template *template,
1822                                              struct device *dev, bool keyed)
1823 {
1824         struct cc_hash_alg *t_crypto_alg;
1825         struct crypto_alg *alg;
1826         struct ahash_alg *halg;
1827
1828         t_crypto_alg = devm_kzalloc(dev, sizeof(*t_crypto_alg), GFP_KERNEL);
1829         if (!t_crypto_alg)
1830                 return ERR_PTR(-ENOMEM);
1831
1832         t_crypto_alg->ahash_alg = template->template_ahash;
1833         halg = &t_crypto_alg->ahash_alg;
1834         alg = &halg->halg.base;
1835
1836         if (keyed) {
1837                 snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
1838                          template->mac_name);
1839                 snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
1840                          template->mac_driver_name);
1841         } else {
1842                 halg->setkey = NULL;
1843                 snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
1844                          template->name);
1845                 snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
1846                          template->driver_name);
1847         }
1848         alg->cra_module = THIS_MODULE;
1849         alg->cra_ctxsize = sizeof(struct cc_hash_ctx);
1850         alg->cra_priority = CC_CRA_PRIO;
1851         alg->cra_blocksize = template->blocksize;
1852         alg->cra_alignmask = 0;
1853         alg->cra_exit = cc_cra_exit;
1854
1855         alg->cra_init = cc_cra_init;
1856         alg->cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY;
1857
1858         t_crypto_alg->hash_mode = template->hash_mode;
1859         t_crypto_alg->hw_mode = template->hw_mode;
1860         t_crypto_alg->inter_digestsize = template->inter_digestsize;
1861
1862         return t_crypto_alg;
1863 }
1864
1865 static 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
1882 int 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
1948 init_digest_const_err:
1949         return rc;
1950 }
1951
1952 int 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
2053 fail:
2054         cc_hash_free(drvdata);
2055         return rc;
2056 }
2057
2058 int 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
2072 static void cc_setup_xcbc(struct ahash_request *areq, struct cc_hw_desc desc[],
2073                           unsigned int *seq_size)
2074 {
2075         unsigned int idx = *seq_size;
2076         struct ahash_req_ctx *state = ahash_request_ctx(areq);
2077         struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2078         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
2079
2080         /* Setup XCBC MAC K1 */
2081         hw_desc_init(&desc[idx]);
2082         set_din_type(&desc[idx], DMA_DLLI, (ctx->opad_tmp_keys_dma_addr +
2083                                             XCBC_MAC_K1_OFFSET),
2084                      CC_AES_128_BIT_KEY_SIZE, NS_BIT);
2085         set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
2086         set_hash_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC, ctx->hash_mode);
2087         set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
2088         set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
2089         set_flow_mode(&desc[idx], S_DIN_to_AES);
2090         idx++;
2091
2092         /* Setup XCBC MAC K2 */
2093         hw_desc_init(&desc[idx]);
2094         set_din_type(&desc[idx], DMA_DLLI,
2095                      (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K2_OFFSET),
2096                      CC_AES_128_BIT_KEY_SIZE, NS_BIT);
2097         set_setup_mode(&desc[idx], SETUP_LOAD_STATE1);
2098         set_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC);
2099         set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
2100         set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
2101         set_flow_mode(&desc[idx], S_DIN_to_AES);
2102         idx++;
2103
2104         /* Setup XCBC MAC K3 */
2105         hw_desc_init(&desc[idx]);
2106         set_din_type(&desc[idx], DMA_DLLI,
2107                      (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K3_OFFSET),
2108                      CC_AES_128_BIT_KEY_SIZE, NS_BIT);
2109         set_setup_mode(&desc[idx], SETUP_LOAD_STATE2);
2110         set_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC);
2111         set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
2112         set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
2113         set_flow_mode(&desc[idx], S_DIN_to_AES);
2114         idx++;
2115
2116         /* Loading MAC state */
2117         hw_desc_init(&desc[idx]);
2118         set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
2119                      CC_AES_BLOCK_SIZE, NS_BIT);
2120         set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
2121         set_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC);
2122         set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
2123         set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
2124         set_flow_mode(&desc[idx], S_DIN_to_AES);
2125         idx++;
2126         *seq_size = idx;
2127 }
2128
2129 static void cc_setup_cmac(struct ahash_request *areq, struct cc_hw_desc desc[],
2130                           unsigned int *seq_size)
2131 {
2132         unsigned int idx = *seq_size;
2133         struct ahash_req_ctx *state = ahash_request_ctx(areq);
2134         struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2135         struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
2136
2137         /* Setup CMAC Key */
2138         hw_desc_init(&desc[idx]);
2139         set_din_type(&desc[idx], DMA_DLLI, ctx->opad_tmp_keys_dma_addr,
2140                      ((ctx->key_params.keylen == 24) ? AES_MAX_KEY_SIZE :
2141                       ctx->key_params.keylen), NS_BIT);
2142         set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
2143         set_cipher_mode(&desc[idx], DRV_CIPHER_CMAC);
2144         set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
2145         set_key_size_aes(&desc[idx], ctx->key_params.keylen);
2146         set_flow_mode(&desc[idx], S_DIN_to_AES);
2147         idx++;
2148
2149         /* Load MAC state */
2150         hw_desc_init(&desc[idx]);
2151         set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
2152                      CC_AES_BLOCK_SIZE, NS_BIT);
2153         set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
2154         set_cipher_mode(&desc[idx], DRV_CIPHER_CMAC);
2155         set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
2156         set_key_size_aes(&desc[idx], ctx->key_params.keylen);
2157         set_flow_mode(&desc[idx], S_DIN_to_AES);
2158         idx++;
2159         *seq_size = idx;
2160 }
2161
2162 static 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
2206 static 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  */
2239 u32 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
2297 u32 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 }