1 /**
2  * AMCC SoC PPC4xx Crypto Driver
3  *
4  * Copyright (c) 2008 Applied Micro Circuits Corporation.
5  * All rights reserved. James Hsiao <jhsiao@amcc.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * This file implements AMCC crypto offload Linux device driver for use with
18  * Linux CryptoAPI.
19  */
20 
21 #include <linux/kernel.h>
22 #include <linux/interrupt.h>
23 #include <linux/spinlock_types.h>
24 #include <linux/random.h>
25 #include <linux/scatterlist.h>
26 #include <linux/crypto.h>
27 #include <linux/dma-mapping.h>
28 #include <linux/platform_device.h>
29 #include <linux/init.h>
30 #include <linux/of_platform.h>
31 #include <linux/slab.h>
32 #include <asm/dcr.h>
33 #include <asm/dcr-regs.h>
34 #include <asm/cacheflush.h>
35 #include <crypto/aes.h>
36 #include <crypto/sha.h>
37 #include "crypto4xx_reg_def.h"
38 #include "crypto4xx_core.h"
39 #include "crypto4xx_sa.h"
40 
41 #define PPC4XX_SEC_VERSION_STR			"0.5"
42 
43 /**
44  * PPC4xx Crypto Engine Initialization Routine
45  */
46 static void crypto4xx_hw_init(struct crypto4xx_device *dev)
47 {
48 	union ce_ring_size ring_size;
49 	union ce_ring_contol ring_ctrl;
50 	union ce_part_ring_size part_ring_size;
51 	union ce_io_threshold io_threshold;
52 	u32 rand_num;
53 	union ce_pe_dma_cfg pe_dma_cfg;
54 	u32 device_ctrl;
55 
56 	writel(PPC4XX_BYTE_ORDER, dev->ce_base + CRYPTO4XX_BYTE_ORDER_CFG);
57 	/* setup pe dma, include reset sg, pdr and pe, then release reset */
58 	pe_dma_cfg.w = 0;
59 	pe_dma_cfg.bf.bo_sgpd_en = 1;
60 	pe_dma_cfg.bf.bo_data_en = 0;
61 	pe_dma_cfg.bf.bo_sa_en = 1;
62 	pe_dma_cfg.bf.bo_pd_en = 1;
63 	pe_dma_cfg.bf.dynamic_sa_en = 1;
64 	pe_dma_cfg.bf.reset_sg = 1;
65 	pe_dma_cfg.bf.reset_pdr = 1;
66 	pe_dma_cfg.bf.reset_pe = 1;
67 	writel(pe_dma_cfg.w, dev->ce_base + CRYPTO4XX_PE_DMA_CFG);
68 	/* un reset pe,sg and pdr */
69 	pe_dma_cfg.bf.pe_mode = 0;
70 	pe_dma_cfg.bf.reset_sg = 0;
71 	pe_dma_cfg.bf.reset_pdr = 0;
72 	pe_dma_cfg.bf.reset_pe = 0;
73 	pe_dma_cfg.bf.bo_td_en = 0;
74 	writel(pe_dma_cfg.w, dev->ce_base + CRYPTO4XX_PE_DMA_CFG);
75 	writel(dev->pdr_pa, dev->ce_base + CRYPTO4XX_PDR_BASE);
76 	writel(dev->pdr_pa, dev->ce_base + CRYPTO4XX_RDR_BASE);
77 	writel(PPC4XX_PRNG_CTRL_AUTO_EN, dev->ce_base + CRYPTO4XX_PRNG_CTRL);
78 	get_random_bytes(&rand_num, sizeof(rand_num));
79 	writel(rand_num, dev->ce_base + CRYPTO4XX_PRNG_SEED_L);
80 	get_random_bytes(&rand_num, sizeof(rand_num));
81 	writel(rand_num, dev->ce_base + CRYPTO4XX_PRNG_SEED_H);
82 	ring_size.w = 0;
83 	ring_size.bf.ring_offset = PPC4XX_PD_SIZE;
84 	ring_size.bf.ring_size   = PPC4XX_NUM_PD;
85 	writel(ring_size.w, dev->ce_base + CRYPTO4XX_RING_SIZE);
86 	ring_ctrl.w = 0;
87 	writel(ring_ctrl.w, dev->ce_base + CRYPTO4XX_RING_CTRL);
88 	device_ctrl = readl(dev->ce_base + CRYPTO4XX_DEVICE_CTRL);
89 	device_ctrl |= PPC4XX_DC_3DES_EN;
90 	writel(device_ctrl, dev->ce_base + CRYPTO4XX_DEVICE_CTRL);
91 	writel(dev->gdr_pa, dev->ce_base + CRYPTO4XX_GATH_RING_BASE);
92 	writel(dev->sdr_pa, dev->ce_base + CRYPTO4XX_SCAT_RING_BASE);
93 	part_ring_size.w = 0;
94 	part_ring_size.bf.sdr_size = PPC4XX_SDR_SIZE;
95 	part_ring_size.bf.gdr_size = PPC4XX_GDR_SIZE;
96 	writel(part_ring_size.w, dev->ce_base + CRYPTO4XX_PART_RING_SIZE);
97 	writel(PPC4XX_SD_BUFFER_SIZE, dev->ce_base + CRYPTO4XX_PART_RING_CFG);
98 	io_threshold.w = 0;
99 	io_threshold.bf.output_threshold = PPC4XX_OUTPUT_THRESHOLD;
100 	io_threshold.bf.input_threshold  = PPC4XX_INPUT_THRESHOLD;
101 	writel(io_threshold.w, dev->ce_base + CRYPTO4XX_IO_THRESHOLD);
102 	writel(0, dev->ce_base + CRYPTO4XX_PDR_BASE_UADDR);
103 	writel(0, dev->ce_base + CRYPTO4XX_RDR_BASE_UADDR);
104 	writel(0, dev->ce_base + CRYPTO4XX_PKT_SRC_UADDR);
105 	writel(0, dev->ce_base + CRYPTO4XX_PKT_DEST_UADDR);
106 	writel(0, dev->ce_base + CRYPTO4XX_SA_UADDR);
107 	writel(0, dev->ce_base + CRYPTO4XX_GATH_RING_BASE_UADDR);
108 	writel(0, dev->ce_base + CRYPTO4XX_SCAT_RING_BASE_UADDR);
109 	/* un reset pe,sg and pdr */
110 	pe_dma_cfg.bf.pe_mode = 1;
111 	pe_dma_cfg.bf.reset_sg = 0;
112 	pe_dma_cfg.bf.reset_pdr = 0;
113 	pe_dma_cfg.bf.reset_pe = 0;
114 	pe_dma_cfg.bf.bo_td_en = 0;
115 	writel(pe_dma_cfg.w, dev->ce_base + CRYPTO4XX_PE_DMA_CFG);
116 	/*clear all pending interrupt*/
117 	writel(PPC4XX_INTERRUPT_CLR, dev->ce_base + CRYPTO4XX_INT_CLR);
118 	writel(PPC4XX_INT_DESCR_CNT, dev->ce_base + CRYPTO4XX_INT_DESCR_CNT);
119 	writel(PPC4XX_INT_DESCR_CNT, dev->ce_base + CRYPTO4XX_INT_DESCR_CNT);
120 	writel(PPC4XX_INT_CFG, dev->ce_base + CRYPTO4XX_INT_CFG);
121 	writel(PPC4XX_PD_DONE_INT, dev->ce_base + CRYPTO4XX_INT_EN);
122 }
123 
124 int crypto4xx_alloc_sa(struct crypto4xx_ctx *ctx, u32 size)
125 {
126 	ctx->sa_in = dma_alloc_coherent(ctx->dev->core_dev->device, size * 4,
127 					&ctx->sa_in_dma_addr, GFP_ATOMIC);
128 	if (ctx->sa_in == NULL)
129 		return -ENOMEM;
130 
131 	ctx->sa_out = dma_alloc_coherent(ctx->dev->core_dev->device, size * 4,
132 					 &ctx->sa_out_dma_addr, GFP_ATOMIC);
133 	if (ctx->sa_out == NULL) {
134 		dma_free_coherent(ctx->dev->core_dev->device,
135 				  ctx->sa_len * 4,
136 				  ctx->sa_in, ctx->sa_in_dma_addr);
137 		return -ENOMEM;
138 	}
139 
140 	memset(ctx->sa_in, 0, size * 4);
141 	memset(ctx->sa_out, 0, size * 4);
142 	ctx->sa_len = size;
143 
144 	return 0;
145 }
146 
147 void crypto4xx_free_sa(struct crypto4xx_ctx *ctx)
148 {
149 	if (ctx->sa_in != NULL)
150 		dma_free_coherent(ctx->dev->core_dev->device, ctx->sa_len * 4,
151 				  ctx->sa_in, ctx->sa_in_dma_addr);
152 	if (ctx->sa_out != NULL)
153 		dma_free_coherent(ctx->dev->core_dev->device, ctx->sa_len * 4,
154 				  ctx->sa_out, ctx->sa_out_dma_addr);
155 
156 	ctx->sa_in_dma_addr = 0;
157 	ctx->sa_out_dma_addr = 0;
158 	ctx->sa_len = 0;
159 }
160 
161 u32 crypto4xx_alloc_state_record(struct crypto4xx_ctx *ctx)
162 {
163 	ctx->state_record = dma_alloc_coherent(ctx->dev->core_dev->device,
164 				sizeof(struct sa_state_record),
165 				&ctx->state_record_dma_addr, GFP_ATOMIC);
166 	if (!ctx->state_record_dma_addr)
167 		return -ENOMEM;
168 	memset(ctx->state_record, 0, sizeof(struct sa_state_record));
169 
170 	return 0;
171 }
172 
173 void crypto4xx_free_state_record(struct crypto4xx_ctx *ctx)
174 {
175 	if (ctx->state_record != NULL)
176 		dma_free_coherent(ctx->dev->core_dev->device,
177 				  sizeof(struct sa_state_record),
178 				  ctx->state_record,
179 				  ctx->state_record_dma_addr);
180 	ctx->state_record_dma_addr = 0;
181 }
182 
183 /**
184  * alloc memory for the gather ring
185  * no need to alloc buf for the ring
186  * gdr_tail, gdr_head and gdr_count are initialized by this function
187  */
188 static u32 crypto4xx_build_pdr(struct crypto4xx_device *dev)
189 {
190 	int i;
191 	struct pd_uinfo *pd_uinfo;
192 	dev->pdr = dma_alloc_coherent(dev->core_dev->device,
193 				      sizeof(struct ce_pd) * PPC4XX_NUM_PD,
194 				      &dev->pdr_pa, GFP_ATOMIC);
195 	if (!dev->pdr)
196 		return -ENOMEM;
197 
198 	dev->pdr_uinfo = kzalloc(sizeof(struct pd_uinfo) * PPC4XX_NUM_PD,
199 				GFP_KERNEL);
200 	if (!dev->pdr_uinfo) {
201 		dma_free_coherent(dev->core_dev->device,
202 				  sizeof(struct ce_pd) * PPC4XX_NUM_PD,
203 				  dev->pdr,
204 				  dev->pdr_pa);
205 		return -ENOMEM;
206 	}
207 	memset(dev->pdr, 0,  sizeof(struct ce_pd) * PPC4XX_NUM_PD);
208 	dev->shadow_sa_pool = dma_alloc_coherent(dev->core_dev->device,
209 				   256 * PPC4XX_NUM_PD,
210 				   &dev->shadow_sa_pool_pa,
211 				   GFP_ATOMIC);
212 	if (!dev->shadow_sa_pool)
213 		return -ENOMEM;
214 
215 	dev->shadow_sr_pool = dma_alloc_coherent(dev->core_dev->device,
216 			 sizeof(struct sa_state_record) * PPC4XX_NUM_PD,
217 			 &dev->shadow_sr_pool_pa, GFP_ATOMIC);
218 	if (!dev->shadow_sr_pool)
219 		return -ENOMEM;
220 	for (i = 0; i < PPC4XX_NUM_PD; i++) {
221 		pd_uinfo = (struct pd_uinfo *) (dev->pdr_uinfo +
222 						sizeof(struct pd_uinfo) * i);
223 
224 		/* alloc 256 bytes which is enough for any kind of dynamic sa */
225 		pd_uinfo->sa_va = dev->shadow_sa_pool + 256 * i;
226 		pd_uinfo->sa_pa = dev->shadow_sa_pool_pa + 256 * i;
227 
228 		/* alloc state record */
229 		pd_uinfo->sr_va = dev->shadow_sr_pool +
230 		    sizeof(struct sa_state_record) * i;
231 		pd_uinfo->sr_pa = dev->shadow_sr_pool_pa +
232 		    sizeof(struct sa_state_record) * i;
233 	}
234 
235 	return 0;
236 }
237 
238 static void crypto4xx_destroy_pdr(struct crypto4xx_device *dev)
239 {
240 	if (dev->pdr != NULL)
241 		dma_free_coherent(dev->core_dev->device,
242 				  sizeof(struct ce_pd) * PPC4XX_NUM_PD,
243 				  dev->pdr, dev->pdr_pa);
244 	if (dev->shadow_sa_pool)
245 		dma_free_coherent(dev->core_dev->device, 256 * PPC4XX_NUM_PD,
246 				  dev->shadow_sa_pool, dev->shadow_sa_pool_pa);
247 	if (dev->shadow_sr_pool)
248 		dma_free_coherent(dev->core_dev->device,
249 			sizeof(struct sa_state_record) * PPC4XX_NUM_PD,
250 			dev->shadow_sr_pool, dev->shadow_sr_pool_pa);
251 
252 	kfree(dev->pdr_uinfo);
253 }
254 
255 static u32 crypto4xx_get_pd_from_pdr_nolock(struct crypto4xx_device *dev)
256 {
257 	u32 retval;
258 	u32 tmp;
259 
260 	retval = dev->pdr_head;
261 	tmp = (dev->pdr_head + 1) % PPC4XX_NUM_PD;
262 
263 	if (tmp == dev->pdr_tail)
264 		return ERING_WAS_FULL;
265 
266 	dev->pdr_head = tmp;
267 
268 	return retval;
269 }
270 
271 static u32 crypto4xx_put_pd_to_pdr(struct crypto4xx_device *dev, u32 idx)
272 {
273 	struct pd_uinfo *pd_uinfo;
274 	unsigned long flags;
275 
276 	pd_uinfo = (struct pd_uinfo *)(dev->pdr_uinfo +
277 				       sizeof(struct pd_uinfo) * idx);
278 	spin_lock_irqsave(&dev->core_dev->lock, flags);
279 	if (dev->pdr_tail != PPC4XX_LAST_PD)
280 		dev->pdr_tail++;
281 	else
282 		dev->pdr_tail = 0;
283 	pd_uinfo->state = PD_ENTRY_FREE;
284 	spin_unlock_irqrestore(&dev->core_dev->lock, flags);
285 
286 	return 0;
287 }
288 
289 static struct ce_pd *crypto4xx_get_pdp(struct crypto4xx_device *dev,
290 				       dma_addr_t *pd_dma, u32 idx)
291 {
292 	*pd_dma = dev->pdr_pa + sizeof(struct ce_pd) * idx;
293 
294 	return dev->pdr + sizeof(struct ce_pd) * idx;
295 }
296 
297 /**
298  * alloc memory for the gather ring
299  * no need to alloc buf for the ring
300  * gdr_tail, gdr_head and gdr_count are initialized by this function
301  */
302 static u32 crypto4xx_build_gdr(struct crypto4xx_device *dev)
303 {
304 	dev->gdr = dma_alloc_coherent(dev->core_dev->device,
305 				      sizeof(struct ce_gd) * PPC4XX_NUM_GD,
306 				      &dev->gdr_pa, GFP_ATOMIC);
307 	if (!dev->gdr)
308 		return -ENOMEM;
309 
310 	memset(dev->gdr, 0, sizeof(struct ce_gd) * PPC4XX_NUM_GD);
311 
312 	return 0;
313 }
314 
315 static inline void crypto4xx_destroy_gdr(struct crypto4xx_device *dev)
316 {
317 	dma_free_coherent(dev->core_dev->device,
318 			  sizeof(struct ce_gd) * PPC4XX_NUM_GD,
319 			  dev->gdr, dev->gdr_pa);
320 }
321 
322 /*
323  * when this function is called.
324  * preemption or interrupt must be disabled
325  */
326 u32 crypto4xx_get_n_gd(struct crypto4xx_device *dev, int n)
327 {
328 	u32 retval;
329 	u32 tmp;
330 	if (n >= PPC4XX_NUM_GD)
331 		return ERING_WAS_FULL;
332 
333 	retval = dev->gdr_head;
334 	tmp = (dev->gdr_head + n) % PPC4XX_NUM_GD;
335 	if (dev->gdr_head > dev->gdr_tail) {
336 		if (tmp < dev->gdr_head && tmp >= dev->gdr_tail)
337 			return ERING_WAS_FULL;
338 	} else if (dev->gdr_head < dev->gdr_tail) {
339 		if (tmp < dev->gdr_head || tmp >= dev->gdr_tail)
340 			return ERING_WAS_FULL;
341 	}
342 	dev->gdr_head = tmp;
343 
344 	return retval;
345 }
346 
347 static u32 crypto4xx_put_gd_to_gdr(struct crypto4xx_device *dev)
348 {
349 	unsigned long flags;
350 
351 	spin_lock_irqsave(&dev->core_dev->lock, flags);
352 	if (dev->gdr_tail == dev->gdr_head) {
353 		spin_unlock_irqrestore(&dev->core_dev->lock, flags);
354 		return 0;
355 	}
356 
357 	if (dev->gdr_tail != PPC4XX_LAST_GD)
358 		dev->gdr_tail++;
359 	else
360 		dev->gdr_tail = 0;
361 
362 	spin_unlock_irqrestore(&dev->core_dev->lock, flags);
363 
364 	return 0;
365 }
366 
367 static inline struct ce_gd *crypto4xx_get_gdp(struct crypto4xx_device *dev,
368 					      dma_addr_t *gd_dma, u32 idx)
369 {
370 	*gd_dma = dev->gdr_pa + sizeof(struct ce_gd) * idx;
371 
372 	return (struct ce_gd *) (dev->gdr + sizeof(struct ce_gd) * idx);
373 }
374 
375 /**
376  * alloc memory for the scatter ring
377  * need to alloc buf for the ring
378  * sdr_tail, sdr_head and sdr_count are initialized by this function
379  */
380 static u32 crypto4xx_build_sdr(struct crypto4xx_device *dev)
381 {
382 	int i;
383 	struct ce_sd *sd_array;
384 
385 	/* alloc memory for scatter descriptor ring */
386 	dev->sdr = dma_alloc_coherent(dev->core_dev->device,
387 				      sizeof(struct ce_sd) * PPC4XX_NUM_SD,
388 				      &dev->sdr_pa, GFP_ATOMIC);
389 	if (!dev->sdr)
390 		return -ENOMEM;
391 
392 	dev->scatter_buffer_size = PPC4XX_SD_BUFFER_SIZE;
393 	dev->scatter_buffer_va =
394 		dma_alloc_coherent(dev->core_dev->device,
395 			dev->scatter_buffer_size * PPC4XX_NUM_SD,
396 			&dev->scatter_buffer_pa, GFP_ATOMIC);
397 	if (!dev->scatter_buffer_va) {
398 		dma_free_coherent(dev->core_dev->device,
399 				  sizeof(struct ce_sd) * PPC4XX_NUM_SD,
400 				  dev->sdr, dev->sdr_pa);
401 		return -ENOMEM;
402 	}
403 
404 	sd_array = dev->sdr;
405 
406 	for (i = 0; i < PPC4XX_NUM_SD; i++) {
407 		sd_array[i].ptr = dev->scatter_buffer_pa +
408 				  dev->scatter_buffer_size * i;
409 	}
410 
411 	return 0;
412 }
413 
414 static void crypto4xx_destroy_sdr(struct crypto4xx_device *dev)
415 {
416 	if (dev->sdr != NULL)
417 		dma_free_coherent(dev->core_dev->device,
418 				  sizeof(struct ce_sd) * PPC4XX_NUM_SD,
419 				  dev->sdr, dev->sdr_pa);
420 
421 	if (dev->scatter_buffer_va != NULL)
422 		dma_free_coherent(dev->core_dev->device,
423 				  dev->scatter_buffer_size * PPC4XX_NUM_SD,
424 				  dev->scatter_buffer_va,
425 				  dev->scatter_buffer_pa);
426 }
427 
428 /*
429  * when this function is called.
430  * preemption or interrupt must be disabled
431  */
432 static u32 crypto4xx_get_n_sd(struct crypto4xx_device *dev, int n)
433 {
434 	u32 retval;
435 	u32 tmp;
436 
437 	if (n >= PPC4XX_NUM_SD)
438 		return ERING_WAS_FULL;
439 
440 	retval = dev->sdr_head;
441 	tmp = (dev->sdr_head + n) % PPC4XX_NUM_SD;
442 	if (dev->sdr_head > dev->gdr_tail) {
443 		if (tmp < dev->sdr_head && tmp >= dev->sdr_tail)
444 			return ERING_WAS_FULL;
445 	} else if (dev->sdr_head < dev->sdr_tail) {
446 		if (tmp < dev->sdr_head || tmp >= dev->sdr_tail)
447 			return ERING_WAS_FULL;
448 	} /* the head = tail, or empty case is already take cared */
449 	dev->sdr_head = tmp;
450 
451 	return retval;
452 }
453 
454 static u32 crypto4xx_put_sd_to_sdr(struct crypto4xx_device *dev)
455 {
456 	unsigned long flags;
457 
458 	spin_lock_irqsave(&dev->core_dev->lock, flags);
459 	if (dev->sdr_tail == dev->sdr_head) {
460 		spin_unlock_irqrestore(&dev->core_dev->lock, flags);
461 		return 0;
462 	}
463 	if (dev->sdr_tail != PPC4XX_LAST_SD)
464 		dev->sdr_tail++;
465 	else
466 		dev->sdr_tail = 0;
467 	spin_unlock_irqrestore(&dev->core_dev->lock, flags);
468 
469 	return 0;
470 }
471 
472 static inline struct ce_sd *crypto4xx_get_sdp(struct crypto4xx_device *dev,
473 					      dma_addr_t *sd_dma, u32 idx)
474 {
475 	*sd_dma = dev->sdr_pa + sizeof(struct ce_sd) * idx;
476 
477 	return  (struct ce_sd *)(dev->sdr + sizeof(struct ce_sd) * idx);
478 }
479 
480 static u32 crypto4xx_fill_one_page(struct crypto4xx_device *dev,
481 				   dma_addr_t *addr, u32 *length,
482 				   u32 *idx, u32 *offset, u32 *nbytes)
483 {
484 	u32 len;
485 
486 	if (*length > dev->scatter_buffer_size) {
487 		memcpy(phys_to_virt(*addr),
488 			dev->scatter_buffer_va +
489 			*idx * dev->scatter_buffer_size + *offset,
490 			dev->scatter_buffer_size);
491 		*offset = 0;
492 		*length -= dev->scatter_buffer_size;
493 		*nbytes -= dev->scatter_buffer_size;
494 		if (*idx == PPC4XX_LAST_SD)
495 			*idx = 0;
496 		else
497 			(*idx)++;
498 		*addr = *addr +  dev->scatter_buffer_size;
499 		return 1;
500 	} else if (*length < dev->scatter_buffer_size) {
501 		memcpy(phys_to_virt(*addr),
502 			dev->scatter_buffer_va +
503 			*idx * dev->scatter_buffer_size + *offset, *length);
504 		if ((*offset + *length) == dev->scatter_buffer_size) {
505 			if (*idx == PPC4XX_LAST_SD)
506 				*idx = 0;
507 			else
508 				(*idx)++;
509 			*nbytes -= *length;
510 			*offset = 0;
511 		} else {
512 			*nbytes -= *length;
513 			*offset += *length;
514 		}
515 
516 		return 0;
517 	} else {
518 		len = (*nbytes <= dev->scatter_buffer_size) ?
519 				(*nbytes) : dev->scatter_buffer_size;
520 		memcpy(phys_to_virt(*addr),
521 			dev->scatter_buffer_va +
522 			*idx * dev->scatter_buffer_size + *offset,
523 			len);
524 		*offset = 0;
525 		*nbytes -= len;
526 
527 		if (*idx == PPC4XX_LAST_SD)
528 			*idx = 0;
529 		else
530 			(*idx)++;
531 
532 		return 0;
533     }
534 }
535 
536 static void crypto4xx_copy_pkt_to_dst(struct crypto4xx_device *dev,
537 				      struct ce_pd *pd,
538 				      struct pd_uinfo *pd_uinfo,
539 				      u32 nbytes,
540 				      struct scatterlist *dst)
541 {
542 	dma_addr_t addr;
543 	u32 this_sd;
544 	u32 offset;
545 	u32 len;
546 	u32 i;
547 	u32 sg_len;
548 	struct scatterlist *sg;
549 
550 	this_sd = pd_uinfo->first_sd;
551 	offset = 0;
552 	i = 0;
553 
554 	while (nbytes) {
555 		sg = &dst[i];
556 		sg_len = sg->length;
557 		addr = dma_map_page(dev->core_dev->device, sg_page(sg),
558 				sg->offset, sg->length, DMA_TO_DEVICE);
559 
560 		if (offset == 0) {
561 			len = (nbytes <= sg->length) ? nbytes : sg->length;
562 			while (crypto4xx_fill_one_page(dev, &addr, &len,
563 				&this_sd, &offset, &nbytes))
564 				;
565 			if (!nbytes)
566 				return;
567 			i++;
568 		} else {
569 			len = (nbytes <= (dev->scatter_buffer_size - offset)) ?
570 				nbytes : (dev->scatter_buffer_size - offset);
571 			len = (sg->length < len) ? sg->length : len;
572 			while (crypto4xx_fill_one_page(dev, &addr, &len,
573 					       &this_sd, &offset, &nbytes))
574 				;
575 			if (!nbytes)
576 				return;
577 			sg_len -= len;
578 			if (sg_len) {
579 				addr += len;
580 				while (crypto4xx_fill_one_page(dev, &addr,
581 					&sg_len, &this_sd, &offset, &nbytes))
582 					;
583 			}
584 			i++;
585 		}
586 	}
587 }
588 
589 static u32 crypto4xx_copy_digest_to_dst(struct pd_uinfo *pd_uinfo,
590 					struct crypto4xx_ctx *ctx)
591 {
592 	struct dynamic_sa_ctl *sa = (struct dynamic_sa_ctl *) ctx->sa_in;
593 	struct sa_state_record *state_record =
594 				(struct sa_state_record *) pd_uinfo->sr_va;
595 
596 	if (sa->sa_command_0.bf.hash_alg == SA_HASH_ALG_SHA1) {
597 		memcpy((void *) pd_uinfo->dest_va, state_record->save_digest,
598 		       SA_HASH_ALG_SHA1_DIGEST_SIZE);
599 	}
600 
601 	return 0;
602 }
603 
604 static void crypto4xx_ret_sg_desc(struct crypto4xx_device *dev,
605 				  struct pd_uinfo *pd_uinfo)
606 {
607 	int i;
608 	if (pd_uinfo->num_gd) {
609 		for (i = 0; i < pd_uinfo->num_gd; i++)
610 			crypto4xx_put_gd_to_gdr(dev);
611 		pd_uinfo->first_gd = 0xffffffff;
612 		pd_uinfo->num_gd = 0;
613 	}
614 	if (pd_uinfo->num_sd) {
615 		for (i = 0; i < pd_uinfo->num_sd; i++)
616 			crypto4xx_put_sd_to_sdr(dev);
617 
618 		pd_uinfo->first_sd = 0xffffffff;
619 		pd_uinfo->num_sd = 0;
620 	}
621 }
622 
623 static u32 crypto4xx_ablkcipher_done(struct crypto4xx_device *dev,
624 				     struct pd_uinfo *pd_uinfo,
625 				     struct ce_pd *pd)
626 {
627 	struct crypto4xx_ctx *ctx;
628 	struct ablkcipher_request *ablk_req;
629 	struct scatterlist *dst;
630 	dma_addr_t addr;
631 
632 	ablk_req = ablkcipher_request_cast(pd_uinfo->async_req);
633 	ctx  = crypto_tfm_ctx(ablk_req->base.tfm);
634 
635 	if (pd_uinfo->using_sd) {
636 		crypto4xx_copy_pkt_to_dst(dev, pd, pd_uinfo, ablk_req->nbytes,
637 					  ablk_req->dst);
638 	} else {
639 		dst = pd_uinfo->dest_va;
640 		addr = dma_map_page(dev->core_dev->device, sg_page(dst),
641 				    dst->offset, dst->length, DMA_FROM_DEVICE);
642 	}
643 	crypto4xx_ret_sg_desc(dev, pd_uinfo);
644 	if (ablk_req->base.complete != NULL)
645 		ablk_req->base.complete(&ablk_req->base, 0);
646 
647 	return 0;
648 }
649 
650 static u32 crypto4xx_ahash_done(struct crypto4xx_device *dev,
651 				struct pd_uinfo *pd_uinfo)
652 {
653 	struct crypto4xx_ctx *ctx;
654 	struct ahash_request *ahash_req;
655 
656 	ahash_req = ahash_request_cast(pd_uinfo->async_req);
657 	ctx  = crypto_tfm_ctx(ahash_req->base.tfm);
658 
659 	crypto4xx_copy_digest_to_dst(pd_uinfo,
660 				     crypto_tfm_ctx(ahash_req->base.tfm));
661 	crypto4xx_ret_sg_desc(dev, pd_uinfo);
662 	/* call user provided callback function x */
663 	if (ahash_req->base.complete != NULL)
664 		ahash_req->base.complete(&ahash_req->base, 0);
665 
666 	return 0;
667 }
668 
669 static u32 crypto4xx_pd_done(struct crypto4xx_device *dev, u32 idx)
670 {
671 	struct ce_pd *pd;
672 	struct pd_uinfo *pd_uinfo;
673 
674 	pd =  dev->pdr + sizeof(struct ce_pd)*idx;
675 	pd_uinfo = dev->pdr_uinfo + sizeof(struct pd_uinfo)*idx;
676 	if (crypto_tfm_alg_type(pd_uinfo->async_req->tfm) ==
677 			CRYPTO_ALG_TYPE_ABLKCIPHER)
678 		return crypto4xx_ablkcipher_done(dev, pd_uinfo, pd);
679 	else
680 		return crypto4xx_ahash_done(dev, pd_uinfo);
681 }
682 
683 /**
684  * Note: Only use this function to copy items that is word aligned.
685  */
686 void crypto4xx_memcpy_le(unsigned int *dst,
687 			 const unsigned char *buf,
688 			 int len)
689 {
690 	u8 *tmp;
691 	for (; len >= 4; buf += 4, len -= 4)
692 		*dst++ = cpu_to_le32(*(unsigned int *) buf);
693 
694 	tmp = (u8 *)dst;
695 	switch (len) {
696 	case 3:
697 		*tmp++ = 0;
698 		*tmp++ = *(buf+2);
699 		*tmp++ = *(buf+1);
700 		*tmp++ = *buf;
701 		break;
702 	case 2:
703 		*tmp++ = 0;
704 		*tmp++ = 0;
705 		*tmp++ = *(buf+1);
706 		*tmp++ = *buf;
707 		break;
708 	case 1:
709 		*tmp++ = 0;
710 		*tmp++ = 0;
711 		*tmp++ = 0;
712 		*tmp++ = *buf;
713 		break;
714 	default:
715 		break;
716 	}
717 }
718 
719 static void crypto4xx_stop_all(struct crypto4xx_core_device *core_dev)
720 {
721 	crypto4xx_destroy_pdr(core_dev->dev);
722 	crypto4xx_destroy_gdr(core_dev->dev);
723 	crypto4xx_destroy_sdr(core_dev->dev);
724 	dev_set_drvdata(core_dev->device, NULL);
725 	iounmap(core_dev->dev->ce_base);
726 	kfree(core_dev->dev);
727 	kfree(core_dev);
728 }
729 
730 void crypto4xx_return_pd(struct crypto4xx_device *dev,
731 			 u32 pd_entry, struct ce_pd *pd,
732 			 struct pd_uinfo *pd_uinfo)
733 {
734 	/* irq should be already disabled */
735 	dev->pdr_head = pd_entry;
736 	pd->pd_ctl.w = 0;
737 	pd->pd_ctl_len.w = 0;
738 	pd_uinfo->state = PD_ENTRY_FREE;
739 }
740 
741 /*
742  * derive number of elements in scatterlist
743  * Shamlessly copy from talitos.c
744  */
745 static int get_sg_count(struct scatterlist *sg_list, int nbytes)
746 {
747 	struct scatterlist *sg = sg_list;
748 	int sg_nents = 0;
749 
750 	while (nbytes) {
751 		sg_nents++;
752 		if (sg->length > nbytes)
753 			break;
754 		nbytes -= sg->length;
755 		sg = sg_next(sg);
756 	}
757 
758 	return sg_nents;
759 }
760 
761 static u32 get_next_gd(u32 current)
762 {
763 	if (current != PPC4XX_LAST_GD)
764 		return current + 1;
765 	else
766 		return 0;
767 }
768 
769 static u32 get_next_sd(u32 current)
770 {
771 	if (current != PPC4XX_LAST_SD)
772 		return current + 1;
773 	else
774 		return 0;
775 }
776 
777 u32 crypto4xx_build_pd(struct crypto_async_request *req,
778 		       struct crypto4xx_ctx *ctx,
779 		       struct scatterlist *src,
780 		       struct scatterlist *dst,
781 		       unsigned int datalen,
782 		       void *iv, u32 iv_len)
783 {
784 	struct crypto4xx_device *dev = ctx->dev;
785 	dma_addr_t addr, pd_dma, sd_dma, gd_dma;
786 	struct dynamic_sa_ctl *sa;
787 	struct scatterlist *sg;
788 	struct ce_gd *gd;
789 	struct ce_pd *pd;
790 	u32 num_gd, num_sd;
791 	u32 fst_gd = 0xffffffff;
792 	u32 fst_sd = 0xffffffff;
793 	u32 pd_entry;
794 	unsigned long flags;
795 	struct pd_uinfo *pd_uinfo = NULL;
796 	unsigned int nbytes = datalen, idx;
797 	unsigned int ivlen = 0;
798 	u32 gd_idx = 0;
799 
800 	/* figure how many gd is needed */
801 	num_gd = get_sg_count(src, datalen);
802 	if (num_gd == 1)
803 		num_gd = 0;
804 
805 	/* figure how many sd is needed */
806 	if (sg_is_last(dst) || ctx->is_hash) {
807 		num_sd = 0;
808 	} else {
809 		if (datalen > PPC4XX_SD_BUFFER_SIZE) {
810 			num_sd = datalen / PPC4XX_SD_BUFFER_SIZE;
811 			if (datalen % PPC4XX_SD_BUFFER_SIZE)
812 				num_sd++;
813 		} else {
814 			num_sd = 1;
815 		}
816 	}
817 
818 	/*
819 	 * The follow section of code needs to be protected
820 	 * The gather ring and scatter ring needs to be consecutive
821 	 * In case of run out of any kind of descriptor, the descriptor
822 	 * already got must be return the original place.
823 	 */
824 	spin_lock_irqsave(&dev->core_dev->lock, flags);
825 	if (num_gd) {
826 		fst_gd = crypto4xx_get_n_gd(dev, num_gd);
827 		if (fst_gd == ERING_WAS_FULL) {
828 			spin_unlock_irqrestore(&dev->core_dev->lock, flags);
829 			return -EAGAIN;
830 		}
831 	}
832 	if (num_sd) {
833 		fst_sd = crypto4xx_get_n_sd(dev, num_sd);
834 		if (fst_sd == ERING_WAS_FULL) {
835 			if (num_gd)
836 				dev->gdr_head = fst_gd;
837 			spin_unlock_irqrestore(&dev->core_dev->lock, flags);
838 			return -EAGAIN;
839 		}
840 	}
841 	pd_entry = crypto4xx_get_pd_from_pdr_nolock(dev);
842 	if (pd_entry == ERING_WAS_FULL) {
843 		if (num_gd)
844 			dev->gdr_head = fst_gd;
845 		if (num_sd)
846 			dev->sdr_head = fst_sd;
847 		spin_unlock_irqrestore(&dev->core_dev->lock, flags);
848 		return -EAGAIN;
849 	}
850 	spin_unlock_irqrestore(&dev->core_dev->lock, flags);
851 
852 	pd_uinfo = (struct pd_uinfo *)(dev->pdr_uinfo +
853 				       sizeof(struct pd_uinfo) * pd_entry);
854 	pd = crypto4xx_get_pdp(dev, &pd_dma, pd_entry);
855 	pd_uinfo->async_req = req;
856 	pd_uinfo->num_gd = num_gd;
857 	pd_uinfo->num_sd = num_sd;
858 
859 	if (iv_len || ctx->is_hash) {
860 		ivlen = iv_len;
861 		pd->sa = pd_uinfo->sa_pa;
862 		sa = (struct dynamic_sa_ctl *) pd_uinfo->sa_va;
863 		if (ctx->direction == DIR_INBOUND)
864 			memcpy(sa, ctx->sa_in, ctx->sa_len * 4);
865 		else
866 			memcpy(sa, ctx->sa_out, ctx->sa_len * 4);
867 
868 		memcpy((void *) sa + ctx->offset_to_sr_ptr,
869 			&pd_uinfo->sr_pa, 4);
870 
871 		if (iv_len)
872 			crypto4xx_memcpy_le(pd_uinfo->sr_va, iv, iv_len);
873 	} else {
874 		if (ctx->direction == DIR_INBOUND) {
875 			pd->sa = ctx->sa_in_dma_addr;
876 			sa = (struct dynamic_sa_ctl *) ctx->sa_in;
877 		} else {
878 			pd->sa = ctx->sa_out_dma_addr;
879 			sa = (struct dynamic_sa_ctl *) ctx->sa_out;
880 		}
881 	}
882 	pd->sa_len = ctx->sa_len;
883 	if (num_gd) {
884 		/* get first gd we are going to use */
885 		gd_idx = fst_gd;
886 		pd_uinfo->first_gd = fst_gd;
887 		pd_uinfo->num_gd = num_gd;
888 		gd = crypto4xx_get_gdp(dev, &gd_dma, gd_idx);
889 		pd->src = gd_dma;
890 		/* enable gather */
891 		sa->sa_command_0.bf.gather = 1;
892 		idx = 0;
893 		src = &src[0];
894 		/* walk the sg, and setup gather array */
895 		while (nbytes) {
896 			sg = &src[idx];
897 			addr = dma_map_page(dev->core_dev->device, sg_page(sg),
898 				    sg->offset, sg->length, DMA_TO_DEVICE);
899 			gd->ptr = addr;
900 			gd->ctl_len.len = sg->length;
901 			gd->ctl_len.done = 0;
902 			gd->ctl_len.ready = 1;
903 			if (sg->length >= nbytes)
904 				break;
905 			nbytes -= sg->length;
906 			gd_idx = get_next_gd(gd_idx);
907 			gd = crypto4xx_get_gdp(dev, &gd_dma, gd_idx);
908 			idx++;
909 		}
910 	} else {
911 		pd->src = (u32)dma_map_page(dev->core_dev->device, sg_page(src),
912 				src->offset, src->length, DMA_TO_DEVICE);
913 		/*
914 		 * Disable gather in sa command
915 		 */
916 		sa->sa_command_0.bf.gather = 0;
917 		/*
918 		 * Indicate gather array is not used
919 		 */
920 		pd_uinfo->first_gd = 0xffffffff;
921 		pd_uinfo->num_gd = 0;
922 	}
923 	if (ctx->is_hash || sg_is_last(dst)) {
924 		/*
925 		 * we know application give us dst a whole piece of memory
926 		 * no need to use scatter ring.
927 		 * In case of is_hash, the icv is always at end of src data.
928 		 */
929 		pd_uinfo->using_sd = 0;
930 		pd_uinfo->first_sd = 0xffffffff;
931 		pd_uinfo->num_sd = 0;
932 		pd_uinfo->dest_va = dst;
933 		sa->sa_command_0.bf.scatter = 0;
934 		if (ctx->is_hash)
935 			pd->dest = virt_to_phys((void *)dst);
936 		else
937 			pd->dest = (u32)dma_map_page(dev->core_dev->device,
938 					sg_page(dst), dst->offset,
939 					dst->length, DMA_TO_DEVICE);
940 	} else {
941 		struct ce_sd *sd = NULL;
942 		u32 sd_idx = fst_sd;
943 		nbytes = datalen;
944 		sa->sa_command_0.bf.scatter = 1;
945 		pd_uinfo->using_sd = 1;
946 		pd_uinfo->dest_va = dst;
947 		pd_uinfo->first_sd = fst_sd;
948 		pd_uinfo->num_sd = num_sd;
949 		sd = crypto4xx_get_sdp(dev, &sd_dma, sd_idx);
950 		pd->dest = sd_dma;
951 		/* setup scatter descriptor */
952 		sd->ctl.done = 0;
953 		sd->ctl.rdy = 1;
954 		/* sd->ptr should be setup by sd_init routine*/
955 		idx = 0;
956 		if (nbytes >= PPC4XX_SD_BUFFER_SIZE)
957 			nbytes -= PPC4XX_SD_BUFFER_SIZE;
958 		else
959 			nbytes = 0;
960 		while (nbytes) {
961 			sd_idx = get_next_sd(sd_idx);
962 			sd = crypto4xx_get_sdp(dev, &sd_dma, sd_idx);
963 			/* setup scatter descriptor */
964 			sd->ctl.done = 0;
965 			sd->ctl.rdy = 1;
966 			if (nbytes >= PPC4XX_SD_BUFFER_SIZE)
967 				nbytes -= PPC4XX_SD_BUFFER_SIZE;
968 			else
969 				/*
970 				 * SD entry can hold PPC4XX_SD_BUFFER_SIZE,
971 				 * which is more than nbytes, so done.
972 				 */
973 				nbytes = 0;
974 		}
975 	}
976 
977 	sa->sa_command_1.bf.hash_crypto_offset = 0;
978 	pd->pd_ctl.w = ctx->pd_ctl;
979 	pd->pd_ctl_len.w = 0x00400000 | (ctx->bypass << 24) | datalen;
980 	pd_uinfo->state = PD_ENTRY_INUSE;
981 	wmb();
982 	/* write any value to push engine to read a pd */
983 	writel(1, dev->ce_base + CRYPTO4XX_INT_DESCR_RD);
984 	return -EINPROGRESS;
985 }
986 
987 /**
988  * Algorithm Registration Functions
989  */
990 static int crypto4xx_alg_init(struct crypto_tfm *tfm)
991 {
992 	struct crypto_alg *alg = tfm->__crt_alg;
993 	struct crypto4xx_alg *amcc_alg = crypto_alg_to_crypto4xx_alg(alg);
994 	struct crypto4xx_ctx *ctx = crypto_tfm_ctx(tfm);
995 
996 	ctx->dev = amcc_alg->dev;
997 	ctx->sa_in = NULL;
998 	ctx->sa_out = NULL;
999 	ctx->sa_in_dma_addr = 0;
1000 	ctx->sa_out_dma_addr = 0;
1001 	ctx->sa_len = 0;
1002 
1003 	switch (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) {
1004 	default:
1005 		tfm->crt_ablkcipher.reqsize = sizeof(struct crypto4xx_ctx);
1006 		break;
1007 	case CRYPTO_ALG_TYPE_AHASH:
1008 		crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
1009 					 sizeof(struct crypto4xx_ctx));
1010 		break;
1011 	}
1012 
1013 	return 0;
1014 }
1015 
1016 static void crypto4xx_alg_exit(struct crypto_tfm *tfm)
1017 {
1018 	struct crypto4xx_ctx *ctx = crypto_tfm_ctx(tfm);
1019 
1020 	crypto4xx_free_sa(ctx);
1021 	crypto4xx_free_state_record(ctx);
1022 }
1023 
1024 int crypto4xx_register_alg(struct crypto4xx_device *sec_dev,
1025 			   struct crypto4xx_alg_common *crypto_alg,
1026 			   int array_size)
1027 {
1028 	struct crypto4xx_alg *alg;
1029 	int i;
1030 	int rc = 0;
1031 
1032 	for (i = 0; i < array_size; i++) {
1033 		alg = kzalloc(sizeof(struct crypto4xx_alg), GFP_KERNEL);
1034 		if (!alg)
1035 			return -ENOMEM;
1036 
1037 		alg->alg = crypto_alg[i];
1038 		alg->dev = sec_dev;
1039 
1040 		switch (alg->alg.type) {
1041 		case CRYPTO_ALG_TYPE_AHASH:
1042 			rc = crypto_register_ahash(&alg->alg.u.hash);
1043 			break;
1044 
1045 		default:
1046 			rc = crypto_register_alg(&alg->alg.u.cipher);
1047 			break;
1048 		}
1049 
1050 		if (rc) {
1051 			list_del(&alg->entry);
1052 			kfree(alg);
1053 		} else {
1054 			list_add_tail(&alg->entry, &sec_dev->alg_list);
1055 		}
1056 	}
1057 
1058 	return 0;
1059 }
1060 
1061 static void crypto4xx_unregister_alg(struct crypto4xx_device *sec_dev)
1062 {
1063 	struct crypto4xx_alg *alg, *tmp;
1064 
1065 	list_for_each_entry_safe(alg, tmp, &sec_dev->alg_list, entry) {
1066 		list_del(&alg->entry);
1067 		switch (alg->alg.type) {
1068 		case CRYPTO_ALG_TYPE_AHASH:
1069 			crypto_unregister_ahash(&alg->alg.u.hash);
1070 			break;
1071 
1072 		default:
1073 			crypto_unregister_alg(&alg->alg.u.cipher);
1074 		}
1075 		kfree(alg);
1076 	}
1077 }
1078 
1079 static void crypto4xx_bh_tasklet_cb(unsigned long data)
1080 {
1081 	struct device *dev = (struct device *)data;
1082 	struct crypto4xx_core_device *core_dev = dev_get_drvdata(dev);
1083 	struct pd_uinfo *pd_uinfo;
1084 	struct ce_pd *pd;
1085 	u32 tail;
1086 
1087 	while (core_dev->dev->pdr_head != core_dev->dev->pdr_tail) {
1088 		tail = core_dev->dev->pdr_tail;
1089 		pd_uinfo = core_dev->dev->pdr_uinfo +
1090 			sizeof(struct pd_uinfo)*tail;
1091 		pd =  core_dev->dev->pdr + sizeof(struct ce_pd) * tail;
1092 		if ((pd_uinfo->state == PD_ENTRY_INUSE) &&
1093 				   pd->pd_ctl.bf.pe_done &&
1094 				   !pd->pd_ctl.bf.host_ready) {
1095 			pd->pd_ctl.bf.pe_done = 0;
1096 			crypto4xx_pd_done(core_dev->dev, tail);
1097 			crypto4xx_put_pd_to_pdr(core_dev->dev, tail);
1098 			pd_uinfo->state = PD_ENTRY_FREE;
1099 		} else {
1100 			/* if tail not done, break */
1101 			break;
1102 		}
1103 	}
1104 }
1105 
1106 /**
1107  * Top Half of isr.
1108  */
1109 static irqreturn_t crypto4xx_ce_interrupt_handler(int irq, void *data)
1110 {
1111 	struct device *dev = (struct device *)data;
1112 	struct crypto4xx_core_device *core_dev = dev_get_drvdata(dev);
1113 
1114 	if (core_dev->dev->ce_base == 0)
1115 		return 0;
1116 
1117 	writel(PPC4XX_INTERRUPT_CLR,
1118 	       core_dev->dev->ce_base + CRYPTO4XX_INT_CLR);
1119 	tasklet_schedule(&core_dev->tasklet);
1120 
1121 	return IRQ_HANDLED;
1122 }
1123 
1124 /**
1125  * Supported Crypto Algorithms
1126  */
1127 struct crypto4xx_alg_common crypto4xx_alg[] = {
1128 	/* Crypto AES modes */
1129 	{ .type = CRYPTO_ALG_TYPE_ABLKCIPHER, .u.cipher = {
1130 		.cra_name 	= "cbc(aes)",
1131 		.cra_driver_name = "cbc-aes-ppc4xx",
1132 		.cra_priority 	= CRYPTO4XX_CRYPTO_PRIORITY,
1133 		.cra_flags 	= CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
1134 		.cra_blocksize 	= AES_BLOCK_SIZE,
1135 		.cra_ctxsize 	= sizeof(struct crypto4xx_ctx),
1136 		.cra_type 	= &crypto_ablkcipher_type,
1137 		.cra_init	= crypto4xx_alg_init,
1138 		.cra_exit	= crypto4xx_alg_exit,
1139 		.cra_module 	= THIS_MODULE,
1140 		.cra_u 		= {
1141 			.ablkcipher = {
1142 				.min_keysize 	= AES_MIN_KEY_SIZE,
1143 				.max_keysize 	= AES_MAX_KEY_SIZE,
1144 				.ivsize		= AES_IV_SIZE,
1145 				.setkey 	= crypto4xx_setkey_aes_cbc,
1146 				.encrypt 	= crypto4xx_encrypt,
1147 				.decrypt 	= crypto4xx_decrypt,
1148 			}
1149 		}
1150 	}},
1151 };
1152 
1153 /**
1154  * Module Initialization Routine
1155  */
1156 static int __init crypto4xx_probe(struct platform_device *ofdev)
1157 {
1158 	int rc;
1159 	struct resource res;
1160 	struct device *dev = &ofdev->dev;
1161 	struct crypto4xx_core_device *core_dev;
1162 
1163 	rc = of_address_to_resource(ofdev->dev.of_node, 0, &res);
1164 	if (rc)
1165 		return -ENODEV;
1166 
1167 	if (of_find_compatible_node(NULL, NULL, "amcc,ppc460ex-crypto")) {
1168 		mtdcri(SDR0, PPC460EX_SDR0_SRST,
1169 		       mfdcri(SDR0, PPC460EX_SDR0_SRST) | PPC460EX_CE_RESET);
1170 		mtdcri(SDR0, PPC460EX_SDR0_SRST,
1171 		       mfdcri(SDR0, PPC460EX_SDR0_SRST) & ~PPC460EX_CE_RESET);
1172 	} else if (of_find_compatible_node(NULL, NULL,
1173 			"amcc,ppc405ex-crypto")) {
1174 		mtdcri(SDR0, PPC405EX_SDR0_SRST,
1175 		       mfdcri(SDR0, PPC405EX_SDR0_SRST) | PPC405EX_CE_RESET);
1176 		mtdcri(SDR0, PPC405EX_SDR0_SRST,
1177 		       mfdcri(SDR0, PPC405EX_SDR0_SRST) & ~PPC405EX_CE_RESET);
1178 	} else if (of_find_compatible_node(NULL, NULL,
1179 			"amcc,ppc460sx-crypto")) {
1180 		mtdcri(SDR0, PPC460SX_SDR0_SRST,
1181 		       mfdcri(SDR0, PPC460SX_SDR0_SRST) | PPC460SX_CE_RESET);
1182 		mtdcri(SDR0, PPC460SX_SDR0_SRST,
1183 		       mfdcri(SDR0, PPC460SX_SDR0_SRST) & ~PPC460SX_CE_RESET);
1184 	} else {
1185 		printk(KERN_ERR "Crypto Function Not supported!\n");
1186 		return -EINVAL;
1187 	}
1188 
1189 	core_dev = kzalloc(sizeof(struct crypto4xx_core_device), GFP_KERNEL);
1190 	if (!core_dev)
1191 		return -ENOMEM;
1192 
1193 	dev_set_drvdata(dev, core_dev);
1194 	core_dev->ofdev = ofdev;
1195 	core_dev->dev = kzalloc(sizeof(struct crypto4xx_device), GFP_KERNEL);
1196 	if (!core_dev->dev)
1197 		goto err_alloc_dev;
1198 
1199 	core_dev->dev->core_dev = core_dev;
1200 	core_dev->device = dev;
1201 	spin_lock_init(&core_dev->lock);
1202 	INIT_LIST_HEAD(&core_dev->dev->alg_list);
1203 	rc = crypto4xx_build_pdr(core_dev->dev);
1204 	if (rc)
1205 		goto err_build_pdr;
1206 
1207 	rc = crypto4xx_build_gdr(core_dev->dev);
1208 	if (rc)
1209 		goto err_build_gdr;
1210 
1211 	rc = crypto4xx_build_sdr(core_dev->dev);
1212 	if (rc)
1213 		goto err_build_sdr;
1214 
1215 	/* Init tasklet for bottom half processing */
1216 	tasklet_init(&core_dev->tasklet, crypto4xx_bh_tasklet_cb,
1217 		     (unsigned long) dev);
1218 
1219 	/* Register for Crypto isr, Crypto Engine IRQ */
1220 	core_dev->irq = irq_of_parse_and_map(ofdev->dev.of_node, 0);
1221 	rc = request_irq(core_dev->irq, crypto4xx_ce_interrupt_handler, 0,
1222 			 core_dev->dev->name, dev);
1223 	if (rc)
1224 		goto err_request_irq;
1225 
1226 	core_dev->dev->ce_base = of_iomap(ofdev->dev.of_node, 0);
1227 	if (!core_dev->dev->ce_base) {
1228 		dev_err(dev, "failed to of_iomap\n");
1229 		goto err_iomap;
1230 	}
1231 
1232 	/* need to setup pdr, rdr, gdr and sdr before this */
1233 	crypto4xx_hw_init(core_dev->dev);
1234 
1235 	/* Register security algorithms with Linux CryptoAPI */
1236 	rc = crypto4xx_register_alg(core_dev->dev, crypto4xx_alg,
1237 			       ARRAY_SIZE(crypto4xx_alg));
1238 	if (rc)
1239 		goto err_start_dev;
1240 
1241 	return 0;
1242 
1243 err_start_dev:
1244 	iounmap(core_dev->dev->ce_base);
1245 err_iomap:
1246 	free_irq(core_dev->irq, dev);
1247 	irq_dispose_mapping(core_dev->irq);
1248 	tasklet_kill(&core_dev->tasklet);
1249 err_request_irq:
1250 	crypto4xx_destroy_sdr(core_dev->dev);
1251 err_build_sdr:
1252 	crypto4xx_destroy_gdr(core_dev->dev);
1253 err_build_gdr:
1254 	crypto4xx_destroy_pdr(core_dev->dev);
1255 err_build_pdr:
1256 	kfree(core_dev->dev);
1257 err_alloc_dev:
1258 	kfree(core_dev);
1259 
1260 	return rc;
1261 }
1262 
1263 static int __exit crypto4xx_remove(struct platform_device *ofdev)
1264 {
1265 	struct device *dev = &ofdev->dev;
1266 	struct crypto4xx_core_device *core_dev = dev_get_drvdata(dev);
1267 
1268 	free_irq(core_dev->irq, dev);
1269 	irq_dispose_mapping(core_dev->irq);
1270 
1271 	tasklet_kill(&core_dev->tasklet);
1272 	/* Un-register with Linux CryptoAPI */
1273 	crypto4xx_unregister_alg(core_dev->dev);
1274 	/* Free all allocated memory */
1275 	crypto4xx_stop_all(core_dev);
1276 
1277 	return 0;
1278 }
1279 
1280 static const struct of_device_id crypto4xx_match[] = {
1281 	{ .compatible      = "amcc,ppc4xx-crypto",},
1282 	{ },
1283 };
1284 
1285 static struct platform_driver crypto4xx_driver = {
1286 	.driver = {
1287 		.name = "crypto4xx",
1288 		.owner = THIS_MODULE,
1289 		.of_match_table = crypto4xx_match,
1290 	},
1291 	.probe		= crypto4xx_probe,
1292 	.remove		= crypto4xx_remove,
1293 };
1294 
1295 module_platform_driver(crypto4xx_driver);
1296 
1297 MODULE_LICENSE("GPL");
1298 MODULE_AUTHOR("James Hsiao <jhsiao@amcc.com>");
1299 MODULE_DESCRIPTION("Driver for AMCC PPC4xx crypto accelerator");
1300 
1301