Merge branch 'linux-4.20' of git://github.com/skeggsb/linux into drm-fixes
[linux] / drivers / crypto / sahara.c
1 /*
2  * Cryptographic API.
3  *
4  * Support for SAHARA cryptographic accelerator.
5  *
6  * Copyright (c) 2014 Steffen Trumtrar <s.trumtrar@pengutronix.de>
7  * Copyright (c) 2013 Vista Silicon S.L.
8  * Author: Javier Martin <javier.martin@vista-silicon.com>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as published
12  * by the Free Software Foundation.
13  *
14  * Based on omap-aes.c and tegra-aes.c
15  */
16
17 #include <crypto/aes.h>
18 #include <crypto/internal/hash.h>
19 #include <crypto/internal/skcipher.h>
20 #include <crypto/scatterwalk.h>
21 #include <crypto/sha.h>
22
23 #include <linux/clk.h>
24 #include <linux/crypto.h>
25 #include <linux/interrupt.h>
26 #include <linux/io.h>
27 #include <linux/irq.h>
28 #include <linux/kernel.h>
29 #include <linux/kthread.h>
30 #include <linux/module.h>
31 #include <linux/mutex.h>
32 #include <linux/of.h>
33 #include <linux/of_device.h>
34 #include <linux/platform_device.h>
35
36 #define SHA_BUFFER_LEN          PAGE_SIZE
37 #define SAHARA_MAX_SHA_BLOCK_SIZE       SHA256_BLOCK_SIZE
38
39 #define SAHARA_NAME "sahara"
40 #define SAHARA_VERSION_3        3
41 #define SAHARA_VERSION_4        4
42 #define SAHARA_TIMEOUT_MS       1000
43 #define SAHARA_MAX_HW_DESC      2
44 #define SAHARA_MAX_HW_LINK      20
45
46 #define FLAGS_MODE_MASK         0x000f
47 #define FLAGS_ENCRYPT           BIT(0)
48 #define FLAGS_CBC               BIT(1)
49 #define FLAGS_NEW_KEY           BIT(3)
50
51 #define SAHARA_HDR_BASE                 0x00800000
52 #define SAHARA_HDR_SKHA_ALG_AES 0
53 #define SAHARA_HDR_SKHA_OP_ENC          (1 << 2)
54 #define SAHARA_HDR_SKHA_MODE_ECB        (0 << 3)
55 #define SAHARA_HDR_SKHA_MODE_CBC        (1 << 3)
56 #define SAHARA_HDR_FORM_DATA            (5 << 16)
57 #define SAHARA_HDR_FORM_KEY             (8 << 16)
58 #define SAHARA_HDR_LLO                  (1 << 24)
59 #define SAHARA_HDR_CHA_SKHA             (1 << 28)
60 #define SAHARA_HDR_CHA_MDHA             (2 << 28)
61 #define SAHARA_HDR_PARITY_BIT           (1 << 31)
62
63 #define SAHARA_HDR_MDHA_SET_MODE_MD_KEY 0x20880000
64 #define SAHARA_HDR_MDHA_SET_MODE_HASH   0x208D0000
65 #define SAHARA_HDR_MDHA_HASH            0xA0850000
66 #define SAHARA_HDR_MDHA_STORE_DIGEST    0x20820000
67 #define SAHARA_HDR_MDHA_ALG_SHA1        0
68 #define SAHARA_HDR_MDHA_ALG_MD5         1
69 #define SAHARA_HDR_MDHA_ALG_SHA256      2
70 #define SAHARA_HDR_MDHA_ALG_SHA224      3
71 #define SAHARA_HDR_MDHA_PDATA           (1 << 2)
72 #define SAHARA_HDR_MDHA_HMAC            (1 << 3)
73 #define SAHARA_HDR_MDHA_INIT            (1 << 5)
74 #define SAHARA_HDR_MDHA_IPAD            (1 << 6)
75 #define SAHARA_HDR_MDHA_OPAD            (1 << 7)
76 #define SAHARA_HDR_MDHA_SWAP            (1 << 8)
77 #define SAHARA_HDR_MDHA_MAC_FULL        (1 << 9)
78 #define SAHARA_HDR_MDHA_SSL             (1 << 10)
79
80 /* SAHARA can only process one request at a time */
81 #define SAHARA_QUEUE_LENGTH     1
82
83 #define SAHARA_REG_VERSION      0x00
84 #define SAHARA_REG_DAR          0x04
85 #define SAHARA_REG_CONTROL      0x08
86 #define         SAHARA_CONTROL_SET_THROTTLE(x)  (((x) & 0xff) << 24)
87 #define         SAHARA_CONTROL_SET_MAXBURST(x)  (((x) & 0xff) << 16)
88 #define         SAHARA_CONTROL_RNG_AUTORSD      (1 << 7)
89 #define         SAHARA_CONTROL_ENABLE_INT       (1 << 4)
90 #define SAHARA_REG_CMD          0x0C
91 #define         SAHARA_CMD_RESET                (1 << 0)
92 #define         SAHARA_CMD_CLEAR_INT            (1 << 8)
93 #define         SAHARA_CMD_CLEAR_ERR            (1 << 9)
94 #define         SAHARA_CMD_SINGLE_STEP          (1 << 10)
95 #define         SAHARA_CMD_MODE_BATCH           (1 << 16)
96 #define         SAHARA_CMD_MODE_DEBUG           (1 << 18)
97 #define SAHARA_REG_STATUS       0x10
98 #define         SAHARA_STATUS_GET_STATE(x)      ((x) & 0x7)
99 #define                 SAHARA_STATE_IDLE       0
100 #define                 SAHARA_STATE_BUSY       1
101 #define                 SAHARA_STATE_ERR        2
102 #define                 SAHARA_STATE_FAULT      3
103 #define                 SAHARA_STATE_COMPLETE   4
104 #define                 SAHARA_STATE_COMP_FLAG  (1 << 2)
105 #define         SAHARA_STATUS_DAR_FULL          (1 << 3)
106 #define         SAHARA_STATUS_ERROR             (1 << 4)
107 #define         SAHARA_STATUS_SECURE            (1 << 5)
108 #define         SAHARA_STATUS_FAIL              (1 << 6)
109 #define         SAHARA_STATUS_INIT              (1 << 7)
110 #define         SAHARA_STATUS_RNG_RESEED        (1 << 8)
111 #define         SAHARA_STATUS_ACTIVE_RNG        (1 << 9)
112 #define         SAHARA_STATUS_ACTIVE_MDHA       (1 << 10)
113 #define         SAHARA_STATUS_ACTIVE_SKHA       (1 << 11)
114 #define         SAHARA_STATUS_MODE_BATCH        (1 << 16)
115 #define         SAHARA_STATUS_MODE_DEDICATED    (1 << 17)
116 #define         SAHARA_STATUS_MODE_DEBUG        (1 << 18)
117 #define         SAHARA_STATUS_GET_ISTATE(x)     (((x) >> 24) & 0xff)
118 #define SAHARA_REG_ERRSTATUS    0x14
119 #define         SAHARA_ERRSTATUS_GET_SOURCE(x)  ((x) & 0xf)
120 #define                 SAHARA_ERRSOURCE_CHA    14
121 #define                 SAHARA_ERRSOURCE_DMA    15
122 #define         SAHARA_ERRSTATUS_DMA_DIR        (1 << 8)
123 #define         SAHARA_ERRSTATUS_GET_DMASZ(x)(((x) >> 9) & 0x3)
124 #define         SAHARA_ERRSTATUS_GET_DMASRC(x) (((x) >> 13) & 0x7)
125 #define         SAHARA_ERRSTATUS_GET_CHASRC(x)  (((x) >> 16) & 0xfff)
126 #define         SAHARA_ERRSTATUS_GET_CHAERR(x)  (((x) >> 28) & 0x3)
127 #define SAHARA_REG_FADDR        0x18
128 #define SAHARA_REG_CDAR         0x1C
129 #define SAHARA_REG_IDAR         0x20
130
131 struct sahara_hw_desc {
132         u32     hdr;
133         u32     len1;
134         u32     p1;
135         u32     len2;
136         u32     p2;
137         u32     next;
138 };
139
140 struct sahara_hw_link {
141         u32     len;
142         u32     p;
143         u32     next;
144 };
145
146 struct sahara_ctx {
147         unsigned long flags;
148
149         /* AES-specific context */
150         int keylen;
151         u8 key[AES_KEYSIZE_128];
152         struct crypto_sync_skcipher *fallback;
153 };
154
155 struct sahara_aes_reqctx {
156         unsigned long mode;
157 };
158
159 /*
160  * struct sahara_sha_reqctx - private data per request
161  * @buf: holds data for requests smaller than block_size
162  * @rembuf: used to prepare one block_size-aligned request
163  * @context: hw-specific context for request. Digest is extracted from this
164  * @mode: specifies what type of hw-descriptor needs to be built
165  * @digest_size: length of digest for this request
166  * @context_size: length of hw-context for this request.
167  *                Always digest_size + 4
168  * @buf_cnt: number of bytes saved in buf
169  * @sg_in_idx: number of hw links
170  * @in_sg: scatterlist for input data
171  * @in_sg_chain: scatterlists for chained input data
172  * @total: total number of bytes for transfer
173  * @last: is this the last block
174  * @first: is this the first block
175  * @active: inside a transfer
176  */
177 struct sahara_sha_reqctx {
178         u8                      buf[SAHARA_MAX_SHA_BLOCK_SIZE];
179         u8                      rembuf[SAHARA_MAX_SHA_BLOCK_SIZE];
180         u8                      context[SHA256_DIGEST_SIZE + 4];
181         unsigned int            mode;
182         unsigned int            digest_size;
183         unsigned int            context_size;
184         unsigned int            buf_cnt;
185         unsigned int            sg_in_idx;
186         struct scatterlist      *in_sg;
187         struct scatterlist      in_sg_chain[2];
188         size_t                  total;
189         unsigned int            last;
190         unsigned int            first;
191         unsigned int            active;
192 };
193
194 struct sahara_dev {
195         struct device           *device;
196         unsigned int            version;
197         void __iomem            *regs_base;
198         struct clk              *clk_ipg;
199         struct clk              *clk_ahb;
200         struct mutex            queue_mutex;
201         struct task_struct      *kthread;
202         struct completion       dma_completion;
203
204         struct sahara_ctx       *ctx;
205         struct crypto_queue     queue;
206         unsigned long           flags;
207
208         struct sahara_hw_desc   *hw_desc[SAHARA_MAX_HW_DESC];
209         dma_addr_t              hw_phys_desc[SAHARA_MAX_HW_DESC];
210
211         u8                      *key_base;
212         dma_addr_t              key_phys_base;
213
214         u8                      *iv_base;
215         dma_addr_t              iv_phys_base;
216
217         u8                      *context_base;
218         dma_addr_t              context_phys_base;
219
220         struct sahara_hw_link   *hw_link[SAHARA_MAX_HW_LINK];
221         dma_addr_t              hw_phys_link[SAHARA_MAX_HW_LINK];
222
223         size_t                  total;
224         struct scatterlist      *in_sg;
225         int             nb_in_sg;
226         struct scatterlist      *out_sg;
227         int             nb_out_sg;
228
229         u32                     error;
230 };
231
232 static struct sahara_dev *dev_ptr;
233
234 static inline void sahara_write(struct sahara_dev *dev, u32 data, u32 reg)
235 {
236         writel(data, dev->regs_base + reg);
237 }
238
239 static inline unsigned int sahara_read(struct sahara_dev *dev, u32 reg)
240 {
241         return readl(dev->regs_base + reg);
242 }
243
244 static u32 sahara_aes_key_hdr(struct sahara_dev *dev)
245 {
246         u32 hdr = SAHARA_HDR_BASE | SAHARA_HDR_SKHA_ALG_AES |
247                         SAHARA_HDR_FORM_KEY | SAHARA_HDR_LLO |
248                         SAHARA_HDR_CHA_SKHA | SAHARA_HDR_PARITY_BIT;
249
250         if (dev->flags & FLAGS_CBC) {
251                 hdr |= SAHARA_HDR_SKHA_MODE_CBC;
252                 hdr ^= SAHARA_HDR_PARITY_BIT;
253         }
254
255         if (dev->flags & FLAGS_ENCRYPT) {
256                 hdr |= SAHARA_HDR_SKHA_OP_ENC;
257                 hdr ^= SAHARA_HDR_PARITY_BIT;
258         }
259
260         return hdr;
261 }
262
263 static u32 sahara_aes_data_link_hdr(struct sahara_dev *dev)
264 {
265         return SAHARA_HDR_BASE | SAHARA_HDR_FORM_DATA |
266                         SAHARA_HDR_CHA_SKHA | SAHARA_HDR_PARITY_BIT;
267 }
268
269 static const char *sahara_err_src[16] = {
270         "No error",
271         "Header error",
272         "Descriptor length error",
273         "Descriptor length or pointer error",
274         "Link length error",
275         "Link pointer error",
276         "Input buffer error",
277         "Output buffer error",
278         "Output buffer starvation",
279         "Internal state fault",
280         "General descriptor problem",
281         "Reserved",
282         "Descriptor address error",
283         "Link address error",
284         "CHA error",
285         "DMA error"
286 };
287
288 static const char *sahara_err_dmasize[4] = {
289         "Byte transfer",
290         "Half-word transfer",
291         "Word transfer",
292         "Reserved"
293 };
294
295 static const char *sahara_err_dmasrc[8] = {
296         "No error",
297         "AHB bus error",
298         "Internal IP bus error",
299         "Parity error",
300         "DMA crosses 256 byte boundary",
301         "DMA is busy",
302         "Reserved",
303         "DMA HW error"
304 };
305
306 static const char *sahara_cha_errsrc[12] = {
307         "Input buffer non-empty",
308         "Illegal address",
309         "Illegal mode",
310         "Illegal data size",
311         "Illegal key size",
312         "Write during processing",
313         "CTX read during processing",
314         "HW error",
315         "Input buffer disabled/underflow",
316         "Output buffer disabled/overflow",
317         "DES key parity error",
318         "Reserved"
319 };
320
321 static const char *sahara_cha_err[4] = { "No error", "SKHA", "MDHA", "RNG" };
322
323 static void sahara_decode_error(struct sahara_dev *dev, unsigned int error)
324 {
325         u8 source = SAHARA_ERRSTATUS_GET_SOURCE(error);
326         u16 chasrc = ffs(SAHARA_ERRSTATUS_GET_CHASRC(error));
327
328         dev_err(dev->device, "%s: Error Register = 0x%08x\n", __func__, error);
329
330         dev_err(dev->device, "  - %s.\n", sahara_err_src[source]);
331
332         if (source == SAHARA_ERRSOURCE_DMA) {
333                 if (error & SAHARA_ERRSTATUS_DMA_DIR)
334                         dev_err(dev->device, "          * DMA read.\n");
335                 else
336                         dev_err(dev->device, "          * DMA write.\n");
337
338                 dev_err(dev->device, "          * %s.\n",
339                        sahara_err_dmasize[SAHARA_ERRSTATUS_GET_DMASZ(error)]);
340                 dev_err(dev->device, "          * %s.\n",
341                        sahara_err_dmasrc[SAHARA_ERRSTATUS_GET_DMASRC(error)]);
342         } else if (source == SAHARA_ERRSOURCE_CHA) {
343                 dev_err(dev->device, "          * %s.\n",
344                         sahara_cha_errsrc[chasrc]);
345                 dev_err(dev->device, "          * %s.\n",
346                        sahara_cha_err[SAHARA_ERRSTATUS_GET_CHAERR(error)]);
347         }
348         dev_err(dev->device, "\n");
349 }
350
351 static const char *sahara_state[4] = { "Idle", "Busy", "Error", "HW Fault" };
352
353 static void sahara_decode_status(struct sahara_dev *dev, unsigned int status)
354 {
355         u8 state;
356
357         if (!IS_ENABLED(DEBUG))
358                 return;
359
360         state = SAHARA_STATUS_GET_STATE(status);
361
362         dev_dbg(dev->device, "%s: Status Register = 0x%08x\n",
363                 __func__, status);
364
365         dev_dbg(dev->device, "  - State = %d:\n", state);
366         if (state & SAHARA_STATE_COMP_FLAG)
367                 dev_dbg(dev->device, "          * Descriptor completed. IRQ pending.\n");
368
369         dev_dbg(dev->device, "          * %s.\n",
370                sahara_state[state & ~SAHARA_STATE_COMP_FLAG]);
371
372         if (status & SAHARA_STATUS_DAR_FULL)
373                 dev_dbg(dev->device, "  - DAR Full.\n");
374         if (status & SAHARA_STATUS_ERROR)
375                 dev_dbg(dev->device, "  - Error.\n");
376         if (status & SAHARA_STATUS_SECURE)
377                 dev_dbg(dev->device, "  - Secure.\n");
378         if (status & SAHARA_STATUS_FAIL)
379                 dev_dbg(dev->device, "  - Fail.\n");
380         if (status & SAHARA_STATUS_RNG_RESEED)
381                 dev_dbg(dev->device, "  - RNG Reseed Request.\n");
382         if (status & SAHARA_STATUS_ACTIVE_RNG)
383                 dev_dbg(dev->device, "  - RNG Active.\n");
384         if (status & SAHARA_STATUS_ACTIVE_MDHA)
385                 dev_dbg(dev->device, "  - MDHA Active.\n");
386         if (status & SAHARA_STATUS_ACTIVE_SKHA)
387                 dev_dbg(dev->device, "  - SKHA Active.\n");
388
389         if (status & SAHARA_STATUS_MODE_BATCH)
390                 dev_dbg(dev->device, "  - Batch Mode.\n");
391         else if (status & SAHARA_STATUS_MODE_DEDICATED)
392                 dev_dbg(dev->device, "  - Dedicated Mode.\n");
393         else if (status & SAHARA_STATUS_MODE_DEBUG)
394                 dev_dbg(dev->device, "  - Debug Mode.\n");
395
396         dev_dbg(dev->device, "  - Internal state = 0x%02x\n",
397                SAHARA_STATUS_GET_ISTATE(status));
398
399         dev_dbg(dev->device, "Current DAR: 0x%08x\n",
400                 sahara_read(dev, SAHARA_REG_CDAR));
401         dev_dbg(dev->device, "Initial DAR: 0x%08x\n\n",
402                 sahara_read(dev, SAHARA_REG_IDAR));
403 }
404
405 static void sahara_dump_descriptors(struct sahara_dev *dev)
406 {
407         int i;
408
409         if (!IS_ENABLED(DEBUG))
410                 return;
411
412         for (i = 0; i < SAHARA_MAX_HW_DESC; i++) {
413                 dev_dbg(dev->device, "Descriptor (%d) (%pad):\n",
414                         i, &dev->hw_phys_desc[i]);
415                 dev_dbg(dev->device, "\thdr = 0x%08x\n", dev->hw_desc[i]->hdr);
416                 dev_dbg(dev->device, "\tlen1 = %u\n", dev->hw_desc[i]->len1);
417                 dev_dbg(dev->device, "\tp1 = 0x%08x\n", dev->hw_desc[i]->p1);
418                 dev_dbg(dev->device, "\tlen2 = %u\n", dev->hw_desc[i]->len2);
419                 dev_dbg(dev->device, "\tp2 = 0x%08x\n", dev->hw_desc[i]->p2);
420                 dev_dbg(dev->device, "\tnext = 0x%08x\n",
421                         dev->hw_desc[i]->next);
422         }
423         dev_dbg(dev->device, "\n");
424 }
425
426 static void sahara_dump_links(struct sahara_dev *dev)
427 {
428         int i;
429
430         if (!IS_ENABLED(DEBUG))
431                 return;
432
433         for (i = 0; i < SAHARA_MAX_HW_LINK; i++) {
434                 dev_dbg(dev->device, "Link (%d) (%pad):\n",
435                         i, &dev->hw_phys_link[i]);
436                 dev_dbg(dev->device, "\tlen = %u\n", dev->hw_link[i]->len);
437                 dev_dbg(dev->device, "\tp = 0x%08x\n", dev->hw_link[i]->p);
438                 dev_dbg(dev->device, "\tnext = 0x%08x\n",
439                         dev->hw_link[i]->next);
440         }
441         dev_dbg(dev->device, "\n");
442 }
443
444 static int sahara_hw_descriptor_create(struct sahara_dev *dev)
445 {
446         struct sahara_ctx *ctx = dev->ctx;
447         struct scatterlist *sg;
448         int ret;
449         int i, j;
450         int idx = 0;
451
452         /* Copy new key if necessary */
453         if (ctx->flags & FLAGS_NEW_KEY) {
454                 memcpy(dev->key_base, ctx->key, ctx->keylen);
455                 ctx->flags &= ~FLAGS_NEW_KEY;
456
457                 if (dev->flags & FLAGS_CBC) {
458                         dev->hw_desc[idx]->len1 = AES_BLOCK_SIZE;
459                         dev->hw_desc[idx]->p1 = dev->iv_phys_base;
460                 } else {
461                         dev->hw_desc[idx]->len1 = 0;
462                         dev->hw_desc[idx]->p1 = 0;
463                 }
464                 dev->hw_desc[idx]->len2 = ctx->keylen;
465                 dev->hw_desc[idx]->p2 = dev->key_phys_base;
466                 dev->hw_desc[idx]->next = dev->hw_phys_desc[1];
467
468                 dev->hw_desc[idx]->hdr = sahara_aes_key_hdr(dev);
469
470                 idx++;
471         }
472
473         dev->nb_in_sg = sg_nents_for_len(dev->in_sg, dev->total);
474         if (dev->nb_in_sg < 0) {
475                 dev_err(dev->device, "Invalid numbers of src SG.\n");
476                 return dev->nb_in_sg;
477         }
478         dev->nb_out_sg = sg_nents_for_len(dev->out_sg, dev->total);
479         if (dev->nb_out_sg < 0) {
480                 dev_err(dev->device, "Invalid numbers of dst SG.\n");
481                 return dev->nb_out_sg;
482         }
483         if ((dev->nb_in_sg + dev->nb_out_sg) > SAHARA_MAX_HW_LINK) {
484                 dev_err(dev->device, "not enough hw links (%d)\n",
485                         dev->nb_in_sg + dev->nb_out_sg);
486                 return -EINVAL;
487         }
488
489         ret = dma_map_sg(dev->device, dev->in_sg, dev->nb_in_sg,
490                          DMA_TO_DEVICE);
491         if (ret != dev->nb_in_sg) {
492                 dev_err(dev->device, "couldn't map in sg\n");
493                 goto unmap_in;
494         }
495         ret = dma_map_sg(dev->device, dev->out_sg, dev->nb_out_sg,
496                          DMA_FROM_DEVICE);
497         if (ret != dev->nb_out_sg) {
498                 dev_err(dev->device, "couldn't map out sg\n");
499                 goto unmap_out;
500         }
501
502         /* Create input links */
503         dev->hw_desc[idx]->p1 = dev->hw_phys_link[0];
504         sg = dev->in_sg;
505         for (i = 0; i < dev->nb_in_sg; i++) {
506                 dev->hw_link[i]->len = sg->length;
507                 dev->hw_link[i]->p = sg->dma_address;
508                 if (i == (dev->nb_in_sg - 1)) {
509                         dev->hw_link[i]->next = 0;
510                 } else {
511                         dev->hw_link[i]->next = dev->hw_phys_link[i + 1];
512                         sg = sg_next(sg);
513                 }
514         }
515
516         /* Create output links */
517         dev->hw_desc[idx]->p2 = dev->hw_phys_link[i];
518         sg = dev->out_sg;
519         for (j = i; j < dev->nb_out_sg + i; j++) {
520                 dev->hw_link[j]->len = sg->length;
521                 dev->hw_link[j]->p = sg->dma_address;
522                 if (j == (dev->nb_out_sg + i - 1)) {
523                         dev->hw_link[j]->next = 0;
524                 } else {
525                         dev->hw_link[j]->next = dev->hw_phys_link[j + 1];
526                         sg = sg_next(sg);
527                 }
528         }
529
530         /* Fill remaining fields of hw_desc[1] */
531         dev->hw_desc[idx]->hdr = sahara_aes_data_link_hdr(dev);
532         dev->hw_desc[idx]->len1 = dev->total;
533         dev->hw_desc[idx]->len2 = dev->total;
534         dev->hw_desc[idx]->next = 0;
535
536         sahara_dump_descriptors(dev);
537         sahara_dump_links(dev);
538
539         sahara_write(dev, dev->hw_phys_desc[0], SAHARA_REG_DAR);
540
541         return 0;
542
543 unmap_out:
544         dma_unmap_sg(dev->device, dev->out_sg, dev->nb_out_sg,
545                 DMA_FROM_DEVICE);
546 unmap_in:
547         dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg,
548                 DMA_TO_DEVICE);
549
550         return -EINVAL;
551 }
552
553 static int sahara_aes_process(struct ablkcipher_request *req)
554 {
555         struct sahara_dev *dev = dev_ptr;
556         struct sahara_ctx *ctx;
557         struct sahara_aes_reqctx *rctx;
558         int ret;
559         unsigned long timeout;
560
561         /* Request is ready to be dispatched by the device */
562         dev_dbg(dev->device,
563                 "dispatch request (nbytes=%d, src=%p, dst=%p)\n",
564                 req->nbytes, req->src, req->dst);
565
566         /* assign new request to device */
567         dev->total = req->nbytes;
568         dev->in_sg = req->src;
569         dev->out_sg = req->dst;
570
571         rctx = ablkcipher_request_ctx(req);
572         ctx = crypto_ablkcipher_ctx(crypto_ablkcipher_reqtfm(req));
573         rctx->mode &= FLAGS_MODE_MASK;
574         dev->flags = (dev->flags & ~FLAGS_MODE_MASK) | rctx->mode;
575
576         if ((dev->flags & FLAGS_CBC) && req->info)
577                 memcpy(dev->iv_base, req->info, AES_KEYSIZE_128);
578
579         /* assign new context to device */
580         dev->ctx = ctx;
581
582         reinit_completion(&dev->dma_completion);
583
584         ret = sahara_hw_descriptor_create(dev);
585         if (ret)
586                 return -EINVAL;
587
588         timeout = wait_for_completion_timeout(&dev->dma_completion,
589                                 msecs_to_jiffies(SAHARA_TIMEOUT_MS));
590         if (!timeout) {
591                 dev_err(dev->device, "AES timeout\n");
592                 return -ETIMEDOUT;
593         }
594
595         dma_unmap_sg(dev->device, dev->out_sg, dev->nb_out_sg,
596                 DMA_FROM_DEVICE);
597         dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg,
598                 DMA_TO_DEVICE);
599
600         return 0;
601 }
602
603 static int sahara_aes_setkey(struct crypto_ablkcipher *tfm, const u8 *key,
604                              unsigned int keylen)
605 {
606         struct sahara_ctx *ctx = crypto_ablkcipher_ctx(tfm);
607         int ret;
608
609         ctx->keylen = keylen;
610
611         /* SAHARA only supports 128bit keys */
612         if (keylen == AES_KEYSIZE_128) {
613                 memcpy(ctx->key, key, keylen);
614                 ctx->flags |= FLAGS_NEW_KEY;
615                 return 0;
616         }
617
618         if (keylen != AES_KEYSIZE_192 && keylen != AES_KEYSIZE_256)
619                 return -EINVAL;
620
621         /*
622          * The requested key size is not supported by HW, do a fallback.
623          */
624         crypto_sync_skcipher_clear_flags(ctx->fallback, CRYPTO_TFM_REQ_MASK);
625         crypto_sync_skcipher_set_flags(ctx->fallback, tfm->base.crt_flags &
626                                                  CRYPTO_TFM_REQ_MASK);
627
628         ret = crypto_sync_skcipher_setkey(ctx->fallback, key, keylen);
629
630         tfm->base.crt_flags &= ~CRYPTO_TFM_RES_MASK;
631         tfm->base.crt_flags |= crypto_sync_skcipher_get_flags(ctx->fallback) &
632                                CRYPTO_TFM_RES_MASK;
633         return ret;
634 }
635
636 static int sahara_aes_crypt(struct ablkcipher_request *req, unsigned long mode)
637 {
638         struct sahara_aes_reqctx *rctx = ablkcipher_request_ctx(req);
639         struct sahara_dev *dev = dev_ptr;
640         int err = 0;
641
642         dev_dbg(dev->device, "nbytes: %d, enc: %d, cbc: %d\n",
643                 req->nbytes, !!(mode & FLAGS_ENCRYPT), !!(mode & FLAGS_CBC));
644
645         if (!IS_ALIGNED(req->nbytes, AES_BLOCK_SIZE)) {
646                 dev_err(dev->device,
647                         "request size is not exact amount of AES blocks\n");
648                 return -EINVAL;
649         }
650
651         rctx->mode = mode;
652
653         mutex_lock(&dev->queue_mutex);
654         err = ablkcipher_enqueue_request(&dev->queue, req);
655         mutex_unlock(&dev->queue_mutex);
656
657         wake_up_process(dev->kthread);
658
659         return err;
660 }
661
662 static int sahara_aes_ecb_encrypt(struct ablkcipher_request *req)
663 {
664         struct sahara_ctx *ctx = crypto_ablkcipher_ctx(
665                 crypto_ablkcipher_reqtfm(req));
666         int err;
667
668         if (unlikely(ctx->keylen != AES_KEYSIZE_128)) {
669                 SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, ctx->fallback);
670
671                 skcipher_request_set_sync_tfm(subreq, ctx->fallback);
672                 skcipher_request_set_callback(subreq, req->base.flags,
673                                               NULL, NULL);
674                 skcipher_request_set_crypt(subreq, req->src, req->dst,
675                                            req->nbytes, req->info);
676                 err = crypto_skcipher_encrypt(subreq);
677                 skcipher_request_zero(subreq);
678                 return err;
679         }
680
681         return sahara_aes_crypt(req, FLAGS_ENCRYPT);
682 }
683
684 static int sahara_aes_ecb_decrypt(struct ablkcipher_request *req)
685 {
686         struct sahara_ctx *ctx = crypto_ablkcipher_ctx(
687                 crypto_ablkcipher_reqtfm(req));
688         int err;
689
690         if (unlikely(ctx->keylen != AES_KEYSIZE_128)) {
691                 SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, ctx->fallback);
692
693                 skcipher_request_set_sync_tfm(subreq, ctx->fallback);
694                 skcipher_request_set_callback(subreq, req->base.flags,
695                                               NULL, NULL);
696                 skcipher_request_set_crypt(subreq, req->src, req->dst,
697                                            req->nbytes, req->info);
698                 err = crypto_skcipher_decrypt(subreq);
699                 skcipher_request_zero(subreq);
700                 return err;
701         }
702
703         return sahara_aes_crypt(req, 0);
704 }
705
706 static int sahara_aes_cbc_encrypt(struct ablkcipher_request *req)
707 {
708         struct sahara_ctx *ctx = crypto_ablkcipher_ctx(
709                 crypto_ablkcipher_reqtfm(req));
710         int err;
711
712         if (unlikely(ctx->keylen != AES_KEYSIZE_128)) {
713                 SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, ctx->fallback);
714
715                 skcipher_request_set_sync_tfm(subreq, ctx->fallback);
716                 skcipher_request_set_callback(subreq, req->base.flags,
717                                               NULL, NULL);
718                 skcipher_request_set_crypt(subreq, req->src, req->dst,
719                                            req->nbytes, req->info);
720                 err = crypto_skcipher_encrypt(subreq);
721                 skcipher_request_zero(subreq);
722                 return err;
723         }
724
725         return sahara_aes_crypt(req, FLAGS_ENCRYPT | FLAGS_CBC);
726 }
727
728 static int sahara_aes_cbc_decrypt(struct ablkcipher_request *req)
729 {
730         struct sahara_ctx *ctx = crypto_ablkcipher_ctx(
731                 crypto_ablkcipher_reqtfm(req));
732         int err;
733
734         if (unlikely(ctx->keylen != AES_KEYSIZE_128)) {
735                 SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, ctx->fallback);
736
737                 skcipher_request_set_sync_tfm(subreq, ctx->fallback);
738                 skcipher_request_set_callback(subreq, req->base.flags,
739                                               NULL, NULL);
740                 skcipher_request_set_crypt(subreq, req->src, req->dst,
741                                            req->nbytes, req->info);
742                 err = crypto_skcipher_decrypt(subreq);
743                 skcipher_request_zero(subreq);
744                 return err;
745         }
746
747         return sahara_aes_crypt(req, FLAGS_CBC);
748 }
749
750 static int sahara_aes_cra_init(struct crypto_tfm *tfm)
751 {
752         const char *name = crypto_tfm_alg_name(tfm);
753         struct sahara_ctx *ctx = crypto_tfm_ctx(tfm);
754
755         ctx->fallback = crypto_alloc_sync_skcipher(name, 0,
756                                               CRYPTO_ALG_NEED_FALLBACK);
757         if (IS_ERR(ctx->fallback)) {
758                 pr_err("Error allocating fallback algo %s\n", name);
759                 return PTR_ERR(ctx->fallback);
760         }
761
762         tfm->crt_ablkcipher.reqsize = sizeof(struct sahara_aes_reqctx);
763
764         return 0;
765 }
766
767 static void sahara_aes_cra_exit(struct crypto_tfm *tfm)
768 {
769         struct sahara_ctx *ctx = crypto_tfm_ctx(tfm);
770
771         crypto_free_sync_skcipher(ctx->fallback);
772 }
773
774 static u32 sahara_sha_init_hdr(struct sahara_dev *dev,
775                               struct sahara_sha_reqctx *rctx)
776 {
777         u32 hdr = 0;
778
779         hdr = rctx->mode;
780
781         if (rctx->first) {
782                 hdr |= SAHARA_HDR_MDHA_SET_MODE_HASH;
783                 hdr |= SAHARA_HDR_MDHA_INIT;
784         } else {
785                 hdr |= SAHARA_HDR_MDHA_SET_MODE_MD_KEY;
786         }
787
788         if (rctx->last)
789                 hdr |= SAHARA_HDR_MDHA_PDATA;
790
791         if (hweight_long(hdr) % 2 == 0)
792                 hdr |= SAHARA_HDR_PARITY_BIT;
793
794         return hdr;
795 }
796
797 static int sahara_sha_hw_links_create(struct sahara_dev *dev,
798                                        struct sahara_sha_reqctx *rctx,
799                                        int start)
800 {
801         struct scatterlist *sg;
802         unsigned int i;
803         int ret;
804
805         dev->in_sg = rctx->in_sg;
806
807         dev->nb_in_sg = sg_nents_for_len(dev->in_sg, rctx->total);
808         if (dev->nb_in_sg < 0) {
809                 dev_err(dev->device, "Invalid numbers of src SG.\n");
810                 return dev->nb_in_sg;
811         }
812         if ((dev->nb_in_sg) > SAHARA_MAX_HW_LINK) {
813                 dev_err(dev->device, "not enough hw links (%d)\n",
814                         dev->nb_in_sg + dev->nb_out_sg);
815                 return -EINVAL;
816         }
817
818         sg = dev->in_sg;
819         ret = dma_map_sg(dev->device, dev->in_sg, dev->nb_in_sg, DMA_TO_DEVICE);
820         if (!ret)
821                 return -EFAULT;
822
823         for (i = start; i < dev->nb_in_sg + start; i++) {
824                 dev->hw_link[i]->len = sg->length;
825                 dev->hw_link[i]->p = sg->dma_address;
826                 if (i == (dev->nb_in_sg + start - 1)) {
827                         dev->hw_link[i]->next = 0;
828                 } else {
829                         dev->hw_link[i]->next = dev->hw_phys_link[i + 1];
830                         sg = sg_next(sg);
831                 }
832         }
833
834         return i;
835 }
836
837 static int sahara_sha_hw_data_descriptor_create(struct sahara_dev *dev,
838                                                 struct sahara_sha_reqctx *rctx,
839                                                 struct ahash_request *req,
840                                                 int index)
841 {
842         unsigned result_len;
843         int i = index;
844
845         if (rctx->first)
846                 /* Create initial descriptor: #8*/
847                 dev->hw_desc[index]->hdr = sahara_sha_init_hdr(dev, rctx);
848         else
849                 /* Create hash descriptor: #10. Must follow #6. */
850                 dev->hw_desc[index]->hdr = SAHARA_HDR_MDHA_HASH;
851
852         dev->hw_desc[index]->len1 = rctx->total;
853         if (dev->hw_desc[index]->len1 == 0) {
854                 /* if len1 is 0, p1 must be 0, too */
855                 dev->hw_desc[index]->p1 = 0;
856                 rctx->sg_in_idx = 0;
857         } else {
858                 /* Create input links */
859                 dev->hw_desc[index]->p1 = dev->hw_phys_link[index];
860                 i = sahara_sha_hw_links_create(dev, rctx, index);
861
862                 rctx->sg_in_idx = index;
863                 if (i < 0)
864                         return i;
865         }
866
867         dev->hw_desc[index]->p2 = dev->hw_phys_link[i];
868
869         /* Save the context for the next operation */
870         result_len = rctx->context_size;
871         dev->hw_link[i]->p = dev->context_phys_base;
872
873         dev->hw_link[i]->len = result_len;
874         dev->hw_desc[index]->len2 = result_len;
875
876         dev->hw_link[i]->next = 0;
877
878         return 0;
879 }
880
881 /*
882  * Load descriptor aka #6
883  *
884  * To load a previously saved context back to the MDHA unit
885  *
886  * p1: Saved Context
887  * p2: NULL
888  *
889  */
890 static int sahara_sha_hw_context_descriptor_create(struct sahara_dev *dev,
891                                                 struct sahara_sha_reqctx *rctx,
892                                                 struct ahash_request *req,
893                                                 int index)
894 {
895         dev->hw_desc[index]->hdr = sahara_sha_init_hdr(dev, rctx);
896
897         dev->hw_desc[index]->len1 = rctx->context_size;
898         dev->hw_desc[index]->p1 = dev->hw_phys_link[index];
899         dev->hw_desc[index]->len2 = 0;
900         dev->hw_desc[index]->p2 = 0;
901
902         dev->hw_link[index]->len = rctx->context_size;
903         dev->hw_link[index]->p = dev->context_phys_base;
904         dev->hw_link[index]->next = 0;
905
906         return 0;
907 }
908
909 static int sahara_walk_and_recalc(struct scatterlist *sg, unsigned int nbytes)
910 {
911         if (!sg || !sg->length)
912                 return nbytes;
913
914         while (nbytes && sg) {
915                 if (nbytes <= sg->length) {
916                         sg->length = nbytes;
917                         sg_mark_end(sg);
918                         break;
919                 }
920                 nbytes -= sg->length;
921                 sg = sg_next(sg);
922         }
923
924         return nbytes;
925 }
926
927 static int sahara_sha_prepare_request(struct ahash_request *req)
928 {
929         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
930         struct sahara_sha_reqctx *rctx = ahash_request_ctx(req);
931         unsigned int hash_later;
932         unsigned int block_size;
933         unsigned int len;
934
935         block_size = crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
936
937         /* append bytes from previous operation */
938         len = rctx->buf_cnt + req->nbytes;
939
940         /* only the last transfer can be padded in hardware */
941         if (!rctx->last && (len < block_size)) {
942                 /* to few data, save for next operation */
943                 scatterwalk_map_and_copy(rctx->buf + rctx->buf_cnt, req->src,
944                                          0, req->nbytes, 0);
945                 rctx->buf_cnt += req->nbytes;
946
947                 return 0;
948         }
949
950         /* add data from previous operation first */
951         if (rctx->buf_cnt)
952                 memcpy(rctx->rembuf, rctx->buf, rctx->buf_cnt);
953
954         /* data must always be a multiple of block_size */
955         hash_later = rctx->last ? 0 : len & (block_size - 1);
956         if (hash_later) {
957                 unsigned int offset = req->nbytes - hash_later;
958                 /* Save remaining bytes for later use */
959                 scatterwalk_map_and_copy(rctx->buf, req->src, offset,
960                                         hash_later, 0);
961         }
962
963         /* nbytes should now be multiple of blocksize */
964         req->nbytes = req->nbytes - hash_later;
965
966         sahara_walk_and_recalc(req->src, req->nbytes);
967
968         /* have data from previous operation and current */
969         if (rctx->buf_cnt && req->nbytes) {
970                 sg_init_table(rctx->in_sg_chain, 2);
971                 sg_set_buf(rctx->in_sg_chain, rctx->rembuf, rctx->buf_cnt);
972
973                 sg_chain(rctx->in_sg_chain, 2, req->src);
974
975                 rctx->total = req->nbytes + rctx->buf_cnt;
976                 rctx->in_sg = rctx->in_sg_chain;
977
978                 req->src = rctx->in_sg_chain;
979         /* only data from previous operation */
980         } else if (rctx->buf_cnt) {
981                 if (req->src)
982                         rctx->in_sg = req->src;
983                 else
984                         rctx->in_sg = rctx->in_sg_chain;
985                 /* buf was copied into rembuf above */
986                 sg_init_one(rctx->in_sg, rctx->rembuf, rctx->buf_cnt);
987                 rctx->total = rctx->buf_cnt;
988         /* no data from previous operation */
989         } else {
990                 rctx->in_sg = req->src;
991                 rctx->total = req->nbytes;
992                 req->src = rctx->in_sg;
993         }
994
995         /* on next call, we only have the remaining data in the buffer */
996         rctx->buf_cnt = hash_later;
997
998         return -EINPROGRESS;
999 }
1000
1001 static int sahara_sha_process(struct ahash_request *req)
1002 {
1003         struct sahara_dev *dev = dev_ptr;
1004         struct sahara_sha_reqctx *rctx = ahash_request_ctx(req);
1005         int ret;
1006         unsigned long timeout;
1007
1008         ret = sahara_sha_prepare_request(req);
1009         if (!ret)
1010                 return ret;
1011
1012         if (rctx->first) {
1013                 sahara_sha_hw_data_descriptor_create(dev, rctx, req, 0);
1014                 dev->hw_desc[0]->next = 0;
1015                 rctx->first = 0;
1016         } else {
1017                 memcpy(dev->context_base, rctx->context, rctx->context_size);
1018
1019                 sahara_sha_hw_context_descriptor_create(dev, rctx, req, 0);
1020                 dev->hw_desc[0]->next = dev->hw_phys_desc[1];
1021                 sahara_sha_hw_data_descriptor_create(dev, rctx, req, 1);
1022                 dev->hw_desc[1]->next = 0;
1023         }
1024
1025         sahara_dump_descriptors(dev);
1026         sahara_dump_links(dev);
1027
1028         reinit_completion(&dev->dma_completion);
1029
1030         sahara_write(dev, dev->hw_phys_desc[0], SAHARA_REG_DAR);
1031
1032         timeout = wait_for_completion_timeout(&dev->dma_completion,
1033                                 msecs_to_jiffies(SAHARA_TIMEOUT_MS));
1034         if (!timeout) {
1035                 dev_err(dev->device, "SHA timeout\n");
1036                 return -ETIMEDOUT;
1037         }
1038
1039         if (rctx->sg_in_idx)
1040                 dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg,
1041                              DMA_TO_DEVICE);
1042
1043         memcpy(rctx->context, dev->context_base, rctx->context_size);
1044
1045         if (req->result)
1046                 memcpy(req->result, rctx->context, rctx->digest_size);
1047
1048         return 0;
1049 }
1050
1051 static int sahara_queue_manage(void *data)
1052 {
1053         struct sahara_dev *dev = (struct sahara_dev *)data;
1054         struct crypto_async_request *async_req;
1055         struct crypto_async_request *backlog;
1056         int ret = 0;
1057
1058         do {
1059                 __set_current_state(TASK_INTERRUPTIBLE);
1060
1061                 mutex_lock(&dev->queue_mutex);
1062                 backlog = crypto_get_backlog(&dev->queue);
1063                 async_req = crypto_dequeue_request(&dev->queue);
1064                 mutex_unlock(&dev->queue_mutex);
1065
1066                 if (backlog)
1067                         backlog->complete(backlog, -EINPROGRESS);
1068
1069                 if (async_req) {
1070                         if (crypto_tfm_alg_type(async_req->tfm) ==
1071                             CRYPTO_ALG_TYPE_AHASH) {
1072                                 struct ahash_request *req =
1073                                         ahash_request_cast(async_req);
1074
1075                                 ret = sahara_sha_process(req);
1076                         } else {
1077                                 struct ablkcipher_request *req =
1078                                         ablkcipher_request_cast(async_req);
1079
1080                                 ret = sahara_aes_process(req);
1081                         }
1082
1083                         async_req->complete(async_req, ret);
1084
1085                         continue;
1086                 }
1087
1088                 schedule();
1089         } while (!kthread_should_stop());
1090
1091         return 0;
1092 }
1093
1094 static int sahara_sha_enqueue(struct ahash_request *req, int last)
1095 {
1096         struct sahara_sha_reqctx *rctx = ahash_request_ctx(req);
1097         struct sahara_dev *dev = dev_ptr;
1098         int ret;
1099
1100         if (!req->nbytes && !last)
1101                 return 0;
1102
1103         rctx->last = last;
1104
1105         if (!rctx->active) {
1106                 rctx->active = 1;
1107                 rctx->first = 1;
1108         }
1109
1110         mutex_lock(&dev->queue_mutex);
1111         ret = crypto_enqueue_request(&dev->queue, &req->base);
1112         mutex_unlock(&dev->queue_mutex);
1113
1114         wake_up_process(dev->kthread);
1115
1116         return ret;
1117 }
1118
1119 static int sahara_sha_init(struct ahash_request *req)
1120 {
1121         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1122         struct sahara_sha_reqctx *rctx = ahash_request_ctx(req);
1123
1124         memset(rctx, 0, sizeof(*rctx));
1125
1126         switch (crypto_ahash_digestsize(tfm)) {
1127         case SHA1_DIGEST_SIZE:
1128                 rctx->mode |= SAHARA_HDR_MDHA_ALG_SHA1;
1129                 rctx->digest_size = SHA1_DIGEST_SIZE;
1130                 break;
1131         case SHA256_DIGEST_SIZE:
1132                 rctx->mode |= SAHARA_HDR_MDHA_ALG_SHA256;
1133                 rctx->digest_size = SHA256_DIGEST_SIZE;
1134                 break;
1135         default:
1136                 return -EINVAL;
1137         }
1138
1139         rctx->context_size = rctx->digest_size + 4;
1140         rctx->active = 0;
1141
1142         return 0;
1143 }
1144
1145 static int sahara_sha_update(struct ahash_request *req)
1146 {
1147         return sahara_sha_enqueue(req, 0);
1148 }
1149
1150 static int sahara_sha_final(struct ahash_request *req)
1151 {
1152         req->nbytes = 0;
1153         return sahara_sha_enqueue(req, 1);
1154 }
1155
1156 static int sahara_sha_finup(struct ahash_request *req)
1157 {
1158         return sahara_sha_enqueue(req, 1);
1159 }
1160
1161 static int sahara_sha_digest(struct ahash_request *req)
1162 {
1163         sahara_sha_init(req);
1164
1165         return sahara_sha_finup(req);
1166 }
1167
1168 static int sahara_sha_export(struct ahash_request *req, void *out)
1169 {
1170         struct sahara_sha_reqctx *rctx = ahash_request_ctx(req);
1171
1172         memcpy(out, rctx, sizeof(struct sahara_sha_reqctx));
1173
1174         return 0;
1175 }
1176
1177 static int sahara_sha_import(struct ahash_request *req, const void *in)
1178 {
1179         struct sahara_sha_reqctx *rctx = ahash_request_ctx(req);
1180
1181         memcpy(rctx, in, sizeof(struct sahara_sha_reqctx));
1182
1183         return 0;
1184 }
1185
1186 static int sahara_sha_cra_init(struct crypto_tfm *tfm)
1187 {
1188         crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
1189                                  sizeof(struct sahara_sha_reqctx) +
1190                                  SHA_BUFFER_LEN + SHA256_BLOCK_SIZE);
1191
1192         return 0;
1193 }
1194
1195 static struct crypto_alg aes_algs[] = {
1196 {
1197         .cra_name               = "ecb(aes)",
1198         .cra_driver_name        = "sahara-ecb-aes",
1199         .cra_priority           = 300,
1200         .cra_flags              = CRYPTO_ALG_TYPE_ABLKCIPHER |
1201                         CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
1202         .cra_blocksize          = AES_BLOCK_SIZE,
1203         .cra_ctxsize            = sizeof(struct sahara_ctx),
1204         .cra_alignmask          = 0x0,
1205         .cra_type               = &crypto_ablkcipher_type,
1206         .cra_module             = THIS_MODULE,
1207         .cra_init               = sahara_aes_cra_init,
1208         .cra_exit               = sahara_aes_cra_exit,
1209         .cra_u.ablkcipher = {
1210                 .min_keysize    = AES_MIN_KEY_SIZE ,
1211                 .max_keysize    = AES_MAX_KEY_SIZE,
1212                 .setkey         = sahara_aes_setkey,
1213                 .encrypt        = sahara_aes_ecb_encrypt,
1214                 .decrypt        = sahara_aes_ecb_decrypt,
1215         }
1216 }, {
1217         .cra_name               = "cbc(aes)",
1218         .cra_driver_name        = "sahara-cbc-aes",
1219         .cra_priority           = 300,
1220         .cra_flags              = CRYPTO_ALG_TYPE_ABLKCIPHER |
1221                         CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
1222         .cra_blocksize          = AES_BLOCK_SIZE,
1223         .cra_ctxsize            = sizeof(struct sahara_ctx),
1224         .cra_alignmask          = 0x0,
1225         .cra_type               = &crypto_ablkcipher_type,
1226         .cra_module             = THIS_MODULE,
1227         .cra_init               = sahara_aes_cra_init,
1228         .cra_exit               = sahara_aes_cra_exit,
1229         .cra_u.ablkcipher = {
1230                 .min_keysize    = AES_MIN_KEY_SIZE ,
1231                 .max_keysize    = AES_MAX_KEY_SIZE,
1232                 .ivsize         = AES_BLOCK_SIZE,
1233                 .setkey         = sahara_aes_setkey,
1234                 .encrypt        = sahara_aes_cbc_encrypt,
1235                 .decrypt        = sahara_aes_cbc_decrypt,
1236         }
1237 }
1238 };
1239
1240 static struct ahash_alg sha_v3_algs[] = {
1241 {
1242         .init           = sahara_sha_init,
1243         .update         = sahara_sha_update,
1244         .final          = sahara_sha_final,
1245         .finup          = sahara_sha_finup,
1246         .digest         = sahara_sha_digest,
1247         .export         = sahara_sha_export,
1248         .import         = sahara_sha_import,
1249         .halg.digestsize        = SHA1_DIGEST_SIZE,
1250         .halg.statesize         = sizeof(struct sahara_sha_reqctx),
1251         .halg.base      = {
1252                 .cra_name               = "sha1",
1253                 .cra_driver_name        = "sahara-sha1",
1254                 .cra_priority           = 300,
1255                 .cra_flags              = CRYPTO_ALG_ASYNC |
1256                                                 CRYPTO_ALG_NEED_FALLBACK,
1257                 .cra_blocksize          = SHA1_BLOCK_SIZE,
1258                 .cra_ctxsize            = sizeof(struct sahara_ctx),
1259                 .cra_alignmask          = 0,
1260                 .cra_module             = THIS_MODULE,
1261                 .cra_init               = sahara_sha_cra_init,
1262         }
1263 },
1264 };
1265
1266 static struct ahash_alg sha_v4_algs[] = {
1267 {
1268         .init           = sahara_sha_init,
1269         .update         = sahara_sha_update,
1270         .final          = sahara_sha_final,
1271         .finup          = sahara_sha_finup,
1272         .digest         = sahara_sha_digest,
1273         .export         = sahara_sha_export,
1274         .import         = sahara_sha_import,
1275         .halg.digestsize        = SHA256_DIGEST_SIZE,
1276         .halg.statesize         = sizeof(struct sahara_sha_reqctx),
1277         .halg.base      = {
1278                 .cra_name               = "sha256",
1279                 .cra_driver_name        = "sahara-sha256",
1280                 .cra_priority           = 300,
1281                 .cra_flags              = CRYPTO_ALG_ASYNC |
1282                                                 CRYPTO_ALG_NEED_FALLBACK,
1283                 .cra_blocksize          = SHA256_BLOCK_SIZE,
1284                 .cra_ctxsize            = sizeof(struct sahara_ctx),
1285                 .cra_alignmask          = 0,
1286                 .cra_module             = THIS_MODULE,
1287                 .cra_init               = sahara_sha_cra_init,
1288         }
1289 },
1290 };
1291
1292 static irqreturn_t sahara_irq_handler(int irq, void *data)
1293 {
1294         struct sahara_dev *dev = (struct sahara_dev *)data;
1295         unsigned int stat = sahara_read(dev, SAHARA_REG_STATUS);
1296         unsigned int err = sahara_read(dev, SAHARA_REG_ERRSTATUS);
1297
1298         sahara_write(dev, SAHARA_CMD_CLEAR_INT | SAHARA_CMD_CLEAR_ERR,
1299                      SAHARA_REG_CMD);
1300
1301         sahara_decode_status(dev, stat);
1302
1303         if (SAHARA_STATUS_GET_STATE(stat) == SAHARA_STATE_BUSY) {
1304                 return IRQ_NONE;
1305         } else if (SAHARA_STATUS_GET_STATE(stat) == SAHARA_STATE_COMPLETE) {
1306                 dev->error = 0;
1307         } else {
1308                 sahara_decode_error(dev, err);
1309                 dev->error = -EINVAL;
1310         }
1311
1312         complete(&dev->dma_completion);
1313
1314         return IRQ_HANDLED;
1315 }
1316
1317
1318 static int sahara_register_algs(struct sahara_dev *dev)
1319 {
1320         int err;
1321         unsigned int i, j, k, l;
1322
1323         for (i = 0; i < ARRAY_SIZE(aes_algs); i++) {
1324                 INIT_LIST_HEAD(&aes_algs[i].cra_list);
1325                 err = crypto_register_alg(&aes_algs[i]);
1326                 if (err)
1327                         goto err_aes_algs;
1328         }
1329
1330         for (k = 0; k < ARRAY_SIZE(sha_v3_algs); k++) {
1331                 err = crypto_register_ahash(&sha_v3_algs[k]);
1332                 if (err)
1333                         goto err_sha_v3_algs;
1334         }
1335
1336         if (dev->version > SAHARA_VERSION_3)
1337                 for (l = 0; l < ARRAY_SIZE(sha_v4_algs); l++) {
1338                         err = crypto_register_ahash(&sha_v4_algs[l]);
1339                         if (err)
1340                                 goto err_sha_v4_algs;
1341                 }
1342
1343         return 0;
1344
1345 err_sha_v4_algs:
1346         for (j = 0; j < l; j++)
1347                 crypto_unregister_ahash(&sha_v4_algs[j]);
1348
1349 err_sha_v3_algs:
1350         for (j = 0; j < k; j++)
1351                 crypto_unregister_ahash(&sha_v3_algs[j]);
1352
1353 err_aes_algs:
1354         for (j = 0; j < i; j++)
1355                 crypto_unregister_alg(&aes_algs[j]);
1356
1357         return err;
1358 }
1359
1360 static void sahara_unregister_algs(struct sahara_dev *dev)
1361 {
1362         unsigned int i;
1363
1364         for (i = 0; i < ARRAY_SIZE(aes_algs); i++)
1365                 crypto_unregister_alg(&aes_algs[i]);
1366
1367         for (i = 0; i < ARRAY_SIZE(sha_v3_algs); i++)
1368                 crypto_unregister_ahash(&sha_v3_algs[i]);
1369
1370         if (dev->version > SAHARA_VERSION_3)
1371                 for (i = 0; i < ARRAY_SIZE(sha_v4_algs); i++)
1372                         crypto_unregister_ahash(&sha_v4_algs[i]);
1373 }
1374
1375 static const struct platform_device_id sahara_platform_ids[] = {
1376         { .name = "sahara-imx27" },
1377         { /* sentinel */ }
1378 };
1379 MODULE_DEVICE_TABLE(platform, sahara_platform_ids);
1380
1381 static const struct of_device_id sahara_dt_ids[] = {
1382         { .compatible = "fsl,imx53-sahara" },
1383         { .compatible = "fsl,imx27-sahara" },
1384         { /* sentinel */ }
1385 };
1386 MODULE_DEVICE_TABLE(of, sahara_dt_ids);
1387
1388 static int sahara_probe(struct platform_device *pdev)
1389 {
1390         struct sahara_dev *dev;
1391         struct resource *res;
1392         u32 version;
1393         int irq;
1394         int err;
1395         int i;
1396
1397         dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
1398         if (!dev)
1399                 return -ENOMEM;
1400
1401         dev->device = &pdev->dev;
1402         platform_set_drvdata(pdev, dev);
1403
1404         /* Get the base address */
1405         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1406         dev->regs_base = devm_ioremap_resource(&pdev->dev, res);
1407         if (IS_ERR(dev->regs_base))
1408                 return PTR_ERR(dev->regs_base);
1409
1410         /* Get the IRQ */
1411         irq = platform_get_irq(pdev,  0);
1412         if (irq < 0) {
1413                 dev_err(&pdev->dev, "failed to get irq resource\n");
1414                 return irq;
1415         }
1416
1417         err = devm_request_irq(&pdev->dev, irq, sahara_irq_handler,
1418                                0, dev_name(&pdev->dev), dev);
1419         if (err) {
1420                 dev_err(&pdev->dev, "failed to request irq\n");
1421                 return err;
1422         }
1423
1424         /* clocks */
1425         dev->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
1426         if (IS_ERR(dev->clk_ipg)) {
1427                 dev_err(&pdev->dev, "Could not get ipg clock\n");
1428                 return PTR_ERR(dev->clk_ipg);
1429         }
1430
1431         dev->clk_ahb = devm_clk_get(&pdev->dev, "ahb");
1432         if (IS_ERR(dev->clk_ahb)) {
1433                 dev_err(&pdev->dev, "Could not get ahb clock\n");
1434                 return PTR_ERR(dev->clk_ahb);
1435         }
1436
1437         /* Allocate HW descriptors */
1438         dev->hw_desc[0] = dmam_alloc_coherent(&pdev->dev,
1439                         SAHARA_MAX_HW_DESC * sizeof(struct sahara_hw_desc),
1440                         &dev->hw_phys_desc[0], GFP_KERNEL);
1441         if (!dev->hw_desc[0]) {
1442                 dev_err(&pdev->dev, "Could not allocate hw descriptors\n");
1443                 return -ENOMEM;
1444         }
1445         dev->hw_desc[1] = dev->hw_desc[0] + 1;
1446         dev->hw_phys_desc[1] = dev->hw_phys_desc[0] +
1447                                 sizeof(struct sahara_hw_desc);
1448
1449         /* Allocate space for iv and key */
1450         dev->key_base = dmam_alloc_coherent(&pdev->dev, 2 * AES_KEYSIZE_128,
1451                                 &dev->key_phys_base, GFP_KERNEL);
1452         if (!dev->key_base) {
1453                 dev_err(&pdev->dev, "Could not allocate memory for key\n");
1454                 return -ENOMEM;
1455         }
1456         dev->iv_base = dev->key_base + AES_KEYSIZE_128;
1457         dev->iv_phys_base = dev->key_phys_base + AES_KEYSIZE_128;
1458
1459         /* Allocate space for context: largest digest + message length field */
1460         dev->context_base = dmam_alloc_coherent(&pdev->dev,
1461                                         SHA256_DIGEST_SIZE + 4,
1462                                         &dev->context_phys_base, GFP_KERNEL);
1463         if (!dev->context_base) {
1464                 dev_err(&pdev->dev, "Could not allocate memory for MDHA context\n");
1465                 return -ENOMEM;
1466         }
1467
1468         /* Allocate space for HW links */
1469         dev->hw_link[0] = dmam_alloc_coherent(&pdev->dev,
1470                         SAHARA_MAX_HW_LINK * sizeof(struct sahara_hw_link),
1471                         &dev->hw_phys_link[0], GFP_KERNEL);
1472         if (!dev->hw_link[0]) {
1473                 dev_err(&pdev->dev, "Could not allocate hw links\n");
1474                 return -ENOMEM;
1475         }
1476         for (i = 1; i < SAHARA_MAX_HW_LINK; i++) {
1477                 dev->hw_phys_link[i] = dev->hw_phys_link[i - 1] +
1478                                         sizeof(struct sahara_hw_link);
1479                 dev->hw_link[i] = dev->hw_link[i - 1] + 1;
1480         }
1481
1482         crypto_init_queue(&dev->queue, SAHARA_QUEUE_LENGTH);
1483
1484         mutex_init(&dev->queue_mutex);
1485
1486         dev_ptr = dev;
1487
1488         dev->kthread = kthread_run(sahara_queue_manage, dev, "sahara_crypto");
1489         if (IS_ERR(dev->kthread)) {
1490                 return PTR_ERR(dev->kthread);
1491         }
1492
1493         init_completion(&dev->dma_completion);
1494
1495         err = clk_prepare_enable(dev->clk_ipg);
1496         if (err)
1497                 return err;
1498         err = clk_prepare_enable(dev->clk_ahb);
1499         if (err)
1500                 goto clk_ipg_disable;
1501
1502         version = sahara_read(dev, SAHARA_REG_VERSION);
1503         if (of_device_is_compatible(pdev->dev.of_node, "fsl,imx27-sahara")) {
1504                 if (version != SAHARA_VERSION_3)
1505                         err = -ENODEV;
1506         } else if (of_device_is_compatible(pdev->dev.of_node,
1507                         "fsl,imx53-sahara")) {
1508                 if (((version >> 8) & 0xff) != SAHARA_VERSION_4)
1509                         err = -ENODEV;
1510                 version = (version >> 8) & 0xff;
1511         }
1512         if (err == -ENODEV) {
1513                 dev_err(&pdev->dev, "SAHARA version %d not supported\n",
1514                                 version);
1515                 goto err_algs;
1516         }
1517
1518         dev->version = version;
1519
1520         sahara_write(dev, SAHARA_CMD_RESET | SAHARA_CMD_MODE_BATCH,
1521                      SAHARA_REG_CMD);
1522         sahara_write(dev, SAHARA_CONTROL_SET_THROTTLE(0) |
1523                         SAHARA_CONTROL_SET_MAXBURST(8) |
1524                         SAHARA_CONTROL_RNG_AUTORSD |
1525                         SAHARA_CONTROL_ENABLE_INT,
1526                         SAHARA_REG_CONTROL);
1527
1528         err = sahara_register_algs(dev);
1529         if (err)
1530                 goto err_algs;
1531
1532         dev_info(&pdev->dev, "SAHARA version %d initialized\n", version);
1533
1534         return 0;
1535
1536 err_algs:
1537         kthread_stop(dev->kthread);
1538         dev_ptr = NULL;
1539         clk_disable_unprepare(dev->clk_ahb);
1540 clk_ipg_disable:
1541         clk_disable_unprepare(dev->clk_ipg);
1542
1543         return err;
1544 }
1545
1546 static int sahara_remove(struct platform_device *pdev)
1547 {
1548         struct sahara_dev *dev = platform_get_drvdata(pdev);
1549
1550         kthread_stop(dev->kthread);
1551
1552         sahara_unregister_algs(dev);
1553
1554         clk_disable_unprepare(dev->clk_ipg);
1555         clk_disable_unprepare(dev->clk_ahb);
1556
1557         dev_ptr = NULL;
1558
1559         return 0;
1560 }
1561
1562 static struct platform_driver sahara_driver = {
1563         .probe          = sahara_probe,
1564         .remove         = sahara_remove,
1565         .driver         = {
1566                 .name   = SAHARA_NAME,
1567                 .of_match_table = sahara_dt_ids,
1568         },
1569         .id_table = sahara_platform_ids,
1570 };
1571
1572 module_platform_driver(sahara_driver);
1573
1574 MODULE_LICENSE("GPL");
1575 MODULE_AUTHOR("Javier Martin <javier.martin@vista-silicon.com>");
1576 MODULE_AUTHOR("Steffen Trumtrar <s.trumtrar@pengutronix.de>");
1577 MODULE_DESCRIPTION("SAHARA2 HW crypto accelerator");