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