4 * Support for ATMEL AES HW acceleration.
6 * Copyright (c) 2012 Eukréa Electromatique - ATMEL
7 * Author: Nicolas Royer <nicolas@eukrea.com>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as published
11 * by the Free Software Foundation.
13 * Some ideas are from omap-aes.c driver.
17 #include <linux/kernel.h>
18 #include <linux/module.h>
19 #include <linux/slab.h>
20 #include <linux/err.h>
21 #include <linux/clk.h>
23 #include <linux/hw_random.h>
24 #include <linux/platform_device.h>
26 #include <linux/device.h>
27 #include <linux/init.h>
28 #include <linux/errno.h>
29 #include <linux/interrupt.h>
30 #include <linux/irq.h>
31 #include <linux/scatterlist.h>
32 #include <linux/dma-mapping.h>
33 #include <linux/of_device.h>
34 #include <linux/delay.h>
35 #include <linux/crypto.h>
36 #include <crypto/scatterwalk.h>
37 #include <crypto/algapi.h>
38 #include <crypto/aes.h>
39 #include <crypto/xts.h>
40 #include <crypto/internal/aead.h>
41 #include <linux/platform_data/crypto-atmel.h>
42 #include <dt-bindings/dma/at91.h>
43 #include "atmel-aes-regs.h"
44 #include "atmel-authenc.h"
46 #define ATMEL_AES_PRIORITY 300
48 #define ATMEL_AES_BUFFER_ORDER 2
49 #define ATMEL_AES_BUFFER_SIZE (PAGE_SIZE << ATMEL_AES_BUFFER_ORDER)
51 #define CFB8_BLOCK_SIZE 1
52 #define CFB16_BLOCK_SIZE 2
53 #define CFB32_BLOCK_SIZE 4
54 #define CFB64_BLOCK_SIZE 8
56 #define SIZE_IN_WORDS(x) ((x) >> 2)
59 /* Reserve bits [18:16] [14:12] [1:0] for mode (same as for AES_MR) */
60 #define AES_FLAGS_ENCRYPT AES_MR_CYPHER_ENC
61 #define AES_FLAGS_GTAGEN AES_MR_GTAGEN
62 #define AES_FLAGS_OPMODE_MASK (AES_MR_OPMOD_MASK | AES_MR_CFBS_MASK)
63 #define AES_FLAGS_ECB AES_MR_OPMOD_ECB
64 #define AES_FLAGS_CBC AES_MR_OPMOD_CBC
65 #define AES_FLAGS_OFB AES_MR_OPMOD_OFB
66 #define AES_FLAGS_CFB128 (AES_MR_OPMOD_CFB | AES_MR_CFBS_128b)
67 #define AES_FLAGS_CFB64 (AES_MR_OPMOD_CFB | AES_MR_CFBS_64b)
68 #define AES_FLAGS_CFB32 (AES_MR_OPMOD_CFB | AES_MR_CFBS_32b)
69 #define AES_FLAGS_CFB16 (AES_MR_OPMOD_CFB | AES_MR_CFBS_16b)
70 #define AES_FLAGS_CFB8 (AES_MR_OPMOD_CFB | AES_MR_CFBS_8b)
71 #define AES_FLAGS_CTR AES_MR_OPMOD_CTR
72 #define AES_FLAGS_GCM AES_MR_OPMOD_GCM
73 #define AES_FLAGS_XTS AES_MR_OPMOD_XTS
75 #define AES_FLAGS_MODE_MASK (AES_FLAGS_OPMODE_MASK | \
79 #define AES_FLAGS_INIT BIT(2)
80 #define AES_FLAGS_BUSY BIT(3)
81 #define AES_FLAGS_DUMP_REG BIT(4)
82 #define AES_FLAGS_OWN_SHA BIT(5)
84 #define AES_FLAGS_PERSISTENT (AES_FLAGS_INIT | AES_FLAGS_BUSY)
86 #define ATMEL_AES_QUEUE_LENGTH 50
88 #define ATMEL_AES_DMA_THRESHOLD 256
91 struct atmel_aes_caps
{
101 struct atmel_aes_dev
;
104 typedef int (*atmel_aes_fn_t
)(struct atmel_aes_dev
*);
107 struct atmel_aes_base_ctx
{
108 struct atmel_aes_dev
*dd
;
109 atmel_aes_fn_t start
;
111 u32 key
[AES_KEYSIZE_256
/ sizeof(u32
)];
115 struct atmel_aes_ctx
{
116 struct atmel_aes_base_ctx base
;
119 struct atmel_aes_ctr_ctx
{
120 struct atmel_aes_base_ctx base
;
122 u32 iv
[AES_BLOCK_SIZE
/ sizeof(u32
)];
124 struct scatterlist src
[2];
125 struct scatterlist dst
[2];
128 struct atmel_aes_gcm_ctx
{
129 struct atmel_aes_base_ctx base
;
131 struct scatterlist src
[2];
132 struct scatterlist dst
[2];
134 u32 j0
[AES_BLOCK_SIZE
/ sizeof(u32
)];
135 u32 tag
[AES_BLOCK_SIZE
/ sizeof(u32
)];
136 u32 ghash
[AES_BLOCK_SIZE
/ sizeof(u32
)];
141 atmel_aes_fn_t ghash_resume
;
144 struct atmel_aes_xts_ctx
{
145 struct atmel_aes_base_ctx base
;
147 u32 key2
[AES_KEYSIZE_256
/ sizeof(u32
)];
150 #ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
151 struct atmel_aes_authenc_ctx
{
152 struct atmel_aes_base_ctx base
;
153 struct atmel_sha_authenc_ctx
*auth
;
157 struct atmel_aes_reqctx
{
161 #ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
162 struct atmel_aes_authenc_reqctx
{
163 struct atmel_aes_reqctx base
;
165 struct scatterlist src
[2];
166 struct scatterlist dst
[2];
168 u32 digest
[SHA512_DIGEST_SIZE
/ sizeof(u32
)];
170 /* auth_req MUST be place last. */
171 struct ahash_request auth_req
;
175 struct atmel_aes_dma
{
176 struct dma_chan
*chan
;
177 struct scatterlist
*sg
;
179 unsigned int remainder
;
183 struct atmel_aes_dev
{
184 struct list_head list
;
185 unsigned long phys_base
;
186 void __iomem
*io_base
;
188 struct crypto_async_request
*areq
;
189 struct atmel_aes_base_ctx
*ctx
;
192 atmel_aes_fn_t resume
;
193 atmel_aes_fn_t cpu_transfer_complete
;
202 struct crypto_queue queue
;
204 struct tasklet_struct done_task
;
205 struct tasklet_struct queue_task
;
211 struct atmel_aes_dma src
;
212 struct atmel_aes_dma dst
;
216 struct scatterlist aligned_sg
;
217 struct scatterlist
*real_dst
;
219 struct atmel_aes_caps caps
;
224 struct atmel_aes_drv
{
225 struct list_head dev_list
;
229 static struct atmel_aes_drv atmel_aes
= {
230 .dev_list
= LIST_HEAD_INIT(atmel_aes
.dev_list
),
231 .lock
= __SPIN_LOCK_UNLOCKED(atmel_aes
.lock
),
235 static const char *atmel_aes_reg_name(u32 offset
, char *tmp
, size_t sz
)
264 snprintf(tmp
, sz
, "KEYWR[%u]", (offset
- AES_KEYWR(0)) >> 2);
271 snprintf(tmp
, sz
, "IDATAR[%u]", (offset
- AES_IDATAR(0)) >> 2);
278 snprintf(tmp
, sz
, "ODATAR[%u]", (offset
- AES_ODATAR(0)) >> 2);
285 snprintf(tmp
, sz
, "IVR[%u]", (offset
- AES_IVR(0)) >> 2);
298 snprintf(tmp
, sz
, "GHASHR[%u]", (offset
- AES_GHASHR(0)) >> 2);
305 snprintf(tmp
, sz
, "TAGR[%u]", (offset
- AES_TAGR(0)) >> 2);
315 snprintf(tmp
, sz
, "GCMHR[%u]", (offset
- AES_GCMHR(0)) >> 2);
325 snprintf(tmp
, sz
, "TWR[%u]", (offset
- AES_TWR(0)) >> 2);
332 snprintf(tmp
, sz
, "ALPHAR[%u]", (offset
- AES_ALPHAR(0)) >> 2);
336 snprintf(tmp
, sz
, "0x%02x", offset
);
342 #endif /* VERBOSE_DEBUG */
344 /* Shared functions */
346 static inline u32
atmel_aes_read(struct atmel_aes_dev
*dd
, u32 offset
)
348 u32 value
= readl_relaxed(dd
->io_base
+ offset
);
351 if (dd
->flags
& AES_FLAGS_DUMP_REG
) {
354 dev_vdbg(dd
->dev
, "read 0x%08x from %s\n", value
,
355 atmel_aes_reg_name(offset
, tmp
, sizeof(tmp
)));
357 #endif /* VERBOSE_DEBUG */
362 static inline void atmel_aes_write(struct atmel_aes_dev
*dd
,
363 u32 offset
, u32 value
)
366 if (dd
->flags
& AES_FLAGS_DUMP_REG
) {
369 dev_vdbg(dd
->dev
, "write 0x%08x into %s\n", value
,
370 atmel_aes_reg_name(offset
, tmp
, sizeof(tmp
)));
372 #endif /* VERBOSE_DEBUG */
374 writel_relaxed(value
, dd
->io_base
+ offset
);
377 static void atmel_aes_read_n(struct atmel_aes_dev
*dd
, u32 offset
,
378 u32
*value
, int count
)
380 for (; count
--; value
++, offset
+= 4)
381 *value
= atmel_aes_read(dd
, offset
);
384 static void atmel_aes_write_n(struct atmel_aes_dev
*dd
, u32 offset
,
385 const u32
*value
, int count
)
387 for (; count
--; value
++, offset
+= 4)
388 atmel_aes_write(dd
, offset
, *value
);
391 static inline void atmel_aes_read_block(struct atmel_aes_dev
*dd
, u32 offset
,
394 atmel_aes_read_n(dd
, offset
, value
, SIZE_IN_WORDS(AES_BLOCK_SIZE
));
397 static inline void atmel_aes_write_block(struct atmel_aes_dev
*dd
, u32 offset
,
400 atmel_aes_write_n(dd
, offset
, value
, SIZE_IN_WORDS(AES_BLOCK_SIZE
));
403 static inline int atmel_aes_wait_for_data_ready(struct atmel_aes_dev
*dd
,
404 atmel_aes_fn_t resume
)
406 u32 isr
= atmel_aes_read(dd
, AES_ISR
);
408 if (unlikely(isr
& AES_INT_DATARDY
))
412 atmel_aes_write(dd
, AES_IER
, AES_INT_DATARDY
);
416 static inline size_t atmel_aes_padlen(size_t len
, size_t block_size
)
418 len
&= block_size
- 1;
419 return len
? block_size
- len
: 0;
422 static struct atmel_aes_dev
*atmel_aes_find_dev(struct atmel_aes_base_ctx
*ctx
)
424 struct atmel_aes_dev
*aes_dd
= NULL
;
425 struct atmel_aes_dev
*tmp
;
427 spin_lock_bh(&atmel_aes
.lock
);
429 list_for_each_entry(tmp
, &atmel_aes
.dev_list
, list
) {
438 spin_unlock_bh(&atmel_aes
.lock
);
443 static int atmel_aes_hw_init(struct atmel_aes_dev
*dd
)
447 err
= clk_enable(dd
->iclk
);
451 if (!(dd
->flags
& AES_FLAGS_INIT
)) {
452 atmel_aes_write(dd
, AES_CR
, AES_CR_SWRST
);
453 atmel_aes_write(dd
, AES_MR
, 0xE << AES_MR_CKEY_OFFSET
);
454 dd
->flags
|= AES_FLAGS_INIT
;
460 static inline unsigned int atmel_aes_get_version(struct atmel_aes_dev
*dd
)
462 return atmel_aes_read(dd
, AES_HW_VERSION
) & 0x00000fff;
465 static int atmel_aes_hw_version_init(struct atmel_aes_dev
*dd
)
469 err
= atmel_aes_hw_init(dd
);
473 dd
->hw_version
= atmel_aes_get_version(dd
);
475 dev_info(dd
->dev
, "version: 0x%x\n", dd
->hw_version
);
477 clk_disable(dd
->iclk
);
481 static inline void atmel_aes_set_mode(struct atmel_aes_dev
*dd
,
482 const struct atmel_aes_reqctx
*rctx
)
484 /* Clear all but persistent flags and set request flags. */
485 dd
->flags
= (dd
->flags
& AES_FLAGS_PERSISTENT
) | rctx
->mode
;
488 static inline bool atmel_aes_is_encrypt(const struct atmel_aes_dev
*dd
)
490 return (dd
->flags
& AES_FLAGS_ENCRYPT
);
493 #ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
494 static void atmel_aes_authenc_complete(struct atmel_aes_dev
*dd
, int err
);
497 static inline int atmel_aes_complete(struct atmel_aes_dev
*dd
, int err
)
499 #ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
500 atmel_aes_authenc_complete(dd
, err
);
503 clk_disable(dd
->iclk
);
504 dd
->flags
&= ~AES_FLAGS_BUSY
;
507 dd
->areq
->complete(dd
->areq
, err
);
509 tasklet_schedule(&dd
->queue_task
);
514 static void atmel_aes_write_ctrl_key(struct atmel_aes_dev
*dd
, bool use_dma
,
515 const u32
*iv
, const u32
*key
, int keylen
)
519 /* MR register must be set before IV registers */
520 if (keylen
== AES_KEYSIZE_128
)
521 valmr
|= AES_MR_KEYSIZE_128
;
522 else if (keylen
== AES_KEYSIZE_192
)
523 valmr
|= AES_MR_KEYSIZE_192
;
525 valmr
|= AES_MR_KEYSIZE_256
;
527 valmr
|= dd
->flags
& AES_FLAGS_MODE_MASK
;
530 valmr
|= AES_MR_SMOD_IDATAR0
;
531 if (dd
->caps
.has_dualbuff
)
532 valmr
|= AES_MR_DUALBUFF
;
534 valmr
|= AES_MR_SMOD_AUTO
;
537 atmel_aes_write(dd
, AES_MR
, valmr
);
539 atmel_aes_write_n(dd
, AES_KEYWR(0), key
, SIZE_IN_WORDS(keylen
));
541 if (iv
&& (valmr
& AES_MR_OPMOD_MASK
) != AES_MR_OPMOD_ECB
)
542 atmel_aes_write_block(dd
, AES_IVR(0), iv
);
545 static inline void atmel_aes_write_ctrl(struct atmel_aes_dev
*dd
, bool use_dma
,
549 atmel_aes_write_ctrl_key(dd
, use_dma
, iv
,
550 dd
->ctx
->key
, dd
->ctx
->keylen
);
555 static int atmel_aes_cpu_transfer(struct atmel_aes_dev
*dd
)
561 atmel_aes_read_block(dd
, AES_ODATAR(0), dd
->data
);
563 dd
->datalen
-= AES_BLOCK_SIZE
;
565 if (dd
->datalen
< AES_BLOCK_SIZE
)
568 atmel_aes_write_block(dd
, AES_IDATAR(0), dd
->data
);
570 isr
= atmel_aes_read(dd
, AES_ISR
);
571 if (!(isr
& AES_INT_DATARDY
)) {
572 dd
->resume
= atmel_aes_cpu_transfer
;
573 atmel_aes_write(dd
, AES_IER
, AES_INT_DATARDY
);
578 if (!sg_copy_from_buffer(dd
->real_dst
, sg_nents(dd
->real_dst
),
583 return atmel_aes_complete(dd
, err
);
585 return dd
->cpu_transfer_complete(dd
);
588 static int atmel_aes_cpu_start(struct atmel_aes_dev
*dd
,
589 struct scatterlist
*src
,
590 struct scatterlist
*dst
,
592 atmel_aes_fn_t resume
)
594 size_t padlen
= atmel_aes_padlen(len
, AES_BLOCK_SIZE
);
596 if (unlikely(len
== 0))
599 sg_copy_to_buffer(src
, sg_nents(src
), dd
->buf
, len
);
603 dd
->cpu_transfer_complete
= resume
;
604 dd
->datalen
= len
+ padlen
;
605 dd
->data
= (u32
*)dd
->buf
;
606 atmel_aes_write_block(dd
, AES_IDATAR(0), dd
->data
);
607 return atmel_aes_wait_for_data_ready(dd
, atmel_aes_cpu_transfer
);
613 static void atmel_aes_dma_callback(void *data
);
615 static bool atmel_aes_check_aligned(struct atmel_aes_dev
*dd
,
616 struct scatterlist
*sg
,
618 struct atmel_aes_dma
*dma
)
622 if (!IS_ALIGNED(len
, dd
->ctx
->block_size
))
625 for (nents
= 0; sg
; sg
= sg_next(sg
), ++nents
) {
626 if (!IS_ALIGNED(sg
->offset
, sizeof(u32
)))
629 if (len
<= sg
->length
) {
630 if (!IS_ALIGNED(len
, dd
->ctx
->block_size
))
633 dma
->nents
= nents
+1;
634 dma
->remainder
= sg
->length
- len
;
639 if (!IS_ALIGNED(sg
->length
, dd
->ctx
->block_size
))
648 static inline void atmel_aes_restore_sg(const struct atmel_aes_dma
*dma
)
650 struct scatterlist
*sg
= dma
->sg
;
651 int nents
= dma
->nents
;
656 while (--nents
> 0 && sg
)
662 sg
->length
+= dma
->remainder
;
665 static int atmel_aes_map(struct atmel_aes_dev
*dd
,
666 struct scatterlist
*src
,
667 struct scatterlist
*dst
,
670 bool src_aligned
, dst_aligned
;
678 src_aligned
= atmel_aes_check_aligned(dd
, src
, len
, &dd
->src
);
680 dst_aligned
= src_aligned
;
682 dst_aligned
= atmel_aes_check_aligned(dd
, dst
, len
, &dd
->dst
);
683 if (!src_aligned
|| !dst_aligned
) {
684 padlen
= atmel_aes_padlen(len
, dd
->ctx
->block_size
);
686 if (dd
->buflen
< len
+ padlen
)
690 sg_copy_to_buffer(src
, sg_nents(src
), dd
->buf
, len
);
691 dd
->src
.sg
= &dd
->aligned_sg
;
693 dd
->src
.remainder
= 0;
697 dd
->dst
.sg
= &dd
->aligned_sg
;
699 dd
->dst
.remainder
= 0;
702 sg_init_table(&dd
->aligned_sg
, 1);
703 sg_set_buf(&dd
->aligned_sg
, dd
->buf
, len
+ padlen
);
706 if (dd
->src
.sg
== dd
->dst
.sg
) {
707 dd
->src
.sg_len
= dma_map_sg(dd
->dev
, dd
->src
.sg
, dd
->src
.nents
,
709 dd
->dst
.sg_len
= dd
->src
.sg_len
;
713 dd
->src
.sg_len
= dma_map_sg(dd
->dev
, dd
->src
.sg
, dd
->src
.nents
,
718 dd
->dst
.sg_len
= dma_map_sg(dd
->dev
, dd
->dst
.sg
, dd
->dst
.nents
,
720 if (!dd
->dst
.sg_len
) {
721 dma_unmap_sg(dd
->dev
, dd
->src
.sg
, dd
->src
.nents
,
730 static void atmel_aes_unmap(struct atmel_aes_dev
*dd
)
732 if (dd
->src
.sg
== dd
->dst
.sg
) {
733 dma_unmap_sg(dd
->dev
, dd
->src
.sg
, dd
->src
.nents
,
736 if (dd
->src
.sg
!= &dd
->aligned_sg
)
737 atmel_aes_restore_sg(&dd
->src
);
739 dma_unmap_sg(dd
->dev
, dd
->dst
.sg
, dd
->dst
.nents
,
742 if (dd
->dst
.sg
!= &dd
->aligned_sg
)
743 atmel_aes_restore_sg(&dd
->dst
);
745 dma_unmap_sg(dd
->dev
, dd
->src
.sg
, dd
->src
.nents
,
748 if (dd
->src
.sg
!= &dd
->aligned_sg
)
749 atmel_aes_restore_sg(&dd
->src
);
752 if (dd
->dst
.sg
== &dd
->aligned_sg
)
753 sg_copy_from_buffer(dd
->real_dst
, sg_nents(dd
->real_dst
),
757 static int atmel_aes_dma_transfer_start(struct atmel_aes_dev
*dd
,
758 enum dma_slave_buswidth addr_width
,
759 enum dma_transfer_direction dir
,
762 struct dma_async_tx_descriptor
*desc
;
763 struct dma_slave_config config
;
764 dma_async_tx_callback callback
;
765 struct atmel_aes_dma
*dma
;
768 memset(&config
, 0, sizeof(config
));
769 config
.direction
= dir
;
770 config
.src_addr_width
= addr_width
;
771 config
.dst_addr_width
= addr_width
;
772 config
.src_maxburst
= maxburst
;
773 config
.dst_maxburst
= maxburst
;
779 config
.dst_addr
= dd
->phys_base
+ AES_IDATAR(0);
784 callback
= atmel_aes_dma_callback
;
785 config
.src_addr
= dd
->phys_base
+ AES_ODATAR(0);
792 err
= dmaengine_slave_config(dma
->chan
, &config
);
796 desc
= dmaengine_prep_slave_sg(dma
->chan
, dma
->sg
, dma
->sg_len
, dir
,
797 DMA_PREP_INTERRUPT
| DMA_CTRL_ACK
);
801 desc
->callback
= callback
;
802 desc
->callback_param
= dd
;
803 dmaengine_submit(desc
);
804 dma_async_issue_pending(dma
->chan
);
809 static void atmel_aes_dma_transfer_stop(struct atmel_aes_dev
*dd
,
810 enum dma_transfer_direction dir
)
812 struct atmel_aes_dma
*dma
;
827 dmaengine_terminate_all(dma
->chan
);
830 static int atmel_aes_dma_start(struct atmel_aes_dev
*dd
,
831 struct scatterlist
*src
,
832 struct scatterlist
*dst
,
834 atmel_aes_fn_t resume
)
836 enum dma_slave_buswidth addr_width
;
840 switch (dd
->ctx
->block_size
) {
841 case CFB8_BLOCK_SIZE
:
842 addr_width
= DMA_SLAVE_BUSWIDTH_1_BYTE
;
846 case CFB16_BLOCK_SIZE
:
847 addr_width
= DMA_SLAVE_BUSWIDTH_2_BYTES
;
851 case CFB32_BLOCK_SIZE
:
852 case CFB64_BLOCK_SIZE
:
853 addr_width
= DMA_SLAVE_BUSWIDTH_4_BYTES
;
858 addr_width
= DMA_SLAVE_BUSWIDTH_4_BYTES
;
859 maxburst
= dd
->caps
.max_burst_size
;
867 err
= atmel_aes_map(dd
, src
, dst
, len
);
873 /* Set output DMA transfer first */
874 err
= atmel_aes_dma_transfer_start(dd
, addr_width
, DMA_DEV_TO_MEM
,
879 /* Then set input DMA transfer */
880 err
= atmel_aes_dma_transfer_start(dd
, addr_width
, DMA_MEM_TO_DEV
,
883 goto output_transfer_stop
;
887 output_transfer_stop
:
888 atmel_aes_dma_transfer_stop(dd
, DMA_DEV_TO_MEM
);
892 return atmel_aes_complete(dd
, err
);
895 static void atmel_aes_dma_stop(struct atmel_aes_dev
*dd
)
897 atmel_aes_dma_transfer_stop(dd
, DMA_MEM_TO_DEV
);
898 atmel_aes_dma_transfer_stop(dd
, DMA_DEV_TO_MEM
);
902 static void atmel_aes_dma_callback(void *data
)
904 struct atmel_aes_dev
*dd
= data
;
906 atmel_aes_dma_stop(dd
);
908 (void)dd
->resume(dd
);
911 static int atmel_aes_handle_queue(struct atmel_aes_dev
*dd
,
912 struct crypto_async_request
*new_areq
)
914 struct crypto_async_request
*areq
, *backlog
;
915 struct atmel_aes_base_ctx
*ctx
;
920 spin_lock_irqsave(&dd
->lock
, flags
);
922 ret
= crypto_enqueue_request(&dd
->queue
, new_areq
);
923 if (dd
->flags
& AES_FLAGS_BUSY
) {
924 spin_unlock_irqrestore(&dd
->lock
, flags
);
927 backlog
= crypto_get_backlog(&dd
->queue
);
928 areq
= crypto_dequeue_request(&dd
->queue
);
930 dd
->flags
|= AES_FLAGS_BUSY
;
931 spin_unlock_irqrestore(&dd
->lock
, flags
);
937 backlog
->complete(backlog
, -EINPROGRESS
);
939 ctx
= crypto_tfm_ctx(areq
->tfm
);
943 start_async
= (areq
!= new_areq
);
944 dd
->is_async
= start_async
;
946 /* WARNING: ctx->start() MAY change dd->is_async. */
947 err
= ctx
->start(dd
);
948 return (start_async
) ? ret
: err
;
952 /* AES async block ciphers */
954 static int atmel_aes_transfer_complete(struct atmel_aes_dev
*dd
)
956 return atmel_aes_complete(dd
, 0);
959 static int atmel_aes_start(struct atmel_aes_dev
*dd
)
961 struct ablkcipher_request
*req
= ablkcipher_request_cast(dd
->areq
);
962 struct atmel_aes_reqctx
*rctx
= ablkcipher_request_ctx(req
);
963 bool use_dma
= (req
->nbytes
>= ATMEL_AES_DMA_THRESHOLD
||
964 dd
->ctx
->block_size
!= AES_BLOCK_SIZE
);
967 atmel_aes_set_mode(dd
, rctx
);
969 err
= atmel_aes_hw_init(dd
);
971 return atmel_aes_complete(dd
, err
);
973 atmel_aes_write_ctrl(dd
, use_dma
, req
->info
);
975 return atmel_aes_dma_start(dd
, req
->src
, req
->dst
, req
->nbytes
,
976 atmel_aes_transfer_complete
);
978 return atmel_aes_cpu_start(dd
, req
->src
, req
->dst
, req
->nbytes
,
979 atmel_aes_transfer_complete
);
982 static inline struct atmel_aes_ctr_ctx
*
983 atmel_aes_ctr_ctx_cast(struct atmel_aes_base_ctx
*ctx
)
985 return container_of(ctx
, struct atmel_aes_ctr_ctx
, base
);
988 static int atmel_aes_ctr_transfer(struct atmel_aes_dev
*dd
)
990 struct atmel_aes_ctr_ctx
*ctx
= atmel_aes_ctr_ctx_cast(dd
->ctx
);
991 struct ablkcipher_request
*req
= ablkcipher_request_cast(dd
->areq
);
992 struct scatterlist
*src
, *dst
;
995 bool use_dma
, fragmented
= false;
997 /* Check for transfer completion. */
998 ctx
->offset
+= dd
->total
;
999 if (ctx
->offset
>= req
->nbytes
)
1000 return atmel_aes_transfer_complete(dd
);
1002 /* Compute data length. */
1003 datalen
= req
->nbytes
- ctx
->offset
;
1004 blocks
= DIV_ROUND_UP(datalen
, AES_BLOCK_SIZE
);
1005 ctr
= be32_to_cpu(ctx
->iv
[3]);
1006 if (dd
->caps
.has_ctr32
) {
1007 /* Check 32bit counter overflow. */
1009 u32 end
= start
+ blocks
- 1;
1013 datalen
= AES_BLOCK_SIZE
* -start
;
1017 /* Check 16bit counter overflow. */
1018 u16 start
= ctr
& 0xffff;
1019 u16 end
= start
+ (u16
)blocks
- 1;
1021 if (blocks
>> 16 || end
< start
) {
1023 datalen
= AES_BLOCK_SIZE
* (0x10000-start
);
1027 use_dma
= (datalen
>= ATMEL_AES_DMA_THRESHOLD
);
1029 /* Jump to offset. */
1030 src
= scatterwalk_ffwd(ctx
->src
, req
->src
, ctx
->offset
);
1031 dst
= ((req
->src
== req
->dst
) ? src
:
1032 scatterwalk_ffwd(ctx
->dst
, req
->dst
, ctx
->offset
));
1034 /* Configure hardware. */
1035 atmel_aes_write_ctrl(dd
, use_dma
, ctx
->iv
);
1036 if (unlikely(fragmented
)) {
1038 * Increment the counter manually to cope with the hardware
1041 ctx
->iv
[3] = cpu_to_be32(ctr
);
1042 crypto_inc((u8
*)ctx
->iv
, AES_BLOCK_SIZE
);
1046 return atmel_aes_dma_start(dd
, src
, dst
, datalen
,
1047 atmel_aes_ctr_transfer
);
1049 return atmel_aes_cpu_start(dd
, src
, dst
, datalen
,
1050 atmel_aes_ctr_transfer
);
1053 static int atmel_aes_ctr_start(struct atmel_aes_dev
*dd
)
1055 struct atmel_aes_ctr_ctx
*ctx
= atmel_aes_ctr_ctx_cast(dd
->ctx
);
1056 struct ablkcipher_request
*req
= ablkcipher_request_cast(dd
->areq
);
1057 struct atmel_aes_reqctx
*rctx
= ablkcipher_request_ctx(req
);
1060 atmel_aes_set_mode(dd
, rctx
);
1062 err
= atmel_aes_hw_init(dd
);
1064 return atmel_aes_complete(dd
, err
);
1066 memcpy(ctx
->iv
, req
->info
, AES_BLOCK_SIZE
);
1069 return atmel_aes_ctr_transfer(dd
);
1072 static int atmel_aes_crypt(struct ablkcipher_request
*req
, unsigned long mode
)
1074 struct atmel_aes_base_ctx
*ctx
;
1075 struct atmel_aes_reqctx
*rctx
;
1076 struct atmel_aes_dev
*dd
;
1078 ctx
= crypto_ablkcipher_ctx(crypto_ablkcipher_reqtfm(req
));
1079 switch (mode
& AES_FLAGS_OPMODE_MASK
) {
1080 case AES_FLAGS_CFB8
:
1081 ctx
->block_size
= CFB8_BLOCK_SIZE
;
1084 case AES_FLAGS_CFB16
:
1085 ctx
->block_size
= CFB16_BLOCK_SIZE
;
1088 case AES_FLAGS_CFB32
:
1089 ctx
->block_size
= CFB32_BLOCK_SIZE
;
1092 case AES_FLAGS_CFB64
:
1093 ctx
->block_size
= CFB64_BLOCK_SIZE
;
1097 ctx
->block_size
= AES_BLOCK_SIZE
;
1101 dd
= atmel_aes_find_dev(ctx
);
1105 rctx
= ablkcipher_request_ctx(req
);
1108 return atmel_aes_handle_queue(dd
, &req
->base
);
1111 static int atmel_aes_setkey(struct crypto_ablkcipher
*tfm
, const u8
*key
,
1112 unsigned int keylen
)
1114 struct atmel_aes_base_ctx
*ctx
= crypto_ablkcipher_ctx(tfm
);
1116 if (keylen
!= AES_KEYSIZE_128
&&
1117 keylen
!= AES_KEYSIZE_192
&&
1118 keylen
!= AES_KEYSIZE_256
) {
1119 crypto_ablkcipher_set_flags(tfm
, CRYPTO_TFM_RES_BAD_KEY_LEN
);
1123 memcpy(ctx
->key
, key
, keylen
);
1124 ctx
->keylen
= keylen
;
1129 static int atmel_aes_ecb_encrypt(struct ablkcipher_request
*req
)
1131 return atmel_aes_crypt(req
, AES_FLAGS_ECB
| AES_FLAGS_ENCRYPT
);
1134 static int atmel_aes_ecb_decrypt(struct ablkcipher_request
*req
)
1136 return atmel_aes_crypt(req
, AES_FLAGS_ECB
);
1139 static int atmel_aes_cbc_encrypt(struct ablkcipher_request
*req
)
1141 return atmel_aes_crypt(req
, AES_FLAGS_CBC
| AES_FLAGS_ENCRYPT
);
1144 static int atmel_aes_cbc_decrypt(struct ablkcipher_request
*req
)
1146 return atmel_aes_crypt(req
, AES_FLAGS_CBC
);
1149 static int atmel_aes_ofb_encrypt(struct ablkcipher_request
*req
)
1151 return atmel_aes_crypt(req
, AES_FLAGS_OFB
| AES_FLAGS_ENCRYPT
);
1154 static int atmel_aes_ofb_decrypt(struct ablkcipher_request
*req
)
1156 return atmel_aes_crypt(req
, AES_FLAGS_OFB
);
1159 static int atmel_aes_cfb_encrypt(struct ablkcipher_request
*req
)
1161 return atmel_aes_crypt(req
, AES_FLAGS_CFB128
| AES_FLAGS_ENCRYPT
);
1164 static int atmel_aes_cfb_decrypt(struct ablkcipher_request
*req
)
1166 return atmel_aes_crypt(req
, AES_FLAGS_CFB128
);
1169 static int atmel_aes_cfb64_encrypt(struct ablkcipher_request
*req
)
1171 return atmel_aes_crypt(req
, AES_FLAGS_CFB64
| AES_FLAGS_ENCRYPT
);
1174 static int atmel_aes_cfb64_decrypt(struct ablkcipher_request
*req
)
1176 return atmel_aes_crypt(req
, AES_FLAGS_CFB64
);
1179 static int atmel_aes_cfb32_encrypt(struct ablkcipher_request
*req
)
1181 return atmel_aes_crypt(req
, AES_FLAGS_CFB32
| AES_FLAGS_ENCRYPT
);
1184 static int atmel_aes_cfb32_decrypt(struct ablkcipher_request
*req
)
1186 return atmel_aes_crypt(req
, AES_FLAGS_CFB32
);
1189 static int atmel_aes_cfb16_encrypt(struct ablkcipher_request
*req
)
1191 return atmel_aes_crypt(req
, AES_FLAGS_CFB16
| AES_FLAGS_ENCRYPT
);
1194 static int atmel_aes_cfb16_decrypt(struct ablkcipher_request
*req
)
1196 return atmel_aes_crypt(req
, AES_FLAGS_CFB16
);
1199 static int atmel_aes_cfb8_encrypt(struct ablkcipher_request
*req
)
1201 return atmel_aes_crypt(req
, AES_FLAGS_CFB8
| AES_FLAGS_ENCRYPT
);
1204 static int atmel_aes_cfb8_decrypt(struct ablkcipher_request
*req
)
1206 return atmel_aes_crypt(req
, AES_FLAGS_CFB8
);
1209 static int atmel_aes_ctr_encrypt(struct ablkcipher_request
*req
)
1211 return atmel_aes_crypt(req
, AES_FLAGS_CTR
| AES_FLAGS_ENCRYPT
);
1214 static int atmel_aes_ctr_decrypt(struct ablkcipher_request
*req
)
1216 return atmel_aes_crypt(req
, AES_FLAGS_CTR
);
1219 static int atmel_aes_cra_init(struct crypto_tfm
*tfm
)
1221 struct atmel_aes_ctx
*ctx
= crypto_tfm_ctx(tfm
);
1223 tfm
->crt_ablkcipher
.reqsize
= sizeof(struct atmel_aes_reqctx
);
1224 ctx
->base
.start
= atmel_aes_start
;
1229 static int atmel_aes_ctr_cra_init(struct crypto_tfm
*tfm
)
1231 struct atmel_aes_ctx
*ctx
= crypto_tfm_ctx(tfm
);
1233 tfm
->crt_ablkcipher
.reqsize
= sizeof(struct atmel_aes_reqctx
);
1234 ctx
->base
.start
= atmel_aes_ctr_start
;
1239 static void atmel_aes_cra_exit(struct crypto_tfm
*tfm
)
1243 static struct crypto_alg aes_algs
[] = {
1245 .cra_name
= "ecb(aes)",
1246 .cra_driver_name
= "atmel-ecb-aes",
1247 .cra_priority
= ATMEL_AES_PRIORITY
,
1248 .cra_flags
= CRYPTO_ALG_TYPE_ABLKCIPHER
| CRYPTO_ALG_ASYNC
,
1249 .cra_blocksize
= AES_BLOCK_SIZE
,
1250 .cra_ctxsize
= sizeof(struct atmel_aes_ctx
),
1251 .cra_alignmask
= 0xf,
1252 .cra_type
= &crypto_ablkcipher_type
,
1253 .cra_module
= THIS_MODULE
,
1254 .cra_init
= atmel_aes_cra_init
,
1255 .cra_exit
= atmel_aes_cra_exit
,
1256 .cra_u
.ablkcipher
= {
1257 .min_keysize
= AES_MIN_KEY_SIZE
,
1258 .max_keysize
= AES_MAX_KEY_SIZE
,
1259 .setkey
= atmel_aes_setkey
,
1260 .encrypt
= atmel_aes_ecb_encrypt
,
1261 .decrypt
= atmel_aes_ecb_decrypt
,
1265 .cra_name
= "cbc(aes)",
1266 .cra_driver_name
= "atmel-cbc-aes",
1267 .cra_priority
= ATMEL_AES_PRIORITY
,
1268 .cra_flags
= CRYPTO_ALG_TYPE_ABLKCIPHER
| CRYPTO_ALG_ASYNC
,
1269 .cra_blocksize
= AES_BLOCK_SIZE
,
1270 .cra_ctxsize
= sizeof(struct atmel_aes_ctx
),
1271 .cra_alignmask
= 0xf,
1272 .cra_type
= &crypto_ablkcipher_type
,
1273 .cra_module
= THIS_MODULE
,
1274 .cra_init
= atmel_aes_cra_init
,
1275 .cra_exit
= atmel_aes_cra_exit
,
1276 .cra_u
.ablkcipher
= {
1277 .min_keysize
= AES_MIN_KEY_SIZE
,
1278 .max_keysize
= AES_MAX_KEY_SIZE
,
1279 .ivsize
= AES_BLOCK_SIZE
,
1280 .setkey
= atmel_aes_setkey
,
1281 .encrypt
= atmel_aes_cbc_encrypt
,
1282 .decrypt
= atmel_aes_cbc_decrypt
,
1286 .cra_name
= "ofb(aes)",
1287 .cra_driver_name
= "atmel-ofb-aes",
1288 .cra_priority
= ATMEL_AES_PRIORITY
,
1289 .cra_flags
= CRYPTO_ALG_TYPE_ABLKCIPHER
| CRYPTO_ALG_ASYNC
,
1290 .cra_blocksize
= AES_BLOCK_SIZE
,
1291 .cra_ctxsize
= sizeof(struct atmel_aes_ctx
),
1292 .cra_alignmask
= 0xf,
1293 .cra_type
= &crypto_ablkcipher_type
,
1294 .cra_module
= THIS_MODULE
,
1295 .cra_init
= atmel_aes_cra_init
,
1296 .cra_exit
= atmel_aes_cra_exit
,
1297 .cra_u
.ablkcipher
= {
1298 .min_keysize
= AES_MIN_KEY_SIZE
,
1299 .max_keysize
= AES_MAX_KEY_SIZE
,
1300 .ivsize
= AES_BLOCK_SIZE
,
1301 .setkey
= atmel_aes_setkey
,
1302 .encrypt
= atmel_aes_ofb_encrypt
,
1303 .decrypt
= atmel_aes_ofb_decrypt
,
1307 .cra_name
= "cfb(aes)",
1308 .cra_driver_name
= "atmel-cfb-aes",
1309 .cra_priority
= ATMEL_AES_PRIORITY
,
1310 .cra_flags
= CRYPTO_ALG_TYPE_ABLKCIPHER
| CRYPTO_ALG_ASYNC
,
1311 .cra_blocksize
= AES_BLOCK_SIZE
,
1312 .cra_ctxsize
= sizeof(struct atmel_aes_ctx
),
1313 .cra_alignmask
= 0xf,
1314 .cra_type
= &crypto_ablkcipher_type
,
1315 .cra_module
= THIS_MODULE
,
1316 .cra_init
= atmel_aes_cra_init
,
1317 .cra_exit
= atmel_aes_cra_exit
,
1318 .cra_u
.ablkcipher
= {
1319 .min_keysize
= AES_MIN_KEY_SIZE
,
1320 .max_keysize
= AES_MAX_KEY_SIZE
,
1321 .ivsize
= AES_BLOCK_SIZE
,
1322 .setkey
= atmel_aes_setkey
,
1323 .encrypt
= atmel_aes_cfb_encrypt
,
1324 .decrypt
= atmel_aes_cfb_decrypt
,
1328 .cra_name
= "cfb32(aes)",
1329 .cra_driver_name
= "atmel-cfb32-aes",
1330 .cra_priority
= ATMEL_AES_PRIORITY
,
1331 .cra_flags
= CRYPTO_ALG_TYPE_ABLKCIPHER
| CRYPTO_ALG_ASYNC
,
1332 .cra_blocksize
= CFB32_BLOCK_SIZE
,
1333 .cra_ctxsize
= sizeof(struct atmel_aes_ctx
),
1334 .cra_alignmask
= 0x3,
1335 .cra_type
= &crypto_ablkcipher_type
,
1336 .cra_module
= THIS_MODULE
,
1337 .cra_init
= atmel_aes_cra_init
,
1338 .cra_exit
= atmel_aes_cra_exit
,
1339 .cra_u
.ablkcipher
= {
1340 .min_keysize
= AES_MIN_KEY_SIZE
,
1341 .max_keysize
= AES_MAX_KEY_SIZE
,
1342 .ivsize
= AES_BLOCK_SIZE
,
1343 .setkey
= atmel_aes_setkey
,
1344 .encrypt
= atmel_aes_cfb32_encrypt
,
1345 .decrypt
= atmel_aes_cfb32_decrypt
,
1349 .cra_name
= "cfb16(aes)",
1350 .cra_driver_name
= "atmel-cfb16-aes",
1351 .cra_priority
= ATMEL_AES_PRIORITY
,
1352 .cra_flags
= CRYPTO_ALG_TYPE_ABLKCIPHER
| CRYPTO_ALG_ASYNC
,
1353 .cra_blocksize
= CFB16_BLOCK_SIZE
,
1354 .cra_ctxsize
= sizeof(struct atmel_aes_ctx
),
1355 .cra_alignmask
= 0x1,
1356 .cra_type
= &crypto_ablkcipher_type
,
1357 .cra_module
= THIS_MODULE
,
1358 .cra_init
= atmel_aes_cra_init
,
1359 .cra_exit
= atmel_aes_cra_exit
,
1360 .cra_u
.ablkcipher
= {
1361 .min_keysize
= AES_MIN_KEY_SIZE
,
1362 .max_keysize
= AES_MAX_KEY_SIZE
,
1363 .ivsize
= AES_BLOCK_SIZE
,
1364 .setkey
= atmel_aes_setkey
,
1365 .encrypt
= atmel_aes_cfb16_encrypt
,
1366 .decrypt
= atmel_aes_cfb16_decrypt
,
1370 .cra_name
= "cfb8(aes)",
1371 .cra_driver_name
= "atmel-cfb8-aes",
1372 .cra_priority
= ATMEL_AES_PRIORITY
,
1373 .cra_flags
= CRYPTO_ALG_TYPE_ABLKCIPHER
| CRYPTO_ALG_ASYNC
,
1374 .cra_blocksize
= CFB8_BLOCK_SIZE
,
1375 .cra_ctxsize
= sizeof(struct atmel_aes_ctx
),
1376 .cra_alignmask
= 0x0,
1377 .cra_type
= &crypto_ablkcipher_type
,
1378 .cra_module
= THIS_MODULE
,
1379 .cra_init
= atmel_aes_cra_init
,
1380 .cra_exit
= atmel_aes_cra_exit
,
1381 .cra_u
.ablkcipher
= {
1382 .min_keysize
= AES_MIN_KEY_SIZE
,
1383 .max_keysize
= AES_MAX_KEY_SIZE
,
1384 .ivsize
= AES_BLOCK_SIZE
,
1385 .setkey
= atmel_aes_setkey
,
1386 .encrypt
= atmel_aes_cfb8_encrypt
,
1387 .decrypt
= atmel_aes_cfb8_decrypt
,
1391 .cra_name
= "ctr(aes)",
1392 .cra_driver_name
= "atmel-ctr-aes",
1393 .cra_priority
= ATMEL_AES_PRIORITY
,
1394 .cra_flags
= CRYPTO_ALG_TYPE_ABLKCIPHER
| CRYPTO_ALG_ASYNC
,
1396 .cra_ctxsize
= sizeof(struct atmel_aes_ctr_ctx
),
1397 .cra_alignmask
= 0xf,
1398 .cra_type
= &crypto_ablkcipher_type
,
1399 .cra_module
= THIS_MODULE
,
1400 .cra_init
= atmel_aes_ctr_cra_init
,
1401 .cra_exit
= atmel_aes_cra_exit
,
1402 .cra_u
.ablkcipher
= {
1403 .min_keysize
= AES_MIN_KEY_SIZE
,
1404 .max_keysize
= AES_MAX_KEY_SIZE
,
1405 .ivsize
= AES_BLOCK_SIZE
,
1406 .setkey
= atmel_aes_setkey
,
1407 .encrypt
= atmel_aes_ctr_encrypt
,
1408 .decrypt
= atmel_aes_ctr_decrypt
,
1413 static struct crypto_alg aes_cfb64_alg
= {
1414 .cra_name
= "cfb64(aes)",
1415 .cra_driver_name
= "atmel-cfb64-aes",
1416 .cra_priority
= ATMEL_AES_PRIORITY
,
1417 .cra_flags
= CRYPTO_ALG_TYPE_ABLKCIPHER
| CRYPTO_ALG_ASYNC
,
1418 .cra_blocksize
= CFB64_BLOCK_SIZE
,
1419 .cra_ctxsize
= sizeof(struct atmel_aes_ctx
),
1420 .cra_alignmask
= 0x7,
1421 .cra_type
= &crypto_ablkcipher_type
,
1422 .cra_module
= THIS_MODULE
,
1423 .cra_init
= atmel_aes_cra_init
,
1424 .cra_exit
= atmel_aes_cra_exit
,
1425 .cra_u
.ablkcipher
= {
1426 .min_keysize
= AES_MIN_KEY_SIZE
,
1427 .max_keysize
= AES_MAX_KEY_SIZE
,
1428 .ivsize
= AES_BLOCK_SIZE
,
1429 .setkey
= atmel_aes_setkey
,
1430 .encrypt
= atmel_aes_cfb64_encrypt
,
1431 .decrypt
= atmel_aes_cfb64_decrypt
,
1436 /* gcm aead functions */
1438 static int atmel_aes_gcm_ghash(struct atmel_aes_dev
*dd
,
1439 const u32
*data
, size_t datalen
,
1440 const u32
*ghash_in
, u32
*ghash_out
,
1441 atmel_aes_fn_t resume
);
1442 static int atmel_aes_gcm_ghash_init(struct atmel_aes_dev
*dd
);
1443 static int atmel_aes_gcm_ghash_finalize(struct atmel_aes_dev
*dd
);
1445 static int atmel_aes_gcm_start(struct atmel_aes_dev
*dd
);
1446 static int atmel_aes_gcm_process(struct atmel_aes_dev
*dd
);
1447 static int atmel_aes_gcm_length(struct atmel_aes_dev
*dd
);
1448 static int atmel_aes_gcm_data(struct atmel_aes_dev
*dd
);
1449 static int atmel_aes_gcm_tag_init(struct atmel_aes_dev
*dd
);
1450 static int atmel_aes_gcm_tag(struct atmel_aes_dev
*dd
);
1451 static int atmel_aes_gcm_finalize(struct atmel_aes_dev
*dd
);
1453 static inline struct atmel_aes_gcm_ctx
*
1454 atmel_aes_gcm_ctx_cast(struct atmel_aes_base_ctx
*ctx
)
1456 return container_of(ctx
, struct atmel_aes_gcm_ctx
, base
);
1459 static int atmel_aes_gcm_ghash(struct atmel_aes_dev
*dd
,
1460 const u32
*data
, size_t datalen
,
1461 const u32
*ghash_in
, u32
*ghash_out
,
1462 atmel_aes_fn_t resume
)
1464 struct atmel_aes_gcm_ctx
*ctx
= atmel_aes_gcm_ctx_cast(dd
->ctx
);
1466 dd
->data
= (u32
*)data
;
1467 dd
->datalen
= datalen
;
1468 ctx
->ghash_in
= ghash_in
;
1469 ctx
->ghash_out
= ghash_out
;
1470 ctx
->ghash_resume
= resume
;
1472 atmel_aes_write_ctrl(dd
, false, NULL
);
1473 return atmel_aes_wait_for_data_ready(dd
, atmel_aes_gcm_ghash_init
);
1476 static int atmel_aes_gcm_ghash_init(struct atmel_aes_dev
*dd
)
1478 struct atmel_aes_gcm_ctx
*ctx
= atmel_aes_gcm_ctx_cast(dd
->ctx
);
1480 /* Set the data length. */
1481 atmel_aes_write(dd
, AES_AADLENR
, dd
->total
);
1482 atmel_aes_write(dd
, AES_CLENR
, 0);
1484 /* If needed, overwrite the GCM Intermediate Hash Word Registers */
1486 atmel_aes_write_block(dd
, AES_GHASHR(0), ctx
->ghash_in
);
1488 return atmel_aes_gcm_ghash_finalize(dd
);
1491 static int atmel_aes_gcm_ghash_finalize(struct atmel_aes_dev
*dd
)
1493 struct atmel_aes_gcm_ctx
*ctx
= atmel_aes_gcm_ctx_cast(dd
->ctx
);
1496 /* Write data into the Input Data Registers. */
1497 while (dd
->datalen
> 0) {
1498 atmel_aes_write_block(dd
, AES_IDATAR(0), dd
->data
);
1500 dd
->datalen
-= AES_BLOCK_SIZE
;
1502 isr
= atmel_aes_read(dd
, AES_ISR
);
1503 if (!(isr
& AES_INT_DATARDY
)) {
1504 dd
->resume
= atmel_aes_gcm_ghash_finalize
;
1505 atmel_aes_write(dd
, AES_IER
, AES_INT_DATARDY
);
1506 return -EINPROGRESS
;
1510 /* Read the computed hash from GHASHRx. */
1511 atmel_aes_read_block(dd
, AES_GHASHR(0), ctx
->ghash_out
);
1513 return ctx
->ghash_resume(dd
);
1517 static int atmel_aes_gcm_start(struct atmel_aes_dev
*dd
)
1519 struct atmel_aes_gcm_ctx
*ctx
= atmel_aes_gcm_ctx_cast(dd
->ctx
);
1520 struct aead_request
*req
= aead_request_cast(dd
->areq
);
1521 struct crypto_aead
*tfm
= crypto_aead_reqtfm(req
);
1522 struct atmel_aes_reqctx
*rctx
= aead_request_ctx(req
);
1523 size_t ivsize
= crypto_aead_ivsize(tfm
);
1524 size_t datalen
, padlen
;
1525 const void *iv
= req
->iv
;
1529 atmel_aes_set_mode(dd
, rctx
);
1531 err
= atmel_aes_hw_init(dd
);
1533 return atmel_aes_complete(dd
, err
);
1535 if (likely(ivsize
== 12)) {
1536 memcpy(ctx
->j0
, iv
, ivsize
);
1537 ctx
->j0
[3] = cpu_to_be32(1);
1538 return atmel_aes_gcm_process(dd
);
1541 padlen
= atmel_aes_padlen(ivsize
, AES_BLOCK_SIZE
);
1542 datalen
= ivsize
+ padlen
+ AES_BLOCK_SIZE
;
1543 if (datalen
> dd
->buflen
)
1544 return atmel_aes_complete(dd
, -EINVAL
);
1546 memcpy(data
, iv
, ivsize
);
1547 memset(data
+ ivsize
, 0, padlen
+ sizeof(u64
));
1548 ((u64
*)(data
+ datalen
))[-1] = cpu_to_be64(ivsize
* 8);
1550 return atmel_aes_gcm_ghash(dd
, (const u32
*)data
, datalen
,
1551 NULL
, ctx
->j0
, atmel_aes_gcm_process
);
1554 static int atmel_aes_gcm_process(struct atmel_aes_dev
*dd
)
1556 struct atmel_aes_gcm_ctx
*ctx
= atmel_aes_gcm_ctx_cast(dd
->ctx
);
1557 struct aead_request
*req
= aead_request_cast(dd
->areq
);
1558 struct crypto_aead
*tfm
= crypto_aead_reqtfm(req
);
1559 bool enc
= atmel_aes_is_encrypt(dd
);
1562 /* Compute text length. */
1563 authsize
= crypto_aead_authsize(tfm
);
1564 ctx
->textlen
= req
->cryptlen
- (enc
? 0 : authsize
);
1567 * According to tcrypt test suite, the GCM Automatic Tag Generation
1568 * fails when both the message and its associated data are empty.
1570 if (likely(req
->assoclen
!= 0 || ctx
->textlen
!= 0))
1571 dd
->flags
|= AES_FLAGS_GTAGEN
;
1573 atmel_aes_write_ctrl(dd
, false, NULL
);
1574 return atmel_aes_wait_for_data_ready(dd
, atmel_aes_gcm_length
);
1577 static int atmel_aes_gcm_length(struct atmel_aes_dev
*dd
)
1579 struct atmel_aes_gcm_ctx
*ctx
= atmel_aes_gcm_ctx_cast(dd
->ctx
);
1580 struct aead_request
*req
= aead_request_cast(dd
->areq
);
1581 u32 j0_lsw
, *j0
= ctx
->j0
;
1584 /* Write incr32(J0) into IV. */
1586 j0
[3] = cpu_to_be32(be32_to_cpu(j0
[3]) + 1);
1587 atmel_aes_write_block(dd
, AES_IVR(0), j0
);
1590 /* Set aad and text lengths. */
1591 atmel_aes_write(dd
, AES_AADLENR
, req
->assoclen
);
1592 atmel_aes_write(dd
, AES_CLENR
, ctx
->textlen
);
1594 /* Check whether AAD are present. */
1595 if (unlikely(req
->assoclen
== 0)) {
1597 return atmel_aes_gcm_data(dd
);
1600 /* Copy assoc data and add padding. */
1601 padlen
= atmel_aes_padlen(req
->assoclen
, AES_BLOCK_SIZE
);
1602 if (unlikely(req
->assoclen
+ padlen
> dd
->buflen
))
1603 return atmel_aes_complete(dd
, -EINVAL
);
1604 sg_copy_to_buffer(req
->src
, sg_nents(req
->src
), dd
->buf
, req
->assoclen
);
1606 /* Write assoc data into the Input Data register. */
1607 dd
->data
= (u32
*)dd
->buf
;
1608 dd
->datalen
= req
->assoclen
+ padlen
;
1609 return atmel_aes_gcm_data(dd
);
1612 static int atmel_aes_gcm_data(struct atmel_aes_dev
*dd
)
1614 struct atmel_aes_gcm_ctx
*ctx
= atmel_aes_gcm_ctx_cast(dd
->ctx
);
1615 struct aead_request
*req
= aead_request_cast(dd
->areq
);
1616 bool use_dma
= (ctx
->textlen
>= ATMEL_AES_DMA_THRESHOLD
);
1617 struct scatterlist
*src
, *dst
;
1620 /* Write AAD first. */
1621 while (dd
->datalen
> 0) {
1622 atmel_aes_write_block(dd
, AES_IDATAR(0), dd
->data
);
1624 dd
->datalen
-= AES_BLOCK_SIZE
;
1626 isr
= atmel_aes_read(dd
, AES_ISR
);
1627 if (!(isr
& AES_INT_DATARDY
)) {
1628 dd
->resume
= atmel_aes_gcm_data
;
1629 atmel_aes_write(dd
, AES_IER
, AES_INT_DATARDY
);
1630 return -EINPROGRESS
;
1635 if (unlikely(ctx
->textlen
== 0))
1636 return atmel_aes_gcm_tag_init(dd
);
1638 /* Prepare src and dst scatter lists to transfer cipher/plain texts */
1639 src
= scatterwalk_ffwd(ctx
->src
, req
->src
, req
->assoclen
);
1640 dst
= ((req
->src
== req
->dst
) ? src
:
1641 scatterwalk_ffwd(ctx
->dst
, req
->dst
, req
->assoclen
));
1644 /* Update the Mode Register for DMA transfers. */
1645 mr
= atmel_aes_read(dd
, AES_MR
);
1646 mr
&= ~(AES_MR_SMOD_MASK
| AES_MR_DUALBUFF
);
1647 mr
|= AES_MR_SMOD_IDATAR0
;
1648 if (dd
->caps
.has_dualbuff
)
1649 mr
|= AES_MR_DUALBUFF
;
1650 atmel_aes_write(dd
, AES_MR
, mr
);
1652 return atmel_aes_dma_start(dd
, src
, dst
, ctx
->textlen
,
1653 atmel_aes_gcm_tag_init
);
1656 return atmel_aes_cpu_start(dd
, src
, dst
, ctx
->textlen
,
1657 atmel_aes_gcm_tag_init
);
1660 static int atmel_aes_gcm_tag_init(struct atmel_aes_dev
*dd
)
1662 struct atmel_aes_gcm_ctx
*ctx
= atmel_aes_gcm_ctx_cast(dd
->ctx
);
1663 struct aead_request
*req
= aead_request_cast(dd
->areq
);
1664 u64
*data
= dd
->buf
;
1666 if (likely(dd
->flags
& AES_FLAGS_GTAGEN
)) {
1667 if (!(atmel_aes_read(dd
, AES_ISR
) & AES_INT_TAGRDY
)) {
1668 dd
->resume
= atmel_aes_gcm_tag_init
;
1669 atmel_aes_write(dd
, AES_IER
, AES_INT_TAGRDY
);
1670 return -EINPROGRESS
;
1673 return atmel_aes_gcm_finalize(dd
);
1676 /* Read the GCM Intermediate Hash Word Registers. */
1677 atmel_aes_read_block(dd
, AES_GHASHR(0), ctx
->ghash
);
1679 data
[0] = cpu_to_be64(req
->assoclen
* 8);
1680 data
[1] = cpu_to_be64(ctx
->textlen
* 8);
1682 return atmel_aes_gcm_ghash(dd
, (const u32
*)data
, AES_BLOCK_SIZE
,
1683 ctx
->ghash
, ctx
->ghash
, atmel_aes_gcm_tag
);
1686 static int atmel_aes_gcm_tag(struct atmel_aes_dev
*dd
)
1688 struct atmel_aes_gcm_ctx
*ctx
= atmel_aes_gcm_ctx_cast(dd
->ctx
);
1689 unsigned long flags
;
1692 * Change mode to CTR to complete the tag generation.
1693 * Use J0 as Initialization Vector.
1696 dd
->flags
&= ~(AES_FLAGS_OPMODE_MASK
| AES_FLAGS_GTAGEN
);
1697 dd
->flags
|= AES_FLAGS_CTR
;
1698 atmel_aes_write_ctrl(dd
, false, ctx
->j0
);
1701 atmel_aes_write_block(dd
, AES_IDATAR(0), ctx
->ghash
);
1702 return atmel_aes_wait_for_data_ready(dd
, atmel_aes_gcm_finalize
);
1705 static int atmel_aes_gcm_finalize(struct atmel_aes_dev
*dd
)
1707 struct atmel_aes_gcm_ctx
*ctx
= atmel_aes_gcm_ctx_cast(dd
->ctx
);
1708 struct aead_request
*req
= aead_request_cast(dd
->areq
);
1709 struct crypto_aead
*tfm
= crypto_aead_reqtfm(req
);
1710 bool enc
= atmel_aes_is_encrypt(dd
);
1711 u32 offset
, authsize
, itag
[4], *otag
= ctx
->tag
;
1714 /* Read the computed tag. */
1715 if (likely(dd
->flags
& AES_FLAGS_GTAGEN
))
1716 atmel_aes_read_block(dd
, AES_TAGR(0), ctx
->tag
);
1718 atmel_aes_read_block(dd
, AES_ODATAR(0), ctx
->tag
);
1720 offset
= req
->assoclen
+ ctx
->textlen
;
1721 authsize
= crypto_aead_authsize(tfm
);
1723 scatterwalk_map_and_copy(otag
, req
->dst
, offset
, authsize
, 1);
1726 scatterwalk_map_and_copy(itag
, req
->src
, offset
, authsize
, 0);
1727 err
= crypto_memneq(itag
, otag
, authsize
) ? -EBADMSG
: 0;
1730 return atmel_aes_complete(dd
, err
);
1733 static int atmel_aes_gcm_crypt(struct aead_request
*req
,
1736 struct atmel_aes_base_ctx
*ctx
;
1737 struct atmel_aes_reqctx
*rctx
;
1738 struct atmel_aes_dev
*dd
;
1740 ctx
= crypto_aead_ctx(crypto_aead_reqtfm(req
));
1741 ctx
->block_size
= AES_BLOCK_SIZE
;
1743 dd
= atmel_aes_find_dev(ctx
);
1747 rctx
= aead_request_ctx(req
);
1748 rctx
->mode
= AES_FLAGS_GCM
| mode
;
1750 return atmel_aes_handle_queue(dd
, &req
->base
);
1753 static int atmel_aes_gcm_setkey(struct crypto_aead
*tfm
, const u8
*key
,
1754 unsigned int keylen
)
1756 struct atmel_aes_base_ctx
*ctx
= crypto_aead_ctx(tfm
);
1758 if (keylen
!= AES_KEYSIZE_256
&&
1759 keylen
!= AES_KEYSIZE_192
&&
1760 keylen
!= AES_KEYSIZE_128
) {
1761 crypto_aead_set_flags(tfm
, CRYPTO_TFM_RES_BAD_KEY_LEN
);
1765 memcpy(ctx
->key
, key
, keylen
);
1766 ctx
->keylen
= keylen
;
1771 static int atmel_aes_gcm_setauthsize(struct crypto_aead
*tfm
,
1772 unsigned int authsize
)
1774 /* Same as crypto_gcm_authsize() from crypto/gcm.c */
1791 static int atmel_aes_gcm_encrypt(struct aead_request
*req
)
1793 return atmel_aes_gcm_crypt(req
, AES_FLAGS_ENCRYPT
);
1796 static int atmel_aes_gcm_decrypt(struct aead_request
*req
)
1798 return atmel_aes_gcm_crypt(req
, 0);
1801 static int atmel_aes_gcm_init(struct crypto_aead
*tfm
)
1803 struct atmel_aes_gcm_ctx
*ctx
= crypto_aead_ctx(tfm
);
1805 crypto_aead_set_reqsize(tfm
, sizeof(struct atmel_aes_reqctx
));
1806 ctx
->base
.start
= atmel_aes_gcm_start
;
1811 static void atmel_aes_gcm_exit(struct crypto_aead
*tfm
)
1816 static struct aead_alg aes_gcm_alg
= {
1817 .setkey
= atmel_aes_gcm_setkey
,
1818 .setauthsize
= atmel_aes_gcm_setauthsize
,
1819 .encrypt
= atmel_aes_gcm_encrypt
,
1820 .decrypt
= atmel_aes_gcm_decrypt
,
1821 .init
= atmel_aes_gcm_init
,
1822 .exit
= atmel_aes_gcm_exit
,
1824 .maxauthsize
= AES_BLOCK_SIZE
,
1827 .cra_name
= "gcm(aes)",
1828 .cra_driver_name
= "atmel-gcm-aes",
1829 .cra_priority
= ATMEL_AES_PRIORITY
,
1830 .cra_flags
= CRYPTO_ALG_ASYNC
,
1832 .cra_ctxsize
= sizeof(struct atmel_aes_gcm_ctx
),
1833 .cra_alignmask
= 0xf,
1834 .cra_module
= THIS_MODULE
,
1841 static inline struct atmel_aes_xts_ctx
*
1842 atmel_aes_xts_ctx_cast(struct atmel_aes_base_ctx
*ctx
)
1844 return container_of(ctx
, struct atmel_aes_xts_ctx
, base
);
1847 static int atmel_aes_xts_process_data(struct atmel_aes_dev
*dd
);
1849 static int atmel_aes_xts_start(struct atmel_aes_dev
*dd
)
1851 struct atmel_aes_xts_ctx
*ctx
= atmel_aes_xts_ctx_cast(dd
->ctx
);
1852 struct ablkcipher_request
*req
= ablkcipher_request_cast(dd
->areq
);
1853 struct atmel_aes_reqctx
*rctx
= ablkcipher_request_ctx(req
);
1854 unsigned long flags
;
1857 atmel_aes_set_mode(dd
, rctx
);
1859 err
= atmel_aes_hw_init(dd
);
1861 return atmel_aes_complete(dd
, err
);
1863 /* Compute the tweak value from req->info with ecb(aes). */
1865 dd
->flags
&= ~AES_FLAGS_MODE_MASK
;
1866 dd
->flags
|= (AES_FLAGS_ECB
| AES_FLAGS_ENCRYPT
);
1867 atmel_aes_write_ctrl_key(dd
, false, NULL
,
1868 ctx
->key2
, ctx
->base
.keylen
);
1871 atmel_aes_write_block(dd
, AES_IDATAR(0), req
->info
);
1872 return atmel_aes_wait_for_data_ready(dd
, atmel_aes_xts_process_data
);
1875 static int atmel_aes_xts_process_data(struct atmel_aes_dev
*dd
)
1877 struct ablkcipher_request
*req
= ablkcipher_request_cast(dd
->areq
);
1878 bool use_dma
= (req
->nbytes
>= ATMEL_AES_DMA_THRESHOLD
);
1879 u32 tweak
[AES_BLOCK_SIZE
/ sizeof(u32
)];
1880 static const u32 one
[AES_BLOCK_SIZE
/ sizeof(u32
)] = {cpu_to_le32(1), };
1881 u8
*tweak_bytes
= (u8
*)tweak
;
1884 /* Read the computed ciphered tweak value. */
1885 atmel_aes_read_block(dd
, AES_ODATAR(0), tweak
);
1888 * the order of the ciphered tweak bytes need to be reversed before
1889 * writing them into the ODATARx registers.
1891 for (i
= 0; i
< AES_BLOCK_SIZE
/2; ++i
) {
1892 u8 tmp
= tweak_bytes
[AES_BLOCK_SIZE
- 1 - i
];
1894 tweak_bytes
[AES_BLOCK_SIZE
- 1 - i
] = tweak_bytes
[i
];
1895 tweak_bytes
[i
] = tmp
;
1898 /* Process the data. */
1899 atmel_aes_write_ctrl(dd
, use_dma
, NULL
);
1900 atmel_aes_write_block(dd
, AES_TWR(0), tweak
);
1901 atmel_aes_write_block(dd
, AES_ALPHAR(0), one
);
1903 return atmel_aes_dma_start(dd
, req
->src
, req
->dst
, req
->nbytes
,
1904 atmel_aes_transfer_complete
);
1906 return atmel_aes_cpu_start(dd
, req
->src
, req
->dst
, req
->nbytes
,
1907 atmel_aes_transfer_complete
);
1910 static int atmel_aes_xts_setkey(struct crypto_ablkcipher
*tfm
, const u8
*key
,
1911 unsigned int keylen
)
1913 struct atmel_aes_xts_ctx
*ctx
= crypto_ablkcipher_ctx(tfm
);
1916 err
= xts_check_key(crypto_ablkcipher_tfm(tfm
), key
, keylen
);
1920 memcpy(ctx
->base
.key
, key
, keylen
/2);
1921 memcpy(ctx
->key2
, key
+ keylen
/2, keylen
/2);
1922 ctx
->base
.keylen
= keylen
/2;
1927 static int atmel_aes_xts_encrypt(struct ablkcipher_request
*req
)
1929 return atmel_aes_crypt(req
, AES_FLAGS_XTS
| AES_FLAGS_ENCRYPT
);
1932 static int atmel_aes_xts_decrypt(struct ablkcipher_request
*req
)
1934 return atmel_aes_crypt(req
, AES_FLAGS_XTS
);
1937 static int atmel_aes_xts_cra_init(struct crypto_tfm
*tfm
)
1939 struct atmel_aes_xts_ctx
*ctx
= crypto_tfm_ctx(tfm
);
1941 tfm
->crt_ablkcipher
.reqsize
= sizeof(struct atmel_aes_reqctx
);
1942 ctx
->base
.start
= atmel_aes_xts_start
;
1947 static struct crypto_alg aes_xts_alg
= {
1948 .cra_name
= "xts(aes)",
1949 .cra_driver_name
= "atmel-xts-aes",
1950 .cra_priority
= ATMEL_AES_PRIORITY
,
1951 .cra_flags
= CRYPTO_ALG_TYPE_ABLKCIPHER
| CRYPTO_ALG_ASYNC
,
1952 .cra_blocksize
= AES_BLOCK_SIZE
,
1953 .cra_ctxsize
= sizeof(struct atmel_aes_xts_ctx
),
1954 .cra_alignmask
= 0xf,
1955 .cra_type
= &crypto_ablkcipher_type
,
1956 .cra_module
= THIS_MODULE
,
1957 .cra_init
= atmel_aes_xts_cra_init
,
1958 .cra_exit
= atmel_aes_cra_exit
,
1959 .cra_u
.ablkcipher
= {
1960 .min_keysize
= 2 * AES_MIN_KEY_SIZE
,
1961 .max_keysize
= 2 * AES_MAX_KEY_SIZE
,
1962 .ivsize
= AES_BLOCK_SIZE
,
1963 .setkey
= atmel_aes_xts_setkey
,
1964 .encrypt
= atmel_aes_xts_encrypt
,
1965 .decrypt
= atmel_aes_xts_decrypt
,
1969 #ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
1970 /* authenc aead functions */
1972 static int atmel_aes_authenc_start(struct atmel_aes_dev
*dd
);
1973 static int atmel_aes_authenc_init(struct atmel_aes_dev
*dd
, int err
,
1975 static int atmel_aes_authenc_transfer(struct atmel_aes_dev
*dd
, int err
,
1977 static int atmel_aes_authenc_digest(struct atmel_aes_dev
*dd
);
1978 static int atmel_aes_authenc_final(struct atmel_aes_dev
*dd
, int err
,
1981 static void atmel_aes_authenc_complete(struct atmel_aes_dev
*dd
, int err
)
1983 struct aead_request
*req
= aead_request_cast(dd
->areq
);
1984 struct atmel_aes_authenc_reqctx
*rctx
= aead_request_ctx(req
);
1986 if (err
&& (dd
->flags
& AES_FLAGS_OWN_SHA
))
1987 atmel_sha_authenc_abort(&rctx
->auth_req
);
1988 dd
->flags
&= ~AES_FLAGS_OWN_SHA
;
1991 static int atmel_aes_authenc_start(struct atmel_aes_dev
*dd
)
1993 struct aead_request
*req
= aead_request_cast(dd
->areq
);
1994 struct atmel_aes_authenc_reqctx
*rctx
= aead_request_ctx(req
);
1995 struct crypto_aead
*tfm
= crypto_aead_reqtfm(req
);
1996 struct atmel_aes_authenc_ctx
*ctx
= crypto_aead_ctx(tfm
);
1999 atmel_aes_set_mode(dd
, &rctx
->base
);
2001 err
= atmel_aes_hw_init(dd
);
2003 return atmel_aes_complete(dd
, err
);
2005 return atmel_sha_authenc_schedule(&rctx
->auth_req
, ctx
->auth
,
2006 atmel_aes_authenc_init
, dd
);
2009 static int atmel_aes_authenc_init(struct atmel_aes_dev
*dd
, int err
,
2012 struct aead_request
*req
= aead_request_cast(dd
->areq
);
2013 struct atmel_aes_authenc_reqctx
*rctx
= aead_request_ctx(req
);
2016 dd
->is_async
= true;
2018 return atmel_aes_complete(dd
, err
);
2020 /* If here, we've got the ownership of the SHA device. */
2021 dd
->flags
|= AES_FLAGS_OWN_SHA
;
2023 /* Configure the SHA device. */
2024 return atmel_sha_authenc_init(&rctx
->auth_req
,
2025 req
->src
, req
->assoclen
,
2027 atmel_aes_authenc_transfer
, dd
);
2030 static int atmel_aes_authenc_transfer(struct atmel_aes_dev
*dd
, int err
,
2033 struct aead_request
*req
= aead_request_cast(dd
->areq
);
2034 struct atmel_aes_authenc_reqctx
*rctx
= aead_request_ctx(req
);
2035 bool enc
= atmel_aes_is_encrypt(dd
);
2036 struct scatterlist
*src
, *dst
;
2037 u32 iv
[AES_BLOCK_SIZE
/ sizeof(u32
)];
2041 dd
->is_async
= true;
2043 return atmel_aes_complete(dd
, err
);
2045 /* Prepare src and dst scatter-lists to transfer cipher/plain texts. */
2046 src
= scatterwalk_ffwd(rctx
->src
, req
->src
, req
->assoclen
);
2049 if (req
->src
!= req
->dst
)
2050 dst
= scatterwalk_ffwd(rctx
->dst
, req
->dst
, req
->assoclen
);
2052 /* Configure the AES device. */
2053 memcpy(iv
, req
->iv
, sizeof(iv
));
2056 * Here we always set the 2nd parameter of atmel_aes_write_ctrl() to
2057 * 'true' even if the data transfer is actually performed by the CPU (so
2058 * not by the DMA) because we must force the AES_MR_SMOD bitfield to the
2059 * value AES_MR_SMOD_IDATAR0. Indeed, both AES_MR_SMOD and SHA_MR_SMOD
2060 * must be set to *_MR_SMOD_IDATAR0.
2062 atmel_aes_write_ctrl(dd
, true, iv
);
2063 emr
= AES_EMR_PLIPEN
;
2065 emr
|= AES_EMR_PLIPD
;
2066 atmel_aes_write(dd
, AES_EMR
, emr
);
2068 /* Transfer data. */
2069 return atmel_aes_dma_start(dd
, src
, dst
, rctx
->textlen
,
2070 atmel_aes_authenc_digest
);
2073 static int atmel_aes_authenc_digest(struct atmel_aes_dev
*dd
)
2075 struct aead_request
*req
= aead_request_cast(dd
->areq
);
2076 struct atmel_aes_authenc_reqctx
*rctx
= aead_request_ctx(req
);
2078 /* atmel_sha_authenc_final() releases the SHA device. */
2079 dd
->flags
&= ~AES_FLAGS_OWN_SHA
;
2080 return atmel_sha_authenc_final(&rctx
->auth_req
,
2081 rctx
->digest
, sizeof(rctx
->digest
),
2082 atmel_aes_authenc_final
, dd
);
2085 static int atmel_aes_authenc_final(struct atmel_aes_dev
*dd
, int err
,
2088 struct aead_request
*req
= aead_request_cast(dd
->areq
);
2089 struct atmel_aes_authenc_reqctx
*rctx
= aead_request_ctx(req
);
2090 struct crypto_aead
*tfm
= crypto_aead_reqtfm(req
);
2091 bool enc
= atmel_aes_is_encrypt(dd
);
2092 u32 idigest
[SHA512_DIGEST_SIZE
/ sizeof(u32
)], *odigest
= rctx
->digest
;
2096 dd
->is_async
= true;
2100 offs
= req
->assoclen
+ rctx
->textlen
;
2101 authsize
= crypto_aead_authsize(tfm
);
2103 scatterwalk_map_and_copy(odigest
, req
->dst
, offs
, authsize
, 1);
2105 scatterwalk_map_and_copy(idigest
, req
->src
, offs
, authsize
, 0);
2106 if (crypto_memneq(idigest
, odigest
, authsize
))
2111 return atmel_aes_complete(dd
, err
);
2114 static int atmel_aes_authenc_setkey(struct crypto_aead
*tfm
, const u8
*key
,
2115 unsigned int keylen
)
2117 struct atmel_aes_authenc_ctx
*ctx
= crypto_aead_ctx(tfm
);
2118 struct crypto_authenc_keys keys
;
2122 if (crypto_authenc_extractkeys(&keys
, key
, keylen
) != 0)
2125 if (keys
.enckeylen
> sizeof(ctx
->base
.key
))
2128 /* Save auth key. */
2129 flags
= crypto_aead_get_flags(tfm
);
2130 err
= atmel_sha_authenc_setkey(ctx
->auth
,
2131 keys
.authkey
, keys
.authkeylen
,
2133 crypto_aead_set_flags(tfm
, flags
& CRYPTO_TFM_RES_MASK
);
2135 memzero_explicit(&keys
, sizeof(keys
));
2140 ctx
->base
.keylen
= keys
.enckeylen
;
2141 memcpy(ctx
->base
.key
, keys
.enckey
, keys
.enckeylen
);
2143 memzero_explicit(&keys
, sizeof(keys
));
2147 crypto_aead_set_flags(tfm
, CRYPTO_TFM_RES_BAD_KEY_LEN
);
2148 memzero_explicit(&key
, sizeof(keys
));
2152 static int atmel_aes_authenc_init_tfm(struct crypto_aead
*tfm
,
2153 unsigned long auth_mode
)
2155 struct atmel_aes_authenc_ctx
*ctx
= crypto_aead_ctx(tfm
);
2156 unsigned int auth_reqsize
= atmel_sha_authenc_get_reqsize();
2158 ctx
->auth
= atmel_sha_authenc_spawn(auth_mode
);
2159 if (IS_ERR(ctx
->auth
))
2160 return PTR_ERR(ctx
->auth
);
2162 crypto_aead_set_reqsize(tfm
, (sizeof(struct atmel_aes_authenc_reqctx
) +
2164 ctx
->base
.start
= atmel_aes_authenc_start
;
2169 static int atmel_aes_authenc_hmac_sha1_init_tfm(struct crypto_aead
*tfm
)
2171 return atmel_aes_authenc_init_tfm(tfm
, SHA_FLAGS_HMAC_SHA1
);
2174 static int atmel_aes_authenc_hmac_sha224_init_tfm(struct crypto_aead
*tfm
)
2176 return atmel_aes_authenc_init_tfm(tfm
, SHA_FLAGS_HMAC_SHA224
);
2179 static int atmel_aes_authenc_hmac_sha256_init_tfm(struct crypto_aead
*tfm
)
2181 return atmel_aes_authenc_init_tfm(tfm
, SHA_FLAGS_HMAC_SHA256
);
2184 static int atmel_aes_authenc_hmac_sha384_init_tfm(struct crypto_aead
*tfm
)
2186 return atmel_aes_authenc_init_tfm(tfm
, SHA_FLAGS_HMAC_SHA384
);
2189 static int atmel_aes_authenc_hmac_sha512_init_tfm(struct crypto_aead
*tfm
)
2191 return atmel_aes_authenc_init_tfm(tfm
, SHA_FLAGS_HMAC_SHA512
);
2194 static void atmel_aes_authenc_exit_tfm(struct crypto_aead
*tfm
)
2196 struct atmel_aes_authenc_ctx
*ctx
= crypto_aead_ctx(tfm
);
2198 atmel_sha_authenc_free(ctx
->auth
);
2201 static int atmel_aes_authenc_crypt(struct aead_request
*req
,
2204 struct atmel_aes_authenc_reqctx
*rctx
= aead_request_ctx(req
);
2205 struct crypto_aead
*tfm
= crypto_aead_reqtfm(req
);
2206 struct atmel_aes_base_ctx
*ctx
= crypto_aead_ctx(tfm
);
2207 u32 authsize
= crypto_aead_authsize(tfm
);
2208 bool enc
= (mode
& AES_FLAGS_ENCRYPT
);
2209 struct atmel_aes_dev
*dd
;
2211 /* Compute text length. */
2212 if (!enc
&& req
->cryptlen
< authsize
)
2214 rctx
->textlen
= req
->cryptlen
- (enc
? 0 : authsize
);
2217 * Currently, empty messages are not supported yet:
2218 * the SHA auto-padding can be used only on non-empty messages.
2219 * Hence a special case needs to be implemented for empty message.
2221 if (!rctx
->textlen
&& !req
->assoclen
)
2224 rctx
->base
.mode
= mode
;
2225 ctx
->block_size
= AES_BLOCK_SIZE
;
2227 dd
= atmel_aes_find_dev(ctx
);
2231 return atmel_aes_handle_queue(dd
, &req
->base
);
2234 static int atmel_aes_authenc_cbc_aes_encrypt(struct aead_request
*req
)
2236 return atmel_aes_authenc_crypt(req
, AES_FLAGS_CBC
| AES_FLAGS_ENCRYPT
);
2239 static int atmel_aes_authenc_cbc_aes_decrypt(struct aead_request
*req
)
2241 return atmel_aes_authenc_crypt(req
, AES_FLAGS_CBC
);
2244 static struct aead_alg aes_authenc_algs
[] = {
2246 .setkey
= atmel_aes_authenc_setkey
,
2247 .encrypt
= atmel_aes_authenc_cbc_aes_encrypt
,
2248 .decrypt
= atmel_aes_authenc_cbc_aes_decrypt
,
2249 .init
= atmel_aes_authenc_hmac_sha1_init_tfm
,
2250 .exit
= atmel_aes_authenc_exit_tfm
,
2251 .ivsize
= AES_BLOCK_SIZE
,
2252 .maxauthsize
= SHA1_DIGEST_SIZE
,
2255 .cra_name
= "authenc(hmac(sha1),cbc(aes))",
2256 .cra_driver_name
= "atmel-authenc-hmac-sha1-cbc-aes",
2257 .cra_priority
= ATMEL_AES_PRIORITY
,
2258 .cra_flags
= CRYPTO_ALG_ASYNC
,
2259 .cra_blocksize
= AES_BLOCK_SIZE
,
2260 .cra_ctxsize
= sizeof(struct atmel_aes_authenc_ctx
),
2261 .cra_alignmask
= 0xf,
2262 .cra_module
= THIS_MODULE
,
2266 .setkey
= atmel_aes_authenc_setkey
,
2267 .encrypt
= atmel_aes_authenc_cbc_aes_encrypt
,
2268 .decrypt
= atmel_aes_authenc_cbc_aes_decrypt
,
2269 .init
= atmel_aes_authenc_hmac_sha224_init_tfm
,
2270 .exit
= atmel_aes_authenc_exit_tfm
,
2271 .ivsize
= AES_BLOCK_SIZE
,
2272 .maxauthsize
= SHA224_DIGEST_SIZE
,
2275 .cra_name
= "authenc(hmac(sha224),cbc(aes))",
2276 .cra_driver_name
= "atmel-authenc-hmac-sha224-cbc-aes",
2277 .cra_priority
= ATMEL_AES_PRIORITY
,
2278 .cra_flags
= CRYPTO_ALG_ASYNC
,
2279 .cra_blocksize
= AES_BLOCK_SIZE
,
2280 .cra_ctxsize
= sizeof(struct atmel_aes_authenc_ctx
),
2281 .cra_alignmask
= 0xf,
2282 .cra_module
= THIS_MODULE
,
2286 .setkey
= atmel_aes_authenc_setkey
,
2287 .encrypt
= atmel_aes_authenc_cbc_aes_encrypt
,
2288 .decrypt
= atmel_aes_authenc_cbc_aes_decrypt
,
2289 .init
= atmel_aes_authenc_hmac_sha256_init_tfm
,
2290 .exit
= atmel_aes_authenc_exit_tfm
,
2291 .ivsize
= AES_BLOCK_SIZE
,
2292 .maxauthsize
= SHA256_DIGEST_SIZE
,
2295 .cra_name
= "authenc(hmac(sha256),cbc(aes))",
2296 .cra_driver_name
= "atmel-authenc-hmac-sha256-cbc-aes",
2297 .cra_priority
= ATMEL_AES_PRIORITY
,
2298 .cra_flags
= CRYPTO_ALG_ASYNC
,
2299 .cra_blocksize
= AES_BLOCK_SIZE
,
2300 .cra_ctxsize
= sizeof(struct atmel_aes_authenc_ctx
),
2301 .cra_alignmask
= 0xf,
2302 .cra_module
= THIS_MODULE
,
2306 .setkey
= atmel_aes_authenc_setkey
,
2307 .encrypt
= atmel_aes_authenc_cbc_aes_encrypt
,
2308 .decrypt
= atmel_aes_authenc_cbc_aes_decrypt
,
2309 .init
= atmel_aes_authenc_hmac_sha384_init_tfm
,
2310 .exit
= atmel_aes_authenc_exit_tfm
,
2311 .ivsize
= AES_BLOCK_SIZE
,
2312 .maxauthsize
= SHA384_DIGEST_SIZE
,
2315 .cra_name
= "authenc(hmac(sha384),cbc(aes))",
2316 .cra_driver_name
= "atmel-authenc-hmac-sha384-cbc-aes",
2317 .cra_priority
= ATMEL_AES_PRIORITY
,
2318 .cra_flags
= CRYPTO_ALG_ASYNC
,
2319 .cra_blocksize
= AES_BLOCK_SIZE
,
2320 .cra_ctxsize
= sizeof(struct atmel_aes_authenc_ctx
),
2321 .cra_alignmask
= 0xf,
2322 .cra_module
= THIS_MODULE
,
2326 .setkey
= atmel_aes_authenc_setkey
,
2327 .encrypt
= atmel_aes_authenc_cbc_aes_encrypt
,
2328 .decrypt
= atmel_aes_authenc_cbc_aes_decrypt
,
2329 .init
= atmel_aes_authenc_hmac_sha512_init_tfm
,
2330 .exit
= atmel_aes_authenc_exit_tfm
,
2331 .ivsize
= AES_BLOCK_SIZE
,
2332 .maxauthsize
= SHA512_DIGEST_SIZE
,
2335 .cra_name
= "authenc(hmac(sha512),cbc(aes))",
2336 .cra_driver_name
= "atmel-authenc-hmac-sha512-cbc-aes",
2337 .cra_priority
= ATMEL_AES_PRIORITY
,
2338 .cra_flags
= CRYPTO_ALG_ASYNC
,
2339 .cra_blocksize
= AES_BLOCK_SIZE
,
2340 .cra_ctxsize
= sizeof(struct atmel_aes_authenc_ctx
),
2341 .cra_alignmask
= 0xf,
2342 .cra_module
= THIS_MODULE
,
2346 #endif /* CONFIG_CRYPTO_DEV_ATMEL_AUTHENC */
2348 /* Probe functions */
2350 static int atmel_aes_buff_init(struct atmel_aes_dev
*dd
)
2352 dd
->buf
= (void *)__get_free_pages(GFP_KERNEL
, ATMEL_AES_BUFFER_ORDER
);
2353 dd
->buflen
= ATMEL_AES_BUFFER_SIZE
;
2354 dd
->buflen
&= ~(AES_BLOCK_SIZE
- 1);
2357 dev_err(dd
->dev
, "unable to alloc pages.\n");
2364 static void atmel_aes_buff_cleanup(struct atmel_aes_dev
*dd
)
2366 free_page((unsigned long)dd
->buf
);
2369 static bool atmel_aes_filter(struct dma_chan
*chan
, void *slave
)
2371 struct at_dma_slave
*sl
= slave
;
2373 if (sl
&& sl
->dma_dev
== chan
->device
->dev
) {
2381 static int atmel_aes_dma_init(struct atmel_aes_dev
*dd
,
2382 struct crypto_platform_data
*pdata
)
2384 struct at_dma_slave
*slave
;
2386 dma_cap_mask_t mask
;
2389 dma_cap_set(DMA_SLAVE
, mask
);
2391 /* Try to grab 2 DMA channels */
2392 slave
= &pdata
->dma_slave
->rxdata
;
2393 dd
->src
.chan
= dma_request_slave_channel_compat(mask
, atmel_aes_filter
,
2394 slave
, dd
->dev
, "tx");
2398 slave
= &pdata
->dma_slave
->txdata
;
2399 dd
->dst
.chan
= dma_request_slave_channel_compat(mask
, atmel_aes_filter
,
2400 slave
, dd
->dev
, "rx");
2407 dma_release_channel(dd
->src
.chan
);
2409 dev_warn(dd
->dev
, "no DMA channel available\n");
2413 static void atmel_aes_dma_cleanup(struct atmel_aes_dev
*dd
)
2415 dma_release_channel(dd
->dst
.chan
);
2416 dma_release_channel(dd
->src
.chan
);
2419 static void atmel_aes_queue_task(unsigned long data
)
2421 struct atmel_aes_dev
*dd
= (struct atmel_aes_dev
*)data
;
2423 atmel_aes_handle_queue(dd
, NULL
);
2426 static void atmel_aes_done_task(unsigned long data
)
2428 struct atmel_aes_dev
*dd
= (struct atmel_aes_dev
*)data
;
2430 dd
->is_async
= true;
2431 (void)dd
->resume(dd
);
2434 static irqreturn_t
atmel_aes_irq(int irq
, void *dev_id
)
2436 struct atmel_aes_dev
*aes_dd
= dev_id
;
2439 reg
= atmel_aes_read(aes_dd
, AES_ISR
);
2440 if (reg
& atmel_aes_read(aes_dd
, AES_IMR
)) {
2441 atmel_aes_write(aes_dd
, AES_IDR
, reg
);
2442 if (AES_FLAGS_BUSY
& aes_dd
->flags
)
2443 tasklet_schedule(&aes_dd
->done_task
);
2445 dev_warn(aes_dd
->dev
, "AES interrupt when no active requests.\n");
2452 static void atmel_aes_unregister_algs(struct atmel_aes_dev
*dd
)
2456 #ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
2457 if (dd
->caps
.has_authenc
)
2458 for (i
= 0; i
< ARRAY_SIZE(aes_authenc_algs
); i
++)
2459 crypto_unregister_aead(&aes_authenc_algs
[i
]);
2462 if (dd
->caps
.has_xts
)
2463 crypto_unregister_alg(&aes_xts_alg
);
2465 if (dd
->caps
.has_gcm
)
2466 crypto_unregister_aead(&aes_gcm_alg
);
2468 if (dd
->caps
.has_cfb64
)
2469 crypto_unregister_alg(&aes_cfb64_alg
);
2471 for (i
= 0; i
< ARRAY_SIZE(aes_algs
); i
++)
2472 crypto_unregister_alg(&aes_algs
[i
]);
2475 static int atmel_aes_register_algs(struct atmel_aes_dev
*dd
)
2479 for (i
= 0; i
< ARRAY_SIZE(aes_algs
); i
++) {
2480 err
= crypto_register_alg(&aes_algs
[i
]);
2485 if (dd
->caps
.has_cfb64
) {
2486 err
= crypto_register_alg(&aes_cfb64_alg
);
2488 goto err_aes_cfb64_alg
;
2491 if (dd
->caps
.has_gcm
) {
2492 err
= crypto_register_aead(&aes_gcm_alg
);
2494 goto err_aes_gcm_alg
;
2497 if (dd
->caps
.has_xts
) {
2498 err
= crypto_register_alg(&aes_xts_alg
);
2500 goto err_aes_xts_alg
;
2503 #ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
2504 if (dd
->caps
.has_authenc
) {
2505 for (i
= 0; i
< ARRAY_SIZE(aes_authenc_algs
); i
++) {
2506 err
= crypto_register_aead(&aes_authenc_algs
[i
]);
2508 goto err_aes_authenc_alg
;
2515 #ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
2516 /* i = ARRAY_SIZE(aes_authenc_algs); */
2517 err_aes_authenc_alg
:
2518 for (j
= 0; j
< i
; j
++)
2519 crypto_unregister_aead(&aes_authenc_algs
[j
]);
2520 crypto_unregister_alg(&aes_xts_alg
);
2523 crypto_unregister_aead(&aes_gcm_alg
);
2525 crypto_unregister_alg(&aes_cfb64_alg
);
2527 i
= ARRAY_SIZE(aes_algs
);
2529 for (j
= 0; j
< i
; j
++)
2530 crypto_unregister_alg(&aes_algs
[j
]);
2535 static void atmel_aes_get_cap(struct atmel_aes_dev
*dd
)
2537 dd
->caps
.has_dualbuff
= 0;
2538 dd
->caps
.has_cfb64
= 0;
2539 dd
->caps
.has_ctr32
= 0;
2540 dd
->caps
.has_gcm
= 0;
2541 dd
->caps
.has_xts
= 0;
2542 dd
->caps
.has_authenc
= 0;
2543 dd
->caps
.max_burst_size
= 1;
2545 /* keep only major version number */
2546 switch (dd
->hw_version
& 0xff0) {
2548 dd
->caps
.has_dualbuff
= 1;
2549 dd
->caps
.has_cfb64
= 1;
2550 dd
->caps
.has_ctr32
= 1;
2551 dd
->caps
.has_gcm
= 1;
2552 dd
->caps
.has_xts
= 1;
2553 dd
->caps
.has_authenc
= 1;
2554 dd
->caps
.max_burst_size
= 4;
2557 dd
->caps
.has_dualbuff
= 1;
2558 dd
->caps
.has_cfb64
= 1;
2559 dd
->caps
.has_ctr32
= 1;
2560 dd
->caps
.has_gcm
= 1;
2561 dd
->caps
.max_burst_size
= 4;
2564 dd
->caps
.has_dualbuff
= 1;
2565 dd
->caps
.has_cfb64
= 1;
2566 dd
->caps
.max_burst_size
= 4;
2572 "Unmanaged aes version, set minimum capabilities\n");
2577 #if defined(CONFIG_OF)
2578 static const struct of_device_id atmel_aes_dt_ids
[] = {
2579 { .compatible
= "atmel,at91sam9g46-aes" },
2582 MODULE_DEVICE_TABLE(of
, atmel_aes_dt_ids
);
2584 static struct crypto_platform_data
*atmel_aes_of_init(struct platform_device
*pdev
)
2586 struct device_node
*np
= pdev
->dev
.of_node
;
2587 struct crypto_platform_data
*pdata
;
2590 dev_err(&pdev
->dev
, "device node not found\n");
2591 return ERR_PTR(-EINVAL
);
2594 pdata
= devm_kzalloc(&pdev
->dev
, sizeof(*pdata
), GFP_KERNEL
);
2596 dev_err(&pdev
->dev
, "could not allocate memory for pdata\n");
2597 return ERR_PTR(-ENOMEM
);
2600 pdata
->dma_slave
= devm_kzalloc(&pdev
->dev
,
2601 sizeof(*(pdata
->dma_slave
)),
2603 if (!pdata
->dma_slave
) {
2604 dev_err(&pdev
->dev
, "could not allocate memory for dma_slave\n");
2605 devm_kfree(&pdev
->dev
, pdata
);
2606 return ERR_PTR(-ENOMEM
);
2612 static inline struct crypto_platform_data
*atmel_aes_of_init(struct platform_device
*pdev
)
2614 return ERR_PTR(-EINVAL
);
2618 static int atmel_aes_probe(struct platform_device
*pdev
)
2620 struct atmel_aes_dev
*aes_dd
;
2621 struct crypto_platform_data
*pdata
;
2622 struct device
*dev
= &pdev
->dev
;
2623 struct resource
*aes_res
;
2626 pdata
= pdev
->dev
.platform_data
;
2628 pdata
= atmel_aes_of_init(pdev
);
2629 if (IS_ERR(pdata
)) {
2630 err
= PTR_ERR(pdata
);
2635 if (!pdata
->dma_slave
) {
2640 aes_dd
= devm_kzalloc(&pdev
->dev
, sizeof(*aes_dd
), GFP_KERNEL
);
2641 if (aes_dd
== NULL
) {
2642 dev_err(dev
, "unable to alloc data struct.\n");
2649 platform_set_drvdata(pdev
, aes_dd
);
2651 INIT_LIST_HEAD(&aes_dd
->list
);
2652 spin_lock_init(&aes_dd
->lock
);
2654 tasklet_init(&aes_dd
->done_task
, atmel_aes_done_task
,
2655 (unsigned long)aes_dd
);
2656 tasklet_init(&aes_dd
->queue_task
, atmel_aes_queue_task
,
2657 (unsigned long)aes_dd
);
2659 crypto_init_queue(&aes_dd
->queue
, ATMEL_AES_QUEUE_LENGTH
);
2663 /* Get the base address */
2664 aes_res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
2666 dev_err(dev
, "no MEM resource info\n");
2670 aes_dd
->phys_base
= aes_res
->start
;
2673 aes_dd
->irq
= platform_get_irq(pdev
, 0);
2674 if (aes_dd
->irq
< 0) {
2675 dev_err(dev
, "no IRQ resource info\n");
2680 err
= devm_request_irq(&pdev
->dev
, aes_dd
->irq
, atmel_aes_irq
,
2681 IRQF_SHARED
, "atmel-aes", aes_dd
);
2683 dev_err(dev
, "unable to request aes irq.\n");
2687 /* Initializing the clock */
2688 aes_dd
->iclk
= devm_clk_get(&pdev
->dev
, "aes_clk");
2689 if (IS_ERR(aes_dd
->iclk
)) {
2690 dev_err(dev
, "clock initialization failed.\n");
2691 err
= PTR_ERR(aes_dd
->iclk
);
2695 aes_dd
->io_base
= devm_ioremap_resource(&pdev
->dev
, aes_res
);
2696 if (IS_ERR(aes_dd
->io_base
)) {
2697 dev_err(dev
, "can't ioremap\n");
2698 err
= PTR_ERR(aes_dd
->io_base
);
2702 err
= clk_prepare(aes_dd
->iclk
);
2706 err
= atmel_aes_hw_version_init(aes_dd
);
2708 goto iclk_unprepare
;
2710 atmel_aes_get_cap(aes_dd
);
2712 #ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
2713 if (aes_dd
->caps
.has_authenc
&& !atmel_sha_authenc_is_ready()) {
2714 err
= -EPROBE_DEFER
;
2715 goto iclk_unprepare
;
2719 err
= atmel_aes_buff_init(aes_dd
);
2723 err
= atmel_aes_dma_init(aes_dd
, pdata
);
2727 spin_lock(&atmel_aes
.lock
);
2728 list_add_tail(&aes_dd
->list
, &atmel_aes
.dev_list
);
2729 spin_unlock(&atmel_aes
.lock
);
2731 err
= atmel_aes_register_algs(aes_dd
);
2735 dev_info(dev
, "Atmel AES - Using %s, %s for DMA transfers\n",
2736 dma_chan_name(aes_dd
->src
.chan
),
2737 dma_chan_name(aes_dd
->dst
.chan
));
2742 spin_lock(&atmel_aes
.lock
);
2743 list_del(&aes_dd
->list
);
2744 spin_unlock(&atmel_aes
.lock
);
2745 atmel_aes_dma_cleanup(aes_dd
);
2747 atmel_aes_buff_cleanup(aes_dd
);
2750 clk_unprepare(aes_dd
->iclk
);
2752 tasklet_kill(&aes_dd
->done_task
);
2753 tasklet_kill(&aes_dd
->queue_task
);
2755 if (err
!= -EPROBE_DEFER
)
2756 dev_err(dev
, "initialization failed.\n");
2761 static int atmel_aes_remove(struct platform_device
*pdev
)
2763 struct atmel_aes_dev
*aes_dd
;
2765 aes_dd
= platform_get_drvdata(pdev
);
2768 spin_lock(&atmel_aes
.lock
);
2769 list_del(&aes_dd
->list
);
2770 spin_unlock(&atmel_aes
.lock
);
2772 atmel_aes_unregister_algs(aes_dd
);
2774 tasklet_kill(&aes_dd
->done_task
);
2775 tasklet_kill(&aes_dd
->queue_task
);
2777 atmel_aes_dma_cleanup(aes_dd
);
2778 atmel_aes_buff_cleanup(aes_dd
);
2780 clk_unprepare(aes_dd
->iclk
);
2785 static struct platform_driver atmel_aes_driver
= {
2786 .probe
= atmel_aes_probe
,
2787 .remove
= atmel_aes_remove
,
2789 .name
= "atmel_aes",
2790 .of_match_table
= of_match_ptr(atmel_aes_dt_ids
),
2794 module_platform_driver(atmel_aes_driver
);
2796 MODULE_DESCRIPTION("Atmel AES hw acceleration support.");
2797 MODULE_LICENSE("GPL v2");
2798 MODULE_AUTHOR("Nicolas Royer - Eukréa Electromatique");