Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[sfrench/cifs-2.6.git] / 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                 err = crypto_register_alg(&aes_algs[i]);
1325                 if (err)
1326                         goto err_aes_algs;
1327         }
1328
1329         for (k = 0; k < ARRAY_SIZE(sha_v3_algs); k++) {
1330                 err = crypto_register_ahash(&sha_v3_algs[k]);
1331                 if (err)
1332                         goto err_sha_v3_algs;
1333         }
1334
1335         if (dev->version > SAHARA_VERSION_3)
1336                 for (l = 0; l < ARRAY_SIZE(sha_v4_algs); l++) {
1337                         err = crypto_register_ahash(&sha_v4_algs[l]);
1338                         if (err)
1339                                 goto err_sha_v4_algs;
1340                 }
1341
1342         return 0;
1343
1344 err_sha_v4_algs:
1345         for (j = 0; j < l; j++)
1346                 crypto_unregister_ahash(&sha_v4_algs[j]);
1347
1348 err_sha_v3_algs:
1349         for (j = 0; j < k; j++)
1350                 crypto_unregister_ahash(&sha_v3_algs[j]);
1351
1352 err_aes_algs:
1353         for (j = 0; j < i; j++)
1354                 crypto_unregister_alg(&aes_algs[j]);
1355
1356         return err;
1357 }
1358
1359 static void sahara_unregister_algs(struct sahara_dev *dev)
1360 {
1361         unsigned int i;
1362
1363         for (i = 0; i < ARRAY_SIZE(aes_algs); i++)
1364                 crypto_unregister_alg(&aes_algs[i]);
1365
1366         for (i = 0; i < ARRAY_SIZE(sha_v3_algs); i++)
1367                 crypto_unregister_ahash(&sha_v3_algs[i]);
1368
1369         if (dev->version > SAHARA_VERSION_3)
1370                 for (i = 0; i < ARRAY_SIZE(sha_v4_algs); i++)
1371                         crypto_unregister_ahash(&sha_v4_algs[i]);
1372 }
1373
1374 static const struct platform_device_id sahara_platform_ids[] = {
1375         { .name = "sahara-imx27" },
1376         { /* sentinel */ }
1377 };
1378 MODULE_DEVICE_TABLE(platform, sahara_platform_ids);
1379
1380 static const struct of_device_id sahara_dt_ids[] = {
1381         { .compatible = "fsl,imx53-sahara" },
1382         { .compatible = "fsl,imx27-sahara" },
1383         { /* sentinel */ }
1384 };
1385 MODULE_DEVICE_TABLE(of, sahara_dt_ids);
1386
1387 static int sahara_probe(struct platform_device *pdev)
1388 {
1389         struct sahara_dev *dev;
1390         struct resource *res;
1391         u32 version;
1392         int irq;
1393         int err;
1394         int i;
1395
1396         dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
1397         if (!dev)
1398                 return -ENOMEM;
1399
1400         dev->device = &pdev->dev;
1401         platform_set_drvdata(pdev, dev);
1402
1403         /* Get the base address */
1404         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1405         dev->regs_base = devm_ioremap_resource(&pdev->dev, res);
1406         if (IS_ERR(dev->regs_base))
1407                 return PTR_ERR(dev->regs_base);
1408
1409         /* Get the IRQ */
1410         irq = platform_get_irq(pdev,  0);
1411         if (irq < 0) {
1412                 dev_err(&pdev->dev, "failed to get irq resource\n");
1413                 return irq;
1414         }
1415
1416         err = devm_request_irq(&pdev->dev, irq, sahara_irq_handler,
1417                                0, dev_name(&pdev->dev), dev);
1418         if (err) {
1419                 dev_err(&pdev->dev, "failed to request irq\n");
1420                 return err;
1421         }
1422
1423         /* clocks */
1424         dev->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
1425         if (IS_ERR(dev->clk_ipg)) {
1426                 dev_err(&pdev->dev, "Could not get ipg clock\n");
1427                 return PTR_ERR(dev->clk_ipg);
1428         }
1429
1430         dev->clk_ahb = devm_clk_get(&pdev->dev, "ahb");
1431         if (IS_ERR(dev->clk_ahb)) {
1432                 dev_err(&pdev->dev, "Could not get ahb clock\n");
1433                 return PTR_ERR(dev->clk_ahb);
1434         }
1435
1436         /* Allocate HW descriptors */
1437         dev->hw_desc[0] = dmam_alloc_coherent(&pdev->dev,
1438                         SAHARA_MAX_HW_DESC * sizeof(struct sahara_hw_desc),
1439                         &dev->hw_phys_desc[0], GFP_KERNEL);
1440         if (!dev->hw_desc[0]) {
1441                 dev_err(&pdev->dev, "Could not allocate hw descriptors\n");
1442                 return -ENOMEM;
1443         }
1444         dev->hw_desc[1] = dev->hw_desc[0] + 1;
1445         dev->hw_phys_desc[1] = dev->hw_phys_desc[0] +
1446                                 sizeof(struct sahara_hw_desc);
1447
1448         /* Allocate space for iv and key */
1449         dev->key_base = dmam_alloc_coherent(&pdev->dev, 2 * AES_KEYSIZE_128,
1450                                 &dev->key_phys_base, GFP_KERNEL);
1451         if (!dev->key_base) {
1452                 dev_err(&pdev->dev, "Could not allocate memory for key\n");
1453                 return -ENOMEM;
1454         }
1455         dev->iv_base = dev->key_base + AES_KEYSIZE_128;
1456         dev->iv_phys_base = dev->key_phys_base + AES_KEYSIZE_128;
1457
1458         /* Allocate space for context: largest digest + message length field */
1459         dev->context_base = dmam_alloc_coherent(&pdev->dev,
1460                                         SHA256_DIGEST_SIZE + 4,
1461                                         &dev->context_phys_base, GFP_KERNEL);
1462         if (!dev->context_base) {
1463                 dev_err(&pdev->dev, "Could not allocate memory for MDHA context\n");
1464                 return -ENOMEM;
1465         }
1466
1467         /* Allocate space for HW links */
1468         dev->hw_link[0] = dmam_alloc_coherent(&pdev->dev,
1469                         SAHARA_MAX_HW_LINK * sizeof(struct sahara_hw_link),
1470                         &dev->hw_phys_link[0], GFP_KERNEL);
1471         if (!dev->hw_link[0]) {
1472                 dev_err(&pdev->dev, "Could not allocate hw links\n");
1473                 return -ENOMEM;
1474         }
1475         for (i = 1; i < SAHARA_MAX_HW_LINK; i++) {
1476                 dev->hw_phys_link[i] = dev->hw_phys_link[i - 1] +
1477                                         sizeof(struct sahara_hw_link);
1478                 dev->hw_link[i] = dev->hw_link[i - 1] + 1;
1479         }
1480
1481         crypto_init_queue(&dev->queue, SAHARA_QUEUE_LENGTH);
1482
1483         mutex_init(&dev->queue_mutex);
1484
1485         dev_ptr = dev;
1486
1487         dev->kthread = kthread_run(sahara_queue_manage, dev, "sahara_crypto");
1488         if (IS_ERR(dev->kthread)) {
1489                 return PTR_ERR(dev->kthread);
1490         }
1491
1492         init_completion(&dev->dma_completion);
1493
1494         err = clk_prepare_enable(dev->clk_ipg);
1495         if (err)
1496                 return err;
1497         err = clk_prepare_enable(dev->clk_ahb);
1498         if (err)
1499                 goto clk_ipg_disable;
1500
1501         version = sahara_read(dev, SAHARA_REG_VERSION);
1502         if (of_device_is_compatible(pdev->dev.of_node, "fsl,imx27-sahara")) {
1503                 if (version != SAHARA_VERSION_3)
1504                         err = -ENODEV;
1505         } else if (of_device_is_compatible(pdev->dev.of_node,
1506                         "fsl,imx53-sahara")) {
1507                 if (((version >> 8) & 0xff) != SAHARA_VERSION_4)
1508                         err = -ENODEV;
1509                 version = (version >> 8) & 0xff;
1510         }
1511         if (err == -ENODEV) {
1512                 dev_err(&pdev->dev, "SAHARA version %d not supported\n",
1513                                 version);
1514                 goto err_algs;
1515         }
1516
1517         dev->version = version;
1518
1519         sahara_write(dev, SAHARA_CMD_RESET | SAHARA_CMD_MODE_BATCH,
1520                      SAHARA_REG_CMD);
1521         sahara_write(dev, SAHARA_CONTROL_SET_THROTTLE(0) |
1522                         SAHARA_CONTROL_SET_MAXBURST(8) |
1523                         SAHARA_CONTROL_RNG_AUTORSD |
1524                         SAHARA_CONTROL_ENABLE_INT,
1525                         SAHARA_REG_CONTROL);
1526
1527         err = sahara_register_algs(dev);
1528         if (err)
1529                 goto err_algs;
1530
1531         dev_info(&pdev->dev, "SAHARA version %d initialized\n", version);
1532
1533         return 0;
1534
1535 err_algs:
1536         kthread_stop(dev->kthread);
1537         dev_ptr = NULL;
1538         clk_disable_unprepare(dev->clk_ahb);
1539 clk_ipg_disable:
1540         clk_disable_unprepare(dev->clk_ipg);
1541
1542         return err;
1543 }
1544
1545 static int sahara_remove(struct platform_device *pdev)
1546 {
1547         struct sahara_dev *dev = platform_get_drvdata(pdev);
1548
1549         kthread_stop(dev->kthread);
1550
1551         sahara_unregister_algs(dev);
1552
1553         clk_disable_unprepare(dev->clk_ipg);
1554         clk_disable_unprepare(dev->clk_ahb);
1555
1556         dev_ptr = NULL;
1557
1558         return 0;
1559 }
1560
1561 static struct platform_driver sahara_driver = {
1562         .probe          = sahara_probe,
1563         .remove         = sahara_remove,
1564         .driver         = {
1565                 .name   = SAHARA_NAME,
1566                 .of_match_table = sahara_dt_ids,
1567         },
1568         .id_table = sahara_platform_ids,
1569 };
1570
1571 module_platform_driver(sahara_driver);
1572
1573 MODULE_LICENSE("GPL");
1574 MODULE_AUTHOR("Javier Martin <javier.martin@vista-silicon.com>");
1575 MODULE_AUTHOR("Steffen Trumtrar <s.trumtrar@pengutronix.de>");
1576 MODULE_DESCRIPTION("SAHARA2 HW crypto accelerator");