Merge branches 'clk-ti', 'clk-analog', 'clk-trace', 'clk-at91' and 'clk-silabs' into...
[linux-2.6-microblaze.git] / drivers / crypto / sa2ul.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * K3 SA2UL crypto accelerator driver
4  *
5  * Copyright (C) 2018-2020 Texas Instruments Incorporated - http://www.ti.com
6  *
7  * Authors:     Keerthy
8  *              Vitaly Andrianov
9  *              Tero Kristo
10  */
11 #include <linux/clk.h>
12 #include <linux/dmaengine.h>
13 #include <linux/dmapool.h>
14 #include <linux/module.h>
15 #include <linux/of_device.h>
16 #include <linux/platform_device.h>
17 #include <linux/pm_runtime.h>
18
19 #include <crypto/aes.h>
20 #include <crypto/authenc.h>
21 #include <crypto/des.h>
22 #include <crypto/internal/aead.h>
23 #include <crypto/internal/hash.h>
24 #include <crypto/internal/skcipher.h>
25 #include <crypto/scatterwalk.h>
26 #include <crypto/sha.h>
27
28 #include "sa2ul.h"
29
30 /* Byte offset for key in encryption security context */
31 #define SC_ENC_KEY_OFFSET (1 + 27 + 4)
32 /* Byte offset for Aux-1 in encryption security context */
33 #define SC_ENC_AUX1_OFFSET (1 + 27 + 4 + 32)
34
35 #define SA_CMDL_UPD_ENC         0x0001
36 #define SA_CMDL_UPD_AUTH        0x0002
37 #define SA_CMDL_UPD_ENC_IV      0x0004
38 #define SA_CMDL_UPD_AUTH_IV     0x0008
39 #define SA_CMDL_UPD_AUX_KEY     0x0010
40
41 #define SA_AUTH_SUBKEY_LEN      16
42 #define SA_CMDL_PAYLOAD_LENGTH_MASK     0xFFFF
43 #define SA_CMDL_SOP_BYPASS_LEN_MASK     0xFF000000
44
45 #define MODE_CONTROL_BYTES      27
46 #define SA_HASH_PROCESSING      0
47 #define SA_CRYPTO_PROCESSING    0
48 #define SA_UPLOAD_HASH_TO_TLR   BIT(6)
49
50 #define SA_SW0_FLAGS_MASK       0xF0000
51 #define SA_SW0_CMDL_INFO_MASK   0x1F00000
52 #define SA_SW0_CMDL_PRESENT     BIT(4)
53 #define SA_SW0_ENG_ID_MASK      0x3E000000
54 #define SA_SW0_DEST_INFO_PRESENT        BIT(30)
55 #define SA_SW2_EGRESS_LENGTH            0xFF000000
56 #define SA_BASIC_HASH           0x10
57
58 #define SHA256_DIGEST_WORDS    8
59 /* Make 32-bit word from 4 bytes */
60 #define SA_MK_U32(b0, b1, b2, b3) (((b0) << 24) | ((b1) << 16) | \
61                                    ((b2) << 8) | (b3))
62
63 /* size of SCCTL structure in bytes */
64 #define SA_SCCTL_SZ 16
65
66 /* Max Authentication tag size */
67 #define SA_MAX_AUTH_TAG_SZ 64
68
69 #define PRIV_ID 0x1
70 #define PRIV    0x1
71
72 static struct device *sa_k3_dev;
73
74 /**
75  * struct sa_cmdl_cfg - Command label configuration descriptor
76  * @aalg: authentication algorithm ID
77  * @enc_eng_id: Encryption Engine ID supported by the SA hardware
78  * @auth_eng_id: Authentication Engine ID
79  * @iv_size: Initialization Vector size
80  * @akey: Authentication key
81  * @akey_len: Authentication key length
82  * @enc: True, if this is an encode request
83  */
84 struct sa_cmdl_cfg {
85         int aalg;
86         u8 enc_eng_id;
87         u8 auth_eng_id;
88         u8 iv_size;
89         const u8 *akey;
90         u16 akey_len;
91         bool enc;
92 };
93
94 /**
95  * struct algo_data - Crypto algorithm specific data
96  * @enc_eng: Encryption engine info structure
97  * @auth_eng: Authentication engine info structure
98  * @auth_ctrl: Authentication control word
99  * @hash_size: Size of digest
100  * @iv_idx: iv index in psdata
101  * @iv_out_size: iv out size
102  * @ealg_id: Encryption Algorithm ID
103  * @aalg_id: Authentication algorithm ID
104  * @mci_enc: Mode Control Instruction for Encryption algorithm
105  * @mci_dec: Mode Control Instruction for Decryption
106  * @inv_key: Whether the encryption algorithm demands key inversion
107  * @ctx: Pointer to the algorithm context
108  * @keyed_mac: Whether the authentication algorithm has key
109  * @prep_iopad: Function pointer to generate intermediate ipad/opad
110  */
111 struct algo_data {
112         struct sa_eng_info enc_eng;
113         struct sa_eng_info auth_eng;
114         u8 auth_ctrl;
115         u8 hash_size;
116         u8 iv_idx;
117         u8 iv_out_size;
118         u8 ealg_id;
119         u8 aalg_id;
120         u8 *mci_enc;
121         u8 *mci_dec;
122         bool inv_key;
123         struct sa_tfm_ctx *ctx;
124         bool keyed_mac;
125         void (*prep_iopad)(struct algo_data *algo, const u8 *key,
126                            u16 key_sz, __be32 *ipad, __be32 *opad);
127 };
128
129 /**
130  * struct sa_alg_tmpl: A generic template encompassing crypto/aead algorithms
131  * @type: Type of the crypto algorithm.
132  * @alg: Union of crypto algorithm definitions.
133  * @registered: Flag indicating if the crypto algorithm is already registered
134  */
135 struct sa_alg_tmpl {
136         u32 type;               /* CRYPTO_ALG_TYPE from <linux/crypto.h> */
137         union {
138                 struct skcipher_alg skcipher;
139                 struct ahash_alg ahash;
140                 struct aead_alg aead;
141         } alg;
142         bool registered;
143 };
144
145 /**
146  * struct sa_mapped_sg: scatterlist information for tx and rx
147  * @mapped: Set to true if the @sgt is mapped
148  * @dir: mapping direction used for @sgt
149  * @split_sg: Set if the sg is split and needs to be freed up
150  * @static_sg: Static scatterlist entry for overriding data
151  * @sgt: scatterlist table for DMA API use
152  */
153 struct sa_mapped_sg {
154         bool mapped;
155         enum dma_data_direction dir;
156         struct scatterlist static_sg;
157         struct scatterlist *split_sg;
158         struct sg_table sgt;
159 };
160 /**
161  * struct sa_rx_data: RX Packet miscellaneous data place holder
162  * @req: crypto request data pointer
163  * @ddev: pointer to the DMA device
164  * @tx_in: dma_async_tx_descriptor pointer for rx channel
165  * @mapped_sg: Information on tx (0) and rx (1) scatterlist DMA mapping
166  * @enc: Flag indicating either encryption or decryption
167  * @enc_iv_size: Initialisation vector size
168  * @iv_idx: Initialisation vector index
169  */
170 struct sa_rx_data {
171         void *req;
172         struct device *ddev;
173         struct dma_async_tx_descriptor *tx_in;
174         struct sa_mapped_sg mapped_sg[2];
175         u8 enc;
176         u8 enc_iv_size;
177         u8 iv_idx;
178 };
179
180 /**
181  * struct sa_req: SA request definition
182  * @dev: device for the request
183  * @size: total data to the xmitted via DMA
184  * @enc_offset: offset of cipher data
185  * @enc_size: data to be passed to cipher engine
186  * @enc_iv: cipher IV
187  * @auth_offset: offset of the authentication data
188  * @auth_size: size of the authentication data
189  * @auth_iv: authentication IV
190  * @type: algorithm type for the request
191  * @cmdl: command label pointer
192  * @base: pointer to the base request
193  * @ctx: pointer to the algorithm context data
194  * @enc: true if this is an encode request
195  * @src: source data
196  * @dst: destination data
197  * @callback: DMA callback for the request
198  * @mdata_size: metadata size passed to DMA
199  */
200 struct sa_req {
201         struct device *dev;
202         u16 size;
203         u8 enc_offset;
204         u16 enc_size;
205         u8 *enc_iv;
206         u8 auth_offset;
207         u16 auth_size;
208         u8 *auth_iv;
209         u32 type;
210         u32 *cmdl;
211         struct crypto_async_request *base;
212         struct sa_tfm_ctx *ctx;
213         bool enc;
214         struct scatterlist *src;
215         struct scatterlist *dst;
216         dma_async_tx_callback callback;
217         u16 mdata_size;
218 };
219
220 /*
221  * Mode Control Instructions for various Key lengths 128, 192, 256
222  * For CBC (Cipher Block Chaining) mode for encryption
223  */
224 static u8 mci_cbc_enc_array[3][MODE_CONTROL_BYTES] = {
225         {       0x61, 0x00, 0x00, 0x18, 0x88, 0x0a, 0xaa, 0x4b, 0x7e, 0x00,
226                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
228         {       0x61, 0x00, 0x00, 0x18, 0x88, 0x4a, 0xaa, 0x4b, 0x7e, 0x00,
229                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
231         {       0x61, 0x00, 0x00, 0x18, 0x88, 0x8a, 0xaa, 0x4b, 0x7e, 0x00,
232                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
234 };
235
236 /*
237  * Mode Control Instructions for various Key lengths 128, 192, 256
238  * For CBC (Cipher Block Chaining) mode for decryption
239  */
240 static u8 mci_cbc_dec_array[3][MODE_CONTROL_BYTES] = {
241         {       0x71, 0x00, 0x00, 0x80, 0x8a, 0xca, 0x98, 0xf4, 0x40, 0xc0,
242                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
244         {       0x71, 0x00, 0x00, 0x84, 0x8a, 0xca, 0x98, 0xf4, 0x40, 0xc0,
245                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
247         {       0x71, 0x00, 0x00, 0x88, 0x8a, 0xca, 0x98, 0xf4, 0x40, 0xc0,
248                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
250 };
251
252 /*
253  * Mode Control Instructions for various Key lengths 128, 192, 256
254  * For CBC (Cipher Block Chaining) mode for encryption
255  */
256 static u8 mci_cbc_enc_no_iv_array[3][MODE_CONTROL_BYTES] = {
257         {       0x21, 0x00, 0x00, 0x18, 0x88, 0x0a, 0xaa, 0x4b, 0x7e, 0x00,
258                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
260         {       0x21, 0x00, 0x00, 0x18, 0x88, 0x4a, 0xaa, 0x4b, 0x7e, 0x00,
261                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
263         {       0x21, 0x00, 0x00, 0x18, 0x88, 0x8a, 0xaa, 0x4b, 0x7e, 0x00,
264                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
266 };
267
268 /*
269  * Mode Control Instructions for various Key lengths 128, 192, 256
270  * For CBC (Cipher Block Chaining) mode for decryption
271  */
272 static u8 mci_cbc_dec_no_iv_array[3][MODE_CONTROL_BYTES] = {
273         {       0x31, 0x00, 0x00, 0x80, 0x8a, 0xca, 0x98, 0xf4, 0x40, 0xc0,
274                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
275                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
276         {       0x31, 0x00, 0x00, 0x84, 0x8a, 0xca, 0x98, 0xf4, 0x40, 0xc0,
277                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
278                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
279         {       0x31, 0x00, 0x00, 0x88, 0x8a, 0xca, 0x98, 0xf4, 0x40, 0xc0,
280                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
282 };
283
284 /*
285  * Mode Control Instructions for various Key lengths 128, 192, 256
286  * For ECB (Electronic Code Book) mode for encryption
287  */
288 static u8 mci_ecb_enc_array[3][27] = {
289         {       0x21, 0x00, 0x00, 0x80, 0x8a, 0x04, 0xb7, 0x90, 0x00, 0x00,
290                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
292         {       0x21, 0x00, 0x00, 0x84, 0x8a, 0x04, 0xb7, 0x90, 0x00, 0x00,
293                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
295         {       0x21, 0x00, 0x00, 0x88, 0x8a, 0x04, 0xb7, 0x90, 0x00, 0x00,
296                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
298 };
299
300 /*
301  * Mode Control Instructions for various Key lengths 128, 192, 256
302  * For ECB (Electronic Code Book) mode for decryption
303  */
304 static u8 mci_ecb_dec_array[3][27] = {
305         {       0x31, 0x00, 0x00, 0x80, 0x8a, 0x04, 0xb7, 0x90, 0x00, 0x00,
306                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
308         {       0x31, 0x00, 0x00, 0x84, 0x8a, 0x04, 0xb7, 0x90, 0x00, 0x00,
309                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
311         {       0x31, 0x00, 0x00, 0x88, 0x8a, 0x04, 0xb7, 0x90, 0x00, 0x00,
312                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00        },
314 };
315
316 /*
317  * Mode Control Instructions for DES algorithm
318  * For CBC (Cipher Block Chaining) mode and ECB mode
319  * encryption and for decryption respectively
320  */
321 static u8 mci_cbc_3des_enc_array[MODE_CONTROL_BYTES] = {
322         0x60, 0x00, 0x00, 0x18, 0x88, 0x52, 0xaa, 0x4b, 0x7e, 0x00, 0x00, 0x00,
323         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324         0x00, 0x00, 0x00,
325 };
326
327 static u8 mci_cbc_3des_dec_array[MODE_CONTROL_BYTES] = {
328         0x70, 0x00, 0x00, 0x85, 0x0a, 0xca, 0x98, 0xf4, 0x40, 0xc0, 0x00, 0x00,
329         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330         0x00, 0x00, 0x00,
331 };
332
333 static u8 mci_ecb_3des_enc_array[MODE_CONTROL_BYTES] = {
334         0x20, 0x00, 0x00, 0x85, 0x0a, 0x04, 0xb7, 0x90, 0x00, 0x00, 0x00, 0x00,
335         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336         0x00, 0x00, 0x00,
337 };
338
339 static u8 mci_ecb_3des_dec_array[MODE_CONTROL_BYTES] = {
340         0x30, 0x00, 0x00, 0x85, 0x0a, 0x04, 0xb7, 0x90, 0x00, 0x00, 0x00, 0x00,
341         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342         0x00, 0x00, 0x00,
343 };
344
345 /*
346  * Perform 16 byte or 128 bit swizzling
347  * The SA2UL Expects the security context to
348  * be in little Endian and the bus width is 128 bits or 16 bytes
349  * Hence swap 16 bytes at a time from higher to lower address
350  */
351 static void sa_swiz_128(u8 *in, u16 len)
352 {
353         u8 data[16];
354         int i, j;
355
356         for (i = 0; i < len; i += 16) {
357                 memcpy(data, &in[i], 16);
358                 for (j = 0; j < 16; j++)
359                         in[i + j] = data[15 - j];
360         }
361 }
362
363 /* Prepare the ipad and opad from key as per SHA algorithm step 1*/
364 static void prepare_kiopad(u8 *k_ipad, u8 *k_opad, const u8 *key, u16 key_sz)
365 {
366         int i;
367
368         for (i = 0; i < key_sz; i++) {
369                 k_ipad[i] = key[i] ^ 0x36;
370                 k_opad[i] = key[i] ^ 0x5c;
371         }
372
373         /* Instead of XOR with 0 */
374         for (; i < SHA1_BLOCK_SIZE; i++) {
375                 k_ipad[i] = 0x36;
376                 k_opad[i] = 0x5c;
377         }
378 }
379
380 static void sa_export_shash(struct shash_desc *hash, int block_size,
381                             int digest_size, __be32 *out)
382 {
383         union {
384                 struct sha1_state sha1;
385                 struct sha256_state sha256;
386                 struct sha512_state sha512;
387         } sha;
388         void *state;
389         u32 *result;
390         int i;
391
392         switch (digest_size) {
393         case SHA1_DIGEST_SIZE:
394                 state = &sha.sha1;
395                 result = sha.sha1.state;
396                 break;
397         case SHA256_DIGEST_SIZE:
398                 state = &sha.sha256;
399                 result = sha.sha256.state;
400                 break;
401         default:
402                 dev_err(sa_k3_dev, "%s: bad digest_size=%d\n", __func__,
403                         digest_size);
404                 return;
405         }
406
407         crypto_shash_export(hash, state);
408
409         for (i = 0; i < digest_size >> 2; i++)
410                 out[i] = cpu_to_be32(result[i]);
411 }
412
413 static void sa_prepare_iopads(struct algo_data *data, const u8 *key,
414                               u16 key_sz, __be32 *ipad, __be32 *opad)
415 {
416         SHASH_DESC_ON_STACK(shash, data->ctx->shash);
417         int block_size = crypto_shash_blocksize(data->ctx->shash);
418         int digest_size = crypto_shash_digestsize(data->ctx->shash);
419         u8 k_ipad[SHA1_BLOCK_SIZE];
420         u8 k_opad[SHA1_BLOCK_SIZE];
421
422         shash->tfm = data->ctx->shash;
423
424         prepare_kiopad(k_ipad, k_opad, key, key_sz);
425
426         memzero_explicit(ipad, block_size);
427         memzero_explicit(opad, block_size);
428
429         crypto_shash_init(shash);
430         crypto_shash_update(shash, k_ipad, block_size);
431         sa_export_shash(shash, block_size, digest_size, ipad);
432
433         crypto_shash_init(shash);
434         crypto_shash_update(shash, k_opad, block_size);
435
436         sa_export_shash(shash, block_size, digest_size, opad);
437 }
438
439 /* Derive the inverse key used in AES-CBC decryption operation */
440 static inline int sa_aes_inv_key(u8 *inv_key, const u8 *key, u16 key_sz)
441 {
442         struct crypto_aes_ctx ctx;
443         int key_pos;
444
445         if (aes_expandkey(&ctx, key, key_sz)) {
446                 dev_err(sa_k3_dev, "%s: bad key len(%d)\n", __func__, key_sz);
447                 return -EINVAL;
448         }
449
450         /* work around to get the right inverse for AES_KEYSIZE_192 size keys */
451         if (key_sz == AES_KEYSIZE_192) {
452                 ctx.key_enc[52] = ctx.key_enc[51] ^ ctx.key_enc[46];
453                 ctx.key_enc[53] = ctx.key_enc[52] ^ ctx.key_enc[47];
454         }
455
456         /* Based crypto_aes_expand_key logic */
457         switch (key_sz) {
458         case AES_KEYSIZE_128:
459         case AES_KEYSIZE_192:
460                 key_pos = key_sz + 24;
461                 break;
462
463         case AES_KEYSIZE_256:
464                 key_pos = key_sz + 24 - 4;
465                 break;
466
467         default:
468                 dev_err(sa_k3_dev, "%s: bad key len(%d)\n", __func__, key_sz);
469                 return -EINVAL;
470         }
471
472         memcpy(inv_key, &ctx.key_enc[key_pos], key_sz);
473         return 0;
474 }
475
476 /* Set Security context for the encryption engine */
477 static int sa_set_sc_enc(struct algo_data *ad, const u8 *key, u16 key_sz,
478                          u8 enc, u8 *sc_buf)
479 {
480         const u8 *mci = NULL;
481
482         /* Set Encryption mode selector to crypto processing */
483         sc_buf[0] = SA_CRYPTO_PROCESSING;
484
485         if (enc)
486                 mci = ad->mci_enc;
487         else
488                 mci = ad->mci_dec;
489         /* Set the mode control instructions in security context */
490         if (mci)
491                 memcpy(&sc_buf[1], mci, MODE_CONTROL_BYTES);
492
493         /* For AES-CBC decryption get the inverse key */
494         if (ad->inv_key && !enc) {
495                 if (sa_aes_inv_key(&sc_buf[SC_ENC_KEY_OFFSET], key, key_sz))
496                         return -EINVAL;
497         /* For all other cases: key is used */
498         } else {
499                 memcpy(&sc_buf[SC_ENC_KEY_OFFSET], key, key_sz);
500         }
501
502         return 0;
503 }
504
505 /* Set Security context for the authentication engine */
506 static void sa_set_sc_auth(struct algo_data *ad, const u8 *key, u16 key_sz,
507                            u8 *sc_buf)
508 {
509         __be32 ipad[64], opad[64];
510
511         /* Set Authentication mode selector to hash processing */
512         sc_buf[0] = SA_HASH_PROCESSING;
513         /* Auth SW ctrl word: bit[6]=1 (upload computed hash to TLR section) */
514         sc_buf[1] = SA_UPLOAD_HASH_TO_TLR;
515         sc_buf[1] |= ad->auth_ctrl;
516
517         /* Copy the keys or ipad/opad */
518         if (ad->keyed_mac) {
519                 ad->prep_iopad(ad, key, key_sz, ipad, opad);
520
521                 /* Copy ipad to AuthKey */
522                 memcpy(&sc_buf[32], ipad, ad->hash_size);
523                 /* Copy opad to Aux-1 */
524                 memcpy(&sc_buf[64], opad, ad->hash_size);
525         } else {
526                 /* basic hash */
527                 sc_buf[1] |= SA_BASIC_HASH;
528         }
529 }
530
531 static inline void sa_copy_iv(__be32 *out, const u8 *iv, bool size16)
532 {
533         int j;
534
535         for (j = 0; j < ((size16) ? 4 : 2); j++) {
536                 *out = cpu_to_be32(*((u32 *)iv));
537                 iv += 4;
538                 out++;
539         }
540 }
541
542 /* Format general command label */
543 static int sa_format_cmdl_gen(struct sa_cmdl_cfg *cfg, u8 *cmdl,
544                               struct sa_cmdl_upd_info *upd_info)
545 {
546         u8 enc_offset = 0, auth_offset = 0, total = 0;
547         u8 enc_next_eng = SA_ENG_ID_OUTPORT2;
548         u8 auth_next_eng = SA_ENG_ID_OUTPORT2;
549         u32 *word_ptr = (u32 *)cmdl;
550         int i;
551
552         /* Clear the command label */
553         memzero_explicit(cmdl, (SA_MAX_CMDL_WORDS * sizeof(u32)));
554
555         /* Iniialize the command update structure */
556         memzero_explicit(upd_info, sizeof(*upd_info));
557
558         if (cfg->enc_eng_id && cfg->auth_eng_id) {
559                 if (cfg->enc) {
560                         auth_offset = SA_CMDL_HEADER_SIZE_BYTES;
561                         enc_next_eng = cfg->auth_eng_id;
562
563                         if (cfg->iv_size)
564                                 auth_offset += cfg->iv_size;
565                 } else {
566                         enc_offset = SA_CMDL_HEADER_SIZE_BYTES;
567                         auth_next_eng = cfg->enc_eng_id;
568                 }
569         }
570
571         if (cfg->enc_eng_id) {
572                 upd_info->flags |= SA_CMDL_UPD_ENC;
573                 upd_info->enc_size.index = enc_offset >> 2;
574                 upd_info->enc_offset.index = upd_info->enc_size.index + 1;
575                 /* Encryption command label */
576                 cmdl[enc_offset + SA_CMDL_OFFSET_NESC] = enc_next_eng;
577
578                 /* Encryption modes requiring IV */
579                 if (cfg->iv_size) {
580                         upd_info->flags |= SA_CMDL_UPD_ENC_IV;
581                         upd_info->enc_iv.index =
582                                 (enc_offset + SA_CMDL_HEADER_SIZE_BYTES) >> 2;
583                         upd_info->enc_iv.size = cfg->iv_size;
584
585                         cmdl[enc_offset + SA_CMDL_OFFSET_LABEL_LEN] =
586                                 SA_CMDL_HEADER_SIZE_BYTES + cfg->iv_size;
587
588                         cmdl[enc_offset + SA_CMDL_OFFSET_OPTION_CTRL1] =
589                                 (SA_CTX_ENC_AUX2_OFFSET | (cfg->iv_size >> 3));
590                         total += SA_CMDL_HEADER_SIZE_BYTES + cfg->iv_size;
591                 } else {
592                         cmdl[enc_offset + SA_CMDL_OFFSET_LABEL_LEN] =
593                                                 SA_CMDL_HEADER_SIZE_BYTES;
594                         total += SA_CMDL_HEADER_SIZE_BYTES;
595                 }
596         }
597
598         if (cfg->auth_eng_id) {
599                 upd_info->flags |= SA_CMDL_UPD_AUTH;
600                 upd_info->auth_size.index = auth_offset >> 2;
601                 upd_info->auth_offset.index = upd_info->auth_size.index + 1;
602                 cmdl[auth_offset + SA_CMDL_OFFSET_NESC] = auth_next_eng;
603                 cmdl[auth_offset + SA_CMDL_OFFSET_LABEL_LEN] =
604                         SA_CMDL_HEADER_SIZE_BYTES;
605                 total += SA_CMDL_HEADER_SIZE_BYTES;
606         }
607
608         total = roundup(total, 8);
609
610         for (i = 0; i < total / 4; i++)
611                 word_ptr[i] = swab32(word_ptr[i]);
612
613         return total;
614 }
615
616 /* Update Command label */
617 static inline void sa_update_cmdl(struct sa_req *req, u32 *cmdl,
618                                   struct sa_cmdl_upd_info *upd_info)
619 {
620         int i = 0, j;
621
622         if (likely(upd_info->flags & SA_CMDL_UPD_ENC)) {
623                 cmdl[upd_info->enc_size.index] &= ~SA_CMDL_PAYLOAD_LENGTH_MASK;
624                 cmdl[upd_info->enc_size.index] |= req->enc_size;
625                 cmdl[upd_info->enc_offset.index] &=
626                                                 ~SA_CMDL_SOP_BYPASS_LEN_MASK;
627                 cmdl[upd_info->enc_offset.index] |=
628                         ((u32)req->enc_offset <<
629                          __ffs(SA_CMDL_SOP_BYPASS_LEN_MASK));
630
631                 if (likely(upd_info->flags & SA_CMDL_UPD_ENC_IV)) {
632                         __be32 *data = (__be32 *)&cmdl[upd_info->enc_iv.index];
633                         u32 *enc_iv = (u32 *)req->enc_iv;
634
635                         for (j = 0; i < upd_info->enc_iv.size; i += 4, j++) {
636                                 data[j] = cpu_to_be32(*enc_iv);
637                                 enc_iv++;
638                         }
639                 }
640         }
641
642         if (likely(upd_info->flags & SA_CMDL_UPD_AUTH)) {
643                 cmdl[upd_info->auth_size.index] &= ~SA_CMDL_PAYLOAD_LENGTH_MASK;
644                 cmdl[upd_info->auth_size.index] |= req->auth_size;
645                 cmdl[upd_info->auth_offset.index] &=
646                         ~SA_CMDL_SOP_BYPASS_LEN_MASK;
647                 cmdl[upd_info->auth_offset.index] |=
648                         ((u32)req->auth_offset <<
649                          __ffs(SA_CMDL_SOP_BYPASS_LEN_MASK));
650                 if (upd_info->flags & SA_CMDL_UPD_AUTH_IV) {
651                         sa_copy_iv((void *)&cmdl[upd_info->auth_iv.index],
652                                    req->auth_iv,
653                                    (upd_info->auth_iv.size > 8));
654                 }
655                 if (upd_info->flags & SA_CMDL_UPD_AUX_KEY) {
656                         int offset = (req->auth_size & 0xF) ? 4 : 0;
657
658                         memcpy(&cmdl[upd_info->aux_key_info.index],
659                                &upd_info->aux_key[offset], 16);
660                 }
661         }
662 }
663
664 /* Format SWINFO words to be sent to SA */
665 static
666 void sa_set_swinfo(u8 eng_id, u16 sc_id, dma_addr_t sc_phys,
667                    u8 cmdl_present, u8 cmdl_offset, u8 flags,
668                    u8 hash_size, u32 *swinfo)
669 {
670         swinfo[0] = sc_id;
671         swinfo[0] |= (flags << __ffs(SA_SW0_FLAGS_MASK));
672         if (likely(cmdl_present))
673                 swinfo[0] |= ((cmdl_offset | SA_SW0_CMDL_PRESENT) <<
674                                                 __ffs(SA_SW0_CMDL_INFO_MASK));
675         swinfo[0] |= (eng_id << __ffs(SA_SW0_ENG_ID_MASK));
676
677         swinfo[0] |= SA_SW0_DEST_INFO_PRESENT;
678         swinfo[1] = (u32)(sc_phys & 0xFFFFFFFFULL);
679         swinfo[2] = (u32)((sc_phys & 0xFFFFFFFF00000000ULL) >> 32);
680         swinfo[2] |= (hash_size << __ffs(SA_SW2_EGRESS_LENGTH));
681 }
682
683 /* Dump the security context */
684 static void sa_dump_sc(u8 *buf, dma_addr_t dma_addr)
685 {
686 #ifdef DEBUG
687         dev_info(sa_k3_dev, "Security context dump:: 0x%pad\n", &dma_addr);
688         print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
689                        16, 1, buf, SA_CTX_MAX_SZ, false);
690 #endif
691 }
692
693 static
694 int sa_init_sc(struct sa_ctx_info *ctx, const u8 *enc_key,
695                u16 enc_key_sz, const u8 *auth_key, u16 auth_key_sz,
696                struct algo_data *ad, u8 enc, u32 *swinfo)
697 {
698         int enc_sc_offset = 0;
699         int auth_sc_offset = 0;
700         u8 *sc_buf = ctx->sc;
701         u16 sc_id = ctx->sc_id;
702         u8 first_engine = 0;
703
704         memzero_explicit(sc_buf, SA_CTX_MAX_SZ);
705
706         if (ad->auth_eng.eng_id) {
707                 if (enc)
708                         first_engine = ad->enc_eng.eng_id;
709                 else
710                         first_engine = ad->auth_eng.eng_id;
711
712                 enc_sc_offset = SA_CTX_PHP_PE_CTX_SZ;
713                 auth_sc_offset = enc_sc_offset + ad->enc_eng.sc_size;
714                 sc_buf[1] = SA_SCCTL_FE_AUTH_ENC;
715                 if (!ad->hash_size)
716                         return -EINVAL;
717                 ad->hash_size = roundup(ad->hash_size, 8);
718
719         } else if (ad->enc_eng.eng_id && !ad->auth_eng.eng_id) {
720                 enc_sc_offset = SA_CTX_PHP_PE_CTX_SZ;
721                 first_engine = ad->enc_eng.eng_id;
722                 sc_buf[1] = SA_SCCTL_FE_ENC;
723                 ad->hash_size = ad->iv_out_size;
724         }
725
726         /* SCCTL Owner info: 0=host, 1=CP_ACE */
727         sc_buf[SA_CTX_SCCTL_OWNER_OFFSET] = 0;
728         memcpy(&sc_buf[2], &sc_id, 2);
729         sc_buf[4] = 0x0;
730         sc_buf[5] = PRIV_ID;
731         sc_buf[6] = PRIV;
732         sc_buf[7] = 0x0;
733
734         /* Prepare context for encryption engine */
735         if (ad->enc_eng.sc_size) {
736                 if (sa_set_sc_enc(ad, enc_key, enc_key_sz, enc,
737                                   &sc_buf[enc_sc_offset]))
738                         return -EINVAL;
739         }
740
741         /* Prepare context for authentication engine */
742         if (ad->auth_eng.sc_size)
743                 sa_set_sc_auth(ad, auth_key, auth_key_sz,
744                                &sc_buf[auth_sc_offset]);
745
746         /* Set the ownership of context to CP_ACE */
747         sc_buf[SA_CTX_SCCTL_OWNER_OFFSET] = 0x80;
748
749         /* swizzle the security context */
750         sa_swiz_128(sc_buf, SA_CTX_MAX_SZ);
751
752         sa_set_swinfo(first_engine, ctx->sc_id, ctx->sc_phys, 1, 0,
753                       SA_SW_INFO_FLAG_EVICT, ad->hash_size, swinfo);
754
755         sa_dump_sc(sc_buf, ctx->sc_phys);
756
757         return 0;
758 }
759
760 /* Free the per direction context memory */
761 static void sa_free_ctx_info(struct sa_ctx_info *ctx,
762                              struct sa_crypto_data *data)
763 {
764         unsigned long bn;
765
766         bn = ctx->sc_id - data->sc_id_start;
767         spin_lock(&data->scid_lock);
768         __clear_bit(bn, data->ctx_bm);
769         data->sc_id--;
770         spin_unlock(&data->scid_lock);
771
772         if (ctx->sc) {
773                 dma_pool_free(data->sc_pool, ctx->sc, ctx->sc_phys);
774                 ctx->sc = NULL;
775         }
776 }
777
778 static int sa_init_ctx_info(struct sa_ctx_info *ctx,
779                             struct sa_crypto_data *data)
780 {
781         unsigned long bn;
782         int err;
783
784         spin_lock(&data->scid_lock);
785         bn = find_first_zero_bit(data->ctx_bm, SA_MAX_NUM_CTX);
786         __set_bit(bn, data->ctx_bm);
787         data->sc_id++;
788         spin_unlock(&data->scid_lock);
789
790         ctx->sc_id = (u16)(data->sc_id_start + bn);
791
792         ctx->sc = dma_pool_alloc(data->sc_pool, GFP_KERNEL, &ctx->sc_phys);
793         if (!ctx->sc) {
794                 dev_err(&data->pdev->dev, "Failed to allocate SC memory\n");
795                 err = -ENOMEM;
796                 goto scid_rollback;
797         }
798
799         return 0;
800
801 scid_rollback:
802         spin_lock(&data->scid_lock);
803         __clear_bit(bn, data->ctx_bm);
804         data->sc_id--;
805         spin_unlock(&data->scid_lock);
806
807         return err;
808 }
809
810 static void sa_cipher_cra_exit(struct crypto_skcipher *tfm)
811 {
812         struct sa_tfm_ctx *ctx = crypto_skcipher_ctx(tfm);
813         struct sa_crypto_data *data = dev_get_drvdata(sa_k3_dev);
814
815         dev_dbg(sa_k3_dev, "%s(0x%p) sc-ids(0x%x(0x%pad), 0x%x(0x%pad))\n",
816                 __func__, tfm, ctx->enc.sc_id, &ctx->enc.sc_phys,
817                 ctx->dec.sc_id, &ctx->dec.sc_phys);
818
819         sa_free_ctx_info(&ctx->enc, data);
820         sa_free_ctx_info(&ctx->dec, data);
821
822         crypto_free_sync_skcipher(ctx->fallback.skcipher);
823 }
824
825 static int sa_cipher_cra_init(struct crypto_skcipher *tfm)
826 {
827         struct sa_tfm_ctx *ctx = crypto_skcipher_ctx(tfm);
828         struct sa_crypto_data *data = dev_get_drvdata(sa_k3_dev);
829         const char *name = crypto_tfm_alg_name(&tfm->base);
830         int ret;
831
832         memzero_explicit(ctx, sizeof(*ctx));
833         ctx->dev_data = data;
834
835         ret = sa_init_ctx_info(&ctx->enc, data);
836         if (ret)
837                 return ret;
838         ret = sa_init_ctx_info(&ctx->dec, data);
839         if (ret) {
840                 sa_free_ctx_info(&ctx->enc, data);
841                 return ret;
842         }
843
844         ctx->fallback.skcipher =
845                 crypto_alloc_sync_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK);
846
847         if (IS_ERR(ctx->fallback.skcipher)) {
848                 dev_err(sa_k3_dev, "Error allocating fallback algo %s\n", name);
849                 return PTR_ERR(ctx->fallback.skcipher);
850         }
851
852         dev_dbg(sa_k3_dev, "%s(0x%p) sc-ids(0x%x(0x%pad), 0x%x(0x%pad))\n",
853                 __func__, tfm, ctx->enc.sc_id, &ctx->enc.sc_phys,
854                 ctx->dec.sc_id, &ctx->dec.sc_phys);
855         return 0;
856 }
857
858 static int sa_cipher_setkey(struct crypto_skcipher *tfm, const u8 *key,
859                             unsigned int keylen, struct algo_data *ad)
860 {
861         struct sa_tfm_ctx *ctx = crypto_skcipher_ctx(tfm);
862         int cmdl_len;
863         struct sa_cmdl_cfg cfg;
864         int ret;
865
866         if (keylen != AES_KEYSIZE_128 && keylen != AES_KEYSIZE_192 &&
867             keylen != AES_KEYSIZE_256)
868                 return -EINVAL;
869
870         ad->enc_eng.eng_id = SA_ENG_ID_EM1;
871         ad->enc_eng.sc_size = SA_CTX_ENC_TYPE1_SZ;
872
873         memzero_explicit(&cfg, sizeof(cfg));
874         cfg.enc_eng_id = ad->enc_eng.eng_id;
875         cfg.iv_size = crypto_skcipher_ivsize(tfm);
876
877         crypto_sync_skcipher_clear_flags(ctx->fallback.skcipher,
878                                          CRYPTO_TFM_REQ_MASK);
879         crypto_sync_skcipher_set_flags(ctx->fallback.skcipher,
880                                        tfm->base.crt_flags &
881                                        CRYPTO_TFM_REQ_MASK);
882         ret = crypto_sync_skcipher_setkey(ctx->fallback.skcipher, key, keylen);
883         if (ret)
884                 return ret;
885
886         /* Setup Encryption Security Context & Command label template */
887         if (sa_init_sc(&ctx->enc, key, keylen, NULL, 0, ad, 1,
888                        &ctx->enc.epib[1]))
889                 goto badkey;
890
891         cmdl_len = sa_format_cmdl_gen(&cfg,
892                                       (u8 *)ctx->enc.cmdl,
893                                       &ctx->enc.cmdl_upd_info);
894         if (cmdl_len <= 0 || (cmdl_len > SA_MAX_CMDL_WORDS * sizeof(u32)))
895                 goto badkey;
896
897         ctx->enc.cmdl_size = cmdl_len;
898
899         /* Setup Decryption Security Context & Command label template */
900         if (sa_init_sc(&ctx->dec, key, keylen, NULL, 0, ad, 0,
901                        &ctx->dec.epib[1]))
902                 goto badkey;
903
904         cfg.enc_eng_id = ad->enc_eng.eng_id;
905         cmdl_len = sa_format_cmdl_gen(&cfg, (u8 *)ctx->dec.cmdl,
906                                       &ctx->dec.cmdl_upd_info);
907
908         if (cmdl_len <= 0 || (cmdl_len > SA_MAX_CMDL_WORDS * sizeof(u32)))
909                 goto badkey;
910
911         ctx->dec.cmdl_size = cmdl_len;
912         ctx->iv_idx = ad->iv_idx;
913
914         return 0;
915
916 badkey:
917         dev_err(sa_k3_dev, "%s: badkey\n", __func__);
918         return -EINVAL;
919 }
920
921 static int sa_aes_cbc_setkey(struct crypto_skcipher *tfm, const u8 *key,
922                              unsigned int keylen)
923 {
924         struct algo_data ad = { 0 };
925         /* Convert the key size (16/24/32) to the key size index (0/1/2) */
926         int key_idx = (keylen >> 3) - 2;
927
928         if (key_idx >= 3)
929                 return -EINVAL;
930
931         ad.mci_enc = mci_cbc_enc_array[key_idx];
932         ad.mci_dec = mci_cbc_dec_array[key_idx];
933         ad.inv_key = true;
934         ad.ealg_id = SA_EALG_ID_AES_CBC;
935         ad.iv_idx = 4;
936         ad.iv_out_size = 16;
937
938         return sa_cipher_setkey(tfm, key, keylen, &ad);
939 }
940
941 static int sa_aes_ecb_setkey(struct crypto_skcipher *tfm, const u8 *key,
942                              unsigned int keylen)
943 {
944         struct algo_data ad = { 0 };
945         /* Convert the key size (16/24/32) to the key size index (0/1/2) */
946         int key_idx = (keylen >> 3) - 2;
947
948         if (key_idx >= 3)
949                 return -EINVAL;
950
951         ad.mci_enc = mci_ecb_enc_array[key_idx];
952         ad.mci_dec = mci_ecb_dec_array[key_idx];
953         ad.inv_key = true;
954         ad.ealg_id = SA_EALG_ID_AES_ECB;
955
956         return sa_cipher_setkey(tfm, key, keylen, &ad);
957 }
958
959 static int sa_3des_cbc_setkey(struct crypto_skcipher *tfm, const u8 *key,
960                               unsigned int keylen)
961 {
962         struct algo_data ad = { 0 };
963
964         ad.mci_enc = mci_cbc_3des_enc_array;
965         ad.mci_dec = mci_cbc_3des_dec_array;
966         ad.ealg_id = SA_EALG_ID_3DES_CBC;
967         ad.iv_idx = 6;
968         ad.iv_out_size = 8;
969
970         return sa_cipher_setkey(tfm, key, keylen, &ad);
971 }
972
973 static int sa_3des_ecb_setkey(struct crypto_skcipher *tfm, const u8 *key,
974                               unsigned int keylen)
975 {
976         struct algo_data ad = { 0 };
977
978         ad.mci_enc = mci_ecb_3des_enc_array;
979         ad.mci_dec = mci_ecb_3des_dec_array;
980
981         return sa_cipher_setkey(tfm, key, keylen, &ad);
982 }
983
984 static void sa_sync_from_device(struct sa_rx_data *rxd)
985 {
986         struct sg_table *sgt;
987
988         if (rxd->mapped_sg[0].dir == DMA_BIDIRECTIONAL)
989                 sgt = &rxd->mapped_sg[0].sgt;
990         else
991                 sgt = &rxd->mapped_sg[1].sgt;
992
993         dma_sync_sgtable_for_cpu(rxd->ddev, sgt, DMA_FROM_DEVICE);
994 }
995
996 static void sa_free_sa_rx_data(struct sa_rx_data *rxd)
997 {
998         int i;
999
1000         for (i = 0; i < ARRAY_SIZE(rxd->mapped_sg); i++) {
1001                 struct sa_mapped_sg *mapped_sg = &rxd->mapped_sg[i];
1002
1003                 if (mapped_sg->mapped) {
1004                         dma_unmap_sgtable(rxd->ddev, &mapped_sg->sgt,
1005                                           mapped_sg->dir, 0);
1006                         kfree(mapped_sg->split_sg);
1007                 }
1008         }
1009
1010         kfree(rxd);
1011 }
1012
1013 static void sa_aes_dma_in_callback(void *data)
1014 {
1015         struct sa_rx_data *rxd = (struct sa_rx_data *)data;
1016         struct skcipher_request *req;
1017         u32 *result;
1018         __be32 *mdptr;
1019         size_t ml, pl;
1020         int i;
1021
1022         sa_sync_from_device(rxd);
1023         req = container_of(rxd->req, struct skcipher_request, base);
1024
1025         if (req->iv) {
1026                 mdptr = (__be32 *)dmaengine_desc_get_metadata_ptr(rxd->tx_in, &pl,
1027                                                                &ml);
1028                 result = (u32 *)req->iv;
1029
1030                 for (i = 0; i < (rxd->enc_iv_size / 4); i++)
1031                         result[i] = be32_to_cpu(mdptr[i + rxd->iv_idx]);
1032         }
1033
1034         sa_free_sa_rx_data(rxd);
1035
1036         skcipher_request_complete(req, 0);
1037 }
1038
1039 static void
1040 sa_prepare_tx_desc(u32 *mdptr, u32 pslen, u32 *psdata, u32 epiblen, u32 *epib)
1041 {
1042         u32 *out, *in;
1043         int i;
1044
1045         for (out = mdptr, in = epib, i = 0; i < epiblen / sizeof(u32); i++)
1046                 *out++ = *in++;
1047
1048         mdptr[4] = (0xFFFF << 16);
1049         for (out = &mdptr[5], in = psdata, i = 0;
1050              i < pslen / sizeof(u32); i++)
1051                 *out++ = *in++;
1052 }
1053
1054 static int sa_run(struct sa_req *req)
1055 {
1056         struct sa_rx_data *rxd;
1057         gfp_t gfp_flags;
1058         u32 cmdl[SA_MAX_CMDL_WORDS];
1059         struct sa_crypto_data *pdata = dev_get_drvdata(sa_k3_dev);
1060         struct device *ddev;
1061         struct dma_chan *dma_rx;
1062         int sg_nents, src_nents, dst_nents;
1063         struct scatterlist *src, *dst;
1064         size_t pl, ml, split_size;
1065         struct sa_ctx_info *sa_ctx = req->enc ? &req->ctx->enc : &req->ctx->dec;
1066         int ret;
1067         struct dma_async_tx_descriptor *tx_out;
1068         u32 *mdptr;
1069         bool diff_dst;
1070         enum dma_data_direction dir_src;
1071         struct sa_mapped_sg *mapped_sg;
1072
1073         gfp_flags = req->base->flags & CRYPTO_TFM_REQ_MAY_SLEEP ?
1074                 GFP_KERNEL : GFP_ATOMIC;
1075
1076         rxd = kzalloc(sizeof(*rxd), gfp_flags);
1077         if (!rxd)
1078                 return -ENOMEM;
1079
1080         if (req->src != req->dst) {
1081                 diff_dst = true;
1082                 dir_src = DMA_TO_DEVICE;
1083         } else {
1084                 diff_dst = false;
1085                 dir_src = DMA_BIDIRECTIONAL;
1086         }
1087
1088         /*
1089          * SA2UL has an interesting feature where the receive DMA channel
1090          * is selected based on the data passed to the engine. Within the
1091          * transition range, there is also a space where it is impossible
1092          * to determine where the data will end up, and this should be
1093          * avoided. This will be handled by the SW fallback mechanism by
1094          * the individual algorithm implementations.
1095          */
1096         if (req->size >= 256)
1097                 dma_rx = pdata->dma_rx2;
1098         else
1099                 dma_rx = pdata->dma_rx1;
1100
1101         ddev = dma_rx->device->dev;
1102         rxd->ddev = ddev;
1103
1104         memcpy(cmdl, sa_ctx->cmdl, sa_ctx->cmdl_size);
1105
1106         sa_update_cmdl(req, cmdl, &sa_ctx->cmdl_upd_info);
1107
1108         if (req->type != CRYPTO_ALG_TYPE_AHASH) {
1109                 if (req->enc)
1110                         req->type |=
1111                                 (SA_REQ_SUBTYPE_ENC << SA_REQ_SUBTYPE_SHIFT);
1112                 else
1113                         req->type |=
1114                                 (SA_REQ_SUBTYPE_DEC << SA_REQ_SUBTYPE_SHIFT);
1115         }
1116
1117         cmdl[sa_ctx->cmdl_size / sizeof(u32)] = req->type;
1118
1119         /*
1120          * Map the packets, first we check if the data fits into a single
1121          * sg entry and use that if possible. If it does not fit, we check
1122          * if we need to do sg_split to align the scatterlist data on the
1123          * actual data size being processed by the crypto engine.
1124          */
1125         src = req->src;
1126         sg_nents = sg_nents_for_len(src, req->size);
1127
1128         split_size = req->size;
1129
1130         mapped_sg = &rxd->mapped_sg[0];
1131         if (sg_nents == 1 && split_size <= req->src->length) {
1132                 src = &mapped_sg->static_sg;
1133                 src_nents = 1;
1134                 sg_init_table(src, 1);
1135                 sg_set_page(src, sg_page(req->src), split_size,
1136                             req->src->offset);
1137
1138                 mapped_sg->sgt.sgl = src;
1139                 mapped_sg->sgt.orig_nents = src_nents;
1140                 ret = dma_map_sgtable(ddev, &mapped_sg->sgt, dir_src, 0);
1141                 if (ret)
1142                         return ret;
1143
1144                 mapped_sg->dir = dir_src;
1145                 mapped_sg->mapped = true;
1146         } else {
1147                 mapped_sg->sgt.sgl = req->src;
1148                 mapped_sg->sgt.orig_nents = sg_nents;
1149                 ret = dma_map_sgtable(ddev, &mapped_sg->sgt, dir_src, 0);
1150                 if (ret)
1151                         return ret;
1152
1153                 mapped_sg->dir = dir_src;
1154                 mapped_sg->mapped = true;
1155
1156                 ret = sg_split(mapped_sg->sgt.sgl, mapped_sg->sgt.nents, 0, 1,
1157                                &split_size, &src, &src_nents, gfp_flags);
1158                 if (ret) {
1159                         src_nents = mapped_sg->sgt.nents;
1160                         src = mapped_sg->sgt.sgl;
1161                 } else {
1162                         mapped_sg->split_sg = src;
1163                 }
1164         }
1165
1166         dma_sync_sgtable_for_device(ddev, &mapped_sg->sgt, DMA_TO_DEVICE);
1167
1168         if (!diff_dst) {
1169                 dst_nents = src_nents;
1170                 dst = src;
1171         } else {
1172                 dst_nents = sg_nents_for_len(req->dst, req->size);
1173                 mapped_sg = &rxd->mapped_sg[1];
1174
1175                 if (dst_nents == 1 && split_size <= req->dst->length) {
1176                         dst = &mapped_sg->static_sg;
1177                         dst_nents = 1;
1178                         sg_init_table(dst, 1);
1179                         sg_set_page(dst, sg_page(req->dst), split_size,
1180                                     req->dst->offset);
1181
1182                         mapped_sg->sgt.sgl = dst;
1183                         mapped_sg->sgt.orig_nents = dst_nents;
1184                         ret = dma_map_sgtable(ddev, &mapped_sg->sgt,
1185                                               DMA_FROM_DEVICE, 0);
1186                         if (ret)
1187                                 goto err_cleanup;
1188
1189                         mapped_sg->dir = DMA_FROM_DEVICE;
1190                         mapped_sg->mapped = true;
1191                 } else {
1192                         mapped_sg->sgt.sgl = req->dst;
1193                         mapped_sg->sgt.orig_nents = dst_nents;
1194                         ret = dma_map_sgtable(ddev, &mapped_sg->sgt,
1195                                               DMA_FROM_DEVICE, 0);
1196                         if (ret)
1197                                 goto err_cleanup;
1198
1199                         mapped_sg->dir = DMA_FROM_DEVICE;
1200                         mapped_sg->mapped = true;
1201
1202                         ret = sg_split(mapped_sg->sgt.sgl, mapped_sg->sgt.nents,
1203                                        0, 1, &split_size, &dst, &dst_nents,
1204                                        gfp_flags);
1205                         if (ret) {
1206                                 dst_nents = mapped_sg->sgt.nents;
1207                                 dst = mapped_sg->sgt.sgl;
1208                         } else {
1209                                 mapped_sg->split_sg = dst;
1210                         }
1211                 }
1212         }
1213
1214         rxd->tx_in = dmaengine_prep_slave_sg(dma_rx, dst, dst_nents,
1215                                              DMA_DEV_TO_MEM,
1216                                              DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
1217         if (!rxd->tx_in) {
1218                 dev_err(pdata->dev, "IN prep_slave_sg() failed\n");
1219                 ret = -EINVAL;
1220                 goto err_cleanup;
1221         }
1222
1223         rxd->req = (void *)req->base;
1224         rxd->enc = req->enc;
1225         rxd->iv_idx = req->ctx->iv_idx;
1226         rxd->enc_iv_size = sa_ctx->cmdl_upd_info.enc_iv.size;
1227         rxd->tx_in->callback = req->callback;
1228         rxd->tx_in->callback_param = rxd;
1229
1230         tx_out = dmaengine_prep_slave_sg(pdata->dma_tx, src,
1231                                          src_nents, DMA_MEM_TO_DEV,
1232                                          DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
1233
1234         if (!tx_out) {
1235                 dev_err(pdata->dev, "OUT prep_slave_sg() failed\n");
1236                 ret = -EINVAL;
1237                 goto err_cleanup;
1238         }
1239
1240         /*
1241          * Prepare metadata for DMA engine. This essentially describes the
1242          * crypto algorithm to be used, data sizes, different keys etc.
1243          */
1244         mdptr = (u32 *)dmaengine_desc_get_metadata_ptr(tx_out, &pl, &ml);
1245
1246         sa_prepare_tx_desc(mdptr, (sa_ctx->cmdl_size + (SA_PSDATA_CTX_WORDS *
1247                                    sizeof(u32))), cmdl, sizeof(sa_ctx->epib),
1248                            sa_ctx->epib);
1249
1250         ml = sa_ctx->cmdl_size + (SA_PSDATA_CTX_WORDS * sizeof(u32));
1251         dmaengine_desc_set_metadata_len(tx_out, req->mdata_size);
1252
1253         dmaengine_submit(tx_out);
1254         dmaengine_submit(rxd->tx_in);
1255
1256         dma_async_issue_pending(dma_rx);
1257         dma_async_issue_pending(pdata->dma_tx);
1258
1259         return -EINPROGRESS;
1260
1261 err_cleanup:
1262         sa_free_sa_rx_data(rxd);
1263
1264         return ret;
1265 }
1266
1267 static int sa_cipher_run(struct skcipher_request *req, u8 *iv, int enc)
1268 {
1269         struct sa_tfm_ctx *ctx =
1270             crypto_skcipher_ctx(crypto_skcipher_reqtfm(req));
1271         struct crypto_alg *alg = req->base.tfm->__crt_alg;
1272         struct sa_req sa_req = { 0 };
1273         int ret;
1274
1275         if (!req->cryptlen)
1276                 return 0;
1277
1278         if (req->cryptlen % alg->cra_blocksize)
1279                 return -EINVAL;
1280
1281         /* Use SW fallback if the data size is not supported */
1282         if (req->cryptlen > SA_MAX_DATA_SZ ||
1283             (req->cryptlen >= SA_UNSAFE_DATA_SZ_MIN &&
1284              req->cryptlen <= SA_UNSAFE_DATA_SZ_MAX)) {
1285                 SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, ctx->fallback.skcipher);
1286
1287                 skcipher_request_set_sync_tfm(subreq, ctx->fallback.skcipher);
1288                 skcipher_request_set_callback(subreq, req->base.flags,
1289                                               NULL, NULL);
1290                 skcipher_request_set_crypt(subreq, req->src, req->dst,
1291                                            req->cryptlen, req->iv);
1292                 if (enc)
1293                         ret = crypto_skcipher_encrypt(subreq);
1294                 else
1295                         ret = crypto_skcipher_decrypt(subreq);
1296
1297                 skcipher_request_zero(subreq);
1298                 return ret;
1299         }
1300
1301         sa_req.size = req->cryptlen;
1302         sa_req.enc_size = req->cryptlen;
1303         sa_req.src = req->src;
1304         sa_req.dst = req->dst;
1305         sa_req.enc_iv = iv;
1306         sa_req.type = CRYPTO_ALG_TYPE_SKCIPHER;
1307         sa_req.enc = enc;
1308         sa_req.callback = sa_aes_dma_in_callback;
1309         sa_req.mdata_size = 44;
1310         sa_req.base = &req->base;
1311         sa_req.ctx = ctx;
1312
1313         return sa_run(&sa_req);
1314 }
1315
1316 static int sa_encrypt(struct skcipher_request *req)
1317 {
1318         return sa_cipher_run(req, req->iv, 1);
1319 }
1320
1321 static int sa_decrypt(struct skcipher_request *req)
1322 {
1323         return sa_cipher_run(req, req->iv, 0);
1324 }
1325
1326 static void sa_sha_dma_in_callback(void *data)
1327 {
1328         struct sa_rx_data *rxd = (struct sa_rx_data *)data;
1329         struct ahash_request *req;
1330         struct crypto_ahash *tfm;
1331         unsigned int authsize;
1332         int i;
1333         size_t ml, pl;
1334         u32 *result;
1335         __be32 *mdptr;
1336
1337         sa_sync_from_device(rxd);
1338         req = container_of(rxd->req, struct ahash_request, base);
1339         tfm = crypto_ahash_reqtfm(req);
1340         authsize = crypto_ahash_digestsize(tfm);
1341
1342         mdptr = (__be32 *)dmaengine_desc_get_metadata_ptr(rxd->tx_in, &pl, &ml);
1343         result = (u32 *)req->result;
1344
1345         for (i = 0; i < (authsize / 4); i++)
1346                 result[i] = be32_to_cpu(mdptr[i + 4]);
1347
1348         sa_free_sa_rx_data(rxd);
1349
1350         ahash_request_complete(req, 0);
1351 }
1352
1353 static int zero_message_process(struct ahash_request *req)
1354 {
1355         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1356         int sa_digest_size = crypto_ahash_digestsize(tfm);
1357
1358         switch (sa_digest_size) {
1359         case SHA1_DIGEST_SIZE:
1360                 memcpy(req->result, sha1_zero_message_hash, sa_digest_size);
1361                 break;
1362         case SHA256_DIGEST_SIZE:
1363                 memcpy(req->result, sha256_zero_message_hash, sa_digest_size);
1364                 break;
1365         case SHA512_DIGEST_SIZE:
1366                 memcpy(req->result, sha512_zero_message_hash, sa_digest_size);
1367                 break;
1368         default:
1369                 return -EINVAL;
1370         }
1371
1372         return 0;
1373 }
1374
1375 static int sa_sha_run(struct ahash_request *req)
1376 {
1377         struct sa_tfm_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
1378         struct sa_sha_req_ctx *rctx = ahash_request_ctx(req);
1379         struct sa_req sa_req = { 0 };
1380         size_t auth_len;
1381
1382         auth_len = req->nbytes;
1383
1384         if (!auth_len)
1385                 return zero_message_process(req);
1386
1387         if (auth_len > SA_MAX_DATA_SZ ||
1388             (auth_len >= SA_UNSAFE_DATA_SZ_MIN &&
1389              auth_len <= SA_UNSAFE_DATA_SZ_MAX)) {
1390                 struct ahash_request *subreq = &rctx->fallback_req;
1391                 int ret = 0;
1392
1393                 ahash_request_set_tfm(subreq, ctx->fallback.ahash);
1394                 subreq->base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
1395
1396                 crypto_ahash_init(subreq);
1397
1398                 subreq->nbytes = auth_len;
1399                 subreq->src = req->src;
1400                 subreq->result = req->result;
1401
1402                 ret |= crypto_ahash_update(subreq);
1403
1404                 subreq->nbytes = 0;
1405
1406                 ret |= crypto_ahash_final(subreq);
1407
1408                 return ret;
1409         }
1410
1411         sa_req.size = auth_len;
1412         sa_req.auth_size = auth_len;
1413         sa_req.src = req->src;
1414         sa_req.dst = req->src;
1415         sa_req.enc = true;
1416         sa_req.type = CRYPTO_ALG_TYPE_AHASH;
1417         sa_req.callback = sa_sha_dma_in_callback;
1418         sa_req.mdata_size = 28;
1419         sa_req.ctx = ctx;
1420         sa_req.base = &req->base;
1421
1422         return sa_run(&sa_req);
1423 }
1424
1425 static int sa_sha_setup(struct sa_tfm_ctx *ctx, struct  algo_data *ad)
1426 {
1427         int bs = crypto_shash_blocksize(ctx->shash);
1428         int cmdl_len;
1429         struct sa_cmdl_cfg cfg;
1430
1431         ad->enc_eng.sc_size = SA_CTX_ENC_TYPE1_SZ;
1432         ad->auth_eng.eng_id = SA_ENG_ID_AM1;
1433         ad->auth_eng.sc_size = SA_CTX_AUTH_TYPE2_SZ;
1434
1435         memset(ctx->authkey, 0, bs);
1436         memset(&cfg, 0, sizeof(cfg));
1437         cfg.aalg = ad->aalg_id;
1438         cfg.enc_eng_id = ad->enc_eng.eng_id;
1439         cfg.auth_eng_id = ad->auth_eng.eng_id;
1440         cfg.iv_size = 0;
1441         cfg.akey = NULL;
1442         cfg.akey_len = 0;
1443
1444         /* Setup Encryption Security Context & Command label template */
1445         if (sa_init_sc(&ctx->enc, NULL, 0, NULL, 0, ad, 0,
1446                        &ctx->enc.epib[1]))
1447                 goto badkey;
1448
1449         cmdl_len = sa_format_cmdl_gen(&cfg,
1450                                       (u8 *)ctx->enc.cmdl,
1451                                       &ctx->enc.cmdl_upd_info);
1452         if (cmdl_len <= 0 || (cmdl_len > SA_MAX_CMDL_WORDS * sizeof(u32)))
1453                 goto badkey;
1454
1455         ctx->enc.cmdl_size = cmdl_len;
1456
1457         return 0;
1458
1459 badkey:
1460         dev_err(sa_k3_dev, "%s: badkey\n", __func__);
1461         return -EINVAL;
1462 }
1463
1464 static int sa_sha_cra_init_alg(struct crypto_tfm *tfm, const char *alg_base)
1465 {
1466         struct sa_tfm_ctx *ctx = crypto_tfm_ctx(tfm);
1467         struct sa_crypto_data *data = dev_get_drvdata(sa_k3_dev);
1468         int ret;
1469
1470         memset(ctx, 0, sizeof(*ctx));
1471         ctx->dev_data = data;
1472         ret = sa_init_ctx_info(&ctx->enc, data);
1473         if (ret)
1474                 return ret;
1475
1476         if (alg_base) {
1477                 ctx->shash = crypto_alloc_shash(alg_base, 0,
1478                                                 CRYPTO_ALG_NEED_FALLBACK);
1479                 if (IS_ERR(ctx->shash)) {
1480                         dev_err(sa_k3_dev, "base driver %s couldn't be loaded\n",
1481                                 alg_base);
1482                         return PTR_ERR(ctx->shash);
1483                 }
1484                 /* for fallback */
1485                 ctx->fallback.ahash =
1486                         crypto_alloc_ahash(alg_base, 0,
1487                                            CRYPTO_ALG_NEED_FALLBACK);
1488                 if (IS_ERR(ctx->fallback.ahash)) {
1489                         dev_err(ctx->dev_data->dev,
1490                                 "Could not load fallback driver\n");
1491                         return PTR_ERR(ctx->fallback.ahash);
1492                 }
1493         }
1494
1495         dev_dbg(sa_k3_dev, "%s(0x%p) sc-ids(0x%x(0x%pad), 0x%x(0x%pad))\n",
1496                 __func__, tfm, ctx->enc.sc_id, &ctx->enc.sc_phys,
1497                 ctx->dec.sc_id, &ctx->dec.sc_phys);
1498
1499         crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
1500                                  sizeof(struct sa_sha_req_ctx) +
1501                                  crypto_ahash_reqsize(ctx->fallback.ahash));
1502
1503         return 0;
1504 }
1505
1506 static int sa_sha_digest(struct ahash_request *req)
1507 {
1508         return sa_sha_run(req);
1509 }
1510
1511 static int sa_sha_init(struct ahash_request *req)
1512 {
1513         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1514         struct sa_sha_req_ctx *rctx = ahash_request_ctx(req);
1515         struct sa_tfm_ctx *ctx = crypto_ahash_ctx(tfm);
1516
1517         dev_dbg(sa_k3_dev, "init: digest size: %u, rctx=%p\n",
1518                 crypto_ahash_digestsize(tfm), rctx);
1519
1520         ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback.ahash);
1521         rctx->fallback_req.base.flags =
1522                 req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
1523
1524         return crypto_ahash_init(&rctx->fallback_req);
1525 }
1526
1527 static int sa_sha_update(struct ahash_request *req)
1528 {
1529         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1530         struct sa_sha_req_ctx *rctx = ahash_request_ctx(req);
1531         struct sa_tfm_ctx *ctx = crypto_ahash_ctx(tfm);
1532
1533         ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback.ahash);
1534         rctx->fallback_req.base.flags =
1535                 req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
1536         rctx->fallback_req.nbytes = req->nbytes;
1537         rctx->fallback_req.src = req->src;
1538
1539         return crypto_ahash_update(&rctx->fallback_req);
1540 }
1541
1542 static int sa_sha_final(struct ahash_request *req)
1543 {
1544         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1545         struct sa_sha_req_ctx *rctx = ahash_request_ctx(req);
1546         struct sa_tfm_ctx *ctx = crypto_ahash_ctx(tfm);
1547
1548         ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback.ahash);
1549         rctx->fallback_req.base.flags =
1550                 req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
1551         rctx->fallback_req.result = req->result;
1552
1553         return crypto_ahash_final(&rctx->fallback_req);
1554 }
1555
1556 static int sa_sha_finup(struct ahash_request *req)
1557 {
1558         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1559         struct sa_sha_req_ctx *rctx = ahash_request_ctx(req);
1560         struct sa_tfm_ctx *ctx = crypto_ahash_ctx(tfm);
1561
1562         ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback.ahash);
1563         rctx->fallback_req.base.flags =
1564                 req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
1565
1566         rctx->fallback_req.nbytes = req->nbytes;
1567         rctx->fallback_req.src = req->src;
1568         rctx->fallback_req.result = req->result;
1569
1570         return crypto_ahash_finup(&rctx->fallback_req);
1571 }
1572
1573 static int sa_sha_import(struct ahash_request *req, const void *in)
1574 {
1575         struct sa_sha_req_ctx *rctx = ahash_request_ctx(req);
1576         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1577         struct sa_tfm_ctx *ctx = crypto_ahash_ctx(tfm);
1578
1579         ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback.ahash);
1580         rctx->fallback_req.base.flags = req->base.flags &
1581                 CRYPTO_TFM_REQ_MAY_SLEEP;
1582
1583         return crypto_ahash_import(&rctx->fallback_req, in);
1584 }
1585
1586 static int sa_sha_export(struct ahash_request *req, void *out)
1587 {
1588         struct sa_sha_req_ctx *rctx = ahash_request_ctx(req);
1589         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1590         struct sa_tfm_ctx *ctx = crypto_ahash_ctx(tfm);
1591         struct ahash_request *subreq = &rctx->fallback_req;
1592
1593         ahash_request_set_tfm(subreq, ctx->fallback.ahash);
1594         subreq->base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
1595
1596         return crypto_ahash_export(subreq, out);
1597 }
1598
1599 static int sa_sha1_cra_init(struct crypto_tfm *tfm)
1600 {
1601         struct algo_data ad = { 0 };
1602         struct sa_tfm_ctx *ctx = crypto_tfm_ctx(tfm);
1603
1604         sa_sha_cra_init_alg(tfm, "sha1");
1605
1606         ad.aalg_id = SA_AALG_ID_SHA1;
1607         ad.hash_size = SHA1_DIGEST_SIZE;
1608         ad.auth_ctrl = SA_AUTH_SW_CTRL_SHA1;
1609
1610         sa_sha_setup(ctx, &ad);
1611
1612         return 0;
1613 }
1614
1615 static int sa_sha256_cra_init(struct crypto_tfm *tfm)
1616 {
1617         struct algo_data ad = { 0 };
1618         struct sa_tfm_ctx *ctx = crypto_tfm_ctx(tfm);
1619
1620         sa_sha_cra_init_alg(tfm, "sha256");
1621
1622         ad.aalg_id = SA_AALG_ID_SHA2_256;
1623         ad.hash_size = SHA256_DIGEST_SIZE;
1624         ad.auth_ctrl = SA_AUTH_SW_CTRL_SHA256;
1625
1626         sa_sha_setup(ctx, &ad);
1627
1628         return 0;
1629 }
1630
1631 static int sa_sha512_cra_init(struct crypto_tfm *tfm)
1632 {
1633         struct algo_data ad = { 0 };
1634         struct sa_tfm_ctx *ctx = crypto_tfm_ctx(tfm);
1635
1636         sa_sha_cra_init_alg(tfm, "sha512");
1637
1638         ad.aalg_id = SA_AALG_ID_SHA2_512;
1639         ad.hash_size = SHA512_DIGEST_SIZE;
1640         ad.auth_ctrl = SA_AUTH_SW_CTRL_SHA512;
1641
1642         sa_sha_setup(ctx, &ad);
1643
1644         return 0;
1645 }
1646
1647 static void sa_sha_cra_exit(struct crypto_tfm *tfm)
1648 {
1649         struct sa_tfm_ctx *ctx = crypto_tfm_ctx(tfm);
1650         struct sa_crypto_data *data = dev_get_drvdata(sa_k3_dev);
1651
1652         dev_dbg(sa_k3_dev, "%s(0x%p) sc-ids(0x%x(0x%pad), 0x%x(0x%pad))\n",
1653                 __func__, tfm, ctx->enc.sc_id, &ctx->enc.sc_phys,
1654                 ctx->dec.sc_id, &ctx->dec.sc_phys);
1655
1656         if (crypto_tfm_alg_type(tfm) == CRYPTO_ALG_TYPE_AHASH)
1657                 sa_free_ctx_info(&ctx->enc, data);
1658
1659         crypto_free_shash(ctx->shash);
1660         crypto_free_ahash(ctx->fallback.ahash);
1661 }
1662
1663 static void sa_aead_dma_in_callback(void *data)
1664 {
1665         struct sa_rx_data *rxd = (struct sa_rx_data *)data;
1666         struct aead_request *req;
1667         struct crypto_aead *tfm;
1668         unsigned int start;
1669         unsigned int authsize;
1670         u8 auth_tag[SA_MAX_AUTH_TAG_SZ];
1671         size_t pl, ml;
1672         int i;
1673         int err = 0;
1674         u16 auth_len;
1675         u32 *mdptr;
1676
1677         sa_sync_from_device(rxd);
1678         req = container_of(rxd->req, struct aead_request, base);
1679         tfm = crypto_aead_reqtfm(req);
1680         start = req->assoclen + req->cryptlen;
1681         authsize = crypto_aead_authsize(tfm);
1682
1683         mdptr = (u32 *)dmaengine_desc_get_metadata_ptr(rxd->tx_in, &pl, &ml);
1684         for (i = 0; i < (authsize / 4); i++)
1685                 mdptr[i + 4] = swab32(mdptr[i + 4]);
1686
1687         auth_len = req->assoclen + req->cryptlen;
1688
1689         if (rxd->enc) {
1690                 scatterwalk_map_and_copy(&mdptr[4], req->dst, start, authsize,
1691                                          1);
1692         } else {
1693                 auth_len -= authsize;
1694                 start -= authsize;
1695                 scatterwalk_map_and_copy(auth_tag, req->src, start, authsize,
1696                                          0);
1697
1698                 err = memcmp(&mdptr[4], auth_tag, authsize) ? -EBADMSG : 0;
1699         }
1700
1701         sa_free_sa_rx_data(rxd);
1702
1703         aead_request_complete(req, err);
1704 }
1705
1706 static int sa_cra_init_aead(struct crypto_aead *tfm, const char *hash,
1707                             const char *fallback)
1708 {
1709         struct sa_tfm_ctx *ctx = crypto_aead_ctx(tfm);
1710         struct sa_crypto_data *data = dev_get_drvdata(sa_k3_dev);
1711         int ret;
1712
1713         memzero_explicit(ctx, sizeof(*ctx));
1714
1715         ctx->shash = crypto_alloc_shash(hash, 0, CRYPTO_ALG_NEED_FALLBACK);
1716         if (IS_ERR(ctx->shash)) {
1717                 dev_err(sa_k3_dev, "base driver %s couldn't be loaded\n", hash);
1718                 return PTR_ERR(ctx->shash);
1719         }
1720
1721         ctx->fallback.aead = crypto_alloc_aead(fallback, 0,
1722                                                CRYPTO_ALG_NEED_FALLBACK);
1723
1724         if (IS_ERR(ctx->fallback.aead)) {
1725                 dev_err(sa_k3_dev, "fallback driver %s couldn't be loaded\n",
1726                         fallback);
1727                 return PTR_ERR(ctx->fallback.aead);
1728         }
1729
1730         crypto_aead_set_reqsize(tfm, sizeof(struct aead_request) +
1731                                 crypto_aead_reqsize(ctx->fallback.aead));
1732
1733         ret = sa_init_ctx_info(&ctx->enc, data);
1734         if (ret)
1735                 return ret;
1736
1737         ret = sa_init_ctx_info(&ctx->dec, data);
1738         if (ret) {
1739                 sa_free_ctx_info(&ctx->enc, data);
1740                 return ret;
1741         }
1742
1743         dev_dbg(sa_k3_dev, "%s(0x%p) sc-ids(0x%x(0x%pad), 0x%x(0x%pad))\n",
1744                 __func__, tfm, ctx->enc.sc_id, &ctx->enc.sc_phys,
1745                 ctx->dec.sc_id, &ctx->dec.sc_phys);
1746
1747         return ret;
1748 }
1749
1750 static int sa_cra_init_aead_sha1(struct crypto_aead *tfm)
1751 {
1752         return sa_cra_init_aead(tfm, "sha1",
1753                                 "authenc(hmac(sha1-ce),cbc(aes-ce))");
1754 }
1755
1756 static int sa_cra_init_aead_sha256(struct crypto_aead *tfm)
1757 {
1758         return sa_cra_init_aead(tfm, "sha256",
1759                                 "authenc(hmac(sha256-ce),cbc(aes-ce))");
1760 }
1761
1762 static void sa_exit_tfm_aead(struct crypto_aead *tfm)
1763 {
1764         struct sa_tfm_ctx *ctx = crypto_aead_ctx(tfm);
1765         struct sa_crypto_data *data = dev_get_drvdata(sa_k3_dev);
1766
1767         crypto_free_shash(ctx->shash);
1768         crypto_free_aead(ctx->fallback.aead);
1769
1770         sa_free_ctx_info(&ctx->enc, data);
1771         sa_free_ctx_info(&ctx->dec, data);
1772 }
1773
1774 /* AEAD algorithm configuration interface function */
1775 static int sa_aead_setkey(struct crypto_aead *authenc,
1776                           const u8 *key, unsigned int keylen,
1777                           struct algo_data *ad)
1778 {
1779         struct sa_tfm_ctx *ctx = crypto_aead_ctx(authenc);
1780         struct crypto_authenc_keys keys;
1781         int cmdl_len;
1782         struct sa_cmdl_cfg cfg;
1783         int key_idx;
1784
1785         if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
1786                 return -EINVAL;
1787
1788         /* Convert the key size (16/24/32) to the key size index (0/1/2) */
1789         key_idx = (keys.enckeylen >> 3) - 2;
1790         if (key_idx >= 3)
1791                 return -EINVAL;
1792
1793         ad->ctx = ctx;
1794         ad->enc_eng.eng_id = SA_ENG_ID_EM1;
1795         ad->enc_eng.sc_size = SA_CTX_ENC_TYPE1_SZ;
1796         ad->auth_eng.eng_id = SA_ENG_ID_AM1;
1797         ad->auth_eng.sc_size = SA_CTX_AUTH_TYPE2_SZ;
1798         ad->mci_enc = mci_cbc_enc_no_iv_array[key_idx];
1799         ad->mci_dec = mci_cbc_dec_no_iv_array[key_idx];
1800         ad->inv_key = true;
1801         ad->keyed_mac = true;
1802         ad->ealg_id = SA_EALG_ID_AES_CBC;
1803         ad->prep_iopad = sa_prepare_iopads;
1804
1805         memset(&cfg, 0, sizeof(cfg));
1806         cfg.enc = true;
1807         cfg.aalg = ad->aalg_id;
1808         cfg.enc_eng_id = ad->enc_eng.eng_id;
1809         cfg.auth_eng_id = ad->auth_eng.eng_id;
1810         cfg.iv_size = crypto_aead_ivsize(authenc);
1811         cfg.akey = keys.authkey;
1812         cfg.akey_len = keys.authkeylen;
1813
1814         /* Setup Encryption Security Context & Command label template */
1815         if (sa_init_sc(&ctx->enc, keys.enckey, keys.enckeylen,
1816                        keys.authkey, keys.authkeylen,
1817                        ad, 1, &ctx->enc.epib[1]))
1818                 return -EINVAL;
1819
1820         cmdl_len = sa_format_cmdl_gen(&cfg,
1821                                       (u8 *)ctx->enc.cmdl,
1822                                       &ctx->enc.cmdl_upd_info);
1823         if (cmdl_len <= 0 || (cmdl_len > SA_MAX_CMDL_WORDS * sizeof(u32)))
1824                 return -EINVAL;
1825
1826         ctx->enc.cmdl_size = cmdl_len;
1827
1828         /* Setup Decryption Security Context & Command label template */
1829         if (sa_init_sc(&ctx->dec, keys.enckey, keys.enckeylen,
1830                        keys.authkey, keys.authkeylen,
1831                        ad, 0, &ctx->dec.epib[1]))
1832                 return -EINVAL;
1833
1834         cfg.enc = false;
1835         cmdl_len = sa_format_cmdl_gen(&cfg, (u8 *)ctx->dec.cmdl,
1836                                       &ctx->dec.cmdl_upd_info);
1837
1838         if (cmdl_len <= 0 || (cmdl_len > SA_MAX_CMDL_WORDS * sizeof(u32)))
1839                 return -EINVAL;
1840
1841         ctx->dec.cmdl_size = cmdl_len;
1842
1843         crypto_aead_clear_flags(ctx->fallback.aead, CRYPTO_TFM_REQ_MASK);
1844         crypto_aead_set_flags(ctx->fallback.aead,
1845                               crypto_aead_get_flags(authenc) &
1846                               CRYPTO_TFM_REQ_MASK);
1847         crypto_aead_setkey(ctx->fallback.aead, key, keylen);
1848
1849         return 0;
1850 }
1851
1852 static int sa_aead_setauthsize(struct crypto_aead *tfm, unsigned int authsize)
1853 {
1854         struct sa_tfm_ctx *ctx = crypto_tfm_ctx(crypto_aead_tfm(tfm));
1855
1856         return crypto_aead_setauthsize(ctx->fallback.aead, authsize);
1857 }
1858
1859 static int sa_aead_cbc_sha1_setkey(struct crypto_aead *authenc,
1860                                    const u8 *key, unsigned int keylen)
1861 {
1862         struct algo_data ad = { 0 };
1863
1864         ad.ealg_id = SA_EALG_ID_AES_CBC;
1865         ad.aalg_id = SA_AALG_ID_HMAC_SHA1;
1866         ad.hash_size = SHA1_DIGEST_SIZE;
1867         ad.auth_ctrl = SA_AUTH_SW_CTRL_SHA1;
1868
1869         return sa_aead_setkey(authenc, key, keylen, &ad);
1870 }
1871
1872 static int sa_aead_cbc_sha256_setkey(struct crypto_aead *authenc,
1873                                      const u8 *key, unsigned int keylen)
1874 {
1875         struct algo_data ad = { 0 };
1876
1877         ad.ealg_id = SA_EALG_ID_AES_CBC;
1878         ad.aalg_id = SA_AALG_ID_HMAC_SHA2_256;
1879         ad.hash_size = SHA256_DIGEST_SIZE;
1880         ad.auth_ctrl = SA_AUTH_SW_CTRL_SHA256;
1881
1882         return sa_aead_setkey(authenc, key, keylen, &ad);
1883 }
1884
1885 static int sa_aead_run(struct aead_request *req, u8 *iv, int enc)
1886 {
1887         struct crypto_aead *tfm = crypto_aead_reqtfm(req);
1888         struct sa_tfm_ctx *ctx = crypto_aead_ctx(tfm);
1889         struct sa_req sa_req = { 0 };
1890         size_t auth_size, enc_size;
1891
1892         enc_size = req->cryptlen;
1893         auth_size = req->assoclen + req->cryptlen;
1894
1895         if (!enc) {
1896                 enc_size -= crypto_aead_authsize(tfm);
1897                 auth_size -= crypto_aead_authsize(tfm);
1898         }
1899
1900         if (auth_size > SA_MAX_DATA_SZ ||
1901             (auth_size >= SA_UNSAFE_DATA_SZ_MIN &&
1902              auth_size <= SA_UNSAFE_DATA_SZ_MAX)) {
1903                 struct aead_request *subreq = aead_request_ctx(req);
1904                 int ret;
1905
1906                 aead_request_set_tfm(subreq, ctx->fallback.aead);
1907                 aead_request_set_callback(subreq, req->base.flags,
1908                                           req->base.complete, req->base.data);
1909                 aead_request_set_crypt(subreq, req->src, req->dst,
1910                                        req->cryptlen, req->iv);
1911                 aead_request_set_ad(subreq, req->assoclen);
1912
1913                 ret = enc ? crypto_aead_encrypt(subreq) :
1914                         crypto_aead_decrypt(subreq);
1915                 return ret;
1916         }
1917
1918         sa_req.enc_offset = req->assoclen;
1919         sa_req.enc_size = enc_size;
1920         sa_req.auth_size = auth_size;
1921         sa_req.size = auth_size;
1922         sa_req.enc_iv = iv;
1923         sa_req.type = CRYPTO_ALG_TYPE_AEAD;
1924         sa_req.enc = enc;
1925         sa_req.callback = sa_aead_dma_in_callback;
1926         sa_req.mdata_size = 52;
1927         sa_req.base = &req->base;
1928         sa_req.ctx = ctx;
1929         sa_req.src = req->src;
1930         sa_req.dst = req->dst;
1931
1932         return sa_run(&sa_req);
1933 }
1934
1935 /* AEAD algorithm encrypt interface function */
1936 static int sa_aead_encrypt(struct aead_request *req)
1937 {
1938         return sa_aead_run(req, req->iv, 1);
1939 }
1940
1941 /* AEAD algorithm decrypt interface function */
1942 static int sa_aead_decrypt(struct aead_request *req)
1943 {
1944         return sa_aead_run(req, req->iv, 0);
1945 }
1946
1947 static struct sa_alg_tmpl sa_algs[] = {
1948         {
1949                 .type = CRYPTO_ALG_TYPE_SKCIPHER,
1950                 .alg.skcipher = {
1951                         .base.cra_name          = "cbc(aes)",
1952                         .base.cra_driver_name   = "cbc-aes-sa2ul",
1953                         .base.cra_priority      = 30000,
1954                         .base.cra_flags         = CRYPTO_ALG_TYPE_SKCIPHER |
1955                                                   CRYPTO_ALG_KERN_DRIVER_ONLY |
1956                                                   CRYPTO_ALG_ASYNC |
1957                                                   CRYPTO_ALG_NEED_FALLBACK,
1958                         .base.cra_blocksize     = AES_BLOCK_SIZE,
1959                         .base.cra_ctxsize       = sizeof(struct sa_tfm_ctx),
1960                         .base.cra_module        = THIS_MODULE,
1961                         .init                   = sa_cipher_cra_init,
1962                         .exit                   = sa_cipher_cra_exit,
1963                         .min_keysize            = AES_MIN_KEY_SIZE,
1964                         .max_keysize            = AES_MAX_KEY_SIZE,
1965                         .ivsize                 = AES_BLOCK_SIZE,
1966                         .setkey                 = sa_aes_cbc_setkey,
1967                         .encrypt                = sa_encrypt,
1968                         .decrypt                = sa_decrypt,
1969                 }
1970         },
1971         {
1972                 .type = CRYPTO_ALG_TYPE_SKCIPHER,
1973                 .alg.skcipher = {
1974                         .base.cra_name          = "ecb(aes)",
1975                         .base.cra_driver_name   = "ecb-aes-sa2ul",
1976                         .base.cra_priority      = 30000,
1977                         .base.cra_flags         = CRYPTO_ALG_TYPE_SKCIPHER |
1978                                                   CRYPTO_ALG_KERN_DRIVER_ONLY |
1979                                                   CRYPTO_ALG_ASYNC |
1980                                                   CRYPTO_ALG_NEED_FALLBACK,
1981                         .base.cra_blocksize     = AES_BLOCK_SIZE,
1982                         .base.cra_ctxsize       = sizeof(struct sa_tfm_ctx),
1983                         .base.cra_module        = THIS_MODULE,
1984                         .init                   = sa_cipher_cra_init,
1985                         .exit                   = sa_cipher_cra_exit,
1986                         .min_keysize            = AES_MIN_KEY_SIZE,
1987                         .max_keysize            = AES_MAX_KEY_SIZE,
1988                         .setkey                 = sa_aes_ecb_setkey,
1989                         .encrypt                = sa_encrypt,
1990                         .decrypt                = sa_decrypt,
1991                 }
1992         },
1993         {
1994                 .type = CRYPTO_ALG_TYPE_SKCIPHER,
1995                 .alg.skcipher = {
1996                         .base.cra_name          = "cbc(des3_ede)",
1997                         .base.cra_driver_name   = "cbc-des3-sa2ul",
1998                         .base.cra_priority      = 30000,
1999                         .base.cra_flags         = CRYPTO_ALG_TYPE_SKCIPHER |
2000                                                   CRYPTO_ALG_KERN_DRIVER_ONLY |
2001                                                   CRYPTO_ALG_ASYNC |
2002                                                   CRYPTO_ALG_NEED_FALLBACK,
2003                         .base.cra_blocksize     = DES_BLOCK_SIZE,
2004                         .base.cra_ctxsize       = sizeof(struct sa_tfm_ctx),
2005                         .base.cra_module        = THIS_MODULE,
2006                         .init                   = sa_cipher_cra_init,
2007                         .exit                   = sa_cipher_cra_exit,
2008                         .min_keysize            = 3 * DES_KEY_SIZE,
2009                         .max_keysize            = 3 * DES_KEY_SIZE,
2010                         .ivsize                 = DES_BLOCK_SIZE,
2011                         .setkey                 = sa_3des_cbc_setkey,
2012                         .encrypt                = sa_encrypt,
2013                         .decrypt                = sa_decrypt,
2014                 }
2015         },
2016         {
2017                 .type = CRYPTO_ALG_TYPE_SKCIPHER,
2018                 .alg.skcipher = {
2019                         .base.cra_name          = "ecb(des3_ede)",
2020                         .base.cra_driver_name   = "ecb-des3-sa2ul",
2021                         .base.cra_priority      = 30000,
2022                         .base.cra_flags         = CRYPTO_ALG_TYPE_SKCIPHER |
2023                                                   CRYPTO_ALG_KERN_DRIVER_ONLY |
2024                                                   CRYPTO_ALG_ASYNC |
2025                                                   CRYPTO_ALG_NEED_FALLBACK,
2026                         .base.cra_blocksize     = DES_BLOCK_SIZE,
2027                         .base.cra_ctxsize       = sizeof(struct sa_tfm_ctx),
2028                         .base.cra_module        = THIS_MODULE,
2029                         .init                   = sa_cipher_cra_init,
2030                         .exit                   = sa_cipher_cra_exit,
2031                         .min_keysize            = 3 * DES_KEY_SIZE,
2032                         .max_keysize            = 3 * DES_KEY_SIZE,
2033                         .setkey                 = sa_3des_ecb_setkey,
2034                         .encrypt                = sa_encrypt,
2035                         .decrypt                = sa_decrypt,
2036                 }
2037         },
2038         {
2039                 .type = CRYPTO_ALG_TYPE_AHASH,
2040                 .alg.ahash = {
2041                         .halg.base = {
2042                                 .cra_name       = "sha1",
2043                                 .cra_driver_name        = "sha1-sa2ul",
2044                                 .cra_priority   = 400,
2045                                 .cra_flags      = CRYPTO_ALG_TYPE_AHASH |
2046                                                   CRYPTO_ALG_ASYNC |
2047                                                   CRYPTO_ALG_KERN_DRIVER_ONLY |
2048                                                   CRYPTO_ALG_NEED_FALLBACK,
2049                                 .cra_blocksize  = SHA1_BLOCK_SIZE,
2050                                 .cra_ctxsize    = sizeof(struct sa_tfm_ctx),
2051                                 .cra_module     = THIS_MODULE,
2052                                 .cra_init       = sa_sha1_cra_init,
2053                                 .cra_exit       = sa_sha_cra_exit,
2054                         },
2055                         .halg.digestsize        = SHA1_DIGEST_SIZE,
2056                         .halg.statesize         = sizeof(struct sa_sha_req_ctx) +
2057                                                   sizeof(struct sha1_state),
2058                         .init                   = sa_sha_init,
2059                         .update                 = sa_sha_update,
2060                         .final                  = sa_sha_final,
2061                         .finup                  = sa_sha_finup,
2062                         .digest                 = sa_sha_digest,
2063                         .export                 = sa_sha_export,
2064                         .import                 = sa_sha_import,
2065                 },
2066         },
2067         {
2068                 .type = CRYPTO_ALG_TYPE_AHASH,
2069                 .alg.ahash = {
2070                         .halg.base = {
2071                                 .cra_name       = "sha256",
2072                                 .cra_driver_name        = "sha256-sa2ul",
2073                                 .cra_priority   = 400,
2074                                 .cra_flags      = CRYPTO_ALG_TYPE_AHASH |
2075                                                   CRYPTO_ALG_ASYNC |
2076                                                   CRYPTO_ALG_KERN_DRIVER_ONLY |
2077                                                   CRYPTO_ALG_NEED_FALLBACK,
2078                                 .cra_blocksize  = SHA256_BLOCK_SIZE,
2079                                 .cra_ctxsize    = sizeof(struct sa_tfm_ctx),
2080                                 .cra_module     = THIS_MODULE,
2081                                 .cra_init       = sa_sha256_cra_init,
2082                                 .cra_exit       = sa_sha_cra_exit,
2083                         },
2084                         .halg.digestsize        = SHA256_DIGEST_SIZE,
2085                         .halg.statesize         = sizeof(struct sa_sha_req_ctx) +
2086                                                   sizeof(struct sha256_state),
2087                         .init                   = sa_sha_init,
2088                         .update                 = sa_sha_update,
2089                         .final                  = sa_sha_final,
2090                         .finup                  = sa_sha_finup,
2091                         .digest                 = sa_sha_digest,
2092                         .export                 = sa_sha_export,
2093                         .import                 = sa_sha_import,
2094                 },
2095         },
2096         {
2097                 .type = CRYPTO_ALG_TYPE_AHASH,
2098                 .alg.ahash = {
2099                         .halg.base = {
2100                                 .cra_name       = "sha512",
2101                                 .cra_driver_name        = "sha512-sa2ul",
2102                                 .cra_priority   = 400,
2103                                 .cra_flags      = CRYPTO_ALG_TYPE_AHASH |
2104                                                   CRYPTO_ALG_ASYNC |
2105                                                   CRYPTO_ALG_KERN_DRIVER_ONLY |
2106                                                   CRYPTO_ALG_NEED_FALLBACK,
2107                                 .cra_blocksize  = SHA512_BLOCK_SIZE,
2108                                 .cra_ctxsize    = sizeof(struct sa_tfm_ctx),
2109                                 .cra_module     = THIS_MODULE,
2110                                 .cra_init       = sa_sha512_cra_init,
2111                                 .cra_exit       = sa_sha_cra_exit,
2112                         },
2113                         .halg.digestsize        = SHA512_DIGEST_SIZE,
2114                         .halg.statesize         = sizeof(struct sa_sha_req_ctx) +
2115                                                   sizeof(struct sha512_state),
2116                         .init                   = sa_sha_init,
2117                         .update                 = sa_sha_update,
2118                         .final                  = sa_sha_final,
2119                         .finup                  = sa_sha_finup,
2120                         .digest                 = sa_sha_digest,
2121                         .export                 = sa_sha_export,
2122                         .import                 = sa_sha_import,
2123                 },
2124         },
2125         {
2126                 .type   = CRYPTO_ALG_TYPE_AEAD,
2127                 .alg.aead = {
2128                         .base = {
2129                                 .cra_name = "authenc(hmac(sha1),cbc(aes))",
2130                                 .cra_driver_name =
2131                                         "authenc(hmac(sha1),cbc(aes))-sa2ul",
2132                                 .cra_blocksize = AES_BLOCK_SIZE,
2133                                 .cra_flags = CRYPTO_ALG_TYPE_AEAD |
2134                                         CRYPTO_ALG_KERN_DRIVER_ONLY |
2135                                         CRYPTO_ALG_ASYNC |
2136                                         CRYPTO_ALG_NEED_FALLBACK,
2137                                 .cra_ctxsize = sizeof(struct sa_tfm_ctx),
2138                                 .cra_module = THIS_MODULE,
2139                                 .cra_priority = 3000,
2140                         },
2141                         .ivsize = AES_BLOCK_SIZE,
2142                         .maxauthsize = SHA1_DIGEST_SIZE,
2143
2144                         .init = sa_cra_init_aead_sha1,
2145                         .exit = sa_exit_tfm_aead,
2146                         .setkey = sa_aead_cbc_sha1_setkey,
2147                         .setauthsize = sa_aead_setauthsize,
2148                         .encrypt = sa_aead_encrypt,
2149                         .decrypt = sa_aead_decrypt,
2150                 },
2151         },
2152         {
2153                 .type   = CRYPTO_ALG_TYPE_AEAD,
2154                 .alg.aead = {
2155                         .base = {
2156                                 .cra_name = "authenc(hmac(sha256),cbc(aes))",
2157                                 .cra_driver_name =
2158                                         "authenc(hmac(sha256),cbc(aes))-sa2ul",
2159                                 .cra_blocksize = AES_BLOCK_SIZE,
2160                                 .cra_flags = CRYPTO_ALG_TYPE_AEAD |
2161                                         CRYPTO_ALG_KERN_DRIVER_ONLY |
2162                                         CRYPTO_ALG_ASYNC |
2163                                         CRYPTO_ALG_NEED_FALLBACK,
2164                                 .cra_ctxsize = sizeof(struct sa_tfm_ctx),
2165                                 .cra_module = THIS_MODULE,
2166                                 .cra_alignmask = 0,
2167                                 .cra_priority = 3000,
2168                         },
2169                         .ivsize = AES_BLOCK_SIZE,
2170                         .maxauthsize = SHA256_DIGEST_SIZE,
2171
2172                         .init = sa_cra_init_aead_sha256,
2173                         .exit = sa_exit_tfm_aead,
2174                         .setkey = sa_aead_cbc_sha256_setkey,
2175                         .setauthsize = sa_aead_setauthsize,
2176                         .encrypt = sa_aead_encrypt,
2177                         .decrypt = sa_aead_decrypt,
2178                 },
2179         },
2180 };
2181
2182 /* Register the algorithms in crypto framework */
2183 static void sa_register_algos(const struct device *dev)
2184 {
2185         char *alg_name;
2186         u32 type;
2187         int i, err;
2188
2189         for (i = 0; i < ARRAY_SIZE(sa_algs); i++) {
2190                 type = sa_algs[i].type;
2191                 if (type == CRYPTO_ALG_TYPE_SKCIPHER) {
2192                         alg_name = sa_algs[i].alg.skcipher.base.cra_name;
2193                         err = crypto_register_skcipher(&sa_algs[i].alg.skcipher);
2194                 } else if (type == CRYPTO_ALG_TYPE_AHASH) {
2195                         alg_name = sa_algs[i].alg.ahash.halg.base.cra_name;
2196                         err = crypto_register_ahash(&sa_algs[i].alg.ahash);
2197                 } else if (type == CRYPTO_ALG_TYPE_AEAD) {
2198                         alg_name = sa_algs[i].alg.aead.base.cra_name;
2199                         err = crypto_register_aead(&sa_algs[i].alg.aead);
2200                 } else {
2201                         dev_err(dev,
2202                                 "un-supported crypto algorithm (%d)",
2203                                 sa_algs[i].type);
2204                         continue;
2205                 }
2206
2207                 if (err)
2208                         dev_err(dev, "Failed to register '%s'\n", alg_name);
2209                 else
2210                         sa_algs[i].registered = true;
2211         }
2212 }
2213
2214 /* Unregister the algorithms in crypto framework */
2215 static void sa_unregister_algos(const struct device *dev)
2216 {
2217         u32 type;
2218         int i;
2219
2220         for (i = 0; i < ARRAY_SIZE(sa_algs); i++) {
2221                 type = sa_algs[i].type;
2222                 if (!sa_algs[i].registered)
2223                         continue;
2224                 if (type == CRYPTO_ALG_TYPE_SKCIPHER)
2225                         crypto_unregister_skcipher(&sa_algs[i].alg.skcipher);
2226                 else if (type == CRYPTO_ALG_TYPE_AHASH)
2227                         crypto_unregister_ahash(&sa_algs[i].alg.ahash);
2228                 else if (type == CRYPTO_ALG_TYPE_AEAD)
2229                         crypto_unregister_aead(&sa_algs[i].alg.aead);
2230
2231                 sa_algs[i].registered = false;
2232         }
2233 }
2234
2235 static int sa_init_mem(struct sa_crypto_data *dev_data)
2236 {
2237         struct device *dev = &dev_data->pdev->dev;
2238         /* Setup dma pool for security context buffers */
2239         dev_data->sc_pool = dma_pool_create("keystone-sc", dev,
2240                                             SA_CTX_MAX_SZ, 64, 0);
2241         if (!dev_data->sc_pool) {
2242                 dev_err(dev, "Failed to create dma pool");
2243                 return -ENOMEM;
2244         }
2245
2246         return 0;
2247 }
2248
2249 static int sa_dma_init(struct sa_crypto_data *dd)
2250 {
2251         int ret;
2252         struct dma_slave_config cfg;
2253
2254         dd->dma_rx1 = NULL;
2255         dd->dma_tx = NULL;
2256         dd->dma_rx2 = NULL;
2257
2258         ret = dma_coerce_mask_and_coherent(dd->dev, DMA_BIT_MASK(48));
2259         if (ret)
2260                 return ret;
2261
2262         dd->dma_rx1 = dma_request_chan(dd->dev, "rx1");
2263         if (IS_ERR(dd->dma_rx1))
2264                 return dev_err_probe(dd->dev, PTR_ERR(dd->dma_rx1),
2265                                      "Unable to request rx1 DMA channel\n");
2266
2267         dd->dma_rx2 = dma_request_chan(dd->dev, "rx2");
2268         if (IS_ERR(dd->dma_rx2)) {
2269                 dma_release_channel(dd->dma_rx1);
2270                 return dev_err_probe(dd->dev, PTR_ERR(dd->dma_rx2),
2271                                      "Unable to request rx2 DMA channel\n");
2272         }
2273
2274         dd->dma_tx = dma_request_chan(dd->dev, "tx");
2275         if (IS_ERR(dd->dma_tx)) {
2276                 ret = dev_err_probe(dd->dev, PTR_ERR(dd->dma_tx),
2277                                     "Unable to request tx DMA channel\n");
2278                 goto err_dma_tx;
2279         }
2280
2281         memzero_explicit(&cfg, sizeof(cfg));
2282
2283         cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
2284         cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
2285         cfg.src_maxburst = 4;
2286         cfg.dst_maxburst = 4;
2287
2288         ret = dmaengine_slave_config(dd->dma_rx1, &cfg);
2289         if (ret) {
2290                 dev_err(dd->dev, "can't configure IN dmaengine slave: %d\n",
2291                         ret);
2292                 return ret;
2293         }
2294
2295         ret = dmaengine_slave_config(dd->dma_rx2, &cfg);
2296         if (ret) {
2297                 dev_err(dd->dev, "can't configure IN dmaengine slave: %d\n",
2298                         ret);
2299                 return ret;
2300         }
2301
2302         ret = dmaengine_slave_config(dd->dma_tx, &cfg);
2303         if (ret) {
2304                 dev_err(dd->dev, "can't configure OUT dmaengine slave: %d\n",
2305                         ret);
2306                 return ret;
2307         }
2308
2309         return 0;
2310
2311 err_dma_tx:
2312         dma_release_channel(dd->dma_rx1);
2313         dma_release_channel(dd->dma_rx2);
2314
2315         return ret;
2316 }
2317
2318 static int sa_link_child(struct device *dev, void *data)
2319 {
2320         struct device *parent = data;
2321
2322         device_link_add(dev, parent, DL_FLAG_AUTOPROBE_CONSUMER);
2323
2324         return 0;
2325 }
2326
2327 static int sa_ul_probe(struct platform_device *pdev)
2328 {
2329         struct device *dev = &pdev->dev;
2330         struct device_node *node = dev->of_node;
2331         struct resource *res;
2332         static void __iomem *saul_base;
2333         struct sa_crypto_data *dev_data;
2334         u32 val;
2335         int ret;
2336
2337         dev_data = devm_kzalloc(dev, sizeof(*dev_data), GFP_KERNEL);
2338         if (!dev_data)
2339                 return -ENOMEM;
2340
2341         sa_k3_dev = dev;
2342         dev_data->dev = dev;
2343         dev_data->pdev = pdev;
2344         platform_set_drvdata(pdev, dev_data);
2345         dev_set_drvdata(sa_k3_dev, dev_data);
2346
2347         pm_runtime_enable(dev);
2348         ret = pm_runtime_get_sync(dev);
2349         if (ret < 0) {
2350                 dev_err(&pdev->dev, "%s: failed to get sync: %d\n", __func__,
2351                         ret);
2352                 return ret;
2353         }
2354
2355         sa_init_mem(dev_data);
2356         ret = sa_dma_init(dev_data);
2357         if (ret)
2358                 goto disable_pm_runtime;
2359
2360         spin_lock_init(&dev_data->scid_lock);
2361         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2362         saul_base = devm_ioremap_resource(dev, res);
2363
2364         dev_data->base = saul_base;
2365         val = SA_EEC_ENCSS_EN | SA_EEC_AUTHSS_EN | SA_EEC_CTXCACH_EN |
2366             SA_EEC_CPPI_PORT_IN_EN | SA_EEC_CPPI_PORT_OUT_EN |
2367             SA_EEC_TRNG_EN;
2368
2369         writel_relaxed(val, saul_base + SA_ENGINE_ENABLE_CONTROL);
2370
2371         sa_register_algos(dev);
2372
2373         ret = of_platform_populate(node, NULL, NULL, &pdev->dev);
2374         if (ret)
2375                 goto release_dma;
2376
2377         device_for_each_child(&pdev->dev, &pdev->dev, sa_link_child);
2378
2379         return 0;
2380
2381 release_dma:
2382         sa_unregister_algos(&pdev->dev);
2383
2384         dma_release_channel(dev_data->dma_rx2);
2385         dma_release_channel(dev_data->dma_rx1);
2386         dma_release_channel(dev_data->dma_tx);
2387
2388         dma_pool_destroy(dev_data->sc_pool);
2389
2390 disable_pm_runtime:
2391         pm_runtime_put_sync(&pdev->dev);
2392         pm_runtime_disable(&pdev->dev);
2393
2394         return ret;
2395 }
2396
2397 static int sa_ul_remove(struct platform_device *pdev)
2398 {
2399         struct sa_crypto_data *dev_data = platform_get_drvdata(pdev);
2400
2401         sa_unregister_algos(&pdev->dev);
2402
2403         dma_release_channel(dev_data->dma_rx2);
2404         dma_release_channel(dev_data->dma_rx1);
2405         dma_release_channel(dev_data->dma_tx);
2406
2407         dma_pool_destroy(dev_data->sc_pool);
2408
2409         platform_set_drvdata(pdev, NULL);
2410
2411         pm_runtime_put_sync(&pdev->dev);
2412         pm_runtime_disable(&pdev->dev);
2413
2414         return 0;
2415 }
2416
2417 static const struct of_device_id of_match[] = {
2418         {.compatible = "ti,j721e-sa2ul",},
2419         {.compatible = "ti,am654-sa2ul",},
2420         {},
2421 };
2422 MODULE_DEVICE_TABLE(of, of_match);
2423
2424 static struct platform_driver sa_ul_driver = {
2425         .probe = sa_ul_probe,
2426         .remove = sa_ul_remove,
2427         .driver = {
2428                    .name = "saul-crypto",
2429                    .of_match_table = of_match,
2430                    },
2431 };
2432 module_platform_driver(sa_ul_driver);
2433 MODULE_LICENSE("GPL v2");