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