Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[sfrench/cifs-2.6.git] / drivers / crypto / talitos.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * talitos - Freescale Integrated Security Engine (SEC) device driver
4  *
5  * Copyright (c) 2008-2011 Freescale Semiconductor, Inc.
6  *
7  * Scatterlist Crypto API glue code copied from files with the following:
8  * Copyright (c) 2006-2007 Herbert Xu <herbert@gondor.apana.org.au>
9  *
10  * Crypto algorithm registration code copied from hifn driver:
11  * 2007+ Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
12  * All rights reserved.
13  */
14
15 #include <linux/kernel.h>
16 #include <linux/module.h>
17 #include <linux/mod_devicetable.h>
18 #include <linux/device.h>
19 #include <linux/interrupt.h>
20 #include <linux/crypto.h>
21 #include <linux/hw_random.h>
22 #include <linux/of_address.h>
23 #include <linux/of_irq.h>
24 #include <linux/of_platform.h>
25 #include <linux/dma-mapping.h>
26 #include <linux/io.h>
27 #include <linux/spinlock.h>
28 #include <linux/rtnetlink.h>
29 #include <linux/slab.h>
30
31 #include <crypto/algapi.h>
32 #include <crypto/aes.h>
33 #include <crypto/des.h>
34 #include <crypto/sha.h>
35 #include <crypto/md5.h>
36 #include <crypto/internal/aead.h>
37 #include <crypto/authenc.h>
38 #include <crypto/skcipher.h>
39 #include <crypto/hash.h>
40 #include <crypto/internal/hash.h>
41 #include <crypto/scatterwalk.h>
42
43 #include "talitos.h"
44
45 static void to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_addr,
46                            unsigned int len, bool is_sec1)
47 {
48         ptr->ptr = cpu_to_be32(lower_32_bits(dma_addr));
49         if (is_sec1) {
50                 ptr->len1 = cpu_to_be16(len);
51         } else {
52                 ptr->len = cpu_to_be16(len);
53                 ptr->eptr = upper_32_bits(dma_addr);
54         }
55 }
56
57 static void copy_talitos_ptr(struct talitos_ptr *dst_ptr,
58                              struct talitos_ptr *src_ptr, bool is_sec1)
59 {
60         dst_ptr->ptr = src_ptr->ptr;
61         if (is_sec1) {
62                 dst_ptr->len1 = src_ptr->len1;
63         } else {
64                 dst_ptr->len = src_ptr->len;
65                 dst_ptr->eptr = src_ptr->eptr;
66         }
67 }
68
69 static unsigned short from_talitos_ptr_len(struct talitos_ptr *ptr,
70                                            bool is_sec1)
71 {
72         if (is_sec1)
73                 return be16_to_cpu(ptr->len1);
74         else
75                 return be16_to_cpu(ptr->len);
76 }
77
78 static void to_talitos_ptr_ext_set(struct talitos_ptr *ptr, u8 val,
79                                    bool is_sec1)
80 {
81         if (!is_sec1)
82                 ptr->j_extent = val;
83 }
84
85 static void to_talitos_ptr_ext_or(struct talitos_ptr *ptr, u8 val, bool is_sec1)
86 {
87         if (!is_sec1)
88                 ptr->j_extent |= val;
89 }
90
91 /*
92  * map virtual single (contiguous) pointer to h/w descriptor pointer
93  */
94 static void __map_single_talitos_ptr(struct device *dev,
95                                      struct talitos_ptr *ptr,
96                                      unsigned int len, void *data,
97                                      enum dma_data_direction dir,
98                                      unsigned long attrs)
99 {
100         dma_addr_t dma_addr = dma_map_single_attrs(dev, data, len, dir, attrs);
101         struct talitos_private *priv = dev_get_drvdata(dev);
102         bool is_sec1 = has_ftr_sec1(priv);
103
104         to_talitos_ptr(ptr, dma_addr, len, is_sec1);
105 }
106
107 static void map_single_talitos_ptr(struct device *dev,
108                                    struct talitos_ptr *ptr,
109                                    unsigned int len, void *data,
110                                    enum dma_data_direction dir)
111 {
112         __map_single_talitos_ptr(dev, ptr, len, data, dir, 0);
113 }
114
115 static void map_single_talitos_ptr_nosync(struct device *dev,
116                                           struct talitos_ptr *ptr,
117                                           unsigned int len, void *data,
118                                           enum dma_data_direction dir)
119 {
120         __map_single_talitos_ptr(dev, ptr, len, data, dir,
121                                  DMA_ATTR_SKIP_CPU_SYNC);
122 }
123
124 /*
125  * unmap bus single (contiguous) h/w descriptor pointer
126  */
127 static void unmap_single_talitos_ptr(struct device *dev,
128                                      struct talitos_ptr *ptr,
129                                      enum dma_data_direction dir)
130 {
131         struct talitos_private *priv = dev_get_drvdata(dev);
132         bool is_sec1 = has_ftr_sec1(priv);
133
134         dma_unmap_single(dev, be32_to_cpu(ptr->ptr),
135                          from_talitos_ptr_len(ptr, is_sec1), dir);
136 }
137
138 static int reset_channel(struct device *dev, int ch)
139 {
140         struct talitos_private *priv = dev_get_drvdata(dev);
141         unsigned int timeout = TALITOS_TIMEOUT;
142         bool is_sec1 = has_ftr_sec1(priv);
143
144         if (is_sec1) {
145                 setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO,
146                           TALITOS1_CCCR_LO_RESET);
147
148                 while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR_LO) &
149                         TALITOS1_CCCR_LO_RESET) && --timeout)
150                         cpu_relax();
151         } else {
152                 setbits32(priv->chan[ch].reg + TALITOS_CCCR,
153                           TALITOS2_CCCR_RESET);
154
155                 while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR) &
156                         TALITOS2_CCCR_RESET) && --timeout)
157                         cpu_relax();
158         }
159
160         if (timeout == 0) {
161                 dev_err(dev, "failed to reset channel %d\n", ch);
162                 return -EIO;
163         }
164
165         /* set 36-bit addressing, done writeback enable and done IRQ enable */
166         setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, TALITOS_CCCR_LO_EAE |
167                   TALITOS_CCCR_LO_CDWE | TALITOS_CCCR_LO_CDIE);
168         /* enable chaining descriptors */
169         if (is_sec1)
170                 setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO,
171                           TALITOS_CCCR_LO_NE);
172
173         /* and ICCR writeback, if available */
174         if (priv->features & TALITOS_FTR_HW_AUTH_CHECK)
175                 setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO,
176                           TALITOS_CCCR_LO_IWSE);
177
178         return 0;
179 }
180
181 static int reset_device(struct device *dev)
182 {
183         struct talitos_private *priv = dev_get_drvdata(dev);
184         unsigned int timeout = TALITOS_TIMEOUT;
185         bool is_sec1 = has_ftr_sec1(priv);
186         u32 mcr = is_sec1 ? TALITOS1_MCR_SWR : TALITOS2_MCR_SWR;
187
188         setbits32(priv->reg + TALITOS_MCR, mcr);
189
190         while ((in_be32(priv->reg + TALITOS_MCR) & mcr)
191                && --timeout)
192                 cpu_relax();
193
194         if (priv->irq[1]) {
195                 mcr = TALITOS_MCR_RCA1 | TALITOS_MCR_RCA3;
196                 setbits32(priv->reg + TALITOS_MCR, mcr);
197         }
198
199         if (timeout == 0) {
200                 dev_err(dev, "failed to reset device\n");
201                 return -EIO;
202         }
203
204         return 0;
205 }
206
207 /*
208  * Reset and initialize the device
209  */
210 static int init_device(struct device *dev)
211 {
212         struct talitos_private *priv = dev_get_drvdata(dev);
213         int ch, err;
214         bool is_sec1 = has_ftr_sec1(priv);
215
216         /*
217          * Master reset
218          * errata documentation: warning: certain SEC interrupts
219          * are not fully cleared by writing the MCR:SWR bit,
220          * set bit twice to completely reset
221          */
222         err = reset_device(dev);
223         if (err)
224                 return err;
225
226         err = reset_device(dev);
227         if (err)
228                 return err;
229
230         /* reset channels */
231         for (ch = 0; ch < priv->num_channels; ch++) {
232                 err = reset_channel(dev, ch);
233                 if (err)
234                         return err;
235         }
236
237         /* enable channel done and error interrupts */
238         if (is_sec1) {
239                 clrbits32(priv->reg + TALITOS_IMR, TALITOS1_IMR_INIT);
240                 clrbits32(priv->reg + TALITOS_IMR_LO, TALITOS1_IMR_LO_INIT);
241                 /* disable parity error check in DEU (erroneous? test vect.) */
242                 setbits32(priv->reg_deu + TALITOS_EUICR, TALITOS1_DEUICR_KPE);
243         } else {
244                 setbits32(priv->reg + TALITOS_IMR, TALITOS2_IMR_INIT);
245                 setbits32(priv->reg + TALITOS_IMR_LO, TALITOS2_IMR_LO_INIT);
246         }
247
248         /* disable integrity check error interrupts (use writeback instead) */
249         if (priv->features & TALITOS_FTR_HW_AUTH_CHECK)
250                 setbits32(priv->reg_mdeu + TALITOS_EUICR_LO,
251                           TALITOS_MDEUICR_LO_ICE);
252
253         return 0;
254 }
255
256 /**
257  * talitos_submit - submits a descriptor to the device for processing
258  * @dev:        the SEC device to be used
259  * @ch:         the SEC device channel to be used
260  * @desc:       the descriptor to be processed by the device
261  * @callback:   whom to call when processing is complete
262  * @context:    a handle for use by caller (optional)
263  *
264  * desc must contain valid dma-mapped (bus physical) address pointers.
265  * callback must check err and feedback in descriptor header
266  * for device processing status.
267  */
268 static int talitos_submit(struct device *dev, int ch, struct talitos_desc *desc,
269                           void (*callback)(struct device *dev,
270                                            struct talitos_desc *desc,
271                                            void *context, int error),
272                           void *context)
273 {
274         struct talitos_private *priv = dev_get_drvdata(dev);
275         struct talitos_request *request;
276         unsigned long flags;
277         int head;
278         bool is_sec1 = has_ftr_sec1(priv);
279
280         spin_lock_irqsave(&priv->chan[ch].head_lock, flags);
281
282         if (!atomic_inc_not_zero(&priv->chan[ch].submit_count)) {
283                 /* h/w fifo is full */
284                 spin_unlock_irqrestore(&priv->chan[ch].head_lock, flags);
285                 return -EAGAIN;
286         }
287
288         head = priv->chan[ch].head;
289         request = &priv->chan[ch].fifo[head];
290
291         /* map descriptor and save caller data */
292         if (is_sec1) {
293                 desc->hdr1 = desc->hdr;
294                 request->dma_desc = dma_map_single(dev, &desc->hdr1,
295                                                    TALITOS_DESC_SIZE,
296                                                    DMA_BIDIRECTIONAL);
297         } else {
298                 request->dma_desc = dma_map_single(dev, desc,
299                                                    TALITOS_DESC_SIZE,
300                                                    DMA_BIDIRECTIONAL);
301         }
302         request->callback = callback;
303         request->context = context;
304
305         /* increment fifo head */
306         priv->chan[ch].head = (priv->chan[ch].head + 1) & (priv->fifo_len - 1);
307
308         smp_wmb();
309         request->desc = desc;
310
311         /* GO! */
312         wmb();
313         out_be32(priv->chan[ch].reg + TALITOS_FF,
314                  upper_32_bits(request->dma_desc));
315         out_be32(priv->chan[ch].reg + TALITOS_FF_LO,
316                  lower_32_bits(request->dma_desc));
317
318         spin_unlock_irqrestore(&priv->chan[ch].head_lock, flags);
319
320         return -EINPROGRESS;
321 }
322
323 static __be32 get_request_hdr(struct talitos_request *request, bool is_sec1)
324 {
325         struct talitos_edesc *edesc;
326
327         if (!is_sec1)
328                 return request->desc->hdr;
329
330         if (!request->desc->next_desc)
331                 return request->desc->hdr1;
332
333         edesc = container_of(request->desc, struct talitos_edesc, desc);
334
335         return ((struct talitos_desc *)(edesc->buf + edesc->dma_len))->hdr1;
336 }
337
338 /*
339  * process what was done, notify callback of error if not
340  */
341 static void flush_channel(struct device *dev, int ch, int error, int reset_ch)
342 {
343         struct talitos_private *priv = dev_get_drvdata(dev);
344         struct talitos_request *request, saved_req;
345         unsigned long flags;
346         int tail, status;
347         bool is_sec1 = has_ftr_sec1(priv);
348
349         spin_lock_irqsave(&priv->chan[ch].tail_lock, flags);
350
351         tail = priv->chan[ch].tail;
352         while (priv->chan[ch].fifo[tail].desc) {
353                 __be32 hdr;
354
355                 request = &priv->chan[ch].fifo[tail];
356
357                 /* descriptors with their done bits set don't get the error */
358                 rmb();
359                 hdr = get_request_hdr(request, is_sec1);
360
361                 if ((hdr & DESC_HDR_DONE) == DESC_HDR_DONE)
362                         status = 0;
363                 else
364                         if (!error)
365                                 break;
366                         else
367                                 status = error;
368
369                 dma_unmap_single(dev, request->dma_desc,
370                                  TALITOS_DESC_SIZE,
371                                  DMA_BIDIRECTIONAL);
372
373                 /* copy entries so we can call callback outside lock */
374                 saved_req.desc = request->desc;
375                 saved_req.callback = request->callback;
376                 saved_req.context = request->context;
377
378                 /* release request entry in fifo */
379                 smp_wmb();
380                 request->desc = NULL;
381
382                 /* increment fifo tail */
383                 priv->chan[ch].tail = (tail + 1) & (priv->fifo_len - 1);
384
385                 spin_unlock_irqrestore(&priv->chan[ch].tail_lock, flags);
386
387                 atomic_dec(&priv->chan[ch].submit_count);
388
389                 saved_req.callback(dev, saved_req.desc, saved_req.context,
390                                    status);
391                 /* channel may resume processing in single desc error case */
392                 if (error && !reset_ch && status == error)
393                         return;
394                 spin_lock_irqsave(&priv->chan[ch].tail_lock, flags);
395                 tail = priv->chan[ch].tail;
396         }
397
398         spin_unlock_irqrestore(&priv->chan[ch].tail_lock, flags);
399 }
400
401 /*
402  * process completed requests for channels that have done status
403  */
404 #define DEF_TALITOS1_DONE(name, ch_done_mask)                           \
405 static void talitos1_done_##name(unsigned long data)                    \
406 {                                                                       \
407         struct device *dev = (struct device *)data;                     \
408         struct talitos_private *priv = dev_get_drvdata(dev);            \
409         unsigned long flags;                                            \
410                                                                         \
411         if (ch_done_mask & 0x10000000)                                  \
412                 flush_channel(dev, 0, 0, 0);                    \
413         if (ch_done_mask & 0x40000000)                                  \
414                 flush_channel(dev, 1, 0, 0);                    \
415         if (ch_done_mask & 0x00010000)                                  \
416                 flush_channel(dev, 2, 0, 0);                    \
417         if (ch_done_mask & 0x00040000)                                  \
418                 flush_channel(dev, 3, 0, 0);                    \
419                                                                         \
420         /* At this point, all completed channels have been processed */ \
421         /* Unmask done interrupts for channels completed later on. */   \
422         spin_lock_irqsave(&priv->reg_lock, flags);                      \
423         clrbits32(priv->reg + TALITOS_IMR, ch_done_mask);               \
424         clrbits32(priv->reg + TALITOS_IMR_LO, TALITOS1_IMR_LO_INIT);    \
425         spin_unlock_irqrestore(&priv->reg_lock, flags);                 \
426 }
427
428 DEF_TALITOS1_DONE(4ch, TALITOS1_ISR_4CHDONE)
429 DEF_TALITOS1_DONE(ch0, TALITOS1_ISR_CH_0_DONE)
430
431 #define DEF_TALITOS2_DONE(name, ch_done_mask)                           \
432 static void talitos2_done_##name(unsigned long data)                    \
433 {                                                                       \
434         struct device *dev = (struct device *)data;                     \
435         struct talitos_private *priv = dev_get_drvdata(dev);            \
436         unsigned long flags;                                            \
437                                                                         \
438         if (ch_done_mask & 1)                                           \
439                 flush_channel(dev, 0, 0, 0);                            \
440         if (ch_done_mask & (1 << 2))                                    \
441                 flush_channel(dev, 1, 0, 0);                            \
442         if (ch_done_mask & (1 << 4))                                    \
443                 flush_channel(dev, 2, 0, 0);                            \
444         if (ch_done_mask & (1 << 6))                                    \
445                 flush_channel(dev, 3, 0, 0);                            \
446                                                                         \
447         /* At this point, all completed channels have been processed */ \
448         /* Unmask done interrupts for channels completed later on. */   \
449         spin_lock_irqsave(&priv->reg_lock, flags);                      \
450         setbits32(priv->reg + TALITOS_IMR, ch_done_mask);               \
451         setbits32(priv->reg + TALITOS_IMR_LO, TALITOS2_IMR_LO_INIT);    \
452         spin_unlock_irqrestore(&priv->reg_lock, flags);                 \
453 }
454
455 DEF_TALITOS2_DONE(4ch, TALITOS2_ISR_4CHDONE)
456 DEF_TALITOS2_DONE(ch0, TALITOS2_ISR_CH_0_DONE)
457 DEF_TALITOS2_DONE(ch0_2, TALITOS2_ISR_CH_0_2_DONE)
458 DEF_TALITOS2_DONE(ch1_3, TALITOS2_ISR_CH_1_3_DONE)
459
460 /*
461  * locate current (offending) descriptor
462  */
463 static u32 current_desc_hdr(struct device *dev, int ch)
464 {
465         struct talitos_private *priv = dev_get_drvdata(dev);
466         int tail, iter;
467         dma_addr_t cur_desc;
468
469         cur_desc = ((u64)in_be32(priv->chan[ch].reg + TALITOS_CDPR)) << 32;
470         cur_desc |= in_be32(priv->chan[ch].reg + TALITOS_CDPR_LO);
471
472         if (!cur_desc) {
473                 dev_err(dev, "CDPR is NULL, giving up search for offending descriptor\n");
474                 return 0;
475         }
476
477         tail = priv->chan[ch].tail;
478
479         iter = tail;
480         while (priv->chan[ch].fifo[iter].dma_desc != cur_desc &&
481                priv->chan[ch].fifo[iter].desc->next_desc != cur_desc) {
482                 iter = (iter + 1) & (priv->fifo_len - 1);
483                 if (iter == tail) {
484                         dev_err(dev, "couldn't locate current descriptor\n");
485                         return 0;
486                 }
487         }
488
489         if (priv->chan[ch].fifo[iter].desc->next_desc == cur_desc) {
490                 struct talitos_edesc *edesc;
491
492                 edesc = container_of(priv->chan[ch].fifo[iter].desc,
493                                      struct talitos_edesc, desc);
494                 return ((struct talitos_desc *)
495                         (edesc->buf + edesc->dma_len))->hdr;
496         }
497
498         return priv->chan[ch].fifo[iter].desc->hdr;
499 }
500
501 /*
502  * user diagnostics; report root cause of error based on execution unit status
503  */
504 static void report_eu_error(struct device *dev, int ch, u32 desc_hdr)
505 {
506         struct talitos_private *priv = dev_get_drvdata(dev);
507         int i;
508
509         if (!desc_hdr)
510                 desc_hdr = in_be32(priv->chan[ch].reg + TALITOS_DESCBUF);
511
512         switch (desc_hdr & DESC_HDR_SEL0_MASK) {
513         case DESC_HDR_SEL0_AFEU:
514                 dev_err(dev, "AFEUISR 0x%08x_%08x\n",
515                         in_be32(priv->reg_afeu + TALITOS_EUISR),
516                         in_be32(priv->reg_afeu + TALITOS_EUISR_LO));
517                 break;
518         case DESC_HDR_SEL0_DEU:
519                 dev_err(dev, "DEUISR 0x%08x_%08x\n",
520                         in_be32(priv->reg_deu + TALITOS_EUISR),
521                         in_be32(priv->reg_deu + TALITOS_EUISR_LO));
522                 break;
523         case DESC_HDR_SEL0_MDEUA:
524         case DESC_HDR_SEL0_MDEUB:
525                 dev_err(dev, "MDEUISR 0x%08x_%08x\n",
526                         in_be32(priv->reg_mdeu + TALITOS_EUISR),
527                         in_be32(priv->reg_mdeu + TALITOS_EUISR_LO));
528                 break;
529         case DESC_HDR_SEL0_RNG:
530                 dev_err(dev, "RNGUISR 0x%08x_%08x\n",
531                         in_be32(priv->reg_rngu + TALITOS_ISR),
532                         in_be32(priv->reg_rngu + TALITOS_ISR_LO));
533                 break;
534         case DESC_HDR_SEL0_PKEU:
535                 dev_err(dev, "PKEUISR 0x%08x_%08x\n",
536                         in_be32(priv->reg_pkeu + TALITOS_EUISR),
537                         in_be32(priv->reg_pkeu + TALITOS_EUISR_LO));
538                 break;
539         case DESC_HDR_SEL0_AESU:
540                 dev_err(dev, "AESUISR 0x%08x_%08x\n",
541                         in_be32(priv->reg_aesu + TALITOS_EUISR),
542                         in_be32(priv->reg_aesu + TALITOS_EUISR_LO));
543                 break;
544         case DESC_HDR_SEL0_CRCU:
545                 dev_err(dev, "CRCUISR 0x%08x_%08x\n",
546                         in_be32(priv->reg_crcu + TALITOS_EUISR),
547                         in_be32(priv->reg_crcu + TALITOS_EUISR_LO));
548                 break;
549         case DESC_HDR_SEL0_KEU:
550                 dev_err(dev, "KEUISR 0x%08x_%08x\n",
551                         in_be32(priv->reg_pkeu + TALITOS_EUISR),
552                         in_be32(priv->reg_pkeu + TALITOS_EUISR_LO));
553                 break;
554         }
555
556         switch (desc_hdr & DESC_HDR_SEL1_MASK) {
557         case DESC_HDR_SEL1_MDEUA:
558         case DESC_HDR_SEL1_MDEUB:
559                 dev_err(dev, "MDEUISR 0x%08x_%08x\n",
560                         in_be32(priv->reg_mdeu + TALITOS_EUISR),
561                         in_be32(priv->reg_mdeu + TALITOS_EUISR_LO));
562                 break;
563         case DESC_HDR_SEL1_CRCU:
564                 dev_err(dev, "CRCUISR 0x%08x_%08x\n",
565                         in_be32(priv->reg_crcu + TALITOS_EUISR),
566                         in_be32(priv->reg_crcu + TALITOS_EUISR_LO));
567                 break;
568         }
569
570         for (i = 0; i < 8; i++)
571                 dev_err(dev, "DESCBUF 0x%08x_%08x\n",
572                         in_be32(priv->chan[ch].reg + TALITOS_DESCBUF + 8*i),
573                         in_be32(priv->chan[ch].reg + TALITOS_DESCBUF_LO + 8*i));
574 }
575
576 /*
577  * recover from error interrupts
578  */
579 static void talitos_error(struct device *dev, u32 isr, u32 isr_lo)
580 {
581         struct talitos_private *priv = dev_get_drvdata(dev);
582         unsigned int timeout = TALITOS_TIMEOUT;
583         int ch, error, reset_dev = 0;
584         u32 v_lo;
585         bool is_sec1 = has_ftr_sec1(priv);
586         int reset_ch = is_sec1 ? 1 : 0; /* only SEC2 supports continuation */
587
588         for (ch = 0; ch < priv->num_channels; ch++) {
589                 /* skip channels without errors */
590                 if (is_sec1) {
591                         /* bits 29, 31, 17, 19 */
592                         if (!(isr & (1 << (29 + (ch & 1) * 2 - (ch & 2) * 6))))
593                                 continue;
594                 } else {
595                         if (!(isr & (1 << (ch * 2 + 1))))
596                                 continue;
597                 }
598
599                 error = -EINVAL;
600
601                 v_lo = in_be32(priv->chan[ch].reg + TALITOS_CCPSR_LO);
602
603                 if (v_lo & TALITOS_CCPSR_LO_DOF) {
604                         dev_err(dev, "double fetch fifo overflow error\n");
605                         error = -EAGAIN;
606                         reset_ch = 1;
607                 }
608                 if (v_lo & TALITOS_CCPSR_LO_SOF) {
609                         /* h/w dropped descriptor */
610                         dev_err(dev, "single fetch fifo overflow error\n");
611                         error = -EAGAIN;
612                 }
613                 if (v_lo & TALITOS_CCPSR_LO_MDTE)
614                         dev_err(dev, "master data transfer error\n");
615                 if (v_lo & TALITOS_CCPSR_LO_SGDLZ)
616                         dev_err(dev, is_sec1 ? "pointer not complete error\n"
617                                              : "s/g data length zero error\n");
618                 if (v_lo & TALITOS_CCPSR_LO_FPZ)
619                         dev_err(dev, is_sec1 ? "parity error\n"
620                                              : "fetch pointer zero error\n");
621                 if (v_lo & TALITOS_CCPSR_LO_IDH)
622                         dev_err(dev, "illegal descriptor header error\n");
623                 if (v_lo & TALITOS_CCPSR_LO_IEU)
624                         dev_err(dev, is_sec1 ? "static assignment error\n"
625                                              : "invalid exec unit error\n");
626                 if (v_lo & TALITOS_CCPSR_LO_EU)
627                         report_eu_error(dev, ch, current_desc_hdr(dev, ch));
628                 if (!is_sec1) {
629                         if (v_lo & TALITOS_CCPSR_LO_GB)
630                                 dev_err(dev, "gather boundary error\n");
631                         if (v_lo & TALITOS_CCPSR_LO_GRL)
632                                 dev_err(dev, "gather return/length error\n");
633                         if (v_lo & TALITOS_CCPSR_LO_SB)
634                                 dev_err(dev, "scatter boundary error\n");
635                         if (v_lo & TALITOS_CCPSR_LO_SRL)
636                                 dev_err(dev, "scatter return/length error\n");
637                 }
638
639                 flush_channel(dev, ch, error, reset_ch);
640
641                 if (reset_ch) {
642                         reset_channel(dev, ch);
643                 } else {
644                         setbits32(priv->chan[ch].reg + TALITOS_CCCR,
645                                   TALITOS2_CCCR_CONT);
646                         setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, 0);
647                         while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR) &
648                                TALITOS2_CCCR_CONT) && --timeout)
649                                 cpu_relax();
650                         if (timeout == 0) {
651                                 dev_err(dev, "failed to restart channel %d\n",
652                                         ch);
653                                 reset_dev = 1;
654                         }
655                 }
656         }
657         if (reset_dev || (is_sec1 && isr & ~TALITOS1_ISR_4CHERR) ||
658             (!is_sec1 && isr & ~TALITOS2_ISR_4CHERR) || isr_lo) {
659                 if (is_sec1 && (isr_lo & TALITOS1_ISR_TEA_ERR))
660                         dev_err(dev, "TEA error: ISR 0x%08x_%08x\n",
661                                 isr, isr_lo);
662                 else
663                         dev_err(dev, "done overflow, internal time out, or "
664                                 "rngu error: ISR 0x%08x_%08x\n", isr, isr_lo);
665
666                 /* purge request queues */
667                 for (ch = 0; ch < priv->num_channels; ch++)
668                         flush_channel(dev, ch, -EIO, 1);
669
670                 /* reset and reinitialize the device */
671                 init_device(dev);
672         }
673 }
674
675 #define DEF_TALITOS1_INTERRUPT(name, ch_done_mask, ch_err_mask, tlet)          \
676 static irqreturn_t talitos1_interrupt_##name(int irq, void *data)              \
677 {                                                                              \
678         struct device *dev = data;                                             \
679         struct talitos_private *priv = dev_get_drvdata(dev);                   \
680         u32 isr, isr_lo;                                                       \
681         unsigned long flags;                                                   \
682                                                                                \
683         spin_lock_irqsave(&priv->reg_lock, flags);                             \
684         isr = in_be32(priv->reg + TALITOS_ISR);                                \
685         isr_lo = in_be32(priv->reg + TALITOS_ISR_LO);                          \
686         /* Acknowledge interrupt */                                            \
687         out_be32(priv->reg + TALITOS_ICR, isr & (ch_done_mask | ch_err_mask)); \
688         out_be32(priv->reg + TALITOS_ICR_LO, isr_lo);                          \
689                                                                                \
690         if (unlikely(isr & ch_err_mask || isr_lo & TALITOS1_IMR_LO_INIT)) {    \
691                 spin_unlock_irqrestore(&priv->reg_lock, flags);                \
692                 talitos_error(dev, isr & ch_err_mask, isr_lo);                 \
693         }                                                                      \
694         else {                                                                 \
695                 if (likely(isr & ch_done_mask)) {                              \
696                         /* mask further done interrupts. */                    \
697                         setbits32(priv->reg + TALITOS_IMR, ch_done_mask);      \
698                         /* done_task will unmask done interrupts at exit */    \
699                         tasklet_schedule(&priv->done_task[tlet]);              \
700                 }                                                              \
701                 spin_unlock_irqrestore(&priv->reg_lock, flags);                \
702         }                                                                      \
703                                                                                \
704         return (isr & (ch_done_mask | ch_err_mask) || isr_lo) ? IRQ_HANDLED :  \
705                                                                 IRQ_NONE;      \
706 }
707
708 DEF_TALITOS1_INTERRUPT(4ch, TALITOS1_ISR_4CHDONE, TALITOS1_ISR_4CHERR, 0)
709
710 #define DEF_TALITOS2_INTERRUPT(name, ch_done_mask, ch_err_mask, tlet)          \
711 static irqreturn_t talitos2_interrupt_##name(int irq, void *data)              \
712 {                                                                              \
713         struct device *dev = data;                                             \
714         struct talitos_private *priv = dev_get_drvdata(dev);                   \
715         u32 isr, isr_lo;                                                       \
716         unsigned long flags;                                                   \
717                                                                                \
718         spin_lock_irqsave(&priv->reg_lock, flags);                             \
719         isr = in_be32(priv->reg + TALITOS_ISR);                                \
720         isr_lo = in_be32(priv->reg + TALITOS_ISR_LO);                          \
721         /* Acknowledge interrupt */                                            \
722         out_be32(priv->reg + TALITOS_ICR, isr & (ch_done_mask | ch_err_mask)); \
723         out_be32(priv->reg + TALITOS_ICR_LO, isr_lo);                          \
724                                                                                \
725         if (unlikely(isr & ch_err_mask || isr_lo)) {                           \
726                 spin_unlock_irqrestore(&priv->reg_lock, flags);                \
727                 talitos_error(dev, isr & ch_err_mask, isr_lo);                 \
728         }                                                                      \
729         else {                                                                 \
730                 if (likely(isr & ch_done_mask)) {                              \
731                         /* mask further done interrupts. */                    \
732                         clrbits32(priv->reg + TALITOS_IMR, ch_done_mask);      \
733                         /* done_task will unmask done interrupts at exit */    \
734                         tasklet_schedule(&priv->done_task[tlet]);              \
735                 }                                                              \
736                 spin_unlock_irqrestore(&priv->reg_lock, flags);                \
737         }                                                                      \
738                                                                                \
739         return (isr & (ch_done_mask | ch_err_mask) || isr_lo) ? IRQ_HANDLED :  \
740                                                                 IRQ_NONE;      \
741 }
742
743 DEF_TALITOS2_INTERRUPT(4ch, TALITOS2_ISR_4CHDONE, TALITOS2_ISR_4CHERR, 0)
744 DEF_TALITOS2_INTERRUPT(ch0_2, TALITOS2_ISR_CH_0_2_DONE, TALITOS2_ISR_CH_0_2_ERR,
745                        0)
746 DEF_TALITOS2_INTERRUPT(ch1_3, TALITOS2_ISR_CH_1_3_DONE, TALITOS2_ISR_CH_1_3_ERR,
747                        1)
748
749 /*
750  * hwrng
751  */
752 static int talitos_rng_data_present(struct hwrng *rng, int wait)
753 {
754         struct device *dev = (struct device *)rng->priv;
755         struct talitos_private *priv = dev_get_drvdata(dev);
756         u32 ofl;
757         int i;
758
759         for (i = 0; i < 20; i++) {
760                 ofl = in_be32(priv->reg_rngu + TALITOS_EUSR_LO) &
761                       TALITOS_RNGUSR_LO_OFL;
762                 if (ofl || !wait)
763                         break;
764                 udelay(10);
765         }
766
767         return !!ofl;
768 }
769
770 static int talitos_rng_data_read(struct hwrng *rng, u32 *data)
771 {
772         struct device *dev = (struct device *)rng->priv;
773         struct talitos_private *priv = dev_get_drvdata(dev);
774
775         /* rng fifo requires 64-bit accesses */
776         *data = in_be32(priv->reg_rngu + TALITOS_EU_FIFO);
777         *data = in_be32(priv->reg_rngu + TALITOS_EU_FIFO_LO);
778
779         return sizeof(u32);
780 }
781
782 static int talitos_rng_init(struct hwrng *rng)
783 {
784         struct device *dev = (struct device *)rng->priv;
785         struct talitos_private *priv = dev_get_drvdata(dev);
786         unsigned int timeout = TALITOS_TIMEOUT;
787
788         setbits32(priv->reg_rngu + TALITOS_EURCR_LO, TALITOS_RNGURCR_LO_SR);
789         while (!(in_be32(priv->reg_rngu + TALITOS_EUSR_LO)
790                  & TALITOS_RNGUSR_LO_RD)
791                && --timeout)
792                 cpu_relax();
793         if (timeout == 0) {
794                 dev_err(dev, "failed to reset rng hw\n");
795                 return -ENODEV;
796         }
797
798         /* start generating */
799         setbits32(priv->reg_rngu + TALITOS_EUDSR_LO, 0);
800
801         return 0;
802 }
803
804 static int talitos_register_rng(struct device *dev)
805 {
806         struct talitos_private *priv = dev_get_drvdata(dev);
807         int err;
808
809         priv->rng.name          = dev_driver_string(dev),
810         priv->rng.init          = talitos_rng_init,
811         priv->rng.data_present  = talitos_rng_data_present,
812         priv->rng.data_read     = talitos_rng_data_read,
813         priv->rng.priv          = (unsigned long)dev;
814
815         err = hwrng_register(&priv->rng);
816         if (!err)
817                 priv->rng_registered = true;
818
819         return err;
820 }
821
822 static void talitos_unregister_rng(struct device *dev)
823 {
824         struct talitos_private *priv = dev_get_drvdata(dev);
825
826         if (!priv->rng_registered)
827                 return;
828
829         hwrng_unregister(&priv->rng);
830         priv->rng_registered = false;
831 }
832
833 /*
834  * crypto alg
835  */
836 #define TALITOS_CRA_PRIORITY            3000
837 /*
838  * Defines a priority for doing AEAD with descriptors type
839  * HMAC_SNOOP_NO_AFEA (HSNA) instead of type IPSEC_ESP
840  */
841 #define TALITOS_CRA_PRIORITY_AEAD_HSNA  (TALITOS_CRA_PRIORITY - 1)
842 #ifdef CONFIG_CRYPTO_DEV_TALITOS2
843 #define TALITOS_MAX_KEY_SIZE            (AES_MAX_KEY_SIZE + SHA512_BLOCK_SIZE)
844 #else
845 #define TALITOS_MAX_KEY_SIZE            (AES_MAX_KEY_SIZE + SHA256_BLOCK_SIZE)
846 #endif
847 #define TALITOS_MAX_IV_LENGTH           16 /* max of AES_BLOCK_SIZE, DES3_EDE_BLOCK_SIZE */
848
849 struct talitos_ctx {
850         struct device *dev;
851         int ch;
852         __be32 desc_hdr_template;
853         u8 key[TALITOS_MAX_KEY_SIZE];
854         u8 iv[TALITOS_MAX_IV_LENGTH];
855         dma_addr_t dma_key;
856         unsigned int keylen;
857         unsigned int enckeylen;
858         unsigned int authkeylen;
859 };
860
861 #define HASH_MAX_BLOCK_SIZE             SHA512_BLOCK_SIZE
862 #define TALITOS_MDEU_MAX_CONTEXT_SIZE   TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512
863
864 struct talitos_ahash_req_ctx {
865         u32 hw_context[TALITOS_MDEU_MAX_CONTEXT_SIZE / sizeof(u32)];
866         unsigned int hw_context_size;
867         u8 buf[2][HASH_MAX_BLOCK_SIZE];
868         int buf_idx;
869         unsigned int swinit;
870         unsigned int first;
871         unsigned int last;
872         unsigned int to_hash_later;
873         unsigned int nbuf;
874         struct scatterlist bufsl[2];
875         struct scatterlist *psrc;
876 };
877
878 struct talitos_export_state {
879         u32 hw_context[TALITOS_MDEU_MAX_CONTEXT_SIZE / sizeof(u32)];
880         u8 buf[HASH_MAX_BLOCK_SIZE];
881         unsigned int swinit;
882         unsigned int first;
883         unsigned int last;
884         unsigned int to_hash_later;
885         unsigned int nbuf;
886 };
887
888 static int aead_setkey(struct crypto_aead *authenc,
889                        const u8 *key, unsigned int keylen)
890 {
891         struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
892         struct device *dev = ctx->dev;
893         struct crypto_authenc_keys keys;
894
895         if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
896                 goto badkey;
897
898         if (keys.authkeylen + keys.enckeylen > TALITOS_MAX_KEY_SIZE)
899                 goto badkey;
900
901         if (ctx->keylen)
902                 dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
903
904         memcpy(ctx->key, keys.authkey, keys.authkeylen);
905         memcpy(&ctx->key[keys.authkeylen], keys.enckey, keys.enckeylen);
906
907         ctx->keylen = keys.authkeylen + keys.enckeylen;
908         ctx->enckeylen = keys.enckeylen;
909         ctx->authkeylen = keys.authkeylen;
910         ctx->dma_key = dma_map_single(dev, ctx->key, ctx->keylen,
911                                       DMA_TO_DEVICE);
912
913         memzero_explicit(&keys, sizeof(keys));
914         return 0;
915
916 badkey:
917         crypto_aead_set_flags(authenc, CRYPTO_TFM_RES_BAD_KEY_LEN);
918         memzero_explicit(&keys, sizeof(keys));
919         return -EINVAL;
920 }
921
922 static int aead_des3_setkey(struct crypto_aead *authenc,
923                             const u8 *key, unsigned int keylen)
924 {
925         struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
926         struct device *dev = ctx->dev;
927         struct crypto_authenc_keys keys;
928         u32 flags;
929         int err;
930
931         err = crypto_authenc_extractkeys(&keys, key, keylen);
932         if (unlikely(err))
933                 goto badkey;
934
935         err = -EINVAL;
936         if (keys.authkeylen + keys.enckeylen > TALITOS_MAX_KEY_SIZE)
937                 goto badkey;
938
939         if (keys.enckeylen != DES3_EDE_KEY_SIZE)
940                 goto badkey;
941
942         flags = crypto_aead_get_flags(authenc);
943         err = __des3_verify_key(&flags, keys.enckey);
944         if (unlikely(err)) {
945                 crypto_aead_set_flags(authenc, flags);
946                 goto out;
947         }
948
949         if (ctx->keylen)
950                 dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
951
952         memcpy(ctx->key, keys.authkey, keys.authkeylen);
953         memcpy(&ctx->key[keys.authkeylen], keys.enckey, keys.enckeylen);
954
955         ctx->keylen = keys.authkeylen + keys.enckeylen;
956         ctx->enckeylen = keys.enckeylen;
957         ctx->authkeylen = keys.authkeylen;
958         ctx->dma_key = dma_map_single(dev, ctx->key, ctx->keylen,
959                                       DMA_TO_DEVICE);
960
961 out:
962         memzero_explicit(&keys, sizeof(keys));
963         return err;
964
965 badkey:
966         crypto_aead_set_flags(authenc, CRYPTO_TFM_RES_BAD_KEY_LEN);
967         goto out;
968 }
969
970 static void talitos_sg_unmap(struct device *dev,
971                              struct talitos_edesc *edesc,
972                              struct scatterlist *src,
973                              struct scatterlist *dst,
974                              unsigned int len, unsigned int offset)
975 {
976         struct talitos_private *priv = dev_get_drvdata(dev);
977         bool is_sec1 = has_ftr_sec1(priv);
978         unsigned int src_nents = edesc->src_nents ? : 1;
979         unsigned int dst_nents = edesc->dst_nents ? : 1;
980
981         if (is_sec1 && dst && dst_nents > 1) {
982                 dma_sync_single_for_device(dev, edesc->dma_link_tbl + offset,
983                                            len, DMA_FROM_DEVICE);
984                 sg_pcopy_from_buffer(dst, dst_nents, edesc->buf + offset, len,
985                                      offset);
986         }
987         if (src != dst) {
988                 if (src_nents == 1 || !is_sec1)
989                         dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE);
990
991                 if (dst && (dst_nents == 1 || !is_sec1))
992                         dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE);
993         } else if (src_nents == 1 || !is_sec1) {
994                 dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL);
995         }
996 }
997
998 static void ipsec_esp_unmap(struct device *dev,
999                             struct talitos_edesc *edesc,
1000                             struct aead_request *areq, bool encrypt)
1001 {
1002         struct crypto_aead *aead = crypto_aead_reqtfm(areq);
1003         struct talitos_ctx *ctx = crypto_aead_ctx(aead);
1004         unsigned int ivsize = crypto_aead_ivsize(aead);
1005         unsigned int authsize = crypto_aead_authsize(aead);
1006         unsigned int cryptlen = areq->cryptlen - (encrypt ? 0 : authsize);
1007         bool is_ipsec_esp = edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP;
1008         struct talitos_ptr *civ_ptr = &edesc->desc.ptr[is_ipsec_esp ? 2 : 3];
1009
1010         if (is_ipsec_esp)
1011                 unmap_single_talitos_ptr(dev, &edesc->desc.ptr[6],
1012                                          DMA_FROM_DEVICE);
1013         unmap_single_talitos_ptr(dev, civ_ptr, DMA_TO_DEVICE);
1014
1015         talitos_sg_unmap(dev, edesc, areq->src, areq->dst,
1016                          cryptlen + authsize, areq->assoclen);
1017
1018         if (edesc->dma_len)
1019                 dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1020                                  DMA_BIDIRECTIONAL);
1021
1022         if (!is_ipsec_esp) {
1023                 unsigned int dst_nents = edesc->dst_nents ? : 1;
1024
1025                 sg_pcopy_to_buffer(areq->dst, dst_nents, ctx->iv, ivsize,
1026                                    areq->assoclen + cryptlen - ivsize);
1027         }
1028 }
1029
1030 /*
1031  * ipsec_esp descriptor callbacks
1032  */
1033 static void ipsec_esp_encrypt_done(struct device *dev,
1034                                    struct talitos_desc *desc, void *context,
1035                                    int err)
1036 {
1037         struct aead_request *areq = context;
1038         struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
1039         unsigned int ivsize = crypto_aead_ivsize(authenc);
1040         struct talitos_edesc *edesc;
1041
1042         edesc = container_of(desc, struct talitos_edesc, desc);
1043
1044         ipsec_esp_unmap(dev, edesc, areq, true);
1045
1046         dma_unmap_single(dev, edesc->iv_dma, ivsize, DMA_TO_DEVICE);
1047
1048         kfree(edesc);
1049
1050         aead_request_complete(areq, err);
1051 }
1052
1053 static void ipsec_esp_decrypt_swauth_done(struct device *dev,
1054                                           struct talitos_desc *desc,
1055                                           void *context, int err)
1056 {
1057         struct aead_request *req = context;
1058         struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1059         unsigned int authsize = crypto_aead_authsize(authenc);
1060         struct talitos_edesc *edesc;
1061         char *oicv, *icv;
1062
1063         edesc = container_of(desc, struct talitos_edesc, desc);
1064
1065         ipsec_esp_unmap(dev, edesc, req, false);
1066
1067         if (!err) {
1068                 /* auth check */
1069                 oicv = edesc->buf + edesc->dma_len;
1070                 icv = oicv - authsize;
1071
1072                 err = crypto_memneq(oicv, icv, authsize) ? -EBADMSG : 0;
1073         }
1074
1075         kfree(edesc);
1076
1077         aead_request_complete(req, err);
1078 }
1079
1080 static void ipsec_esp_decrypt_hwauth_done(struct device *dev,
1081                                           struct talitos_desc *desc,
1082                                           void *context, int err)
1083 {
1084         struct aead_request *req = context;
1085         struct talitos_edesc *edesc;
1086
1087         edesc = container_of(desc, struct talitos_edesc, desc);
1088
1089         ipsec_esp_unmap(dev, edesc, req, false);
1090
1091         /* check ICV auth status */
1092         if (!err && ((desc->hdr_lo & DESC_HDR_LO_ICCR1_MASK) !=
1093                      DESC_HDR_LO_ICCR1_PASS))
1094                 err = -EBADMSG;
1095
1096         kfree(edesc);
1097
1098         aead_request_complete(req, err);
1099 }
1100
1101 /*
1102  * convert scatterlist to SEC h/w link table format
1103  * stop at cryptlen bytes
1104  */
1105 static int sg_to_link_tbl_offset(struct scatterlist *sg, int sg_count,
1106                                  unsigned int offset, int datalen, int elen,
1107                                  struct talitos_ptr *link_tbl_ptr)
1108 {
1109         int n_sg = elen ? sg_count + 1 : sg_count;
1110         int count = 0;
1111         int cryptlen = datalen + elen;
1112
1113         while (cryptlen && sg && n_sg--) {
1114                 unsigned int len = sg_dma_len(sg);
1115
1116                 if (offset >= len) {
1117                         offset -= len;
1118                         goto next;
1119                 }
1120
1121                 len -= offset;
1122
1123                 if (len > cryptlen)
1124                         len = cryptlen;
1125
1126                 if (datalen > 0 && len > datalen) {
1127                         to_talitos_ptr(link_tbl_ptr + count,
1128                                        sg_dma_address(sg) + offset, datalen, 0);
1129                         to_talitos_ptr_ext_set(link_tbl_ptr + count, 0, 0);
1130                         count++;
1131                         len -= datalen;
1132                         offset += datalen;
1133                 }
1134                 to_talitos_ptr(link_tbl_ptr + count,
1135                                sg_dma_address(sg) + offset, len, 0);
1136                 to_talitos_ptr_ext_set(link_tbl_ptr + count, 0, 0);
1137                 count++;
1138                 cryptlen -= len;
1139                 datalen -= len;
1140                 offset = 0;
1141
1142 next:
1143                 sg = sg_next(sg);
1144         }
1145
1146         /* tag end of link table */
1147         if (count > 0)
1148                 to_talitos_ptr_ext_set(link_tbl_ptr + count - 1,
1149                                        DESC_PTR_LNKTBL_RET, 0);
1150
1151         return count;
1152 }
1153
1154 static int talitos_sg_map_ext(struct device *dev, struct scatterlist *src,
1155                               unsigned int len, struct talitos_edesc *edesc,
1156                               struct talitos_ptr *ptr, int sg_count,
1157                               unsigned int offset, int tbl_off, int elen,
1158                               bool force)
1159 {
1160         struct talitos_private *priv = dev_get_drvdata(dev);
1161         bool is_sec1 = has_ftr_sec1(priv);
1162
1163         if (!src) {
1164                 to_talitos_ptr(ptr, 0, 0, is_sec1);
1165                 return 1;
1166         }
1167         to_talitos_ptr_ext_set(ptr, elen, is_sec1);
1168         if (sg_count == 1 && !force) {
1169                 to_talitos_ptr(ptr, sg_dma_address(src) + offset, len, is_sec1);
1170                 return sg_count;
1171         }
1172         if (is_sec1) {
1173                 to_talitos_ptr(ptr, edesc->dma_link_tbl + offset, len, is_sec1);
1174                 return sg_count;
1175         }
1176         sg_count = sg_to_link_tbl_offset(src, sg_count, offset, len, elen,
1177                                          &edesc->link_tbl[tbl_off]);
1178         if (sg_count == 1 && !force) {
1179                 /* Only one segment now, so no link tbl needed*/
1180                 copy_talitos_ptr(ptr, &edesc->link_tbl[tbl_off], is_sec1);
1181                 return sg_count;
1182         }
1183         to_talitos_ptr(ptr, edesc->dma_link_tbl +
1184                             tbl_off * sizeof(struct talitos_ptr), len, is_sec1);
1185         to_talitos_ptr_ext_or(ptr, DESC_PTR_LNKTBL_JUMP, is_sec1);
1186
1187         return sg_count;
1188 }
1189
1190 static int talitos_sg_map(struct device *dev, struct scatterlist *src,
1191                           unsigned int len, struct talitos_edesc *edesc,
1192                           struct talitos_ptr *ptr, int sg_count,
1193                           unsigned int offset, int tbl_off)
1194 {
1195         return talitos_sg_map_ext(dev, src, len, edesc, ptr, sg_count, offset,
1196                                   tbl_off, 0, false);
1197 }
1198
1199 /*
1200  * fill in and submit ipsec_esp descriptor
1201  */
1202 static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1203                      bool encrypt,
1204                      void (*callback)(struct device *dev,
1205                                       struct talitos_desc *desc,
1206                                       void *context, int error))
1207 {
1208         struct crypto_aead *aead = crypto_aead_reqtfm(areq);
1209         unsigned int authsize = crypto_aead_authsize(aead);
1210         struct talitos_ctx *ctx = crypto_aead_ctx(aead);
1211         struct device *dev = ctx->dev;
1212         struct talitos_desc *desc = &edesc->desc;
1213         unsigned int cryptlen = areq->cryptlen - (encrypt ? 0 : authsize);
1214         unsigned int ivsize = crypto_aead_ivsize(aead);
1215         int tbl_off = 0;
1216         int sg_count, ret;
1217         int elen = 0;
1218         bool sync_needed = false;
1219         struct talitos_private *priv = dev_get_drvdata(dev);
1220         bool is_sec1 = has_ftr_sec1(priv);
1221         bool is_ipsec_esp = desc->hdr & DESC_HDR_TYPE_IPSEC_ESP;
1222         struct talitos_ptr *civ_ptr = &desc->ptr[is_ipsec_esp ? 2 : 3];
1223         struct talitos_ptr *ckey_ptr = &desc->ptr[is_ipsec_esp ? 3 : 2];
1224         dma_addr_t dma_icv = edesc->dma_link_tbl + edesc->dma_len - authsize;
1225
1226         /* hmac key */
1227         to_talitos_ptr(&desc->ptr[0], ctx->dma_key, ctx->authkeylen, is_sec1);
1228
1229         sg_count = edesc->src_nents ?: 1;
1230         if (is_sec1 && sg_count > 1)
1231                 sg_copy_to_buffer(areq->src, sg_count, edesc->buf,
1232                                   areq->assoclen + cryptlen);
1233         else
1234                 sg_count = dma_map_sg(dev, areq->src, sg_count,
1235                                       (areq->src == areq->dst) ?
1236                                       DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
1237
1238         /* hmac data */
1239         ret = talitos_sg_map(dev, areq->src, areq->assoclen, edesc,
1240                              &desc->ptr[1], sg_count, 0, tbl_off);
1241
1242         if (ret > 1) {
1243                 tbl_off += ret;
1244                 sync_needed = true;
1245         }
1246
1247         /* cipher iv */
1248         to_talitos_ptr(civ_ptr, edesc->iv_dma, ivsize, is_sec1);
1249
1250         /* cipher key */
1251         to_talitos_ptr(ckey_ptr, ctx->dma_key  + ctx->authkeylen,
1252                        ctx->enckeylen, is_sec1);
1253
1254         /*
1255          * cipher in
1256          * map and adjust cipher len to aead request cryptlen.
1257          * extent is bytes of HMAC postpended to ciphertext,
1258          * typically 12 for ipsec
1259          */
1260         if (is_ipsec_esp && (desc->hdr & DESC_HDR_MODE1_MDEU_CICV))
1261                 elen = authsize;
1262
1263         ret = talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->ptr[4],
1264                                  sg_count, areq->assoclen, tbl_off, elen,
1265                                  false);
1266
1267         if (ret > 1) {
1268                 tbl_off += ret;
1269                 sync_needed = true;
1270         }
1271
1272         /* cipher out */
1273         if (areq->src != areq->dst) {
1274                 sg_count = edesc->dst_nents ? : 1;
1275                 if (!is_sec1 || sg_count == 1)
1276                         dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE);
1277         }
1278
1279         if (is_ipsec_esp && encrypt)
1280                 elen = authsize;
1281         else
1282                 elen = 0;
1283         ret = talitos_sg_map_ext(dev, areq->dst, cryptlen, edesc, &desc->ptr[5],
1284                                  sg_count, areq->assoclen, tbl_off, elen,
1285                                  is_ipsec_esp && !encrypt);
1286         tbl_off += ret;
1287
1288         if (!encrypt && is_ipsec_esp) {
1289                 struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off];
1290
1291                 /* Add an entry to the link table for ICV data */
1292                 to_talitos_ptr_ext_set(tbl_ptr - 1, 0, is_sec1);
1293                 to_talitos_ptr_ext_set(tbl_ptr, DESC_PTR_LNKTBL_RET, is_sec1);
1294
1295                 /* icv data follows link tables */
1296                 to_talitos_ptr(tbl_ptr, dma_icv, authsize, is_sec1);
1297                 to_talitos_ptr_ext_or(&desc->ptr[5], authsize, is_sec1);
1298                 sync_needed = true;
1299         } else if (!encrypt) {
1300                 to_talitos_ptr(&desc->ptr[6], dma_icv, authsize, is_sec1);
1301                 sync_needed = true;
1302         } else if (!is_ipsec_esp) {
1303                 talitos_sg_map(dev, areq->dst, authsize, edesc, &desc->ptr[6],
1304                                sg_count, areq->assoclen + cryptlen, tbl_off);
1305         }
1306
1307         /* iv out */
1308         if (is_ipsec_esp)
1309                 map_single_talitos_ptr(dev, &desc->ptr[6], ivsize, ctx->iv,
1310                                        DMA_FROM_DEVICE);
1311
1312         if (sync_needed)
1313                 dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1314                                            edesc->dma_len,
1315                                            DMA_BIDIRECTIONAL);
1316
1317         ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1318         if (ret != -EINPROGRESS) {
1319                 ipsec_esp_unmap(dev, edesc, areq, encrypt);
1320                 kfree(edesc);
1321         }
1322         return ret;
1323 }
1324
1325 /*
1326  * allocate and map the extended descriptor
1327  */
1328 static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,
1329                                                  struct scatterlist *src,
1330                                                  struct scatterlist *dst,
1331                                                  u8 *iv,
1332                                                  unsigned int assoclen,
1333                                                  unsigned int cryptlen,
1334                                                  unsigned int authsize,
1335                                                  unsigned int ivsize,
1336                                                  int icv_stashing,
1337                                                  u32 cryptoflags,
1338                                                  bool encrypt)
1339 {
1340         struct talitos_edesc *edesc;
1341         int src_nents, dst_nents, alloc_len, dma_len, src_len, dst_len;
1342         dma_addr_t iv_dma = 0;
1343         gfp_t flags = cryptoflags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL :
1344                       GFP_ATOMIC;
1345         struct talitos_private *priv = dev_get_drvdata(dev);
1346         bool is_sec1 = has_ftr_sec1(priv);
1347         int max_len = is_sec1 ? TALITOS1_MAX_DATA_LEN : TALITOS2_MAX_DATA_LEN;
1348
1349         if (cryptlen + authsize > max_len) {
1350                 dev_err(dev, "length exceeds h/w max limit\n");
1351                 return ERR_PTR(-EINVAL);
1352         }
1353
1354         if (!dst || dst == src) {
1355                 src_len = assoclen + cryptlen + authsize;
1356                 src_nents = sg_nents_for_len(src, src_len);
1357                 if (src_nents < 0) {
1358                         dev_err(dev, "Invalid number of src SG.\n");
1359                         return ERR_PTR(-EINVAL);
1360                 }
1361                 src_nents = (src_nents == 1) ? 0 : src_nents;
1362                 dst_nents = dst ? src_nents : 0;
1363                 dst_len = 0;
1364         } else { /* dst && dst != src*/
1365                 src_len = assoclen + cryptlen + (encrypt ? 0 : authsize);
1366                 src_nents = sg_nents_for_len(src, src_len);
1367                 if (src_nents < 0) {
1368                         dev_err(dev, "Invalid number of src SG.\n");
1369                         return ERR_PTR(-EINVAL);
1370                 }
1371                 src_nents = (src_nents == 1) ? 0 : src_nents;
1372                 dst_len = assoclen + cryptlen + (encrypt ? authsize : 0);
1373                 dst_nents = sg_nents_for_len(dst, dst_len);
1374                 if (dst_nents < 0) {
1375                         dev_err(dev, "Invalid number of dst SG.\n");
1376                         return ERR_PTR(-EINVAL);
1377                 }
1378                 dst_nents = (dst_nents == 1) ? 0 : dst_nents;
1379         }
1380
1381         /*
1382          * allocate space for base edesc plus the link tables,
1383          * allowing for two separate entries for AD and generated ICV (+ 2),
1384          * and space for two sets of ICVs (stashed and generated)
1385          */
1386         alloc_len = sizeof(struct talitos_edesc);
1387         if (src_nents || dst_nents || !encrypt) {
1388                 if (is_sec1)
1389                         dma_len = (src_nents ? src_len : 0) +
1390                                   (dst_nents ? dst_len : 0) + authsize;
1391                 else
1392                         dma_len = (src_nents + dst_nents + 2) *
1393                                   sizeof(struct talitos_ptr) + authsize;
1394                 alloc_len += dma_len;
1395         } else {
1396                 dma_len = 0;
1397         }
1398         alloc_len += icv_stashing ? authsize : 0;
1399
1400         /* if its a ahash, add space for a second desc next to the first one */
1401         if (is_sec1 && !dst)
1402                 alloc_len += sizeof(struct talitos_desc);
1403         alloc_len += ivsize;
1404
1405         edesc = kmalloc(alloc_len, GFP_DMA | flags);
1406         if (!edesc)
1407                 return ERR_PTR(-ENOMEM);
1408         if (ivsize) {
1409                 iv = memcpy(((u8 *)edesc) + alloc_len - ivsize, iv, ivsize);
1410                 iv_dma = dma_map_single(dev, iv, ivsize, DMA_TO_DEVICE);
1411         }
1412         memset(&edesc->desc, 0, sizeof(edesc->desc));
1413
1414         edesc->src_nents = src_nents;
1415         edesc->dst_nents = dst_nents;
1416         edesc->iv_dma = iv_dma;
1417         edesc->dma_len = dma_len;
1418         if (dma_len)
1419                 edesc->dma_link_tbl = dma_map_single(dev, &edesc->link_tbl[0],
1420                                                      edesc->dma_len,
1421                                                      DMA_BIDIRECTIONAL);
1422
1423         return edesc;
1424 }
1425
1426 static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq, u8 *iv,
1427                                               int icv_stashing, bool encrypt)
1428 {
1429         struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
1430         unsigned int authsize = crypto_aead_authsize(authenc);
1431         struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1432         unsigned int ivsize = crypto_aead_ivsize(authenc);
1433         unsigned int cryptlen = areq->cryptlen - (encrypt ? 0 : authsize);
1434
1435         return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst,
1436                                    iv, areq->assoclen, cryptlen,
1437                                    authsize, ivsize, icv_stashing,
1438                                    areq->base.flags, encrypt);
1439 }
1440
1441 static int aead_encrypt(struct aead_request *req)
1442 {
1443         struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1444         struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1445         struct talitos_edesc *edesc;
1446
1447         /* allocate extended descriptor */
1448         edesc = aead_edesc_alloc(req, req->iv, 0, true);
1449         if (IS_ERR(edesc))
1450                 return PTR_ERR(edesc);
1451
1452         /* set encrypt */
1453         edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT;
1454
1455         return ipsec_esp(edesc, req, true, ipsec_esp_encrypt_done);
1456 }
1457
1458 static int aead_decrypt(struct aead_request *req)
1459 {
1460         struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1461         unsigned int authsize = crypto_aead_authsize(authenc);
1462         struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1463         struct talitos_private *priv = dev_get_drvdata(ctx->dev);
1464         struct talitos_edesc *edesc;
1465         void *icvdata;
1466
1467         /* allocate extended descriptor */
1468         edesc = aead_edesc_alloc(req, req->iv, 1, false);
1469         if (IS_ERR(edesc))
1470                 return PTR_ERR(edesc);
1471
1472         if ((edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP) &&
1473             (priv->features & TALITOS_FTR_HW_AUTH_CHECK) &&
1474             ((!edesc->src_nents && !edesc->dst_nents) ||
1475              priv->features & TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT)) {
1476
1477                 /* decrypt and check the ICV */
1478                 edesc->desc.hdr = ctx->desc_hdr_template |
1479                                   DESC_HDR_DIR_INBOUND |
1480                                   DESC_HDR_MODE1_MDEU_CICV;
1481
1482                 /* reset integrity check result bits */
1483
1484                 return ipsec_esp(edesc, req, false,
1485                                  ipsec_esp_decrypt_hwauth_done);
1486         }
1487
1488         /* Have to check the ICV with software */
1489         edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND;
1490
1491         /* stash incoming ICV for later cmp with ICV generated by the h/w */
1492         icvdata = edesc->buf + edesc->dma_len;
1493
1494         sg_pcopy_to_buffer(req->src, edesc->src_nents ? : 1, icvdata, authsize,
1495                            req->assoclen + req->cryptlen - authsize);
1496
1497         return ipsec_esp(edesc, req, false, ipsec_esp_decrypt_swauth_done);
1498 }
1499
1500 static int ablkcipher_setkey(struct crypto_ablkcipher *cipher,
1501                              const u8 *key, unsigned int keylen)
1502 {
1503         struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1504         struct device *dev = ctx->dev;
1505
1506         if (ctx->keylen)
1507                 dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
1508
1509         memcpy(&ctx->key, key, keylen);
1510         ctx->keylen = keylen;
1511
1512         ctx->dma_key = dma_map_single(dev, ctx->key, keylen, DMA_TO_DEVICE);
1513
1514         return 0;
1515 }
1516
1517 static int ablkcipher_des_setkey(struct crypto_ablkcipher *cipher,
1518                                  const u8 *key, unsigned int keylen)
1519 {
1520         u32 tmp[DES_EXPKEY_WORDS];
1521
1522         if (unlikely(crypto_ablkcipher_get_flags(cipher) &
1523                      CRYPTO_TFM_REQ_FORBID_WEAK_KEYS) &&
1524             !des_ekey(tmp, key)) {
1525                 crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_WEAK_KEY);
1526                 return -EINVAL;
1527         }
1528
1529         return ablkcipher_setkey(cipher, key, keylen);
1530 }
1531
1532 static int ablkcipher_des3_setkey(struct crypto_ablkcipher *cipher,
1533                                   const u8 *key, unsigned int keylen)
1534 {
1535         u32 flags;
1536         int err;
1537
1538         flags = crypto_ablkcipher_get_flags(cipher);
1539         err = __des3_verify_key(&flags, key);
1540         if (unlikely(err)) {
1541                 crypto_ablkcipher_set_flags(cipher, flags);
1542                 return err;
1543         }
1544
1545         return ablkcipher_setkey(cipher, key, keylen);
1546 }
1547
1548 static int ablkcipher_aes_setkey(struct crypto_ablkcipher *cipher,
1549                                   const u8 *key, unsigned int keylen)
1550 {
1551         if (keylen == AES_KEYSIZE_128 || keylen == AES_KEYSIZE_192 ||
1552             keylen == AES_KEYSIZE_256)
1553                 return ablkcipher_setkey(cipher, key, keylen);
1554
1555         crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_BAD_KEY_LEN);
1556
1557         return -EINVAL;
1558 }
1559
1560 static void common_nonsnoop_unmap(struct device *dev,
1561                                   struct talitos_edesc *edesc,
1562                                   struct ablkcipher_request *areq)
1563 {
1564         unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE);
1565
1566         talitos_sg_unmap(dev, edesc, areq->src, areq->dst, areq->nbytes, 0);
1567         unmap_single_talitos_ptr(dev, &edesc->desc.ptr[1], DMA_TO_DEVICE);
1568
1569         if (edesc->dma_len)
1570                 dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1571                                  DMA_BIDIRECTIONAL);
1572 }
1573
1574 static void ablkcipher_done(struct device *dev,
1575                             struct talitos_desc *desc, void *context,
1576                             int err)
1577 {
1578         struct ablkcipher_request *areq = context;
1579         struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1580         struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1581         unsigned int ivsize = crypto_ablkcipher_ivsize(cipher);
1582         struct talitos_edesc *edesc;
1583
1584         edesc = container_of(desc, struct talitos_edesc, desc);
1585
1586         common_nonsnoop_unmap(dev, edesc, areq);
1587         memcpy(areq->info, ctx->iv, ivsize);
1588
1589         kfree(edesc);
1590
1591         areq->base.complete(&areq->base, err);
1592 }
1593
1594 static int common_nonsnoop(struct talitos_edesc *edesc,
1595                            struct ablkcipher_request *areq,
1596                            void (*callback) (struct device *dev,
1597                                              struct talitos_desc *desc,
1598                                              void *context, int error))
1599 {
1600         struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1601         struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1602         struct device *dev = ctx->dev;
1603         struct talitos_desc *desc = &edesc->desc;
1604         unsigned int cryptlen = areq->nbytes;
1605         unsigned int ivsize = crypto_ablkcipher_ivsize(cipher);
1606         int sg_count, ret;
1607         bool sync_needed = false;
1608         struct talitos_private *priv = dev_get_drvdata(dev);
1609         bool is_sec1 = has_ftr_sec1(priv);
1610
1611         /* first DWORD empty */
1612
1613         /* cipher iv */
1614         to_talitos_ptr(&desc->ptr[1], edesc->iv_dma, ivsize, is_sec1);
1615
1616         /* cipher key */
1617         to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen, is_sec1);
1618
1619         sg_count = edesc->src_nents ?: 1;
1620         if (is_sec1 && sg_count > 1)
1621                 sg_copy_to_buffer(areq->src, sg_count, edesc->buf,
1622                                   cryptlen);
1623         else
1624                 sg_count = dma_map_sg(dev, areq->src, sg_count,
1625                                       (areq->src == areq->dst) ?
1626                                       DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
1627         /*
1628          * cipher in
1629          */
1630         sg_count = talitos_sg_map(dev, areq->src, cryptlen, edesc,
1631                                   &desc->ptr[3], sg_count, 0, 0);
1632         if (sg_count > 1)
1633                 sync_needed = true;
1634
1635         /* cipher out */
1636         if (areq->src != areq->dst) {
1637                 sg_count = edesc->dst_nents ? : 1;
1638                 if (!is_sec1 || sg_count == 1)
1639                         dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE);
1640         }
1641
1642         ret = talitos_sg_map(dev, areq->dst, cryptlen, edesc, &desc->ptr[4],
1643                              sg_count, 0, (edesc->src_nents + 1));
1644         if (ret > 1)
1645                 sync_needed = true;
1646
1647         /* iv out */
1648         map_single_talitos_ptr(dev, &desc->ptr[5], ivsize, ctx->iv,
1649                                DMA_FROM_DEVICE);
1650
1651         /* last DWORD empty */
1652
1653         if (sync_needed)
1654                 dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1655                                            edesc->dma_len, DMA_BIDIRECTIONAL);
1656
1657         ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1658         if (ret != -EINPROGRESS) {
1659                 common_nonsnoop_unmap(dev, edesc, areq);
1660                 kfree(edesc);
1661         }
1662         return ret;
1663 }
1664
1665 static struct talitos_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request *
1666                                                     areq, bool encrypt)
1667 {
1668         struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1669         struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1670         unsigned int ivsize = crypto_ablkcipher_ivsize(cipher);
1671
1672         return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst,
1673                                    areq->info, 0, areq->nbytes, 0, ivsize, 0,
1674                                    areq->base.flags, encrypt);
1675 }
1676
1677 static int ablkcipher_encrypt(struct ablkcipher_request *areq)
1678 {
1679         struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1680         struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1681         struct talitos_edesc *edesc;
1682         unsigned int blocksize =
1683                         crypto_tfm_alg_blocksize(crypto_ablkcipher_tfm(cipher));
1684
1685         if (!areq->nbytes)
1686                 return 0;
1687
1688         if (areq->nbytes % blocksize)
1689                 return -EINVAL;
1690
1691         /* allocate extended descriptor */
1692         edesc = ablkcipher_edesc_alloc(areq, true);
1693         if (IS_ERR(edesc))
1694                 return PTR_ERR(edesc);
1695
1696         /* set encrypt */
1697         edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT;
1698
1699         return common_nonsnoop(edesc, areq, ablkcipher_done);
1700 }
1701
1702 static int ablkcipher_decrypt(struct ablkcipher_request *areq)
1703 {
1704         struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1705         struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1706         struct talitos_edesc *edesc;
1707         unsigned int blocksize =
1708                         crypto_tfm_alg_blocksize(crypto_ablkcipher_tfm(cipher));
1709
1710         if (!areq->nbytes)
1711                 return 0;
1712
1713         if (areq->nbytes % blocksize)
1714                 return -EINVAL;
1715
1716         /* allocate extended descriptor */
1717         edesc = ablkcipher_edesc_alloc(areq, false);
1718         if (IS_ERR(edesc))
1719                 return PTR_ERR(edesc);
1720
1721         edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND;
1722
1723         return common_nonsnoop(edesc, areq, ablkcipher_done);
1724 }
1725
1726 static void common_nonsnoop_hash_unmap(struct device *dev,
1727                                        struct talitos_edesc *edesc,
1728                                        struct ahash_request *areq)
1729 {
1730         struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1731         struct talitos_private *priv = dev_get_drvdata(dev);
1732         bool is_sec1 = has_ftr_sec1(priv);
1733         struct talitos_desc *desc = &edesc->desc;
1734         struct talitos_desc *desc2 = (struct talitos_desc *)
1735                                      (edesc->buf + edesc->dma_len);
1736
1737         unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE);
1738         if (desc->next_desc &&
1739             desc->ptr[5].ptr != desc2->ptr[5].ptr)
1740                 unmap_single_talitos_ptr(dev, &desc2->ptr[5], DMA_FROM_DEVICE);
1741
1742         if (req_ctx->psrc)
1743                 talitos_sg_unmap(dev, edesc, req_ctx->psrc, NULL, 0, 0);
1744
1745         /* When using hashctx-in, must unmap it. */
1746         if (from_talitos_ptr_len(&edesc->desc.ptr[1], is_sec1))
1747                 unmap_single_talitos_ptr(dev, &edesc->desc.ptr[1],
1748                                          DMA_TO_DEVICE);
1749         else if (desc->next_desc)
1750                 unmap_single_talitos_ptr(dev, &desc2->ptr[1],
1751                                          DMA_TO_DEVICE);
1752
1753         if (is_sec1 && req_ctx->nbuf)
1754                 unmap_single_talitos_ptr(dev, &desc->ptr[3],
1755                                          DMA_TO_DEVICE);
1756
1757         if (edesc->dma_len)
1758                 dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1759                                  DMA_BIDIRECTIONAL);
1760
1761         if (edesc->desc.next_desc)
1762                 dma_unmap_single(dev, be32_to_cpu(edesc->desc.next_desc),
1763                                  TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL);
1764 }
1765
1766 static void ahash_done(struct device *dev,
1767                        struct talitos_desc *desc, void *context,
1768                        int err)
1769 {
1770         struct ahash_request *areq = context;
1771         struct talitos_edesc *edesc =
1772                  container_of(desc, struct talitos_edesc, desc);
1773         struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1774
1775         if (!req_ctx->last && req_ctx->to_hash_later) {
1776                 /* Position any partial block for next update/final/finup */
1777                 req_ctx->buf_idx = (req_ctx->buf_idx + 1) & 1;
1778                 req_ctx->nbuf = req_ctx->to_hash_later;
1779         }
1780         common_nonsnoop_hash_unmap(dev, edesc, areq);
1781
1782         kfree(edesc);
1783
1784         areq->base.complete(&areq->base, err);
1785 }
1786
1787 /*
1788  * SEC1 doesn't like hashing of 0 sized message, so we do the padding
1789  * ourself and submit a padded block
1790  */
1791 static void talitos_handle_buggy_hash(struct talitos_ctx *ctx,
1792                                struct talitos_edesc *edesc,
1793                                struct talitos_ptr *ptr)
1794 {
1795         static u8 padded_hash[64] = {
1796                 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1797                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1798                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1799                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1800         };
1801
1802         pr_err_once("Bug in SEC1, padding ourself\n");
1803         edesc->desc.hdr &= ~DESC_HDR_MODE0_MDEU_PAD;
1804         map_single_talitos_ptr(ctx->dev, ptr, sizeof(padded_hash),
1805                                (char *)padded_hash, DMA_TO_DEVICE);
1806 }
1807
1808 static int common_nonsnoop_hash(struct talitos_edesc *edesc,
1809                                 struct ahash_request *areq, unsigned int length,
1810                                 void (*callback) (struct device *dev,
1811                                                   struct talitos_desc *desc,
1812                                                   void *context, int error))
1813 {
1814         struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1815         struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1816         struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1817         struct device *dev = ctx->dev;
1818         struct talitos_desc *desc = &edesc->desc;
1819         int ret;
1820         bool sync_needed = false;
1821         struct talitos_private *priv = dev_get_drvdata(dev);
1822         bool is_sec1 = has_ftr_sec1(priv);
1823         int sg_count;
1824
1825         /* first DWORD empty */
1826
1827         /* hash context in */
1828         if (!req_ctx->first || req_ctx->swinit) {
1829                 map_single_talitos_ptr_nosync(dev, &desc->ptr[1],
1830                                               req_ctx->hw_context_size,
1831                                               req_ctx->hw_context,
1832                                               DMA_TO_DEVICE);
1833                 req_ctx->swinit = 0;
1834         }
1835         /* Indicate next op is not the first. */
1836         req_ctx->first = 0;
1837
1838         /* HMAC key */
1839         if (ctx->keylen)
1840                 to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen,
1841                                is_sec1);
1842
1843         if (is_sec1 && req_ctx->nbuf)
1844                 length -= req_ctx->nbuf;
1845
1846         sg_count = edesc->src_nents ?: 1;
1847         if (is_sec1 && sg_count > 1)
1848                 sg_copy_to_buffer(req_ctx->psrc, sg_count, edesc->buf, length);
1849         else if (length)
1850                 sg_count = dma_map_sg(dev, req_ctx->psrc, sg_count,
1851                                       DMA_TO_DEVICE);
1852         /*
1853          * data in
1854          */
1855         if (is_sec1 && req_ctx->nbuf) {
1856                 map_single_talitos_ptr(dev, &desc->ptr[3], req_ctx->nbuf,
1857                                        req_ctx->buf[req_ctx->buf_idx],
1858                                        DMA_TO_DEVICE);
1859         } else {
1860                 sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc,
1861                                           &desc->ptr[3], sg_count, 0, 0);
1862                 if (sg_count > 1)
1863                         sync_needed = true;
1864         }
1865
1866         /* fifth DWORD empty */
1867
1868         /* hash/HMAC out -or- hash context out */
1869         if (req_ctx->last)
1870                 map_single_talitos_ptr(dev, &desc->ptr[5],
1871                                        crypto_ahash_digestsize(tfm),
1872                                        areq->result, DMA_FROM_DEVICE);
1873         else
1874                 map_single_talitos_ptr_nosync(dev, &desc->ptr[5],
1875                                               req_ctx->hw_context_size,
1876                                               req_ctx->hw_context,
1877                                               DMA_FROM_DEVICE);
1878
1879         /* last DWORD empty */
1880
1881         if (is_sec1 && from_talitos_ptr_len(&desc->ptr[3], true) == 0)
1882                 talitos_handle_buggy_hash(ctx, edesc, &desc->ptr[3]);
1883
1884         if (is_sec1 && req_ctx->nbuf && length) {
1885                 struct talitos_desc *desc2 = (struct talitos_desc *)
1886                                              (edesc->buf + edesc->dma_len);
1887                 dma_addr_t next_desc;
1888
1889                 memset(desc2, 0, sizeof(*desc2));
1890                 desc2->hdr = desc->hdr;
1891                 desc2->hdr &= ~DESC_HDR_MODE0_MDEU_INIT;
1892                 desc2->hdr1 = desc2->hdr;
1893                 desc->hdr &= ~DESC_HDR_MODE0_MDEU_PAD;
1894                 desc->hdr |= DESC_HDR_MODE0_MDEU_CONT;
1895                 desc->hdr &= ~DESC_HDR_DONE_NOTIFY;
1896
1897                 if (desc->ptr[1].ptr)
1898                         copy_talitos_ptr(&desc2->ptr[1], &desc->ptr[1],
1899                                          is_sec1);
1900                 else
1901                         map_single_talitos_ptr_nosync(dev, &desc2->ptr[1],
1902                                                       req_ctx->hw_context_size,
1903                                                       req_ctx->hw_context,
1904                                                       DMA_TO_DEVICE);
1905                 copy_talitos_ptr(&desc2->ptr[2], &desc->ptr[2], is_sec1);
1906                 sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc,
1907                                           &desc2->ptr[3], sg_count, 0, 0);
1908                 if (sg_count > 1)
1909                         sync_needed = true;
1910                 copy_talitos_ptr(&desc2->ptr[5], &desc->ptr[5], is_sec1);
1911                 if (req_ctx->last)
1912                         map_single_talitos_ptr_nosync(dev, &desc->ptr[5],
1913                                                       req_ctx->hw_context_size,
1914                                                       req_ctx->hw_context,
1915                                                       DMA_FROM_DEVICE);
1916
1917                 next_desc = dma_map_single(dev, &desc2->hdr1, TALITOS_DESC_SIZE,
1918                                            DMA_BIDIRECTIONAL);
1919                 desc->next_desc = cpu_to_be32(next_desc);
1920         }
1921
1922         if (sync_needed)
1923                 dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1924                                            edesc->dma_len, DMA_BIDIRECTIONAL);
1925
1926         ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1927         if (ret != -EINPROGRESS) {
1928                 common_nonsnoop_hash_unmap(dev, edesc, areq);
1929                 kfree(edesc);
1930         }
1931         return ret;
1932 }
1933
1934 static struct talitos_edesc *ahash_edesc_alloc(struct ahash_request *areq,
1935                                                unsigned int nbytes)
1936 {
1937         struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1938         struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1939         struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1940         struct talitos_private *priv = dev_get_drvdata(ctx->dev);
1941         bool is_sec1 = has_ftr_sec1(priv);
1942
1943         if (is_sec1)
1944                 nbytes -= req_ctx->nbuf;
1945
1946         return talitos_edesc_alloc(ctx->dev, req_ctx->psrc, NULL, NULL, 0,
1947                                    nbytes, 0, 0, 0, areq->base.flags, false);
1948 }
1949
1950 static int ahash_init(struct ahash_request *areq)
1951 {
1952         struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1953         struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1954         struct device *dev = ctx->dev;
1955         struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1956         unsigned int size;
1957         dma_addr_t dma;
1958
1959         /* Initialize the context */
1960         req_ctx->buf_idx = 0;
1961         req_ctx->nbuf = 0;
1962         req_ctx->first = 1; /* first indicates h/w must init its context */
1963         req_ctx->swinit = 0; /* assume h/w init of context */
1964         size =  (crypto_ahash_digestsize(tfm) <= SHA256_DIGEST_SIZE)
1965                         ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256
1966                         : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512;
1967         req_ctx->hw_context_size = size;
1968
1969         dma = dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size,
1970                              DMA_TO_DEVICE);
1971         dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_TO_DEVICE);
1972
1973         return 0;
1974 }
1975
1976 /*
1977  * on h/w without explicit sha224 support, we initialize h/w context
1978  * manually with sha224 constants, and tell it to run sha256.
1979  */
1980 static int ahash_init_sha224_swinit(struct ahash_request *areq)
1981 {
1982         struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1983
1984         req_ctx->hw_context[0] = SHA224_H0;
1985         req_ctx->hw_context[1] = SHA224_H1;
1986         req_ctx->hw_context[2] = SHA224_H2;
1987         req_ctx->hw_context[3] = SHA224_H3;
1988         req_ctx->hw_context[4] = SHA224_H4;
1989         req_ctx->hw_context[5] = SHA224_H5;
1990         req_ctx->hw_context[6] = SHA224_H6;
1991         req_ctx->hw_context[7] = SHA224_H7;
1992
1993         /* init 64-bit count */
1994         req_ctx->hw_context[8] = 0;
1995         req_ctx->hw_context[9] = 0;
1996
1997         ahash_init(areq);
1998         req_ctx->swinit = 1;/* prevent h/w initting context with sha256 values*/
1999
2000         return 0;
2001 }
2002
2003 static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes)
2004 {
2005         struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2006         struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
2007         struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2008         struct talitos_edesc *edesc;
2009         unsigned int blocksize =
2010                         crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
2011         unsigned int nbytes_to_hash;
2012         unsigned int to_hash_later;
2013         unsigned int nsg;
2014         int nents;
2015         struct device *dev = ctx->dev;
2016         struct talitos_private *priv = dev_get_drvdata(dev);
2017         bool is_sec1 = has_ftr_sec1(priv);
2018         u8 *ctx_buf = req_ctx->buf[req_ctx->buf_idx];
2019
2020         if (!req_ctx->last && (nbytes + req_ctx->nbuf <= blocksize)) {
2021                 /* Buffer up to one whole block */
2022                 nents = sg_nents_for_len(areq->src, nbytes);
2023                 if (nents < 0) {
2024                         dev_err(ctx->dev, "Invalid number of src SG.\n");
2025                         return nents;
2026                 }
2027                 sg_copy_to_buffer(areq->src, nents,
2028                                   ctx_buf + req_ctx->nbuf, nbytes);
2029                 req_ctx->nbuf += nbytes;
2030                 return 0;
2031         }
2032
2033         /* At least (blocksize + 1) bytes are available to hash */
2034         nbytes_to_hash = nbytes + req_ctx->nbuf;
2035         to_hash_later = nbytes_to_hash & (blocksize - 1);
2036
2037         if (req_ctx->last)
2038                 to_hash_later = 0;
2039         else if (to_hash_later)
2040                 /* There is a partial block. Hash the full block(s) now */
2041                 nbytes_to_hash -= to_hash_later;
2042         else {
2043                 /* Keep one block buffered */
2044                 nbytes_to_hash -= blocksize;
2045                 to_hash_later = blocksize;
2046         }
2047
2048         /* Chain in any previously buffered data */
2049         if (!is_sec1 && req_ctx->nbuf) {
2050                 nsg = (req_ctx->nbuf < nbytes_to_hash) ? 2 : 1;
2051                 sg_init_table(req_ctx->bufsl, nsg);
2052                 sg_set_buf(req_ctx->bufsl, ctx_buf, req_ctx->nbuf);
2053                 if (nsg > 1)
2054                         sg_chain(req_ctx->bufsl, 2, areq->src);
2055                 req_ctx->psrc = req_ctx->bufsl;
2056         } else if (is_sec1 && req_ctx->nbuf && req_ctx->nbuf < blocksize) {
2057                 int offset;
2058
2059                 if (nbytes_to_hash > blocksize)
2060                         offset = blocksize - req_ctx->nbuf;
2061                 else
2062                         offset = nbytes_to_hash - req_ctx->nbuf;
2063                 nents = sg_nents_for_len(areq->src, offset);
2064                 if (nents < 0) {
2065                         dev_err(ctx->dev, "Invalid number of src SG.\n");
2066                         return nents;
2067                 }
2068                 sg_copy_to_buffer(areq->src, nents,
2069                                   ctx_buf + req_ctx->nbuf, offset);
2070                 req_ctx->nbuf += offset;
2071                 req_ctx->psrc = scatterwalk_ffwd(req_ctx->bufsl, areq->src,
2072                                                  offset);
2073         } else
2074                 req_ctx->psrc = areq->src;
2075
2076         if (to_hash_later) {
2077                 nents = sg_nents_for_len(areq->src, nbytes);
2078                 if (nents < 0) {
2079                         dev_err(ctx->dev, "Invalid number of src SG.\n");
2080                         return nents;
2081                 }
2082                 sg_pcopy_to_buffer(areq->src, nents,
2083                                    req_ctx->buf[(req_ctx->buf_idx + 1) & 1],
2084                                       to_hash_later,
2085                                       nbytes - to_hash_later);
2086         }
2087         req_ctx->to_hash_later = to_hash_later;
2088
2089         /* Allocate extended descriptor */
2090         edesc = ahash_edesc_alloc(areq, nbytes_to_hash);
2091         if (IS_ERR(edesc))
2092                 return PTR_ERR(edesc);
2093
2094         edesc->desc.hdr = ctx->desc_hdr_template;
2095
2096         /* On last one, request SEC to pad; otherwise continue */
2097         if (req_ctx->last)
2098                 edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_PAD;
2099         else
2100                 edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_CONT;
2101
2102         /* request SEC to INIT hash. */
2103         if (req_ctx->first && !req_ctx->swinit)
2104                 edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_INIT;
2105
2106         /* When the tfm context has a keylen, it's an HMAC.
2107          * A first or last (ie. not middle) descriptor must request HMAC.
2108          */
2109         if (ctx->keylen && (req_ctx->first || req_ctx->last))
2110                 edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_HMAC;
2111
2112         return common_nonsnoop_hash(edesc, areq, nbytes_to_hash, ahash_done);
2113 }
2114
2115 static int ahash_update(struct ahash_request *areq)
2116 {
2117         struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2118
2119         req_ctx->last = 0;
2120
2121         return ahash_process_req(areq, areq->nbytes);
2122 }
2123
2124 static int ahash_final(struct ahash_request *areq)
2125 {
2126         struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2127
2128         req_ctx->last = 1;
2129
2130         return ahash_process_req(areq, 0);
2131 }
2132
2133 static int ahash_finup(struct ahash_request *areq)
2134 {
2135         struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2136
2137         req_ctx->last = 1;
2138
2139         return ahash_process_req(areq, areq->nbytes);
2140 }
2141
2142 static int ahash_digest(struct ahash_request *areq)
2143 {
2144         struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2145         struct crypto_ahash *ahash = crypto_ahash_reqtfm(areq);
2146
2147         ahash->init(areq);
2148         req_ctx->last = 1;
2149
2150         return ahash_process_req(areq, areq->nbytes);
2151 }
2152
2153 static int ahash_export(struct ahash_request *areq, void *out)
2154 {
2155         struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2156         struct talitos_export_state *export = out;
2157         struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2158         struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
2159         struct device *dev = ctx->dev;
2160         dma_addr_t dma;
2161
2162         dma = dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size,
2163                              DMA_FROM_DEVICE);
2164         dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_FROM_DEVICE);
2165
2166         memcpy(export->hw_context, req_ctx->hw_context,
2167                req_ctx->hw_context_size);
2168         memcpy(export->buf, req_ctx->buf[req_ctx->buf_idx], req_ctx->nbuf);
2169         export->swinit = req_ctx->swinit;
2170         export->first = req_ctx->first;
2171         export->last = req_ctx->last;
2172         export->to_hash_later = req_ctx->to_hash_later;
2173         export->nbuf = req_ctx->nbuf;
2174
2175         return 0;
2176 }
2177
2178 static int ahash_import(struct ahash_request *areq, const void *in)
2179 {
2180         struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2181         struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2182         struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
2183         struct device *dev = ctx->dev;
2184         const struct talitos_export_state *export = in;
2185         unsigned int size;
2186         dma_addr_t dma;
2187
2188         memset(req_ctx, 0, sizeof(*req_ctx));
2189         size = (crypto_ahash_digestsize(tfm) <= SHA256_DIGEST_SIZE)
2190                         ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256
2191                         : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512;
2192         req_ctx->hw_context_size = size;
2193         memcpy(req_ctx->hw_context, export->hw_context, size);
2194         memcpy(req_ctx->buf[0], export->buf, export->nbuf);
2195         req_ctx->swinit = export->swinit;
2196         req_ctx->first = export->first;
2197         req_ctx->last = export->last;
2198         req_ctx->to_hash_later = export->to_hash_later;
2199         req_ctx->nbuf = export->nbuf;
2200
2201         dma = dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size,
2202                              DMA_TO_DEVICE);
2203         dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_TO_DEVICE);
2204
2205         return 0;
2206 }
2207
2208 static int keyhash(struct crypto_ahash *tfm, const u8 *key, unsigned int keylen,
2209                    u8 *hash)
2210 {
2211         struct talitos_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
2212
2213         struct scatterlist sg[1];
2214         struct ahash_request *req;
2215         struct crypto_wait wait;
2216         int ret;
2217
2218         crypto_init_wait(&wait);
2219
2220         req = ahash_request_alloc(tfm, GFP_KERNEL);
2221         if (!req)
2222                 return -ENOMEM;
2223
2224         /* Keep tfm keylen == 0 during hash of the long key */
2225         ctx->keylen = 0;
2226         ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2227                                    crypto_req_done, &wait);
2228
2229         sg_init_one(&sg[0], key, keylen);
2230
2231         ahash_request_set_crypt(req, sg, hash, keylen);
2232         ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
2233
2234         ahash_request_free(req);
2235
2236         return ret;
2237 }
2238
2239 static int ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
2240                         unsigned int keylen)
2241 {
2242         struct talitos_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
2243         struct device *dev = ctx->dev;
2244         unsigned int blocksize =
2245                         crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
2246         unsigned int digestsize = crypto_ahash_digestsize(tfm);
2247         unsigned int keysize = keylen;
2248         u8 hash[SHA512_DIGEST_SIZE];
2249         int ret;
2250
2251         if (keylen <= blocksize)
2252                 memcpy(ctx->key, key, keysize);
2253         else {
2254                 /* Must get the hash of the long key */
2255                 ret = keyhash(tfm, key, keylen, hash);
2256
2257                 if (ret) {
2258                         crypto_ahash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
2259                         return -EINVAL;
2260                 }
2261
2262                 keysize = digestsize;
2263                 memcpy(ctx->key, hash, digestsize);
2264         }
2265
2266         if (ctx->keylen)
2267                 dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
2268
2269         ctx->keylen = keysize;
2270         ctx->dma_key = dma_map_single(dev, ctx->key, keysize, DMA_TO_DEVICE);
2271
2272         return 0;
2273 }
2274
2275
2276 struct talitos_alg_template {
2277         u32 type;
2278         u32 priority;
2279         union {
2280                 struct crypto_alg crypto;
2281                 struct ahash_alg hash;
2282                 struct aead_alg aead;
2283         } alg;
2284         __be32 desc_hdr_template;
2285 };
2286
2287 static struct talitos_alg_template driver_algs[] = {
2288         /* AEAD algorithms.  These use a single-pass ipsec_esp descriptor */
2289         {       .type = CRYPTO_ALG_TYPE_AEAD,
2290                 .alg.aead = {
2291                         .base = {
2292                                 .cra_name = "authenc(hmac(sha1),cbc(aes))",
2293                                 .cra_driver_name = "authenc-hmac-sha1-"
2294                                                    "cbc-aes-talitos",
2295                                 .cra_blocksize = AES_BLOCK_SIZE,
2296                                 .cra_flags = CRYPTO_ALG_ASYNC,
2297                         },
2298                         .ivsize = AES_BLOCK_SIZE,
2299                         .maxauthsize = SHA1_DIGEST_SIZE,
2300                 },
2301                 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2302                                      DESC_HDR_SEL0_AESU |
2303                                      DESC_HDR_MODE0_AESU_CBC |
2304                                      DESC_HDR_SEL1_MDEUA |
2305                                      DESC_HDR_MODE1_MDEU_INIT |
2306                                      DESC_HDR_MODE1_MDEU_PAD |
2307                                      DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2308         },
2309         {       .type = CRYPTO_ALG_TYPE_AEAD,
2310                 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2311                 .alg.aead = {
2312                         .base = {
2313                                 .cra_name = "authenc(hmac(sha1),cbc(aes))",
2314                                 .cra_driver_name = "authenc-hmac-sha1-"
2315                                                    "cbc-aes-talitos-hsna",
2316                                 .cra_blocksize = AES_BLOCK_SIZE,
2317                                 .cra_flags = CRYPTO_ALG_ASYNC,
2318                         },
2319                         .ivsize = AES_BLOCK_SIZE,
2320                         .maxauthsize = SHA1_DIGEST_SIZE,
2321                 },
2322                 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2323                                      DESC_HDR_SEL0_AESU |
2324                                      DESC_HDR_MODE0_AESU_CBC |
2325                                      DESC_HDR_SEL1_MDEUA |
2326                                      DESC_HDR_MODE1_MDEU_INIT |
2327                                      DESC_HDR_MODE1_MDEU_PAD |
2328                                      DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2329         },
2330         {       .type = CRYPTO_ALG_TYPE_AEAD,
2331                 .alg.aead = {
2332                         .base = {
2333                                 .cra_name = "authenc(hmac(sha1),"
2334                                             "cbc(des3_ede))",
2335                                 .cra_driver_name = "authenc-hmac-sha1-"
2336                                                    "cbc-3des-talitos",
2337                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2338                                 .cra_flags = CRYPTO_ALG_ASYNC,
2339                         },
2340                         .ivsize = DES3_EDE_BLOCK_SIZE,
2341                         .maxauthsize = SHA1_DIGEST_SIZE,
2342                         .setkey = aead_des3_setkey,
2343                 },
2344                 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2345                                      DESC_HDR_SEL0_DEU |
2346                                      DESC_HDR_MODE0_DEU_CBC |
2347                                      DESC_HDR_MODE0_DEU_3DES |
2348                                      DESC_HDR_SEL1_MDEUA |
2349                                      DESC_HDR_MODE1_MDEU_INIT |
2350                                      DESC_HDR_MODE1_MDEU_PAD |
2351                                      DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2352         },
2353         {       .type = CRYPTO_ALG_TYPE_AEAD,
2354                 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2355                 .alg.aead = {
2356                         .base = {
2357                                 .cra_name = "authenc(hmac(sha1),"
2358                                             "cbc(des3_ede))",
2359                                 .cra_driver_name = "authenc-hmac-sha1-"
2360                                                    "cbc-3des-talitos-hsna",
2361                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2362                                 .cra_flags = CRYPTO_ALG_ASYNC,
2363                         },
2364                         .ivsize = DES3_EDE_BLOCK_SIZE,
2365                         .maxauthsize = SHA1_DIGEST_SIZE,
2366                         .setkey = aead_des3_setkey,
2367                 },
2368                 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2369                                      DESC_HDR_SEL0_DEU |
2370                                      DESC_HDR_MODE0_DEU_CBC |
2371                                      DESC_HDR_MODE0_DEU_3DES |
2372                                      DESC_HDR_SEL1_MDEUA |
2373                                      DESC_HDR_MODE1_MDEU_INIT |
2374                                      DESC_HDR_MODE1_MDEU_PAD |
2375                                      DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2376         },
2377         {       .type = CRYPTO_ALG_TYPE_AEAD,
2378                 .alg.aead = {
2379                         .base = {
2380                                 .cra_name = "authenc(hmac(sha224),cbc(aes))",
2381                                 .cra_driver_name = "authenc-hmac-sha224-"
2382                                                    "cbc-aes-talitos",
2383                                 .cra_blocksize = AES_BLOCK_SIZE,
2384                                 .cra_flags = CRYPTO_ALG_ASYNC,
2385                         },
2386                         .ivsize = AES_BLOCK_SIZE,
2387                         .maxauthsize = SHA224_DIGEST_SIZE,
2388                 },
2389                 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2390                                      DESC_HDR_SEL0_AESU |
2391                                      DESC_HDR_MODE0_AESU_CBC |
2392                                      DESC_HDR_SEL1_MDEUA |
2393                                      DESC_HDR_MODE1_MDEU_INIT |
2394                                      DESC_HDR_MODE1_MDEU_PAD |
2395                                      DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2396         },
2397         {       .type = CRYPTO_ALG_TYPE_AEAD,
2398                 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2399                 .alg.aead = {
2400                         .base = {
2401                                 .cra_name = "authenc(hmac(sha224),cbc(aes))",
2402                                 .cra_driver_name = "authenc-hmac-sha224-"
2403                                                    "cbc-aes-talitos-hsna",
2404                                 .cra_blocksize = AES_BLOCK_SIZE,
2405                                 .cra_flags = CRYPTO_ALG_ASYNC,
2406                         },
2407                         .ivsize = AES_BLOCK_SIZE,
2408                         .maxauthsize = SHA224_DIGEST_SIZE,
2409                 },
2410                 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2411                                      DESC_HDR_SEL0_AESU |
2412                                      DESC_HDR_MODE0_AESU_CBC |
2413                                      DESC_HDR_SEL1_MDEUA |
2414                                      DESC_HDR_MODE1_MDEU_INIT |
2415                                      DESC_HDR_MODE1_MDEU_PAD |
2416                                      DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2417         },
2418         {       .type = CRYPTO_ALG_TYPE_AEAD,
2419                 .alg.aead = {
2420                         .base = {
2421                                 .cra_name = "authenc(hmac(sha224),"
2422                                             "cbc(des3_ede))",
2423                                 .cra_driver_name = "authenc-hmac-sha224-"
2424                                                    "cbc-3des-talitos",
2425                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2426                                 .cra_flags = CRYPTO_ALG_ASYNC,
2427                         },
2428                         .ivsize = DES3_EDE_BLOCK_SIZE,
2429                         .maxauthsize = SHA224_DIGEST_SIZE,
2430                         .setkey = aead_des3_setkey,
2431                 },
2432                 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2433                                      DESC_HDR_SEL0_DEU |
2434                                      DESC_HDR_MODE0_DEU_CBC |
2435                                      DESC_HDR_MODE0_DEU_3DES |
2436                                      DESC_HDR_SEL1_MDEUA |
2437                                      DESC_HDR_MODE1_MDEU_INIT |
2438                                      DESC_HDR_MODE1_MDEU_PAD |
2439                                      DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2440         },
2441         {       .type = CRYPTO_ALG_TYPE_AEAD,
2442                 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2443                 .alg.aead = {
2444                         .base = {
2445                                 .cra_name = "authenc(hmac(sha224),"
2446                                             "cbc(des3_ede))",
2447                                 .cra_driver_name = "authenc-hmac-sha224-"
2448                                                    "cbc-3des-talitos-hsna",
2449                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2450                                 .cra_flags = CRYPTO_ALG_ASYNC,
2451                         },
2452                         .ivsize = DES3_EDE_BLOCK_SIZE,
2453                         .maxauthsize = SHA224_DIGEST_SIZE,
2454                         .setkey = aead_des3_setkey,
2455                 },
2456                 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2457                                      DESC_HDR_SEL0_DEU |
2458                                      DESC_HDR_MODE0_DEU_CBC |
2459                                      DESC_HDR_MODE0_DEU_3DES |
2460                                      DESC_HDR_SEL1_MDEUA |
2461                                      DESC_HDR_MODE1_MDEU_INIT |
2462                                      DESC_HDR_MODE1_MDEU_PAD |
2463                                      DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2464         },
2465         {       .type = CRYPTO_ALG_TYPE_AEAD,
2466                 .alg.aead = {
2467                         .base = {
2468                                 .cra_name = "authenc(hmac(sha256),cbc(aes))",
2469                                 .cra_driver_name = "authenc-hmac-sha256-"
2470                                                    "cbc-aes-talitos",
2471                                 .cra_blocksize = AES_BLOCK_SIZE,
2472                                 .cra_flags = CRYPTO_ALG_ASYNC,
2473                         },
2474                         .ivsize = AES_BLOCK_SIZE,
2475                         .maxauthsize = SHA256_DIGEST_SIZE,
2476                 },
2477                 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2478                                      DESC_HDR_SEL0_AESU |
2479                                      DESC_HDR_MODE0_AESU_CBC |
2480                                      DESC_HDR_SEL1_MDEUA |
2481                                      DESC_HDR_MODE1_MDEU_INIT |
2482                                      DESC_HDR_MODE1_MDEU_PAD |
2483                                      DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2484         },
2485         {       .type = CRYPTO_ALG_TYPE_AEAD,
2486                 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2487                 .alg.aead = {
2488                         .base = {
2489                                 .cra_name = "authenc(hmac(sha256),cbc(aes))",
2490                                 .cra_driver_name = "authenc-hmac-sha256-"
2491                                                    "cbc-aes-talitos-hsna",
2492                                 .cra_blocksize = AES_BLOCK_SIZE,
2493                                 .cra_flags = CRYPTO_ALG_ASYNC,
2494                         },
2495                         .ivsize = AES_BLOCK_SIZE,
2496                         .maxauthsize = SHA256_DIGEST_SIZE,
2497                 },
2498                 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2499                                      DESC_HDR_SEL0_AESU |
2500                                      DESC_HDR_MODE0_AESU_CBC |
2501                                      DESC_HDR_SEL1_MDEUA |
2502                                      DESC_HDR_MODE1_MDEU_INIT |
2503                                      DESC_HDR_MODE1_MDEU_PAD |
2504                                      DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2505         },
2506         {       .type = CRYPTO_ALG_TYPE_AEAD,
2507                 .alg.aead = {
2508                         .base = {
2509                                 .cra_name = "authenc(hmac(sha256),"
2510                                             "cbc(des3_ede))",
2511                                 .cra_driver_name = "authenc-hmac-sha256-"
2512                                                    "cbc-3des-talitos",
2513                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2514                                 .cra_flags = CRYPTO_ALG_ASYNC,
2515                         },
2516                         .ivsize = DES3_EDE_BLOCK_SIZE,
2517                         .maxauthsize = SHA256_DIGEST_SIZE,
2518                         .setkey = aead_des3_setkey,
2519                 },
2520                 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2521                                      DESC_HDR_SEL0_DEU |
2522                                      DESC_HDR_MODE0_DEU_CBC |
2523                                      DESC_HDR_MODE0_DEU_3DES |
2524                                      DESC_HDR_SEL1_MDEUA |
2525                                      DESC_HDR_MODE1_MDEU_INIT |
2526                                      DESC_HDR_MODE1_MDEU_PAD |
2527                                      DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2528         },
2529         {       .type = CRYPTO_ALG_TYPE_AEAD,
2530                 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2531                 .alg.aead = {
2532                         .base = {
2533                                 .cra_name = "authenc(hmac(sha256),"
2534                                             "cbc(des3_ede))",
2535                                 .cra_driver_name = "authenc-hmac-sha256-"
2536                                                    "cbc-3des-talitos-hsna",
2537                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2538                                 .cra_flags = CRYPTO_ALG_ASYNC,
2539                         },
2540                         .ivsize = DES3_EDE_BLOCK_SIZE,
2541                         .maxauthsize = SHA256_DIGEST_SIZE,
2542                         .setkey = aead_des3_setkey,
2543                 },
2544                 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2545                                      DESC_HDR_SEL0_DEU |
2546                                      DESC_HDR_MODE0_DEU_CBC |
2547                                      DESC_HDR_MODE0_DEU_3DES |
2548                                      DESC_HDR_SEL1_MDEUA |
2549                                      DESC_HDR_MODE1_MDEU_INIT |
2550                                      DESC_HDR_MODE1_MDEU_PAD |
2551                                      DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2552         },
2553         {       .type = CRYPTO_ALG_TYPE_AEAD,
2554                 .alg.aead = {
2555                         .base = {
2556                                 .cra_name = "authenc(hmac(sha384),cbc(aes))",
2557                                 .cra_driver_name = "authenc-hmac-sha384-"
2558                                                    "cbc-aes-talitos",
2559                                 .cra_blocksize = AES_BLOCK_SIZE,
2560                                 .cra_flags = CRYPTO_ALG_ASYNC,
2561                         },
2562                         .ivsize = AES_BLOCK_SIZE,
2563                         .maxauthsize = SHA384_DIGEST_SIZE,
2564                 },
2565                 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2566                                      DESC_HDR_SEL0_AESU |
2567                                      DESC_HDR_MODE0_AESU_CBC |
2568                                      DESC_HDR_SEL1_MDEUB |
2569                                      DESC_HDR_MODE1_MDEU_INIT |
2570                                      DESC_HDR_MODE1_MDEU_PAD |
2571                                      DESC_HDR_MODE1_MDEUB_SHA384_HMAC,
2572         },
2573         {       .type = CRYPTO_ALG_TYPE_AEAD,
2574                 .alg.aead = {
2575                         .base = {
2576                                 .cra_name = "authenc(hmac(sha384),"
2577                                             "cbc(des3_ede))",
2578                                 .cra_driver_name = "authenc-hmac-sha384-"
2579                                                    "cbc-3des-talitos",
2580                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2581                                 .cra_flags = CRYPTO_ALG_ASYNC,
2582                         },
2583                         .ivsize = DES3_EDE_BLOCK_SIZE,
2584                         .maxauthsize = SHA384_DIGEST_SIZE,
2585                         .setkey = aead_des3_setkey,
2586                 },
2587                 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2588                                      DESC_HDR_SEL0_DEU |
2589                                      DESC_HDR_MODE0_DEU_CBC |
2590                                      DESC_HDR_MODE0_DEU_3DES |
2591                                      DESC_HDR_SEL1_MDEUB |
2592                                      DESC_HDR_MODE1_MDEU_INIT |
2593                                      DESC_HDR_MODE1_MDEU_PAD |
2594                                      DESC_HDR_MODE1_MDEUB_SHA384_HMAC,
2595         },
2596         {       .type = CRYPTO_ALG_TYPE_AEAD,
2597                 .alg.aead = {
2598                         .base = {
2599                                 .cra_name = "authenc(hmac(sha512),cbc(aes))",
2600                                 .cra_driver_name = "authenc-hmac-sha512-"
2601                                                    "cbc-aes-talitos",
2602                                 .cra_blocksize = AES_BLOCK_SIZE,
2603                                 .cra_flags = CRYPTO_ALG_ASYNC,
2604                         },
2605                         .ivsize = AES_BLOCK_SIZE,
2606                         .maxauthsize = SHA512_DIGEST_SIZE,
2607                 },
2608                 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2609                                      DESC_HDR_SEL0_AESU |
2610                                      DESC_HDR_MODE0_AESU_CBC |
2611                                      DESC_HDR_SEL1_MDEUB |
2612                                      DESC_HDR_MODE1_MDEU_INIT |
2613                                      DESC_HDR_MODE1_MDEU_PAD |
2614                                      DESC_HDR_MODE1_MDEUB_SHA512_HMAC,
2615         },
2616         {       .type = CRYPTO_ALG_TYPE_AEAD,
2617                 .alg.aead = {
2618                         .base = {
2619                                 .cra_name = "authenc(hmac(sha512),"
2620                                             "cbc(des3_ede))",
2621                                 .cra_driver_name = "authenc-hmac-sha512-"
2622                                                    "cbc-3des-talitos",
2623                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2624                                 .cra_flags = CRYPTO_ALG_ASYNC,
2625                         },
2626                         .ivsize = DES3_EDE_BLOCK_SIZE,
2627                         .maxauthsize = SHA512_DIGEST_SIZE,
2628                         .setkey = aead_des3_setkey,
2629                 },
2630                 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2631                                      DESC_HDR_SEL0_DEU |
2632                                      DESC_HDR_MODE0_DEU_CBC |
2633                                      DESC_HDR_MODE0_DEU_3DES |
2634                                      DESC_HDR_SEL1_MDEUB |
2635                                      DESC_HDR_MODE1_MDEU_INIT |
2636                                      DESC_HDR_MODE1_MDEU_PAD |
2637                                      DESC_HDR_MODE1_MDEUB_SHA512_HMAC,
2638         },
2639         {       .type = CRYPTO_ALG_TYPE_AEAD,
2640                 .alg.aead = {
2641                         .base = {
2642                                 .cra_name = "authenc(hmac(md5),cbc(aes))",
2643                                 .cra_driver_name = "authenc-hmac-md5-"
2644                                                    "cbc-aes-talitos",
2645                                 .cra_blocksize = AES_BLOCK_SIZE,
2646                                 .cra_flags = CRYPTO_ALG_ASYNC,
2647                         },
2648                         .ivsize = AES_BLOCK_SIZE,
2649                         .maxauthsize = MD5_DIGEST_SIZE,
2650                 },
2651                 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2652                                      DESC_HDR_SEL0_AESU |
2653                                      DESC_HDR_MODE0_AESU_CBC |
2654                                      DESC_HDR_SEL1_MDEUA |
2655                                      DESC_HDR_MODE1_MDEU_INIT |
2656                                      DESC_HDR_MODE1_MDEU_PAD |
2657                                      DESC_HDR_MODE1_MDEU_MD5_HMAC,
2658         },
2659         {       .type = CRYPTO_ALG_TYPE_AEAD,
2660                 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2661                 .alg.aead = {
2662                         .base = {
2663                                 .cra_name = "authenc(hmac(md5),cbc(aes))",
2664                                 .cra_driver_name = "authenc-hmac-md5-"
2665                                                    "cbc-aes-talitos-hsna",
2666                                 .cra_blocksize = AES_BLOCK_SIZE,
2667                                 .cra_flags = CRYPTO_ALG_ASYNC,
2668                         },
2669                         .ivsize = AES_BLOCK_SIZE,
2670                         .maxauthsize = MD5_DIGEST_SIZE,
2671                 },
2672                 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2673                                      DESC_HDR_SEL0_AESU |
2674                                      DESC_HDR_MODE0_AESU_CBC |
2675                                      DESC_HDR_SEL1_MDEUA |
2676                                      DESC_HDR_MODE1_MDEU_INIT |
2677                                      DESC_HDR_MODE1_MDEU_PAD |
2678                                      DESC_HDR_MODE1_MDEU_MD5_HMAC,
2679         },
2680         {       .type = CRYPTO_ALG_TYPE_AEAD,
2681                 .alg.aead = {
2682                         .base = {
2683                                 .cra_name = "authenc(hmac(md5),cbc(des3_ede))",
2684                                 .cra_driver_name = "authenc-hmac-md5-"
2685                                                    "cbc-3des-talitos",
2686                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2687                                 .cra_flags = CRYPTO_ALG_ASYNC,
2688                         },
2689                         .ivsize = DES3_EDE_BLOCK_SIZE,
2690                         .maxauthsize = MD5_DIGEST_SIZE,
2691                         .setkey = aead_des3_setkey,
2692                 },
2693                 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2694                                      DESC_HDR_SEL0_DEU |
2695                                      DESC_HDR_MODE0_DEU_CBC |
2696                                      DESC_HDR_MODE0_DEU_3DES |
2697                                      DESC_HDR_SEL1_MDEUA |
2698                                      DESC_HDR_MODE1_MDEU_INIT |
2699                                      DESC_HDR_MODE1_MDEU_PAD |
2700                                      DESC_HDR_MODE1_MDEU_MD5_HMAC,
2701         },
2702         {       .type = CRYPTO_ALG_TYPE_AEAD,
2703                 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2704                 .alg.aead = {
2705                         .base = {
2706                                 .cra_name = "authenc(hmac(md5),cbc(des3_ede))",
2707                                 .cra_driver_name = "authenc-hmac-md5-"
2708                                                    "cbc-3des-talitos-hsna",
2709                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2710                                 .cra_flags = CRYPTO_ALG_ASYNC,
2711                         },
2712                         .ivsize = DES3_EDE_BLOCK_SIZE,
2713                         .maxauthsize = MD5_DIGEST_SIZE,
2714                         .setkey = aead_des3_setkey,
2715                 },
2716                 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2717                                      DESC_HDR_SEL0_DEU |
2718                                      DESC_HDR_MODE0_DEU_CBC |
2719                                      DESC_HDR_MODE0_DEU_3DES |
2720                                      DESC_HDR_SEL1_MDEUA |
2721                                      DESC_HDR_MODE1_MDEU_INIT |
2722                                      DESC_HDR_MODE1_MDEU_PAD |
2723                                      DESC_HDR_MODE1_MDEU_MD5_HMAC,
2724         },
2725         /* ABLKCIPHER algorithms. */
2726         {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2727                 .alg.crypto = {
2728                         .cra_name = "ecb(aes)",
2729                         .cra_driver_name = "ecb-aes-talitos",
2730                         .cra_blocksize = AES_BLOCK_SIZE,
2731                         .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2732                                      CRYPTO_ALG_ASYNC,
2733                         .cra_ablkcipher = {
2734                                 .min_keysize = AES_MIN_KEY_SIZE,
2735                                 .max_keysize = AES_MAX_KEY_SIZE,
2736                                 .setkey = ablkcipher_aes_setkey,
2737                         }
2738                 },
2739                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2740                                      DESC_HDR_SEL0_AESU,
2741         },
2742         {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2743                 .alg.crypto = {
2744                         .cra_name = "cbc(aes)",
2745                         .cra_driver_name = "cbc-aes-talitos",
2746                         .cra_blocksize = AES_BLOCK_SIZE,
2747                         .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2748                                      CRYPTO_ALG_ASYNC,
2749                         .cra_ablkcipher = {
2750                                 .min_keysize = AES_MIN_KEY_SIZE,
2751                                 .max_keysize = AES_MAX_KEY_SIZE,
2752                                 .ivsize = AES_BLOCK_SIZE,
2753                                 .setkey = ablkcipher_aes_setkey,
2754                         }
2755                 },
2756                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2757                                      DESC_HDR_SEL0_AESU |
2758                                      DESC_HDR_MODE0_AESU_CBC,
2759         },
2760         {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2761                 .alg.crypto = {
2762                         .cra_name = "ctr(aes)",
2763                         .cra_driver_name = "ctr-aes-talitos",
2764                         .cra_blocksize = 1,
2765                         .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2766                                      CRYPTO_ALG_ASYNC,
2767                         .cra_ablkcipher = {
2768                                 .min_keysize = AES_MIN_KEY_SIZE,
2769                                 .max_keysize = AES_MAX_KEY_SIZE,
2770                                 .ivsize = AES_BLOCK_SIZE,
2771                                 .setkey = ablkcipher_aes_setkey,
2772                         }
2773                 },
2774                 .desc_hdr_template = DESC_HDR_TYPE_AESU_CTR_NONSNOOP |
2775                                      DESC_HDR_SEL0_AESU |
2776                                      DESC_HDR_MODE0_AESU_CTR,
2777         },
2778         {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2779                 .alg.crypto = {
2780                         .cra_name = "ecb(des)",
2781                         .cra_driver_name = "ecb-des-talitos",
2782                         .cra_blocksize = DES_BLOCK_SIZE,
2783                         .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2784                                      CRYPTO_ALG_ASYNC,
2785                         .cra_ablkcipher = {
2786                                 .min_keysize = DES_KEY_SIZE,
2787                                 .max_keysize = DES_KEY_SIZE,
2788                                 .setkey = ablkcipher_des_setkey,
2789                         }
2790                 },
2791                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2792                                      DESC_HDR_SEL0_DEU,
2793         },
2794         {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2795                 .alg.crypto = {
2796                         .cra_name = "cbc(des)",
2797                         .cra_driver_name = "cbc-des-talitos",
2798                         .cra_blocksize = DES_BLOCK_SIZE,
2799                         .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2800                                      CRYPTO_ALG_ASYNC,
2801                         .cra_ablkcipher = {
2802                                 .min_keysize = DES_KEY_SIZE,
2803                                 .max_keysize = DES_KEY_SIZE,
2804                                 .ivsize = DES_BLOCK_SIZE,
2805                                 .setkey = ablkcipher_des_setkey,
2806                         }
2807                 },
2808                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2809                                      DESC_HDR_SEL0_DEU |
2810                                      DESC_HDR_MODE0_DEU_CBC,
2811         },
2812         {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2813                 .alg.crypto = {
2814                         .cra_name = "ecb(des3_ede)",
2815                         .cra_driver_name = "ecb-3des-talitos",
2816                         .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2817                         .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2818                                      CRYPTO_ALG_ASYNC,
2819                         .cra_ablkcipher = {
2820                                 .min_keysize = DES3_EDE_KEY_SIZE,
2821                                 .max_keysize = DES3_EDE_KEY_SIZE,
2822                                 .setkey = ablkcipher_des3_setkey,
2823                         }
2824                 },
2825                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2826                                      DESC_HDR_SEL0_DEU |
2827                                      DESC_HDR_MODE0_DEU_3DES,
2828         },
2829         {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2830                 .alg.crypto = {
2831                         .cra_name = "cbc(des3_ede)",
2832                         .cra_driver_name = "cbc-3des-talitos",
2833                         .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2834                         .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2835                                      CRYPTO_ALG_ASYNC,
2836                         .cra_ablkcipher = {
2837                                 .min_keysize = DES3_EDE_KEY_SIZE,
2838                                 .max_keysize = DES3_EDE_KEY_SIZE,
2839                                 .ivsize = DES3_EDE_BLOCK_SIZE,
2840                                 .setkey = ablkcipher_des3_setkey,
2841                         }
2842                 },
2843                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2844                                      DESC_HDR_SEL0_DEU |
2845                                      DESC_HDR_MODE0_DEU_CBC |
2846                                      DESC_HDR_MODE0_DEU_3DES,
2847         },
2848         /* AHASH algorithms. */
2849         {       .type = CRYPTO_ALG_TYPE_AHASH,
2850                 .alg.hash = {
2851                         .halg.digestsize = MD5_DIGEST_SIZE,
2852                         .halg.statesize = sizeof(struct talitos_export_state),
2853                         .halg.base = {
2854                                 .cra_name = "md5",
2855                                 .cra_driver_name = "md5-talitos",
2856                                 .cra_blocksize = MD5_HMAC_BLOCK_SIZE,
2857                                 .cra_flags = CRYPTO_ALG_ASYNC,
2858                         }
2859                 },
2860                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2861                                      DESC_HDR_SEL0_MDEUA |
2862                                      DESC_HDR_MODE0_MDEU_MD5,
2863         },
2864         {       .type = CRYPTO_ALG_TYPE_AHASH,
2865                 .alg.hash = {
2866                         .halg.digestsize = SHA1_DIGEST_SIZE,
2867                         .halg.statesize = sizeof(struct talitos_export_state),
2868                         .halg.base = {
2869                                 .cra_name = "sha1",
2870                                 .cra_driver_name = "sha1-talitos",
2871                                 .cra_blocksize = SHA1_BLOCK_SIZE,
2872                                 .cra_flags = CRYPTO_ALG_ASYNC,
2873                         }
2874                 },
2875                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2876                                      DESC_HDR_SEL0_MDEUA |
2877                                      DESC_HDR_MODE0_MDEU_SHA1,
2878         },
2879         {       .type = CRYPTO_ALG_TYPE_AHASH,
2880                 .alg.hash = {
2881                         .halg.digestsize = SHA224_DIGEST_SIZE,
2882                         .halg.statesize = sizeof(struct talitos_export_state),
2883                         .halg.base = {
2884                                 .cra_name = "sha224",
2885                                 .cra_driver_name = "sha224-talitos",
2886                                 .cra_blocksize = SHA224_BLOCK_SIZE,
2887                                 .cra_flags = CRYPTO_ALG_ASYNC,
2888                         }
2889                 },
2890                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2891                                      DESC_HDR_SEL0_MDEUA |
2892                                      DESC_HDR_MODE0_MDEU_SHA224,
2893         },
2894         {       .type = CRYPTO_ALG_TYPE_AHASH,
2895                 .alg.hash = {
2896                         .halg.digestsize = SHA256_DIGEST_SIZE,
2897                         .halg.statesize = sizeof(struct talitos_export_state),
2898                         .halg.base = {
2899                                 .cra_name = "sha256",
2900                                 .cra_driver_name = "sha256-talitos",
2901                                 .cra_blocksize = SHA256_BLOCK_SIZE,
2902                                 .cra_flags = CRYPTO_ALG_ASYNC,
2903                         }
2904                 },
2905                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2906                                      DESC_HDR_SEL0_MDEUA |
2907                                      DESC_HDR_MODE0_MDEU_SHA256,
2908         },
2909         {       .type = CRYPTO_ALG_TYPE_AHASH,
2910                 .alg.hash = {
2911                         .halg.digestsize = SHA384_DIGEST_SIZE,
2912                         .halg.statesize = sizeof(struct talitos_export_state),
2913                         .halg.base = {
2914                                 .cra_name = "sha384",
2915                                 .cra_driver_name = "sha384-talitos",
2916                                 .cra_blocksize = SHA384_BLOCK_SIZE,
2917                                 .cra_flags = CRYPTO_ALG_ASYNC,
2918                         }
2919                 },
2920                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2921                                      DESC_HDR_SEL0_MDEUB |
2922                                      DESC_HDR_MODE0_MDEUB_SHA384,
2923         },
2924         {       .type = CRYPTO_ALG_TYPE_AHASH,
2925                 .alg.hash = {
2926                         .halg.digestsize = SHA512_DIGEST_SIZE,
2927                         .halg.statesize = sizeof(struct talitos_export_state),
2928                         .halg.base = {
2929                                 .cra_name = "sha512",
2930                                 .cra_driver_name = "sha512-talitos",
2931                                 .cra_blocksize = SHA512_BLOCK_SIZE,
2932                                 .cra_flags = CRYPTO_ALG_ASYNC,
2933                         }
2934                 },
2935                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2936                                      DESC_HDR_SEL0_MDEUB |
2937                                      DESC_HDR_MODE0_MDEUB_SHA512,
2938         },
2939         {       .type = CRYPTO_ALG_TYPE_AHASH,
2940                 .alg.hash = {
2941                         .halg.digestsize = MD5_DIGEST_SIZE,
2942                         .halg.statesize = sizeof(struct talitos_export_state),
2943                         .halg.base = {
2944                                 .cra_name = "hmac(md5)",
2945                                 .cra_driver_name = "hmac-md5-talitos",
2946                                 .cra_blocksize = MD5_HMAC_BLOCK_SIZE,
2947                                 .cra_flags = CRYPTO_ALG_ASYNC,
2948                         }
2949                 },
2950                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2951                                      DESC_HDR_SEL0_MDEUA |
2952                                      DESC_HDR_MODE0_MDEU_MD5,
2953         },
2954         {       .type = CRYPTO_ALG_TYPE_AHASH,
2955                 .alg.hash = {
2956                         .halg.digestsize = SHA1_DIGEST_SIZE,
2957                         .halg.statesize = sizeof(struct talitos_export_state),
2958                         .halg.base = {
2959                                 .cra_name = "hmac(sha1)",
2960                                 .cra_driver_name = "hmac-sha1-talitos",
2961                                 .cra_blocksize = SHA1_BLOCK_SIZE,
2962                                 .cra_flags = CRYPTO_ALG_ASYNC,
2963                         }
2964                 },
2965                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2966                                      DESC_HDR_SEL0_MDEUA |
2967                                      DESC_HDR_MODE0_MDEU_SHA1,
2968         },
2969         {       .type = CRYPTO_ALG_TYPE_AHASH,
2970                 .alg.hash = {
2971                         .halg.digestsize = SHA224_DIGEST_SIZE,
2972                         .halg.statesize = sizeof(struct talitos_export_state),
2973                         .halg.base = {
2974                                 .cra_name = "hmac(sha224)",
2975                                 .cra_driver_name = "hmac-sha224-talitos",
2976                                 .cra_blocksize = SHA224_BLOCK_SIZE,
2977                                 .cra_flags = CRYPTO_ALG_ASYNC,
2978                         }
2979                 },
2980                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2981                                      DESC_HDR_SEL0_MDEUA |
2982                                      DESC_HDR_MODE0_MDEU_SHA224,
2983         },
2984         {       .type = CRYPTO_ALG_TYPE_AHASH,
2985                 .alg.hash = {
2986                         .halg.digestsize = SHA256_DIGEST_SIZE,
2987                         .halg.statesize = sizeof(struct talitos_export_state),
2988                         .halg.base = {
2989                                 .cra_name = "hmac(sha256)",
2990                                 .cra_driver_name = "hmac-sha256-talitos",
2991                                 .cra_blocksize = SHA256_BLOCK_SIZE,
2992                                 .cra_flags = CRYPTO_ALG_ASYNC,
2993                         }
2994                 },
2995                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2996                                      DESC_HDR_SEL0_MDEUA |
2997                                      DESC_HDR_MODE0_MDEU_SHA256,
2998         },
2999         {       .type = CRYPTO_ALG_TYPE_AHASH,
3000                 .alg.hash = {
3001                         .halg.digestsize = SHA384_DIGEST_SIZE,
3002                         .halg.statesize = sizeof(struct talitos_export_state),
3003                         .halg.base = {
3004                                 .cra_name = "hmac(sha384)",
3005                                 .cra_driver_name = "hmac-sha384-talitos",
3006                                 .cra_blocksize = SHA384_BLOCK_SIZE,
3007                                 .cra_flags = CRYPTO_ALG_ASYNC,
3008                         }
3009                 },
3010                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
3011                                      DESC_HDR_SEL0_MDEUB |
3012                                      DESC_HDR_MODE0_MDEUB_SHA384,
3013         },
3014         {       .type = CRYPTO_ALG_TYPE_AHASH,
3015                 .alg.hash = {
3016                         .halg.digestsize = SHA512_DIGEST_SIZE,
3017                         .halg.statesize = sizeof(struct talitos_export_state),
3018                         .halg.base = {
3019                                 .cra_name = "hmac(sha512)",
3020                                 .cra_driver_name = "hmac-sha512-talitos",
3021                                 .cra_blocksize = SHA512_BLOCK_SIZE,
3022                                 .cra_flags = CRYPTO_ALG_ASYNC,
3023                         }
3024                 },
3025                 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
3026                                      DESC_HDR_SEL0_MDEUB |
3027                                      DESC_HDR_MODE0_MDEUB_SHA512,
3028         }
3029 };
3030
3031 struct talitos_crypto_alg {
3032         struct list_head entry;
3033         struct device *dev;
3034         struct talitos_alg_template algt;
3035 };
3036
3037 static int talitos_init_common(struct talitos_ctx *ctx,
3038                                struct talitos_crypto_alg *talitos_alg)
3039 {
3040         struct talitos_private *priv;
3041
3042         /* update context with ptr to dev */
3043         ctx->dev = talitos_alg->dev;
3044
3045         /* assign SEC channel to tfm in round-robin fashion */
3046         priv = dev_get_drvdata(ctx->dev);
3047         ctx->ch = atomic_inc_return(&priv->last_chan) &
3048                   (priv->num_channels - 1);
3049
3050         /* copy descriptor header template value */
3051         ctx->desc_hdr_template = talitos_alg->algt.desc_hdr_template;
3052
3053         /* select done notification */
3054         ctx->desc_hdr_template |= DESC_HDR_DONE_NOTIFY;
3055
3056         return 0;
3057 }
3058
3059 static int talitos_cra_init(struct crypto_tfm *tfm)
3060 {
3061         struct crypto_alg *alg = tfm->__crt_alg;
3062         struct talitos_crypto_alg *talitos_alg;
3063         struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3064
3065         if ((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_AHASH)
3066                 talitos_alg = container_of(__crypto_ahash_alg(alg),
3067                                            struct talitos_crypto_alg,
3068                                            algt.alg.hash);
3069         else
3070                 talitos_alg = container_of(alg, struct talitos_crypto_alg,
3071                                            algt.alg.crypto);
3072
3073         return talitos_init_common(ctx, talitos_alg);
3074 }
3075
3076 static int talitos_cra_init_aead(struct crypto_aead *tfm)
3077 {
3078         struct aead_alg *alg = crypto_aead_alg(tfm);
3079         struct talitos_crypto_alg *talitos_alg;
3080         struct talitos_ctx *ctx = crypto_aead_ctx(tfm);
3081
3082         talitos_alg = container_of(alg, struct talitos_crypto_alg,
3083                                    algt.alg.aead);
3084
3085         return talitos_init_common(ctx, talitos_alg);
3086 }
3087
3088 static int talitos_cra_init_ahash(struct crypto_tfm *tfm)
3089 {
3090         struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3091
3092         talitos_cra_init(tfm);
3093
3094         ctx->keylen = 0;
3095         crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
3096                                  sizeof(struct talitos_ahash_req_ctx));
3097
3098         return 0;
3099 }
3100
3101 static void talitos_cra_exit(struct crypto_tfm *tfm)
3102 {
3103         struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3104         struct device *dev = ctx->dev;
3105
3106         if (ctx->keylen)
3107                 dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
3108 }
3109
3110 /*
3111  * given the alg's descriptor header template, determine whether descriptor
3112  * type and primary/secondary execution units required match the hw
3113  * capabilities description provided in the device tree node.
3114  */
3115 static int hw_supports(struct device *dev, __be32 desc_hdr_template)
3116 {
3117         struct talitos_private *priv = dev_get_drvdata(dev);
3118         int ret;
3119
3120         ret = (1 << DESC_TYPE(desc_hdr_template) & priv->desc_types) &&
3121               (1 << PRIMARY_EU(desc_hdr_template) & priv->exec_units);
3122
3123         if (SECONDARY_EU(desc_hdr_template))
3124                 ret = ret && (1 << SECONDARY_EU(desc_hdr_template)
3125                               & priv->exec_units);
3126
3127         return ret;
3128 }
3129
3130 static int talitos_remove(struct platform_device *ofdev)
3131 {
3132         struct device *dev = &ofdev->dev;
3133         struct talitos_private *priv = dev_get_drvdata(dev);
3134         struct talitos_crypto_alg *t_alg, *n;
3135         int i;
3136
3137         list_for_each_entry_safe(t_alg, n, &priv->alg_list, entry) {
3138                 switch (t_alg->algt.type) {
3139                 case CRYPTO_ALG_TYPE_ABLKCIPHER:
3140                         break;
3141                 case CRYPTO_ALG_TYPE_AEAD:
3142                         crypto_unregister_aead(&t_alg->algt.alg.aead);
3143                 case CRYPTO_ALG_TYPE_AHASH:
3144                         crypto_unregister_ahash(&t_alg->algt.alg.hash);
3145                         break;
3146                 }
3147                 list_del(&t_alg->entry);
3148         }
3149
3150         if (hw_supports(dev, DESC_HDR_SEL0_RNG))
3151                 talitos_unregister_rng(dev);
3152
3153         for (i = 0; i < 2; i++)
3154                 if (priv->irq[i]) {
3155                         free_irq(priv->irq[i], dev);
3156                         irq_dispose_mapping(priv->irq[i]);
3157                 }
3158
3159         tasklet_kill(&priv->done_task[0]);
3160         if (priv->irq[1])
3161                 tasklet_kill(&priv->done_task[1]);
3162
3163         return 0;
3164 }
3165
3166 static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev,
3167                                                     struct talitos_alg_template
3168                                                            *template)
3169 {
3170         struct talitos_private *priv = dev_get_drvdata(dev);
3171         struct talitos_crypto_alg *t_alg;
3172         struct crypto_alg *alg;
3173
3174         t_alg = devm_kzalloc(dev, sizeof(struct talitos_crypto_alg),
3175                              GFP_KERNEL);
3176         if (!t_alg)
3177                 return ERR_PTR(-ENOMEM);
3178
3179         t_alg->algt = *template;
3180
3181         switch (t_alg->algt.type) {
3182         case CRYPTO_ALG_TYPE_ABLKCIPHER:
3183                 alg = &t_alg->algt.alg.crypto;
3184                 alg->cra_init = talitos_cra_init;
3185                 alg->cra_exit = talitos_cra_exit;
3186                 alg->cra_type = &crypto_ablkcipher_type;
3187                 alg->cra_ablkcipher.setkey = alg->cra_ablkcipher.setkey ?:
3188                                              ablkcipher_setkey;
3189                 alg->cra_ablkcipher.encrypt = ablkcipher_encrypt;
3190                 alg->cra_ablkcipher.decrypt = ablkcipher_decrypt;
3191                 break;
3192         case CRYPTO_ALG_TYPE_AEAD:
3193                 alg = &t_alg->algt.alg.aead.base;
3194                 alg->cra_exit = talitos_cra_exit;
3195                 t_alg->algt.alg.aead.init = talitos_cra_init_aead;
3196                 t_alg->algt.alg.aead.setkey = t_alg->algt.alg.aead.setkey ?:
3197                                               aead_setkey;
3198                 t_alg->algt.alg.aead.encrypt = aead_encrypt;
3199                 t_alg->algt.alg.aead.decrypt = aead_decrypt;
3200                 if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) &&
3201                     !strncmp(alg->cra_name, "authenc(hmac(sha224)", 20)) {
3202                         devm_kfree(dev, t_alg);
3203                         return ERR_PTR(-ENOTSUPP);
3204                 }
3205                 break;
3206         case CRYPTO_ALG_TYPE_AHASH:
3207                 alg = &t_alg->algt.alg.hash.halg.base;
3208                 alg->cra_init = talitos_cra_init_ahash;
3209                 alg->cra_exit = talitos_cra_exit;
3210                 t_alg->algt.alg.hash.init = ahash_init;
3211                 t_alg->algt.alg.hash.update = ahash_update;
3212                 t_alg->algt.alg.hash.final = ahash_final;
3213                 t_alg->algt.alg.hash.finup = ahash_finup;
3214                 t_alg->algt.alg.hash.digest = ahash_digest;
3215                 if (!strncmp(alg->cra_name, "hmac", 4))
3216                         t_alg->algt.alg.hash.setkey = ahash_setkey;
3217                 t_alg->algt.alg.hash.import = ahash_import;
3218                 t_alg->algt.alg.hash.export = ahash_export;
3219
3220                 if (!(priv->features & TALITOS_FTR_HMAC_OK) &&
3221                     !strncmp(alg->cra_name, "hmac", 4)) {
3222                         devm_kfree(dev, t_alg);
3223                         return ERR_PTR(-ENOTSUPP);
3224                 }
3225                 if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) &&
3226                     (!strcmp(alg->cra_name, "sha224") ||
3227                      !strcmp(alg->cra_name, "hmac(sha224)"))) {
3228                         t_alg->algt.alg.hash.init = ahash_init_sha224_swinit;
3229                         t_alg->algt.desc_hdr_template =
3230                                         DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
3231                                         DESC_HDR_SEL0_MDEUA |
3232                                         DESC_HDR_MODE0_MDEU_SHA256;
3233                 }
3234                 break;
3235         default:
3236                 dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type);
3237                 devm_kfree(dev, t_alg);
3238                 return ERR_PTR(-EINVAL);
3239         }
3240
3241         alg->cra_module = THIS_MODULE;
3242         if (t_alg->algt.priority)
3243                 alg->cra_priority = t_alg->algt.priority;
3244         else
3245                 alg->cra_priority = TALITOS_CRA_PRIORITY;
3246         if (has_ftr_sec1(priv))
3247                 alg->cra_alignmask = 3;
3248         else
3249                 alg->cra_alignmask = 0;
3250         alg->cra_ctxsize = sizeof(struct talitos_ctx);
3251         alg->cra_flags |= CRYPTO_ALG_KERN_DRIVER_ONLY;
3252
3253         t_alg->dev = dev;
3254
3255         return t_alg;
3256 }
3257
3258 static int talitos_probe_irq(struct platform_device *ofdev)
3259 {
3260         struct device *dev = &ofdev->dev;
3261         struct device_node *np = ofdev->dev.of_node;
3262         struct talitos_private *priv = dev_get_drvdata(dev);
3263         int err;
3264         bool is_sec1 = has_ftr_sec1(priv);
3265
3266         priv->irq[0] = irq_of_parse_and_map(np, 0);
3267         if (!priv->irq[0]) {
3268                 dev_err(dev, "failed to map irq\n");
3269                 return -EINVAL;
3270         }
3271         if (is_sec1) {
3272                 err = request_irq(priv->irq[0], talitos1_interrupt_4ch, 0,
3273                                   dev_driver_string(dev), dev);
3274                 goto primary_out;
3275         }
3276
3277         priv->irq[1] = irq_of_parse_and_map(np, 1);
3278
3279         /* get the primary irq line */
3280         if (!priv->irq[1]) {
3281                 err = request_irq(priv->irq[0], talitos2_interrupt_4ch, 0,
3282                                   dev_driver_string(dev), dev);
3283                 goto primary_out;
3284         }
3285
3286         err = request_irq(priv->irq[0], talitos2_interrupt_ch0_2, 0,
3287                           dev_driver_string(dev), dev);
3288         if (err)
3289                 goto primary_out;
3290
3291         /* get the secondary irq line */
3292         err = request_irq(priv->irq[1], talitos2_interrupt_ch1_3, 0,
3293                           dev_driver_string(dev), dev);
3294         if (err) {
3295                 dev_err(dev, "failed to request secondary irq\n");
3296                 irq_dispose_mapping(priv->irq[1]);
3297                 priv->irq[1] = 0;
3298         }
3299
3300         return err;
3301
3302 primary_out:
3303         if (err) {
3304                 dev_err(dev, "failed to request primary irq\n");
3305                 irq_dispose_mapping(priv->irq[0]);
3306                 priv->irq[0] = 0;
3307         }
3308
3309         return err;
3310 }
3311
3312 static int talitos_probe(struct platform_device *ofdev)
3313 {
3314         struct device *dev = &ofdev->dev;
3315         struct device_node *np = ofdev->dev.of_node;
3316         struct talitos_private *priv;
3317         int i, err;
3318         int stride;
3319         struct resource *res;
3320
3321         priv = devm_kzalloc(dev, sizeof(struct talitos_private), GFP_KERNEL);
3322         if (!priv)
3323                 return -ENOMEM;
3324
3325         INIT_LIST_HEAD(&priv->alg_list);
3326
3327         dev_set_drvdata(dev, priv);
3328
3329         priv->ofdev = ofdev;
3330
3331         spin_lock_init(&priv->reg_lock);
3332
3333         res = platform_get_resource(ofdev, IORESOURCE_MEM, 0);
3334         if (!res)
3335                 return -ENXIO;
3336         priv->reg = devm_ioremap(dev, res->start, resource_size(res));
3337         if (!priv->reg) {
3338                 dev_err(dev, "failed to of_iomap\n");
3339                 err = -ENOMEM;
3340                 goto err_out;
3341         }
3342
3343         /* get SEC version capabilities from device tree */
3344         of_property_read_u32(np, "fsl,num-channels", &priv->num_channels);
3345         of_property_read_u32(np, "fsl,channel-fifo-len", &priv->chfifo_len);
3346         of_property_read_u32(np, "fsl,exec-units-mask", &priv->exec_units);
3347         of_property_read_u32(np, "fsl,descriptor-types-mask",
3348                              &priv->desc_types);
3349
3350         if (!is_power_of_2(priv->num_channels) || !priv->chfifo_len ||
3351             !priv->exec_units || !priv->desc_types) {
3352                 dev_err(dev, "invalid property data in device tree node\n");
3353                 err = -EINVAL;
3354                 goto err_out;
3355         }
3356
3357         if (of_device_is_compatible(np, "fsl,sec3.0"))
3358                 priv->features |= TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT;
3359
3360         if (of_device_is_compatible(np, "fsl,sec2.1"))
3361                 priv->features |= TALITOS_FTR_HW_AUTH_CHECK |
3362                                   TALITOS_FTR_SHA224_HWINIT |
3363                                   TALITOS_FTR_HMAC_OK;
3364
3365         if (of_device_is_compatible(np, "fsl,sec1.0"))
3366                 priv->features |= TALITOS_FTR_SEC1;
3367
3368         if (of_device_is_compatible(np, "fsl,sec1.2")) {
3369                 priv->reg_deu = priv->reg + TALITOS12_DEU;
3370                 priv->reg_aesu = priv->reg + TALITOS12_AESU;
3371                 priv->reg_mdeu = priv->reg + TALITOS12_MDEU;
3372                 stride = TALITOS1_CH_STRIDE;
3373         } else if (of_device_is_compatible(np, "fsl,sec1.0")) {
3374                 priv->reg_deu = priv->reg + TALITOS10_DEU;
3375                 priv->reg_aesu = priv->reg + TALITOS10_AESU;
3376                 priv->reg_mdeu = priv->reg + TALITOS10_MDEU;
3377                 priv->reg_afeu = priv->reg + TALITOS10_AFEU;
3378                 priv->reg_rngu = priv->reg + TALITOS10_RNGU;
3379                 priv->reg_pkeu = priv->reg + TALITOS10_PKEU;
3380                 stride = TALITOS1_CH_STRIDE;
3381         } else {
3382                 priv->reg_deu = priv->reg + TALITOS2_DEU;
3383                 priv->reg_aesu = priv->reg + TALITOS2_AESU;
3384                 priv->reg_mdeu = priv->reg + TALITOS2_MDEU;
3385                 priv->reg_afeu = priv->reg + TALITOS2_AFEU;
3386                 priv->reg_rngu = priv->reg + TALITOS2_RNGU;
3387                 priv->reg_pkeu = priv->reg + TALITOS2_PKEU;
3388                 priv->reg_keu = priv->reg + TALITOS2_KEU;
3389                 priv->reg_crcu = priv->reg + TALITOS2_CRCU;
3390                 stride = TALITOS2_CH_STRIDE;
3391         }
3392
3393         err = talitos_probe_irq(ofdev);
3394         if (err)
3395                 goto err_out;
3396
3397         if (has_ftr_sec1(priv)) {
3398                 if (priv->num_channels == 1)
3399                         tasklet_init(&priv->done_task[0], talitos1_done_ch0,
3400                                      (unsigned long)dev);
3401                 else
3402                         tasklet_init(&priv->done_task[0], talitos1_done_4ch,
3403                                      (unsigned long)dev);
3404         } else {
3405                 if (priv->irq[1]) {
3406                         tasklet_init(&priv->done_task[0], talitos2_done_ch0_2,
3407                                      (unsigned long)dev);
3408                         tasklet_init(&priv->done_task[1], talitos2_done_ch1_3,
3409                                      (unsigned long)dev);
3410                 } else if (priv->num_channels == 1) {
3411                         tasklet_init(&priv->done_task[0], talitos2_done_ch0,
3412                                      (unsigned long)dev);
3413                 } else {
3414                         tasklet_init(&priv->done_task[0], talitos2_done_4ch,
3415                                      (unsigned long)dev);
3416                 }
3417         }
3418
3419         priv->chan = devm_kcalloc(dev,
3420                                   priv->num_channels,
3421                                   sizeof(struct talitos_channel),
3422                                   GFP_KERNEL);
3423         if (!priv->chan) {
3424                 dev_err(dev, "failed to allocate channel management space\n");
3425                 err = -ENOMEM;
3426                 goto err_out;
3427         }
3428
3429         priv->fifo_len = roundup_pow_of_two(priv->chfifo_len);
3430
3431         for (i = 0; i < priv->num_channels; i++) {
3432                 priv->chan[i].reg = priv->reg + stride * (i + 1);
3433                 if (!priv->irq[1] || !(i & 1))
3434                         priv->chan[i].reg += TALITOS_CH_BASE_OFFSET;
3435
3436                 spin_lock_init(&priv->chan[i].head_lock);
3437                 spin_lock_init(&priv->chan[i].tail_lock);
3438
3439                 priv->chan[i].fifo = devm_kcalloc(dev,
3440                                                 priv->fifo_len,
3441                                                 sizeof(struct talitos_request),
3442                                                 GFP_KERNEL);
3443                 if (!priv->chan[i].fifo) {
3444                         dev_err(dev, "failed to allocate request fifo %d\n", i);
3445                         err = -ENOMEM;
3446                         goto err_out;
3447                 }
3448
3449                 atomic_set(&priv->chan[i].submit_count,
3450                            -(priv->chfifo_len - 1));
3451         }
3452
3453         dma_set_mask(dev, DMA_BIT_MASK(36));
3454
3455         /* reset and initialize the h/w */
3456         err = init_device(dev);
3457         if (err) {
3458                 dev_err(dev, "failed to initialize device\n");
3459                 goto err_out;
3460         }
3461
3462         /* register the RNG, if available */
3463         if (hw_supports(dev, DESC_HDR_SEL0_RNG)) {
3464                 err = talitos_register_rng(dev);
3465                 if (err) {
3466                         dev_err(dev, "failed to register hwrng: %d\n", err);
3467                         goto err_out;
3468                 } else
3469                         dev_info(dev, "hwrng\n");
3470         }
3471
3472         /* register crypto algorithms the device supports */
3473         for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
3474                 if (hw_supports(dev, driver_algs[i].desc_hdr_template)) {
3475                         struct talitos_crypto_alg *t_alg;
3476                         struct crypto_alg *alg = NULL;
3477
3478                         t_alg = talitos_alg_alloc(dev, &driver_algs[i]);
3479                         if (IS_ERR(t_alg)) {
3480                                 err = PTR_ERR(t_alg);
3481                                 if (err == -ENOTSUPP)
3482                                         continue;
3483                                 goto err_out;
3484                         }
3485
3486                         switch (t_alg->algt.type) {
3487                         case CRYPTO_ALG_TYPE_ABLKCIPHER:
3488                                 err = crypto_register_alg(
3489                                                 &t_alg->algt.alg.crypto);
3490                                 alg = &t_alg->algt.alg.crypto;
3491                                 break;
3492
3493                         case CRYPTO_ALG_TYPE_AEAD:
3494                                 err = crypto_register_aead(
3495                                         &t_alg->algt.alg.aead);
3496                                 alg = &t_alg->algt.alg.aead.base;
3497                                 break;
3498
3499                         case CRYPTO_ALG_TYPE_AHASH:
3500                                 err = crypto_register_ahash(
3501                                                 &t_alg->algt.alg.hash);
3502                                 alg = &t_alg->algt.alg.hash.halg.base;
3503                                 break;
3504                         }
3505                         if (err) {
3506                                 dev_err(dev, "%s alg registration failed\n",
3507                                         alg->cra_driver_name);
3508                                 devm_kfree(dev, t_alg);
3509                         } else
3510                                 list_add_tail(&t_alg->entry, &priv->alg_list);
3511                 }
3512         }
3513         if (!list_empty(&priv->alg_list))
3514                 dev_info(dev, "%s algorithms registered in /proc/crypto\n",
3515                          (char *)of_get_property(np, "compatible", NULL));
3516
3517         return 0;
3518
3519 err_out:
3520         talitos_remove(ofdev);
3521
3522         return err;
3523 }
3524
3525 static const struct of_device_id talitos_match[] = {
3526 #ifdef CONFIG_CRYPTO_DEV_TALITOS1
3527         {
3528                 .compatible = "fsl,sec1.0",
3529         },
3530 #endif
3531 #ifdef CONFIG_CRYPTO_DEV_TALITOS2
3532         {
3533                 .compatible = "fsl,sec2.0",
3534         },
3535 #endif
3536         {},
3537 };
3538 MODULE_DEVICE_TABLE(of, talitos_match);
3539
3540 static struct platform_driver talitos_driver = {
3541         .driver = {
3542                 .name = "talitos",
3543                 .of_match_table = talitos_match,
3544         },
3545         .probe = talitos_probe,
3546         .remove = talitos_remove,
3547 };
3548
3549 module_platform_driver(talitos_driver);
3550
3551 MODULE_LICENSE("GPL");
3552 MODULE_AUTHOR("Kim Phillips <kim.phillips@freescale.com>");
3553 MODULE_DESCRIPTION("Freescale integrated security engine (SEC) driver");