2 * AMCC SoC PPC4xx Crypto Driver
4 * Copyright (c) 2008 Applied Micro Circuits Corporation.
5 * All rights reserved. James Hsiao <jhsiao@amcc.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * This file implements AMCC crypto offload Linux device driver for use with
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>
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"
42 #define PPC4XX_SEC_VERSION_STR "0.5"
45 * PPC4xx Crypto Engine Initialization Routine
47 static void crypto4xx_hw_init(struct crypto4xx_device
*dev
)
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
;
54 union ce_pe_dma_cfg pe_dma_cfg
;
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 */
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
);
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
);
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
);
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
);
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
);
122 int crypto4xx_alloc_sa(struct crypto4xx_ctx
*ctx
, u32 size
)
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
)
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
,
134 ctx
->sa_in
, ctx
->sa_in_dma_addr
);
138 memset(ctx
->sa_in
, 0, size
* 4);
139 memset(ctx
->sa_out
, 0, size
* 4);
145 void crypto4xx_free_sa(struct crypto4xx_ctx
*ctx
)
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
);
154 ctx
->sa_in_dma_addr
= 0;
155 ctx
->sa_out_dma_addr
= 0;
159 u32
crypto4xx_alloc_state_record(struct crypto4xx_ctx
*ctx
)
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
)
166 memset(ctx
->state_record
, 0, sizeof(struct sa_state_record
));
171 void crypto4xx_free_state_record(struct crypto4xx_ctx
*ctx
)
173 if (ctx
->state_record
!= NULL
)
174 dma_free_coherent(ctx
->dev
->core_dev
->device
,
175 sizeof(struct sa_state_record
),
177 ctx
->state_record_dma_addr
);
178 ctx
->state_record_dma_addr
= 0;
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
186 static u32
crypto4xx_build_pdr(struct crypto4xx_device
*dev
)
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
);
196 dev
->pdr_uinfo
= kzalloc(sizeof(struct pd_uinfo
) * PPC4XX_NUM_PD
,
198 if (!dev
->pdr_uinfo
) {
199 dma_free_coherent(dev
->core_dev
->device
,
200 sizeof(struct ce_pd
) * PPC4XX_NUM_PD
,
205 memset(dev
->pdr
, 0, sizeof(struct ce_pd
) * PPC4XX_NUM_PD
);
206 dev
->shadow_sa_pool
= dma_alloc_coherent(dev
->core_dev
->device
,
208 &dev
->shadow_sa_pool_pa
,
210 if (!dev
->shadow_sa_pool
)
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
)
218 for (i
= 0; i
< PPC4XX_NUM_PD
; i
++) {
219 pd_uinfo
= (struct pd_uinfo
*) (dev
->pdr_uinfo
+
220 sizeof(struct pd_uinfo
) * i
);
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
;
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
;
236 static void crypto4xx_destroy_pdr(struct crypto4xx_device
*dev
)
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
);
250 kfree(dev
->pdr_uinfo
);
253 static u32
crypto4xx_get_pd_from_pdr_nolock(struct crypto4xx_device
*dev
)
258 retval
= dev
->pdr_head
;
259 tmp
= (dev
->pdr_head
+ 1) % PPC4XX_NUM_PD
;
261 if (tmp
== dev
->pdr_tail
)
262 return ERING_WAS_FULL
;
269 static u32
crypto4xx_put_pd_to_pdr(struct crypto4xx_device
*dev
, u32 idx
)
271 struct pd_uinfo
*pd_uinfo
;
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
)
281 pd_uinfo
->state
= PD_ENTRY_FREE
;
282 spin_unlock_irqrestore(&dev
->core_dev
->lock
, flags
);
287 static struct ce_pd
*crypto4xx_get_pdp(struct crypto4xx_device
*dev
,
288 dma_addr_t
*pd_dma
, u32 idx
)
290 *pd_dma
= dev
->pdr_pa
+ sizeof(struct ce_pd
) * idx
;
292 return dev
->pdr
+ sizeof(struct ce_pd
) * idx
;
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
300 static u32
crypto4xx_build_gdr(struct crypto4xx_device
*dev
)
302 dev
->gdr
= dma_alloc_coherent(dev
->core_dev
->device
,
303 sizeof(struct ce_gd
) * PPC4XX_NUM_GD
,
304 &dev
->gdr_pa
, GFP_ATOMIC
);
308 memset(dev
->gdr
, 0, sizeof(struct ce_gd
) * PPC4XX_NUM_GD
);
313 static inline void crypto4xx_destroy_gdr(struct crypto4xx_device
*dev
)
315 dma_free_coherent(dev
->core_dev
->device
,
316 sizeof(struct ce_gd
) * PPC4XX_NUM_GD
,
317 dev
->gdr
, dev
->gdr_pa
);
321 * when this function is called.
322 * preemption or interrupt must be disabled
324 u32
crypto4xx_get_n_gd(struct crypto4xx_device
*dev
, int n
)
328 if (n
>= PPC4XX_NUM_GD
)
329 return ERING_WAS_FULL
;
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
;
345 static u32
crypto4xx_put_gd_to_gdr(struct crypto4xx_device
*dev
)
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
);
355 if (dev
->gdr_tail
!= PPC4XX_LAST_GD
)
360 spin_unlock_irqrestore(&dev
->core_dev
->lock
, flags
);
365 static inline struct ce_gd
*crypto4xx_get_gdp(struct crypto4xx_device
*dev
,
366 dma_addr_t
*gd_dma
, u32 idx
)
368 *gd_dma
= dev
->gdr_pa
+ sizeof(struct ce_gd
) * idx
;
370 return (struct ce_gd
*) (dev
->gdr
+ sizeof(struct ce_gd
) * idx
);
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
378 static u32
crypto4xx_build_sdr(struct crypto4xx_device
*dev
)
381 struct ce_sd
*sd_array
;
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
);
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
);
404 for (i
= 0; i
< PPC4XX_NUM_SD
; i
++) {
405 sd_array
[i
].ptr
= dev
->scatter_buffer_pa
+
406 dev
->scatter_buffer_size
* i
;
412 static void crypto4xx_destroy_sdr(struct crypto4xx_device
*dev
)
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
);
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
);
427 * when this function is called.
428 * preemption or interrupt must be disabled
430 static u32
crypto4xx_get_n_sd(struct crypto4xx_device
*dev
, int n
)
435 if (n
>= PPC4XX_NUM_SD
)
436 return ERING_WAS_FULL
;
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 */
452 static u32
crypto4xx_put_sd_to_sdr(struct crypto4xx_device
*dev
)
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
);
461 if (dev
->sdr_tail
!= PPC4XX_LAST_SD
)
465 spin_unlock_irqrestore(&dev
->core_dev
->lock
, flags
);
470 static inline struct ce_sd
*crypto4xx_get_sdp(struct crypto4xx_device
*dev
,
471 dma_addr_t
*sd_dma
, u32 idx
)
473 *sd_dma
= dev
->sdr_pa
+ sizeof(struct ce_sd
) * idx
;
475 return (struct ce_sd
*)(dev
->sdr
+ sizeof(struct ce_sd
) * idx
);
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
)
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
);
490 *length
-= dev
->scatter_buffer_size
;
491 *nbytes
-= dev
->scatter_buffer_size
;
492 if (*idx
== PPC4XX_LAST_SD
)
496 *addr
= *addr
+ dev
->scatter_buffer_size
;
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
)
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
,
525 if (*idx
== PPC4XX_LAST_SD
)
534 static void crypto4xx_copy_pkt_to_dst(struct crypto4xx_device
*dev
,
536 struct pd_uinfo
*pd_uinfo
,
538 struct scatterlist
*dst
)
546 struct scatterlist
*sg
;
548 this_sd
= pd_uinfo
->first_sd
;
555 addr
= dma_map_page(dev
->core_dev
->device
, sg_page(sg
),
556 sg
->offset
, sg
->length
, DMA_TO_DEVICE
);
559 len
= (nbytes
<= sg
->length
) ? nbytes
: sg
->length
;
560 while (crypto4xx_fill_one_page(dev
, &addr
, &len
,
561 &this_sd
, &offset
, &nbytes
))
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
))
578 while (crypto4xx_fill_one_page(dev
, &addr
,
579 &sg_len
, &this_sd
, &offset
, &nbytes
))
587 static u32
crypto4xx_copy_digest_to_dst(struct pd_uinfo
*pd_uinfo
,
588 struct crypto4xx_ctx
*ctx
)
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
;
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
);
602 static void crypto4xx_ret_sg_desc(struct crypto4xx_device
*dev
,
603 struct pd_uinfo
*pd_uinfo
)
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;
612 if (pd_uinfo
->num_sd
) {
613 for (i
= 0; i
< pd_uinfo
->num_sd
; i
++)
614 crypto4xx_put_sd_to_sdr(dev
);
616 pd_uinfo
->first_sd
= 0xffffffff;
617 pd_uinfo
->num_sd
= 0;
621 static u32
crypto4xx_ablkcipher_done(struct crypto4xx_device
*dev
,
622 struct pd_uinfo
*pd_uinfo
,
625 struct crypto4xx_ctx
*ctx
;
626 struct ablkcipher_request
*ablk_req
;
627 struct scatterlist
*dst
;
630 ablk_req
= ablkcipher_request_cast(pd_uinfo
->async_req
);
631 ctx
= crypto_tfm_ctx(ablk_req
->base
.tfm
);
633 if (pd_uinfo
->using_sd
) {
634 crypto4xx_copy_pkt_to_dst(dev
, pd
, pd_uinfo
, ablk_req
->nbytes
,
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
);
641 crypto4xx_ret_sg_desc(dev
, pd_uinfo
);
642 if (ablk_req
->base
.complete
!= NULL
)
643 ablk_req
->base
.complete(&ablk_req
->base
, 0);
648 static u32
crypto4xx_ahash_done(struct crypto4xx_device
*dev
,
649 struct pd_uinfo
*pd_uinfo
)
651 struct crypto4xx_ctx
*ctx
;
652 struct ahash_request
*ahash_req
;
654 ahash_req
= ahash_request_cast(pd_uinfo
->async_req
);
655 ctx
= crypto_tfm_ctx(ahash_req
->base
.tfm
);
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);
667 static u32
crypto4xx_pd_done(struct crypto4xx_device
*dev
, u32 idx
)
670 struct pd_uinfo
*pd_uinfo
;
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
);
678 return crypto4xx_ahash_done(dev
, pd_uinfo
);
682 * Note: Only use this function to copy items that is word aligned.
684 void crypto4xx_memcpy_le(unsigned int *dst
,
685 const unsigned char *buf
,
689 for (; len
>= 4; buf
+= 4, len
-= 4)
690 *dst
++ = cpu_to_le32(*(unsigned int *) buf
);
717 static void crypto4xx_stop_all(struct crypto4xx_core_device
*core_dev
)
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
);
728 void crypto4xx_return_pd(struct crypto4xx_device
*dev
,
729 u32 pd_entry
, struct ce_pd
*pd
,
730 struct pd_uinfo
*pd_uinfo
)
732 /* irq should be already disabled */
733 dev
->pdr_head
= pd_entry
;
735 pd
->pd_ctl_len
.w
= 0;
736 pd_uinfo
->state
= PD_ENTRY_FREE
;
740 * derive number of elements in scatterlist
741 * Shamlessly copy from talitos.c
743 static int get_sg_count(struct scatterlist
*sg_list
, int nbytes
)
745 struct scatterlist
*sg
= sg_list
;
750 if (sg
->length
> nbytes
)
752 nbytes
-= sg
->length
;
759 static u32
get_next_gd(u32 current
)
761 if (current
!= PPC4XX_LAST_GD
)
767 static u32
get_next_sd(u32 current
)
769 if (current
!= PPC4XX_LAST_SD
)
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
)
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
;
789 u32 fst_gd
= 0xffffffff;
790 u32 fst_sd
= 0xffffffff;
793 struct pd_uinfo
*pd_uinfo
= NULL
;
794 unsigned int nbytes
= datalen
, idx
;
795 unsigned int ivlen
= 0;
798 /* figure how many gd is needed */
799 num_gd
= get_sg_count(src
, datalen
);
803 /* figure how many sd is needed */
804 if (sg_is_last(dst
) || ctx
->is_hash
) {
807 if (datalen
> PPC4XX_SD_BUFFER_SIZE
) {
808 num_sd
= datalen
/ PPC4XX_SD_BUFFER_SIZE
;
809 if (datalen
% PPC4XX_SD_BUFFER_SIZE
)
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.
822 spin_lock_irqsave(&dev
->core_dev
->lock
, flags
);
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
);
831 fst_sd
= crypto4xx_get_n_sd(dev
, num_sd
);
832 if (fst_sd
== ERING_WAS_FULL
) {
834 dev
->gdr_head
= fst_gd
;
835 spin_unlock_irqrestore(&dev
->core_dev
->lock
, flags
);
839 pd_entry
= crypto4xx_get_pd_from_pdr_nolock(dev
);
840 if (pd_entry
== ERING_WAS_FULL
) {
842 dev
->gdr_head
= fst_gd
;
844 dev
->sdr_head
= fst_sd
;
845 spin_unlock_irqrestore(&dev
->core_dev
->lock
, flags
);
848 spin_unlock_irqrestore(&dev
->core_dev
->lock
, flags
);
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
;
857 if (iv_len
|| ctx
->is_hash
) {
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);
864 memcpy(sa
, ctx
->sa_out
, ctx
->sa_len
* 4);
866 memcpy((void *) sa
+ ctx
->offset_to_sr_ptr
,
867 &pd_uinfo
->sr_pa
, 4);
870 crypto4xx_memcpy_le(pd_uinfo
->sr_va
, iv
, iv_len
);
872 if (ctx
->direction
== DIR_INBOUND
) {
873 pd
->sa
= ctx
->sa_in_dma_addr
;
874 sa
= (struct dynamic_sa_ctl
*) ctx
->sa_in
;
876 pd
->sa
= ctx
->sa_out_dma_addr
;
877 sa
= (struct dynamic_sa_ctl
*) ctx
->sa_out
;
880 pd
->sa_len
= ctx
->sa_len
;
882 /* get first gd we are going to use */
884 pd_uinfo
->first_gd
= fst_gd
;
885 pd_uinfo
->num_gd
= num_gd
;
886 gd
= crypto4xx_get_gdp(dev
, &gd_dma
, gd_idx
);
889 sa
->sa_command_0
.bf
.gather
= 1;
892 /* walk the sg, and setup gather array */
895 addr
= dma_map_page(dev
->core_dev
->device
, sg_page(sg
),
896 sg
->offset
, sg
->length
, DMA_TO_DEVICE
);
898 gd
->ctl_len
.len
= sg
->length
;
899 gd
->ctl_len
.done
= 0;
900 gd
->ctl_len
.ready
= 1;
901 if (sg
->length
>= nbytes
)
903 nbytes
-= sg
->length
;
904 gd_idx
= get_next_gd(gd_idx
);
905 gd
= crypto4xx_get_gdp(dev
, &gd_dma
, gd_idx
);
909 pd
->src
= (u32
)dma_map_page(dev
->core_dev
->device
, sg_page(src
),
910 src
->offset
, src
->length
, DMA_TO_DEVICE
);
912 * Disable gather in sa command
914 sa
->sa_command_0
.bf
.gather
= 0;
916 * Indicate gather array is not used
918 pd_uinfo
->first_gd
= 0xffffffff;
919 pd_uinfo
->num_gd
= 0;
921 if (ctx
->is_hash
|| sg_is_last(dst
)) {
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.
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;
933 pd
->dest
= virt_to_phys((void *)dst
);
935 pd
->dest
= (u32
)dma_map_page(dev
->core_dev
->device
,
936 sg_page(dst
), dst
->offset
,
937 dst
->length
, DMA_TO_DEVICE
);
939 struct ce_sd
*sd
= NULL
;
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
);
949 /* setup scatter descriptor */
952 /* sd->ptr should be setup by sd_init routine*/
954 if (nbytes
>= PPC4XX_SD_BUFFER_SIZE
)
955 nbytes
-= PPC4XX_SD_BUFFER_SIZE
;
959 sd_idx
= get_next_sd(sd_idx
);
960 sd
= crypto4xx_get_sdp(dev
, &sd_dma
, sd_idx
);
961 /* setup scatter descriptor */
964 if (nbytes
>= PPC4XX_SD_BUFFER_SIZE
)
965 nbytes
-= PPC4XX_SD_BUFFER_SIZE
;
968 * SD entry can hold PPC4XX_SD_BUFFER_SIZE,
969 * which is more than nbytes, so done.
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
;
980 /* write any value to push engine to read a pd */
981 writel(1, dev
->ce_base
+ CRYPTO4XX_INT_DESCR_RD
);
986 * Algorithm Registration Functions
988 static int crypto4xx_alg_init(struct crypto_tfm
*tfm
)
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
);
994 ctx
->dev
= amcc_alg
->dev
;
997 ctx
->sa_in_dma_addr
= 0;
998 ctx
->sa_out_dma_addr
= 0;
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
);
1009 static void crypto4xx_alg_exit(struct crypto_tfm
*tfm
)
1011 struct crypto4xx_ctx
*ctx
= crypto_tfm_ctx(tfm
);
1013 crypto4xx_free_sa(ctx
);
1014 crypto4xx_free_state_record(ctx
);
1017 int crypto4xx_register_alg(struct crypto4xx_device
*sec_dev
,
1018 struct crypto_alg
*crypto_alg
, int array_size
)
1020 struct crypto4xx_alg
*alg
;
1024 for (i
= 0; i
< array_size
; i
++) {
1025 alg
= kzalloc(sizeof(struct crypto4xx_alg
), GFP_KERNEL
);
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
;
1036 rc
= crypto_register_alg(&alg
->alg
);
1038 list_del(&alg
->entry
);
1041 list_add_tail(&alg
->entry
, &sec_dev
->alg_list
);
1048 static void crypto4xx_unregister_alg(struct crypto4xx_device
*sec_dev
)
1050 struct crypto4xx_alg
*alg
, *tmp
;
1052 list_for_each_entry_safe(alg
, tmp
, &sec_dev
->alg_list
, entry
) {
1053 list_del(&alg
->entry
);
1054 crypto_unregister_alg(&alg
->alg
);
1059 static void crypto4xx_bh_tasklet_cb(unsigned long data
)
1061 struct device
*dev
= (struct device
*)data
;
1062 struct crypto4xx_core_device
*core_dev
= dev_get_drvdata(dev
);
1063 struct pd_uinfo
*pd_uinfo
;
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
;
1080 /* if tail not done, break */
1089 static irqreturn_t
crypto4xx_ce_interrupt_handler(int irq
, void *data
)
1091 struct device
*dev
= (struct device
*)data
;
1092 struct crypto4xx_core_device
*core_dev
= dev_get_drvdata(dev
);
1094 if (core_dev
->dev
->ce_base
== 0)
1097 writel(PPC4XX_INTERRUPT_CLR
,
1098 core_dev
->dev
->ce_base
+ CRYPTO4XX_INT_CLR
);
1099 tasklet_schedule(&core_dev
->tasklet
);
1105 * Supported Crypto Algorithms
1107 struct crypto_alg crypto4xx_alg
[] = {
1108 /* Crypto AES modes */
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
),
1117 .cra_type
= &crypto_ablkcipher_type
,
1118 .cra_module
= THIS_MODULE
,
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
,
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
),
1139 .cra_type
= &crypto_ahash_type
,
1140 .cra_init
= crypto4xx_sha1_alg_init
,
1141 .cra_module
= THIS_MODULE
,
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
,
1155 * Module Initialization Routine
1157 static int __init
crypto4xx_probe(struct of_device
*ofdev
,
1158 const struct of_device_id
*match
)
1161 struct resource res
;
1162 struct device
*dev
= &ofdev
->dev
;
1163 struct crypto4xx_core_device
*core_dev
;
1165 rc
= of_address_to_resource(ofdev
->node
, 0, &res
);
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
);
1187 printk(KERN_ERR
"Crypto Function Not supported!\n");
1191 core_dev
= kzalloc(sizeof(struct crypto4xx_core_device
), GFP_KERNEL
);
1195 dev_set_drvdata(dev
, core_dev
);
1196 core_dev
->ofdev
= ofdev
;
1197 core_dev
->dev
= kzalloc(sizeof(struct crypto4xx_device
), GFP_KERNEL
);
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
);
1209 rc
= crypto4xx_build_gdr(core_dev
->dev
);
1213 rc
= crypto4xx_build_sdr(core_dev
->dev
);
1217 /* Init tasklet for bottom half processing */
1218 tasklet_init(&core_dev
->tasklet
, crypto4xx_bh_tasklet_cb
,
1219 (unsigned long) dev
);
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
);
1226 goto err_request_irq
;
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");
1234 /* need to setup pdr, rdr, gdr and sdr before this */
1235 crypto4xx_hw_init(core_dev
->dev
);
1237 /* Register security algorithms with Linux CryptoAPI */
1238 rc
= crypto4xx_register_alg(core_dev
->dev
, crypto4xx_alg
,
1239 ARRAY_SIZE(crypto4xx_alg
));
1246 iounmap(core_dev
->dev
->ce_base
);
1248 free_irq(core_dev
->irq
, dev
);
1249 irq_dispose_mapping(core_dev
->irq
);
1250 tasklet_kill(&core_dev
->tasklet
);
1252 crypto4xx_destroy_sdr(core_dev
->dev
);
1254 crypto4xx_destroy_gdr(core_dev
->dev
);
1256 crypto4xx_destroy_pdr(core_dev
->dev
);
1258 kfree(core_dev
->dev
);
1265 static int __exit
crypto4xx_remove(struct of_device
*ofdev
)
1267 struct device
*dev
= &ofdev
->dev
;
1268 struct crypto4xx_core_device
*core_dev
= dev_get_drvdata(dev
);
1270 free_irq(core_dev
->irq
, dev
);
1271 irq_dispose_mapping(core_dev
->irq
);
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
);
1282 static struct of_device_id crypto4xx_match
[] = {
1283 { .compatible
= "amcc,ppc4xx-crypto",},
1287 static struct of_platform_driver crypto4xx_driver
= {
1288 .name
= "crypto4xx",
1289 .match_table
= crypto4xx_match
,
1290 .probe
= crypto4xx_probe
,
1291 .remove
= crypto4xx_remove
,
1294 static int __init
crypto4xx_init(void)
1296 return of_register_platform_driver(&crypto4xx_driver
);
1299 static void __exit
crypto4xx_exit(void)
1301 of_unregister_platform_driver(&crypto4xx_driver
);
1304 module_init(crypto4xx_init
);
1305 module_exit(crypto4xx_exit
);
1307 MODULE_LICENSE("GPL");
1308 MODULE_AUTHOR("James Hsiao <jhsiao@amcc.com>");
1309 MODULE_DESCRIPTION("Driver for AMCC PPC4xx crypto accelerator");