1
2
3
4
5
6
7
8
9
10
11
12#ifndef _K3_SA2UL_
13#define _K3_SA2UL_
14
15#include <crypto/aes.h>
16#include <crypto/sha1.h>
17#include <crypto/sha2.h>
18
19#define SA_ENGINE_ENABLE_CONTROL 0x1000
20
21struct sa_tfm_ctx;
22
23
24
25#define SA_EEC_ENCSS_EN 0x00000001
26#define SA_EEC_AUTHSS_EN 0x00000002
27#define SA_EEC_TRNG_EN 0x00000008
28#define SA_EEC_PKA_EN 0x00000010
29#define SA_EEC_CTXCACH_EN 0x00000080
30#define SA_EEC_CPPI_PORT_IN_EN 0x00000200
31#define SA_EEC_CPPI_PORT_OUT_EN 0x00000800
32
33
34
35
36
37
38#define SA_REQ_SUBTYPE_ENC 0x0001
39#define SA_REQ_SUBTYPE_DEC 0x0002
40#define SA_REQ_SUBTYPE_SHIFT 16
41#define SA_REQ_SUBTYPE_MASK 0xffff
42
43
44#define SA_DMA_NUM_EPIB_WORDS 4
45
46
47#define SA_DMA_NUM_PS_WORDS 16
48#define NKEY_SZ 3
49#define MCI_SZ 27
50
51
52
53
54
55#define SA_MAX_NUM_CTX 512
56
57
58
59
60#define SA_CTX_SIZE_TO_DMA_SIZE(ctx_sz) \
61 ((ctx_sz) ? ((ctx_sz) / 32 - 1) : 0)
62
63#define SA_CTX_ENC_KEY_OFFSET 32
64#define SA_CTX_ENC_AUX1_OFFSET 64
65#define SA_CTX_ENC_AUX2_OFFSET 96
66#define SA_CTX_ENC_AUX3_OFFSET 112
67#define SA_CTX_ENC_AUX4_OFFSET 128
68
69
70#define SA_ENG_ID_EM1 2
71#define SA_ENG_ID_EM2 3
72#define SA_ENG_ID_AM1 4
73#define SA_ENG_ID_AM2 5
74#define SA_ENG_ID_OUTPORT2 20
75
76
77
78
79#define SA_CMDL_OFFSET_NESC 0
80#define SA_CMDL_OFFSET_LABEL_LEN 1
81
82#define SA_CMDL_OFFSET_DATA_LEN 2
83#define SA_CMDL_OFFSET_DATA_OFFSET 4
84#define SA_CMDL_OFFSET_OPTION_CTRL1 5
85#define SA_CMDL_OFFSET_OPTION_CTRL2 6
86#define SA_CMDL_OFFSET_OPTION_CTRL3 7
87#define SA_CMDL_OFFSET_OPTION_BYTE 8
88
89#define SA_CMDL_HEADER_SIZE_BYTES 8
90
91#define SA_CMDL_OPTION_BYTES_MAX_SIZE 72
92#define SA_CMDL_MAX_SIZE_BYTES (SA_CMDL_HEADER_SIZE_BYTES + \
93 SA_CMDL_OPTION_BYTES_MAX_SIZE)
94
95
96#define SA_SW_INFO_FLAG_EVICT 0x0001
97#define SA_SW_INFO_FLAG_TEAR 0x0002
98#define SA_SW_INFO_FLAG_NOPD 0x0004
99
100
101
102
103
104
105#define SA_CTX_PE_PKT_TYPE_3GPP_AIR 0
106#define SA_CTX_PE_PKT_TYPE_SRTP 1
107#define SA_CTX_PE_PKT_TYPE_IPSEC_AH 2
108
109#define SA_CTX_PE_PKT_TYPE_IPSEC_ESP 3
110
111#define SA_CTX_PE_PKT_TYPE_NONE 4
112#define SA_CTX_ENC_TYPE1_SZ 64
113#define SA_CTX_ENC_TYPE2_SZ 96
114
115#define SA_CTX_AUTH_TYPE1_SZ 64
116#define SA_CTX_AUTH_TYPE2_SZ 96
117
118#define SA_CTX_PHP_PE_CTX_SZ 64
119
120#define SA_CTX_MAX_SZ (64 + SA_CTX_ENC_TYPE2_SZ + SA_CTX_AUTH_TYPE2_SZ)
121
122
123
124
125
126
127
128
129
130
131
132
133
134#define SA_CTX_DMA_SIZE_0 0
135#define SA_CTX_DMA_SIZE_64 1
136#define SA_CTX_DMA_SIZE_96 2
137#define SA_CTX_DMA_SIZE_128 3
138
139
140
141
142
143#define SA_CTX_SCCTL_OWNER_OFFSET 0
144
145#define SA_CTX_ENC_KEY_OFFSET 32
146#define SA_CTX_ENC_AUX1_OFFSET 64
147#define SA_CTX_ENC_AUX2_OFFSET 96
148#define SA_CTX_ENC_AUX3_OFFSET 112
149#define SA_CTX_ENC_AUX4_OFFSET 128
150
151#define SA_SCCTL_FE_AUTH_ENC 0x65
152#define SA_SCCTL_FE_ENC 0x8D
153
154#define SA_ALIGN_MASK (sizeof(u32) - 1)
155#define SA_ALIGNED __aligned(32)
156
157#define SA_AUTH_SW_CTRL_MD5 1
158#define SA_AUTH_SW_CTRL_SHA1 2
159#define SA_AUTH_SW_CTRL_SHA224 3
160#define SA_AUTH_SW_CTRL_SHA256 4
161#define SA_AUTH_SW_CTRL_SHA384 5
162#define SA_AUTH_SW_CTRL_SHA512 6
163
164
165#define SA_MAX_DATA_SZ U16_MAX
166
167
168
169
170
171#define SA_UNSAFE_DATA_SZ_MIN 240
172#define SA_UNSAFE_DATA_SZ_MAX 256
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190struct sa_crypto_data {
191 void __iomem *base;
192 struct platform_device *pdev;
193 struct dma_pool *sc_pool;
194 struct device *dev;
195 spinlock_t scid_lock;
196
197 u16 sc_id_start;
198 u16 sc_id_end;
199 u16 sc_id;
200 unsigned long ctx_bm[DIV_ROUND_UP(SA_MAX_NUM_CTX,
201 BITS_PER_LONG)];
202 struct sa_tfm_ctx *ctx;
203 struct dma_chan *dma_rx1;
204 struct dma_chan *dma_rx2;
205 struct dma_chan *dma_tx;
206};
207
208
209
210
211
212
213
214struct sa_cmdl_param_info {
215 u16 index;
216 u16 offset;
217 u16 size;
218};
219
220
221#define SA_MAX_AUX_DATA_WORDS 8
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241struct sa_cmdl_upd_info {
242 u16 flags;
243 u16 submode;
244 struct sa_cmdl_param_info enc_size;
245 struct sa_cmdl_param_info enc_size2;
246 struct sa_cmdl_param_info enc_offset;
247 struct sa_cmdl_param_info enc_iv;
248 struct sa_cmdl_param_info enc_iv2;
249 struct sa_cmdl_param_info aad;
250 struct sa_cmdl_param_info payload;
251 struct sa_cmdl_param_info auth_size;
252 struct sa_cmdl_param_info auth_size2;
253 struct sa_cmdl_param_info auth_offset;
254 struct sa_cmdl_param_info auth_iv;
255 struct sa_cmdl_param_info aux_key_info;
256 u32 aux_key[SA_MAX_AUX_DATA_WORDS];
257};
258
259
260
261
262
263
264
265#define SA_PSDATA_CTX_WORDS 4
266
267
268#define SA_MAX_CMDL_WORDS (SA_DMA_NUM_PS_WORDS - SA_PSDATA_CTX_WORDS)
269
270
271
272
273
274
275
276
277
278
279
280struct sa_ctx_info {
281 u8 *sc;
282 dma_addr_t sc_phys;
283 u16 sc_id;
284 u16 cmdl_size;
285 u32 cmdl[SA_MAX_CMDL_WORDS];
286 struct sa_cmdl_upd_info cmdl_upd_info;
287
288 u32 epib[SA_DMA_NUM_EPIB_WORDS];
289};
290
291
292
293
294
295
296
297
298
299
300
301struct sa_tfm_ctx {
302 struct sa_crypto_data *dev_data;
303 struct sa_ctx_info enc;
304 struct sa_ctx_info dec;
305 struct sa_ctx_info auth;
306 int keylen;
307 int iv_idx;
308 u32 key[AES_KEYSIZE_256 / sizeof(u32)];
309 u8 authkey[SHA512_BLOCK_SIZE];
310 struct crypto_shash *shash;
311
312 union {
313 struct crypto_skcipher *skcipher;
314 struct crypto_ahash *ahash;
315 struct crypto_aead *aead;
316 } fallback;
317};
318
319
320
321
322
323
324
325struct sa_sha_req_ctx {
326 struct sa_crypto_data *dev_data;
327 u32 cmdl[SA_MAX_CMDL_WORDS + SA_PSDATA_CTX_WORDS];
328 struct ahash_request fallback_req;
329};
330
331enum sa_submode {
332 SA_MODE_GEN = 0,
333 SA_MODE_CCM,
334 SA_MODE_GCM,
335 SA_MODE_GMAC
336};
337
338
339enum sa_ealg_id {
340 SA_EALG_ID_NONE = 0,
341 SA_EALG_ID_NULL,
342 SA_EALG_ID_AES_CTR,
343 SA_EALG_ID_AES_F8,
344 SA_EALG_ID_AES_CBC,
345 SA_EALG_ID_DES_CBC,
346 SA_EALG_ID_3DES_CBC,
347 SA_EALG_ID_CCM,
348 SA_EALG_ID_GCM,
349 SA_EALG_ID_AES_ECB,
350 SA_EALG_ID_LAST
351};
352
353
354enum sa_aalg_id {
355 SA_AALG_ID_NONE = 0,
356 SA_AALG_ID_NULL = SA_EALG_ID_LAST,
357 SA_AALG_ID_MD5,
358 SA_AALG_ID_SHA1,
359 SA_AALG_ID_SHA2_224,
360 SA_AALG_ID_SHA2_256,
361 SA_AALG_ID_SHA2_512,
362 SA_AALG_ID_HMAC_MD5,
363 SA_AALG_ID_HMAC_SHA1,
364 SA_AALG_ID_HMAC_SHA2_224,
365 SA_AALG_ID_HMAC_SHA2_256,
366 SA_AALG_ID_GMAC,
367 SA_AALG_ID_CMAC,
368 SA_AALG_ID_CBC_MAC,
369 SA_AALG_ID_AES_XCBC
370};
371
372
373
374
375
376enum sa_eng_algo_id {
377 SA_ENG_ALGO_ECB = 0,
378 SA_ENG_ALGO_CBC,
379 SA_ENG_ALGO_CFB,
380 SA_ENG_ALGO_OFB,
381 SA_ENG_ALGO_CTR,
382 SA_ENG_ALGO_F8,
383 SA_ENG_ALGO_F8F9,
384 SA_ENG_ALGO_GCM,
385 SA_ENG_ALGO_GMAC,
386 SA_ENG_ALGO_CCM,
387 SA_ENG_ALGO_CMAC,
388 SA_ENG_ALGO_CBCMAC,
389 SA_NUM_ENG_ALGOS
390};
391
392
393
394
395
396
397struct sa_eng_info {
398 u8 eng_id;
399 u16 sc_size;
400};
401
402#endif
403