Merge tag 'drm-next-2020-06-02' of git://anongit.freedesktop.org/drm/drm
[linux-2.6-microblaze.git] / drivers / crypto / caam / caamalg.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * caam - Freescale FSL CAAM support for crypto API
4  *
5  * Copyright 2008-2011 Freescale Semiconductor, Inc.
6  * Copyright 2016-2019 NXP
7  *
8  * Based on talitos crypto API driver.
9  *
10  * relationship of job descriptors to shared descriptors (SteveC Dec 10 2008):
11  *
12  * ---------------                     ---------------
13  * | JobDesc #1  |-------------------->|  ShareDesc  |
14  * | *(packet 1) |                     |   (PDB)     |
15  * ---------------      |------------->|  (hashKey)  |
16  *       .              |              | (cipherKey) |
17  *       .              |    |-------->| (operation) |
18  * ---------------      |    |         ---------------
19  * | JobDesc #2  |------|    |
20  * | *(packet 2) |           |
21  * ---------------           |
22  *       .                   |
23  *       .                   |
24  * ---------------           |
25  * | JobDesc #3  |------------
26  * | *(packet 3) |
27  * ---------------
28  *
29  * The SharedDesc never changes for a connection unless rekeyed, but
30  * each packet will likely be in a different place. So all we need
31  * to know to process the packet is where the input is, where the
32  * output goes, and what context we want to process with. Context is
33  * in the SharedDesc, packet references in the JobDesc.
34  *
35  * So, a job desc looks like:
36  *
37  * ---------------------
38  * | Header            |
39  * | ShareDesc Pointer |
40  * | SEQ_OUT_PTR       |
41  * | (output buffer)   |
42  * | (output length)   |
43  * | SEQ_IN_PTR        |
44  * | (input buffer)    |
45  * | (input length)    |
46  * ---------------------
47  */
48
49 #include "compat.h"
50
51 #include "regs.h"
52 #include "intern.h"
53 #include "desc_constr.h"
54 #include "jr.h"
55 #include "error.h"
56 #include "sg_sw_sec4.h"
57 #include "key_gen.h"
58 #include "caamalg_desc.h"
59 #include <crypto/engine.h>
60
61 /*
62  * crypto alg
63  */
64 #define CAAM_CRA_PRIORITY               3000
65 /* max key is sum of AES_MAX_KEY_SIZE, max split key size */
66 #define CAAM_MAX_KEY_SIZE               (AES_MAX_KEY_SIZE + \
67                                          CTR_RFC3686_NONCE_SIZE + \
68                                          SHA512_DIGEST_SIZE * 2)
69
70 #define AEAD_DESC_JOB_IO_LEN            (DESC_JOB_IO_LEN + CAAM_CMD_SZ * 2)
71 #define GCM_DESC_JOB_IO_LEN             (AEAD_DESC_JOB_IO_LEN + \
72                                          CAAM_CMD_SZ * 4)
73 #define AUTHENC_DESC_JOB_IO_LEN         (AEAD_DESC_JOB_IO_LEN + \
74                                          CAAM_CMD_SZ * 5)
75
76 #define CHACHAPOLY_DESC_JOB_IO_LEN      (AEAD_DESC_JOB_IO_LEN + CAAM_CMD_SZ * 6)
77
78 #define DESC_MAX_USED_BYTES             (CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN_MIN)
79 #define DESC_MAX_USED_LEN               (DESC_MAX_USED_BYTES / CAAM_CMD_SZ)
80
81 struct caam_alg_entry {
82         int class1_alg_type;
83         int class2_alg_type;
84         bool rfc3686;
85         bool geniv;
86         bool nodkp;
87 };
88
89 struct caam_aead_alg {
90         struct aead_alg aead;
91         struct caam_alg_entry caam;
92         bool registered;
93 };
94
95 struct caam_skcipher_alg {
96         struct skcipher_alg skcipher;
97         struct caam_alg_entry caam;
98         bool registered;
99 };
100
101 /*
102  * per-session context
103  */
104 struct caam_ctx {
105         struct crypto_engine_ctx enginectx;
106         u32 sh_desc_enc[DESC_MAX_USED_LEN];
107         u32 sh_desc_dec[DESC_MAX_USED_LEN];
108         u8 key[CAAM_MAX_KEY_SIZE];
109         dma_addr_t sh_desc_enc_dma;
110         dma_addr_t sh_desc_dec_dma;
111         dma_addr_t key_dma;
112         enum dma_data_direction dir;
113         struct device *jrdev;
114         struct alginfo adata;
115         struct alginfo cdata;
116         unsigned int authsize;
117 };
118
119 struct caam_skcipher_req_ctx {
120         struct skcipher_edesc *edesc;
121 };
122
123 struct caam_aead_req_ctx {
124         struct aead_edesc *edesc;
125 };
126
127 static int aead_null_set_sh_desc(struct crypto_aead *aead)
128 {
129         struct caam_ctx *ctx = crypto_aead_ctx(aead);
130         struct device *jrdev = ctx->jrdev;
131         struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
132         u32 *desc;
133         int rem_bytes = CAAM_DESC_BYTES_MAX - AEAD_DESC_JOB_IO_LEN -
134                         ctx->adata.keylen_pad;
135
136         /*
137          * Job Descriptor and Shared Descriptors
138          * must all fit into the 64-word Descriptor h/w Buffer
139          */
140         if (rem_bytes >= DESC_AEAD_NULL_ENC_LEN) {
141                 ctx->adata.key_inline = true;
142                 ctx->adata.key_virt = ctx->key;
143         } else {
144                 ctx->adata.key_inline = false;
145                 ctx->adata.key_dma = ctx->key_dma;
146         }
147
148         /* aead_encrypt shared descriptor */
149         desc = ctx->sh_desc_enc;
150         cnstr_shdsc_aead_null_encap(desc, &ctx->adata, ctx->authsize,
151                                     ctrlpriv->era);
152         dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
153                                    desc_bytes(desc), ctx->dir);
154
155         /*
156          * Job Descriptor and Shared Descriptors
157          * must all fit into the 64-word Descriptor h/w Buffer
158          */
159         if (rem_bytes >= DESC_AEAD_NULL_DEC_LEN) {
160                 ctx->adata.key_inline = true;
161                 ctx->adata.key_virt = ctx->key;
162         } else {
163                 ctx->adata.key_inline = false;
164                 ctx->adata.key_dma = ctx->key_dma;
165         }
166
167         /* aead_decrypt shared descriptor */
168         desc = ctx->sh_desc_dec;
169         cnstr_shdsc_aead_null_decap(desc, &ctx->adata, ctx->authsize,
170                                     ctrlpriv->era);
171         dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
172                                    desc_bytes(desc), ctx->dir);
173
174         return 0;
175 }
176
177 static int aead_set_sh_desc(struct crypto_aead *aead)
178 {
179         struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),
180                                                  struct caam_aead_alg, aead);
181         unsigned int ivsize = crypto_aead_ivsize(aead);
182         struct caam_ctx *ctx = crypto_aead_ctx(aead);
183         struct device *jrdev = ctx->jrdev;
184         struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
185         u32 ctx1_iv_off = 0;
186         u32 *desc, *nonce = NULL;
187         u32 inl_mask;
188         unsigned int data_len[2];
189         const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) ==
190                                OP_ALG_AAI_CTR_MOD128);
191         const bool is_rfc3686 = alg->caam.rfc3686;
192
193         if (!ctx->authsize)
194                 return 0;
195
196         /* NULL encryption / decryption */
197         if (!ctx->cdata.keylen)
198                 return aead_null_set_sh_desc(aead);
199
200         /*
201          * AES-CTR needs to load IV in CONTEXT1 reg
202          * at an offset of 128bits (16bytes)
203          * CONTEXT1[255:128] = IV
204          */
205         if (ctr_mode)
206                 ctx1_iv_off = 16;
207
208         /*
209          * RFC3686 specific:
210          *      CONTEXT1[255:128] = {NONCE, IV, COUNTER}
211          */
212         if (is_rfc3686) {
213                 ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;
214                 nonce = (u32 *)((void *)ctx->key + ctx->adata.keylen_pad +
215                                 ctx->cdata.keylen - CTR_RFC3686_NONCE_SIZE);
216         }
217
218         /*
219          * In case |user key| > |derived key|, using DKP<imm,imm>
220          * would result in invalid opcodes (last bytes of user key) in
221          * the resulting descriptor. Use DKP<ptr,imm> instead => both
222          * virtual and dma key addresses are needed.
223          */
224         ctx->adata.key_virt = ctx->key;
225         ctx->adata.key_dma = ctx->key_dma;
226
227         ctx->cdata.key_virt = ctx->key + ctx->adata.keylen_pad;
228         ctx->cdata.key_dma = ctx->key_dma + ctx->adata.keylen_pad;
229
230         data_len[0] = ctx->adata.keylen_pad;
231         data_len[1] = ctx->cdata.keylen;
232
233         if (alg->caam.geniv)
234                 goto skip_enc;
235
236         /*
237          * Job Descriptor and Shared Descriptors
238          * must all fit into the 64-word Descriptor h/w Buffer
239          */
240         if (desc_inline_query(DESC_AEAD_ENC_LEN +
241                               (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
242                               AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask,
243                               ARRAY_SIZE(data_len)) < 0)
244                 return -EINVAL;
245
246         ctx->adata.key_inline = !!(inl_mask & 1);
247         ctx->cdata.key_inline = !!(inl_mask & 2);
248
249         /* aead_encrypt shared descriptor */
250         desc = ctx->sh_desc_enc;
251         cnstr_shdsc_aead_encap(desc, &ctx->cdata, &ctx->adata, ivsize,
252                                ctx->authsize, is_rfc3686, nonce, ctx1_iv_off,
253                                false, ctrlpriv->era);
254         dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
255                                    desc_bytes(desc), ctx->dir);
256
257 skip_enc:
258         /*
259          * Job Descriptor and Shared Descriptors
260          * must all fit into the 64-word Descriptor h/w Buffer
261          */
262         if (desc_inline_query(DESC_AEAD_DEC_LEN +
263                               (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
264                               AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask,
265                               ARRAY_SIZE(data_len)) < 0)
266                 return -EINVAL;
267
268         ctx->adata.key_inline = !!(inl_mask & 1);
269         ctx->cdata.key_inline = !!(inl_mask & 2);
270
271         /* aead_decrypt shared descriptor */
272         desc = ctx->sh_desc_dec;
273         cnstr_shdsc_aead_decap(desc, &ctx->cdata, &ctx->adata, ivsize,
274                                ctx->authsize, alg->caam.geniv, is_rfc3686,
275                                nonce, ctx1_iv_off, false, ctrlpriv->era);
276         dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
277                                    desc_bytes(desc), ctx->dir);
278
279         if (!alg->caam.geniv)
280                 goto skip_givenc;
281
282         /*
283          * Job Descriptor and Shared Descriptors
284          * must all fit into the 64-word Descriptor h/w Buffer
285          */
286         if (desc_inline_query(DESC_AEAD_GIVENC_LEN +
287                               (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
288                               AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask,
289                               ARRAY_SIZE(data_len)) < 0)
290                 return -EINVAL;
291
292         ctx->adata.key_inline = !!(inl_mask & 1);
293         ctx->cdata.key_inline = !!(inl_mask & 2);
294
295         /* aead_givencrypt shared descriptor */
296         desc = ctx->sh_desc_enc;
297         cnstr_shdsc_aead_givencap(desc, &ctx->cdata, &ctx->adata, ivsize,
298                                   ctx->authsize, is_rfc3686, nonce,
299                                   ctx1_iv_off, false, ctrlpriv->era);
300         dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
301                                    desc_bytes(desc), ctx->dir);
302
303 skip_givenc:
304         return 0;
305 }
306
307 static int aead_setauthsize(struct crypto_aead *authenc,
308                                     unsigned int authsize)
309 {
310         struct caam_ctx *ctx = crypto_aead_ctx(authenc);
311
312         ctx->authsize = authsize;
313         aead_set_sh_desc(authenc);
314
315         return 0;
316 }
317
318 static int gcm_set_sh_desc(struct crypto_aead *aead)
319 {
320         struct caam_ctx *ctx = crypto_aead_ctx(aead);
321         struct device *jrdev = ctx->jrdev;
322         unsigned int ivsize = crypto_aead_ivsize(aead);
323         u32 *desc;
324         int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN -
325                         ctx->cdata.keylen;
326
327         if (!ctx->cdata.keylen || !ctx->authsize)
328                 return 0;
329
330         /*
331          * AES GCM encrypt shared descriptor
332          * Job Descriptor and Shared Descriptor
333          * must fit into the 64-word Descriptor h/w Buffer
334          */
335         if (rem_bytes >= DESC_GCM_ENC_LEN) {
336                 ctx->cdata.key_inline = true;
337                 ctx->cdata.key_virt = ctx->key;
338         } else {
339                 ctx->cdata.key_inline = false;
340                 ctx->cdata.key_dma = ctx->key_dma;
341         }
342
343         desc = ctx->sh_desc_enc;
344         cnstr_shdsc_gcm_encap(desc, &ctx->cdata, ivsize, ctx->authsize, false);
345         dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
346                                    desc_bytes(desc), ctx->dir);
347
348         /*
349          * Job Descriptor and Shared Descriptors
350          * must all fit into the 64-word Descriptor h/w Buffer
351          */
352         if (rem_bytes >= DESC_GCM_DEC_LEN) {
353                 ctx->cdata.key_inline = true;
354                 ctx->cdata.key_virt = ctx->key;
355         } else {
356                 ctx->cdata.key_inline = false;
357                 ctx->cdata.key_dma = ctx->key_dma;
358         }
359
360         desc = ctx->sh_desc_dec;
361         cnstr_shdsc_gcm_decap(desc, &ctx->cdata, ivsize, ctx->authsize, false);
362         dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
363                                    desc_bytes(desc), ctx->dir);
364
365         return 0;
366 }
367
368 static int gcm_setauthsize(struct crypto_aead *authenc, unsigned int authsize)
369 {
370         struct caam_ctx *ctx = crypto_aead_ctx(authenc);
371         int err;
372
373         err = crypto_gcm_check_authsize(authsize);
374         if (err)
375                 return err;
376
377         ctx->authsize = authsize;
378         gcm_set_sh_desc(authenc);
379
380         return 0;
381 }
382
383 static int rfc4106_set_sh_desc(struct crypto_aead *aead)
384 {
385         struct caam_ctx *ctx = crypto_aead_ctx(aead);
386         struct device *jrdev = ctx->jrdev;
387         unsigned int ivsize = crypto_aead_ivsize(aead);
388         u32 *desc;
389         int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN -
390                         ctx->cdata.keylen;
391
392         if (!ctx->cdata.keylen || !ctx->authsize)
393                 return 0;
394
395         /*
396          * RFC4106 encrypt shared descriptor
397          * Job Descriptor and Shared Descriptor
398          * must fit into the 64-word Descriptor h/w Buffer
399          */
400         if (rem_bytes >= DESC_RFC4106_ENC_LEN) {
401                 ctx->cdata.key_inline = true;
402                 ctx->cdata.key_virt = ctx->key;
403         } else {
404                 ctx->cdata.key_inline = false;
405                 ctx->cdata.key_dma = ctx->key_dma;
406         }
407
408         desc = ctx->sh_desc_enc;
409         cnstr_shdsc_rfc4106_encap(desc, &ctx->cdata, ivsize, ctx->authsize,
410                                   false);
411         dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
412                                    desc_bytes(desc), ctx->dir);
413
414         /*
415          * Job Descriptor and Shared Descriptors
416          * must all fit into the 64-word Descriptor h/w Buffer
417          */
418         if (rem_bytes >= DESC_RFC4106_DEC_LEN) {
419                 ctx->cdata.key_inline = true;
420                 ctx->cdata.key_virt = ctx->key;
421         } else {
422                 ctx->cdata.key_inline = false;
423                 ctx->cdata.key_dma = ctx->key_dma;
424         }
425
426         desc = ctx->sh_desc_dec;
427         cnstr_shdsc_rfc4106_decap(desc, &ctx->cdata, ivsize, ctx->authsize,
428                                   false);
429         dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
430                                    desc_bytes(desc), ctx->dir);
431
432         return 0;
433 }
434
435 static int rfc4106_setauthsize(struct crypto_aead *authenc,
436                                unsigned int authsize)
437 {
438         struct caam_ctx *ctx = crypto_aead_ctx(authenc);
439         int err;
440
441         err = crypto_rfc4106_check_authsize(authsize);
442         if (err)
443                 return err;
444
445         ctx->authsize = authsize;
446         rfc4106_set_sh_desc(authenc);
447
448         return 0;
449 }
450
451 static int rfc4543_set_sh_desc(struct crypto_aead *aead)
452 {
453         struct caam_ctx *ctx = crypto_aead_ctx(aead);
454         struct device *jrdev = ctx->jrdev;
455         unsigned int ivsize = crypto_aead_ivsize(aead);
456         u32 *desc;
457         int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN -
458                         ctx->cdata.keylen;
459
460         if (!ctx->cdata.keylen || !ctx->authsize)
461                 return 0;
462
463         /*
464          * RFC4543 encrypt shared descriptor
465          * Job Descriptor and Shared Descriptor
466          * must fit into the 64-word Descriptor h/w Buffer
467          */
468         if (rem_bytes >= DESC_RFC4543_ENC_LEN) {
469                 ctx->cdata.key_inline = true;
470                 ctx->cdata.key_virt = ctx->key;
471         } else {
472                 ctx->cdata.key_inline = false;
473                 ctx->cdata.key_dma = ctx->key_dma;
474         }
475
476         desc = ctx->sh_desc_enc;
477         cnstr_shdsc_rfc4543_encap(desc, &ctx->cdata, ivsize, ctx->authsize,
478                                   false);
479         dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
480                                    desc_bytes(desc), ctx->dir);
481
482         /*
483          * Job Descriptor and Shared Descriptors
484          * must all fit into the 64-word Descriptor h/w Buffer
485          */
486         if (rem_bytes >= DESC_RFC4543_DEC_LEN) {
487                 ctx->cdata.key_inline = true;
488                 ctx->cdata.key_virt = ctx->key;
489         } else {
490                 ctx->cdata.key_inline = false;
491                 ctx->cdata.key_dma = ctx->key_dma;
492         }
493
494         desc = ctx->sh_desc_dec;
495         cnstr_shdsc_rfc4543_decap(desc, &ctx->cdata, ivsize, ctx->authsize,
496                                   false);
497         dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
498                                    desc_bytes(desc), ctx->dir);
499
500         return 0;
501 }
502
503 static int rfc4543_setauthsize(struct crypto_aead *authenc,
504                                unsigned int authsize)
505 {
506         struct caam_ctx *ctx = crypto_aead_ctx(authenc);
507
508         if (authsize != 16)
509                 return -EINVAL;
510
511         ctx->authsize = authsize;
512         rfc4543_set_sh_desc(authenc);
513
514         return 0;
515 }
516
517 static int chachapoly_set_sh_desc(struct crypto_aead *aead)
518 {
519         struct caam_ctx *ctx = crypto_aead_ctx(aead);
520         struct device *jrdev = ctx->jrdev;
521         unsigned int ivsize = crypto_aead_ivsize(aead);
522         u32 *desc;
523
524         if (!ctx->cdata.keylen || !ctx->authsize)
525                 return 0;
526
527         desc = ctx->sh_desc_enc;
528         cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize,
529                                ctx->authsize, true, false);
530         dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
531                                    desc_bytes(desc), ctx->dir);
532
533         desc = ctx->sh_desc_dec;
534         cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize,
535                                ctx->authsize, false, false);
536         dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
537                                    desc_bytes(desc), ctx->dir);
538
539         return 0;
540 }
541
542 static int chachapoly_setauthsize(struct crypto_aead *aead,
543                                   unsigned int authsize)
544 {
545         struct caam_ctx *ctx = crypto_aead_ctx(aead);
546
547         if (authsize != POLY1305_DIGEST_SIZE)
548                 return -EINVAL;
549
550         ctx->authsize = authsize;
551         return chachapoly_set_sh_desc(aead);
552 }
553
554 static int chachapoly_setkey(struct crypto_aead *aead, const u8 *key,
555                              unsigned int keylen)
556 {
557         struct caam_ctx *ctx = crypto_aead_ctx(aead);
558         unsigned int ivsize = crypto_aead_ivsize(aead);
559         unsigned int saltlen = CHACHAPOLY_IV_SIZE - ivsize;
560
561         if (keylen != CHACHA_KEY_SIZE + saltlen)
562                 return -EINVAL;
563
564         ctx->cdata.key_virt = key;
565         ctx->cdata.keylen = keylen - saltlen;
566
567         return chachapoly_set_sh_desc(aead);
568 }
569
570 static int aead_setkey(struct crypto_aead *aead,
571                                const u8 *key, unsigned int keylen)
572 {
573         struct caam_ctx *ctx = crypto_aead_ctx(aead);
574         struct device *jrdev = ctx->jrdev;
575         struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
576         struct crypto_authenc_keys keys;
577         int ret = 0;
578
579         if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
580                 goto badkey;
581
582         dev_dbg(jrdev, "keylen %d enckeylen %d authkeylen %d\n",
583                keys.authkeylen + keys.enckeylen, keys.enckeylen,
584                keys.authkeylen);
585         print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
586                              DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
587
588         /*
589          * If DKP is supported, use it in the shared descriptor to generate
590          * the split key.
591          */
592         if (ctrlpriv->era >= 6) {
593                 ctx->adata.keylen = keys.authkeylen;
594                 ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype &
595                                                       OP_ALG_ALGSEL_MASK);
596
597                 if (ctx->adata.keylen_pad + keys.enckeylen > CAAM_MAX_KEY_SIZE)
598                         goto badkey;
599
600                 memcpy(ctx->key, keys.authkey, keys.authkeylen);
601                 memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey,
602                        keys.enckeylen);
603                 dma_sync_single_for_device(jrdev, ctx->key_dma,
604                                            ctx->adata.keylen_pad +
605                                            keys.enckeylen, ctx->dir);
606                 goto skip_split_key;
607         }
608
609         ret = gen_split_key(ctx->jrdev, ctx->key, &ctx->adata, keys.authkey,
610                             keys.authkeylen, CAAM_MAX_KEY_SIZE -
611                             keys.enckeylen);
612         if (ret) {
613                 goto badkey;
614         }
615
616         /* postpend encryption key to auth split key */
617         memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, keys.enckeylen);
618         dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->adata.keylen_pad +
619                                    keys.enckeylen, ctx->dir);
620
621         print_hex_dump_debug("ctx.key@"__stringify(__LINE__)": ",
622                              DUMP_PREFIX_ADDRESS, 16, 4, ctx->key,
623                              ctx->adata.keylen_pad + keys.enckeylen, 1);
624
625 skip_split_key:
626         ctx->cdata.keylen = keys.enckeylen;
627         memzero_explicit(&keys, sizeof(keys));
628         return aead_set_sh_desc(aead);
629 badkey:
630         memzero_explicit(&keys, sizeof(keys));
631         return -EINVAL;
632 }
633
634 static int des3_aead_setkey(struct crypto_aead *aead, const u8 *key,
635                             unsigned int keylen)
636 {
637         struct crypto_authenc_keys keys;
638         int err;
639
640         err = crypto_authenc_extractkeys(&keys, key, keylen);
641         if (unlikely(err))
642                 return err;
643
644         err = verify_aead_des3_key(aead, keys.enckey, keys.enckeylen) ?:
645               aead_setkey(aead, key, keylen);
646
647         memzero_explicit(&keys, sizeof(keys));
648         return err;
649 }
650
651 static int gcm_setkey(struct crypto_aead *aead,
652                       const u8 *key, unsigned int keylen)
653 {
654         struct caam_ctx *ctx = crypto_aead_ctx(aead);
655         struct device *jrdev = ctx->jrdev;
656         int err;
657
658         err = aes_check_keylen(keylen);
659         if (err)
660                 return err;
661
662         print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
663                              DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
664
665         memcpy(ctx->key, key, keylen);
666         dma_sync_single_for_device(jrdev, ctx->key_dma, keylen, ctx->dir);
667         ctx->cdata.keylen = keylen;
668
669         return gcm_set_sh_desc(aead);
670 }
671
672 static int rfc4106_setkey(struct crypto_aead *aead,
673                           const u8 *key, unsigned int keylen)
674 {
675         struct caam_ctx *ctx = crypto_aead_ctx(aead);
676         struct device *jrdev = ctx->jrdev;
677         int err;
678
679         err = aes_check_keylen(keylen - 4);
680         if (err)
681                 return err;
682
683         print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
684                              DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
685
686         memcpy(ctx->key, key, keylen);
687
688         /*
689          * The last four bytes of the key material are used as the salt value
690          * in the nonce. Update the AES key length.
691          */
692         ctx->cdata.keylen = keylen - 4;
693         dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->cdata.keylen,
694                                    ctx->dir);
695         return rfc4106_set_sh_desc(aead);
696 }
697
698 static int rfc4543_setkey(struct crypto_aead *aead,
699                           const u8 *key, unsigned int keylen)
700 {
701         struct caam_ctx *ctx = crypto_aead_ctx(aead);
702         struct device *jrdev = ctx->jrdev;
703         int err;
704
705         err = aes_check_keylen(keylen - 4);
706         if (err)
707                 return err;
708
709         print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
710                              DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
711
712         memcpy(ctx->key, key, keylen);
713
714         /*
715          * The last four bytes of the key material are used as the salt value
716          * in the nonce. Update the AES key length.
717          */
718         ctx->cdata.keylen = keylen - 4;
719         dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->cdata.keylen,
720                                    ctx->dir);
721         return rfc4543_set_sh_desc(aead);
722 }
723
724 static int skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key,
725                            unsigned int keylen, const u32 ctx1_iv_off)
726 {
727         struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
728         struct caam_skcipher_alg *alg =
729                 container_of(crypto_skcipher_alg(skcipher), typeof(*alg),
730                              skcipher);
731         struct device *jrdev = ctx->jrdev;
732         unsigned int ivsize = crypto_skcipher_ivsize(skcipher);
733         u32 *desc;
734         const bool is_rfc3686 = alg->caam.rfc3686;
735
736         print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
737                              DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
738
739         ctx->cdata.keylen = keylen;
740         ctx->cdata.key_virt = key;
741         ctx->cdata.key_inline = true;
742
743         /* skcipher_encrypt shared descriptor */
744         desc = ctx->sh_desc_enc;
745         cnstr_shdsc_skcipher_encap(desc, &ctx->cdata, ivsize, is_rfc3686,
746                                    ctx1_iv_off);
747         dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
748                                    desc_bytes(desc), ctx->dir);
749
750         /* skcipher_decrypt shared descriptor */
751         desc = ctx->sh_desc_dec;
752         cnstr_shdsc_skcipher_decap(desc, &ctx->cdata, ivsize, is_rfc3686,
753                                    ctx1_iv_off);
754         dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
755                                    desc_bytes(desc), ctx->dir);
756
757         return 0;
758 }
759
760 static int aes_skcipher_setkey(struct crypto_skcipher *skcipher,
761                                const u8 *key, unsigned int keylen)
762 {
763         int err;
764
765         err = aes_check_keylen(keylen);
766         if (err)
767                 return err;
768
769         return skcipher_setkey(skcipher, key, keylen, 0);
770 }
771
772 static int rfc3686_skcipher_setkey(struct crypto_skcipher *skcipher,
773                                    const u8 *key, unsigned int keylen)
774 {
775         u32 ctx1_iv_off;
776         int err;
777
778         /*
779          * RFC3686 specific:
780          *      | CONTEXT1[255:128] = {NONCE, IV, COUNTER}
781          *      | *key = {KEY, NONCE}
782          */
783         ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;
784         keylen -= CTR_RFC3686_NONCE_SIZE;
785
786         err = aes_check_keylen(keylen);
787         if (err)
788                 return err;
789
790         return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off);
791 }
792
793 static int ctr_skcipher_setkey(struct crypto_skcipher *skcipher,
794                                const u8 *key, unsigned int keylen)
795 {
796         u32 ctx1_iv_off;
797         int err;
798
799         /*
800          * AES-CTR needs to load IV in CONTEXT1 reg
801          * at an offset of 128bits (16bytes)
802          * CONTEXT1[255:128] = IV
803          */
804         ctx1_iv_off = 16;
805
806         err = aes_check_keylen(keylen);
807         if (err)
808                 return err;
809
810         return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off);
811 }
812
813 static int arc4_skcipher_setkey(struct crypto_skcipher *skcipher,
814                                 const u8 *key, unsigned int keylen)
815 {
816         return skcipher_setkey(skcipher, key, keylen, 0);
817 }
818
819 static int des_skcipher_setkey(struct crypto_skcipher *skcipher,
820                                const u8 *key, unsigned int keylen)
821 {
822         return verify_skcipher_des_key(skcipher, key) ?:
823                skcipher_setkey(skcipher, key, keylen, 0);
824 }
825
826 static int des3_skcipher_setkey(struct crypto_skcipher *skcipher,
827                                 const u8 *key, unsigned int keylen)
828 {
829         return verify_skcipher_des3_key(skcipher, key) ?:
830                skcipher_setkey(skcipher, key, keylen, 0);
831 }
832
833 static int xts_skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key,
834                                unsigned int keylen)
835 {
836         struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
837         struct device *jrdev = ctx->jrdev;
838         u32 *desc;
839
840         if (keylen != 2 * AES_MIN_KEY_SIZE  && keylen != 2 * AES_MAX_KEY_SIZE) {
841                 dev_err(jrdev, "key size mismatch\n");
842                 return -EINVAL;
843         }
844
845         ctx->cdata.keylen = keylen;
846         ctx->cdata.key_virt = key;
847         ctx->cdata.key_inline = true;
848
849         /* xts_skcipher_encrypt shared descriptor */
850         desc = ctx->sh_desc_enc;
851         cnstr_shdsc_xts_skcipher_encap(desc, &ctx->cdata);
852         dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
853                                    desc_bytes(desc), ctx->dir);
854
855         /* xts_skcipher_decrypt shared descriptor */
856         desc = ctx->sh_desc_dec;
857         cnstr_shdsc_xts_skcipher_decap(desc, &ctx->cdata);
858         dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
859                                    desc_bytes(desc), ctx->dir);
860
861         return 0;
862 }
863
864 /*
865  * aead_edesc - s/w-extended aead descriptor
866  * @src_nents: number of segments in input s/w scatterlist
867  * @dst_nents: number of segments in output s/w scatterlist
868  * @mapped_src_nents: number of segments in input h/w link table
869  * @mapped_dst_nents: number of segments in output h/w link table
870  * @sec4_sg_bytes: length of dma mapped sec4_sg space
871  * @bklog: stored to determine if the request needs backlog
872  * @sec4_sg_dma: bus physical mapped address of h/w link table
873  * @sec4_sg: pointer to h/w link table
874  * @hw_desc: the h/w job descriptor followed by any referenced link tables
875  */
876 struct aead_edesc {
877         int src_nents;
878         int dst_nents;
879         int mapped_src_nents;
880         int mapped_dst_nents;
881         int sec4_sg_bytes;
882         bool bklog;
883         dma_addr_t sec4_sg_dma;
884         struct sec4_sg_entry *sec4_sg;
885         u32 hw_desc[];
886 };
887
888 /*
889  * skcipher_edesc - s/w-extended skcipher descriptor
890  * @src_nents: number of segments in input s/w scatterlist
891  * @dst_nents: number of segments in output s/w scatterlist
892  * @mapped_src_nents: number of segments in input h/w link table
893  * @mapped_dst_nents: number of segments in output h/w link table
894  * @iv_dma: dma address of iv for checking continuity and link table
895  * @sec4_sg_bytes: length of dma mapped sec4_sg space
896  * @bklog: stored to determine if the request needs backlog
897  * @sec4_sg_dma: bus physical mapped address of h/w link table
898  * @sec4_sg: pointer to h/w link table
899  * @hw_desc: the h/w job descriptor followed by any referenced link tables
900  *           and IV
901  */
902 struct skcipher_edesc {
903         int src_nents;
904         int dst_nents;
905         int mapped_src_nents;
906         int mapped_dst_nents;
907         dma_addr_t iv_dma;
908         int sec4_sg_bytes;
909         bool bklog;
910         dma_addr_t sec4_sg_dma;
911         struct sec4_sg_entry *sec4_sg;
912         u32 hw_desc[];
913 };
914
915 static void caam_unmap(struct device *dev, struct scatterlist *src,
916                        struct scatterlist *dst, int src_nents,
917                        int dst_nents,
918                        dma_addr_t iv_dma, int ivsize, dma_addr_t sec4_sg_dma,
919                        int sec4_sg_bytes)
920 {
921         if (dst != src) {
922                 if (src_nents)
923                         dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE);
924                 if (dst_nents)
925                         dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE);
926         } else {
927                 dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL);
928         }
929
930         if (iv_dma)
931                 dma_unmap_single(dev, iv_dma, ivsize, DMA_BIDIRECTIONAL);
932         if (sec4_sg_bytes)
933                 dma_unmap_single(dev, sec4_sg_dma, sec4_sg_bytes,
934                                  DMA_TO_DEVICE);
935 }
936
937 static void aead_unmap(struct device *dev,
938                        struct aead_edesc *edesc,
939                        struct aead_request *req)
940 {
941         caam_unmap(dev, req->src, req->dst,
942                    edesc->src_nents, edesc->dst_nents, 0, 0,
943                    edesc->sec4_sg_dma, edesc->sec4_sg_bytes);
944 }
945
946 static void skcipher_unmap(struct device *dev, struct skcipher_edesc *edesc,
947                            struct skcipher_request *req)
948 {
949         struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
950         int ivsize = crypto_skcipher_ivsize(skcipher);
951
952         caam_unmap(dev, req->src, req->dst,
953                    edesc->src_nents, edesc->dst_nents,
954                    edesc->iv_dma, ivsize,
955                    edesc->sec4_sg_dma, edesc->sec4_sg_bytes);
956 }
957
958 static void aead_crypt_done(struct device *jrdev, u32 *desc, u32 err,
959                             void *context)
960 {
961         struct aead_request *req = context;
962         struct caam_aead_req_ctx *rctx = aead_request_ctx(req);
963         struct caam_drv_private_jr *jrp = dev_get_drvdata(jrdev);
964         struct aead_edesc *edesc;
965         int ecode = 0;
966         bool has_bklog;
967
968         dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
969
970         edesc = rctx->edesc;
971         has_bklog = edesc->bklog;
972
973         if (err)
974                 ecode = caam_jr_strstatus(jrdev, err);
975
976         aead_unmap(jrdev, edesc, req);
977
978         kfree(edesc);
979
980         /*
981          * If no backlog flag, the completion of the request is done
982          * by CAAM, not crypto engine.
983          */
984         if (!has_bklog)
985                 aead_request_complete(req, ecode);
986         else
987                 crypto_finalize_aead_request(jrp->engine, req, ecode);
988 }
989
990 static void skcipher_crypt_done(struct device *jrdev, u32 *desc, u32 err,
991                                 void *context)
992 {
993         struct skcipher_request *req = context;
994         struct skcipher_edesc *edesc;
995         struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req);
996         struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
997         struct caam_drv_private_jr *jrp = dev_get_drvdata(jrdev);
998         int ivsize = crypto_skcipher_ivsize(skcipher);
999         int ecode = 0;
1000         bool has_bklog;
1001
1002         dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
1003
1004         edesc = rctx->edesc;
1005         has_bklog = edesc->bklog;
1006         if (err)
1007                 ecode = caam_jr_strstatus(jrdev, err);
1008
1009         skcipher_unmap(jrdev, edesc, req);
1010
1011         /*
1012          * The crypto API expects us to set the IV (req->iv) to the last
1013          * ciphertext block (CBC mode) or last counter (CTR mode).
1014          * This is used e.g. by the CTS mode.
1015          */
1016         if (ivsize && !ecode) {
1017                 memcpy(req->iv, (u8 *)edesc->sec4_sg + edesc->sec4_sg_bytes,
1018                        ivsize);
1019
1020                 print_hex_dump_debug("dstiv  @" __stringify(__LINE__)": ",
1021                                      DUMP_PREFIX_ADDRESS, 16, 4, req->iv,
1022                                      ivsize, 1);
1023         }
1024
1025         caam_dump_sg("dst    @" __stringify(__LINE__)": ",
1026                      DUMP_PREFIX_ADDRESS, 16, 4, req->dst,
1027                      edesc->dst_nents > 1 ? 100 : req->cryptlen, 1);
1028
1029         kfree(edesc);
1030
1031         /*
1032          * If no backlog flag, the completion of the request is done
1033          * by CAAM, not crypto engine.
1034          */
1035         if (!has_bklog)
1036                 skcipher_request_complete(req, ecode);
1037         else
1038                 crypto_finalize_skcipher_request(jrp->engine, req, ecode);
1039 }
1040
1041 /*
1042  * Fill in aead job descriptor
1043  */
1044 static void init_aead_job(struct aead_request *req,
1045                           struct aead_edesc *edesc,
1046                           bool all_contig, bool encrypt)
1047 {
1048         struct crypto_aead *aead = crypto_aead_reqtfm(req);
1049         struct caam_ctx *ctx = crypto_aead_ctx(aead);
1050         int authsize = ctx->authsize;
1051         u32 *desc = edesc->hw_desc;
1052         u32 out_options, in_options;
1053         dma_addr_t dst_dma, src_dma;
1054         int len, sec4_sg_index = 0;
1055         dma_addr_t ptr;
1056         u32 *sh_desc;
1057
1058         sh_desc = encrypt ? ctx->sh_desc_enc : ctx->sh_desc_dec;
1059         ptr = encrypt ? ctx->sh_desc_enc_dma : ctx->sh_desc_dec_dma;
1060
1061         len = desc_len(sh_desc);
1062         init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE);
1063
1064         if (all_contig) {
1065                 src_dma = edesc->mapped_src_nents ? sg_dma_address(req->src) :
1066                                                     0;
1067                 in_options = 0;
1068         } else {
1069                 src_dma = edesc->sec4_sg_dma;
1070                 sec4_sg_index += edesc->mapped_src_nents;
1071                 in_options = LDST_SGF;
1072         }
1073
1074         append_seq_in_ptr(desc, src_dma, req->assoclen + req->cryptlen,
1075                           in_options);
1076
1077         dst_dma = src_dma;
1078         out_options = in_options;
1079
1080         if (unlikely(req->src != req->dst)) {
1081                 if (!edesc->mapped_dst_nents) {
1082                         dst_dma = 0;
1083                         out_options = 0;
1084                 } else if (edesc->mapped_dst_nents == 1) {
1085                         dst_dma = sg_dma_address(req->dst);
1086                         out_options = 0;
1087                 } else {
1088                         dst_dma = edesc->sec4_sg_dma +
1089                                   sec4_sg_index *
1090                                   sizeof(struct sec4_sg_entry);
1091                         out_options = LDST_SGF;
1092                 }
1093         }
1094
1095         if (encrypt)
1096                 append_seq_out_ptr(desc, dst_dma,
1097                                    req->assoclen + req->cryptlen + authsize,
1098                                    out_options);
1099         else
1100                 append_seq_out_ptr(desc, dst_dma,
1101                                    req->assoclen + req->cryptlen - authsize,
1102                                    out_options);
1103 }
1104
1105 static void init_gcm_job(struct aead_request *req,
1106                          struct aead_edesc *edesc,
1107                          bool all_contig, bool encrypt)
1108 {
1109         struct crypto_aead *aead = crypto_aead_reqtfm(req);
1110         struct caam_ctx *ctx = crypto_aead_ctx(aead);
1111         unsigned int ivsize = crypto_aead_ivsize(aead);
1112         u32 *desc = edesc->hw_desc;
1113         bool generic_gcm = (ivsize == GCM_AES_IV_SIZE);
1114         unsigned int last;
1115
1116         init_aead_job(req, edesc, all_contig, encrypt);
1117         append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen);
1118
1119         /* BUG This should not be specific to generic GCM. */
1120         last = 0;
1121         if (encrypt && generic_gcm && !(req->assoclen + req->cryptlen))
1122                 last = FIFOLD_TYPE_LAST1;
1123
1124         /* Read GCM IV */
1125         append_cmd(desc, CMD_FIFO_LOAD | FIFOLD_CLASS_CLASS1 | IMMEDIATE |
1126                          FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 | GCM_AES_IV_SIZE | last);
1127         /* Append Salt */
1128         if (!generic_gcm)
1129                 append_data(desc, ctx->key + ctx->cdata.keylen, 4);
1130         /* Append IV */
1131         append_data(desc, req->iv, ivsize);
1132         /* End of blank commands */
1133 }
1134
1135 static void init_chachapoly_job(struct aead_request *req,
1136                                 struct aead_edesc *edesc, bool all_contig,
1137                                 bool encrypt)
1138 {
1139         struct crypto_aead *aead = crypto_aead_reqtfm(req);
1140         unsigned int ivsize = crypto_aead_ivsize(aead);
1141         unsigned int assoclen = req->assoclen;
1142         u32 *desc = edesc->hw_desc;
1143         u32 ctx_iv_off = 4;
1144
1145         init_aead_job(req, edesc, all_contig, encrypt);
1146
1147         if (ivsize != CHACHAPOLY_IV_SIZE) {
1148                 /* IPsec specific: CONTEXT1[223:128] = {NONCE, IV} */
1149                 ctx_iv_off += 4;
1150
1151                 /*
1152                  * The associated data comes already with the IV but we need
1153                  * to skip it when we authenticate or encrypt...
1154                  */
1155                 assoclen -= ivsize;
1156         }
1157
1158         append_math_add_imm_u32(desc, REG3, ZERO, IMM, assoclen);
1159
1160         /*
1161          * For IPsec load the IV further in the same register.
1162          * For RFC7539 simply load the 12 bytes nonce in a single operation
1163          */
1164         append_load_as_imm(desc, req->iv, ivsize, LDST_CLASS_1_CCB |
1165                            LDST_SRCDST_BYTE_CONTEXT |
1166                            ctx_iv_off << LDST_OFFSET_SHIFT);
1167 }
1168
1169 static void init_authenc_job(struct aead_request *req,
1170                              struct aead_edesc *edesc,
1171                              bool all_contig, bool encrypt)
1172 {
1173         struct crypto_aead *aead = crypto_aead_reqtfm(req);
1174         struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),
1175                                                  struct caam_aead_alg, aead);
1176         unsigned int ivsize = crypto_aead_ivsize(aead);
1177         struct caam_ctx *ctx = crypto_aead_ctx(aead);
1178         struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctx->jrdev->parent);
1179         const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) ==
1180                                OP_ALG_AAI_CTR_MOD128);
1181         const bool is_rfc3686 = alg->caam.rfc3686;
1182         u32 *desc = edesc->hw_desc;
1183         u32 ivoffset = 0;
1184
1185         /*
1186          * AES-CTR needs to load IV in CONTEXT1 reg
1187          * at an offset of 128bits (16bytes)
1188          * CONTEXT1[255:128] = IV
1189          */
1190         if (ctr_mode)
1191                 ivoffset = 16;
1192
1193         /*
1194          * RFC3686 specific:
1195          *      CONTEXT1[255:128] = {NONCE, IV, COUNTER}
1196          */
1197         if (is_rfc3686)
1198                 ivoffset = 16 + CTR_RFC3686_NONCE_SIZE;
1199
1200         init_aead_job(req, edesc, all_contig, encrypt);
1201
1202         /*
1203          * {REG3, DPOVRD} = assoclen, depending on whether MATH command supports
1204          * having DPOVRD as destination.
1205          */
1206         if (ctrlpriv->era < 3)
1207                 append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen);
1208         else
1209                 append_math_add_imm_u32(desc, DPOVRD, ZERO, IMM, req->assoclen);
1210
1211         if (ivsize && ((is_rfc3686 && encrypt) || !alg->caam.geniv))
1212                 append_load_as_imm(desc, req->iv, ivsize,
1213                                    LDST_CLASS_1_CCB |
1214                                    LDST_SRCDST_BYTE_CONTEXT |
1215                                    (ivoffset << LDST_OFFSET_SHIFT));
1216 }
1217
1218 /*
1219  * Fill in skcipher job descriptor
1220  */
1221 static void init_skcipher_job(struct skcipher_request *req,
1222                               struct skcipher_edesc *edesc,
1223                               const bool encrypt)
1224 {
1225         struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
1226         struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
1227         struct device *jrdev = ctx->jrdev;
1228         int ivsize = crypto_skcipher_ivsize(skcipher);
1229         u32 *desc = edesc->hw_desc;
1230         u32 *sh_desc;
1231         u32 in_options = 0, out_options = 0;
1232         dma_addr_t src_dma, dst_dma, ptr;
1233         int len, sec4_sg_index = 0;
1234
1235         print_hex_dump_debug("presciv@"__stringify(__LINE__)": ",
1236                              DUMP_PREFIX_ADDRESS, 16, 4, req->iv, ivsize, 1);
1237         dev_dbg(jrdev, "asked=%d, cryptlen%d\n",
1238                (int)edesc->src_nents > 1 ? 100 : req->cryptlen, req->cryptlen);
1239
1240         caam_dump_sg("src    @" __stringify(__LINE__)": ",
1241                      DUMP_PREFIX_ADDRESS, 16, 4, req->src,
1242                      edesc->src_nents > 1 ? 100 : req->cryptlen, 1);
1243
1244         sh_desc = encrypt ? ctx->sh_desc_enc : ctx->sh_desc_dec;
1245         ptr = encrypt ? ctx->sh_desc_enc_dma : ctx->sh_desc_dec_dma;
1246
1247         len = desc_len(sh_desc);
1248         init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE);
1249
1250         if (ivsize || edesc->mapped_src_nents > 1) {
1251                 src_dma = edesc->sec4_sg_dma;
1252                 sec4_sg_index = edesc->mapped_src_nents + !!ivsize;
1253                 in_options = LDST_SGF;
1254         } else {
1255                 src_dma = sg_dma_address(req->src);
1256         }
1257
1258         append_seq_in_ptr(desc, src_dma, req->cryptlen + ivsize, in_options);
1259
1260         if (likely(req->src == req->dst)) {
1261                 dst_dma = src_dma + !!ivsize * sizeof(struct sec4_sg_entry);
1262                 out_options = in_options;
1263         } else if (!ivsize && edesc->mapped_dst_nents == 1) {
1264                 dst_dma = sg_dma_address(req->dst);
1265         } else {
1266                 dst_dma = edesc->sec4_sg_dma + sec4_sg_index *
1267                           sizeof(struct sec4_sg_entry);
1268                 out_options = LDST_SGF;
1269         }
1270
1271         append_seq_out_ptr(desc, dst_dma, req->cryptlen + ivsize, out_options);
1272 }
1273
1274 /*
1275  * allocate and map the aead extended descriptor
1276  */
1277 static struct aead_edesc *aead_edesc_alloc(struct aead_request *req,
1278                                            int desc_bytes, bool *all_contig_ptr,
1279                                            bool encrypt)
1280 {
1281         struct crypto_aead *aead = crypto_aead_reqtfm(req);
1282         struct caam_ctx *ctx = crypto_aead_ctx(aead);
1283         struct device *jrdev = ctx->jrdev;
1284         struct caam_aead_req_ctx *rctx = aead_request_ctx(req);
1285         gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
1286                        GFP_KERNEL : GFP_ATOMIC;
1287         int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0;
1288         int src_len, dst_len = 0;
1289         struct aead_edesc *edesc;
1290         int sec4_sg_index, sec4_sg_len, sec4_sg_bytes;
1291         unsigned int authsize = ctx->authsize;
1292
1293         if (unlikely(req->dst != req->src)) {
1294                 src_len = req->assoclen + req->cryptlen;
1295                 dst_len = src_len + (encrypt ? authsize : (-authsize));
1296
1297                 src_nents = sg_nents_for_len(req->src, src_len);
1298                 if (unlikely(src_nents < 0)) {
1299                         dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n",
1300                                 src_len);
1301                         return ERR_PTR(src_nents);
1302                 }
1303
1304                 dst_nents = sg_nents_for_len(req->dst, dst_len);
1305                 if (unlikely(dst_nents < 0)) {
1306                         dev_err(jrdev, "Insufficient bytes (%d) in dst S/G\n",
1307                                 dst_len);
1308                         return ERR_PTR(dst_nents);
1309                 }
1310         } else {
1311                 src_len = req->assoclen + req->cryptlen +
1312                           (encrypt ? authsize : 0);
1313
1314                 src_nents = sg_nents_for_len(req->src, src_len);
1315                 if (unlikely(src_nents < 0)) {
1316                         dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n",
1317                                 src_len);
1318                         return ERR_PTR(src_nents);
1319                 }
1320         }
1321
1322         if (likely(req->src == req->dst)) {
1323                 mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents,
1324                                               DMA_BIDIRECTIONAL);
1325                 if (unlikely(!mapped_src_nents)) {
1326                         dev_err(jrdev, "unable to map source\n");
1327                         return ERR_PTR(-ENOMEM);
1328                 }
1329         } else {
1330                 /* Cover also the case of null (zero length) input data */
1331                 if (src_nents) {
1332                         mapped_src_nents = dma_map_sg(jrdev, req->src,
1333                                                       src_nents, DMA_TO_DEVICE);
1334                         if (unlikely(!mapped_src_nents)) {
1335                                 dev_err(jrdev, "unable to map source\n");
1336                                 return ERR_PTR(-ENOMEM);
1337                         }
1338                 } else {
1339                         mapped_src_nents = 0;
1340                 }
1341
1342                 /* Cover also the case of null (zero length) output data */
1343                 if (dst_nents) {
1344                         mapped_dst_nents = dma_map_sg(jrdev, req->dst,
1345                                                       dst_nents,
1346                                                       DMA_FROM_DEVICE);
1347                         if (unlikely(!mapped_dst_nents)) {
1348                                 dev_err(jrdev, "unable to map destination\n");
1349                                 dma_unmap_sg(jrdev, req->src, src_nents,
1350                                              DMA_TO_DEVICE);
1351                                 return ERR_PTR(-ENOMEM);
1352                         }
1353                 } else {
1354                         mapped_dst_nents = 0;
1355                 }
1356         }
1357
1358         /*
1359          * HW reads 4 S/G entries at a time; make sure the reads don't go beyond
1360          * the end of the table by allocating more S/G entries.
1361          */
1362         sec4_sg_len = mapped_src_nents > 1 ? mapped_src_nents : 0;
1363         if (mapped_dst_nents > 1)
1364                 sec4_sg_len += pad_sg_nents(mapped_dst_nents);
1365         else
1366                 sec4_sg_len = pad_sg_nents(sec4_sg_len);
1367
1368         sec4_sg_bytes = sec4_sg_len * sizeof(struct sec4_sg_entry);
1369
1370         /* allocate space for base edesc and hw desc commands, link tables */
1371         edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes,
1372                         GFP_DMA | flags);
1373         if (!edesc) {
1374                 caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0,
1375                            0, 0, 0);
1376                 return ERR_PTR(-ENOMEM);
1377         }
1378
1379         edesc->src_nents = src_nents;
1380         edesc->dst_nents = dst_nents;
1381         edesc->mapped_src_nents = mapped_src_nents;
1382         edesc->mapped_dst_nents = mapped_dst_nents;
1383         edesc->sec4_sg = (void *)edesc + sizeof(struct aead_edesc) +
1384                          desc_bytes;
1385
1386         rctx->edesc = edesc;
1387
1388         *all_contig_ptr = !(mapped_src_nents > 1);
1389
1390         sec4_sg_index = 0;
1391         if (mapped_src_nents > 1) {
1392                 sg_to_sec4_sg_last(req->src, src_len,
1393                                    edesc->sec4_sg + sec4_sg_index, 0);
1394                 sec4_sg_index += mapped_src_nents;
1395         }
1396         if (mapped_dst_nents > 1) {
1397                 sg_to_sec4_sg_last(req->dst, dst_len,
1398                                    edesc->sec4_sg + sec4_sg_index, 0);
1399         }
1400
1401         if (!sec4_sg_bytes)
1402                 return edesc;
1403
1404         edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
1405                                             sec4_sg_bytes, DMA_TO_DEVICE);
1406         if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) {
1407                 dev_err(jrdev, "unable to map S/G table\n");
1408                 aead_unmap(jrdev, edesc, req);
1409                 kfree(edesc);
1410                 return ERR_PTR(-ENOMEM);
1411         }
1412
1413         edesc->sec4_sg_bytes = sec4_sg_bytes;
1414
1415         return edesc;
1416 }
1417
1418 static int aead_enqueue_req(struct device *jrdev, struct aead_request *req)
1419 {
1420         struct caam_drv_private_jr *jrpriv = dev_get_drvdata(jrdev);
1421         struct caam_aead_req_ctx *rctx = aead_request_ctx(req);
1422         struct aead_edesc *edesc = rctx->edesc;
1423         u32 *desc = edesc->hw_desc;
1424         int ret;
1425
1426         /*
1427          * Only the backlog request are sent to crypto-engine since the others
1428          * can be handled by CAAM, if free, especially since JR has up to 1024
1429          * entries (more than the 10 entries from crypto-engine).
1430          */
1431         if (req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)
1432                 ret = crypto_transfer_aead_request_to_engine(jrpriv->engine,
1433                                                              req);
1434         else
1435                 ret = caam_jr_enqueue(jrdev, desc, aead_crypt_done, req);
1436
1437         if ((ret != -EINPROGRESS) && (ret != -EBUSY)) {
1438                 aead_unmap(jrdev, edesc, req);
1439                 kfree(rctx->edesc);
1440         }
1441
1442         return ret;
1443 }
1444
1445 static inline int chachapoly_crypt(struct aead_request *req, bool encrypt)
1446 {
1447         struct aead_edesc *edesc;
1448         struct crypto_aead *aead = crypto_aead_reqtfm(req);
1449         struct caam_ctx *ctx = crypto_aead_ctx(aead);
1450         struct device *jrdev = ctx->jrdev;
1451         bool all_contig;
1452         u32 *desc;
1453
1454         edesc = aead_edesc_alloc(req, CHACHAPOLY_DESC_JOB_IO_LEN, &all_contig,
1455                                  encrypt);
1456         if (IS_ERR(edesc))
1457                 return PTR_ERR(edesc);
1458
1459         desc = edesc->hw_desc;
1460
1461         init_chachapoly_job(req, edesc, all_contig, encrypt);
1462         print_hex_dump_debug("chachapoly jobdesc@" __stringify(__LINE__)": ",
1463                              DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
1464                              1);
1465
1466         return aead_enqueue_req(jrdev, req);
1467 }
1468
1469 static int chachapoly_encrypt(struct aead_request *req)
1470 {
1471         return chachapoly_crypt(req, true);
1472 }
1473
1474 static int chachapoly_decrypt(struct aead_request *req)
1475 {
1476         return chachapoly_crypt(req, false);
1477 }
1478
1479 static inline int aead_crypt(struct aead_request *req, bool encrypt)
1480 {
1481         struct aead_edesc *edesc;
1482         struct crypto_aead *aead = crypto_aead_reqtfm(req);
1483         struct caam_ctx *ctx = crypto_aead_ctx(aead);
1484         struct device *jrdev = ctx->jrdev;
1485         bool all_contig;
1486
1487         /* allocate extended descriptor */
1488         edesc = aead_edesc_alloc(req, AUTHENC_DESC_JOB_IO_LEN,
1489                                  &all_contig, encrypt);
1490         if (IS_ERR(edesc))
1491                 return PTR_ERR(edesc);
1492
1493         /* Create and submit job descriptor */
1494         init_authenc_job(req, edesc, all_contig, encrypt);
1495
1496         print_hex_dump_debug("aead jobdesc@"__stringify(__LINE__)": ",
1497                              DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
1498                              desc_bytes(edesc->hw_desc), 1);
1499
1500         return aead_enqueue_req(jrdev, req);
1501 }
1502
1503 static int aead_encrypt(struct aead_request *req)
1504 {
1505         return aead_crypt(req, true);
1506 }
1507
1508 static int aead_decrypt(struct aead_request *req)
1509 {
1510         return aead_crypt(req, false);
1511 }
1512
1513 static int aead_do_one_req(struct crypto_engine *engine, void *areq)
1514 {
1515         struct aead_request *req = aead_request_cast(areq);
1516         struct caam_ctx *ctx = crypto_aead_ctx(crypto_aead_reqtfm(req));
1517         struct caam_aead_req_ctx *rctx = aead_request_ctx(req);
1518         u32 *desc = rctx->edesc->hw_desc;
1519         int ret;
1520
1521         rctx->edesc->bklog = true;
1522
1523         ret = caam_jr_enqueue(ctx->jrdev, desc, aead_crypt_done, req);
1524
1525         if (ret != -EINPROGRESS) {
1526                 aead_unmap(ctx->jrdev, rctx->edesc, req);
1527                 kfree(rctx->edesc);
1528         } else {
1529                 ret = 0;
1530         }
1531
1532         return ret;
1533 }
1534
1535 static inline int gcm_crypt(struct aead_request *req, bool encrypt)
1536 {
1537         struct aead_edesc *edesc;
1538         struct crypto_aead *aead = crypto_aead_reqtfm(req);
1539         struct caam_ctx *ctx = crypto_aead_ctx(aead);
1540         struct device *jrdev = ctx->jrdev;
1541         bool all_contig;
1542
1543         /* allocate extended descriptor */
1544         edesc = aead_edesc_alloc(req, GCM_DESC_JOB_IO_LEN, &all_contig,
1545                                  encrypt);
1546         if (IS_ERR(edesc))
1547                 return PTR_ERR(edesc);
1548
1549         /* Create and submit job descriptor */
1550         init_gcm_job(req, edesc, all_contig, encrypt);
1551
1552         print_hex_dump_debug("aead jobdesc@"__stringify(__LINE__)": ",
1553                              DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
1554                              desc_bytes(edesc->hw_desc), 1);
1555
1556         return aead_enqueue_req(jrdev, req);
1557 }
1558
1559 static int gcm_encrypt(struct aead_request *req)
1560 {
1561         return gcm_crypt(req, true);
1562 }
1563
1564 static int gcm_decrypt(struct aead_request *req)
1565 {
1566         return gcm_crypt(req, false);
1567 }
1568
1569 static int ipsec_gcm_encrypt(struct aead_request *req)
1570 {
1571         return crypto_ipsec_check_assoclen(req->assoclen) ? : gcm_encrypt(req);
1572 }
1573
1574 static int ipsec_gcm_decrypt(struct aead_request *req)
1575 {
1576         return crypto_ipsec_check_assoclen(req->assoclen) ? : gcm_decrypt(req);
1577 }
1578
1579 /*
1580  * allocate and map the skcipher extended descriptor for skcipher
1581  */
1582 static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
1583                                                    int desc_bytes)
1584 {
1585         struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
1586         struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
1587         struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req);
1588         struct device *jrdev = ctx->jrdev;
1589         gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
1590                        GFP_KERNEL : GFP_ATOMIC;
1591         int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0;
1592         struct skcipher_edesc *edesc;
1593         dma_addr_t iv_dma = 0;
1594         u8 *iv;
1595         int ivsize = crypto_skcipher_ivsize(skcipher);
1596         int dst_sg_idx, sec4_sg_ents, sec4_sg_bytes;
1597
1598         src_nents = sg_nents_for_len(req->src, req->cryptlen);
1599         if (unlikely(src_nents < 0)) {
1600                 dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n",
1601                         req->cryptlen);
1602                 return ERR_PTR(src_nents);
1603         }
1604
1605         if (req->dst != req->src) {
1606                 dst_nents = sg_nents_for_len(req->dst, req->cryptlen);
1607                 if (unlikely(dst_nents < 0)) {
1608                         dev_err(jrdev, "Insufficient bytes (%d) in dst S/G\n",
1609                                 req->cryptlen);
1610                         return ERR_PTR(dst_nents);
1611                 }
1612         }
1613
1614         if (likely(req->src == req->dst)) {
1615                 mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents,
1616                                               DMA_BIDIRECTIONAL);
1617                 if (unlikely(!mapped_src_nents)) {
1618                         dev_err(jrdev, "unable to map source\n");
1619                         return ERR_PTR(-ENOMEM);
1620                 }
1621         } else {
1622                 mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents,
1623                                               DMA_TO_DEVICE);
1624                 if (unlikely(!mapped_src_nents)) {
1625                         dev_err(jrdev, "unable to map source\n");
1626                         return ERR_PTR(-ENOMEM);
1627                 }
1628                 mapped_dst_nents = dma_map_sg(jrdev, req->dst, dst_nents,
1629                                               DMA_FROM_DEVICE);
1630                 if (unlikely(!mapped_dst_nents)) {
1631                         dev_err(jrdev, "unable to map destination\n");
1632                         dma_unmap_sg(jrdev, req->src, src_nents, DMA_TO_DEVICE);
1633                         return ERR_PTR(-ENOMEM);
1634                 }
1635         }
1636
1637         if (!ivsize && mapped_src_nents == 1)
1638                 sec4_sg_ents = 0; // no need for an input hw s/g table
1639         else
1640                 sec4_sg_ents = mapped_src_nents + !!ivsize;
1641         dst_sg_idx = sec4_sg_ents;
1642
1643         /*
1644          * Input, output HW S/G tables: [IV, src][dst, IV]
1645          * IV entries point to the same buffer
1646          * If src == dst, S/G entries are reused (S/G tables overlap)
1647          *
1648          * HW reads 4 S/G entries at a time; make sure the reads don't go beyond
1649          * the end of the table by allocating more S/G entries. Logic:
1650          * if (output S/G)
1651          *      pad output S/G, if needed
1652          * else if (input S/G) ...
1653          *      pad input S/G, if needed
1654          */
1655         if (ivsize || mapped_dst_nents > 1) {
1656                 if (req->src == req->dst)
1657                         sec4_sg_ents = !!ivsize + pad_sg_nents(sec4_sg_ents);
1658                 else
1659                         sec4_sg_ents += pad_sg_nents(mapped_dst_nents +
1660                                                      !!ivsize);
1661         } else {
1662                 sec4_sg_ents = pad_sg_nents(sec4_sg_ents);
1663         }
1664
1665         sec4_sg_bytes = sec4_sg_ents * sizeof(struct sec4_sg_entry);
1666
1667         /*
1668          * allocate space for base edesc and hw desc commands, link tables, IV
1669          */
1670         edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes + ivsize,
1671                         GFP_DMA | flags);
1672         if (!edesc) {
1673                 dev_err(jrdev, "could not allocate extended descriptor\n");
1674                 caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0,
1675                            0, 0, 0);
1676                 return ERR_PTR(-ENOMEM);
1677         }
1678
1679         edesc->src_nents = src_nents;
1680         edesc->dst_nents = dst_nents;
1681         edesc->mapped_src_nents = mapped_src_nents;
1682         edesc->mapped_dst_nents = mapped_dst_nents;
1683         edesc->sec4_sg_bytes = sec4_sg_bytes;
1684         edesc->sec4_sg = (struct sec4_sg_entry *)((u8 *)edesc->hw_desc +
1685                                                   desc_bytes);
1686         rctx->edesc = edesc;
1687
1688         /* Make sure IV is located in a DMAable area */
1689         if (ivsize) {
1690                 iv = (u8 *)edesc->sec4_sg + sec4_sg_bytes;
1691                 memcpy(iv, req->iv, ivsize);
1692
1693                 iv_dma = dma_map_single(jrdev, iv, ivsize, DMA_BIDIRECTIONAL);
1694                 if (dma_mapping_error(jrdev, iv_dma)) {
1695                         dev_err(jrdev, "unable to map IV\n");
1696                         caam_unmap(jrdev, req->src, req->dst, src_nents,
1697                                    dst_nents, 0, 0, 0, 0);
1698                         kfree(edesc);
1699                         return ERR_PTR(-ENOMEM);
1700                 }
1701
1702                 dma_to_sec4_sg_one(edesc->sec4_sg, iv_dma, ivsize, 0);
1703         }
1704         if (dst_sg_idx)
1705                 sg_to_sec4_sg(req->src, req->cryptlen, edesc->sec4_sg +
1706                               !!ivsize, 0);
1707
1708         if (req->src != req->dst && (ivsize || mapped_dst_nents > 1))
1709                 sg_to_sec4_sg(req->dst, req->cryptlen, edesc->sec4_sg +
1710                               dst_sg_idx, 0);
1711
1712         if (ivsize)
1713                 dma_to_sec4_sg_one(edesc->sec4_sg + dst_sg_idx +
1714                                    mapped_dst_nents, iv_dma, ivsize, 0);
1715
1716         if (ivsize || mapped_dst_nents > 1)
1717                 sg_to_sec4_set_last(edesc->sec4_sg + dst_sg_idx +
1718                                     mapped_dst_nents - 1 + !!ivsize);
1719
1720         if (sec4_sg_bytes) {
1721                 edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
1722                                                     sec4_sg_bytes,
1723                                                     DMA_TO_DEVICE);
1724                 if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) {
1725                         dev_err(jrdev, "unable to map S/G table\n");
1726                         caam_unmap(jrdev, req->src, req->dst, src_nents,
1727                                    dst_nents, iv_dma, ivsize, 0, 0);
1728                         kfree(edesc);
1729                         return ERR_PTR(-ENOMEM);
1730                 }
1731         }
1732
1733         edesc->iv_dma = iv_dma;
1734
1735         print_hex_dump_debug("skcipher sec4_sg@" __stringify(__LINE__)": ",
1736                              DUMP_PREFIX_ADDRESS, 16, 4, edesc->sec4_sg,
1737                              sec4_sg_bytes, 1);
1738
1739         return edesc;
1740 }
1741
1742 static int skcipher_do_one_req(struct crypto_engine *engine, void *areq)
1743 {
1744         struct skcipher_request *req = skcipher_request_cast(areq);
1745         struct caam_ctx *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req));
1746         struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req);
1747         u32 *desc = rctx->edesc->hw_desc;
1748         int ret;
1749
1750         rctx->edesc->bklog = true;
1751
1752         ret = caam_jr_enqueue(ctx->jrdev, desc, skcipher_crypt_done, req);
1753
1754         if (ret != -EINPROGRESS) {
1755                 skcipher_unmap(ctx->jrdev, rctx->edesc, req);
1756                 kfree(rctx->edesc);
1757         } else {
1758                 ret = 0;
1759         }
1760
1761         return ret;
1762 }
1763
1764 static inline int skcipher_crypt(struct skcipher_request *req, bool encrypt)
1765 {
1766         struct skcipher_edesc *edesc;
1767         struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
1768         struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher);
1769         struct device *jrdev = ctx->jrdev;
1770         struct caam_drv_private_jr *jrpriv = dev_get_drvdata(jrdev);
1771         u32 *desc;
1772         int ret = 0;
1773
1774         if (!req->cryptlen)
1775                 return 0;
1776
1777         /* allocate extended descriptor */
1778         edesc = skcipher_edesc_alloc(req, DESC_JOB_IO_LEN * CAAM_CMD_SZ);
1779         if (IS_ERR(edesc))
1780                 return PTR_ERR(edesc);
1781
1782         /* Create and submit job descriptor*/
1783         init_skcipher_job(req, edesc, encrypt);
1784
1785         print_hex_dump_debug("skcipher jobdesc@" __stringify(__LINE__)": ",
1786                              DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
1787                              desc_bytes(edesc->hw_desc), 1);
1788
1789         desc = edesc->hw_desc;
1790         /*
1791          * Only the backlog request are sent to crypto-engine since the others
1792          * can be handled by CAAM, if free, especially since JR has up to 1024
1793          * entries (more than the 10 entries from crypto-engine).
1794          */
1795         if (req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)
1796                 ret = crypto_transfer_skcipher_request_to_engine(jrpriv->engine,
1797                                                                  req);
1798         else
1799                 ret = caam_jr_enqueue(jrdev, desc, skcipher_crypt_done, req);
1800
1801         if ((ret != -EINPROGRESS) && (ret != -EBUSY)) {
1802                 skcipher_unmap(jrdev, edesc, req);
1803                 kfree(edesc);
1804         }
1805
1806         return ret;
1807 }
1808
1809 static int skcipher_encrypt(struct skcipher_request *req)
1810 {
1811         return skcipher_crypt(req, true);
1812 }
1813
1814 static int skcipher_decrypt(struct skcipher_request *req)
1815 {
1816         return skcipher_crypt(req, false);
1817 }
1818
1819 static struct caam_skcipher_alg driver_algs[] = {
1820         {
1821                 .skcipher = {
1822                         .base = {
1823                                 .cra_name = "cbc(aes)",
1824                                 .cra_driver_name = "cbc-aes-caam",
1825                                 .cra_blocksize = AES_BLOCK_SIZE,
1826                         },
1827                         .setkey = aes_skcipher_setkey,
1828                         .encrypt = skcipher_encrypt,
1829                         .decrypt = skcipher_decrypt,
1830                         .min_keysize = AES_MIN_KEY_SIZE,
1831                         .max_keysize = AES_MAX_KEY_SIZE,
1832                         .ivsize = AES_BLOCK_SIZE,
1833                 },
1834                 .caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
1835         },
1836         {
1837                 .skcipher = {
1838                         .base = {
1839                                 .cra_name = "cbc(des3_ede)",
1840                                 .cra_driver_name = "cbc-3des-caam",
1841                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
1842                         },
1843                         .setkey = des3_skcipher_setkey,
1844                         .encrypt = skcipher_encrypt,
1845                         .decrypt = skcipher_decrypt,
1846                         .min_keysize = DES3_EDE_KEY_SIZE,
1847                         .max_keysize = DES3_EDE_KEY_SIZE,
1848                         .ivsize = DES3_EDE_BLOCK_SIZE,
1849                 },
1850                 .caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
1851         },
1852         {
1853                 .skcipher = {
1854                         .base = {
1855                                 .cra_name = "cbc(des)",
1856                                 .cra_driver_name = "cbc-des-caam",
1857                                 .cra_blocksize = DES_BLOCK_SIZE,
1858                         },
1859                         .setkey = des_skcipher_setkey,
1860                         .encrypt = skcipher_encrypt,
1861                         .decrypt = skcipher_decrypt,
1862                         .min_keysize = DES_KEY_SIZE,
1863                         .max_keysize = DES_KEY_SIZE,
1864                         .ivsize = DES_BLOCK_SIZE,
1865                 },
1866                 .caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
1867         },
1868         {
1869                 .skcipher = {
1870                         .base = {
1871                                 .cra_name = "ctr(aes)",
1872                                 .cra_driver_name = "ctr-aes-caam",
1873                                 .cra_blocksize = 1,
1874                         },
1875                         .setkey = ctr_skcipher_setkey,
1876                         .encrypt = skcipher_encrypt,
1877                         .decrypt = skcipher_decrypt,
1878                         .min_keysize = AES_MIN_KEY_SIZE,
1879                         .max_keysize = AES_MAX_KEY_SIZE,
1880                         .ivsize = AES_BLOCK_SIZE,
1881                         .chunksize = AES_BLOCK_SIZE,
1882                 },
1883                 .caam.class1_alg_type = OP_ALG_ALGSEL_AES |
1884                                         OP_ALG_AAI_CTR_MOD128,
1885         },
1886         {
1887                 .skcipher = {
1888                         .base = {
1889                                 .cra_name = "rfc3686(ctr(aes))",
1890                                 .cra_driver_name = "rfc3686-ctr-aes-caam",
1891                                 .cra_blocksize = 1,
1892                         },
1893                         .setkey = rfc3686_skcipher_setkey,
1894                         .encrypt = skcipher_encrypt,
1895                         .decrypt = skcipher_decrypt,
1896                         .min_keysize = AES_MIN_KEY_SIZE +
1897                                        CTR_RFC3686_NONCE_SIZE,
1898                         .max_keysize = AES_MAX_KEY_SIZE +
1899                                        CTR_RFC3686_NONCE_SIZE,
1900                         .ivsize = CTR_RFC3686_IV_SIZE,
1901                         .chunksize = AES_BLOCK_SIZE,
1902                 },
1903                 .caam = {
1904                         .class1_alg_type = OP_ALG_ALGSEL_AES |
1905                                            OP_ALG_AAI_CTR_MOD128,
1906                         .rfc3686 = true,
1907                 },
1908         },
1909         {
1910                 .skcipher = {
1911                         .base = {
1912                                 .cra_name = "xts(aes)",
1913                                 .cra_driver_name = "xts-aes-caam",
1914                                 .cra_blocksize = AES_BLOCK_SIZE,
1915                         },
1916                         .setkey = xts_skcipher_setkey,
1917                         .encrypt = skcipher_encrypt,
1918                         .decrypt = skcipher_decrypt,
1919                         .min_keysize = 2 * AES_MIN_KEY_SIZE,
1920                         .max_keysize = 2 * AES_MAX_KEY_SIZE,
1921                         .ivsize = AES_BLOCK_SIZE,
1922                 },
1923                 .caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_XTS,
1924         },
1925         {
1926                 .skcipher = {
1927                         .base = {
1928                                 .cra_name = "ecb(des)",
1929                                 .cra_driver_name = "ecb-des-caam",
1930                                 .cra_blocksize = DES_BLOCK_SIZE,
1931                         },
1932                         .setkey = des_skcipher_setkey,
1933                         .encrypt = skcipher_encrypt,
1934                         .decrypt = skcipher_decrypt,
1935                         .min_keysize = DES_KEY_SIZE,
1936                         .max_keysize = DES_KEY_SIZE,
1937                 },
1938                 .caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_ECB,
1939         },
1940         {
1941                 .skcipher = {
1942                         .base = {
1943                                 .cra_name = "ecb(aes)",
1944                                 .cra_driver_name = "ecb-aes-caam",
1945                                 .cra_blocksize = AES_BLOCK_SIZE,
1946                         },
1947                         .setkey = aes_skcipher_setkey,
1948                         .encrypt = skcipher_encrypt,
1949                         .decrypt = skcipher_decrypt,
1950                         .min_keysize = AES_MIN_KEY_SIZE,
1951                         .max_keysize = AES_MAX_KEY_SIZE,
1952                 },
1953                 .caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_ECB,
1954         },
1955         {
1956                 .skcipher = {
1957                         .base = {
1958                                 .cra_name = "ecb(des3_ede)",
1959                                 .cra_driver_name = "ecb-des3-caam",
1960                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
1961                         },
1962                         .setkey = des3_skcipher_setkey,
1963                         .encrypt = skcipher_encrypt,
1964                         .decrypt = skcipher_decrypt,
1965                         .min_keysize = DES3_EDE_KEY_SIZE,
1966                         .max_keysize = DES3_EDE_KEY_SIZE,
1967                 },
1968                 .caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_ECB,
1969         },
1970         {
1971                 .skcipher = {
1972                         .base = {
1973                                 .cra_name = "ecb(arc4)",
1974                                 .cra_driver_name = "ecb-arc4-caam",
1975                                 .cra_blocksize = ARC4_BLOCK_SIZE,
1976                         },
1977                         .setkey = arc4_skcipher_setkey,
1978                         .encrypt = skcipher_encrypt,
1979                         .decrypt = skcipher_decrypt,
1980                         .min_keysize = ARC4_MIN_KEY_SIZE,
1981                         .max_keysize = ARC4_MAX_KEY_SIZE,
1982                 },
1983                 .caam.class1_alg_type = OP_ALG_ALGSEL_ARC4 | OP_ALG_AAI_ECB,
1984         },
1985 };
1986
1987 static struct caam_aead_alg driver_aeads[] = {
1988         {
1989                 .aead = {
1990                         .base = {
1991                                 .cra_name = "rfc4106(gcm(aes))",
1992                                 .cra_driver_name = "rfc4106-gcm-aes-caam",
1993                                 .cra_blocksize = 1,
1994                         },
1995                         .setkey = rfc4106_setkey,
1996                         .setauthsize = rfc4106_setauthsize,
1997                         .encrypt = ipsec_gcm_encrypt,
1998                         .decrypt = ipsec_gcm_decrypt,
1999                         .ivsize = GCM_RFC4106_IV_SIZE,
2000                         .maxauthsize = AES_BLOCK_SIZE,
2001                 },
2002                 .caam = {
2003                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
2004                         .nodkp = true,
2005                 },
2006         },
2007         {
2008                 .aead = {
2009                         .base = {
2010                                 .cra_name = "rfc4543(gcm(aes))",
2011                                 .cra_driver_name = "rfc4543-gcm-aes-caam",
2012                                 .cra_blocksize = 1,
2013                         },
2014                         .setkey = rfc4543_setkey,
2015                         .setauthsize = rfc4543_setauthsize,
2016                         .encrypt = ipsec_gcm_encrypt,
2017                         .decrypt = ipsec_gcm_decrypt,
2018                         .ivsize = GCM_RFC4543_IV_SIZE,
2019                         .maxauthsize = AES_BLOCK_SIZE,
2020                 },
2021                 .caam = {
2022                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
2023                         .nodkp = true,
2024                 },
2025         },
2026         /* Galois Counter Mode */
2027         {
2028                 .aead = {
2029                         .base = {
2030                                 .cra_name = "gcm(aes)",
2031                                 .cra_driver_name = "gcm-aes-caam",
2032                                 .cra_blocksize = 1,
2033                         },
2034                         .setkey = gcm_setkey,
2035                         .setauthsize = gcm_setauthsize,
2036                         .encrypt = gcm_encrypt,
2037                         .decrypt = gcm_decrypt,
2038                         .ivsize = GCM_AES_IV_SIZE,
2039                         .maxauthsize = AES_BLOCK_SIZE,
2040                 },
2041                 .caam = {
2042                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
2043                         .nodkp = true,
2044                 },
2045         },
2046         /* single-pass ipsec_esp descriptor */
2047         {
2048                 .aead = {
2049                         .base = {
2050                                 .cra_name = "authenc(hmac(md5),"
2051                                             "ecb(cipher_null))",
2052                                 .cra_driver_name = "authenc-hmac-md5-"
2053                                                    "ecb-cipher_null-caam",
2054                                 .cra_blocksize = NULL_BLOCK_SIZE,
2055                         },
2056                         .setkey = aead_setkey,
2057                         .setauthsize = aead_setauthsize,
2058                         .encrypt = aead_encrypt,
2059                         .decrypt = aead_decrypt,
2060                         .ivsize = NULL_IV_SIZE,
2061                         .maxauthsize = MD5_DIGEST_SIZE,
2062                 },
2063                 .caam = {
2064                         .class2_alg_type = OP_ALG_ALGSEL_MD5 |
2065                                            OP_ALG_AAI_HMAC_PRECOMP,
2066                 },
2067         },
2068         {
2069                 .aead = {
2070                         .base = {
2071                                 .cra_name = "authenc(hmac(sha1),"
2072                                             "ecb(cipher_null))",
2073                                 .cra_driver_name = "authenc-hmac-sha1-"
2074                                                    "ecb-cipher_null-caam",
2075                                 .cra_blocksize = NULL_BLOCK_SIZE,
2076                         },
2077                         .setkey = aead_setkey,
2078                         .setauthsize = aead_setauthsize,
2079                         .encrypt = aead_encrypt,
2080                         .decrypt = aead_decrypt,
2081                         .ivsize = NULL_IV_SIZE,
2082                         .maxauthsize = SHA1_DIGEST_SIZE,
2083                 },
2084                 .caam = {
2085                         .class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2086                                            OP_ALG_AAI_HMAC_PRECOMP,
2087                 },
2088         },
2089         {
2090                 .aead = {
2091                         .base = {
2092                                 .cra_name = "authenc(hmac(sha224),"
2093                                             "ecb(cipher_null))",
2094                                 .cra_driver_name = "authenc-hmac-sha224-"
2095                                                    "ecb-cipher_null-caam",
2096                                 .cra_blocksize = NULL_BLOCK_SIZE,
2097                         },
2098                         .setkey = aead_setkey,
2099                         .setauthsize = aead_setauthsize,
2100                         .encrypt = aead_encrypt,
2101                         .decrypt = aead_decrypt,
2102                         .ivsize = NULL_IV_SIZE,
2103                         .maxauthsize = SHA224_DIGEST_SIZE,
2104                 },
2105                 .caam = {
2106                         .class2_alg_type = OP_ALG_ALGSEL_SHA224 |
2107                                            OP_ALG_AAI_HMAC_PRECOMP,
2108                 },
2109         },
2110         {
2111                 .aead = {
2112                         .base = {
2113                                 .cra_name = "authenc(hmac(sha256),"
2114                                             "ecb(cipher_null))",
2115                                 .cra_driver_name = "authenc-hmac-sha256-"
2116                                                    "ecb-cipher_null-caam",
2117                                 .cra_blocksize = NULL_BLOCK_SIZE,
2118                         },
2119                         .setkey = aead_setkey,
2120                         .setauthsize = aead_setauthsize,
2121                         .encrypt = aead_encrypt,
2122                         .decrypt = aead_decrypt,
2123                         .ivsize = NULL_IV_SIZE,
2124                         .maxauthsize = SHA256_DIGEST_SIZE,
2125                 },
2126                 .caam = {
2127                         .class2_alg_type = OP_ALG_ALGSEL_SHA256 |
2128                                            OP_ALG_AAI_HMAC_PRECOMP,
2129                 },
2130         },
2131         {
2132                 .aead = {
2133                         .base = {
2134                                 .cra_name = "authenc(hmac(sha384),"
2135                                             "ecb(cipher_null))",
2136                                 .cra_driver_name = "authenc-hmac-sha384-"
2137                                                    "ecb-cipher_null-caam",
2138                                 .cra_blocksize = NULL_BLOCK_SIZE,
2139                         },
2140                         .setkey = aead_setkey,
2141                         .setauthsize = aead_setauthsize,
2142                         .encrypt = aead_encrypt,
2143                         .decrypt = aead_decrypt,
2144                         .ivsize = NULL_IV_SIZE,
2145                         .maxauthsize = SHA384_DIGEST_SIZE,
2146                 },
2147                 .caam = {
2148                         .class2_alg_type = OP_ALG_ALGSEL_SHA384 |
2149                                            OP_ALG_AAI_HMAC_PRECOMP,
2150                 },
2151         },
2152         {
2153                 .aead = {
2154                         .base = {
2155                                 .cra_name = "authenc(hmac(sha512),"
2156                                             "ecb(cipher_null))",
2157                                 .cra_driver_name = "authenc-hmac-sha512-"
2158                                                    "ecb-cipher_null-caam",
2159                                 .cra_blocksize = NULL_BLOCK_SIZE,
2160                         },
2161                         .setkey = aead_setkey,
2162                         .setauthsize = aead_setauthsize,
2163                         .encrypt = aead_encrypt,
2164                         .decrypt = aead_decrypt,
2165                         .ivsize = NULL_IV_SIZE,
2166                         .maxauthsize = SHA512_DIGEST_SIZE,
2167                 },
2168                 .caam = {
2169                         .class2_alg_type = OP_ALG_ALGSEL_SHA512 |
2170                                            OP_ALG_AAI_HMAC_PRECOMP,
2171                 },
2172         },
2173         {
2174                 .aead = {
2175                         .base = {
2176                                 .cra_name = "authenc(hmac(md5),cbc(aes))",
2177                                 .cra_driver_name = "authenc-hmac-md5-"
2178                                                    "cbc-aes-caam",
2179                                 .cra_blocksize = AES_BLOCK_SIZE,
2180                         },
2181                         .setkey = aead_setkey,
2182                         .setauthsize = aead_setauthsize,
2183                         .encrypt = aead_encrypt,
2184                         .decrypt = aead_decrypt,
2185                         .ivsize = AES_BLOCK_SIZE,
2186                         .maxauthsize = MD5_DIGEST_SIZE,
2187                 },
2188                 .caam = {
2189                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2190                         .class2_alg_type = OP_ALG_ALGSEL_MD5 |
2191                                            OP_ALG_AAI_HMAC_PRECOMP,
2192                 },
2193         },
2194         {
2195                 .aead = {
2196                         .base = {
2197                                 .cra_name = "echainiv(authenc(hmac(md5),"
2198                                             "cbc(aes)))",
2199                                 .cra_driver_name = "echainiv-authenc-hmac-md5-"
2200                                                    "cbc-aes-caam",
2201                                 .cra_blocksize = AES_BLOCK_SIZE,
2202                         },
2203                         .setkey = aead_setkey,
2204                         .setauthsize = aead_setauthsize,
2205                         .encrypt = aead_encrypt,
2206                         .decrypt = aead_decrypt,
2207                         .ivsize = AES_BLOCK_SIZE,
2208                         .maxauthsize = MD5_DIGEST_SIZE,
2209                 },
2210                 .caam = {
2211                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2212                         .class2_alg_type = OP_ALG_ALGSEL_MD5 |
2213                                            OP_ALG_AAI_HMAC_PRECOMP,
2214                         .geniv = true,
2215                 },
2216         },
2217         {
2218                 .aead = {
2219                         .base = {
2220                                 .cra_name = "authenc(hmac(sha1),cbc(aes))",
2221                                 .cra_driver_name = "authenc-hmac-sha1-"
2222                                                    "cbc-aes-caam",
2223                                 .cra_blocksize = AES_BLOCK_SIZE,
2224                         },
2225                         .setkey = aead_setkey,
2226                         .setauthsize = aead_setauthsize,
2227                         .encrypt = aead_encrypt,
2228                         .decrypt = aead_decrypt,
2229                         .ivsize = AES_BLOCK_SIZE,
2230                         .maxauthsize = SHA1_DIGEST_SIZE,
2231                 },
2232                 .caam = {
2233                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2234                         .class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2235                                            OP_ALG_AAI_HMAC_PRECOMP,
2236                 },
2237         },
2238         {
2239                 .aead = {
2240                         .base = {
2241                                 .cra_name = "echainiv(authenc(hmac(sha1),"
2242                                             "cbc(aes)))",
2243                                 .cra_driver_name = "echainiv-authenc-"
2244                                                    "hmac-sha1-cbc-aes-caam",
2245                                 .cra_blocksize = AES_BLOCK_SIZE,
2246                         },
2247                         .setkey = aead_setkey,
2248                         .setauthsize = aead_setauthsize,
2249                         .encrypt = aead_encrypt,
2250                         .decrypt = aead_decrypt,
2251                         .ivsize = AES_BLOCK_SIZE,
2252                         .maxauthsize = SHA1_DIGEST_SIZE,
2253                 },
2254                 .caam = {
2255                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2256                         .class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2257                                            OP_ALG_AAI_HMAC_PRECOMP,
2258                         .geniv = true,
2259                 },
2260         },
2261         {
2262                 .aead = {
2263                         .base = {
2264                                 .cra_name = "authenc(hmac(sha224),cbc(aes))",
2265                                 .cra_driver_name = "authenc-hmac-sha224-"
2266                                                    "cbc-aes-caam",
2267                                 .cra_blocksize = AES_BLOCK_SIZE,
2268                         },
2269                         .setkey = aead_setkey,
2270                         .setauthsize = aead_setauthsize,
2271                         .encrypt = aead_encrypt,
2272                         .decrypt = aead_decrypt,
2273                         .ivsize = AES_BLOCK_SIZE,
2274                         .maxauthsize = SHA224_DIGEST_SIZE,
2275                 },
2276                 .caam = {
2277                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2278                         .class2_alg_type = OP_ALG_ALGSEL_SHA224 |
2279                                            OP_ALG_AAI_HMAC_PRECOMP,
2280                 },
2281         },
2282         {
2283                 .aead = {
2284                         .base = {
2285                                 .cra_name = "echainiv(authenc(hmac(sha224),"
2286                                             "cbc(aes)))",
2287                                 .cra_driver_name = "echainiv-authenc-"
2288                                                    "hmac-sha224-cbc-aes-caam",
2289                                 .cra_blocksize = AES_BLOCK_SIZE,
2290                         },
2291                         .setkey = aead_setkey,
2292                         .setauthsize = aead_setauthsize,
2293                         .encrypt = aead_encrypt,
2294                         .decrypt = aead_decrypt,
2295                         .ivsize = AES_BLOCK_SIZE,
2296                         .maxauthsize = SHA224_DIGEST_SIZE,
2297                 },
2298                 .caam = {
2299                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2300                         .class2_alg_type = OP_ALG_ALGSEL_SHA224 |
2301                                            OP_ALG_AAI_HMAC_PRECOMP,
2302                         .geniv = true,
2303                 },
2304         },
2305         {
2306                 .aead = {
2307                         .base = {
2308                                 .cra_name = "authenc(hmac(sha256),cbc(aes))",
2309                                 .cra_driver_name = "authenc-hmac-sha256-"
2310                                                    "cbc-aes-caam",
2311                                 .cra_blocksize = AES_BLOCK_SIZE,
2312                         },
2313                         .setkey = aead_setkey,
2314                         .setauthsize = aead_setauthsize,
2315                         .encrypt = aead_encrypt,
2316                         .decrypt = aead_decrypt,
2317                         .ivsize = AES_BLOCK_SIZE,
2318                         .maxauthsize = SHA256_DIGEST_SIZE,
2319                 },
2320                 .caam = {
2321                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2322                         .class2_alg_type = OP_ALG_ALGSEL_SHA256 |
2323                                            OP_ALG_AAI_HMAC_PRECOMP,
2324                 },
2325         },
2326         {
2327                 .aead = {
2328                         .base = {
2329                                 .cra_name = "echainiv(authenc(hmac(sha256),"
2330                                             "cbc(aes)))",
2331                                 .cra_driver_name = "echainiv-authenc-"
2332                                                    "hmac-sha256-cbc-aes-caam",
2333                                 .cra_blocksize = AES_BLOCK_SIZE,
2334                         },
2335                         .setkey = aead_setkey,
2336                         .setauthsize = aead_setauthsize,
2337                         .encrypt = aead_encrypt,
2338                         .decrypt = aead_decrypt,
2339                         .ivsize = AES_BLOCK_SIZE,
2340                         .maxauthsize = SHA256_DIGEST_SIZE,
2341                 },
2342                 .caam = {
2343                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2344                         .class2_alg_type = OP_ALG_ALGSEL_SHA256 |
2345                                            OP_ALG_AAI_HMAC_PRECOMP,
2346                         .geniv = true,
2347                 },
2348         },
2349         {
2350                 .aead = {
2351                         .base = {
2352                                 .cra_name = "authenc(hmac(sha384),cbc(aes))",
2353                                 .cra_driver_name = "authenc-hmac-sha384-"
2354                                                    "cbc-aes-caam",
2355                                 .cra_blocksize = AES_BLOCK_SIZE,
2356                         },
2357                         .setkey = aead_setkey,
2358                         .setauthsize = aead_setauthsize,
2359                         .encrypt = aead_encrypt,
2360                         .decrypt = aead_decrypt,
2361                         .ivsize = AES_BLOCK_SIZE,
2362                         .maxauthsize = SHA384_DIGEST_SIZE,
2363                 },
2364                 .caam = {
2365                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2366                         .class2_alg_type = OP_ALG_ALGSEL_SHA384 |
2367                                            OP_ALG_AAI_HMAC_PRECOMP,
2368                 },
2369         },
2370         {
2371                 .aead = {
2372                         .base = {
2373                                 .cra_name = "echainiv(authenc(hmac(sha384),"
2374                                             "cbc(aes)))",
2375                                 .cra_driver_name = "echainiv-authenc-"
2376                                                    "hmac-sha384-cbc-aes-caam",
2377                                 .cra_blocksize = AES_BLOCK_SIZE,
2378                         },
2379                         .setkey = aead_setkey,
2380                         .setauthsize = aead_setauthsize,
2381                         .encrypt = aead_encrypt,
2382                         .decrypt = aead_decrypt,
2383                         .ivsize = AES_BLOCK_SIZE,
2384                         .maxauthsize = SHA384_DIGEST_SIZE,
2385                 },
2386                 .caam = {
2387                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2388                         .class2_alg_type = OP_ALG_ALGSEL_SHA384 |
2389                                            OP_ALG_AAI_HMAC_PRECOMP,
2390                         .geniv = true,
2391                 },
2392         },
2393         {
2394                 .aead = {
2395                         .base = {
2396                                 .cra_name = "authenc(hmac(sha512),cbc(aes))",
2397                                 .cra_driver_name = "authenc-hmac-sha512-"
2398                                                    "cbc-aes-caam",
2399                                 .cra_blocksize = AES_BLOCK_SIZE,
2400                         },
2401                         .setkey = aead_setkey,
2402                         .setauthsize = aead_setauthsize,
2403                         .encrypt = aead_encrypt,
2404                         .decrypt = aead_decrypt,
2405                         .ivsize = AES_BLOCK_SIZE,
2406                         .maxauthsize = SHA512_DIGEST_SIZE,
2407                 },
2408                 .caam = {
2409                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2410                         .class2_alg_type = OP_ALG_ALGSEL_SHA512 |
2411                                            OP_ALG_AAI_HMAC_PRECOMP,
2412                 },
2413         },
2414         {
2415                 .aead = {
2416                         .base = {
2417                                 .cra_name = "echainiv(authenc(hmac(sha512),"
2418                                             "cbc(aes)))",
2419                                 .cra_driver_name = "echainiv-authenc-"
2420                                                    "hmac-sha512-cbc-aes-caam",
2421                                 .cra_blocksize = AES_BLOCK_SIZE,
2422                         },
2423                         .setkey = aead_setkey,
2424                         .setauthsize = aead_setauthsize,
2425                         .encrypt = aead_encrypt,
2426                         .decrypt = aead_decrypt,
2427                         .ivsize = AES_BLOCK_SIZE,
2428                         .maxauthsize = SHA512_DIGEST_SIZE,
2429                 },
2430                 .caam = {
2431                         .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2432                         .class2_alg_type = OP_ALG_ALGSEL_SHA512 |
2433                                            OP_ALG_AAI_HMAC_PRECOMP,
2434                         .geniv = true,
2435                 },
2436         },
2437         {
2438                 .aead = {
2439                         .base = {
2440                                 .cra_name = "authenc(hmac(md5),cbc(des3_ede))",
2441                                 .cra_driver_name = "authenc-hmac-md5-"
2442                                                    "cbc-des3_ede-caam",
2443                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2444                         },
2445                         .setkey = des3_aead_setkey,
2446                         .setauthsize = aead_setauthsize,
2447                         .encrypt = aead_encrypt,
2448                         .decrypt = aead_decrypt,
2449                         .ivsize = DES3_EDE_BLOCK_SIZE,
2450                         .maxauthsize = MD5_DIGEST_SIZE,
2451                 },
2452                 .caam = {
2453                         .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2454                         .class2_alg_type = OP_ALG_ALGSEL_MD5 |
2455                                            OP_ALG_AAI_HMAC_PRECOMP,
2456                 }
2457         },
2458         {
2459                 .aead = {
2460                         .base = {
2461                                 .cra_name = "echainiv(authenc(hmac(md5),"
2462                                             "cbc(des3_ede)))",
2463                                 .cra_driver_name = "echainiv-authenc-hmac-md5-"
2464                                                    "cbc-des3_ede-caam",
2465                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2466                         },
2467                         .setkey = des3_aead_setkey,
2468                         .setauthsize = aead_setauthsize,
2469                         .encrypt = aead_encrypt,
2470                         .decrypt = aead_decrypt,
2471                         .ivsize = DES3_EDE_BLOCK_SIZE,
2472                         .maxauthsize = MD5_DIGEST_SIZE,
2473                 },
2474                 .caam = {
2475                         .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2476                         .class2_alg_type = OP_ALG_ALGSEL_MD5 |
2477                                            OP_ALG_AAI_HMAC_PRECOMP,
2478                         .geniv = true,
2479                 }
2480         },
2481         {
2482                 .aead = {
2483                         .base = {
2484                                 .cra_name = "authenc(hmac(sha1),"
2485                                             "cbc(des3_ede))",
2486                                 .cra_driver_name = "authenc-hmac-sha1-"
2487                                                    "cbc-des3_ede-caam",
2488                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2489                         },
2490                         .setkey = des3_aead_setkey,
2491                         .setauthsize = aead_setauthsize,
2492                         .encrypt = aead_encrypt,
2493                         .decrypt = aead_decrypt,
2494                         .ivsize = DES3_EDE_BLOCK_SIZE,
2495                         .maxauthsize = SHA1_DIGEST_SIZE,
2496                 },
2497                 .caam = {
2498                         .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2499                         .class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2500                                            OP_ALG_AAI_HMAC_PRECOMP,
2501                 },
2502         },
2503         {
2504                 .aead = {
2505                         .base = {
2506                                 .cra_name = "echainiv(authenc(hmac(sha1),"
2507                                             "cbc(des3_ede)))",
2508                                 .cra_driver_name = "echainiv-authenc-"
2509                                                    "hmac-sha1-"
2510                                                    "cbc-des3_ede-caam",
2511                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2512                         },
2513                         .setkey = des3_aead_setkey,
2514                         .setauthsize = aead_setauthsize,
2515                         .encrypt = aead_encrypt,
2516                         .decrypt = aead_decrypt,
2517                         .ivsize = DES3_EDE_BLOCK_SIZE,
2518                         .maxauthsize = SHA1_DIGEST_SIZE,
2519                 },
2520                 .caam = {
2521                         .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2522                         .class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2523                                            OP_ALG_AAI_HMAC_PRECOMP,
2524                         .geniv = true,
2525                 },
2526         },
2527         {
2528                 .aead = {
2529                         .base = {
2530                                 .cra_name = "authenc(hmac(sha224),"
2531                                             "cbc(des3_ede))",
2532                                 .cra_driver_name = "authenc-hmac-sha224-"
2533                                                    "cbc-des3_ede-caam",
2534                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2535                         },
2536                         .setkey = des3_aead_setkey,
2537                         .setauthsize = aead_setauthsize,
2538                         .encrypt = aead_encrypt,
2539                         .decrypt = aead_decrypt,
2540                         .ivsize = DES3_EDE_BLOCK_SIZE,
2541                         .maxauthsize = SHA224_DIGEST_SIZE,
2542                 },
2543                 .caam = {
2544                         .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2545                         .class2_alg_type = OP_ALG_ALGSEL_SHA224 |
2546                                            OP_ALG_AAI_HMAC_PRECOMP,
2547                 },
2548         },
2549         {
2550                 .aead = {
2551                         .base = {
2552                                 .cra_name = "echainiv(authenc(hmac(sha224),"
2553                                             "cbc(des3_ede)))",
2554                                 .cra_driver_name = "echainiv-authenc-"
2555                                                    "hmac-sha224-"
2556                                                    "cbc-des3_ede-caam",
2557                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2558                         },
2559                         .setkey = des3_aead_setkey,
2560                         .setauthsize = aead_setauthsize,
2561                         .encrypt = aead_encrypt,
2562                         .decrypt = aead_decrypt,
2563                         .ivsize = DES3_EDE_BLOCK_SIZE,
2564                         .maxauthsize = SHA224_DIGEST_SIZE,
2565                 },
2566                 .caam = {
2567                         .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2568                         .class2_alg_type = OP_ALG_ALGSEL_SHA224 |
2569                                            OP_ALG_AAI_HMAC_PRECOMP,
2570                         .geniv = true,
2571                 },
2572         },
2573         {
2574                 .aead = {
2575                         .base = {
2576                                 .cra_name = "authenc(hmac(sha256),"
2577                                             "cbc(des3_ede))",
2578                                 .cra_driver_name = "authenc-hmac-sha256-"
2579                                                    "cbc-des3_ede-caam",
2580                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2581                         },
2582                         .setkey = des3_aead_setkey,
2583                         .setauthsize = aead_setauthsize,
2584                         .encrypt = aead_encrypt,
2585                         .decrypt = aead_decrypt,
2586                         .ivsize = DES3_EDE_BLOCK_SIZE,
2587                         .maxauthsize = SHA256_DIGEST_SIZE,
2588                 },
2589                 .caam = {
2590                         .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2591                         .class2_alg_type = OP_ALG_ALGSEL_SHA256 |
2592                                            OP_ALG_AAI_HMAC_PRECOMP,
2593                 },
2594         },
2595         {
2596                 .aead = {
2597                         .base = {
2598                                 .cra_name = "echainiv(authenc(hmac(sha256),"
2599                                             "cbc(des3_ede)))",
2600                                 .cra_driver_name = "echainiv-authenc-"
2601                                                    "hmac-sha256-"
2602                                                    "cbc-des3_ede-caam",
2603                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2604                         },
2605                         .setkey = des3_aead_setkey,
2606                         .setauthsize = aead_setauthsize,
2607                         .encrypt = aead_encrypt,
2608                         .decrypt = aead_decrypt,
2609                         .ivsize = DES3_EDE_BLOCK_SIZE,
2610                         .maxauthsize = SHA256_DIGEST_SIZE,
2611                 },
2612                 .caam = {
2613                         .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2614                         .class2_alg_type = OP_ALG_ALGSEL_SHA256 |
2615                                            OP_ALG_AAI_HMAC_PRECOMP,
2616                         .geniv = true,
2617                 },
2618         },
2619         {
2620                 .aead = {
2621                         .base = {
2622                                 .cra_name = "authenc(hmac(sha384),"
2623                                             "cbc(des3_ede))",
2624                                 .cra_driver_name = "authenc-hmac-sha384-"
2625                                                    "cbc-des3_ede-caam",
2626                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2627                         },
2628                         .setkey = des3_aead_setkey,
2629                         .setauthsize = aead_setauthsize,
2630                         .encrypt = aead_encrypt,
2631                         .decrypt = aead_decrypt,
2632                         .ivsize = DES3_EDE_BLOCK_SIZE,
2633                         .maxauthsize = SHA384_DIGEST_SIZE,
2634                 },
2635                 .caam = {
2636                         .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2637                         .class2_alg_type = OP_ALG_ALGSEL_SHA384 |
2638                                            OP_ALG_AAI_HMAC_PRECOMP,
2639                 },
2640         },
2641         {
2642                 .aead = {
2643                         .base = {
2644                                 .cra_name = "echainiv(authenc(hmac(sha384),"
2645                                             "cbc(des3_ede)))",
2646                                 .cra_driver_name = "echainiv-authenc-"
2647                                                    "hmac-sha384-"
2648                                                    "cbc-des3_ede-caam",
2649                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2650                         },
2651                         .setkey = des3_aead_setkey,
2652                         .setauthsize = aead_setauthsize,
2653                         .encrypt = aead_encrypt,
2654                         .decrypt = aead_decrypt,
2655                         .ivsize = DES3_EDE_BLOCK_SIZE,
2656                         .maxauthsize = SHA384_DIGEST_SIZE,
2657                 },
2658                 .caam = {
2659                         .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2660                         .class2_alg_type = OP_ALG_ALGSEL_SHA384 |
2661                                            OP_ALG_AAI_HMAC_PRECOMP,
2662                         .geniv = true,
2663                 },
2664         },
2665         {
2666                 .aead = {
2667                         .base = {
2668                                 .cra_name = "authenc(hmac(sha512),"
2669                                             "cbc(des3_ede))",
2670                                 .cra_driver_name = "authenc-hmac-sha512-"
2671                                                    "cbc-des3_ede-caam",
2672                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2673                         },
2674                         .setkey = des3_aead_setkey,
2675                         .setauthsize = aead_setauthsize,
2676                         .encrypt = aead_encrypt,
2677                         .decrypt = aead_decrypt,
2678                         .ivsize = DES3_EDE_BLOCK_SIZE,
2679                         .maxauthsize = SHA512_DIGEST_SIZE,
2680                 },
2681                 .caam = {
2682                         .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2683                         .class2_alg_type = OP_ALG_ALGSEL_SHA512 |
2684                                            OP_ALG_AAI_HMAC_PRECOMP,
2685                 },
2686         },
2687         {
2688                 .aead = {
2689                         .base = {
2690                                 .cra_name = "echainiv(authenc(hmac(sha512),"
2691                                             "cbc(des3_ede)))",
2692                                 .cra_driver_name = "echainiv-authenc-"
2693                                                    "hmac-sha512-"
2694                                                    "cbc-des3_ede-caam",
2695                                 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2696                         },
2697                         .setkey = des3_aead_setkey,
2698                         .setauthsize = aead_setauthsize,
2699                         .encrypt = aead_encrypt,
2700                         .decrypt = aead_decrypt,
2701                         .ivsize = DES3_EDE_BLOCK_SIZE,
2702                         .maxauthsize = SHA512_DIGEST_SIZE,
2703                 },
2704                 .caam = {
2705                         .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2706                         .class2_alg_type = OP_ALG_ALGSEL_SHA512 |
2707                                            OP_ALG_AAI_HMAC_PRECOMP,
2708                         .geniv = true,
2709                 },
2710         },
2711         {
2712                 .aead = {
2713                         .base = {
2714                                 .cra_name = "authenc(hmac(md5),cbc(des))",
2715                                 .cra_driver_name = "authenc-hmac-md5-"
2716                                                    "cbc-des-caam",
2717                                 .cra_blocksize = DES_BLOCK_SIZE,
2718                         },
2719                         .setkey = aead_setkey,
2720                         .setauthsize = aead_setauthsize,
2721                         .encrypt = aead_encrypt,
2722                         .decrypt = aead_decrypt,
2723                         .ivsize = DES_BLOCK_SIZE,
2724                         .maxauthsize = MD5_DIGEST_SIZE,
2725                 },
2726                 .caam = {
2727                         .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2728                         .class2_alg_type = OP_ALG_ALGSEL_MD5 |
2729                                            OP_ALG_AAI_HMAC_PRECOMP,
2730                 },
2731         },
2732         {
2733                 .aead = {
2734                         .base = {
2735                                 .cra_name = "echainiv(authenc(hmac(md5),"
2736                                             "cbc(des)))",
2737                                 .cra_driver_name = "echainiv-authenc-hmac-md5-"
2738                                                    "cbc-des-caam",
2739                                 .cra_blocksize = DES_BLOCK_SIZE,
2740                         },
2741                         .setkey = aead_setkey,
2742                         .setauthsize = aead_setauthsize,
2743                         .encrypt = aead_encrypt,
2744                         .decrypt = aead_decrypt,
2745                         .ivsize = DES_BLOCK_SIZE,
2746                         .maxauthsize = MD5_DIGEST_SIZE,
2747                 },
2748                 .caam = {
2749                         .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2750                         .class2_alg_type = OP_ALG_ALGSEL_MD5 |
2751                                            OP_ALG_AAI_HMAC_PRECOMP,
2752                         .geniv = true,
2753                 },
2754         },
2755         {
2756                 .aead = {
2757                         .base = {
2758                                 .cra_name = "authenc(hmac(sha1),cbc(des))",
2759                                 .cra_driver_name = "authenc-hmac-sha1-"
2760                                                    "cbc-des-caam",
2761                                 .cra_blocksize = DES_BLOCK_SIZE,
2762                         },
2763                         .setkey = aead_setkey,
2764                         .setauthsize = aead_setauthsize,
2765                         .encrypt = aead_encrypt,
2766                         .decrypt = aead_decrypt,
2767                         .ivsize = DES_BLOCK_SIZE,
2768                         .maxauthsize = SHA1_DIGEST_SIZE,
2769                 },
2770                 .caam = {
2771                         .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2772                         .class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2773                                            OP_ALG_AAI_HMAC_PRECOMP,
2774                 },
2775         },
2776         {
2777                 .aead = {
2778                         .base = {
2779                                 .cra_name = "echainiv(authenc(hmac(sha1),"
2780                                             "cbc(des)))",
2781                                 .cra_driver_name = "echainiv-authenc-"
2782                                                    "hmac-sha1-cbc-des-caam",
2783                                 .cra_blocksize = DES_BLOCK_SIZE,
2784                         },
2785                         .setkey = aead_setkey,
2786                         .setauthsize = aead_setauthsize,
2787                         .encrypt = aead_encrypt,
2788                         .decrypt = aead_decrypt,
2789                         .ivsize = DES_BLOCK_SIZE,
2790                         .maxauthsize = SHA1_DIGEST_SIZE,
2791                 },
2792                 .caam = {
2793                         .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2794                         .class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2795                                            OP_ALG_AAI_HMAC_PRECOMP,
2796                         .geniv = true,
2797                 },
2798         },
2799         {
2800                 .aead = {
2801                         .base = {
2802                                 .cra_name = "authenc(hmac(sha224),cbc(des))",
2803                                 .cra_driver_name = "authenc-hmac-sha224-"
2804                                                    "cbc-des-caam",
2805                                 .cra_blocksize = DES_BLOCK_SIZE,
2806                         },
2807                         .setkey = aead_setkey,
2808                         .setauthsize = aead_setauthsize,
2809                         .encrypt = aead_encrypt,
2810                         .decrypt = aead_decrypt,
2811                         .ivsize = DES_BLOCK_SIZE,
2812                         .maxauthsize = SHA224_DIGEST_SIZE,
2813                 },
2814                 .caam = {
2815                         .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2816                         .class2_alg_type = OP_ALG_ALGSEL_SHA224 |
2817                                            OP_ALG_AAI_HMAC_PRECOMP,
2818                 },
2819         },
2820         {
2821                 .aead = {
2822                         .base = {
2823                                 .cra_name = "echainiv(authenc(hmac(sha224),"
2824                                             "cbc(des)))",
2825                                 .cra_driver_name = "echainiv-authenc-"
2826                                                    "hmac-sha224-cbc-des-caam",
2827                                 .cra_blocksize = DES_BLOCK_SIZE,
2828                         },
2829                         .setkey = aead_setkey,
2830                         .setauthsize = aead_setauthsize,
2831                         .encrypt = aead_encrypt,
2832                         .decrypt = aead_decrypt,
2833                         .ivsize = DES_BLOCK_SIZE,
2834                         .maxauthsize = SHA224_DIGEST_SIZE,
2835                 },
2836                 .caam = {
2837                         .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2838                         .class2_alg_type = OP_ALG_ALGSEL_SHA224 |
2839                                            OP_ALG_AAI_HMAC_PRECOMP,
2840                         .geniv = true,
2841                 },
2842         },
2843         {
2844                 .aead = {
2845                         .base = {
2846                                 .cra_name = "authenc(hmac(sha256),cbc(des))",
2847                                 .cra_driver_name = "authenc-hmac-sha256-"
2848                                                    "cbc-des-caam",
2849                                 .cra_blocksize = DES_BLOCK_SIZE,
2850                         },
2851                         .setkey = aead_setkey,
2852                         .setauthsize = aead_setauthsize,
2853                         .encrypt = aead_encrypt,
2854                         .decrypt = aead_decrypt,
2855                         .ivsize = DES_BLOCK_SIZE,
2856                         .maxauthsize = SHA256_DIGEST_SIZE,
2857                 },
2858                 .caam = {
2859                         .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2860                         .class2_alg_type = OP_ALG_ALGSEL_SHA256 |
2861                                            OP_ALG_AAI_HMAC_PRECOMP,
2862                 },
2863         },
2864         {
2865                 .aead = {
2866                         .base = {
2867                                 .cra_name = "echainiv(authenc(hmac(sha256),"
2868                                             "cbc(des)))",
2869                                 .cra_driver_name = "echainiv-authenc-"
2870                                                    "hmac-sha256-cbc-des-caam",
2871                                 .cra_blocksize = DES_BLOCK_SIZE,
2872                         },
2873                         .setkey = aead_setkey,
2874                         .setauthsize = aead_setauthsize,
2875                         .encrypt = aead_encrypt,
2876                         .decrypt = aead_decrypt,
2877                         .ivsize = DES_BLOCK_SIZE,
2878                         .maxauthsize = SHA256_DIGEST_SIZE,
2879                 },
2880                 .caam = {
2881                         .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2882                         .class2_alg_type = OP_ALG_ALGSEL_SHA256 |
2883                                            OP_ALG_AAI_HMAC_PRECOMP,
2884                         .geniv = true,
2885                 },
2886         },
2887         {
2888                 .aead = {
2889                         .base = {
2890                                 .cra_name = "authenc(hmac(sha384),cbc(des))",
2891                                 .cra_driver_name = "authenc-hmac-sha384-"
2892                                                    "cbc-des-caam",
2893                                 .cra_blocksize = DES_BLOCK_SIZE,
2894                         },
2895                         .setkey = aead_setkey,
2896                         .setauthsize = aead_setauthsize,
2897                         .encrypt = aead_encrypt,
2898                         .decrypt = aead_decrypt,
2899                         .ivsize = DES_BLOCK_SIZE,
2900                         .maxauthsize = SHA384_DIGEST_SIZE,
2901                 },
2902                 .caam = {
2903                         .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2904                         .class2_alg_type = OP_ALG_ALGSEL_SHA384 |
2905                                            OP_ALG_AAI_HMAC_PRECOMP,
2906                 },
2907         },
2908         {
2909                 .aead = {
2910                         .base = {
2911                                 .cra_name = "echainiv(authenc(hmac(sha384),"
2912                                             "cbc(des)))",
2913                                 .cra_driver_name = "echainiv-authenc-"
2914                                                    "hmac-sha384-cbc-des-caam",
2915                                 .cra_blocksize = DES_BLOCK_SIZE,
2916                         },
2917                         .setkey = aead_setkey,
2918                         .setauthsize = aead_setauthsize,
2919                         .encrypt = aead_encrypt,
2920                         .decrypt = aead_decrypt,
2921                         .ivsize = DES_BLOCK_SIZE,
2922                         .maxauthsize = SHA384_DIGEST_SIZE,
2923                 },
2924                 .caam = {
2925                         .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2926                         .class2_alg_type = OP_ALG_ALGSEL_SHA384 |
2927                                            OP_ALG_AAI_HMAC_PRECOMP,
2928                         .geniv = true,
2929                 },
2930         },
2931         {
2932                 .aead = {
2933                         .base = {
2934                                 .cra_name = "authenc(hmac(sha512),cbc(des))",
2935                                 .cra_driver_name = "authenc-hmac-sha512-"
2936                                                    "cbc-des-caam",
2937                                 .cra_blocksize = DES_BLOCK_SIZE,
2938                         },
2939                         .setkey = aead_setkey,
2940                         .setauthsize = aead_setauthsize,
2941                         .encrypt = aead_encrypt,
2942                         .decrypt = aead_decrypt,
2943                         .ivsize = DES_BLOCK_SIZE,
2944                         .maxauthsize = SHA512_DIGEST_SIZE,
2945                 },
2946                 .caam = {
2947                         .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2948                         .class2_alg_type = OP_ALG_ALGSEL_SHA512 |
2949                                            OP_ALG_AAI_HMAC_PRECOMP,
2950                 },
2951         },
2952         {
2953                 .aead = {
2954                         .base = {
2955                                 .cra_name = "echainiv(authenc(hmac(sha512),"
2956                                             "cbc(des)))",
2957                                 .cra_driver_name = "echainiv-authenc-"
2958                                                    "hmac-sha512-cbc-des-caam",
2959                                 .cra_blocksize = DES_BLOCK_SIZE,
2960                         },
2961                         .setkey = aead_setkey,
2962                         .setauthsize = aead_setauthsize,
2963                         .encrypt = aead_encrypt,
2964                         .decrypt = aead_decrypt,
2965                         .ivsize = DES_BLOCK_SIZE,
2966                         .maxauthsize = SHA512_DIGEST_SIZE,
2967                 },
2968                 .caam = {
2969                         .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2970                         .class2_alg_type = OP_ALG_ALGSEL_SHA512 |
2971                                            OP_ALG_AAI_HMAC_PRECOMP,
2972                         .geniv = true,
2973                 },
2974         },
2975         {
2976                 .aead = {
2977                         .base = {
2978                                 .cra_name = "authenc(hmac(md5),"
2979                                             "rfc3686(ctr(aes)))",
2980                                 .cra_driver_name = "authenc-hmac-md5-"
2981                                                    "rfc3686-ctr-aes-caam",
2982                                 .cra_blocksize = 1,
2983                         },
2984                         .setkey = aead_setkey,
2985                         .setauthsize = aead_setauthsize,
2986                         .encrypt = aead_encrypt,
2987                         .decrypt = aead_decrypt,
2988                         .ivsize = CTR_RFC3686_IV_SIZE,
2989                         .maxauthsize = MD5_DIGEST_SIZE,
2990                 },
2991                 .caam = {
2992                         .class1_alg_type = OP_ALG_ALGSEL_AES |
2993                                            OP_ALG_AAI_CTR_MOD128,
2994                         .class2_alg_type = OP_ALG_ALGSEL_MD5 |
2995                                            OP_ALG_AAI_HMAC_PRECOMP,
2996                         .rfc3686 = true,
2997                 },
2998         },
2999         {
3000                 .aead = {
3001                         .base = {
3002                                 .cra_name = "seqiv(authenc("
3003                                             "hmac(md5),rfc3686(ctr(aes))))",
3004                                 .cra_driver_name = "seqiv-authenc-hmac-md5-"
3005                                                    "rfc3686-ctr-aes-caam",
3006                                 .cra_blocksize = 1,
3007                         },
3008                         .setkey = aead_setkey,
3009                         .setauthsize = aead_setauthsize,
3010                         .encrypt = aead_encrypt,
3011                         .decrypt = aead_decrypt,
3012                         .ivsize = CTR_RFC3686_IV_SIZE,
3013                         .maxauthsize = MD5_DIGEST_SIZE,
3014                 },
3015                 .caam = {
3016                         .class1_alg_type = OP_ALG_ALGSEL_AES |
3017                                            OP_ALG_AAI_CTR_MOD128,
3018                         .class2_alg_type = OP_ALG_ALGSEL_MD5 |
3019                                            OP_ALG_AAI_HMAC_PRECOMP,
3020                         .rfc3686 = true,
3021                         .geniv = true,
3022                 },
3023         },
3024         {
3025                 .aead = {
3026                         .base = {
3027                                 .cra_name = "authenc(hmac(sha1),"
3028                                             "rfc3686(ctr(aes)))",
3029                                 .cra_driver_name = "authenc-hmac-sha1-"
3030                                                    "rfc3686-ctr-aes-caam",
3031                                 .cra_blocksize = 1,
3032                         },
3033                         .setkey = aead_setkey,
3034                         .setauthsize = aead_setauthsize,
3035                         .encrypt = aead_encrypt,
3036                         .decrypt = aead_decrypt,
3037                         .ivsize = CTR_RFC3686_IV_SIZE,
3038                         .maxauthsize = SHA1_DIGEST_SIZE,
3039                 },
3040                 .caam = {
3041                         .class1_alg_type = OP_ALG_ALGSEL_AES |
3042                                            OP_ALG_AAI_CTR_MOD128,
3043                         .class2_alg_type = OP_ALG_ALGSEL_SHA1 |
3044                                            OP_ALG_AAI_HMAC_PRECOMP,
3045                         .rfc3686 = true,
3046                 },
3047         },
3048         {
3049                 .aead = {
3050                         .base = {
3051                                 .cra_name = "seqiv(authenc("
3052                                             "hmac(sha1),rfc3686(ctr(aes))))",
3053                                 .cra_driver_name = "seqiv-authenc-hmac-sha1-"
3054                                                    "rfc3686-ctr-aes-caam",
3055                                 .cra_blocksize = 1,
3056                         },
3057                         .setkey = aead_setkey,
3058                         .setauthsize = aead_setauthsize,
3059                         .encrypt = aead_encrypt,
3060                         .decrypt = aead_decrypt,
3061                         .ivsize = CTR_RFC3686_IV_SIZE,
3062                         .maxauthsize = SHA1_DIGEST_SIZE,
3063                 },
3064                 .caam = {
3065                         .class1_alg_type = OP_ALG_ALGSEL_AES |
3066                                            OP_ALG_AAI_CTR_MOD128,
3067                         .class2_alg_type = OP_ALG_ALGSEL_SHA1 |
3068                                            OP_ALG_AAI_HMAC_PRECOMP,
3069                         .rfc3686 = true,
3070                         .geniv = true,
3071                 },
3072         },
3073         {
3074                 .aead = {
3075                         .base = {
3076                                 .cra_name = "authenc(hmac(sha224),"
3077                                             "rfc3686(ctr(aes)))",
3078                                 .cra_driver_name = "authenc-hmac-sha224-"
3079                                                    "rfc3686-ctr-aes-caam",
3080                                 .cra_blocksize = 1,
3081                         },
3082                         .setkey = aead_setkey,
3083                         .setauthsize = aead_setauthsize,
3084                         .encrypt = aead_encrypt,
3085                         .decrypt = aead_decrypt,
3086                         .ivsize = CTR_RFC3686_IV_SIZE,
3087                         .maxauthsize = SHA224_DIGEST_SIZE,
3088                 },
3089                 .caam = {
3090                         .class1_alg_type = OP_ALG_ALGSEL_AES |
3091                                            OP_ALG_AAI_CTR_MOD128,
3092                         .class2_alg_type = OP_ALG_ALGSEL_SHA224 |
3093                                            OP_ALG_AAI_HMAC_PRECOMP,
3094                         .rfc3686 = true,
3095                 },
3096         },
3097         {
3098                 .aead = {
3099                         .base = {
3100                                 .cra_name = "seqiv(authenc("
3101                                             "hmac(sha224),rfc3686(ctr(aes))))",
3102                                 .cra_driver_name = "seqiv-authenc-hmac-sha224-"
3103                                                    "rfc3686-ctr-aes-caam",
3104                                 .cra_blocksize = 1,
3105                         },
3106                         .setkey = aead_setkey,
3107                         .setauthsize = aead_setauthsize,
3108                         .encrypt = aead_encrypt,
3109                         .decrypt = aead_decrypt,
3110                         .ivsize = CTR_RFC3686_IV_SIZE,
3111                         .maxauthsize = SHA224_DIGEST_SIZE,
3112                 },
3113                 .caam = {
3114                         .class1_alg_type = OP_ALG_ALGSEL_AES |
3115                                            OP_ALG_AAI_CTR_MOD128,
3116                         .class2_alg_type = OP_ALG_ALGSEL_SHA224 |
3117                                            OP_ALG_AAI_HMAC_PRECOMP,
3118                         .rfc3686 = true,
3119                         .geniv = true,
3120                 },
3121         },
3122         {
3123                 .aead = {
3124                         .base = {
3125                                 .cra_name = "authenc(hmac(sha256),"
3126                                             "rfc3686(ctr(aes)))",
3127                                 .cra_driver_name = "authenc-hmac-sha256-"
3128                                                    "rfc3686-ctr-aes-caam",
3129                                 .cra_blocksize = 1,
3130                         },
3131                         .setkey = aead_setkey,
3132                         .setauthsize = aead_setauthsize,
3133                         .encrypt = aead_encrypt,
3134                         .decrypt = aead_decrypt,
3135                         .ivsize = CTR_RFC3686_IV_SIZE,
3136                         .maxauthsize = SHA256_DIGEST_SIZE,
3137                 },
3138                 .caam = {
3139                         .class1_alg_type = OP_ALG_ALGSEL_AES |
3140                                            OP_ALG_AAI_CTR_MOD128,
3141                         .class2_alg_type = OP_ALG_ALGSEL_SHA256 |
3142                                            OP_ALG_AAI_HMAC_PRECOMP,
3143                         .rfc3686 = true,
3144                 },
3145         },
3146         {
3147                 .aead = {
3148                         .base = {
3149                                 .cra_name = "seqiv(authenc(hmac(sha256),"
3150                                             "rfc3686(ctr(aes))))",
3151                                 .cra_driver_name = "seqiv-authenc-hmac-sha256-"
3152                                                    "rfc3686-ctr-aes-caam",
3153                                 .cra_blocksize = 1,
3154                         },
3155                         .setkey = aead_setkey,
3156                         .setauthsize = aead_setauthsize,
3157                         .encrypt = aead_encrypt,
3158                         .decrypt = aead_decrypt,
3159                         .ivsize = CTR_RFC3686_IV_SIZE,
3160                         .maxauthsize = SHA256_DIGEST_SIZE,
3161                 },
3162                 .caam = {
3163                         .class1_alg_type = OP_ALG_ALGSEL_AES |
3164                                            OP_ALG_AAI_CTR_MOD128,
3165                         .class2_alg_type = OP_ALG_ALGSEL_SHA256 |
3166                                            OP_ALG_AAI_HMAC_PRECOMP,
3167                         .rfc3686 = true,
3168                         .geniv = true,
3169                 },
3170         },
3171         {
3172                 .aead = {
3173                         .base = {
3174                                 .cra_name = "authenc(hmac(sha384),"
3175                                             "rfc3686(ctr(aes)))",
3176                                 .cra_driver_name = "authenc-hmac-sha384-"
3177                                                    "rfc3686-ctr-aes-caam",
3178                                 .cra_blocksize = 1,
3179                         },
3180                         .setkey = aead_setkey,
3181                         .setauthsize = aead_setauthsize,
3182                         .encrypt = aead_encrypt,
3183                         .decrypt = aead_decrypt,
3184                         .ivsize = CTR_RFC3686_IV_SIZE,
3185                         .maxauthsize = SHA384_DIGEST_SIZE,
3186                 },
3187                 .caam = {
3188                         .class1_alg_type = OP_ALG_ALGSEL_AES |
3189                                            OP_ALG_AAI_CTR_MOD128,
3190                         .class2_alg_type = OP_ALG_ALGSEL_SHA384 |
3191                                            OP_ALG_AAI_HMAC_PRECOMP,
3192                         .rfc3686 = true,
3193                 },
3194         },
3195         {
3196                 .aead = {
3197                         .base = {
3198                                 .cra_name = "seqiv(authenc(hmac(sha384),"
3199                                             "rfc3686(ctr(aes))))",
3200                                 .cra_driver_name = "seqiv-authenc-hmac-sha384-"
3201                                                    "rfc3686-ctr-aes-caam",
3202                                 .cra_blocksize = 1,
3203                         },
3204                         .setkey = aead_setkey,
3205                         .setauthsize = aead_setauthsize,
3206                         .encrypt = aead_encrypt,
3207                         .decrypt = aead_decrypt,
3208                         .ivsize = CTR_RFC3686_IV_SIZE,
3209                         .maxauthsize = SHA384_DIGEST_SIZE,
3210                 },
3211                 .caam = {
3212                         .class1_alg_type = OP_ALG_ALGSEL_AES |
3213                                            OP_ALG_AAI_CTR_MOD128,
3214                         .class2_alg_type = OP_ALG_ALGSEL_SHA384 |
3215                                            OP_ALG_AAI_HMAC_PRECOMP,
3216                         .rfc3686 = true,
3217                         .geniv = true,
3218                 },
3219         },
3220         {
3221                 .aead = {
3222                         .base = {
3223                                 .cra_name = "authenc(hmac(sha512),"
3224                                             "rfc3686(ctr(aes)))",
3225                                 .cra_driver_name = "authenc-hmac-sha512-"
3226                                                    "rfc3686-ctr-aes-caam",
3227                                 .cra_blocksize = 1,
3228                         },
3229                         .setkey = aead_setkey,
3230                         .setauthsize = aead_setauthsize,
3231                         .encrypt = aead_encrypt,
3232                         .decrypt = aead_decrypt,
3233                         .ivsize = CTR_RFC3686_IV_SIZE,
3234                         .maxauthsize = SHA512_DIGEST_SIZE,
3235                 },
3236                 .caam = {
3237                         .class1_alg_type = OP_ALG_ALGSEL_AES |
3238                                            OP_ALG_AAI_CTR_MOD128,
3239                         .class2_alg_type = OP_ALG_ALGSEL_SHA512 |
3240                                            OP_ALG_AAI_HMAC_PRECOMP,
3241                         .rfc3686 = true,
3242                 },
3243         },
3244         {
3245                 .aead = {
3246                         .base = {
3247                                 .cra_name = "seqiv(authenc(hmac(sha512),"
3248                                             "rfc3686(ctr(aes))))",
3249                                 .cra_driver_name = "seqiv-authenc-hmac-sha512-"
3250                                                    "rfc3686-ctr-aes-caam",
3251                                 .cra_blocksize = 1,
3252                         },
3253                         .setkey = aead_setkey,
3254                         .setauthsize = aead_setauthsize,
3255                         .encrypt = aead_encrypt,
3256                         .decrypt = aead_decrypt,
3257                         .ivsize = CTR_RFC3686_IV_SIZE,
3258                         .maxauthsize = SHA512_DIGEST_SIZE,
3259                 },
3260                 .caam = {
3261                         .class1_alg_type = OP_ALG_ALGSEL_AES |
3262                                            OP_ALG_AAI_CTR_MOD128,
3263                         .class2_alg_type = OP_ALG_ALGSEL_SHA512 |
3264                                            OP_ALG_AAI_HMAC_PRECOMP,
3265                         .rfc3686 = true,
3266                         .geniv = true,
3267                 },
3268         },
3269         {
3270                 .aead = {
3271                         .base = {
3272                                 .cra_name = "rfc7539(chacha20,poly1305)",
3273                                 .cra_driver_name = "rfc7539-chacha20-poly1305-"
3274                                                    "caam",
3275                                 .cra_blocksize = 1,
3276                         },
3277                         .setkey = chachapoly_setkey,
3278                         .setauthsize = chachapoly_setauthsize,
3279                         .encrypt = chachapoly_encrypt,
3280                         .decrypt = chachapoly_decrypt,
3281                         .ivsize = CHACHAPOLY_IV_SIZE,
3282                         .maxauthsize = POLY1305_DIGEST_SIZE,
3283                 },
3284                 .caam = {
3285                         .class1_alg_type = OP_ALG_ALGSEL_CHACHA20 |
3286                                            OP_ALG_AAI_AEAD,
3287                         .class2_alg_type = OP_ALG_ALGSEL_POLY1305 |
3288                                            OP_ALG_AAI_AEAD,
3289                         .nodkp = true,
3290                 },
3291         },
3292         {
3293                 .aead = {
3294                         .base = {
3295                                 .cra_name = "rfc7539esp(chacha20,poly1305)",
3296                                 .cra_driver_name = "rfc7539esp-chacha20-"
3297                                                    "poly1305-caam",
3298                                 .cra_blocksize = 1,
3299                         },
3300                         .setkey = chachapoly_setkey,
3301                         .setauthsize = chachapoly_setauthsize,
3302                         .encrypt = chachapoly_encrypt,
3303                         .decrypt = chachapoly_decrypt,
3304                         .ivsize = 8,
3305                         .maxauthsize = POLY1305_DIGEST_SIZE,
3306                 },
3307                 .caam = {
3308                         .class1_alg_type = OP_ALG_ALGSEL_CHACHA20 |
3309                                            OP_ALG_AAI_AEAD,
3310                         .class2_alg_type = OP_ALG_ALGSEL_POLY1305 |
3311                                            OP_ALG_AAI_AEAD,
3312                         .nodkp = true,
3313                 },
3314         },
3315 };
3316
3317 static int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam,
3318                             bool uses_dkp)
3319 {
3320         dma_addr_t dma_addr;
3321         struct caam_drv_private *priv;
3322         const size_t sh_desc_enc_offset = offsetof(struct caam_ctx,
3323                                                    sh_desc_enc);
3324
3325         ctx->jrdev = caam_jr_alloc();
3326         if (IS_ERR(ctx->jrdev)) {
3327                 pr_err("Job Ring Device allocation for transform failed\n");
3328                 return PTR_ERR(ctx->jrdev);
3329         }
3330
3331         priv = dev_get_drvdata(ctx->jrdev->parent);
3332         if (priv->era >= 6 && uses_dkp)
3333                 ctx->dir = DMA_BIDIRECTIONAL;
3334         else
3335                 ctx->dir = DMA_TO_DEVICE;
3336
3337         dma_addr = dma_map_single_attrs(ctx->jrdev, ctx->sh_desc_enc,
3338                                         offsetof(struct caam_ctx,
3339                                                  sh_desc_enc_dma) -
3340                                         sh_desc_enc_offset,
3341                                         ctx->dir, DMA_ATTR_SKIP_CPU_SYNC);
3342         if (dma_mapping_error(ctx->jrdev, dma_addr)) {
3343                 dev_err(ctx->jrdev, "unable to map key, shared descriptors\n");
3344                 caam_jr_free(ctx->jrdev);
3345                 return -ENOMEM;
3346         }
3347
3348         ctx->sh_desc_enc_dma = dma_addr;
3349         ctx->sh_desc_dec_dma = dma_addr + offsetof(struct caam_ctx,
3350                                                    sh_desc_dec) -
3351                                         sh_desc_enc_offset;
3352         ctx->key_dma = dma_addr + offsetof(struct caam_ctx, key) -
3353                                         sh_desc_enc_offset;
3354
3355         /* copy descriptor header template value */
3356         ctx->cdata.algtype = OP_TYPE_CLASS1_ALG | caam->class1_alg_type;
3357         ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam->class2_alg_type;
3358
3359         return 0;
3360 }
3361
3362 static int caam_cra_init(struct crypto_skcipher *tfm)
3363 {
3364         struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
3365         struct caam_skcipher_alg *caam_alg =
3366                 container_of(alg, typeof(*caam_alg), skcipher);
3367         struct caam_ctx *ctx = crypto_skcipher_ctx(tfm);
3368
3369         crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx));
3370
3371         ctx->enginectx.op.do_one_request = skcipher_do_one_req;
3372
3373         return caam_init_common(crypto_skcipher_ctx(tfm), &caam_alg->caam,
3374                                 false);
3375 }
3376
3377 static int caam_aead_init(struct crypto_aead *tfm)
3378 {
3379         struct aead_alg *alg = crypto_aead_alg(tfm);
3380         struct caam_aead_alg *caam_alg =
3381                  container_of(alg, struct caam_aead_alg, aead);
3382         struct caam_ctx *ctx = crypto_aead_ctx(tfm);
3383
3384         crypto_aead_set_reqsize(tfm, sizeof(struct caam_aead_req_ctx));
3385
3386         ctx->enginectx.op.do_one_request = aead_do_one_req;
3387
3388         return caam_init_common(ctx, &caam_alg->caam, !caam_alg->caam.nodkp);
3389 }
3390
3391 static void caam_exit_common(struct caam_ctx *ctx)
3392 {
3393         dma_unmap_single_attrs(ctx->jrdev, ctx->sh_desc_enc_dma,
3394                                offsetof(struct caam_ctx, sh_desc_enc_dma) -
3395                                offsetof(struct caam_ctx, sh_desc_enc),
3396                                ctx->dir, DMA_ATTR_SKIP_CPU_SYNC);
3397         caam_jr_free(ctx->jrdev);
3398 }
3399
3400 static void caam_cra_exit(struct crypto_skcipher *tfm)
3401 {
3402         caam_exit_common(crypto_skcipher_ctx(tfm));
3403 }
3404
3405 static void caam_aead_exit(struct crypto_aead *tfm)
3406 {
3407         caam_exit_common(crypto_aead_ctx(tfm));
3408 }
3409
3410 void caam_algapi_exit(void)
3411 {
3412         int i;
3413
3414         for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {
3415                 struct caam_aead_alg *t_alg = driver_aeads + i;
3416
3417                 if (t_alg->registered)
3418                         crypto_unregister_aead(&t_alg->aead);
3419         }
3420
3421         for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
3422                 struct caam_skcipher_alg *t_alg = driver_algs + i;
3423
3424                 if (t_alg->registered)
3425                         crypto_unregister_skcipher(&t_alg->skcipher);
3426         }
3427 }
3428
3429 static void caam_skcipher_alg_init(struct caam_skcipher_alg *t_alg)
3430 {
3431         struct skcipher_alg *alg = &t_alg->skcipher;
3432
3433         alg->base.cra_module = THIS_MODULE;
3434         alg->base.cra_priority = CAAM_CRA_PRIORITY;
3435         alg->base.cra_ctxsize = sizeof(struct caam_ctx);
3436         alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY;
3437
3438         alg->init = caam_cra_init;
3439         alg->exit = caam_cra_exit;
3440 }
3441
3442 static void caam_aead_alg_init(struct caam_aead_alg *t_alg)
3443 {
3444         struct aead_alg *alg = &t_alg->aead;
3445
3446         alg->base.cra_module = THIS_MODULE;
3447         alg->base.cra_priority = CAAM_CRA_PRIORITY;
3448         alg->base.cra_ctxsize = sizeof(struct caam_ctx);
3449         alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY;
3450
3451         alg->init = caam_aead_init;
3452         alg->exit = caam_aead_exit;
3453 }
3454
3455 int caam_algapi_init(struct device *ctrldev)
3456 {
3457         struct caam_drv_private *priv = dev_get_drvdata(ctrldev);
3458         int i = 0, err = 0;
3459         u32 aes_vid, aes_inst, des_inst, md_vid, md_inst, ccha_inst, ptha_inst;
3460         u32 arc4_inst;
3461         unsigned int md_limit = SHA512_DIGEST_SIZE;
3462         bool registered = false, gcm_support;
3463
3464         /*
3465          * Register crypto algorithms the device supports.
3466          * First, detect presence and attributes of DES, AES, and MD blocks.
3467          */
3468         if (priv->era < 10) {
3469                 u32 cha_vid, cha_inst, aes_rn;
3470
3471                 cha_vid = rd_reg32(&priv->ctrl->perfmon.cha_id_ls);
3472                 aes_vid = cha_vid & CHA_ID_LS_AES_MASK;
3473                 md_vid = (cha_vid & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT;
3474
3475                 cha_inst = rd_reg32(&priv->ctrl->perfmon.cha_num_ls);
3476                 des_inst = (cha_inst & CHA_ID_LS_DES_MASK) >>
3477                            CHA_ID_LS_DES_SHIFT;
3478                 aes_inst = cha_inst & CHA_ID_LS_AES_MASK;
3479                 md_inst = (cha_inst & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT;
3480                 arc4_inst = (cha_inst & CHA_ID_LS_ARC4_MASK) >>
3481                             CHA_ID_LS_ARC4_SHIFT;
3482                 ccha_inst = 0;
3483                 ptha_inst = 0;
3484
3485                 aes_rn = rd_reg32(&priv->ctrl->perfmon.cha_rev_ls) &
3486                          CHA_ID_LS_AES_MASK;
3487                 gcm_support = !(aes_vid == CHA_VER_VID_AES_LP && aes_rn < 8);
3488         } else {
3489                 u32 aesa, mdha;
3490
3491                 aesa = rd_reg32(&priv->ctrl->vreg.aesa);
3492                 mdha = rd_reg32(&priv->ctrl->vreg.mdha);
3493
3494                 aes_vid = (aesa & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT;
3495                 md_vid = (mdha & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT;
3496
3497                 des_inst = rd_reg32(&priv->ctrl->vreg.desa) & CHA_VER_NUM_MASK;
3498                 aes_inst = aesa & CHA_VER_NUM_MASK;
3499                 md_inst = mdha & CHA_VER_NUM_MASK;
3500                 ccha_inst = rd_reg32(&priv->ctrl->vreg.ccha) & CHA_VER_NUM_MASK;
3501                 ptha_inst = rd_reg32(&priv->ctrl->vreg.ptha) & CHA_VER_NUM_MASK;
3502                 arc4_inst = rd_reg32(&priv->ctrl->vreg.afha) & CHA_VER_NUM_MASK;
3503
3504                 gcm_support = aesa & CHA_VER_MISC_AES_GCM;
3505         }
3506
3507         /* If MD is present, limit digest size based on LP256 */
3508         if (md_inst && md_vid  == CHA_VER_VID_MD_LP256)
3509                 md_limit = SHA256_DIGEST_SIZE;
3510
3511         for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
3512                 struct caam_skcipher_alg *t_alg = driver_algs + i;
3513                 u32 alg_sel = t_alg->caam.class1_alg_type & OP_ALG_ALGSEL_MASK;
3514
3515                 /* Skip DES algorithms if not supported by device */
3516                 if (!des_inst &&
3517                     ((alg_sel == OP_ALG_ALGSEL_3DES) ||
3518                      (alg_sel == OP_ALG_ALGSEL_DES)))
3519                                 continue;
3520
3521                 /* Skip AES algorithms if not supported by device */
3522                 if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES))
3523                                 continue;
3524
3525                 /* Skip ARC4 algorithms if not supported by device */
3526                 if (!arc4_inst && alg_sel == OP_ALG_ALGSEL_ARC4)
3527                         continue;
3528
3529                 /*
3530                  * Check support for AES modes not available
3531                  * on LP devices.
3532                  */
3533                 if (aes_vid == CHA_VER_VID_AES_LP &&
3534                     (t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK) ==
3535                     OP_ALG_AAI_XTS)
3536                         continue;
3537
3538                 caam_skcipher_alg_init(t_alg);
3539
3540                 err = crypto_register_skcipher(&t_alg->skcipher);
3541                 if (err) {
3542                         pr_warn("%s alg registration failed\n",
3543                                 t_alg->skcipher.base.cra_driver_name);
3544                         continue;
3545                 }
3546
3547                 t_alg->registered = true;
3548                 registered = true;
3549         }
3550
3551         for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {
3552                 struct caam_aead_alg *t_alg = driver_aeads + i;
3553                 u32 c1_alg_sel = t_alg->caam.class1_alg_type &
3554                                  OP_ALG_ALGSEL_MASK;
3555                 u32 c2_alg_sel = t_alg->caam.class2_alg_type &
3556                                  OP_ALG_ALGSEL_MASK;
3557                 u32 alg_aai = t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK;
3558
3559                 /* Skip DES algorithms if not supported by device */
3560                 if (!des_inst &&
3561                     ((c1_alg_sel == OP_ALG_ALGSEL_3DES) ||
3562                      (c1_alg_sel == OP_ALG_ALGSEL_DES)))
3563                                 continue;
3564
3565                 /* Skip AES algorithms if not supported by device */
3566                 if (!aes_inst && (c1_alg_sel == OP_ALG_ALGSEL_AES))
3567                                 continue;
3568
3569                 /* Skip CHACHA20 algorithms if not supported by device */
3570                 if (c1_alg_sel == OP_ALG_ALGSEL_CHACHA20 && !ccha_inst)
3571                         continue;
3572
3573                 /* Skip POLY1305 algorithms if not supported by device */
3574                 if (c2_alg_sel == OP_ALG_ALGSEL_POLY1305 && !ptha_inst)
3575                         continue;
3576
3577                 /* Skip GCM algorithms if not supported by device */
3578                 if (c1_alg_sel == OP_ALG_ALGSEL_AES &&
3579                     alg_aai == OP_ALG_AAI_GCM && !gcm_support)
3580                         continue;
3581
3582                 /*
3583                  * Skip algorithms requiring message digests
3584                  * if MD or MD size is not supported by device.
3585                  */
3586                 if (is_mdha(c2_alg_sel) &&
3587                     (!md_inst || t_alg->aead.maxauthsize > md_limit))
3588                         continue;
3589
3590                 caam_aead_alg_init(t_alg);
3591
3592                 err = crypto_register_aead(&t_alg->aead);
3593                 if (err) {
3594                         pr_warn("%s alg registration failed\n",
3595                                 t_alg->aead.base.cra_driver_name);
3596                         continue;
3597                 }
3598
3599                 t_alg->registered = true;
3600                 registered = true;
3601         }
3602
3603         if (registered)
3604                 pr_info("caam algorithms registered in /proc/crypto\n");
3605
3606         return err;
3607 }