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