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