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