GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / crypto / intel / keembay / keembay-ocs-aes-core.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Intel Keem Bay OCS AES Crypto Driver.
4  *
5  * Copyright (C) 2018-2020 Intel Corporation
6  */
7
8 #include <crypto/aes.h>
9 #include <crypto/engine.h>
10 #include <crypto/gcm.h>
11 #include <crypto/internal/aead.h>
12 #include <crypto/internal/skcipher.h>
13 #include <crypto/scatterwalk.h>
14 #include <linux/clk.h>
15 #include <linux/completion.h>
16 #include <linux/dma-mapping.h>
17 #include <linux/err.h>
18 #include <linux/interrupt.h>
19 #include <linux/io.h>
20 #include <linux/kernel.h>
21 #include <linux/module.h>
22 #include <linux/of.h>
23 #include <linux/platform_device.h>
24 #include <linux/string.h>
25
26 #include "ocs-aes.h"
27
28 #define KMB_OCS_PRIORITY        350
29 #define DRV_NAME                "keembay-ocs-aes"
30
31 #define OCS_AES_MIN_KEY_SIZE    16
32 #define OCS_AES_MAX_KEY_SIZE    32
33 #define OCS_AES_KEYSIZE_128     16
34 #define OCS_AES_KEYSIZE_192     24
35 #define OCS_AES_KEYSIZE_256     32
36 #define OCS_SM4_KEY_SIZE        16
37
38 /**
39  * struct ocs_aes_tctx - OCS AES Transform context
40  * @aes_dev:            The OCS AES device.
41  * @key:                AES/SM4 key.
42  * @key_len:            The length (in bytes) of @key.
43  * @cipher:             OCS cipher to use (either AES or SM4).
44  * @sw_cipher:          The cipher to use as fallback.
45  * @use_fallback:       Whether or not fallback cipher should be used.
46  */
47 struct ocs_aes_tctx {
48         struct ocs_aes_dev *aes_dev;
49         u8 key[OCS_AES_KEYSIZE_256];
50         unsigned int key_len;
51         enum ocs_cipher cipher;
52         union {
53                 struct crypto_sync_skcipher *sk;
54                 struct crypto_aead *aead;
55         } sw_cipher;
56         bool use_fallback;
57 };
58
59 /**
60  * struct ocs_aes_rctx - OCS AES Request context.
61  * @instruction:        Instruction to be executed (encrypt / decrypt).
62  * @mode:               Mode to use (ECB, CBC, CTR, CCm, GCM, CTS)
63  * @src_nents:          Number of source SG entries.
64  * @dst_nents:          Number of destination SG entries.
65  * @src_dma_count:      The number of DMA-mapped entries of the source SG.
66  * @dst_dma_count:      The number of DMA-mapped entries of the destination SG.
67  * @in_place:           Whether or not this is an in place request, i.e.,
68  *                      src_sg == dst_sg.
69  * @src_dll:            OCS DMA linked list for input data.
70  * @dst_dll:            OCS DMA linked list for output data.
71  * @last_ct_blk:        Buffer to hold last cipher text block (only used in CBC
72  *                      mode).
73  * @cts_swap:           Whether or not CTS swap must be performed.
74  * @aad_src_dll:        OCS DMA linked list for input AAD data.
75  * @aad_dst_dll:        OCS DMA linked list for output AAD data.
76  * @in_tag:             Buffer to hold input encrypted tag (only used for
77  *                      CCM/GCM decrypt).
78  * @out_tag:            Buffer to hold output encrypted / decrypted tag (only
79  *                      used for GCM encrypt / decrypt).
80  */
81 struct ocs_aes_rctx {
82         /* Fields common across all modes. */
83         enum ocs_instruction    instruction;
84         enum ocs_mode           mode;
85         int                     src_nents;
86         int                     dst_nents;
87         int                     src_dma_count;
88         int                     dst_dma_count;
89         bool                    in_place;
90         struct ocs_dll_desc     src_dll;
91         struct ocs_dll_desc     dst_dll;
92
93         /* CBC specific */
94         u8                      last_ct_blk[AES_BLOCK_SIZE];
95
96         /* CTS specific */
97         int                     cts_swap;
98
99         /* CCM/GCM specific */
100         struct ocs_dll_desc     aad_src_dll;
101         struct ocs_dll_desc     aad_dst_dll;
102         u8                      in_tag[AES_BLOCK_SIZE];
103
104         /* GCM specific */
105         u8                      out_tag[AES_BLOCK_SIZE];
106 };
107
108 /* Driver data. */
109 struct ocs_aes_drv {
110         struct list_head dev_list;
111         spinlock_t lock;        /* Protects dev_list. */
112 };
113
114 static struct ocs_aes_drv ocs_aes = {
115         .dev_list = LIST_HEAD_INIT(ocs_aes.dev_list),
116         .lock = __SPIN_LOCK_UNLOCKED(ocs_aes.lock),
117 };
118
119 static struct ocs_aes_dev *kmb_ocs_aes_find_dev(struct ocs_aes_tctx *tctx)
120 {
121         struct ocs_aes_dev *aes_dev;
122
123         spin_lock(&ocs_aes.lock);
124
125         if (tctx->aes_dev) {
126                 aes_dev = tctx->aes_dev;
127                 goto exit;
128         }
129
130         /* Only a single OCS device available */
131         aes_dev = list_first_entry(&ocs_aes.dev_list, struct ocs_aes_dev, list);
132         tctx->aes_dev = aes_dev;
133
134 exit:
135         spin_unlock(&ocs_aes.lock);
136
137         return aes_dev;
138 }
139
140 /*
141  * Ensure key is 128-bit or 256-bit for AES or 128-bit for SM4 and an actual
142  * key is being passed in.
143  *
144  * Return: 0 if key is valid, -EINVAL otherwise.
145  */
146 static int check_key(const u8 *in_key, size_t key_len, enum ocs_cipher cipher)
147 {
148         if (!in_key)
149                 return -EINVAL;
150
151         /* For AES, only 128-byte or 256-byte keys are supported. */
152         if (cipher == OCS_AES && (key_len == OCS_AES_KEYSIZE_128 ||
153                                   key_len == OCS_AES_KEYSIZE_256))
154                 return 0;
155
156         /* For SM4, only 128-byte keys are supported. */
157         if (cipher == OCS_SM4 && key_len == OCS_AES_KEYSIZE_128)
158                 return 0;
159
160         /* Everything else is unsupported. */
161         return -EINVAL;
162 }
163
164 /* Save key into transformation context. */
165 static int save_key(struct ocs_aes_tctx *tctx, const u8 *in_key, size_t key_len,
166                     enum ocs_cipher cipher)
167 {
168         int ret;
169
170         ret = check_key(in_key, key_len, cipher);
171         if (ret)
172                 return ret;
173
174         memcpy(tctx->key, in_key, key_len);
175         tctx->key_len = key_len;
176         tctx->cipher = cipher;
177
178         return 0;
179 }
180
181 /* Set key for symmetric cypher. */
182 static int kmb_ocs_sk_set_key(struct crypto_skcipher *tfm, const u8 *in_key,
183                               size_t key_len, enum ocs_cipher cipher)
184 {
185         struct ocs_aes_tctx *tctx = crypto_skcipher_ctx(tfm);
186
187         /* Fallback is used for AES with 192-bit key. */
188         tctx->use_fallback = (cipher == OCS_AES &&
189                               key_len == OCS_AES_KEYSIZE_192);
190
191         if (!tctx->use_fallback)
192                 return save_key(tctx, in_key, key_len, cipher);
193
194         crypto_sync_skcipher_clear_flags(tctx->sw_cipher.sk,
195                                          CRYPTO_TFM_REQ_MASK);
196         crypto_sync_skcipher_set_flags(tctx->sw_cipher.sk,
197                                        tfm->base.crt_flags &
198                                        CRYPTO_TFM_REQ_MASK);
199
200         return crypto_sync_skcipher_setkey(tctx->sw_cipher.sk, in_key, key_len);
201 }
202
203 /* Set key for AEAD cipher. */
204 static int kmb_ocs_aead_set_key(struct crypto_aead *tfm, const u8 *in_key,
205                                 size_t key_len, enum ocs_cipher cipher)
206 {
207         struct ocs_aes_tctx *tctx = crypto_aead_ctx(tfm);
208
209         /* Fallback is used for AES with 192-bit key. */
210         tctx->use_fallback = (cipher == OCS_AES &&
211                               key_len == OCS_AES_KEYSIZE_192);
212
213         if (!tctx->use_fallback)
214                 return save_key(tctx, in_key, key_len, cipher);
215
216         crypto_aead_clear_flags(tctx->sw_cipher.aead, CRYPTO_TFM_REQ_MASK);
217         crypto_aead_set_flags(tctx->sw_cipher.aead,
218                               crypto_aead_get_flags(tfm) & CRYPTO_TFM_REQ_MASK);
219
220         return crypto_aead_setkey(tctx->sw_cipher.aead, in_key, key_len);
221 }
222
223 /* Swap two AES blocks in SG lists. */
224 static void sg_swap_blocks(struct scatterlist *sgl, unsigned int nents,
225                            off_t blk1_offset, off_t blk2_offset)
226 {
227         u8 tmp_buf1[AES_BLOCK_SIZE], tmp_buf2[AES_BLOCK_SIZE];
228
229         /*
230          * No easy way to copy within sg list, so copy both blocks to temporary
231          * buffers first.
232          */
233         sg_pcopy_to_buffer(sgl, nents, tmp_buf1, AES_BLOCK_SIZE, blk1_offset);
234         sg_pcopy_to_buffer(sgl, nents, tmp_buf2, AES_BLOCK_SIZE, blk2_offset);
235         sg_pcopy_from_buffer(sgl, nents, tmp_buf1, AES_BLOCK_SIZE, blk2_offset);
236         sg_pcopy_from_buffer(sgl, nents, tmp_buf2, AES_BLOCK_SIZE, blk1_offset);
237 }
238
239 /* Initialize request context to default values. */
240 static void ocs_aes_init_rctx(struct ocs_aes_rctx *rctx)
241 {
242         /* Zero everything. */
243         memset(rctx, 0, sizeof(*rctx));
244
245         /* Set initial value for DMA addresses. */
246         rctx->src_dll.dma_addr = DMA_MAPPING_ERROR;
247         rctx->dst_dll.dma_addr = DMA_MAPPING_ERROR;
248         rctx->aad_src_dll.dma_addr = DMA_MAPPING_ERROR;
249         rctx->aad_dst_dll.dma_addr = DMA_MAPPING_ERROR;
250 }
251
252 static int kmb_ocs_sk_validate_input(struct skcipher_request *req,
253                                      enum ocs_mode mode)
254 {
255         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
256         int iv_size = crypto_skcipher_ivsize(tfm);
257
258         switch (mode) {
259         case OCS_MODE_ECB:
260                 /* Ensure input length is multiple of block size */
261                 if (req->cryptlen % AES_BLOCK_SIZE != 0)
262                         return -EINVAL;
263
264                 return 0;
265
266         case OCS_MODE_CBC:
267                 /* Ensure input length is multiple of block size */
268                 if (req->cryptlen % AES_BLOCK_SIZE != 0)
269                         return -EINVAL;
270
271                 /* Ensure IV is present and block size in length */
272                 if (!req->iv || iv_size != AES_BLOCK_SIZE)
273                         return -EINVAL;
274                 /*
275                  * NOTE: Since req->cryptlen == 0 case was already handled in
276                  * kmb_ocs_sk_common(), the above two conditions also guarantee
277                  * that: cryptlen >= iv_size
278                  */
279                 return 0;
280
281         case OCS_MODE_CTR:
282                 /* Ensure IV is present and block size in length */
283                 if (!req->iv || iv_size != AES_BLOCK_SIZE)
284                         return -EINVAL;
285                 return 0;
286
287         case OCS_MODE_CTS:
288                 /* Ensure input length >= block size */
289                 if (req->cryptlen < AES_BLOCK_SIZE)
290                         return -EINVAL;
291
292                 /* Ensure IV is present and block size in length */
293                 if (!req->iv || iv_size != AES_BLOCK_SIZE)
294                         return -EINVAL;
295
296                 return 0;
297         default:
298                 return -EINVAL;
299         }
300 }
301
302 /*
303  * Called by encrypt() / decrypt() skcipher functions.
304  *
305  * Use fallback if needed, otherwise initialize context and enqueue request
306  * into engine.
307  */
308 static int kmb_ocs_sk_common(struct skcipher_request *req,
309                              enum ocs_cipher cipher,
310                              enum ocs_instruction instruction,
311                              enum ocs_mode mode)
312 {
313         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
314         struct ocs_aes_rctx *rctx = skcipher_request_ctx(req);
315         struct ocs_aes_tctx *tctx = crypto_skcipher_ctx(tfm);
316         struct ocs_aes_dev *aes_dev;
317         int rc;
318
319         if (tctx->use_fallback) {
320                 SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, tctx->sw_cipher.sk);
321
322                 skcipher_request_set_sync_tfm(subreq, tctx->sw_cipher.sk);
323                 skcipher_request_set_callback(subreq, req->base.flags, NULL,
324                                               NULL);
325                 skcipher_request_set_crypt(subreq, req->src, req->dst,
326                                            req->cryptlen, req->iv);
327
328                 if (instruction == OCS_ENCRYPT)
329                         rc = crypto_skcipher_encrypt(subreq);
330                 else
331                         rc = crypto_skcipher_decrypt(subreq);
332
333                 skcipher_request_zero(subreq);
334
335                 return rc;
336         }
337
338         /*
339          * If cryptlen == 0, no processing needed for ECB, CBC and CTR.
340          *
341          * For CTS continue: kmb_ocs_sk_validate_input() will return -EINVAL.
342          */
343         if (!req->cryptlen && mode != OCS_MODE_CTS)
344                 return 0;
345
346         rc = kmb_ocs_sk_validate_input(req, mode);
347         if (rc)
348                 return rc;
349
350         aes_dev = kmb_ocs_aes_find_dev(tctx);
351         if (!aes_dev)
352                 return -ENODEV;
353
354         if (cipher != tctx->cipher)
355                 return -EINVAL;
356
357         ocs_aes_init_rctx(rctx);
358         rctx->instruction = instruction;
359         rctx->mode = mode;
360
361         return crypto_transfer_skcipher_request_to_engine(aes_dev->engine, req);
362 }
363
364 static void cleanup_ocs_dma_linked_list(struct device *dev,
365                                         struct ocs_dll_desc *dll)
366 {
367         if (dll->vaddr)
368                 dma_free_coherent(dev, dll->size, dll->vaddr, dll->dma_addr);
369         dll->vaddr = NULL;
370         dll->size = 0;
371         dll->dma_addr = DMA_MAPPING_ERROR;
372 }
373
374 static void kmb_ocs_sk_dma_cleanup(struct skcipher_request *req)
375 {
376         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
377         struct ocs_aes_rctx *rctx = skcipher_request_ctx(req);
378         struct ocs_aes_tctx *tctx = crypto_skcipher_ctx(tfm);
379         struct device *dev = tctx->aes_dev->dev;
380
381         if (rctx->src_dma_count) {
382                 dma_unmap_sg(dev, req->src, rctx->src_nents, DMA_TO_DEVICE);
383                 rctx->src_dma_count = 0;
384         }
385
386         if (rctx->dst_dma_count) {
387                 dma_unmap_sg(dev, req->dst, rctx->dst_nents, rctx->in_place ?
388                                                              DMA_BIDIRECTIONAL :
389                                                              DMA_FROM_DEVICE);
390                 rctx->dst_dma_count = 0;
391         }
392
393         /* Clean up OCS DMA linked lists */
394         cleanup_ocs_dma_linked_list(dev, &rctx->src_dll);
395         cleanup_ocs_dma_linked_list(dev, &rctx->dst_dll);
396 }
397
398 static int kmb_ocs_sk_prepare_inplace(struct skcipher_request *req)
399 {
400         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
401         struct ocs_aes_rctx *rctx = skcipher_request_ctx(req);
402         struct ocs_aes_tctx *tctx = crypto_skcipher_ctx(tfm);
403         int iv_size = crypto_skcipher_ivsize(tfm);
404         int rc;
405
406         /*
407          * For CBC decrypt, save last block (iv) to last_ct_blk buffer.
408          *
409          * Note: if we are here, we already checked that cryptlen >= iv_size
410          * and iv_size == AES_BLOCK_SIZE (i.e., the size of last_ct_blk); see
411          * kmb_ocs_sk_validate_input().
412          */
413         if (rctx->mode == OCS_MODE_CBC && rctx->instruction == OCS_DECRYPT)
414                 scatterwalk_map_and_copy(rctx->last_ct_blk, req->src,
415                                          req->cryptlen - iv_size, iv_size, 0);
416
417         /* For CTS decrypt, swap last two blocks, if needed. */
418         if (rctx->cts_swap && rctx->instruction == OCS_DECRYPT)
419                 sg_swap_blocks(req->dst, rctx->dst_nents,
420                                req->cryptlen - AES_BLOCK_SIZE,
421                                req->cryptlen - (2 * AES_BLOCK_SIZE));
422
423         /* src and dst buffers are the same, use bidirectional DMA mapping. */
424         rctx->dst_dma_count = dma_map_sg(tctx->aes_dev->dev, req->dst,
425                                          rctx->dst_nents, DMA_BIDIRECTIONAL);
426         if (rctx->dst_dma_count == 0) {
427                 dev_err(tctx->aes_dev->dev, "Failed to map destination sg\n");
428                 return -ENOMEM;
429         }
430
431         /* Create DST linked list */
432         rc = ocs_create_linked_list_from_sg(tctx->aes_dev, req->dst,
433                                             rctx->dst_dma_count, &rctx->dst_dll,
434                                             req->cryptlen, 0);
435         if (rc)
436                 return rc;
437         /*
438          * If descriptor creation was successful, set the src_dll.dma_addr to
439          * the value of dst_dll.dma_addr, as we do in-place AES operation on
440          * the src.
441          */
442         rctx->src_dll.dma_addr = rctx->dst_dll.dma_addr;
443
444         return 0;
445 }
446
447 static int kmb_ocs_sk_prepare_notinplace(struct skcipher_request *req)
448 {
449         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
450         struct ocs_aes_rctx *rctx = skcipher_request_ctx(req);
451         struct ocs_aes_tctx *tctx = crypto_skcipher_ctx(tfm);
452         int rc;
453
454         rctx->src_nents =  sg_nents_for_len(req->src, req->cryptlen);
455         if (rctx->src_nents < 0)
456                 return -EBADMSG;
457
458         /* Map SRC SG. */
459         rctx->src_dma_count = dma_map_sg(tctx->aes_dev->dev, req->src,
460                                          rctx->src_nents, DMA_TO_DEVICE);
461         if (rctx->src_dma_count == 0) {
462                 dev_err(tctx->aes_dev->dev, "Failed to map source sg\n");
463                 return -ENOMEM;
464         }
465
466         /* Create SRC linked list */
467         rc = ocs_create_linked_list_from_sg(tctx->aes_dev, req->src,
468                                             rctx->src_dma_count, &rctx->src_dll,
469                                             req->cryptlen, 0);
470         if (rc)
471                 return rc;
472
473         /* Map DST SG. */
474         rctx->dst_dma_count = dma_map_sg(tctx->aes_dev->dev, req->dst,
475                                          rctx->dst_nents, DMA_FROM_DEVICE);
476         if (rctx->dst_dma_count == 0) {
477                 dev_err(tctx->aes_dev->dev, "Failed to map destination sg\n");
478                 return -ENOMEM;
479         }
480
481         /* Create DST linked list */
482         rc = ocs_create_linked_list_from_sg(tctx->aes_dev, req->dst,
483                                             rctx->dst_dma_count, &rctx->dst_dll,
484                                             req->cryptlen, 0);
485         if (rc)
486                 return rc;
487
488         /* If this is not a CTS decrypt operation with swapping, we are done. */
489         if (!(rctx->cts_swap && rctx->instruction == OCS_DECRYPT))
490                 return 0;
491
492         /*
493          * Otherwise, we have to copy src to dst (as we cannot modify src).
494          * Use OCS AES bypass mode to copy src to dst via DMA.
495          *
496          * NOTE: for anything other than small data sizes this is rather
497          * inefficient.
498          */
499         rc = ocs_aes_bypass_op(tctx->aes_dev, rctx->dst_dll.dma_addr,
500                                rctx->src_dll.dma_addr, req->cryptlen);
501         if (rc)
502                 return rc;
503
504         /*
505          * Now dst == src, so clean up what we did so far and use in_place
506          * logic.
507          */
508         kmb_ocs_sk_dma_cleanup(req);
509         rctx->in_place = true;
510
511         return kmb_ocs_sk_prepare_inplace(req);
512 }
513
514 static int kmb_ocs_sk_run(struct skcipher_request *req)
515 {
516         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
517         struct ocs_aes_rctx *rctx = skcipher_request_ctx(req);
518         struct ocs_aes_tctx *tctx = crypto_skcipher_ctx(tfm);
519         struct ocs_aes_dev *aes_dev = tctx->aes_dev;
520         int iv_size = crypto_skcipher_ivsize(tfm);
521         int rc;
522
523         rctx->dst_nents = sg_nents_for_len(req->dst, req->cryptlen);
524         if (rctx->dst_nents < 0)
525                 return -EBADMSG;
526
527         /*
528          * If 2 blocks or greater, and multiple of block size swap last two
529          * blocks to be compatible with other crypto API CTS implementations:
530          * OCS mode uses CBC-CS2, whereas other crypto API implementations use
531          * CBC-CS3.
532          * CBC-CS2 and CBC-CS3 defined by:
533          * https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a-add.pdf
534          */
535         rctx->cts_swap = (rctx->mode == OCS_MODE_CTS &&
536                           req->cryptlen > AES_BLOCK_SIZE &&
537                           req->cryptlen % AES_BLOCK_SIZE == 0);
538
539         rctx->in_place = (req->src == req->dst);
540
541         if (rctx->in_place)
542                 rc = kmb_ocs_sk_prepare_inplace(req);
543         else
544                 rc = kmb_ocs_sk_prepare_notinplace(req);
545
546         if (rc)
547                 goto error;
548
549         rc = ocs_aes_op(aes_dev, rctx->mode, tctx->cipher, rctx->instruction,
550                         rctx->dst_dll.dma_addr, rctx->src_dll.dma_addr,
551                         req->cryptlen, req->iv, iv_size);
552         if (rc)
553                 goto error;
554
555         /* Clean-up DMA before further processing output. */
556         kmb_ocs_sk_dma_cleanup(req);
557
558         /* For CTS Encrypt, swap last 2 blocks, if needed. */
559         if (rctx->cts_swap && rctx->instruction == OCS_ENCRYPT) {
560                 sg_swap_blocks(req->dst, rctx->dst_nents,
561                                req->cryptlen - AES_BLOCK_SIZE,
562                                req->cryptlen - (2 * AES_BLOCK_SIZE));
563                 return 0;
564         }
565
566         /* For CBC copy IV to req->IV. */
567         if (rctx->mode == OCS_MODE_CBC) {
568                 /* CBC encrypt case. */
569                 if (rctx->instruction == OCS_ENCRYPT) {
570                         scatterwalk_map_and_copy(req->iv, req->dst,
571                                                  req->cryptlen - iv_size,
572                                                  iv_size, 0);
573                         return 0;
574                 }
575                 /* CBC decrypt case. */
576                 if (rctx->in_place)
577                         memcpy(req->iv, rctx->last_ct_blk, iv_size);
578                 else
579                         scatterwalk_map_and_copy(req->iv, req->src,
580                                                  req->cryptlen - iv_size,
581                                                  iv_size, 0);
582                 return 0;
583         }
584         /* For all other modes there's nothing to do. */
585
586         return 0;
587
588 error:
589         kmb_ocs_sk_dma_cleanup(req);
590
591         return rc;
592 }
593
594 static int kmb_ocs_aead_validate_input(struct aead_request *req,
595                                        enum ocs_instruction instruction,
596                                        enum ocs_mode mode)
597 {
598         struct crypto_aead *tfm = crypto_aead_reqtfm(req);
599         int tag_size = crypto_aead_authsize(tfm);
600         int iv_size = crypto_aead_ivsize(tfm);
601
602         /* For decrypt crytplen == len(PT) + len(tag). */
603         if (instruction == OCS_DECRYPT && req->cryptlen < tag_size)
604                 return -EINVAL;
605
606         /* IV is mandatory. */
607         if (!req->iv)
608                 return -EINVAL;
609
610         switch (mode) {
611         case OCS_MODE_GCM:
612                 if (iv_size != GCM_AES_IV_SIZE)
613                         return -EINVAL;
614
615                 return 0;
616
617         case OCS_MODE_CCM:
618                 /* Ensure IV is present and block size in length */
619                 if (iv_size != AES_BLOCK_SIZE)
620                         return -EINVAL;
621
622                 return 0;
623
624         default:
625                 return -EINVAL;
626         }
627 }
628
629 /*
630  * Called by encrypt() / decrypt() aead functions.
631  *
632  * Use fallback if needed, otherwise initialize context and enqueue request
633  * into engine.
634  */
635 static int kmb_ocs_aead_common(struct aead_request *req,
636                                enum ocs_cipher cipher,
637                                enum ocs_instruction instruction,
638                                enum ocs_mode mode)
639 {
640         struct ocs_aes_tctx *tctx = crypto_aead_ctx(crypto_aead_reqtfm(req));
641         struct ocs_aes_rctx *rctx = aead_request_ctx(req);
642         struct ocs_aes_dev *dd;
643         int rc;
644
645         if (tctx->use_fallback) {
646                 struct aead_request *subreq = aead_request_ctx(req);
647
648                 aead_request_set_tfm(subreq, tctx->sw_cipher.aead);
649                 aead_request_set_callback(subreq, req->base.flags,
650                                           req->base.complete, req->base.data);
651                 aead_request_set_crypt(subreq, req->src, req->dst,
652                                        req->cryptlen, req->iv);
653                 aead_request_set_ad(subreq, req->assoclen);
654                 rc = crypto_aead_setauthsize(tctx->sw_cipher.aead,
655                                              crypto_aead_authsize(crypto_aead_reqtfm(req)));
656                 if (rc)
657                         return rc;
658
659                 return (instruction == OCS_ENCRYPT) ?
660                        crypto_aead_encrypt(subreq) :
661                        crypto_aead_decrypt(subreq);
662         }
663
664         rc = kmb_ocs_aead_validate_input(req, instruction, mode);
665         if (rc)
666                 return rc;
667
668         dd = kmb_ocs_aes_find_dev(tctx);
669         if (!dd)
670                 return -ENODEV;
671
672         if (cipher != tctx->cipher)
673                 return -EINVAL;
674
675         ocs_aes_init_rctx(rctx);
676         rctx->instruction = instruction;
677         rctx->mode = mode;
678
679         return crypto_transfer_aead_request_to_engine(dd->engine, req);
680 }
681
682 static void kmb_ocs_aead_dma_cleanup(struct aead_request *req)
683 {
684         struct ocs_aes_tctx *tctx = crypto_aead_ctx(crypto_aead_reqtfm(req));
685         struct ocs_aes_rctx *rctx = aead_request_ctx(req);
686         struct device *dev = tctx->aes_dev->dev;
687
688         if (rctx->src_dma_count) {
689                 dma_unmap_sg(dev, req->src, rctx->src_nents, DMA_TO_DEVICE);
690                 rctx->src_dma_count = 0;
691         }
692
693         if (rctx->dst_dma_count) {
694                 dma_unmap_sg(dev, req->dst, rctx->dst_nents, rctx->in_place ?
695                                                              DMA_BIDIRECTIONAL :
696                                                              DMA_FROM_DEVICE);
697                 rctx->dst_dma_count = 0;
698         }
699         /* Clean up OCS DMA linked lists */
700         cleanup_ocs_dma_linked_list(dev, &rctx->src_dll);
701         cleanup_ocs_dma_linked_list(dev, &rctx->dst_dll);
702         cleanup_ocs_dma_linked_list(dev, &rctx->aad_src_dll);
703         cleanup_ocs_dma_linked_list(dev, &rctx->aad_dst_dll);
704 }
705
706 /**
707  * kmb_ocs_aead_dma_prepare() - Do DMA mapping for AEAD processing.
708  * @req:                The AEAD request being processed.
709  * @src_dll_size:       Where to store the length of the data mapped into the
710  *                      src_dll OCS DMA list.
711  *
712  * Do the following:
713  * - DMA map req->src and req->dst
714  * - Initialize the following OCS DMA linked lists: rctx->src_dll,
715  *   rctx->dst_dll, rctx->aad_src_dll and rxtc->aad_dst_dll.
716  *
717  * Return: 0 on success, negative error code otherwise.
718  */
719 static int kmb_ocs_aead_dma_prepare(struct aead_request *req, u32 *src_dll_size)
720 {
721         struct ocs_aes_tctx *tctx = crypto_aead_ctx(crypto_aead_reqtfm(req));
722         const int tag_size = crypto_aead_authsize(crypto_aead_reqtfm(req));
723         struct ocs_aes_rctx *rctx = aead_request_ctx(req);
724         u32 in_size;    /* The length of the data to be mapped by src_dll. */
725         u32 out_size;   /* The length of the data to be mapped by dst_dll. */
726         u32 dst_size;   /* The length of the data in dst_sg. */
727         int rc;
728
729         /* Get number of entries in input data SG list. */
730         rctx->src_nents = sg_nents_for_len(req->src,
731                                            req->assoclen + req->cryptlen);
732         if (rctx->src_nents < 0)
733                 return -EBADMSG;
734
735         if (rctx->instruction == OCS_DECRYPT) {
736                 /*
737                  * For decrypt:
738                  * - src sg list is:            AAD|CT|tag
739                  * - dst sg list expects:       AAD|PT
740                  *
741                  * in_size == len(CT); out_size == len(PT)
742                  */
743
744                 /* req->cryptlen includes both CT and tag. */
745                 in_size = req->cryptlen - tag_size;
746
747                 /* out_size = PT size == CT size */
748                 out_size = in_size;
749
750                 /* len(dst_sg) == len(AAD) + len(PT) */
751                 dst_size = req->assoclen + out_size;
752
753                 /*
754                  * Copy tag from source SG list to 'in_tag' buffer.
755                  *
756                  * Note: this needs to be done here, before DMA mapping src_sg.
757                  */
758                 sg_pcopy_to_buffer(req->src, rctx->src_nents, rctx->in_tag,
759                                    tag_size, req->assoclen + in_size);
760
761         } else { /* OCS_ENCRYPT */
762                 /*
763                  * For encrypt:
764                  *      src sg list is:         AAD|PT
765                  *      dst sg list expects:    AAD|CT|tag
766                  */
767                 /* in_size == len(PT) */
768                 in_size = req->cryptlen;
769
770                 /*
771                  * In CCM mode the OCS engine appends the tag to the ciphertext,
772                  * but in GCM mode the tag must be read from the tag registers
773                  * and appended manually below
774                  */
775                 out_size = (rctx->mode == OCS_MODE_CCM) ? in_size + tag_size :
776                                                           in_size;
777                 /* len(dst_sg) == len(AAD) + len(CT) + len(tag) */
778                 dst_size = req->assoclen + in_size + tag_size;
779         }
780         *src_dll_size = in_size;
781
782         /* Get number of entries in output data SG list. */
783         rctx->dst_nents = sg_nents_for_len(req->dst, dst_size);
784         if (rctx->dst_nents < 0)
785                 return -EBADMSG;
786
787         rctx->in_place = (req->src == req->dst) ? 1 : 0;
788
789         /* Map destination; use bidirectional mapping for in-place case. */
790         rctx->dst_dma_count = dma_map_sg(tctx->aes_dev->dev, req->dst,
791                                          rctx->dst_nents,
792                                          rctx->in_place ? DMA_BIDIRECTIONAL :
793                                                           DMA_FROM_DEVICE);
794         if (rctx->dst_dma_count == 0 && rctx->dst_nents != 0) {
795                 dev_err(tctx->aes_dev->dev, "Failed to map destination sg\n");
796                 return -ENOMEM;
797         }
798
799         /* Create AAD DST list: maps dst[0:AAD_SIZE-1]. */
800         rc = ocs_create_linked_list_from_sg(tctx->aes_dev, req->dst,
801                                             rctx->dst_dma_count,
802                                             &rctx->aad_dst_dll, req->assoclen,
803                                             0);
804         if (rc)
805                 return rc;
806
807         /* Create DST list: maps dst[AAD_SIZE:out_size] */
808         rc = ocs_create_linked_list_from_sg(tctx->aes_dev, req->dst,
809                                             rctx->dst_dma_count, &rctx->dst_dll,
810                                             out_size, req->assoclen);
811         if (rc)
812                 return rc;
813
814         if (rctx->in_place) {
815                 /* If this is not CCM encrypt, we are done. */
816                 if (!(rctx->mode == OCS_MODE_CCM &&
817                       rctx->instruction == OCS_ENCRYPT)) {
818                         /*
819                          * SRC and DST are the same, so re-use the same DMA
820                          * addresses (to avoid allocating new DMA lists
821                          * identical to the dst ones).
822                          */
823                         rctx->src_dll.dma_addr = rctx->dst_dll.dma_addr;
824                         rctx->aad_src_dll.dma_addr = rctx->aad_dst_dll.dma_addr;
825
826                         return 0;
827                 }
828                 /*
829                  * For CCM encrypt the input and output linked lists contain
830                  * different amounts of data, so, we need to create different
831                  * SRC and AAD SRC lists, even for the in-place case.
832                  */
833                 rc = ocs_create_linked_list_from_sg(tctx->aes_dev, req->dst,
834                                                     rctx->dst_dma_count,
835                                                     &rctx->aad_src_dll,
836                                                     req->assoclen, 0);
837                 if (rc)
838                         return rc;
839                 rc = ocs_create_linked_list_from_sg(tctx->aes_dev, req->dst,
840                                                     rctx->dst_dma_count,
841                                                     &rctx->src_dll, in_size,
842                                                     req->assoclen);
843                 if (rc)
844                         return rc;
845
846                 return 0;
847         }
848         /* Not in-place case. */
849
850         /* Map source SG. */
851         rctx->src_dma_count = dma_map_sg(tctx->aes_dev->dev, req->src,
852                                          rctx->src_nents, DMA_TO_DEVICE);
853         if (rctx->src_dma_count == 0 && rctx->src_nents != 0) {
854                 dev_err(tctx->aes_dev->dev, "Failed to map source sg\n");
855                 return -ENOMEM;
856         }
857
858         /* Create AAD SRC list. */
859         rc = ocs_create_linked_list_from_sg(tctx->aes_dev, req->src,
860                                             rctx->src_dma_count,
861                                             &rctx->aad_src_dll,
862                                             req->assoclen, 0);
863         if (rc)
864                 return rc;
865
866         /* Create SRC list. */
867         rc = ocs_create_linked_list_from_sg(tctx->aes_dev, req->src,
868                                             rctx->src_dma_count,
869                                             &rctx->src_dll, in_size,
870                                             req->assoclen);
871         if (rc)
872                 return rc;
873
874         if (req->assoclen == 0)
875                 return 0;
876
877         /* Copy AAD from src sg to dst sg using OCS DMA. */
878         rc = ocs_aes_bypass_op(tctx->aes_dev, rctx->aad_dst_dll.dma_addr,
879                                rctx->aad_src_dll.dma_addr, req->cryptlen);
880         if (rc)
881                 dev_err(tctx->aes_dev->dev,
882                         "Failed to copy source AAD to destination AAD\n");
883
884         return rc;
885 }
886
887 static int kmb_ocs_aead_run(struct aead_request *req)
888 {
889         struct ocs_aes_tctx *tctx = crypto_aead_ctx(crypto_aead_reqtfm(req));
890         const int tag_size = crypto_aead_authsize(crypto_aead_reqtfm(req));
891         struct ocs_aes_rctx *rctx = aead_request_ctx(req);
892         u32 in_size;    /* The length of the data mapped by src_dll. */
893         int rc;
894
895         rc = kmb_ocs_aead_dma_prepare(req, &in_size);
896         if (rc)
897                 goto exit;
898
899         /* For CCM, we just call the OCS processing and we are done. */
900         if (rctx->mode == OCS_MODE_CCM) {
901                 rc = ocs_aes_ccm_op(tctx->aes_dev, tctx->cipher,
902                                     rctx->instruction, rctx->dst_dll.dma_addr,
903                                     rctx->src_dll.dma_addr, in_size,
904                                     req->iv,
905                                     rctx->aad_src_dll.dma_addr, req->assoclen,
906                                     rctx->in_tag, tag_size);
907                 goto exit;
908         }
909         /* GCM case; invoke OCS processing. */
910         rc = ocs_aes_gcm_op(tctx->aes_dev, tctx->cipher,
911                             rctx->instruction,
912                             rctx->dst_dll.dma_addr,
913                             rctx->src_dll.dma_addr, in_size,
914                             req->iv,
915                             rctx->aad_src_dll.dma_addr, req->assoclen,
916                             rctx->out_tag, tag_size);
917         if (rc)
918                 goto exit;
919
920         /* For GCM decrypt, we have to compare in_tag with out_tag. */
921         if (rctx->instruction == OCS_DECRYPT) {
922                 rc = memcmp(rctx->in_tag, rctx->out_tag, tag_size) ?
923                      -EBADMSG : 0;
924                 goto exit;
925         }
926
927         /* For GCM encrypt, we must manually copy out_tag to DST sg. */
928
929         /* Clean-up must be called before the sg_pcopy_from_buffer() below. */
930         kmb_ocs_aead_dma_cleanup(req);
931
932         /* Copy tag to destination sg after AAD and CT. */
933         sg_pcopy_from_buffer(req->dst, rctx->dst_nents, rctx->out_tag,
934                              tag_size, req->assoclen + req->cryptlen);
935
936         /* Return directly as DMA cleanup already done. */
937         return 0;
938
939 exit:
940         kmb_ocs_aead_dma_cleanup(req);
941
942         return rc;
943 }
944
945 static int kmb_ocs_aes_sk_do_one_request(struct crypto_engine *engine,
946                                          void *areq)
947 {
948         struct skcipher_request *req =
949                         container_of(areq, struct skcipher_request, base);
950         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
951         struct ocs_aes_tctx *tctx = crypto_skcipher_ctx(tfm);
952         int err;
953
954         if (!tctx->aes_dev) {
955                 err = -ENODEV;
956                 goto exit;
957         }
958
959         err = ocs_aes_set_key(tctx->aes_dev, tctx->key_len, tctx->key,
960                               tctx->cipher);
961         if (err)
962                 goto exit;
963
964         err = kmb_ocs_sk_run(req);
965
966 exit:
967         crypto_finalize_skcipher_request(engine, req, err);
968
969         return 0;
970 }
971
972 static int kmb_ocs_aes_aead_do_one_request(struct crypto_engine *engine,
973                                            void *areq)
974 {
975         struct aead_request *req = container_of(areq,
976                                                 struct aead_request, base);
977         struct ocs_aes_tctx *tctx = crypto_aead_ctx(crypto_aead_reqtfm(req));
978         int err;
979
980         if (!tctx->aes_dev)
981                 return -ENODEV;
982
983         err = ocs_aes_set_key(tctx->aes_dev, tctx->key_len, tctx->key,
984                               tctx->cipher);
985         if (err)
986                 goto exit;
987
988         err = kmb_ocs_aead_run(req);
989
990 exit:
991         crypto_finalize_aead_request(tctx->aes_dev->engine, req, err);
992
993         return 0;
994 }
995
996 static int kmb_ocs_aes_set_key(struct crypto_skcipher *tfm, const u8 *in_key,
997                                unsigned int key_len)
998 {
999         return kmb_ocs_sk_set_key(tfm, in_key, key_len, OCS_AES);
1000 }
1001
1002 static int kmb_ocs_aes_aead_set_key(struct crypto_aead *tfm, const u8 *in_key,
1003                                     unsigned int key_len)
1004 {
1005         return kmb_ocs_aead_set_key(tfm, in_key, key_len, OCS_AES);
1006 }
1007
1008 #ifdef CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_ECB
1009 static int kmb_ocs_aes_ecb_encrypt(struct skcipher_request *req)
1010 {
1011         return kmb_ocs_sk_common(req, OCS_AES, OCS_ENCRYPT, OCS_MODE_ECB);
1012 }
1013
1014 static int kmb_ocs_aes_ecb_decrypt(struct skcipher_request *req)
1015 {
1016         return kmb_ocs_sk_common(req, OCS_AES, OCS_DECRYPT, OCS_MODE_ECB);
1017 }
1018 #endif /* CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_ECB */
1019
1020 static int kmb_ocs_aes_cbc_encrypt(struct skcipher_request *req)
1021 {
1022         return kmb_ocs_sk_common(req, OCS_AES, OCS_ENCRYPT, OCS_MODE_CBC);
1023 }
1024
1025 static int kmb_ocs_aes_cbc_decrypt(struct skcipher_request *req)
1026 {
1027         return kmb_ocs_sk_common(req, OCS_AES, OCS_DECRYPT, OCS_MODE_CBC);
1028 }
1029
1030 static int kmb_ocs_aes_ctr_encrypt(struct skcipher_request *req)
1031 {
1032         return kmb_ocs_sk_common(req, OCS_AES, OCS_ENCRYPT, OCS_MODE_CTR);
1033 }
1034
1035 static int kmb_ocs_aes_ctr_decrypt(struct skcipher_request *req)
1036 {
1037         return kmb_ocs_sk_common(req, OCS_AES, OCS_DECRYPT, OCS_MODE_CTR);
1038 }
1039
1040 #ifdef CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_CTS
1041 static int kmb_ocs_aes_cts_encrypt(struct skcipher_request *req)
1042 {
1043         return kmb_ocs_sk_common(req, OCS_AES, OCS_ENCRYPT, OCS_MODE_CTS);
1044 }
1045
1046 static int kmb_ocs_aes_cts_decrypt(struct skcipher_request *req)
1047 {
1048         return kmb_ocs_sk_common(req, OCS_AES, OCS_DECRYPT, OCS_MODE_CTS);
1049 }
1050 #endif /* CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_CTS */
1051
1052 static int kmb_ocs_aes_gcm_encrypt(struct aead_request *req)
1053 {
1054         return kmb_ocs_aead_common(req, OCS_AES, OCS_ENCRYPT, OCS_MODE_GCM);
1055 }
1056
1057 static int kmb_ocs_aes_gcm_decrypt(struct aead_request *req)
1058 {
1059         return kmb_ocs_aead_common(req, OCS_AES, OCS_DECRYPT, OCS_MODE_GCM);
1060 }
1061
1062 static int kmb_ocs_aes_ccm_encrypt(struct aead_request *req)
1063 {
1064         return kmb_ocs_aead_common(req, OCS_AES, OCS_ENCRYPT, OCS_MODE_CCM);
1065 }
1066
1067 static int kmb_ocs_aes_ccm_decrypt(struct aead_request *req)
1068 {
1069         return kmb_ocs_aead_common(req, OCS_AES, OCS_DECRYPT, OCS_MODE_CCM);
1070 }
1071
1072 static int kmb_ocs_sm4_set_key(struct crypto_skcipher *tfm, const u8 *in_key,
1073                                unsigned int key_len)
1074 {
1075         return kmb_ocs_sk_set_key(tfm, in_key, key_len, OCS_SM4);
1076 }
1077
1078 static int kmb_ocs_sm4_aead_set_key(struct crypto_aead *tfm, const u8 *in_key,
1079                                     unsigned int key_len)
1080 {
1081         return kmb_ocs_aead_set_key(tfm, in_key, key_len, OCS_SM4);
1082 }
1083
1084 #ifdef CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_ECB
1085 static int kmb_ocs_sm4_ecb_encrypt(struct skcipher_request *req)
1086 {
1087         return kmb_ocs_sk_common(req, OCS_SM4, OCS_ENCRYPT, OCS_MODE_ECB);
1088 }
1089
1090 static int kmb_ocs_sm4_ecb_decrypt(struct skcipher_request *req)
1091 {
1092         return kmb_ocs_sk_common(req, OCS_SM4, OCS_DECRYPT, OCS_MODE_ECB);
1093 }
1094 #endif /* CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_ECB */
1095
1096 static int kmb_ocs_sm4_cbc_encrypt(struct skcipher_request *req)
1097 {
1098         return kmb_ocs_sk_common(req, OCS_SM4, OCS_ENCRYPT, OCS_MODE_CBC);
1099 }
1100
1101 static int kmb_ocs_sm4_cbc_decrypt(struct skcipher_request *req)
1102 {
1103         return kmb_ocs_sk_common(req, OCS_SM4, OCS_DECRYPT, OCS_MODE_CBC);
1104 }
1105
1106 static int kmb_ocs_sm4_ctr_encrypt(struct skcipher_request *req)
1107 {
1108         return kmb_ocs_sk_common(req, OCS_SM4, OCS_ENCRYPT, OCS_MODE_CTR);
1109 }
1110
1111 static int kmb_ocs_sm4_ctr_decrypt(struct skcipher_request *req)
1112 {
1113         return kmb_ocs_sk_common(req, OCS_SM4, OCS_DECRYPT, OCS_MODE_CTR);
1114 }
1115
1116 #ifdef CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_CTS
1117 static int kmb_ocs_sm4_cts_encrypt(struct skcipher_request *req)
1118 {
1119         return kmb_ocs_sk_common(req, OCS_SM4, OCS_ENCRYPT, OCS_MODE_CTS);
1120 }
1121
1122 static int kmb_ocs_sm4_cts_decrypt(struct skcipher_request *req)
1123 {
1124         return kmb_ocs_sk_common(req, OCS_SM4, OCS_DECRYPT, OCS_MODE_CTS);
1125 }
1126 #endif /* CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_CTS */
1127
1128 static int kmb_ocs_sm4_gcm_encrypt(struct aead_request *req)
1129 {
1130         return kmb_ocs_aead_common(req, OCS_SM4, OCS_ENCRYPT, OCS_MODE_GCM);
1131 }
1132
1133 static int kmb_ocs_sm4_gcm_decrypt(struct aead_request *req)
1134 {
1135         return kmb_ocs_aead_common(req, OCS_SM4, OCS_DECRYPT, OCS_MODE_GCM);
1136 }
1137
1138 static int kmb_ocs_sm4_ccm_encrypt(struct aead_request *req)
1139 {
1140         return kmb_ocs_aead_common(req, OCS_SM4, OCS_ENCRYPT, OCS_MODE_CCM);
1141 }
1142
1143 static int kmb_ocs_sm4_ccm_decrypt(struct aead_request *req)
1144 {
1145         return kmb_ocs_aead_common(req, OCS_SM4, OCS_DECRYPT, OCS_MODE_CCM);
1146 }
1147
1148 static int ocs_aes_init_tfm(struct crypto_skcipher *tfm)
1149 {
1150         const char *alg_name = crypto_tfm_alg_name(&tfm->base);
1151         struct ocs_aes_tctx *tctx = crypto_skcipher_ctx(tfm);
1152         struct crypto_sync_skcipher *blk;
1153
1154         /* set fallback cipher in case it will be needed */
1155         blk = crypto_alloc_sync_skcipher(alg_name, 0, CRYPTO_ALG_NEED_FALLBACK);
1156         if (IS_ERR(blk))
1157                 return PTR_ERR(blk);
1158
1159         tctx->sw_cipher.sk = blk;
1160
1161         crypto_skcipher_set_reqsize(tfm, sizeof(struct ocs_aes_rctx));
1162
1163         return 0;
1164 }
1165
1166 static int ocs_sm4_init_tfm(struct crypto_skcipher *tfm)
1167 {
1168         crypto_skcipher_set_reqsize(tfm, sizeof(struct ocs_aes_rctx));
1169
1170         return 0;
1171 }
1172
1173 static inline void clear_key(struct ocs_aes_tctx *tctx)
1174 {
1175         memzero_explicit(tctx->key, OCS_AES_KEYSIZE_256);
1176
1177         /* Zero key registers if set */
1178         if (tctx->aes_dev)
1179                 ocs_aes_set_key(tctx->aes_dev, OCS_AES_KEYSIZE_256,
1180                                 tctx->key, OCS_AES);
1181 }
1182
1183 static void ocs_exit_tfm(struct crypto_skcipher *tfm)
1184 {
1185         struct ocs_aes_tctx *tctx = crypto_skcipher_ctx(tfm);
1186
1187         clear_key(tctx);
1188
1189         if (tctx->sw_cipher.sk) {
1190                 crypto_free_sync_skcipher(tctx->sw_cipher.sk);
1191                 tctx->sw_cipher.sk = NULL;
1192         }
1193 }
1194
1195 static int ocs_aes_aead_cra_init(struct crypto_aead *tfm)
1196 {
1197         const char *alg_name = crypto_tfm_alg_name(&tfm->base);
1198         struct ocs_aes_tctx *tctx = crypto_aead_ctx(tfm);
1199         struct crypto_aead *blk;
1200
1201         /* Set fallback cipher in case it will be needed */
1202         blk = crypto_alloc_aead(alg_name, 0, CRYPTO_ALG_NEED_FALLBACK);
1203         if (IS_ERR(blk))
1204                 return PTR_ERR(blk);
1205
1206         tctx->sw_cipher.aead = blk;
1207
1208         crypto_aead_set_reqsize(tfm,
1209                                 max(sizeof(struct ocs_aes_rctx),
1210                                     (sizeof(struct aead_request) +
1211                                      crypto_aead_reqsize(tctx->sw_cipher.aead))));
1212
1213         return 0;
1214 }
1215
1216 static int kmb_ocs_aead_ccm_setauthsize(struct crypto_aead *tfm,
1217                                         unsigned int authsize)
1218 {
1219         switch (authsize) {
1220         case 4:
1221         case 6:
1222         case 8:
1223         case 10:
1224         case 12:
1225         case 14:
1226         case 16:
1227                 return 0;
1228         default:
1229                 return -EINVAL;
1230         }
1231 }
1232
1233 static int kmb_ocs_aead_gcm_setauthsize(struct crypto_aead *tfm,
1234                                         unsigned int authsize)
1235 {
1236         return crypto_gcm_check_authsize(authsize);
1237 }
1238
1239 static int ocs_sm4_aead_cra_init(struct crypto_aead *tfm)
1240 {
1241         crypto_aead_set_reqsize(tfm, sizeof(struct ocs_aes_rctx));
1242
1243         return 0;
1244 }
1245
1246 static void ocs_aead_cra_exit(struct crypto_aead *tfm)
1247 {
1248         struct ocs_aes_tctx *tctx = crypto_aead_ctx(tfm);
1249
1250         clear_key(tctx);
1251
1252         if (tctx->sw_cipher.aead) {
1253                 crypto_free_aead(tctx->sw_cipher.aead);
1254                 tctx->sw_cipher.aead = NULL;
1255         }
1256 }
1257
1258 static struct skcipher_engine_alg algs[] = {
1259 #ifdef CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_ECB
1260         {
1261                 .base.base.cra_name = "ecb(aes)",
1262                 .base.base.cra_driver_name = "ecb-aes-keembay-ocs",
1263                 .base.base.cra_priority = KMB_OCS_PRIORITY,
1264                 .base.base.cra_flags = CRYPTO_ALG_ASYNC |
1265                                        CRYPTO_ALG_KERN_DRIVER_ONLY |
1266                                        CRYPTO_ALG_NEED_FALLBACK,
1267                 .base.base.cra_blocksize = AES_BLOCK_SIZE,
1268                 .base.base.cra_ctxsize = sizeof(struct ocs_aes_tctx),
1269                 .base.base.cra_module = THIS_MODULE,
1270                 .base.base.cra_alignmask = 0,
1271
1272                 .base.min_keysize = OCS_AES_MIN_KEY_SIZE,
1273                 .base.max_keysize = OCS_AES_MAX_KEY_SIZE,
1274                 .base.setkey = kmb_ocs_aes_set_key,
1275                 .base.encrypt = kmb_ocs_aes_ecb_encrypt,
1276                 .base.decrypt = kmb_ocs_aes_ecb_decrypt,
1277                 .base.init = ocs_aes_init_tfm,
1278                 .base.exit = ocs_exit_tfm,
1279                 .op.do_one_request = kmb_ocs_aes_sk_do_one_request,
1280         },
1281 #endif /* CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_ECB */
1282         {
1283                 .base.base.cra_name = "cbc(aes)",
1284                 .base.base.cra_driver_name = "cbc-aes-keembay-ocs",
1285                 .base.base.cra_priority = KMB_OCS_PRIORITY,
1286                 .base.base.cra_flags = CRYPTO_ALG_ASYNC |
1287                                        CRYPTO_ALG_KERN_DRIVER_ONLY |
1288                                        CRYPTO_ALG_NEED_FALLBACK,
1289                 .base.base.cra_blocksize = AES_BLOCK_SIZE,
1290                 .base.base.cra_ctxsize = sizeof(struct ocs_aes_tctx),
1291                 .base.base.cra_module = THIS_MODULE,
1292                 .base.base.cra_alignmask = 0,
1293
1294                 .base.min_keysize = OCS_AES_MIN_KEY_SIZE,
1295                 .base.max_keysize = OCS_AES_MAX_KEY_SIZE,
1296                 .base.ivsize = AES_BLOCK_SIZE,
1297                 .base.setkey = kmb_ocs_aes_set_key,
1298                 .base.encrypt = kmb_ocs_aes_cbc_encrypt,
1299                 .base.decrypt = kmb_ocs_aes_cbc_decrypt,
1300                 .base.init = ocs_aes_init_tfm,
1301                 .base.exit = ocs_exit_tfm,
1302                 .op.do_one_request = kmb_ocs_aes_sk_do_one_request,
1303         },
1304         {
1305                 .base.base.cra_name = "ctr(aes)",
1306                 .base.base.cra_driver_name = "ctr-aes-keembay-ocs",
1307                 .base.base.cra_priority = KMB_OCS_PRIORITY,
1308                 .base.base.cra_flags = CRYPTO_ALG_ASYNC |
1309                                        CRYPTO_ALG_KERN_DRIVER_ONLY |
1310                                        CRYPTO_ALG_NEED_FALLBACK,
1311                 .base.base.cra_blocksize = 1,
1312                 .base.base.cra_ctxsize = sizeof(struct ocs_aes_tctx),
1313                 .base.base.cra_module = THIS_MODULE,
1314                 .base.base.cra_alignmask = 0,
1315
1316                 .base.min_keysize = OCS_AES_MIN_KEY_SIZE,
1317                 .base.max_keysize = OCS_AES_MAX_KEY_SIZE,
1318                 .base.ivsize = AES_BLOCK_SIZE,
1319                 .base.setkey = kmb_ocs_aes_set_key,
1320                 .base.encrypt = kmb_ocs_aes_ctr_encrypt,
1321                 .base.decrypt = kmb_ocs_aes_ctr_decrypt,
1322                 .base.init = ocs_aes_init_tfm,
1323                 .base.exit = ocs_exit_tfm,
1324                 .op.do_one_request = kmb_ocs_aes_sk_do_one_request,
1325         },
1326 #ifdef CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_CTS
1327         {
1328                 .base.base.cra_name = "cts(cbc(aes))",
1329                 .base.base.cra_driver_name = "cts-aes-keembay-ocs",
1330                 .base.base.cra_priority = KMB_OCS_PRIORITY,
1331                 .base.base.cra_flags = CRYPTO_ALG_ASYNC |
1332                                        CRYPTO_ALG_KERN_DRIVER_ONLY |
1333                                        CRYPTO_ALG_NEED_FALLBACK,
1334                 .base.base.cra_blocksize = AES_BLOCK_SIZE,
1335                 .base.base.cra_ctxsize = sizeof(struct ocs_aes_tctx),
1336                 .base.base.cra_module = THIS_MODULE,
1337                 .base.base.cra_alignmask = 0,
1338
1339                 .base.min_keysize = OCS_AES_MIN_KEY_SIZE,
1340                 .base.max_keysize = OCS_AES_MAX_KEY_SIZE,
1341                 .base.ivsize = AES_BLOCK_SIZE,
1342                 .base.setkey = kmb_ocs_aes_set_key,
1343                 .base.encrypt = kmb_ocs_aes_cts_encrypt,
1344                 .base.decrypt = kmb_ocs_aes_cts_decrypt,
1345                 .base.init = ocs_aes_init_tfm,
1346                 .base.exit = ocs_exit_tfm,
1347                 .op.do_one_request = kmb_ocs_aes_sk_do_one_request,
1348         },
1349 #endif /* CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_CTS */
1350 #ifdef CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_ECB
1351         {
1352                 .base.base.cra_name = "ecb(sm4)",
1353                 .base.base.cra_driver_name = "ecb-sm4-keembay-ocs",
1354                 .base.base.cra_priority = KMB_OCS_PRIORITY,
1355                 .base.base.cra_flags = CRYPTO_ALG_ASYNC |
1356                                        CRYPTO_ALG_KERN_DRIVER_ONLY,
1357                 .base.base.cra_blocksize = AES_BLOCK_SIZE,
1358                 .base.base.cra_ctxsize = sizeof(struct ocs_aes_tctx),
1359                 .base.base.cra_module = THIS_MODULE,
1360                 .base.base.cra_alignmask = 0,
1361
1362                 .base.min_keysize = OCS_SM4_KEY_SIZE,
1363                 .base.max_keysize = OCS_SM4_KEY_SIZE,
1364                 .base.setkey = kmb_ocs_sm4_set_key,
1365                 .base.encrypt = kmb_ocs_sm4_ecb_encrypt,
1366                 .base.decrypt = kmb_ocs_sm4_ecb_decrypt,
1367                 .base.init = ocs_sm4_init_tfm,
1368                 .base.exit = ocs_exit_tfm,
1369                 .op.do_one_request = kmb_ocs_aes_sk_do_one_request,
1370         },
1371 #endif /* CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_ECB */
1372         {
1373                 .base.base.cra_name = "cbc(sm4)",
1374                 .base.base.cra_driver_name = "cbc-sm4-keembay-ocs",
1375                 .base.base.cra_priority = KMB_OCS_PRIORITY,
1376                 .base.base.cra_flags = CRYPTO_ALG_ASYNC |
1377                                        CRYPTO_ALG_KERN_DRIVER_ONLY,
1378                 .base.base.cra_blocksize = AES_BLOCK_SIZE,
1379                 .base.base.cra_ctxsize = sizeof(struct ocs_aes_tctx),
1380                 .base.base.cra_module = THIS_MODULE,
1381                 .base.base.cra_alignmask = 0,
1382
1383                 .base.min_keysize = OCS_SM4_KEY_SIZE,
1384                 .base.max_keysize = OCS_SM4_KEY_SIZE,
1385                 .base.ivsize = AES_BLOCK_SIZE,
1386                 .base.setkey = kmb_ocs_sm4_set_key,
1387                 .base.encrypt = kmb_ocs_sm4_cbc_encrypt,
1388                 .base.decrypt = kmb_ocs_sm4_cbc_decrypt,
1389                 .base.init = ocs_sm4_init_tfm,
1390                 .base.exit = ocs_exit_tfm,
1391                 .op.do_one_request = kmb_ocs_aes_sk_do_one_request,
1392         },
1393         {
1394                 .base.base.cra_name = "ctr(sm4)",
1395                 .base.base.cra_driver_name = "ctr-sm4-keembay-ocs",
1396                 .base.base.cra_priority = KMB_OCS_PRIORITY,
1397                 .base.base.cra_flags = CRYPTO_ALG_ASYNC |
1398                                        CRYPTO_ALG_KERN_DRIVER_ONLY,
1399                 .base.base.cra_blocksize = 1,
1400                 .base.base.cra_ctxsize = sizeof(struct ocs_aes_tctx),
1401                 .base.base.cra_module = THIS_MODULE,
1402                 .base.base.cra_alignmask = 0,
1403
1404                 .base.min_keysize = OCS_SM4_KEY_SIZE,
1405                 .base.max_keysize = OCS_SM4_KEY_SIZE,
1406                 .base.ivsize = AES_BLOCK_SIZE,
1407                 .base.setkey = kmb_ocs_sm4_set_key,
1408                 .base.encrypt = kmb_ocs_sm4_ctr_encrypt,
1409                 .base.decrypt = kmb_ocs_sm4_ctr_decrypt,
1410                 .base.init = ocs_sm4_init_tfm,
1411                 .base.exit = ocs_exit_tfm,
1412                 .op.do_one_request = kmb_ocs_aes_sk_do_one_request,
1413         },
1414 #ifdef CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_CTS
1415         {
1416                 .base.base.cra_name = "cts(cbc(sm4))",
1417                 .base.base.cra_driver_name = "cts-sm4-keembay-ocs",
1418                 .base.base.cra_priority = KMB_OCS_PRIORITY,
1419                 .base.base.cra_flags = CRYPTO_ALG_ASYNC |
1420                                        CRYPTO_ALG_KERN_DRIVER_ONLY,
1421                 .base.base.cra_blocksize = AES_BLOCK_SIZE,
1422                 .base.base.cra_ctxsize = sizeof(struct ocs_aes_tctx),
1423                 .base.base.cra_module = THIS_MODULE,
1424                 .base.base.cra_alignmask = 0,
1425
1426                 .base.min_keysize = OCS_SM4_KEY_SIZE,
1427                 .base.max_keysize = OCS_SM4_KEY_SIZE,
1428                 .base.ivsize = AES_BLOCK_SIZE,
1429                 .base.setkey = kmb_ocs_sm4_set_key,
1430                 .base.encrypt = kmb_ocs_sm4_cts_encrypt,
1431                 .base.decrypt = kmb_ocs_sm4_cts_decrypt,
1432                 .base.init = ocs_sm4_init_tfm,
1433                 .base.exit = ocs_exit_tfm,
1434                 .op.do_one_request = kmb_ocs_aes_sk_do_one_request,
1435         }
1436 #endif /* CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_CTS */
1437 };
1438
1439 static struct aead_engine_alg algs_aead[] = {
1440         {
1441                 .base.base = {
1442                         .cra_name = "gcm(aes)",
1443                         .cra_driver_name = "gcm-aes-keembay-ocs",
1444                         .cra_priority = KMB_OCS_PRIORITY,
1445                         .cra_flags = CRYPTO_ALG_ASYNC |
1446                                      CRYPTO_ALG_KERN_DRIVER_ONLY |
1447                                      CRYPTO_ALG_NEED_FALLBACK,
1448                         .cra_blocksize = 1,
1449                         .cra_ctxsize = sizeof(struct ocs_aes_tctx),
1450                         .cra_alignmask = 0,
1451                         .cra_module = THIS_MODULE,
1452                 },
1453                 .base.init = ocs_aes_aead_cra_init,
1454                 .base.exit = ocs_aead_cra_exit,
1455                 .base.ivsize = GCM_AES_IV_SIZE,
1456                 .base.maxauthsize = AES_BLOCK_SIZE,
1457                 .base.setauthsize = kmb_ocs_aead_gcm_setauthsize,
1458                 .base.setkey = kmb_ocs_aes_aead_set_key,
1459                 .base.encrypt = kmb_ocs_aes_gcm_encrypt,
1460                 .base.decrypt = kmb_ocs_aes_gcm_decrypt,
1461                 .op.do_one_request = kmb_ocs_aes_aead_do_one_request,
1462         },
1463         {
1464                 .base.base = {
1465                         .cra_name = "ccm(aes)",
1466                         .cra_driver_name = "ccm-aes-keembay-ocs",
1467                         .cra_priority = KMB_OCS_PRIORITY,
1468                         .cra_flags = CRYPTO_ALG_ASYNC |
1469                                      CRYPTO_ALG_KERN_DRIVER_ONLY |
1470                                      CRYPTO_ALG_NEED_FALLBACK,
1471                         .cra_blocksize = 1,
1472                         .cra_ctxsize = sizeof(struct ocs_aes_tctx),
1473                         .cra_alignmask = 0,
1474                         .cra_module = THIS_MODULE,
1475                 },
1476                 .base.init = ocs_aes_aead_cra_init,
1477                 .base.exit = ocs_aead_cra_exit,
1478                 .base.ivsize = AES_BLOCK_SIZE,
1479                 .base.maxauthsize = AES_BLOCK_SIZE,
1480                 .base.setauthsize = kmb_ocs_aead_ccm_setauthsize,
1481                 .base.setkey = kmb_ocs_aes_aead_set_key,
1482                 .base.encrypt = kmb_ocs_aes_ccm_encrypt,
1483                 .base.decrypt = kmb_ocs_aes_ccm_decrypt,
1484                 .op.do_one_request = kmb_ocs_aes_aead_do_one_request,
1485         },
1486         {
1487                 .base.base = {
1488                         .cra_name = "gcm(sm4)",
1489                         .cra_driver_name = "gcm-sm4-keembay-ocs",
1490                         .cra_priority = KMB_OCS_PRIORITY,
1491                         .cra_flags = CRYPTO_ALG_ASYNC |
1492                                      CRYPTO_ALG_KERN_DRIVER_ONLY,
1493                         .cra_blocksize = 1,
1494                         .cra_ctxsize = sizeof(struct ocs_aes_tctx),
1495                         .cra_alignmask = 0,
1496                         .cra_module = THIS_MODULE,
1497                 },
1498                 .base.init = ocs_sm4_aead_cra_init,
1499                 .base.exit = ocs_aead_cra_exit,
1500                 .base.ivsize = GCM_AES_IV_SIZE,
1501                 .base.maxauthsize = AES_BLOCK_SIZE,
1502                 .base.setauthsize = kmb_ocs_aead_gcm_setauthsize,
1503                 .base.setkey = kmb_ocs_sm4_aead_set_key,
1504                 .base.encrypt = kmb_ocs_sm4_gcm_encrypt,
1505                 .base.decrypt = kmb_ocs_sm4_gcm_decrypt,
1506                 .op.do_one_request = kmb_ocs_aes_aead_do_one_request,
1507         },
1508         {
1509                 .base.base = {
1510                         .cra_name = "ccm(sm4)",
1511                         .cra_driver_name = "ccm-sm4-keembay-ocs",
1512                         .cra_priority = KMB_OCS_PRIORITY,
1513                         .cra_flags = CRYPTO_ALG_ASYNC |
1514                                      CRYPTO_ALG_KERN_DRIVER_ONLY,
1515                         .cra_blocksize = 1,
1516                         .cra_ctxsize = sizeof(struct ocs_aes_tctx),
1517                         .cra_alignmask = 0,
1518                         .cra_module = THIS_MODULE,
1519                 },
1520                 .base.init = ocs_sm4_aead_cra_init,
1521                 .base.exit = ocs_aead_cra_exit,
1522                 .base.ivsize = AES_BLOCK_SIZE,
1523                 .base.maxauthsize = AES_BLOCK_SIZE,
1524                 .base.setauthsize = kmb_ocs_aead_ccm_setauthsize,
1525                 .base.setkey = kmb_ocs_sm4_aead_set_key,
1526                 .base.encrypt = kmb_ocs_sm4_ccm_encrypt,
1527                 .base.decrypt = kmb_ocs_sm4_ccm_decrypt,
1528                 .op.do_one_request = kmb_ocs_aes_aead_do_one_request,
1529         }
1530 };
1531
1532 static void unregister_aes_algs(struct ocs_aes_dev *aes_dev)
1533 {
1534         crypto_engine_unregister_aeads(algs_aead, ARRAY_SIZE(algs_aead));
1535         crypto_engine_unregister_skciphers(algs, ARRAY_SIZE(algs));
1536 }
1537
1538 static int register_aes_algs(struct ocs_aes_dev *aes_dev)
1539 {
1540         int ret;
1541
1542         /*
1543          * If any algorithm fails to register, all preceding algorithms that
1544          * were successfully registered will be automatically unregistered.
1545          */
1546         ret = crypto_engine_register_aeads(algs_aead, ARRAY_SIZE(algs_aead));
1547         if (ret)
1548                 return ret;
1549
1550         ret = crypto_engine_register_skciphers(algs, ARRAY_SIZE(algs));
1551         if (ret)
1552                 crypto_engine_unregister_aeads(algs_aead, ARRAY_SIZE(algs));
1553
1554         return ret;
1555 }
1556
1557 /* Device tree driver match. */
1558 static const struct of_device_id kmb_ocs_aes_of_match[] = {
1559         {
1560                 .compatible = "intel,keembay-ocs-aes",
1561         },
1562         {}
1563 };
1564
1565 static void kmb_ocs_aes_remove(struct platform_device *pdev)
1566 {
1567         struct ocs_aes_dev *aes_dev;
1568
1569         aes_dev = platform_get_drvdata(pdev);
1570
1571         unregister_aes_algs(aes_dev);
1572
1573         spin_lock(&ocs_aes.lock);
1574         list_del(&aes_dev->list);
1575         spin_unlock(&ocs_aes.lock);
1576
1577         crypto_engine_exit(aes_dev->engine);
1578 }
1579
1580 static int kmb_ocs_aes_probe(struct platform_device *pdev)
1581 {
1582         struct device *dev = &pdev->dev;
1583         struct ocs_aes_dev *aes_dev;
1584         int rc;
1585
1586         aes_dev = devm_kzalloc(dev, sizeof(*aes_dev), GFP_KERNEL);
1587         if (!aes_dev)
1588                 return -ENOMEM;
1589
1590         aes_dev->dev = dev;
1591
1592         platform_set_drvdata(pdev, aes_dev);
1593
1594         rc = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
1595         if (rc) {
1596                 dev_err(dev, "Failed to set 32 bit dma mask %d\n", rc);
1597                 return rc;
1598         }
1599
1600         /* Get base register address. */
1601         aes_dev->base_reg = devm_platform_ioremap_resource(pdev, 0);
1602         if (IS_ERR(aes_dev->base_reg))
1603                 return PTR_ERR(aes_dev->base_reg);
1604
1605         /* Get and request IRQ */
1606         aes_dev->irq = platform_get_irq(pdev, 0);
1607         if (aes_dev->irq < 0)
1608                 return aes_dev->irq;
1609
1610         rc = devm_request_threaded_irq(dev, aes_dev->irq, ocs_aes_irq_handler,
1611                                        NULL, 0, "keembay-ocs-aes", aes_dev);
1612         if (rc < 0) {
1613                 dev_err(dev, "Could not request IRQ\n");
1614                 return rc;
1615         }
1616
1617         INIT_LIST_HEAD(&aes_dev->list);
1618         spin_lock(&ocs_aes.lock);
1619         list_add_tail(&aes_dev->list, &ocs_aes.dev_list);
1620         spin_unlock(&ocs_aes.lock);
1621
1622         init_completion(&aes_dev->irq_completion);
1623
1624         /* Initialize crypto engine */
1625         aes_dev->engine = crypto_engine_alloc_init(dev, true);
1626         if (!aes_dev->engine) {
1627                 rc = -ENOMEM;
1628                 goto list_del;
1629         }
1630
1631         rc = crypto_engine_start(aes_dev->engine);
1632         if (rc) {
1633                 dev_err(dev, "Could not start crypto engine\n");
1634                 goto cleanup;
1635         }
1636
1637         rc = register_aes_algs(aes_dev);
1638         if (rc) {
1639                 dev_err(dev,
1640                         "Could not register OCS algorithms with Crypto API\n");
1641                 goto cleanup;
1642         }
1643
1644         return 0;
1645
1646 cleanup:
1647         crypto_engine_exit(aes_dev->engine);
1648 list_del:
1649         spin_lock(&ocs_aes.lock);
1650         list_del(&aes_dev->list);
1651         spin_unlock(&ocs_aes.lock);
1652
1653         return rc;
1654 }
1655
1656 /* The OCS driver is a platform device. */
1657 static struct platform_driver kmb_ocs_aes_driver = {
1658         .probe = kmb_ocs_aes_probe,
1659         .remove_new = kmb_ocs_aes_remove,
1660         .driver = {
1661                         .name = DRV_NAME,
1662                         .of_match_table = kmb_ocs_aes_of_match,
1663                 },
1664 };
1665
1666 module_platform_driver(kmb_ocs_aes_driver);
1667
1668 MODULE_DESCRIPTION("Intel Keem Bay Offload and Crypto Subsystem (OCS) AES/SM4 Driver");
1669 MODULE_LICENSE("GPL");
1670
1671 MODULE_ALIAS_CRYPTO("cbc-aes-keembay-ocs");
1672 MODULE_ALIAS_CRYPTO("ctr-aes-keembay-ocs");
1673 MODULE_ALIAS_CRYPTO("gcm-aes-keembay-ocs");
1674 MODULE_ALIAS_CRYPTO("ccm-aes-keembay-ocs");
1675
1676 MODULE_ALIAS_CRYPTO("cbc-sm4-keembay-ocs");
1677 MODULE_ALIAS_CRYPTO("ctr-sm4-keembay-ocs");
1678 MODULE_ALIAS_CRYPTO("gcm-sm4-keembay-ocs");
1679 MODULE_ALIAS_CRYPTO("ccm-sm4-keembay-ocs");
1680
1681 #ifdef CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_ECB
1682 MODULE_ALIAS_CRYPTO("ecb-aes-keembay-ocs");
1683 MODULE_ALIAS_CRYPTO("ecb-sm4-keembay-ocs");
1684 #endif /* CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_ECB */
1685
1686 #ifdef CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_CTS
1687 MODULE_ALIAS_CRYPTO("cts-aes-keembay-ocs");
1688 MODULE_ALIAS_CRYPTO("cts-sm4-keembay-ocs");
1689 #endif /* CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4_CTS */