Merge branch 'core-debug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / drivers / crypto / amcc / crypto4xx_core.c
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 <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"
39
40 #define PPC4XX_SEC_VERSION_STR                  "0.5"
41
42 /**
43  * PPC4xx Crypto Engine Initialization Routine
44  */
45 static void crypto4xx_hw_init(struct crypto4xx_device *dev)
46 {
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;
53
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);
118 }
119
120 int crypto4xx_alloc_sa(struct crypto4xx_ctx *ctx, u32 size)
121 {
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;
126
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;
134         }
135
136         memset(ctx->sa_in, 0, size * 4);
137         memset(ctx->sa_out, 0, size * 4);
138         ctx->sa_len = size;
139
140         return 0;
141 }
142
143 void crypto4xx_free_sa(struct crypto4xx_ctx *ctx)
144 {
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);
151
152         ctx->sa_in_dma_addr = 0;
153         ctx->sa_out_dma_addr = 0;
154         ctx->sa_len = 0;
155 }
156
157 u32 crypto4xx_alloc_state_record(struct crypto4xx_ctx *ctx)
158 {
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));
165
166         return 0;
167 }
168
169 void crypto4xx_free_state_record(struct crypto4xx_ctx *ctx)
170 {
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;
177 }
178
179 /**
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
183  */
184 static u32 crypto4xx_build_pdr(struct crypto4xx_device *dev)
185 {
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;
193
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;
202         }
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;
210
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);
219
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;
223
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;
229         }
230
231         return 0;
232 }
233
234 static void crypto4xx_destroy_pdr(struct crypto4xx_device *dev)
235 {
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);
247
248         kfree(dev->pdr_uinfo);
249 }
250
251 static u32 crypto4xx_get_pd_from_pdr_nolock(struct crypto4xx_device *dev)
252 {
253         u32 retval;
254         u32 tmp;
255
256         retval = dev->pdr_head;
257         tmp = (dev->pdr_head + 1) % PPC4XX_NUM_PD;
258
259         if (tmp == dev->pdr_tail)
260                 return ERING_WAS_FULL;
261
262         dev->pdr_head = tmp;
263
264         return retval;
265 }
266
267 static u32 crypto4xx_put_pd_to_pdr(struct crypto4xx_device *dev, u32 idx)
268 {
269         struct pd_uinfo *pd_uinfo;
270         unsigned long flags;
271
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);
281
282         return 0;
283 }
284
285 static struct ce_pd *crypto4xx_get_pdp(struct crypto4xx_device *dev,
286                                        dma_addr_t *pd_dma, u32 idx)
287 {
288         *pd_dma = dev->pdr_pa + sizeof(struct ce_pd) * idx;
289
290         return dev->pdr + sizeof(struct ce_pd) * idx;
291 }
292
293 /**
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
297  */
298 static u32 crypto4xx_build_gdr(struct crypto4xx_device *dev)
299 {
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;
305
306         memset(dev->gdr, 0, sizeof(struct ce_gd) * PPC4XX_NUM_GD);
307
308         return 0;
309 }
310
311 static inline void crypto4xx_destroy_gdr(struct crypto4xx_device *dev)
312 {
313         dma_free_coherent(dev->core_dev->device,
314                           sizeof(struct ce_gd) * PPC4XX_NUM_GD,
315                           dev->gdr, dev->gdr_pa);
316 }
317
318 /*
319  * when this function is called.
320  * preemption or interrupt must be disabled
321  */
322 u32 crypto4xx_get_n_gd(struct crypto4xx_device *dev, int n)
323 {
324         u32 retval;
325         u32 tmp;
326         if (n >= PPC4XX_NUM_GD)
327                 return ERING_WAS_FULL;
328
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;
337         }
338         dev->gdr_head = tmp;
339
340         return retval;
341 }
342
343 static u32 crypto4xx_put_gd_to_gdr(struct crypto4xx_device *dev)
344 {
345         unsigned long flags;
346
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;
351         }
352
353         if (dev->gdr_tail != PPC4XX_LAST_GD)
354                 dev->gdr_tail++;
355         else
356                 dev->gdr_tail = 0;
357
358         spin_unlock_irqrestore(&dev->core_dev->lock, flags);
359
360         return 0;
361 }
362
363 static inline struct ce_gd *crypto4xx_get_gdp(struct crypto4xx_device *dev,
364                                               dma_addr_t *gd_dma, u32 idx)
365 {
366         *gd_dma = dev->gdr_pa + sizeof(struct ce_gd) * idx;
367
368         return (struct ce_gd *) (dev->gdr + sizeof(struct ce_gd) * idx);
369 }
370
371 /**
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
375  */
376 static u32 crypto4xx_build_sdr(struct crypto4xx_device *dev)
377 {
378         int i;
379         struct ce_sd *sd_array;
380
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;
387
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;
398         }
399
400         sd_array = dev->sdr;
401
402         for (i = 0; i < PPC4XX_NUM_SD; i++) {
403                 sd_array[i].ptr = dev->scatter_buffer_pa +
404                                   dev->scatter_buffer_size * i;
405         }
406
407         return 0;
408 }
409
410 static void crypto4xx_destroy_sdr(struct crypto4xx_device *dev)
411 {
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);
416
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);
422 }
423
424 /*
425  * when this function is called.
426  * preemption or interrupt must be disabled
427  */
428 static u32 crypto4xx_get_n_sd(struct crypto4xx_device *dev, int n)
429 {
430         u32 retval;
431         u32 tmp;
432
433         if (n >= PPC4XX_NUM_SD)
434                 return ERING_WAS_FULL;
435
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;
446
447         return retval;
448 }
449
450 static u32 crypto4xx_put_sd_to_sdr(struct crypto4xx_device *dev)
451 {
452         unsigned long flags;
453
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;
458         }
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);
464
465         return 0;
466 }
467
468 static inline struct ce_sd *crypto4xx_get_sdp(struct crypto4xx_device *dev,
469                                               dma_addr_t *sd_dma, u32 idx)
470 {
471         *sd_dma = dev->sdr_pa + sizeof(struct ce_sd) * idx;
472
473         return  (struct ce_sd *)(dev->sdr + sizeof(struct ce_sd) * idx);
474 }
475
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)
479 {
480         u32 len;
481
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;
510                 }
511
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;
522
523                 if (*idx == PPC4XX_LAST_SD)
524                         *idx = 0;
525                 else
526                         (*idx)++;
527
528                 return 0;
529     }
530 }
531
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)
537 {
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;
545
546         this_sd = pd_uinfo->first_sd;
547         offset = 0;
548         i = 0;
549
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);
555
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))
560                                 ;
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))
570                                 ;
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))
578                                         ;
579                         }
580                         i++;
581                 }
582         }
583 }
584
585 static u32 crypto4xx_copy_digest_to_dst(struct pd_uinfo *pd_uinfo,
586                                         struct crypto4xx_ctx *ctx)
587 {
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;
591
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);
595         }
596
597         return 0;
598 }
599
600 static void crypto4xx_ret_sg_desc(struct crypto4xx_device *dev,
601                                   struct pd_uinfo *pd_uinfo)
602 {
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;
609         }
610         if (pd_uinfo->num_sd) {
611                 for (i = 0; i < pd_uinfo->num_sd; i++)
612                         crypto4xx_put_sd_to_sdr(dev);
613
614                 pd_uinfo->first_sd = 0xffffffff;
615                 pd_uinfo->num_sd = 0;
616         }
617 }
618
619 static u32 crypto4xx_ablkcipher_done(struct crypto4xx_device *dev,
620                                      struct pd_uinfo *pd_uinfo,
621                                      struct ce_pd *pd)
622 {
623         struct crypto4xx_ctx *ctx;
624         struct ablkcipher_request *ablk_req;
625         struct scatterlist *dst;
626         dma_addr_t addr;
627
628         ablk_req = ablkcipher_request_cast(pd_uinfo->async_req);
629         ctx  = crypto_tfm_ctx(ablk_req->base.tfm);
630
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);
638         }
639         crypto4xx_ret_sg_desc(dev, pd_uinfo);
640         if (ablk_req->base.complete != NULL)
641                 ablk_req->base.complete(&ablk_req->base, 0);
642
643         return 0;
644 }
645
646 static u32 crypto4xx_ahash_done(struct crypto4xx_device *dev,
647                                 struct pd_uinfo *pd_uinfo)
648 {
649         struct crypto4xx_ctx *ctx;
650         struct ahash_request *ahash_req;
651
652         ahash_req = ahash_request_cast(pd_uinfo->async_req);
653         ctx  = crypto_tfm_ctx(ahash_req->base.tfm);
654
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);
661
662         return 0;
663 }
664
665 static u32 crypto4xx_pd_done(struct crypto4xx_device *dev, u32 idx)
666 {
667         struct ce_pd *pd;
668         struct pd_uinfo *pd_uinfo;
669
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);
677 }
678
679 /**
680  * Note: Only use this function to copy items that is word aligned.
681  */
682 void crypto4xx_memcpy_le(unsigned int *dst,
683                          const unsigned char *buf,
684                          int len)
685 {
686         u8 *tmp;
687         for (; len >= 4; buf += 4, len -= 4)
688                 *dst++ = cpu_to_le32(*(unsigned int *) buf);
689
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;
712         }
713 }
714
715 static void crypto4xx_stop_all(struct crypto4xx_core_device *core_dev)
716 {
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);
724 }
725
726 void crypto4xx_return_pd(struct crypto4xx_device *dev,
727                          u32 pd_entry, struct ce_pd *pd,
728                          struct pd_uinfo *pd_uinfo)
729 {
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;
735 }
736
737 /*
738  * derive number of elements in scatterlist
739  * Shamlessly copy from talitos.c
740  */
741 static int get_sg_count(struct scatterlist *sg_list, int nbytes)
742 {
743         struct scatterlist *sg = sg_list;
744         int sg_nents = 0;
745
746         while (nbytes) {
747                 sg_nents++;
748                 if (sg->length > nbytes)
749                         break;
750                 nbytes -= sg->length;
751                 sg = sg_next(sg);
752         }
753
754         return sg_nents;
755 }
756
757 static u32 get_next_gd(u32 current)
758 {
759         if (current != PPC4XX_LAST_GD)
760                 return current + 1;
761         else
762                 return 0;
763 }
764
765 static u32 get_next_sd(u32 current)
766 {
767         if (current != PPC4XX_LAST_SD)
768                 return current + 1;
769         else
770                 return 0;
771 }
772
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)
779 {
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;
795
796         /* figure how many gd is needed */
797         num_gd = get_sg_count(src, datalen);
798         if (num_gd == 1)
799                 num_gd = 0;
800
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;
811                 }
812         }
813
814         /*
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.
819          */
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;
826                 }
827         }
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;
835                 }
836         }
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;
845         }
846         spin_unlock_irqrestore(&dev->core_dev->lock, flags);
847
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;
854
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);
863
864                 memcpy((void *) sa + ctx->offset_to_sr_ptr,
865                         &pd_uinfo->sr_pa, 4);
866
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;
876                 }
877         }
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++;
905                 }
906         } else {
907                 pd->src = (u32)dma_map_page(dev->core_dev->device, sg_page(src),
908                                 src->offset, src->length, DMA_TO_DEVICE);
909                 /*
910                  * Disable gather in sa command
911                  */
912                 sa->sa_command_0.bf.gather = 0;
913                 /*
914                  * Indicate gather array is not used
915                  */
916                 pd_uinfo->first_gd = 0xffffffff;
917                 pd_uinfo->num_gd = 0;
918         }
919         if (ctx->is_hash || sg_is_last(dst)) {
920                 /*
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.
924                  */
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
965                                 /*
966                                  * SD entry can hold PPC4XX_SD_BUFFER_SIZE,
967                                  * which is more than nbytes, so done.
968                                  */
969                                 nbytes = 0;
970                 }
971         }
972
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;
981 }
982
983 /**
984  * Algorithm Registration Functions
985  */
986 static int crypto4xx_alg_init(struct crypto_tfm *tfm)
987 {
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);
991
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;
998
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;
1007         }
1008
1009         return 0;
1010 }
1011
1012 static void crypto4xx_alg_exit(struct crypto_tfm *tfm)
1013 {
1014         struct crypto4xx_ctx *ctx = crypto_tfm_ctx(tfm);
1015
1016         crypto4xx_free_sa(ctx);
1017         crypto4xx_free_state_record(ctx);
1018 }
1019
1020 int crypto4xx_register_alg(struct crypto4xx_device *sec_dev,
1021                            struct crypto4xx_alg_common *crypto_alg,
1022                            int array_size)
1023 {
1024         struct crypto4xx_alg *alg;
1025         int i;
1026         int rc = 0;
1027
1028         for (i = 0; i < array_size; i++) {
1029                 alg = kzalloc(sizeof(struct crypto4xx_alg), GFP_KERNEL);
1030                 if (!alg)
1031                         return -ENOMEM;
1032
1033                 alg->alg = crypto_alg[i];
1034                 alg->dev = sec_dev;
1035
1036                 switch (alg->alg.type) {
1037                 case CRYPTO_ALG_TYPE_AHASH:
1038                         rc = crypto_register_ahash(&alg->alg.u.hash);
1039                         break;
1040
1041                 default:
1042                         rc = crypto_register_alg(&alg->alg.u.cipher);
1043                         break;
1044                 }
1045
1046                 if (rc) {
1047                         list_del(&alg->entry);
1048                         kfree(alg);
1049                 } else {
1050                         list_add_tail(&alg->entry, &sec_dev->alg_list);
1051                 }
1052         }
1053
1054         return 0;
1055 }
1056
1057 static void crypto4xx_unregister_alg(struct crypto4xx_device *sec_dev)
1058 {
1059         struct crypto4xx_alg *alg, *tmp;
1060
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;
1067
1068                 default:
1069                         crypto_unregister_alg(&alg->alg.u.cipher);
1070                 }
1071                 kfree(alg);
1072         }
1073 }
1074
1075 static void crypto4xx_bh_tasklet_cb(unsigned long data)
1076 {
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;
1082
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;
1098                 }
1099         }
1100 }
1101
1102 /**
1103  * Top Half of isr.
1104  */
1105 static irqreturn_t crypto4xx_ce_interrupt_handler(int irq, void *data)
1106 {
1107         struct device *dev = (struct device *)data;
1108         struct crypto4xx_core_device *core_dev = dev_get_drvdata(dev);
1109
1110         if (core_dev->dev->ce_base == 0)
1111                 return 0;
1112
1113         writel(PPC4XX_INTERRUPT_CLR,
1114                core_dev->dev->ce_base + CRYPTO4XX_INT_CLR);
1115         tasklet_schedule(&core_dev->tasklet);
1116
1117         return IRQ_HANDLED;
1118 }
1119
1120 /**
1121  * Supported Crypto Algorithms
1122  */
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,
1144                         }
1145                 }
1146         }},
1147 };
1148
1149 /**
1150  * Module Initialization Routine
1151  */
1152 static int __init crypto4xx_probe(struct of_device *ofdev,
1153                                   const struct of_device_id *match)
1154 {
1155         int rc;
1156         struct resource res;
1157         struct device *dev = &ofdev->dev;
1158         struct crypto4xx_core_device *core_dev;
1159
1160         rc = of_address_to_resource(ofdev->node, 0, &res);
1161         if (rc)
1162                 return -ENODEV;
1163
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;
1184         }
1185
1186         core_dev = kzalloc(sizeof(struct crypto4xx_core_device), GFP_KERNEL);
1187         if (!core_dev)
1188                 return -ENOMEM;
1189
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;
1195
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;
1203
1204         rc = crypto4xx_build_gdr(core_dev->dev);
1205         if (rc)
1206                 goto err_build_gdr;
1207
1208         rc = crypto4xx_build_sdr(core_dev->dev);
1209         if (rc)
1210                 goto err_build_sdr;
1211
1212         /* Init tasklet for bottom half processing */
1213         tasklet_init(&core_dev->tasklet, crypto4xx_bh_tasklet_cb,
1214                      (unsigned long) dev);
1215
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;
1222
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;
1227         }
1228
1229         /* need to setup pdr, rdr, gdr and sdr before this */
1230         crypto4xx_hw_init(core_dev->dev);
1231
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;
1237
1238         return 0;
1239
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);
1256
1257         return rc;
1258 }
1259
1260 static int __exit crypto4xx_remove(struct of_device *ofdev)
1261 {
1262         struct device *dev = &ofdev->dev;
1263         struct crypto4xx_core_device *core_dev = dev_get_drvdata(dev);
1264
1265         free_irq(core_dev->irq, dev);
1266         irq_dispose_mapping(core_dev->irq);
1267
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);
1273
1274         return 0;
1275 }
1276
1277 static struct of_device_id crypto4xx_match[] = {
1278         { .compatible      = "amcc,ppc4xx-crypto",},
1279         { },
1280 };
1281
1282 static struct of_platform_driver crypto4xx_driver = {
1283         .name           = "crypto4xx",
1284         .match_table    = crypto4xx_match,
1285         .probe          = crypto4xx_probe,
1286         .remove         = crypto4xx_remove,
1287 };
1288
1289 static int __init crypto4xx_init(void)
1290 {
1291         return of_register_platform_driver(&crypto4xx_driver);
1292 }
1293
1294 static void __exit crypto4xx_exit(void)
1295 {
1296         of_unregister_platform_driver(&crypto4xx_driver);
1297 }
1298
1299 module_init(crypto4xx_init);
1300 module_exit(crypto4xx_exit);
1301
1302 MODULE_LICENSE("GPL");
1303 MODULE_AUTHOR("James Hsiao <jhsiao@amcc.com>");
1304 MODULE_DESCRIPTION("Driver for AMCC PPC4xx crypto accelerator");
1305