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