ltq-deu: fix handling of data blocks with sizes != AES/DES block size
[openwrt/openwrt.git] / package / kernel / lantiq / ltq-deu / src / ifxmips_deu.h
1 /******************************************************************************
2 **
3 ** FILE NAME : ifxmips_deu.h
4 ** DESCRIPTION : Data Encryption Unit Driver
5 ** COPYRIGHT : Copyright (c) 2009
6 ** Infineon Technologies AG
7 ** Am Campeon 1-12, 85579 Neubiberg, Germany
8 **
9 ** This program is free software; you can redistribute it and/or modify
10 ** it under the terms of the GNU General Public License as published by
11 ** the Free Software Foundation; either version 2 of the License, or
12 ** (at your option) any later version.
13 **
14 ** HISTORY
15 ** $Date $Author $Comment
16 ** 08,Sept 2009 Mohammad Firdaus Initial UEIP release
17 *******************************************************************************/
18 /*!
19 \defgroup IFX_DEU IFX_DEU_DRIVERS
20 \ingroup API
21 \brief ifx deu driver module
22 */
23
24 /*!
25 \file ifxmips_deu.h
26 \brief main deu driver header file
27 */
28
29 /*!
30 \defgroup IFX_DEU_DEFINITIONS IFX_DEU_DEFINITIONS
31 \ingroup IFX_DEU
32 \brief ifx deu definitions
33 */
34
35
36 #ifndef IFXMIPS_DEU_H
37 #define IFXMIPS_DEU_H
38
39 #include <crypto/algapi.h>
40 #include <linux/interrupt.h>
41
42 #define IFXDEU_ALIGNMENT 16
43
44 #define IFX_DEU_BASE_ADDR (KSEG1 | 0x1E103100)
45 #define IFX_DEU_CLK ((volatile u32 *)(IFX_DEU_BASE_ADDR + 0x0000))
46 #define IFX_DES_CON ((volatile u32 *)(IFX_DEU_BASE_ADDR + 0x0010))
47 #define IFX_AES_CON ((volatile u32 *)(IFX_DEU_BASE_ADDR + 0x0050))
48 #define IFX_HASH_CON ((volatile u32 *)(IFX_DEU_BASE_ADDR + 0x00B0))
49 #define IFX_ARC4_CON ((volatile u32 *)(IFX_DEU_BASE_ADDR + 0x0100))
50
51 #define PFX "ifxdeu: "
52 #define CLC_START IFX_DEU_CLK
53 #define IFXDEU_CRA_PRIORITY 300
54 #define IFXDEU_COMPOSITE_PRIORITY 400
55 //#define KSEG1 0xA0000000
56 #define IFX_PMU_ENABLE 1
57 #define IFX_PMU_DISABLE 0
58
59 #define CRYPTO_DIR_ENCRYPT 1
60 #define CRYPTO_DIR_DECRYPT 0
61
62 #define AES_IDLE 0
63 #define AES_BUSY 1
64 #define AES_STARTED 2
65 #define AES_COMPLETED 3
66 #define DES_IDLE 0
67 #define DES_BUSY 1
68 #define DES_STARTED 2
69 #define DES_COMPLETED 3
70
71 #define PROCESS_SCATTER 1
72 #define PROCESS_NEW_PACKET 2
73
74 #define PMU_DEU BIT(20)
75 #define START_DEU_POWER \
76 do { \
77 volatile struct clc_controlr_t *clc = (struct clc_controlr_t *) CLC_START; \
78 ltq_pmu_enable(PMU_DEU); \
79 clc->FSOE = 0; \
80 clc->SBWE = 0; \
81 clc->SPEN = 0; \
82 clc->SBWE = 0; \
83 clc->DISS = 0; \
84 clc->DISR = 0; \
85 } while(0)
86
87 #define STOP_DEU_POWER \
88 do { \
89 volatile struct clc_controlr_t *clc = (struct clc_controlr_t *) CLC_START; \
90 ltq_pmu_disable(PMU_DEU); \
91 clc->FSOE = 1; \
92 clc->SBWE = 1; \
93 clc->SPEN = 1; \
94 clc->SBWE = 1; \
95 clc->DISS = 1; \
96 clc->DISR = 1; \
97 } while (0)
98
99 /*
100 * Not used anymore in UEIP (use IFX_DES_CON, IFX_AES_CON, etc instead)
101 * #define DEU_BASE (KSEG1+0x1E103100)
102 * #define DES_CON (DEU_BASE+0x10)
103 * #define AES_CON (DEU_BASE+0x50)
104 * #define HASH_CON (DEU_BASE+0xB0)
105 * #define DMA_CON (DEU_BASE+0xEC)
106 * #define INT_CON (DEU_BASE+0xF4)
107 * #define ARC4_CON (DEU_BASE+0x100)
108 */
109
110
111 int __init ifxdeu_init_des (void);
112 int __init ifxdeu_init_aes (void);
113 int __init ifxdeu_init_arc4 (void);
114 int __init ifxdeu_init_sha1 (void);
115 int __init ifxdeu_init_md5 (void);
116 int __init ifxdeu_init_sha1_hmac (void);
117 int __init ifxdeu_init_md5_hmac (void);
118 int __init lqdeu_async_aes_init(void);
119 int __init lqdeu_async_des_init(void);
120
121 void __exit ifxdeu_fini_des (void);
122 void __exit ifxdeu_fini_aes (void);
123 void __exit ifxdeu_fini_arc4 (void);
124 void __exit ifxdeu_fini_sha1 (void);
125 void __exit ifxdeu_fini_md5 (void);
126 void __exit ifxdeu_fini_sha1_hmac (void);
127 void __exit ifxdeu_fini_md5_hmac (void);
128 void __exit ifxdeu_fini_dma(void);
129 void __exit lqdeu_fini_async_aes(void);
130 void __exit lqdeu_fini_async_des(void);
131 void __exit deu_fini (void);
132 int deu_dma_init (void);
133
134
135
136 #define DEU_WAKELIST_INIT(queue) \
137 init_waitqueue_head(&queue)
138
139 #define DEU_WAIT_EVENT_TIMEOUT(queue, event, flags, timeout) \
140 do { \
141 wait_event_interruptible_timeout((queue), \
142 test_bit((event), &(flags)), (timeout)); \
143 clear_bit((event), &(flags)); \
144 }while (0)
145
146
147 #define DEU_WAKEUP_EVENT(queue, event, flags) \
148 do { \
149 set_bit((event), &(flags)); \
150 wake_up_interruptible(&(queue)); \
151 }while (0)
152
153 #define DEU_WAIT_EVENT(queue, event, flags) \
154 do { \
155 wait_event_interruptible(queue, \
156 test_bit((event), &(flags))); \
157 clear_bit((event), &(flags)); \
158 }while (0)
159
160 typedef struct deu_drv_priv {
161 wait_queue_head_t deu_thread_wait;
162 #define DEU_EVENT 1
163 #define DES_ASYNC_EVENT 2
164 #define AES_ASYNC_EVENT 3
165 volatile long des_event_flags;
166 volatile long aes_event_flags;
167 volatile long deu_event_flags;
168 int event_src;
169 u32 *deu_rx_buf;
170 u32 *outcopy;
171 u32 deu_rx_len;
172
173 struct aes_priv *aes_dataptr;
174 struct des_priv *des_dataptr;
175 }deu_drv_priv_t;
176
177
178 /**
179 * struct aes_priv_t - ASYNC AES
180 * @lock: spinlock lock
181 * @lock_flag: flag for spinlock activities
182 * @list: crypto queue API list
183 * @hw_status: DEU hw status flag
184 * @aes_wait_flag: flag for sleep queue
185 * @aes_wait_queue: queue attributes for aes
186 * @bytes_processed: number of bytes to process by DEU
187 * @aes_pid: pid number for AES thread
188 * @aes_sync: atomic wait sync for AES
189 *
190 */
191
192 typedef struct {
193 spinlock_t lock;
194 struct crypto_queue list;
195 unsigned int hw_status;
196 volatile long aes_wait_flag;
197 wait_queue_head_t aes_wait_queue;
198
199 pid_t aes_pid;
200
201 struct tasklet_struct aes_task;
202
203 } aes_priv_t;
204
205 /**
206 * struct des_priv_t - ASYNC DES
207 * @lock: spinlock lock
208 * @list: crypto queue API list
209 * @hw_status: DEU hw status flag
210 * @des_wait_flag: flag for sleep queue
211 * @des_wait_queue: queue attributes for des
212 * @des_pid: pid number for DES thread
213 * @des_sync: atomic wait sync for DES
214 *
215 */
216
217 typedef struct {
218 spinlock_t lock;
219 struct crypto_queue list;
220 unsigned int hw_status;
221 volatile long des_wait_flag;
222 wait_queue_head_t des_wait_queue;
223
224 pid_t des_pid;
225
226 struct tasklet_struct des_task;
227
228 } des_priv_t;
229
230 #endif /* IFXMIPS_DEU_H */
231
232