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