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