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