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