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