xref: /openbmc/linux/drivers/crypto/talitos.c (revision 680ef72a)
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 (sg_count == 1) {
1142 		to_talitos_ptr(ptr, sg_dma_address(src) + offset, len, is_sec1);
1143 		return sg_count;
1144 	}
1145 	if (is_sec1) {
1146 		to_talitos_ptr(ptr, edesc->dma_link_tbl + offset, len, is_sec1);
1147 		return sg_count;
1148 	}
1149 	sg_count = sg_to_link_tbl_offset(src, sg_count, offset, len,
1150 					 &edesc->link_tbl[tbl_off]);
1151 	if (sg_count == 1) {
1152 		/* Only one segment now, so no link tbl needed*/
1153 		copy_talitos_ptr(ptr, &edesc->link_tbl[tbl_off], is_sec1);
1154 		return sg_count;
1155 	}
1156 	to_talitos_ptr(ptr, edesc->dma_link_tbl +
1157 			    tbl_off * sizeof(struct talitos_ptr), len, is_sec1);
1158 	to_talitos_ptr_ext_or(ptr, DESC_PTR_LNKTBL_JUMP, is_sec1);
1159 
1160 	return sg_count;
1161 }
1162 
1163 /*
1164  * fill in and submit ipsec_esp descriptor
1165  */
1166 static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1167 		     void (*callback)(struct device *dev,
1168 				      struct talitos_desc *desc,
1169 				      void *context, int error))
1170 {
1171 	struct crypto_aead *aead = crypto_aead_reqtfm(areq);
1172 	unsigned int authsize = crypto_aead_authsize(aead);
1173 	struct talitos_ctx *ctx = crypto_aead_ctx(aead);
1174 	struct device *dev = ctx->dev;
1175 	struct talitos_desc *desc = &edesc->desc;
1176 	unsigned int cryptlen = areq->cryptlen;
1177 	unsigned int ivsize = crypto_aead_ivsize(aead);
1178 	int tbl_off = 0;
1179 	int sg_count, ret;
1180 	int sg_link_tbl_len;
1181 	bool sync_needed = false;
1182 	struct talitos_private *priv = dev_get_drvdata(dev);
1183 	bool is_sec1 = has_ftr_sec1(priv);
1184 	bool is_ipsec_esp = desc->hdr & DESC_HDR_TYPE_IPSEC_ESP;
1185 	struct talitos_ptr *civ_ptr = &desc->ptr[is_ipsec_esp ? 2 : 3];
1186 	struct talitos_ptr *ckey_ptr = &desc->ptr[is_ipsec_esp ? 3 : 2];
1187 
1188 	/* hmac key */
1189 	to_talitos_ptr(&desc->ptr[0], ctx->dma_key, ctx->authkeylen, is_sec1);
1190 
1191 	sg_count = edesc->src_nents ?: 1;
1192 	if (is_sec1 && sg_count > 1)
1193 		sg_copy_to_buffer(areq->src, sg_count, edesc->buf,
1194 				  areq->assoclen + cryptlen);
1195 	else
1196 		sg_count = dma_map_sg(dev, areq->src, sg_count,
1197 				      (areq->src == areq->dst) ?
1198 				      DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
1199 
1200 	/* hmac data */
1201 	ret = talitos_sg_map(dev, areq->src, areq->assoclen, edesc,
1202 			     &desc->ptr[1], sg_count, 0, tbl_off);
1203 
1204 	if (ret > 1) {
1205 		tbl_off += ret;
1206 		sync_needed = true;
1207 	}
1208 
1209 	/* cipher iv */
1210 	to_talitos_ptr(civ_ptr, edesc->iv_dma, ivsize, is_sec1);
1211 
1212 	/* cipher key */
1213 	to_talitos_ptr(ckey_ptr, ctx->dma_key  + ctx->authkeylen,
1214 		       ctx->enckeylen, is_sec1);
1215 
1216 	/*
1217 	 * cipher in
1218 	 * map and adjust cipher len to aead request cryptlen.
1219 	 * extent is bytes of HMAC postpended to ciphertext,
1220 	 * typically 12 for ipsec
1221 	 */
1222 	sg_link_tbl_len = cryptlen;
1223 
1224 	if (is_ipsec_esp) {
1225 		to_talitos_ptr_ext_set(&desc->ptr[4], authsize, is_sec1);
1226 
1227 		if (desc->hdr & DESC_HDR_MODE1_MDEU_CICV)
1228 			sg_link_tbl_len += authsize;
1229 	}
1230 
1231 	ret = talitos_sg_map(dev, areq->src, sg_link_tbl_len, edesc,
1232 			     &desc->ptr[4], sg_count, areq->assoclen, tbl_off);
1233 
1234 	if (ret > 1) {
1235 		tbl_off += ret;
1236 		sync_needed = true;
1237 	}
1238 
1239 	/* cipher out */
1240 	if (areq->src != areq->dst) {
1241 		sg_count = edesc->dst_nents ? : 1;
1242 		if (!is_sec1 || sg_count == 1)
1243 			dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE);
1244 	}
1245 
1246 	ret = talitos_sg_map(dev, areq->dst, cryptlen, edesc, &desc->ptr[5],
1247 			     sg_count, areq->assoclen, tbl_off);
1248 
1249 	if (is_ipsec_esp)
1250 		to_talitos_ptr_ext_or(&desc->ptr[5], authsize, is_sec1);
1251 
1252 	/* ICV data */
1253 	if (ret > 1) {
1254 		tbl_off += ret;
1255 		edesc->icv_ool = true;
1256 		sync_needed = true;
1257 
1258 		if (is_ipsec_esp) {
1259 			struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off];
1260 			int offset = (edesc->src_nents + edesc->dst_nents + 2) *
1261 				     sizeof(struct talitos_ptr) + authsize;
1262 
1263 			/* Add an entry to the link table for ICV data */
1264 			to_talitos_ptr_ext_set(tbl_ptr - 1, 0, is_sec1);
1265 			to_talitos_ptr_ext_set(tbl_ptr, DESC_PTR_LNKTBL_RETURN,
1266 					       is_sec1);
1267 
1268 			/* icv data follows link tables */
1269 			to_talitos_ptr(tbl_ptr, edesc->dma_link_tbl + offset,
1270 				       authsize, is_sec1);
1271 		} else {
1272 			dma_addr_t addr = edesc->dma_link_tbl;
1273 
1274 			if (is_sec1)
1275 				addr += areq->assoclen + cryptlen;
1276 			else
1277 				addr += sizeof(struct talitos_ptr) * tbl_off;
1278 
1279 			to_talitos_ptr(&desc->ptr[6], addr, authsize, is_sec1);
1280 		}
1281 	} else if (!is_ipsec_esp) {
1282 		ret = talitos_sg_map(dev, areq->dst, authsize, edesc,
1283 				     &desc->ptr[6], sg_count, areq->assoclen +
1284 							      cryptlen,
1285 				     tbl_off);
1286 		if (ret > 1) {
1287 			tbl_off += ret;
1288 			edesc->icv_ool = true;
1289 			sync_needed = true;
1290 		} else {
1291 			edesc->icv_ool = false;
1292 		}
1293 	} else {
1294 		edesc->icv_ool = false;
1295 	}
1296 
1297 	/* iv out */
1298 	if (is_ipsec_esp)
1299 		map_single_talitos_ptr(dev, &desc->ptr[6], ivsize, ctx->iv,
1300 				       DMA_FROM_DEVICE);
1301 
1302 	if (sync_needed)
1303 		dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1304 					   edesc->dma_len,
1305 					   DMA_BIDIRECTIONAL);
1306 
1307 	ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1308 	if (ret != -EINPROGRESS) {
1309 		ipsec_esp_unmap(dev, edesc, areq);
1310 		kfree(edesc);
1311 	}
1312 	return ret;
1313 }
1314 
1315 /*
1316  * allocate and map the extended descriptor
1317  */
1318 static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,
1319 						 struct scatterlist *src,
1320 						 struct scatterlist *dst,
1321 						 u8 *iv,
1322 						 unsigned int assoclen,
1323 						 unsigned int cryptlen,
1324 						 unsigned int authsize,
1325 						 unsigned int ivsize,
1326 						 int icv_stashing,
1327 						 u32 cryptoflags,
1328 						 bool encrypt)
1329 {
1330 	struct talitos_edesc *edesc;
1331 	int src_nents, dst_nents, alloc_len, dma_len, src_len, dst_len;
1332 	dma_addr_t iv_dma = 0;
1333 	gfp_t flags = cryptoflags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL :
1334 		      GFP_ATOMIC;
1335 	struct talitos_private *priv = dev_get_drvdata(dev);
1336 	bool is_sec1 = has_ftr_sec1(priv);
1337 	int max_len = is_sec1 ? TALITOS1_MAX_DATA_LEN : TALITOS2_MAX_DATA_LEN;
1338 	void *err;
1339 
1340 	if (cryptlen + authsize > max_len) {
1341 		dev_err(dev, "length exceeds h/w max limit\n");
1342 		return ERR_PTR(-EINVAL);
1343 	}
1344 
1345 	if (ivsize)
1346 		iv_dma = dma_map_single(dev, iv, ivsize, DMA_TO_DEVICE);
1347 
1348 	if (!dst || dst == src) {
1349 		src_len = assoclen + cryptlen + authsize;
1350 		src_nents = sg_nents_for_len(src, src_len);
1351 		if (src_nents < 0) {
1352 			dev_err(dev, "Invalid number of src SG.\n");
1353 			err = ERR_PTR(-EINVAL);
1354 			goto error_sg;
1355 		}
1356 		src_nents = (src_nents == 1) ? 0 : src_nents;
1357 		dst_nents = dst ? src_nents : 0;
1358 		dst_len = 0;
1359 	} else { /* dst && dst != src*/
1360 		src_len = assoclen + cryptlen + (encrypt ? 0 : authsize);
1361 		src_nents = sg_nents_for_len(src, src_len);
1362 		if (src_nents < 0) {
1363 			dev_err(dev, "Invalid number of src SG.\n");
1364 			err = ERR_PTR(-EINVAL);
1365 			goto error_sg;
1366 		}
1367 		src_nents = (src_nents == 1) ? 0 : src_nents;
1368 		dst_len = assoclen + cryptlen + (encrypt ? authsize : 0);
1369 		dst_nents = sg_nents_for_len(dst, dst_len);
1370 		if (dst_nents < 0) {
1371 			dev_err(dev, "Invalid number of dst SG.\n");
1372 			err = ERR_PTR(-EINVAL);
1373 			goto error_sg;
1374 		}
1375 		dst_nents = (dst_nents == 1) ? 0 : dst_nents;
1376 	}
1377 
1378 	/*
1379 	 * allocate space for base edesc plus the link tables,
1380 	 * allowing for two separate entries for AD and generated ICV (+ 2),
1381 	 * and space for two sets of ICVs (stashed and generated)
1382 	 */
1383 	alloc_len = sizeof(struct talitos_edesc);
1384 	if (src_nents || dst_nents) {
1385 		if (is_sec1)
1386 			dma_len = (src_nents ? src_len : 0) +
1387 				  (dst_nents ? dst_len : 0);
1388 		else
1389 			dma_len = (src_nents + dst_nents + 2) *
1390 				  sizeof(struct talitos_ptr) + authsize * 2;
1391 		alloc_len += dma_len;
1392 	} else {
1393 		dma_len = 0;
1394 		alloc_len += icv_stashing ? authsize : 0;
1395 	}
1396 
1397 	/* if its a ahash, add space for a second desc next to the first one */
1398 	if (is_sec1 && !dst)
1399 		alloc_len += sizeof(struct talitos_desc);
1400 
1401 	edesc = kmalloc(alloc_len, GFP_DMA | flags);
1402 	if (!edesc) {
1403 		dev_err(dev, "could not allocate edescriptor\n");
1404 		err = ERR_PTR(-ENOMEM);
1405 		goto error_sg;
1406 	}
1407 	memset(&edesc->desc, 0, sizeof(edesc->desc));
1408 
1409 	edesc->src_nents = src_nents;
1410 	edesc->dst_nents = dst_nents;
1411 	edesc->iv_dma = iv_dma;
1412 	edesc->dma_len = dma_len;
1413 	if (dma_len) {
1414 		void *addr = &edesc->link_tbl[0];
1415 
1416 		if (is_sec1 && !dst)
1417 			addr += sizeof(struct talitos_desc);
1418 		edesc->dma_link_tbl = dma_map_single(dev, addr,
1419 						     edesc->dma_len,
1420 						     DMA_BIDIRECTIONAL);
1421 	}
1422 	return edesc;
1423 error_sg:
1424 	if (iv_dma)
1425 		dma_unmap_single(dev, iv_dma, ivsize, DMA_TO_DEVICE);
1426 	return err;
1427 }
1428 
1429 static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq, u8 *iv,
1430 					      int icv_stashing, bool encrypt)
1431 {
1432 	struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
1433 	unsigned int authsize = crypto_aead_authsize(authenc);
1434 	struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1435 	unsigned int ivsize = crypto_aead_ivsize(authenc);
1436 
1437 	return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst,
1438 				   iv, areq->assoclen, areq->cryptlen,
1439 				   authsize, ivsize, icv_stashing,
1440 				   areq->base.flags, encrypt);
1441 }
1442 
1443 static int aead_encrypt(struct aead_request *req)
1444 {
1445 	struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1446 	struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1447 	struct talitos_edesc *edesc;
1448 
1449 	/* allocate extended descriptor */
1450 	edesc = aead_edesc_alloc(req, req->iv, 0, true);
1451 	if (IS_ERR(edesc))
1452 		return PTR_ERR(edesc);
1453 
1454 	/* set encrypt */
1455 	edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT;
1456 
1457 	return ipsec_esp(edesc, req, ipsec_esp_encrypt_done);
1458 }
1459 
1460 static int aead_decrypt(struct aead_request *req)
1461 {
1462 	struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1463 	unsigned int authsize = crypto_aead_authsize(authenc);
1464 	struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1465 	struct talitos_private *priv = dev_get_drvdata(ctx->dev);
1466 	struct talitos_edesc *edesc;
1467 	struct scatterlist *sg;
1468 	void *icvdata;
1469 
1470 	req->cryptlen -= authsize;
1471 
1472 	/* allocate extended descriptor */
1473 	edesc = aead_edesc_alloc(req, req->iv, 1, false);
1474 	if (IS_ERR(edesc))
1475 		return PTR_ERR(edesc);
1476 
1477 	if ((priv->features & TALITOS_FTR_HW_AUTH_CHECK) &&
1478 	    ((!edesc->src_nents && !edesc->dst_nents) ||
1479 	     priv->features & TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT)) {
1480 
1481 		/* decrypt and check the ICV */
1482 		edesc->desc.hdr = ctx->desc_hdr_template |
1483 				  DESC_HDR_DIR_INBOUND |
1484 				  DESC_HDR_MODE1_MDEU_CICV;
1485 
1486 		/* reset integrity check result bits */
1487 
1488 		return ipsec_esp(edesc, req, ipsec_esp_decrypt_hwauth_done);
1489 	}
1490 
1491 	/* Have to check the ICV with software */
1492 	edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND;
1493 
1494 	/* stash incoming ICV for later cmp with ICV generated by the h/w */
1495 	if (edesc->dma_len)
1496 		icvdata = (char *)&edesc->link_tbl[edesc->src_nents +
1497 						   edesc->dst_nents + 2];
1498 	else
1499 		icvdata = &edesc->link_tbl[0];
1500 
1501 	sg = sg_last(req->src, edesc->src_nents ? : 1);
1502 
1503 	memcpy(icvdata, (char *)sg_virt(sg) + sg->length - authsize, authsize);
1504 
1505 	return ipsec_esp(edesc, req, ipsec_esp_decrypt_swauth_done);
1506 }
1507 
1508 static int ablkcipher_setkey(struct crypto_ablkcipher *cipher,
1509 			     const u8 *key, unsigned int keylen)
1510 {
1511 	struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1512 	struct device *dev = ctx->dev;
1513 	u32 tmp[DES_EXPKEY_WORDS];
1514 
1515 	if (keylen > TALITOS_MAX_KEY_SIZE) {
1516 		crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_BAD_KEY_LEN);
1517 		return -EINVAL;
1518 	}
1519 
1520 	if (unlikely(crypto_ablkcipher_get_flags(cipher) &
1521 		     CRYPTO_TFM_REQ_WEAK_KEY) &&
1522 	    !des_ekey(tmp, key)) {
1523 		crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_WEAK_KEY);
1524 		return -EINVAL;
1525 	}
1526 
1527 	if (ctx->keylen)
1528 		dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
1529 
1530 	memcpy(&ctx->key, key, keylen);
1531 	ctx->keylen = keylen;
1532 
1533 	ctx->dma_key = dma_map_single(dev, ctx->key, keylen, DMA_TO_DEVICE);
1534 
1535 	return 0;
1536 }
1537 
1538 static void common_nonsnoop_unmap(struct device *dev,
1539 				  struct talitos_edesc *edesc,
1540 				  struct ablkcipher_request *areq)
1541 {
1542 	unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE);
1543 
1544 	talitos_sg_unmap(dev, edesc, areq->src, areq->dst, areq->nbytes, 0);
1545 	unmap_single_talitos_ptr(dev, &edesc->desc.ptr[1], DMA_TO_DEVICE);
1546 
1547 	if (edesc->dma_len)
1548 		dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1549 				 DMA_BIDIRECTIONAL);
1550 }
1551 
1552 static void ablkcipher_done(struct device *dev,
1553 			    struct talitos_desc *desc, void *context,
1554 			    int err)
1555 {
1556 	struct ablkcipher_request *areq = context;
1557 	struct talitos_edesc *edesc;
1558 
1559 	edesc = container_of(desc, struct talitos_edesc, desc);
1560 
1561 	common_nonsnoop_unmap(dev, edesc, areq);
1562 
1563 	kfree(edesc);
1564 
1565 	areq->base.complete(&areq->base, err);
1566 }
1567 
1568 static int common_nonsnoop(struct talitos_edesc *edesc,
1569 			   struct ablkcipher_request *areq,
1570 			   void (*callback) (struct device *dev,
1571 					     struct talitos_desc *desc,
1572 					     void *context, int error))
1573 {
1574 	struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1575 	struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1576 	struct device *dev = ctx->dev;
1577 	struct talitos_desc *desc = &edesc->desc;
1578 	unsigned int cryptlen = areq->nbytes;
1579 	unsigned int ivsize = crypto_ablkcipher_ivsize(cipher);
1580 	int sg_count, ret;
1581 	bool sync_needed = false;
1582 	struct talitos_private *priv = dev_get_drvdata(dev);
1583 	bool is_sec1 = has_ftr_sec1(priv);
1584 
1585 	/* first DWORD empty */
1586 
1587 	/* cipher iv */
1588 	to_talitos_ptr(&desc->ptr[1], edesc->iv_dma, ivsize, is_sec1);
1589 
1590 	/* cipher key */
1591 	to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen, is_sec1);
1592 
1593 	sg_count = edesc->src_nents ?: 1;
1594 	if (is_sec1 && sg_count > 1)
1595 		sg_copy_to_buffer(areq->src, sg_count, edesc->buf,
1596 				  cryptlen);
1597 	else
1598 		sg_count = dma_map_sg(dev, areq->src, sg_count,
1599 				      (areq->src == areq->dst) ?
1600 				      DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
1601 	/*
1602 	 * cipher in
1603 	 */
1604 	sg_count = talitos_sg_map(dev, areq->src, cryptlen, edesc,
1605 				  &desc->ptr[3], sg_count, 0, 0);
1606 	if (sg_count > 1)
1607 		sync_needed = true;
1608 
1609 	/* cipher out */
1610 	if (areq->src != areq->dst) {
1611 		sg_count = edesc->dst_nents ? : 1;
1612 		if (!is_sec1 || sg_count == 1)
1613 			dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE);
1614 	}
1615 
1616 	ret = talitos_sg_map(dev, areq->dst, cryptlen, edesc, &desc->ptr[4],
1617 			     sg_count, 0, (edesc->src_nents + 1));
1618 	if (ret > 1)
1619 		sync_needed = true;
1620 
1621 	/* iv out */
1622 	map_single_talitos_ptr(dev, &desc->ptr[5], ivsize, ctx->iv,
1623 			       DMA_FROM_DEVICE);
1624 
1625 	/* last DWORD empty */
1626 
1627 	if (sync_needed)
1628 		dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1629 					   edesc->dma_len, DMA_BIDIRECTIONAL);
1630 
1631 	ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1632 	if (ret != -EINPROGRESS) {
1633 		common_nonsnoop_unmap(dev, edesc, areq);
1634 		kfree(edesc);
1635 	}
1636 	return ret;
1637 }
1638 
1639 static struct talitos_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request *
1640 						    areq, bool encrypt)
1641 {
1642 	struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1643 	struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1644 	unsigned int ivsize = crypto_ablkcipher_ivsize(cipher);
1645 
1646 	return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst,
1647 				   areq->info, 0, areq->nbytes, 0, ivsize, 0,
1648 				   areq->base.flags, encrypt);
1649 }
1650 
1651 static int ablkcipher_encrypt(struct ablkcipher_request *areq)
1652 {
1653 	struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1654 	struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1655 	struct talitos_edesc *edesc;
1656 
1657 	/* allocate extended descriptor */
1658 	edesc = ablkcipher_edesc_alloc(areq, true);
1659 	if (IS_ERR(edesc))
1660 		return PTR_ERR(edesc);
1661 
1662 	/* set encrypt */
1663 	edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT;
1664 
1665 	return common_nonsnoop(edesc, areq, ablkcipher_done);
1666 }
1667 
1668 static int ablkcipher_decrypt(struct ablkcipher_request *areq)
1669 {
1670 	struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1671 	struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1672 	struct talitos_edesc *edesc;
1673 
1674 	/* allocate extended descriptor */
1675 	edesc = ablkcipher_edesc_alloc(areq, false);
1676 	if (IS_ERR(edesc))
1677 		return PTR_ERR(edesc);
1678 
1679 	edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND;
1680 
1681 	return common_nonsnoop(edesc, areq, ablkcipher_done);
1682 }
1683 
1684 static void common_nonsnoop_hash_unmap(struct device *dev,
1685 				       struct talitos_edesc *edesc,
1686 				       struct ahash_request *areq)
1687 {
1688 	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1689 
1690 	talitos_sg_unmap(dev, edesc, req_ctx->psrc, NULL, 0, 0);
1691 
1692 	if (edesc->dma_len)
1693 		dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1694 				 DMA_BIDIRECTIONAL);
1695 
1696 	if (edesc->desc.next_desc)
1697 		dma_unmap_single(dev, be32_to_cpu(edesc->desc.next_desc),
1698 				 TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL);
1699 }
1700 
1701 static void ahash_done(struct device *dev,
1702 		       struct talitos_desc *desc, void *context,
1703 		       int err)
1704 {
1705 	struct ahash_request *areq = context;
1706 	struct talitos_edesc *edesc =
1707 		 container_of(desc, struct talitos_edesc, desc);
1708 	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1709 
1710 	if (!req_ctx->last && req_ctx->to_hash_later) {
1711 		/* Position any partial block for next update/final/finup */
1712 		req_ctx->buf_idx = (req_ctx->buf_idx + 1) & 1;
1713 		req_ctx->nbuf = req_ctx->to_hash_later;
1714 	}
1715 	common_nonsnoop_hash_unmap(dev, edesc, areq);
1716 
1717 	kfree(edesc);
1718 
1719 	areq->base.complete(&areq->base, err);
1720 }
1721 
1722 /*
1723  * SEC1 doesn't like hashing of 0 sized message, so we do the padding
1724  * ourself and submit a padded block
1725  */
1726 static void talitos_handle_buggy_hash(struct talitos_ctx *ctx,
1727 			       struct talitos_edesc *edesc,
1728 			       struct talitos_ptr *ptr)
1729 {
1730 	static u8 padded_hash[64] = {
1731 		0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1732 		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1733 		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1734 		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1735 	};
1736 
1737 	pr_err_once("Bug in SEC1, padding ourself\n");
1738 	edesc->desc.hdr &= ~DESC_HDR_MODE0_MDEU_PAD;
1739 	map_single_talitos_ptr(ctx->dev, ptr, sizeof(padded_hash),
1740 			       (char *)padded_hash, DMA_TO_DEVICE);
1741 }
1742 
1743 static int common_nonsnoop_hash(struct talitos_edesc *edesc,
1744 				struct ahash_request *areq, unsigned int length,
1745 				unsigned int offset,
1746 				void (*callback) (struct device *dev,
1747 						  struct talitos_desc *desc,
1748 						  void *context, int error))
1749 {
1750 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1751 	struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1752 	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1753 	struct device *dev = ctx->dev;
1754 	struct talitos_desc *desc = &edesc->desc;
1755 	int ret;
1756 	bool sync_needed = false;
1757 	struct talitos_private *priv = dev_get_drvdata(dev);
1758 	bool is_sec1 = has_ftr_sec1(priv);
1759 	int sg_count;
1760 
1761 	/* first DWORD empty */
1762 
1763 	/* hash context in */
1764 	if (!req_ctx->first || req_ctx->swinit) {
1765 		to_talitos_ptr(&desc->ptr[1], ctx->dma_hw_context,
1766 			       req_ctx->hw_context_size, is_sec1);
1767 		req_ctx->swinit = 0;
1768 	}
1769 	/* Indicate next op is not the first. */
1770 	req_ctx->first = 0;
1771 
1772 	/* HMAC key */
1773 	if (ctx->keylen)
1774 		to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen,
1775 			       is_sec1);
1776 
1777 	if (is_sec1 && req_ctx->nbuf)
1778 		length -= req_ctx->nbuf;
1779 
1780 	sg_count = edesc->src_nents ?: 1;
1781 	if (is_sec1 && sg_count > 1)
1782 		sg_pcopy_to_buffer(req_ctx->psrc, sg_count,
1783 				   edesc->buf + sizeof(struct talitos_desc),
1784 				   length, req_ctx->nbuf);
1785 	else if (length)
1786 		sg_count = dma_map_sg(dev, req_ctx->psrc, sg_count,
1787 				      DMA_TO_DEVICE);
1788 	/*
1789 	 * data in
1790 	 */
1791 	if (is_sec1 && req_ctx->nbuf) {
1792 		dma_addr_t dma_buf = ctx->dma_buf + req_ctx->buf_idx *
1793 						    HASH_MAX_BLOCK_SIZE;
1794 
1795 		to_talitos_ptr(&desc->ptr[3], dma_buf, req_ctx->nbuf, is_sec1);
1796 	} else {
1797 		sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc,
1798 					  &desc->ptr[3], sg_count, offset, 0);
1799 		if (sg_count > 1)
1800 			sync_needed = true;
1801 	}
1802 
1803 	/* fifth DWORD empty */
1804 
1805 	/* hash/HMAC out -or- hash context out */
1806 	if (req_ctx->last)
1807 		map_single_talitos_ptr(dev, &desc->ptr[5],
1808 				       crypto_ahash_digestsize(tfm),
1809 				       areq->result, DMA_FROM_DEVICE);
1810 	else
1811 		to_talitos_ptr(&desc->ptr[5], ctx->dma_hw_context,
1812 			       req_ctx->hw_context_size, is_sec1);
1813 
1814 	/* last DWORD empty */
1815 
1816 	if (is_sec1 && from_talitos_ptr_len(&desc->ptr[3], true) == 0)
1817 		talitos_handle_buggy_hash(ctx, edesc, &desc->ptr[3]);
1818 
1819 	if (is_sec1 && req_ctx->nbuf && length) {
1820 		struct talitos_desc *desc2 = desc + 1;
1821 		dma_addr_t next_desc;
1822 
1823 		memset(desc2, 0, sizeof(*desc2));
1824 		desc2->hdr = desc->hdr;
1825 		desc2->hdr &= ~DESC_HDR_MODE0_MDEU_INIT;
1826 		desc2->hdr1 = desc2->hdr;
1827 		desc->hdr &= ~DESC_HDR_MODE0_MDEU_PAD;
1828 		desc->hdr |= DESC_HDR_MODE0_MDEU_CONT;
1829 		desc->hdr &= ~DESC_HDR_DONE_NOTIFY;
1830 
1831 		to_talitos_ptr(&desc2->ptr[1], ctx->dma_hw_context,
1832 			       req_ctx->hw_context_size, is_sec1);
1833 
1834 		copy_talitos_ptr(&desc2->ptr[2], &desc->ptr[2], is_sec1);
1835 		sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc,
1836 					  &desc2->ptr[3], sg_count, offset, 0);
1837 		if (sg_count > 1)
1838 			sync_needed = true;
1839 		copy_talitos_ptr(&desc2->ptr[5], &desc->ptr[5], is_sec1);
1840 		if (req_ctx->last)
1841 			to_talitos_ptr(&desc->ptr[5], ctx->dma_hw_context,
1842 				       req_ctx->hw_context_size, is_sec1);
1843 
1844 		next_desc = dma_map_single(dev, &desc2->hdr1, TALITOS_DESC_SIZE,
1845 					   DMA_BIDIRECTIONAL);
1846 		desc->next_desc = cpu_to_be32(next_desc);
1847 	}
1848 
1849 	if (sync_needed)
1850 		dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1851 					   edesc->dma_len, DMA_BIDIRECTIONAL);
1852 
1853 	ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1854 	if (ret != -EINPROGRESS) {
1855 		common_nonsnoop_hash_unmap(dev, edesc, areq);
1856 		kfree(edesc);
1857 	}
1858 	return ret;
1859 }
1860 
1861 static struct talitos_edesc *ahash_edesc_alloc(struct ahash_request *areq,
1862 					       unsigned int nbytes)
1863 {
1864 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1865 	struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1866 	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1867 	struct talitos_private *priv = dev_get_drvdata(ctx->dev);
1868 	bool is_sec1 = has_ftr_sec1(priv);
1869 
1870 	if (is_sec1)
1871 		nbytes -= req_ctx->nbuf;
1872 
1873 	return talitos_edesc_alloc(ctx->dev, req_ctx->psrc, NULL, NULL, 0,
1874 				   nbytes, 0, 0, 0, areq->base.flags, false);
1875 }
1876 
1877 static int ahash_init(struct ahash_request *areq)
1878 {
1879 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1880 	struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1881 	struct device *dev = ctx->dev;
1882 	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1883 	unsigned int size;
1884 	struct talitos_private *priv = dev_get_drvdata(dev);
1885 	bool is_sec1 = has_ftr_sec1(priv);
1886 
1887 	/* Initialize the context */
1888 	req_ctx->buf_idx = 0;
1889 	req_ctx->nbuf = 0;
1890 	req_ctx->first = 1; /* first indicates h/w must init its context */
1891 	req_ctx->swinit = 0; /* assume h/w init of context */
1892 	size =	(crypto_ahash_digestsize(tfm) <= SHA256_DIGEST_SIZE)
1893 			? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256
1894 			: TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512;
1895 	req_ctx->hw_context_size = size;
1896 
1897 	if (ctx->dma_hw_context)
1898 		dma_unmap_single(dev, ctx->dma_hw_context, size,
1899 				 DMA_BIDIRECTIONAL);
1900 	ctx->dma_hw_context = dma_map_single(dev, req_ctx->hw_context, size,
1901 					     DMA_BIDIRECTIONAL);
1902 	if (ctx->dma_buf)
1903 		dma_unmap_single(dev, ctx->dma_buf, sizeof(req_ctx->buf),
1904 				 DMA_TO_DEVICE);
1905 	if (is_sec1)
1906 		ctx->dma_buf = dma_map_single(dev, req_ctx->buf,
1907 					      sizeof(req_ctx->buf),
1908 					      DMA_TO_DEVICE);
1909 	return 0;
1910 }
1911 
1912 /*
1913  * on h/w without explicit sha224 support, we initialize h/w context
1914  * manually with sha224 constants, and tell it to run sha256.
1915  */
1916 static int ahash_init_sha224_swinit(struct ahash_request *areq)
1917 {
1918 	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1919 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1920 	struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1921 	struct device *dev = ctx->dev;
1922 
1923 	ahash_init(areq);
1924 	req_ctx->swinit = 1;/* prevent h/w initting context with sha256 values*/
1925 
1926 	req_ctx->hw_context[0] = SHA224_H0;
1927 	req_ctx->hw_context[1] = SHA224_H1;
1928 	req_ctx->hw_context[2] = SHA224_H2;
1929 	req_ctx->hw_context[3] = SHA224_H3;
1930 	req_ctx->hw_context[4] = SHA224_H4;
1931 	req_ctx->hw_context[5] = SHA224_H5;
1932 	req_ctx->hw_context[6] = SHA224_H6;
1933 	req_ctx->hw_context[7] = SHA224_H7;
1934 
1935 	/* init 64-bit count */
1936 	req_ctx->hw_context[8] = 0;
1937 	req_ctx->hw_context[9] = 0;
1938 
1939 	dma_sync_single_for_device(dev, ctx->dma_hw_context,
1940 				   req_ctx->hw_context_size, DMA_TO_DEVICE);
1941 
1942 	return 0;
1943 }
1944 
1945 static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes)
1946 {
1947 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1948 	struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1949 	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1950 	struct talitos_edesc *edesc;
1951 	unsigned int blocksize =
1952 			crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
1953 	unsigned int nbytes_to_hash;
1954 	unsigned int to_hash_later;
1955 	unsigned int nsg;
1956 	int nents;
1957 	struct device *dev = ctx->dev;
1958 	struct talitos_private *priv = dev_get_drvdata(dev);
1959 	bool is_sec1 = has_ftr_sec1(priv);
1960 	int offset = 0;
1961 	u8 *ctx_buf = req_ctx->buf[req_ctx->buf_idx];
1962 
1963 	if (!req_ctx->last && (nbytes + req_ctx->nbuf <= blocksize)) {
1964 		/* Buffer up to one whole block */
1965 		nents = sg_nents_for_len(areq->src, nbytes);
1966 		if (nents < 0) {
1967 			dev_err(ctx->dev, "Invalid number of src SG.\n");
1968 			return nents;
1969 		}
1970 		sg_copy_to_buffer(areq->src, nents,
1971 				  ctx_buf + req_ctx->nbuf, nbytes);
1972 		req_ctx->nbuf += nbytes;
1973 		return 0;
1974 	}
1975 
1976 	/* At least (blocksize + 1) bytes are available to hash */
1977 	nbytes_to_hash = nbytes + req_ctx->nbuf;
1978 	to_hash_later = nbytes_to_hash & (blocksize - 1);
1979 
1980 	if (req_ctx->last)
1981 		to_hash_later = 0;
1982 	else if (to_hash_later)
1983 		/* There is a partial block. Hash the full block(s) now */
1984 		nbytes_to_hash -= to_hash_later;
1985 	else {
1986 		/* Keep one block buffered */
1987 		nbytes_to_hash -= blocksize;
1988 		to_hash_later = blocksize;
1989 	}
1990 
1991 	/* Chain in any previously buffered data */
1992 	if (!is_sec1 && req_ctx->nbuf) {
1993 		nsg = (req_ctx->nbuf < nbytes_to_hash) ? 2 : 1;
1994 		sg_init_table(req_ctx->bufsl, nsg);
1995 		sg_set_buf(req_ctx->bufsl, ctx_buf, req_ctx->nbuf);
1996 		if (nsg > 1)
1997 			sg_chain(req_ctx->bufsl, 2, areq->src);
1998 		req_ctx->psrc = req_ctx->bufsl;
1999 	} else if (is_sec1 && req_ctx->nbuf && req_ctx->nbuf < blocksize) {
2000 		if (nbytes_to_hash > blocksize)
2001 			offset = blocksize - req_ctx->nbuf;
2002 		else
2003 			offset = nbytes_to_hash - req_ctx->nbuf;
2004 		nents = sg_nents_for_len(areq->src, offset);
2005 		if (nents < 0) {
2006 			dev_err(ctx->dev, "Invalid number of src SG.\n");
2007 			return nents;
2008 		}
2009 		sg_copy_to_buffer(areq->src, nents,
2010 				  ctx_buf + req_ctx->nbuf, offset);
2011 		req_ctx->nbuf += offset;
2012 		req_ctx->psrc = areq->src;
2013 	} else
2014 		req_ctx->psrc = areq->src;
2015 
2016 	if (to_hash_later) {
2017 		nents = sg_nents_for_len(areq->src, nbytes);
2018 		if (nents < 0) {
2019 			dev_err(ctx->dev, "Invalid number of src SG.\n");
2020 			return nents;
2021 		}
2022 		sg_pcopy_to_buffer(areq->src, nents,
2023 				   req_ctx->buf[(req_ctx->buf_idx + 1) & 1],
2024 				      to_hash_later,
2025 				      nbytes - to_hash_later);
2026 	}
2027 	req_ctx->to_hash_later = to_hash_later;
2028 
2029 	/* Allocate extended descriptor */
2030 	edesc = ahash_edesc_alloc(areq, nbytes_to_hash);
2031 	if (IS_ERR(edesc))
2032 		return PTR_ERR(edesc);
2033 
2034 	edesc->desc.hdr = ctx->desc_hdr_template;
2035 
2036 	/* On last one, request SEC to pad; otherwise continue */
2037 	if (req_ctx->last)
2038 		edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_PAD;
2039 	else
2040 		edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_CONT;
2041 
2042 	/* request SEC to INIT hash. */
2043 	if (req_ctx->first && !req_ctx->swinit)
2044 		edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_INIT;
2045 	if (is_sec1) {
2046 		dma_addr_t dma_buf = ctx->dma_buf + req_ctx->buf_idx *
2047 						    HASH_MAX_BLOCK_SIZE;
2048 
2049 		dma_sync_single_for_device(dev, dma_buf,
2050 					   req_ctx->nbuf, DMA_TO_DEVICE);
2051 	}
2052 
2053 	/* When the tfm context has a keylen, it's an HMAC.
2054 	 * A first or last (ie. not middle) descriptor must request HMAC.
2055 	 */
2056 	if (ctx->keylen && (req_ctx->first || req_ctx->last))
2057 		edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_HMAC;
2058 
2059 	return common_nonsnoop_hash(edesc, areq, nbytes_to_hash, offset,
2060 				    ahash_done);
2061 }
2062 
2063 static int ahash_update(struct ahash_request *areq)
2064 {
2065 	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2066 
2067 	req_ctx->last = 0;
2068 
2069 	return ahash_process_req(areq, areq->nbytes);
2070 }
2071 
2072 static int ahash_final(struct ahash_request *areq)
2073 {
2074 	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2075 
2076 	req_ctx->last = 1;
2077 
2078 	return ahash_process_req(areq, 0);
2079 }
2080 
2081 static int ahash_finup(struct ahash_request *areq)
2082 {
2083 	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2084 
2085 	req_ctx->last = 1;
2086 
2087 	return ahash_process_req(areq, areq->nbytes);
2088 }
2089 
2090 static int ahash_digest(struct ahash_request *areq)
2091 {
2092 	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2093 	struct crypto_ahash *ahash = crypto_ahash_reqtfm(areq);
2094 
2095 	ahash->init(areq);
2096 	req_ctx->last = 1;
2097 
2098 	return ahash_process_req(areq, areq->nbytes);
2099 }
2100 
2101 static int ahash_export(struct ahash_request *areq, void *out)
2102 {
2103 	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2104 	struct talitos_export_state *export = out;
2105 	struct crypto_ahash *ahash = crypto_ahash_reqtfm(areq);
2106 	struct talitos_ctx *ctx = crypto_ahash_ctx(ahash);
2107 	struct device *dev = ctx->dev;
2108 
2109 	dma_sync_single_for_cpu(dev, ctx->dma_hw_context,
2110 				req_ctx->hw_context_size, DMA_FROM_DEVICE);
2111 	memcpy(export->hw_context, req_ctx->hw_context,
2112 	       req_ctx->hw_context_size);
2113 	memcpy(export->buf, req_ctx->buf[req_ctx->buf_idx], req_ctx->nbuf);
2114 	export->swinit = req_ctx->swinit;
2115 	export->first = req_ctx->first;
2116 	export->last = req_ctx->last;
2117 	export->to_hash_later = req_ctx->to_hash_later;
2118 	export->nbuf = req_ctx->nbuf;
2119 
2120 	return 0;
2121 }
2122 
2123 static int ahash_import(struct ahash_request *areq, const void *in)
2124 {
2125 	struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2126 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2127 	const struct talitos_export_state *export = in;
2128 	unsigned int size;
2129 	struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
2130 	struct device *dev = ctx->dev;
2131 	struct talitos_private *priv = dev_get_drvdata(dev);
2132 	bool is_sec1 = has_ftr_sec1(priv);
2133 
2134 	memset(req_ctx, 0, sizeof(*req_ctx));
2135 	size = (crypto_ahash_digestsize(tfm) <= SHA256_DIGEST_SIZE)
2136 			? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256
2137 			: TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512;
2138 	req_ctx->hw_context_size = size;
2139 	if (ctx->dma_hw_context)
2140 		dma_unmap_single(dev, ctx->dma_hw_context, size,
2141 				 DMA_BIDIRECTIONAL);
2142 
2143 	memcpy(req_ctx->hw_context, export->hw_context, size);
2144 	ctx->dma_hw_context = dma_map_single(dev, req_ctx->hw_context, size,
2145 					     DMA_BIDIRECTIONAL);
2146 	if (ctx->dma_buf)
2147 		dma_unmap_single(dev, ctx->dma_buf, sizeof(req_ctx->buf),
2148 				 DMA_TO_DEVICE);
2149 	memcpy(req_ctx->buf[0], export->buf, export->nbuf);
2150 	if (is_sec1)
2151 		ctx->dma_buf = dma_map_single(dev, req_ctx->buf,
2152 					      sizeof(req_ctx->buf),
2153 					      DMA_TO_DEVICE);
2154 	req_ctx->swinit = export->swinit;
2155 	req_ctx->first = export->first;
2156 	req_ctx->last = export->last;
2157 	req_ctx->to_hash_later = export->to_hash_later;
2158 	req_ctx->nbuf = export->nbuf;
2159 
2160 	return 0;
2161 }
2162 
2163 static int keyhash(struct crypto_ahash *tfm, const u8 *key, unsigned int keylen,
2164 		   u8 *hash)
2165 {
2166 	struct talitos_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
2167 
2168 	struct scatterlist sg[1];
2169 	struct ahash_request *req;
2170 	struct crypto_wait wait;
2171 	int ret;
2172 
2173 	crypto_init_wait(&wait);
2174 
2175 	req = ahash_request_alloc(tfm, GFP_KERNEL);
2176 	if (!req)
2177 		return -ENOMEM;
2178 
2179 	/* Keep tfm keylen == 0 during hash of the long key */
2180 	ctx->keylen = 0;
2181 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2182 				   crypto_req_done, &wait);
2183 
2184 	sg_init_one(&sg[0], key, keylen);
2185 
2186 	ahash_request_set_crypt(req, sg, hash, keylen);
2187 	ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
2188 
2189 	ahash_request_free(req);
2190 
2191 	return ret;
2192 }
2193 
2194 static int ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
2195 			unsigned int keylen)
2196 {
2197 	struct talitos_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
2198 	struct device *dev = ctx->dev;
2199 	unsigned int blocksize =
2200 			crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
2201 	unsigned int digestsize = crypto_ahash_digestsize(tfm);
2202 	unsigned int keysize = keylen;
2203 	u8 hash[SHA512_DIGEST_SIZE];
2204 	int ret;
2205 
2206 	if (keylen <= blocksize)
2207 		memcpy(ctx->key, key, keysize);
2208 	else {
2209 		/* Must get the hash of the long key */
2210 		ret = keyhash(tfm, key, keylen, hash);
2211 
2212 		if (ret) {
2213 			crypto_ahash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
2214 			return -EINVAL;
2215 		}
2216 
2217 		keysize = digestsize;
2218 		memcpy(ctx->key, hash, digestsize);
2219 	}
2220 
2221 	if (ctx->keylen)
2222 		dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
2223 
2224 	ctx->keylen = keysize;
2225 	ctx->dma_key = dma_map_single(dev, ctx->key, keysize, DMA_TO_DEVICE);
2226 
2227 	return 0;
2228 }
2229 
2230 
2231 struct talitos_alg_template {
2232 	u32 type;
2233 	u32 priority;
2234 	union {
2235 		struct crypto_alg crypto;
2236 		struct ahash_alg hash;
2237 		struct aead_alg aead;
2238 	} alg;
2239 	__be32 desc_hdr_template;
2240 };
2241 
2242 static struct talitos_alg_template driver_algs[] = {
2243 	/* AEAD algorithms.  These use a single-pass ipsec_esp descriptor */
2244 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2245 		.alg.aead = {
2246 			.base = {
2247 				.cra_name = "authenc(hmac(sha1),cbc(aes))",
2248 				.cra_driver_name = "authenc-hmac-sha1-"
2249 						   "cbc-aes-talitos",
2250 				.cra_blocksize = AES_BLOCK_SIZE,
2251 				.cra_flags = CRYPTO_ALG_ASYNC,
2252 			},
2253 			.ivsize = AES_BLOCK_SIZE,
2254 			.maxauthsize = SHA1_DIGEST_SIZE,
2255 		},
2256 		.desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2257 			             DESC_HDR_SEL0_AESU |
2258 		                     DESC_HDR_MODE0_AESU_CBC |
2259 		                     DESC_HDR_SEL1_MDEUA |
2260 		                     DESC_HDR_MODE1_MDEU_INIT |
2261 		                     DESC_HDR_MODE1_MDEU_PAD |
2262 		                     DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2263 	},
2264 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2265 		.priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2266 		.alg.aead = {
2267 			.base = {
2268 				.cra_name = "authenc(hmac(sha1),cbc(aes))",
2269 				.cra_driver_name = "authenc-hmac-sha1-"
2270 						   "cbc-aes-talitos",
2271 				.cra_blocksize = AES_BLOCK_SIZE,
2272 				.cra_flags = CRYPTO_ALG_ASYNC,
2273 			},
2274 			.ivsize = AES_BLOCK_SIZE,
2275 			.maxauthsize = SHA1_DIGEST_SIZE,
2276 		},
2277 		.desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2278 				     DESC_HDR_SEL0_AESU |
2279 				     DESC_HDR_MODE0_AESU_CBC |
2280 				     DESC_HDR_SEL1_MDEUA |
2281 				     DESC_HDR_MODE1_MDEU_INIT |
2282 				     DESC_HDR_MODE1_MDEU_PAD |
2283 				     DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2284 	},
2285 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2286 		.alg.aead = {
2287 			.base = {
2288 				.cra_name = "authenc(hmac(sha1),"
2289 					    "cbc(des3_ede))",
2290 				.cra_driver_name = "authenc-hmac-sha1-"
2291 						   "cbc-3des-talitos",
2292 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2293 				.cra_flags = CRYPTO_ALG_ASYNC,
2294 			},
2295 			.ivsize = DES3_EDE_BLOCK_SIZE,
2296 			.maxauthsize = SHA1_DIGEST_SIZE,
2297 		},
2298 		.desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2299 			             DESC_HDR_SEL0_DEU |
2300 		                     DESC_HDR_MODE0_DEU_CBC |
2301 		                     DESC_HDR_MODE0_DEU_3DES |
2302 		                     DESC_HDR_SEL1_MDEUA |
2303 		                     DESC_HDR_MODE1_MDEU_INIT |
2304 		                     DESC_HDR_MODE1_MDEU_PAD |
2305 		                     DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2306 	},
2307 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2308 		.priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2309 		.alg.aead = {
2310 			.base = {
2311 				.cra_name = "authenc(hmac(sha1),"
2312 					    "cbc(des3_ede))",
2313 				.cra_driver_name = "authenc-hmac-sha1-"
2314 						   "cbc-3des-talitos",
2315 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2316 				.cra_flags = CRYPTO_ALG_ASYNC,
2317 			},
2318 			.ivsize = DES3_EDE_BLOCK_SIZE,
2319 			.maxauthsize = SHA1_DIGEST_SIZE,
2320 		},
2321 		.desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2322 				     DESC_HDR_SEL0_DEU |
2323 				     DESC_HDR_MODE0_DEU_CBC |
2324 				     DESC_HDR_MODE0_DEU_3DES |
2325 				     DESC_HDR_SEL1_MDEUA |
2326 				     DESC_HDR_MODE1_MDEU_INIT |
2327 				     DESC_HDR_MODE1_MDEU_PAD |
2328 				     DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2329 	},
2330 	{       .type = CRYPTO_ALG_TYPE_AEAD,
2331 		.alg.aead = {
2332 			.base = {
2333 				.cra_name = "authenc(hmac(sha224),cbc(aes))",
2334 				.cra_driver_name = "authenc-hmac-sha224-"
2335 						   "cbc-aes-talitos",
2336 				.cra_blocksize = AES_BLOCK_SIZE,
2337 				.cra_flags = CRYPTO_ALG_ASYNC,
2338 			},
2339 			.ivsize = AES_BLOCK_SIZE,
2340 			.maxauthsize = SHA224_DIGEST_SIZE,
2341 		},
2342 		.desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2343 				     DESC_HDR_SEL0_AESU |
2344 				     DESC_HDR_MODE0_AESU_CBC |
2345 				     DESC_HDR_SEL1_MDEUA |
2346 				     DESC_HDR_MODE1_MDEU_INIT |
2347 				     DESC_HDR_MODE1_MDEU_PAD |
2348 				     DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2349 	},
2350 	{       .type = CRYPTO_ALG_TYPE_AEAD,
2351 		.priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2352 		.alg.aead = {
2353 			.base = {
2354 				.cra_name = "authenc(hmac(sha224),cbc(aes))",
2355 				.cra_driver_name = "authenc-hmac-sha224-"
2356 						   "cbc-aes-talitos",
2357 				.cra_blocksize = AES_BLOCK_SIZE,
2358 				.cra_flags = CRYPTO_ALG_ASYNC,
2359 			},
2360 			.ivsize = AES_BLOCK_SIZE,
2361 			.maxauthsize = SHA224_DIGEST_SIZE,
2362 		},
2363 		.desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2364 				     DESC_HDR_SEL0_AESU |
2365 				     DESC_HDR_MODE0_AESU_CBC |
2366 				     DESC_HDR_SEL1_MDEUA |
2367 				     DESC_HDR_MODE1_MDEU_INIT |
2368 				     DESC_HDR_MODE1_MDEU_PAD |
2369 				     DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2370 	},
2371 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2372 		.alg.aead = {
2373 			.base = {
2374 				.cra_name = "authenc(hmac(sha224),"
2375 					    "cbc(des3_ede))",
2376 				.cra_driver_name = "authenc-hmac-sha224-"
2377 						   "cbc-3des-talitos",
2378 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2379 				.cra_flags = CRYPTO_ALG_ASYNC,
2380 			},
2381 			.ivsize = DES3_EDE_BLOCK_SIZE,
2382 			.maxauthsize = SHA224_DIGEST_SIZE,
2383 		},
2384 		.desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2385 			             DESC_HDR_SEL0_DEU |
2386 		                     DESC_HDR_MODE0_DEU_CBC |
2387 		                     DESC_HDR_MODE0_DEU_3DES |
2388 		                     DESC_HDR_SEL1_MDEUA |
2389 		                     DESC_HDR_MODE1_MDEU_INIT |
2390 		                     DESC_HDR_MODE1_MDEU_PAD |
2391 		                     DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2392 	},
2393 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2394 		.priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2395 		.alg.aead = {
2396 			.base = {
2397 				.cra_name = "authenc(hmac(sha224),"
2398 					    "cbc(des3_ede))",
2399 				.cra_driver_name = "authenc-hmac-sha224-"
2400 						   "cbc-3des-talitos",
2401 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2402 				.cra_flags = CRYPTO_ALG_ASYNC,
2403 			},
2404 			.ivsize = DES3_EDE_BLOCK_SIZE,
2405 			.maxauthsize = SHA224_DIGEST_SIZE,
2406 		},
2407 		.desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2408 				     DESC_HDR_SEL0_DEU |
2409 				     DESC_HDR_MODE0_DEU_CBC |
2410 				     DESC_HDR_MODE0_DEU_3DES |
2411 				     DESC_HDR_SEL1_MDEUA |
2412 				     DESC_HDR_MODE1_MDEU_INIT |
2413 				     DESC_HDR_MODE1_MDEU_PAD |
2414 				     DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2415 	},
2416 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2417 		.alg.aead = {
2418 			.base = {
2419 				.cra_name = "authenc(hmac(sha256),cbc(aes))",
2420 				.cra_driver_name = "authenc-hmac-sha256-"
2421 						   "cbc-aes-talitos",
2422 				.cra_blocksize = AES_BLOCK_SIZE,
2423 				.cra_flags = CRYPTO_ALG_ASYNC,
2424 			},
2425 			.ivsize = AES_BLOCK_SIZE,
2426 			.maxauthsize = SHA256_DIGEST_SIZE,
2427 		},
2428 		.desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2429 			             DESC_HDR_SEL0_AESU |
2430 		                     DESC_HDR_MODE0_AESU_CBC |
2431 		                     DESC_HDR_SEL1_MDEUA |
2432 		                     DESC_HDR_MODE1_MDEU_INIT |
2433 		                     DESC_HDR_MODE1_MDEU_PAD |
2434 		                     DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2435 	},
2436 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2437 		.priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2438 		.alg.aead = {
2439 			.base = {
2440 				.cra_name = "authenc(hmac(sha256),cbc(aes))",
2441 				.cra_driver_name = "authenc-hmac-sha256-"
2442 						   "cbc-aes-talitos",
2443 				.cra_blocksize = AES_BLOCK_SIZE,
2444 				.cra_flags = CRYPTO_ALG_ASYNC,
2445 			},
2446 			.ivsize = AES_BLOCK_SIZE,
2447 			.maxauthsize = SHA256_DIGEST_SIZE,
2448 		},
2449 		.desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2450 				     DESC_HDR_SEL0_AESU |
2451 				     DESC_HDR_MODE0_AESU_CBC |
2452 				     DESC_HDR_SEL1_MDEUA |
2453 				     DESC_HDR_MODE1_MDEU_INIT |
2454 				     DESC_HDR_MODE1_MDEU_PAD |
2455 				     DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2456 	},
2457 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2458 		.alg.aead = {
2459 			.base = {
2460 				.cra_name = "authenc(hmac(sha256),"
2461 					    "cbc(des3_ede))",
2462 				.cra_driver_name = "authenc-hmac-sha256-"
2463 						   "cbc-3des-talitos",
2464 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2465 				.cra_flags = CRYPTO_ALG_ASYNC,
2466 			},
2467 			.ivsize = DES3_EDE_BLOCK_SIZE,
2468 			.maxauthsize = SHA256_DIGEST_SIZE,
2469 		},
2470 		.desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2471 			             DESC_HDR_SEL0_DEU |
2472 		                     DESC_HDR_MODE0_DEU_CBC |
2473 		                     DESC_HDR_MODE0_DEU_3DES |
2474 		                     DESC_HDR_SEL1_MDEUA |
2475 		                     DESC_HDR_MODE1_MDEU_INIT |
2476 		                     DESC_HDR_MODE1_MDEU_PAD |
2477 		                     DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2478 	},
2479 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2480 		.priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2481 		.alg.aead = {
2482 			.base = {
2483 				.cra_name = "authenc(hmac(sha256),"
2484 					    "cbc(des3_ede))",
2485 				.cra_driver_name = "authenc-hmac-sha256-"
2486 						   "cbc-3des-talitos",
2487 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2488 				.cra_flags = CRYPTO_ALG_ASYNC,
2489 			},
2490 			.ivsize = DES3_EDE_BLOCK_SIZE,
2491 			.maxauthsize = SHA256_DIGEST_SIZE,
2492 		},
2493 		.desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2494 				     DESC_HDR_SEL0_DEU |
2495 				     DESC_HDR_MODE0_DEU_CBC |
2496 				     DESC_HDR_MODE0_DEU_3DES |
2497 				     DESC_HDR_SEL1_MDEUA |
2498 				     DESC_HDR_MODE1_MDEU_INIT |
2499 				     DESC_HDR_MODE1_MDEU_PAD |
2500 				     DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2501 	},
2502 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2503 		.alg.aead = {
2504 			.base = {
2505 				.cra_name = "authenc(hmac(sha384),cbc(aes))",
2506 				.cra_driver_name = "authenc-hmac-sha384-"
2507 						   "cbc-aes-talitos",
2508 				.cra_blocksize = AES_BLOCK_SIZE,
2509 				.cra_flags = CRYPTO_ALG_ASYNC,
2510 			},
2511 			.ivsize = AES_BLOCK_SIZE,
2512 			.maxauthsize = SHA384_DIGEST_SIZE,
2513 		},
2514 		.desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2515 			             DESC_HDR_SEL0_AESU |
2516 		                     DESC_HDR_MODE0_AESU_CBC |
2517 		                     DESC_HDR_SEL1_MDEUB |
2518 		                     DESC_HDR_MODE1_MDEU_INIT |
2519 		                     DESC_HDR_MODE1_MDEU_PAD |
2520 		                     DESC_HDR_MODE1_MDEUB_SHA384_HMAC,
2521 	},
2522 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2523 		.alg.aead = {
2524 			.base = {
2525 				.cra_name = "authenc(hmac(sha384),"
2526 					    "cbc(des3_ede))",
2527 				.cra_driver_name = "authenc-hmac-sha384-"
2528 						   "cbc-3des-talitos",
2529 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2530 				.cra_flags = CRYPTO_ALG_ASYNC,
2531 			},
2532 			.ivsize = DES3_EDE_BLOCK_SIZE,
2533 			.maxauthsize = SHA384_DIGEST_SIZE,
2534 		},
2535 		.desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2536 			             DESC_HDR_SEL0_DEU |
2537 		                     DESC_HDR_MODE0_DEU_CBC |
2538 		                     DESC_HDR_MODE0_DEU_3DES |
2539 		                     DESC_HDR_SEL1_MDEUB |
2540 		                     DESC_HDR_MODE1_MDEU_INIT |
2541 		                     DESC_HDR_MODE1_MDEU_PAD |
2542 		                     DESC_HDR_MODE1_MDEUB_SHA384_HMAC,
2543 	},
2544 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2545 		.alg.aead = {
2546 			.base = {
2547 				.cra_name = "authenc(hmac(sha512),cbc(aes))",
2548 				.cra_driver_name = "authenc-hmac-sha512-"
2549 						   "cbc-aes-talitos",
2550 				.cra_blocksize = AES_BLOCK_SIZE,
2551 				.cra_flags = CRYPTO_ALG_ASYNC,
2552 			},
2553 			.ivsize = AES_BLOCK_SIZE,
2554 			.maxauthsize = SHA512_DIGEST_SIZE,
2555 		},
2556 		.desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2557 			             DESC_HDR_SEL0_AESU |
2558 		                     DESC_HDR_MODE0_AESU_CBC |
2559 		                     DESC_HDR_SEL1_MDEUB |
2560 		                     DESC_HDR_MODE1_MDEU_INIT |
2561 		                     DESC_HDR_MODE1_MDEU_PAD |
2562 		                     DESC_HDR_MODE1_MDEUB_SHA512_HMAC,
2563 	},
2564 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2565 		.alg.aead = {
2566 			.base = {
2567 				.cra_name = "authenc(hmac(sha512),"
2568 					    "cbc(des3_ede))",
2569 				.cra_driver_name = "authenc-hmac-sha512-"
2570 						   "cbc-3des-talitos",
2571 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2572 				.cra_flags = CRYPTO_ALG_ASYNC,
2573 			},
2574 			.ivsize = DES3_EDE_BLOCK_SIZE,
2575 			.maxauthsize = SHA512_DIGEST_SIZE,
2576 		},
2577 		.desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2578 			             DESC_HDR_SEL0_DEU |
2579 		                     DESC_HDR_MODE0_DEU_CBC |
2580 		                     DESC_HDR_MODE0_DEU_3DES |
2581 		                     DESC_HDR_SEL1_MDEUB |
2582 		                     DESC_HDR_MODE1_MDEU_INIT |
2583 		                     DESC_HDR_MODE1_MDEU_PAD |
2584 		                     DESC_HDR_MODE1_MDEUB_SHA512_HMAC,
2585 	},
2586 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2587 		.alg.aead = {
2588 			.base = {
2589 				.cra_name = "authenc(hmac(md5),cbc(aes))",
2590 				.cra_driver_name = "authenc-hmac-md5-"
2591 						   "cbc-aes-talitos",
2592 				.cra_blocksize = AES_BLOCK_SIZE,
2593 				.cra_flags = CRYPTO_ALG_ASYNC,
2594 			},
2595 			.ivsize = AES_BLOCK_SIZE,
2596 			.maxauthsize = MD5_DIGEST_SIZE,
2597 		},
2598 		.desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2599 			             DESC_HDR_SEL0_AESU |
2600 		                     DESC_HDR_MODE0_AESU_CBC |
2601 		                     DESC_HDR_SEL1_MDEUA |
2602 		                     DESC_HDR_MODE1_MDEU_INIT |
2603 		                     DESC_HDR_MODE1_MDEU_PAD |
2604 		                     DESC_HDR_MODE1_MDEU_MD5_HMAC,
2605 	},
2606 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2607 		.priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2608 		.alg.aead = {
2609 			.base = {
2610 				.cra_name = "authenc(hmac(md5),cbc(aes))",
2611 				.cra_driver_name = "authenc-hmac-md5-"
2612 						   "cbc-aes-talitos",
2613 				.cra_blocksize = AES_BLOCK_SIZE,
2614 				.cra_flags = CRYPTO_ALG_ASYNC,
2615 			},
2616 			.ivsize = AES_BLOCK_SIZE,
2617 			.maxauthsize = MD5_DIGEST_SIZE,
2618 		},
2619 		.desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2620 				     DESC_HDR_SEL0_AESU |
2621 				     DESC_HDR_MODE0_AESU_CBC |
2622 				     DESC_HDR_SEL1_MDEUA |
2623 				     DESC_HDR_MODE1_MDEU_INIT |
2624 				     DESC_HDR_MODE1_MDEU_PAD |
2625 				     DESC_HDR_MODE1_MDEU_MD5_HMAC,
2626 	},
2627 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2628 		.alg.aead = {
2629 			.base = {
2630 				.cra_name = "authenc(hmac(md5),cbc(des3_ede))",
2631 				.cra_driver_name = "authenc-hmac-md5-"
2632 						   "cbc-3des-talitos",
2633 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2634 				.cra_flags = CRYPTO_ALG_ASYNC,
2635 			},
2636 			.ivsize = DES3_EDE_BLOCK_SIZE,
2637 			.maxauthsize = MD5_DIGEST_SIZE,
2638 		},
2639 		.desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2640 			             DESC_HDR_SEL0_DEU |
2641 		                     DESC_HDR_MODE0_DEU_CBC |
2642 		                     DESC_HDR_MODE0_DEU_3DES |
2643 		                     DESC_HDR_SEL1_MDEUA |
2644 		                     DESC_HDR_MODE1_MDEU_INIT |
2645 		                     DESC_HDR_MODE1_MDEU_PAD |
2646 		                     DESC_HDR_MODE1_MDEU_MD5_HMAC,
2647 	},
2648 	{	.type = CRYPTO_ALG_TYPE_AEAD,
2649 		.priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2650 		.alg.aead = {
2651 			.base = {
2652 				.cra_name = "authenc(hmac(md5),cbc(des3_ede))",
2653 				.cra_driver_name = "authenc-hmac-md5-"
2654 						   "cbc-3des-talitos",
2655 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2656 				.cra_flags = CRYPTO_ALG_ASYNC,
2657 			},
2658 			.ivsize = DES3_EDE_BLOCK_SIZE,
2659 			.maxauthsize = MD5_DIGEST_SIZE,
2660 		},
2661 		.desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2662 				     DESC_HDR_SEL0_DEU |
2663 				     DESC_HDR_MODE0_DEU_CBC |
2664 				     DESC_HDR_MODE0_DEU_3DES |
2665 				     DESC_HDR_SEL1_MDEUA |
2666 				     DESC_HDR_MODE1_MDEU_INIT |
2667 				     DESC_HDR_MODE1_MDEU_PAD |
2668 				     DESC_HDR_MODE1_MDEU_MD5_HMAC,
2669 	},
2670 	/* ABLKCIPHER algorithms. */
2671 	{	.type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2672 		.alg.crypto = {
2673 			.cra_name = "ecb(aes)",
2674 			.cra_driver_name = "ecb-aes-talitos",
2675 			.cra_blocksize = AES_BLOCK_SIZE,
2676 			.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2677 				     CRYPTO_ALG_ASYNC,
2678 			.cra_ablkcipher = {
2679 				.min_keysize = AES_MIN_KEY_SIZE,
2680 				.max_keysize = AES_MAX_KEY_SIZE,
2681 				.ivsize = AES_BLOCK_SIZE,
2682 			}
2683 		},
2684 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2685 				     DESC_HDR_SEL0_AESU,
2686 	},
2687 	{	.type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2688 		.alg.crypto = {
2689 			.cra_name = "cbc(aes)",
2690 			.cra_driver_name = "cbc-aes-talitos",
2691 			.cra_blocksize = AES_BLOCK_SIZE,
2692 			.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2693                                      CRYPTO_ALG_ASYNC,
2694 			.cra_ablkcipher = {
2695 				.min_keysize = AES_MIN_KEY_SIZE,
2696 				.max_keysize = AES_MAX_KEY_SIZE,
2697 				.ivsize = AES_BLOCK_SIZE,
2698 			}
2699 		},
2700 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2701 				     DESC_HDR_SEL0_AESU |
2702 				     DESC_HDR_MODE0_AESU_CBC,
2703 	},
2704 	{	.type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2705 		.alg.crypto = {
2706 			.cra_name = "ctr(aes)",
2707 			.cra_driver_name = "ctr-aes-talitos",
2708 			.cra_blocksize = AES_BLOCK_SIZE,
2709 			.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2710 				     CRYPTO_ALG_ASYNC,
2711 			.cra_ablkcipher = {
2712 				.min_keysize = AES_MIN_KEY_SIZE,
2713 				.max_keysize = AES_MAX_KEY_SIZE,
2714 				.ivsize = AES_BLOCK_SIZE,
2715 			}
2716 		},
2717 		.desc_hdr_template = DESC_HDR_TYPE_AESU_CTR_NONSNOOP |
2718 				     DESC_HDR_SEL0_AESU |
2719 				     DESC_HDR_MODE0_AESU_CTR,
2720 	},
2721 	{	.type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2722 		.alg.crypto = {
2723 			.cra_name = "ecb(des)",
2724 			.cra_driver_name = "ecb-des-talitos",
2725 			.cra_blocksize = DES_BLOCK_SIZE,
2726 			.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2727 				     CRYPTO_ALG_ASYNC,
2728 			.cra_ablkcipher = {
2729 				.min_keysize = DES_KEY_SIZE,
2730 				.max_keysize = DES_KEY_SIZE,
2731 				.ivsize = DES_BLOCK_SIZE,
2732 			}
2733 		},
2734 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2735 				     DESC_HDR_SEL0_DEU,
2736 	},
2737 	{	.type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2738 		.alg.crypto = {
2739 			.cra_name = "cbc(des)",
2740 			.cra_driver_name = "cbc-des-talitos",
2741 			.cra_blocksize = DES_BLOCK_SIZE,
2742 			.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2743 				     CRYPTO_ALG_ASYNC,
2744 			.cra_ablkcipher = {
2745 				.min_keysize = DES_KEY_SIZE,
2746 				.max_keysize = DES_KEY_SIZE,
2747 				.ivsize = DES_BLOCK_SIZE,
2748 			}
2749 		},
2750 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2751 				     DESC_HDR_SEL0_DEU |
2752 				     DESC_HDR_MODE0_DEU_CBC,
2753 	},
2754 	{	.type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2755 		.alg.crypto = {
2756 			.cra_name = "ecb(des3_ede)",
2757 			.cra_driver_name = "ecb-3des-talitos",
2758 			.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2759 			.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2760 				     CRYPTO_ALG_ASYNC,
2761 			.cra_ablkcipher = {
2762 				.min_keysize = DES3_EDE_KEY_SIZE,
2763 				.max_keysize = DES3_EDE_KEY_SIZE,
2764 				.ivsize = DES3_EDE_BLOCK_SIZE,
2765 			}
2766 		},
2767 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2768 				     DESC_HDR_SEL0_DEU |
2769 				     DESC_HDR_MODE0_DEU_3DES,
2770 	},
2771 	{	.type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2772 		.alg.crypto = {
2773 			.cra_name = "cbc(des3_ede)",
2774 			.cra_driver_name = "cbc-3des-talitos",
2775 			.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2776 			.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2777                                      CRYPTO_ALG_ASYNC,
2778 			.cra_ablkcipher = {
2779 				.min_keysize = DES3_EDE_KEY_SIZE,
2780 				.max_keysize = DES3_EDE_KEY_SIZE,
2781 				.ivsize = DES3_EDE_BLOCK_SIZE,
2782 			}
2783 		},
2784 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2785 			             DESC_HDR_SEL0_DEU |
2786 		                     DESC_HDR_MODE0_DEU_CBC |
2787 		                     DESC_HDR_MODE0_DEU_3DES,
2788 	},
2789 	/* AHASH algorithms. */
2790 	{	.type = CRYPTO_ALG_TYPE_AHASH,
2791 		.alg.hash = {
2792 			.halg.digestsize = MD5_DIGEST_SIZE,
2793 			.halg.statesize = sizeof(struct talitos_export_state),
2794 			.halg.base = {
2795 				.cra_name = "md5",
2796 				.cra_driver_name = "md5-talitos",
2797 				.cra_blocksize = MD5_HMAC_BLOCK_SIZE,
2798 				.cra_flags = CRYPTO_ALG_TYPE_AHASH |
2799 					     CRYPTO_ALG_ASYNC,
2800 			}
2801 		},
2802 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2803 				     DESC_HDR_SEL0_MDEUA |
2804 				     DESC_HDR_MODE0_MDEU_MD5,
2805 	},
2806 	{	.type = CRYPTO_ALG_TYPE_AHASH,
2807 		.alg.hash = {
2808 			.halg.digestsize = SHA1_DIGEST_SIZE,
2809 			.halg.statesize = sizeof(struct talitos_export_state),
2810 			.halg.base = {
2811 				.cra_name = "sha1",
2812 				.cra_driver_name = "sha1-talitos",
2813 				.cra_blocksize = SHA1_BLOCK_SIZE,
2814 				.cra_flags = CRYPTO_ALG_TYPE_AHASH |
2815 					     CRYPTO_ALG_ASYNC,
2816 			}
2817 		},
2818 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2819 				     DESC_HDR_SEL0_MDEUA |
2820 				     DESC_HDR_MODE0_MDEU_SHA1,
2821 	},
2822 	{	.type = CRYPTO_ALG_TYPE_AHASH,
2823 		.alg.hash = {
2824 			.halg.digestsize = SHA224_DIGEST_SIZE,
2825 			.halg.statesize = sizeof(struct talitos_export_state),
2826 			.halg.base = {
2827 				.cra_name = "sha224",
2828 				.cra_driver_name = "sha224-talitos",
2829 				.cra_blocksize = SHA224_BLOCK_SIZE,
2830 				.cra_flags = CRYPTO_ALG_TYPE_AHASH |
2831 					     CRYPTO_ALG_ASYNC,
2832 			}
2833 		},
2834 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2835 				     DESC_HDR_SEL0_MDEUA |
2836 				     DESC_HDR_MODE0_MDEU_SHA224,
2837 	},
2838 	{	.type = CRYPTO_ALG_TYPE_AHASH,
2839 		.alg.hash = {
2840 			.halg.digestsize = SHA256_DIGEST_SIZE,
2841 			.halg.statesize = sizeof(struct talitos_export_state),
2842 			.halg.base = {
2843 				.cra_name = "sha256",
2844 				.cra_driver_name = "sha256-talitos",
2845 				.cra_blocksize = SHA256_BLOCK_SIZE,
2846 				.cra_flags = CRYPTO_ALG_TYPE_AHASH |
2847 					     CRYPTO_ALG_ASYNC,
2848 			}
2849 		},
2850 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2851 				     DESC_HDR_SEL0_MDEUA |
2852 				     DESC_HDR_MODE0_MDEU_SHA256,
2853 	},
2854 	{	.type = CRYPTO_ALG_TYPE_AHASH,
2855 		.alg.hash = {
2856 			.halg.digestsize = SHA384_DIGEST_SIZE,
2857 			.halg.statesize = sizeof(struct talitos_export_state),
2858 			.halg.base = {
2859 				.cra_name = "sha384",
2860 				.cra_driver_name = "sha384-talitos",
2861 				.cra_blocksize = SHA384_BLOCK_SIZE,
2862 				.cra_flags = CRYPTO_ALG_TYPE_AHASH |
2863 					     CRYPTO_ALG_ASYNC,
2864 			}
2865 		},
2866 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2867 				     DESC_HDR_SEL0_MDEUB |
2868 				     DESC_HDR_MODE0_MDEUB_SHA384,
2869 	},
2870 	{	.type = CRYPTO_ALG_TYPE_AHASH,
2871 		.alg.hash = {
2872 			.halg.digestsize = SHA512_DIGEST_SIZE,
2873 			.halg.statesize = sizeof(struct talitos_export_state),
2874 			.halg.base = {
2875 				.cra_name = "sha512",
2876 				.cra_driver_name = "sha512-talitos",
2877 				.cra_blocksize = SHA512_BLOCK_SIZE,
2878 				.cra_flags = CRYPTO_ALG_TYPE_AHASH |
2879 					     CRYPTO_ALG_ASYNC,
2880 			}
2881 		},
2882 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2883 				     DESC_HDR_SEL0_MDEUB |
2884 				     DESC_HDR_MODE0_MDEUB_SHA512,
2885 	},
2886 	{	.type = CRYPTO_ALG_TYPE_AHASH,
2887 		.alg.hash = {
2888 			.halg.digestsize = MD5_DIGEST_SIZE,
2889 			.halg.statesize = sizeof(struct talitos_export_state),
2890 			.halg.base = {
2891 				.cra_name = "hmac(md5)",
2892 				.cra_driver_name = "hmac-md5-talitos",
2893 				.cra_blocksize = MD5_HMAC_BLOCK_SIZE,
2894 				.cra_flags = CRYPTO_ALG_TYPE_AHASH |
2895 					     CRYPTO_ALG_ASYNC,
2896 			}
2897 		},
2898 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2899 				     DESC_HDR_SEL0_MDEUA |
2900 				     DESC_HDR_MODE0_MDEU_MD5,
2901 	},
2902 	{	.type = CRYPTO_ALG_TYPE_AHASH,
2903 		.alg.hash = {
2904 			.halg.digestsize = SHA1_DIGEST_SIZE,
2905 			.halg.statesize = sizeof(struct talitos_export_state),
2906 			.halg.base = {
2907 				.cra_name = "hmac(sha1)",
2908 				.cra_driver_name = "hmac-sha1-talitos",
2909 				.cra_blocksize = SHA1_BLOCK_SIZE,
2910 				.cra_flags = CRYPTO_ALG_TYPE_AHASH |
2911 					     CRYPTO_ALG_ASYNC,
2912 			}
2913 		},
2914 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2915 				     DESC_HDR_SEL0_MDEUA |
2916 				     DESC_HDR_MODE0_MDEU_SHA1,
2917 	},
2918 	{	.type = CRYPTO_ALG_TYPE_AHASH,
2919 		.alg.hash = {
2920 			.halg.digestsize = SHA224_DIGEST_SIZE,
2921 			.halg.statesize = sizeof(struct talitos_export_state),
2922 			.halg.base = {
2923 				.cra_name = "hmac(sha224)",
2924 				.cra_driver_name = "hmac-sha224-talitos",
2925 				.cra_blocksize = SHA224_BLOCK_SIZE,
2926 				.cra_flags = CRYPTO_ALG_TYPE_AHASH |
2927 					     CRYPTO_ALG_ASYNC,
2928 			}
2929 		},
2930 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2931 				     DESC_HDR_SEL0_MDEUA |
2932 				     DESC_HDR_MODE0_MDEU_SHA224,
2933 	},
2934 	{	.type = CRYPTO_ALG_TYPE_AHASH,
2935 		.alg.hash = {
2936 			.halg.digestsize = SHA256_DIGEST_SIZE,
2937 			.halg.statesize = sizeof(struct talitos_export_state),
2938 			.halg.base = {
2939 				.cra_name = "hmac(sha256)",
2940 				.cra_driver_name = "hmac-sha256-talitos",
2941 				.cra_blocksize = SHA256_BLOCK_SIZE,
2942 				.cra_flags = CRYPTO_ALG_TYPE_AHASH |
2943 					     CRYPTO_ALG_ASYNC,
2944 			}
2945 		},
2946 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2947 				     DESC_HDR_SEL0_MDEUA |
2948 				     DESC_HDR_MODE0_MDEU_SHA256,
2949 	},
2950 	{	.type = CRYPTO_ALG_TYPE_AHASH,
2951 		.alg.hash = {
2952 			.halg.digestsize = SHA384_DIGEST_SIZE,
2953 			.halg.statesize = sizeof(struct talitos_export_state),
2954 			.halg.base = {
2955 				.cra_name = "hmac(sha384)",
2956 				.cra_driver_name = "hmac-sha384-talitos",
2957 				.cra_blocksize = SHA384_BLOCK_SIZE,
2958 				.cra_flags = CRYPTO_ALG_TYPE_AHASH |
2959 					     CRYPTO_ALG_ASYNC,
2960 			}
2961 		},
2962 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2963 				     DESC_HDR_SEL0_MDEUB |
2964 				     DESC_HDR_MODE0_MDEUB_SHA384,
2965 	},
2966 	{	.type = CRYPTO_ALG_TYPE_AHASH,
2967 		.alg.hash = {
2968 			.halg.digestsize = SHA512_DIGEST_SIZE,
2969 			.halg.statesize = sizeof(struct talitos_export_state),
2970 			.halg.base = {
2971 				.cra_name = "hmac(sha512)",
2972 				.cra_driver_name = "hmac-sha512-talitos",
2973 				.cra_blocksize = SHA512_BLOCK_SIZE,
2974 				.cra_flags = CRYPTO_ALG_TYPE_AHASH |
2975 					     CRYPTO_ALG_ASYNC,
2976 			}
2977 		},
2978 		.desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2979 				     DESC_HDR_SEL0_MDEUB |
2980 				     DESC_HDR_MODE0_MDEUB_SHA512,
2981 	}
2982 };
2983 
2984 struct talitos_crypto_alg {
2985 	struct list_head entry;
2986 	struct device *dev;
2987 	struct talitos_alg_template algt;
2988 };
2989 
2990 static int talitos_init_common(struct talitos_ctx *ctx,
2991 			       struct talitos_crypto_alg *talitos_alg)
2992 {
2993 	struct talitos_private *priv;
2994 
2995 	/* update context with ptr to dev */
2996 	ctx->dev = talitos_alg->dev;
2997 
2998 	/* assign SEC channel to tfm in round-robin fashion */
2999 	priv = dev_get_drvdata(ctx->dev);
3000 	ctx->ch = atomic_inc_return(&priv->last_chan) &
3001 		  (priv->num_channels - 1);
3002 
3003 	/* copy descriptor header template value */
3004 	ctx->desc_hdr_template = talitos_alg->algt.desc_hdr_template;
3005 
3006 	/* select done notification */
3007 	ctx->desc_hdr_template |= DESC_HDR_DONE_NOTIFY;
3008 
3009 	return 0;
3010 }
3011 
3012 static int talitos_cra_init(struct crypto_tfm *tfm)
3013 {
3014 	struct crypto_alg *alg = tfm->__crt_alg;
3015 	struct talitos_crypto_alg *talitos_alg;
3016 	struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3017 
3018 	if ((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_AHASH)
3019 		talitos_alg = container_of(__crypto_ahash_alg(alg),
3020 					   struct talitos_crypto_alg,
3021 					   algt.alg.hash);
3022 	else
3023 		talitos_alg = container_of(alg, struct talitos_crypto_alg,
3024 					   algt.alg.crypto);
3025 
3026 	return talitos_init_common(ctx, talitos_alg);
3027 }
3028 
3029 static int talitos_cra_init_aead(struct crypto_aead *tfm)
3030 {
3031 	struct aead_alg *alg = crypto_aead_alg(tfm);
3032 	struct talitos_crypto_alg *talitos_alg;
3033 	struct talitos_ctx *ctx = crypto_aead_ctx(tfm);
3034 
3035 	talitos_alg = container_of(alg, struct talitos_crypto_alg,
3036 				   algt.alg.aead);
3037 
3038 	return talitos_init_common(ctx, talitos_alg);
3039 }
3040 
3041 static int talitos_cra_init_ahash(struct crypto_tfm *tfm)
3042 {
3043 	struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3044 
3045 	talitos_cra_init(tfm);
3046 
3047 	ctx->keylen = 0;
3048 	crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
3049 				 sizeof(struct talitos_ahash_req_ctx));
3050 
3051 	return 0;
3052 }
3053 
3054 static void talitos_cra_exit(struct crypto_tfm *tfm)
3055 {
3056 	struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3057 	struct device *dev = ctx->dev;
3058 
3059 	if (ctx->keylen)
3060 		dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
3061 }
3062 
3063 static void talitos_cra_exit_ahash(struct crypto_tfm *tfm)
3064 {
3065 	struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3066 	struct device *dev = ctx->dev;
3067 	unsigned int size;
3068 
3069 	talitos_cra_exit(tfm);
3070 
3071 	size = (crypto_ahash_digestsize(__crypto_ahash_cast(tfm)) <=
3072 		SHA256_DIGEST_SIZE)
3073 	       ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256
3074 	       : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512;
3075 
3076 	if (ctx->dma_hw_context)
3077 		dma_unmap_single(dev, ctx->dma_hw_context, size,
3078 				 DMA_BIDIRECTIONAL);
3079 	if (ctx->dma_buf)
3080 		dma_unmap_single(dev, ctx->dma_buf, HASH_MAX_BLOCK_SIZE * 2,
3081 				 DMA_TO_DEVICE);
3082 }
3083 
3084 /*
3085  * given the alg's descriptor header template, determine whether descriptor
3086  * type and primary/secondary execution units required match the hw
3087  * capabilities description provided in the device tree node.
3088  */
3089 static int hw_supports(struct device *dev, __be32 desc_hdr_template)
3090 {
3091 	struct talitos_private *priv = dev_get_drvdata(dev);
3092 	int ret;
3093 
3094 	ret = (1 << DESC_TYPE(desc_hdr_template) & priv->desc_types) &&
3095 	      (1 << PRIMARY_EU(desc_hdr_template) & priv->exec_units);
3096 
3097 	if (SECONDARY_EU(desc_hdr_template))
3098 		ret = ret && (1 << SECONDARY_EU(desc_hdr_template)
3099 		              & priv->exec_units);
3100 
3101 	return ret;
3102 }
3103 
3104 static int talitos_remove(struct platform_device *ofdev)
3105 {
3106 	struct device *dev = &ofdev->dev;
3107 	struct talitos_private *priv = dev_get_drvdata(dev);
3108 	struct talitos_crypto_alg *t_alg, *n;
3109 	int i;
3110 
3111 	list_for_each_entry_safe(t_alg, n, &priv->alg_list, entry) {
3112 		switch (t_alg->algt.type) {
3113 		case CRYPTO_ALG_TYPE_ABLKCIPHER:
3114 			break;
3115 		case CRYPTO_ALG_TYPE_AEAD:
3116 			crypto_unregister_aead(&t_alg->algt.alg.aead);
3117 		case CRYPTO_ALG_TYPE_AHASH:
3118 			crypto_unregister_ahash(&t_alg->algt.alg.hash);
3119 			break;
3120 		}
3121 		list_del(&t_alg->entry);
3122 	}
3123 
3124 	if (hw_supports(dev, DESC_HDR_SEL0_RNG))
3125 		talitos_unregister_rng(dev);
3126 
3127 	for (i = 0; i < 2; i++)
3128 		if (priv->irq[i]) {
3129 			free_irq(priv->irq[i], dev);
3130 			irq_dispose_mapping(priv->irq[i]);
3131 		}
3132 
3133 	tasklet_kill(&priv->done_task[0]);
3134 	if (priv->irq[1])
3135 		tasklet_kill(&priv->done_task[1]);
3136 
3137 	return 0;
3138 }
3139 
3140 static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev,
3141 						    struct talitos_alg_template
3142 						           *template)
3143 {
3144 	struct talitos_private *priv = dev_get_drvdata(dev);
3145 	struct talitos_crypto_alg *t_alg;
3146 	struct crypto_alg *alg;
3147 
3148 	t_alg = devm_kzalloc(dev, sizeof(struct talitos_crypto_alg),
3149 			     GFP_KERNEL);
3150 	if (!t_alg)
3151 		return ERR_PTR(-ENOMEM);
3152 
3153 	t_alg->algt = *template;
3154 
3155 	switch (t_alg->algt.type) {
3156 	case CRYPTO_ALG_TYPE_ABLKCIPHER:
3157 		alg = &t_alg->algt.alg.crypto;
3158 		alg->cra_init = talitos_cra_init;
3159 		alg->cra_exit = talitos_cra_exit;
3160 		alg->cra_type = &crypto_ablkcipher_type;
3161 		alg->cra_ablkcipher.setkey = ablkcipher_setkey;
3162 		alg->cra_ablkcipher.encrypt = ablkcipher_encrypt;
3163 		alg->cra_ablkcipher.decrypt = ablkcipher_decrypt;
3164 		alg->cra_ablkcipher.geniv = "eseqiv";
3165 		break;
3166 	case CRYPTO_ALG_TYPE_AEAD:
3167 		alg = &t_alg->algt.alg.aead.base;
3168 		alg->cra_exit = talitos_cra_exit;
3169 		t_alg->algt.alg.aead.init = talitos_cra_init_aead;
3170 		t_alg->algt.alg.aead.setkey = aead_setkey;
3171 		t_alg->algt.alg.aead.encrypt = aead_encrypt;
3172 		t_alg->algt.alg.aead.decrypt = aead_decrypt;
3173 		if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) &&
3174 		    !strncmp(alg->cra_name, "authenc(hmac(sha224)", 20)) {
3175 			devm_kfree(dev, t_alg);
3176 			return ERR_PTR(-ENOTSUPP);
3177 		}
3178 		break;
3179 	case CRYPTO_ALG_TYPE_AHASH:
3180 		alg = &t_alg->algt.alg.hash.halg.base;
3181 		alg->cra_init = talitos_cra_init_ahash;
3182 		alg->cra_exit = talitos_cra_exit_ahash;
3183 		alg->cra_type = &crypto_ahash_type;
3184 		t_alg->algt.alg.hash.init = ahash_init;
3185 		t_alg->algt.alg.hash.update = ahash_update;
3186 		t_alg->algt.alg.hash.final = ahash_final;
3187 		t_alg->algt.alg.hash.finup = ahash_finup;
3188 		t_alg->algt.alg.hash.digest = ahash_digest;
3189 		if (!strncmp(alg->cra_name, "hmac", 4))
3190 			t_alg->algt.alg.hash.setkey = ahash_setkey;
3191 		t_alg->algt.alg.hash.import = ahash_import;
3192 		t_alg->algt.alg.hash.export = ahash_export;
3193 
3194 		if (!(priv->features & TALITOS_FTR_HMAC_OK) &&
3195 		    !strncmp(alg->cra_name, "hmac", 4)) {
3196 			devm_kfree(dev, t_alg);
3197 			return ERR_PTR(-ENOTSUPP);
3198 		}
3199 		if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) &&
3200 		    (!strcmp(alg->cra_name, "sha224") ||
3201 		     !strcmp(alg->cra_name, "hmac(sha224)"))) {
3202 			t_alg->algt.alg.hash.init = ahash_init_sha224_swinit;
3203 			t_alg->algt.desc_hdr_template =
3204 					DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
3205 					DESC_HDR_SEL0_MDEUA |
3206 					DESC_HDR_MODE0_MDEU_SHA256;
3207 		}
3208 		break;
3209 	default:
3210 		dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type);
3211 		devm_kfree(dev, t_alg);
3212 		return ERR_PTR(-EINVAL);
3213 	}
3214 
3215 	alg->cra_module = THIS_MODULE;
3216 	if (t_alg->algt.priority)
3217 		alg->cra_priority = t_alg->algt.priority;
3218 	else
3219 		alg->cra_priority = TALITOS_CRA_PRIORITY;
3220 	alg->cra_alignmask = 0;
3221 	alg->cra_ctxsize = sizeof(struct talitos_ctx);
3222 	alg->cra_flags |= CRYPTO_ALG_KERN_DRIVER_ONLY;
3223 
3224 	t_alg->dev = dev;
3225 
3226 	return t_alg;
3227 }
3228 
3229 static int talitos_probe_irq(struct platform_device *ofdev)
3230 {
3231 	struct device *dev = &ofdev->dev;
3232 	struct device_node *np = ofdev->dev.of_node;
3233 	struct talitos_private *priv = dev_get_drvdata(dev);
3234 	int err;
3235 	bool is_sec1 = has_ftr_sec1(priv);
3236 
3237 	priv->irq[0] = irq_of_parse_and_map(np, 0);
3238 	if (!priv->irq[0]) {
3239 		dev_err(dev, "failed to map irq\n");
3240 		return -EINVAL;
3241 	}
3242 	if (is_sec1) {
3243 		err = request_irq(priv->irq[0], talitos1_interrupt_4ch, 0,
3244 				  dev_driver_string(dev), dev);
3245 		goto primary_out;
3246 	}
3247 
3248 	priv->irq[1] = irq_of_parse_and_map(np, 1);
3249 
3250 	/* get the primary irq line */
3251 	if (!priv->irq[1]) {
3252 		err = request_irq(priv->irq[0], talitos2_interrupt_4ch, 0,
3253 				  dev_driver_string(dev), dev);
3254 		goto primary_out;
3255 	}
3256 
3257 	err = request_irq(priv->irq[0], talitos2_interrupt_ch0_2, 0,
3258 			  dev_driver_string(dev), dev);
3259 	if (err)
3260 		goto primary_out;
3261 
3262 	/* get the secondary irq line */
3263 	err = request_irq(priv->irq[1], talitos2_interrupt_ch1_3, 0,
3264 			  dev_driver_string(dev), dev);
3265 	if (err) {
3266 		dev_err(dev, "failed to request secondary irq\n");
3267 		irq_dispose_mapping(priv->irq[1]);
3268 		priv->irq[1] = 0;
3269 	}
3270 
3271 	return err;
3272 
3273 primary_out:
3274 	if (err) {
3275 		dev_err(dev, "failed to request primary irq\n");
3276 		irq_dispose_mapping(priv->irq[0]);
3277 		priv->irq[0] = 0;
3278 	}
3279 
3280 	return err;
3281 }
3282 
3283 static int talitos_probe(struct platform_device *ofdev)
3284 {
3285 	struct device *dev = &ofdev->dev;
3286 	struct device_node *np = ofdev->dev.of_node;
3287 	struct talitos_private *priv;
3288 	int i, err;
3289 	int stride;
3290 	struct resource *res;
3291 
3292 	priv = devm_kzalloc(dev, sizeof(struct talitos_private), GFP_KERNEL);
3293 	if (!priv)
3294 		return -ENOMEM;
3295 
3296 	INIT_LIST_HEAD(&priv->alg_list);
3297 
3298 	dev_set_drvdata(dev, priv);
3299 
3300 	priv->ofdev = ofdev;
3301 
3302 	spin_lock_init(&priv->reg_lock);
3303 
3304 	res = platform_get_resource(ofdev, IORESOURCE_MEM, 0);
3305 	if (!res)
3306 		return -ENXIO;
3307 	priv->reg = devm_ioremap(dev, res->start, resource_size(res));
3308 	if (!priv->reg) {
3309 		dev_err(dev, "failed to of_iomap\n");
3310 		err = -ENOMEM;
3311 		goto err_out;
3312 	}
3313 
3314 	/* get SEC version capabilities from device tree */
3315 	of_property_read_u32(np, "fsl,num-channels", &priv->num_channels);
3316 	of_property_read_u32(np, "fsl,channel-fifo-len", &priv->chfifo_len);
3317 	of_property_read_u32(np, "fsl,exec-units-mask", &priv->exec_units);
3318 	of_property_read_u32(np, "fsl,descriptor-types-mask",
3319 			     &priv->desc_types);
3320 
3321 	if (!is_power_of_2(priv->num_channels) || !priv->chfifo_len ||
3322 	    !priv->exec_units || !priv->desc_types) {
3323 		dev_err(dev, "invalid property data in device tree node\n");
3324 		err = -EINVAL;
3325 		goto err_out;
3326 	}
3327 
3328 	if (of_device_is_compatible(np, "fsl,sec3.0"))
3329 		priv->features |= TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT;
3330 
3331 	if (of_device_is_compatible(np, "fsl,sec2.1"))
3332 		priv->features |= TALITOS_FTR_HW_AUTH_CHECK |
3333 				  TALITOS_FTR_SHA224_HWINIT |
3334 				  TALITOS_FTR_HMAC_OK;
3335 
3336 	if (of_device_is_compatible(np, "fsl,sec1.0"))
3337 		priv->features |= TALITOS_FTR_SEC1;
3338 
3339 	if (of_device_is_compatible(np, "fsl,sec1.2")) {
3340 		priv->reg_deu = priv->reg + TALITOS12_DEU;
3341 		priv->reg_aesu = priv->reg + TALITOS12_AESU;
3342 		priv->reg_mdeu = priv->reg + TALITOS12_MDEU;
3343 		stride = TALITOS1_CH_STRIDE;
3344 	} else if (of_device_is_compatible(np, "fsl,sec1.0")) {
3345 		priv->reg_deu = priv->reg + TALITOS10_DEU;
3346 		priv->reg_aesu = priv->reg + TALITOS10_AESU;
3347 		priv->reg_mdeu = priv->reg + TALITOS10_MDEU;
3348 		priv->reg_afeu = priv->reg + TALITOS10_AFEU;
3349 		priv->reg_rngu = priv->reg + TALITOS10_RNGU;
3350 		priv->reg_pkeu = priv->reg + TALITOS10_PKEU;
3351 		stride = TALITOS1_CH_STRIDE;
3352 	} else {
3353 		priv->reg_deu = priv->reg + TALITOS2_DEU;
3354 		priv->reg_aesu = priv->reg + TALITOS2_AESU;
3355 		priv->reg_mdeu = priv->reg + TALITOS2_MDEU;
3356 		priv->reg_afeu = priv->reg + TALITOS2_AFEU;
3357 		priv->reg_rngu = priv->reg + TALITOS2_RNGU;
3358 		priv->reg_pkeu = priv->reg + TALITOS2_PKEU;
3359 		priv->reg_keu = priv->reg + TALITOS2_KEU;
3360 		priv->reg_crcu = priv->reg + TALITOS2_CRCU;
3361 		stride = TALITOS2_CH_STRIDE;
3362 	}
3363 
3364 	err = talitos_probe_irq(ofdev);
3365 	if (err)
3366 		goto err_out;
3367 
3368 	if (of_device_is_compatible(np, "fsl,sec1.0")) {
3369 		if (priv->num_channels == 1)
3370 			tasklet_init(&priv->done_task[0], talitos1_done_ch0,
3371 				     (unsigned long)dev);
3372 		else
3373 			tasklet_init(&priv->done_task[0], talitos1_done_4ch,
3374 				     (unsigned long)dev);
3375 	} else {
3376 		if (priv->irq[1]) {
3377 			tasklet_init(&priv->done_task[0], talitos2_done_ch0_2,
3378 				     (unsigned long)dev);
3379 			tasklet_init(&priv->done_task[1], talitos2_done_ch1_3,
3380 				     (unsigned long)dev);
3381 		} else if (priv->num_channels == 1) {
3382 			tasklet_init(&priv->done_task[0], talitos2_done_ch0,
3383 				     (unsigned long)dev);
3384 		} else {
3385 			tasklet_init(&priv->done_task[0], talitos2_done_4ch,
3386 				     (unsigned long)dev);
3387 		}
3388 	}
3389 
3390 	priv->chan = devm_kzalloc(dev, sizeof(struct talitos_channel) *
3391 				       priv->num_channels, GFP_KERNEL);
3392 	if (!priv->chan) {
3393 		dev_err(dev, "failed to allocate channel management space\n");
3394 		err = -ENOMEM;
3395 		goto err_out;
3396 	}
3397 
3398 	priv->fifo_len = roundup_pow_of_two(priv->chfifo_len);
3399 
3400 	for (i = 0; i < priv->num_channels; i++) {
3401 		priv->chan[i].reg = priv->reg + stride * (i + 1);
3402 		if (!priv->irq[1] || !(i & 1))
3403 			priv->chan[i].reg += TALITOS_CH_BASE_OFFSET;
3404 
3405 		spin_lock_init(&priv->chan[i].head_lock);
3406 		spin_lock_init(&priv->chan[i].tail_lock);
3407 
3408 		priv->chan[i].fifo = devm_kzalloc(dev,
3409 						sizeof(struct talitos_request) *
3410 						priv->fifo_len, GFP_KERNEL);
3411 		if (!priv->chan[i].fifo) {
3412 			dev_err(dev, "failed to allocate request fifo %d\n", i);
3413 			err = -ENOMEM;
3414 			goto err_out;
3415 		}
3416 
3417 		atomic_set(&priv->chan[i].submit_count,
3418 			   -(priv->chfifo_len - 1));
3419 	}
3420 
3421 	dma_set_mask(dev, DMA_BIT_MASK(36));
3422 
3423 	/* reset and initialize the h/w */
3424 	err = init_device(dev);
3425 	if (err) {
3426 		dev_err(dev, "failed to initialize device\n");
3427 		goto err_out;
3428 	}
3429 
3430 	/* register the RNG, if available */
3431 	if (hw_supports(dev, DESC_HDR_SEL0_RNG)) {
3432 		err = talitos_register_rng(dev);
3433 		if (err) {
3434 			dev_err(dev, "failed to register hwrng: %d\n", err);
3435 			goto err_out;
3436 		} else
3437 			dev_info(dev, "hwrng\n");
3438 	}
3439 
3440 	/* register crypto algorithms the device supports */
3441 	for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
3442 		if (hw_supports(dev, driver_algs[i].desc_hdr_template)) {
3443 			struct talitos_crypto_alg *t_alg;
3444 			struct crypto_alg *alg = NULL;
3445 
3446 			t_alg = talitos_alg_alloc(dev, &driver_algs[i]);
3447 			if (IS_ERR(t_alg)) {
3448 				err = PTR_ERR(t_alg);
3449 				if (err == -ENOTSUPP)
3450 					continue;
3451 				goto err_out;
3452 			}
3453 
3454 			switch (t_alg->algt.type) {
3455 			case CRYPTO_ALG_TYPE_ABLKCIPHER:
3456 				err = crypto_register_alg(
3457 						&t_alg->algt.alg.crypto);
3458 				alg = &t_alg->algt.alg.crypto;
3459 				break;
3460 
3461 			case CRYPTO_ALG_TYPE_AEAD:
3462 				err = crypto_register_aead(
3463 					&t_alg->algt.alg.aead);
3464 				alg = &t_alg->algt.alg.aead.base;
3465 				break;
3466 
3467 			case CRYPTO_ALG_TYPE_AHASH:
3468 				err = crypto_register_ahash(
3469 						&t_alg->algt.alg.hash);
3470 				alg = &t_alg->algt.alg.hash.halg.base;
3471 				break;
3472 			}
3473 			if (err) {
3474 				dev_err(dev, "%s alg registration failed\n",
3475 					alg->cra_driver_name);
3476 				devm_kfree(dev, t_alg);
3477 			} else
3478 				list_add_tail(&t_alg->entry, &priv->alg_list);
3479 		}
3480 	}
3481 	if (!list_empty(&priv->alg_list))
3482 		dev_info(dev, "%s algorithms registered in /proc/crypto\n",
3483 			 (char *)of_get_property(np, "compatible", NULL));
3484 
3485 	return 0;
3486 
3487 err_out:
3488 	talitos_remove(ofdev);
3489 
3490 	return err;
3491 }
3492 
3493 static const struct of_device_id talitos_match[] = {
3494 #ifdef CONFIG_CRYPTO_DEV_TALITOS1
3495 	{
3496 		.compatible = "fsl,sec1.0",
3497 	},
3498 #endif
3499 #ifdef CONFIG_CRYPTO_DEV_TALITOS2
3500 	{
3501 		.compatible = "fsl,sec2.0",
3502 	},
3503 #endif
3504 	{},
3505 };
3506 MODULE_DEVICE_TABLE(of, talitos_match);
3507 
3508 static struct platform_driver talitos_driver = {
3509 	.driver = {
3510 		.name = "talitos",
3511 		.of_match_table = talitos_match,
3512 	},
3513 	.probe = talitos_probe,
3514 	.remove = talitos_remove,
3515 };
3516 
3517 module_platform_driver(talitos_driver);
3518 
3519 MODULE_LICENSE("GPL");
3520 MODULE_AUTHOR("Kim Phillips <kim.phillips@freescale.com>");
3521 MODULE_DESCRIPTION("Freescale integrated security engine (SEC) driver");
3522