GNU Linux-libre 5.16.19-gnu
[releases.git] / drivers / crypto / ccp / ccp-ops.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * AMD Cryptographic Coprocessor (CCP) driver
4  *
5  * Copyright (C) 2013-2019 Advanced Micro Devices, Inc.
6  *
7  * Author: Tom Lendacky <thomas.lendacky@amd.com>
8  * Author: Gary R Hook <gary.hook@amd.com>
9  */
10
11 #include <linux/dma-mapping.h>
12 #include <linux/module.h>
13 #include <linux/kernel.h>
14 #include <linux/interrupt.h>
15 #include <crypto/scatterwalk.h>
16 #include <crypto/des.h>
17 #include <linux/ccp.h>
18
19 #include "ccp-dev.h"
20
21 /* SHA initial context values */
22 static const __be32 ccp_sha1_init[SHA1_DIGEST_SIZE / sizeof(__be32)] = {
23         cpu_to_be32(SHA1_H0), cpu_to_be32(SHA1_H1),
24         cpu_to_be32(SHA1_H2), cpu_to_be32(SHA1_H3),
25         cpu_to_be32(SHA1_H4),
26 };
27
28 static const __be32 ccp_sha224_init[SHA256_DIGEST_SIZE / sizeof(__be32)] = {
29         cpu_to_be32(SHA224_H0), cpu_to_be32(SHA224_H1),
30         cpu_to_be32(SHA224_H2), cpu_to_be32(SHA224_H3),
31         cpu_to_be32(SHA224_H4), cpu_to_be32(SHA224_H5),
32         cpu_to_be32(SHA224_H6), cpu_to_be32(SHA224_H7),
33 };
34
35 static const __be32 ccp_sha256_init[SHA256_DIGEST_SIZE / sizeof(__be32)] = {
36         cpu_to_be32(SHA256_H0), cpu_to_be32(SHA256_H1),
37         cpu_to_be32(SHA256_H2), cpu_to_be32(SHA256_H3),
38         cpu_to_be32(SHA256_H4), cpu_to_be32(SHA256_H5),
39         cpu_to_be32(SHA256_H6), cpu_to_be32(SHA256_H7),
40 };
41
42 static const __be64 ccp_sha384_init[SHA512_DIGEST_SIZE / sizeof(__be64)] = {
43         cpu_to_be64(SHA384_H0), cpu_to_be64(SHA384_H1),
44         cpu_to_be64(SHA384_H2), cpu_to_be64(SHA384_H3),
45         cpu_to_be64(SHA384_H4), cpu_to_be64(SHA384_H5),
46         cpu_to_be64(SHA384_H6), cpu_to_be64(SHA384_H7),
47 };
48
49 static const __be64 ccp_sha512_init[SHA512_DIGEST_SIZE / sizeof(__be64)] = {
50         cpu_to_be64(SHA512_H0), cpu_to_be64(SHA512_H1),
51         cpu_to_be64(SHA512_H2), cpu_to_be64(SHA512_H3),
52         cpu_to_be64(SHA512_H4), cpu_to_be64(SHA512_H5),
53         cpu_to_be64(SHA512_H6), cpu_to_be64(SHA512_H7),
54 };
55
56 #define CCP_NEW_JOBID(ccp)      ((ccp->vdata->version == CCP_VERSION(3, 0)) ? \
57                                         ccp_gen_jobid(ccp) : 0)
58
59 static u32 ccp_gen_jobid(struct ccp_device *ccp)
60 {
61         return atomic_inc_return(&ccp->current_id) & CCP_JOBID_MASK;
62 }
63
64 static void ccp_sg_free(struct ccp_sg_workarea *wa)
65 {
66         if (wa->dma_count)
67                 dma_unmap_sg(wa->dma_dev, wa->dma_sg_head, wa->nents, wa->dma_dir);
68
69         wa->dma_count = 0;
70 }
71
72 static int ccp_init_sg_workarea(struct ccp_sg_workarea *wa, struct device *dev,
73                                 struct scatterlist *sg, u64 len,
74                                 enum dma_data_direction dma_dir)
75 {
76         memset(wa, 0, sizeof(*wa));
77
78         wa->sg = sg;
79         if (!sg)
80                 return 0;
81
82         wa->nents = sg_nents_for_len(sg, len);
83         if (wa->nents < 0)
84                 return wa->nents;
85
86         wa->bytes_left = len;
87         wa->sg_used = 0;
88
89         if (len == 0)
90                 return 0;
91
92         if (dma_dir == DMA_NONE)
93                 return 0;
94
95         wa->dma_sg = sg;
96         wa->dma_sg_head = sg;
97         wa->dma_dev = dev;
98         wa->dma_dir = dma_dir;
99         wa->dma_count = dma_map_sg(dev, sg, wa->nents, dma_dir);
100         if (!wa->dma_count)
101                 return -ENOMEM;
102
103         return 0;
104 }
105
106 static void ccp_update_sg_workarea(struct ccp_sg_workarea *wa, unsigned int len)
107 {
108         unsigned int nbytes = min_t(u64, len, wa->bytes_left);
109         unsigned int sg_combined_len = 0;
110
111         if (!wa->sg)
112                 return;
113
114         wa->sg_used += nbytes;
115         wa->bytes_left -= nbytes;
116         if (wa->sg_used == sg_dma_len(wa->dma_sg)) {
117                 /* Advance to the next DMA scatterlist entry */
118                 wa->dma_sg = sg_next(wa->dma_sg);
119
120                 /* In the case that the DMA mapped scatterlist has entries
121                  * that have been merged, the non-DMA mapped scatterlist
122                  * must be advanced multiple times for each merged entry.
123                  * This ensures that the current non-DMA mapped entry
124                  * corresponds to the current DMA mapped entry.
125                  */
126                 do {
127                         sg_combined_len += wa->sg->length;
128                         wa->sg = sg_next(wa->sg);
129                 } while (wa->sg_used > sg_combined_len);
130
131                 wa->sg_used = 0;
132         }
133 }
134
135 static void ccp_dm_free(struct ccp_dm_workarea *wa)
136 {
137         if (wa->length <= CCP_DMAPOOL_MAX_SIZE) {
138                 if (wa->address)
139                         dma_pool_free(wa->dma_pool, wa->address,
140                                       wa->dma.address);
141         } else {
142                 if (wa->dma.address)
143                         dma_unmap_single(wa->dev, wa->dma.address, wa->length,
144                                          wa->dma.dir);
145                 kfree(wa->address);
146         }
147
148         wa->address = NULL;
149         wa->dma.address = 0;
150 }
151
152 static int ccp_init_dm_workarea(struct ccp_dm_workarea *wa,
153                                 struct ccp_cmd_queue *cmd_q,
154                                 unsigned int len,
155                                 enum dma_data_direction dir)
156 {
157         memset(wa, 0, sizeof(*wa));
158
159         if (!len)
160                 return 0;
161
162         wa->dev = cmd_q->ccp->dev;
163         wa->length = len;
164
165         if (len <= CCP_DMAPOOL_MAX_SIZE) {
166                 wa->dma_pool = cmd_q->dma_pool;
167
168                 wa->address = dma_pool_zalloc(wa->dma_pool, GFP_KERNEL,
169                                              &wa->dma.address);
170                 if (!wa->address)
171                         return -ENOMEM;
172
173                 wa->dma.length = CCP_DMAPOOL_MAX_SIZE;
174
175         } else {
176                 wa->address = kzalloc(len, GFP_KERNEL);
177                 if (!wa->address)
178                         return -ENOMEM;
179
180                 wa->dma.address = dma_map_single(wa->dev, wa->address, len,
181                                                  dir);
182                 if (dma_mapping_error(wa->dev, wa->dma.address))
183                         return -ENOMEM;
184
185                 wa->dma.length = len;
186         }
187         wa->dma.dir = dir;
188
189         return 0;
190 }
191
192 static int ccp_set_dm_area(struct ccp_dm_workarea *wa, unsigned int wa_offset,
193                            struct scatterlist *sg, unsigned int sg_offset,
194                            unsigned int len)
195 {
196         WARN_ON(!wa->address);
197
198         if (len > (wa->length - wa_offset))
199                 return -EINVAL;
200
201         scatterwalk_map_and_copy(wa->address + wa_offset, sg, sg_offset, len,
202                                  0);
203         return 0;
204 }
205
206 static void ccp_get_dm_area(struct ccp_dm_workarea *wa, unsigned int wa_offset,
207                             struct scatterlist *sg, unsigned int sg_offset,
208                             unsigned int len)
209 {
210         WARN_ON(!wa->address);
211
212         scatterwalk_map_and_copy(wa->address + wa_offset, sg, sg_offset, len,
213                                  1);
214 }
215
216 static int ccp_reverse_set_dm_area(struct ccp_dm_workarea *wa,
217                                    unsigned int wa_offset,
218                                    struct scatterlist *sg,
219                                    unsigned int sg_offset,
220                                    unsigned int len)
221 {
222         u8 *p, *q;
223         int     rc;
224
225         rc = ccp_set_dm_area(wa, wa_offset, sg, sg_offset, len);
226         if (rc)
227                 return rc;
228
229         p = wa->address + wa_offset;
230         q = p + len - 1;
231         while (p < q) {
232                 *p = *p ^ *q;
233                 *q = *p ^ *q;
234                 *p = *p ^ *q;
235                 p++;
236                 q--;
237         }
238         return 0;
239 }
240
241 static void ccp_reverse_get_dm_area(struct ccp_dm_workarea *wa,
242                                     unsigned int wa_offset,
243                                     struct scatterlist *sg,
244                                     unsigned int sg_offset,
245                                     unsigned int len)
246 {
247         u8 *p, *q;
248
249         p = wa->address + wa_offset;
250         q = p + len - 1;
251         while (p < q) {
252                 *p = *p ^ *q;
253                 *q = *p ^ *q;
254                 *p = *p ^ *q;
255                 p++;
256                 q--;
257         }
258
259         ccp_get_dm_area(wa, wa_offset, sg, sg_offset, len);
260 }
261
262 static void ccp_free_data(struct ccp_data *data, struct ccp_cmd_queue *cmd_q)
263 {
264         ccp_dm_free(&data->dm_wa);
265         ccp_sg_free(&data->sg_wa);
266 }
267
268 static int ccp_init_data(struct ccp_data *data, struct ccp_cmd_queue *cmd_q,
269                          struct scatterlist *sg, u64 sg_len,
270                          unsigned int dm_len,
271                          enum dma_data_direction dir)
272 {
273         int ret;
274
275         memset(data, 0, sizeof(*data));
276
277         ret = ccp_init_sg_workarea(&data->sg_wa, cmd_q->ccp->dev, sg, sg_len,
278                                    dir);
279         if (ret)
280                 goto e_err;
281
282         ret = ccp_init_dm_workarea(&data->dm_wa, cmd_q, dm_len, dir);
283         if (ret)
284                 goto e_err;
285
286         return 0;
287
288 e_err:
289         ccp_free_data(data, cmd_q);
290
291         return ret;
292 }
293
294 static unsigned int ccp_queue_buf(struct ccp_data *data, unsigned int from)
295 {
296         struct ccp_sg_workarea *sg_wa = &data->sg_wa;
297         struct ccp_dm_workarea *dm_wa = &data->dm_wa;
298         unsigned int buf_count, nbytes;
299
300         /* Clear the buffer if setting it */
301         if (!from)
302                 memset(dm_wa->address, 0, dm_wa->length);
303
304         if (!sg_wa->sg)
305                 return 0;
306
307         /* Perform the copy operation
308          *   nbytes will always be <= UINT_MAX because dm_wa->length is
309          *   an unsigned int
310          */
311         nbytes = min_t(u64, sg_wa->bytes_left, dm_wa->length);
312         scatterwalk_map_and_copy(dm_wa->address, sg_wa->sg, sg_wa->sg_used,
313                                  nbytes, from);
314
315         /* Update the structures and generate the count */
316         buf_count = 0;
317         while (sg_wa->bytes_left && (buf_count < dm_wa->length)) {
318                 nbytes = min(sg_dma_len(sg_wa->dma_sg) - sg_wa->sg_used,
319                              dm_wa->length - buf_count);
320                 nbytes = min_t(u64, sg_wa->bytes_left, nbytes);
321
322                 buf_count += nbytes;
323                 ccp_update_sg_workarea(sg_wa, nbytes);
324         }
325
326         return buf_count;
327 }
328
329 static unsigned int ccp_fill_queue_buf(struct ccp_data *data)
330 {
331         return ccp_queue_buf(data, 0);
332 }
333
334 static unsigned int ccp_empty_queue_buf(struct ccp_data *data)
335 {
336         return ccp_queue_buf(data, 1);
337 }
338
339 static void ccp_prepare_data(struct ccp_data *src, struct ccp_data *dst,
340                              struct ccp_op *op, unsigned int block_size,
341                              bool blocksize_op)
342 {
343         unsigned int sg_src_len, sg_dst_len, op_len;
344
345         /* The CCP can only DMA from/to one address each per operation. This
346          * requires that we find the smallest DMA area between the source
347          * and destination. The resulting len values will always be <= UINT_MAX
348          * because the dma length is an unsigned int.
349          */
350         sg_src_len = sg_dma_len(src->sg_wa.dma_sg) - src->sg_wa.sg_used;
351         sg_src_len = min_t(u64, src->sg_wa.bytes_left, sg_src_len);
352
353         if (dst) {
354                 sg_dst_len = sg_dma_len(dst->sg_wa.dma_sg) - dst->sg_wa.sg_used;
355                 sg_dst_len = min_t(u64, src->sg_wa.bytes_left, sg_dst_len);
356                 op_len = min(sg_src_len, sg_dst_len);
357         } else {
358                 op_len = sg_src_len;
359         }
360
361         /* The data operation length will be at least block_size in length
362          * or the smaller of available sg room remaining for the source or
363          * the destination
364          */
365         op_len = max(op_len, block_size);
366
367         /* Unless we have to buffer data, there's no reason to wait */
368         op->soc = 0;
369
370         if (sg_src_len < block_size) {
371                 /* Not enough data in the sg element, so it
372                  * needs to be buffered into a blocksize chunk
373                  */
374                 int cp_len = ccp_fill_queue_buf(src);
375
376                 op->soc = 1;
377                 op->src.u.dma.address = src->dm_wa.dma.address;
378                 op->src.u.dma.offset = 0;
379                 op->src.u.dma.length = (blocksize_op) ? block_size : cp_len;
380         } else {
381                 /* Enough data in the sg element, but we need to
382                  * adjust for any previously copied data
383                  */
384                 op->src.u.dma.address = sg_dma_address(src->sg_wa.dma_sg);
385                 op->src.u.dma.offset = src->sg_wa.sg_used;
386                 op->src.u.dma.length = op_len & ~(block_size - 1);
387
388                 ccp_update_sg_workarea(&src->sg_wa, op->src.u.dma.length);
389         }
390
391         if (dst) {
392                 if (sg_dst_len < block_size) {
393                         /* Not enough room in the sg element or we're on the
394                          * last piece of data (when using padding), so the
395                          * output needs to be buffered into a blocksize chunk
396                          */
397                         op->soc = 1;
398                         op->dst.u.dma.address = dst->dm_wa.dma.address;
399                         op->dst.u.dma.offset = 0;
400                         op->dst.u.dma.length = op->src.u.dma.length;
401                 } else {
402                         /* Enough room in the sg element, but we need to
403                          * adjust for any previously used area
404                          */
405                         op->dst.u.dma.address = sg_dma_address(dst->sg_wa.dma_sg);
406                         op->dst.u.dma.offset = dst->sg_wa.sg_used;
407                         op->dst.u.dma.length = op->src.u.dma.length;
408                 }
409         }
410 }
411
412 static void ccp_process_data(struct ccp_data *src, struct ccp_data *dst,
413                              struct ccp_op *op)
414 {
415         op->init = 0;
416
417         if (dst) {
418                 if (op->dst.u.dma.address == dst->dm_wa.dma.address)
419                         ccp_empty_queue_buf(dst);
420                 else
421                         ccp_update_sg_workarea(&dst->sg_wa,
422                                                op->dst.u.dma.length);
423         }
424 }
425
426 static int ccp_copy_to_from_sb(struct ccp_cmd_queue *cmd_q,
427                                struct ccp_dm_workarea *wa, u32 jobid, u32 sb,
428                                u32 byte_swap, bool from)
429 {
430         struct ccp_op op;
431
432         memset(&op, 0, sizeof(op));
433
434         op.cmd_q = cmd_q;
435         op.jobid = jobid;
436         op.eom = 1;
437
438         if (from) {
439                 op.soc = 1;
440                 op.src.type = CCP_MEMTYPE_SB;
441                 op.src.u.sb = sb;
442                 op.dst.type = CCP_MEMTYPE_SYSTEM;
443                 op.dst.u.dma.address = wa->dma.address;
444                 op.dst.u.dma.length = wa->length;
445         } else {
446                 op.src.type = CCP_MEMTYPE_SYSTEM;
447                 op.src.u.dma.address = wa->dma.address;
448                 op.src.u.dma.length = wa->length;
449                 op.dst.type = CCP_MEMTYPE_SB;
450                 op.dst.u.sb = sb;
451         }
452
453         op.u.passthru.byte_swap = byte_swap;
454
455         return cmd_q->ccp->vdata->perform->passthru(&op);
456 }
457
458 static int ccp_copy_to_sb(struct ccp_cmd_queue *cmd_q,
459                           struct ccp_dm_workarea *wa, u32 jobid, u32 sb,
460                           u32 byte_swap)
461 {
462         return ccp_copy_to_from_sb(cmd_q, wa, jobid, sb, byte_swap, false);
463 }
464
465 static int ccp_copy_from_sb(struct ccp_cmd_queue *cmd_q,
466                             struct ccp_dm_workarea *wa, u32 jobid, u32 sb,
467                             u32 byte_swap)
468 {
469         return ccp_copy_to_from_sb(cmd_q, wa, jobid, sb, byte_swap, true);
470 }
471
472 static noinline_for_stack int
473 ccp_run_aes_cmac_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
474 {
475         struct ccp_aes_engine *aes = &cmd->u.aes;
476         struct ccp_dm_workarea key, ctx;
477         struct ccp_data src;
478         struct ccp_op op;
479         unsigned int dm_offset;
480         int ret;
481
482         if (!((aes->key_len == AES_KEYSIZE_128) ||
483               (aes->key_len == AES_KEYSIZE_192) ||
484               (aes->key_len == AES_KEYSIZE_256)))
485                 return -EINVAL;
486
487         if (aes->src_len & (AES_BLOCK_SIZE - 1))
488                 return -EINVAL;
489
490         if (aes->iv_len != AES_BLOCK_SIZE)
491                 return -EINVAL;
492
493         if (!aes->key || !aes->iv || !aes->src)
494                 return -EINVAL;
495
496         if (aes->cmac_final) {
497                 if (aes->cmac_key_len != AES_BLOCK_SIZE)
498                         return -EINVAL;
499
500                 if (!aes->cmac_key)
501                         return -EINVAL;
502         }
503
504         BUILD_BUG_ON(CCP_AES_KEY_SB_COUNT != 1);
505         BUILD_BUG_ON(CCP_AES_CTX_SB_COUNT != 1);
506
507         ret = -EIO;
508         memset(&op, 0, sizeof(op));
509         op.cmd_q = cmd_q;
510         op.jobid = CCP_NEW_JOBID(cmd_q->ccp);
511         op.sb_key = cmd_q->sb_key;
512         op.sb_ctx = cmd_q->sb_ctx;
513         op.init = 1;
514         op.u.aes.type = aes->type;
515         op.u.aes.mode = aes->mode;
516         op.u.aes.action = aes->action;
517
518         /* All supported key sizes fit in a single (32-byte) SB entry
519          * and must be in little endian format. Use the 256-bit byte
520          * swap passthru option to convert from big endian to little
521          * endian.
522          */
523         ret = ccp_init_dm_workarea(&key, cmd_q,
524                                    CCP_AES_KEY_SB_COUNT * CCP_SB_BYTES,
525                                    DMA_TO_DEVICE);
526         if (ret)
527                 return ret;
528
529         dm_offset = CCP_SB_BYTES - aes->key_len;
530         ret = ccp_set_dm_area(&key, dm_offset, aes->key, 0, aes->key_len);
531         if (ret)
532                 goto e_key;
533         ret = ccp_copy_to_sb(cmd_q, &key, op.jobid, op.sb_key,
534                              CCP_PASSTHRU_BYTESWAP_256BIT);
535         if (ret) {
536                 cmd->engine_error = cmd_q->cmd_error;
537                 goto e_key;
538         }
539
540         /* The AES context fits in a single (32-byte) SB entry and
541          * must be in little endian format. Use the 256-bit byte swap
542          * passthru option to convert from big endian to little endian.
543          */
544         ret = ccp_init_dm_workarea(&ctx, cmd_q,
545                                    CCP_AES_CTX_SB_COUNT * CCP_SB_BYTES,
546                                    DMA_BIDIRECTIONAL);
547         if (ret)
548                 goto e_key;
549
550         dm_offset = CCP_SB_BYTES - AES_BLOCK_SIZE;
551         ret = ccp_set_dm_area(&ctx, dm_offset, aes->iv, 0, aes->iv_len);
552         if (ret)
553                 goto e_ctx;
554         ret = ccp_copy_to_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
555                              CCP_PASSTHRU_BYTESWAP_256BIT);
556         if (ret) {
557                 cmd->engine_error = cmd_q->cmd_error;
558                 goto e_ctx;
559         }
560
561         /* Send data to the CCP AES engine */
562         ret = ccp_init_data(&src, cmd_q, aes->src, aes->src_len,
563                             AES_BLOCK_SIZE, DMA_TO_DEVICE);
564         if (ret)
565                 goto e_ctx;
566
567         while (src.sg_wa.bytes_left) {
568                 ccp_prepare_data(&src, NULL, &op, AES_BLOCK_SIZE, true);
569                 if (aes->cmac_final && !src.sg_wa.bytes_left) {
570                         op.eom = 1;
571
572                         /* Push the K1/K2 key to the CCP now */
573                         ret = ccp_copy_from_sb(cmd_q, &ctx, op.jobid,
574                                                op.sb_ctx,
575                                                CCP_PASSTHRU_BYTESWAP_256BIT);
576                         if (ret) {
577                                 cmd->engine_error = cmd_q->cmd_error;
578                                 goto e_src;
579                         }
580
581                         ret = ccp_set_dm_area(&ctx, 0, aes->cmac_key, 0,
582                                               aes->cmac_key_len);
583                         if (ret)
584                                 goto e_src;
585                         ret = ccp_copy_to_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
586                                              CCP_PASSTHRU_BYTESWAP_256BIT);
587                         if (ret) {
588                                 cmd->engine_error = cmd_q->cmd_error;
589                                 goto e_src;
590                         }
591                 }
592
593                 ret = cmd_q->ccp->vdata->perform->aes(&op);
594                 if (ret) {
595                         cmd->engine_error = cmd_q->cmd_error;
596                         goto e_src;
597                 }
598
599                 ccp_process_data(&src, NULL, &op);
600         }
601
602         /* Retrieve the AES context - convert from LE to BE using
603          * 32-byte (256-bit) byteswapping
604          */
605         ret = ccp_copy_from_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
606                                CCP_PASSTHRU_BYTESWAP_256BIT);
607         if (ret) {
608                 cmd->engine_error = cmd_q->cmd_error;
609                 goto e_src;
610         }
611
612         /* ...but we only need AES_BLOCK_SIZE bytes */
613         dm_offset = CCP_SB_BYTES - AES_BLOCK_SIZE;
614         ccp_get_dm_area(&ctx, dm_offset, aes->iv, 0, aes->iv_len);
615
616 e_src:
617         ccp_free_data(&src, cmd_q);
618
619 e_ctx:
620         ccp_dm_free(&ctx);
621
622 e_key:
623         ccp_dm_free(&key);
624
625         return ret;
626 }
627
628 static noinline_for_stack int
629 ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
630 {
631         struct ccp_aes_engine *aes = &cmd->u.aes;
632         struct ccp_dm_workarea key, ctx, final_wa, tag;
633         struct ccp_data src, dst;
634         struct ccp_data aad;
635         struct ccp_op op;
636         unsigned int dm_offset;
637         unsigned int authsize;
638         unsigned int jobid;
639         unsigned int ilen;
640         bool in_place = true; /* Default value */
641         __be64 *final;
642         int ret;
643
644         struct scatterlist *p_inp, sg_inp[2];
645         struct scatterlist *p_tag, sg_tag[2];
646         struct scatterlist *p_outp, sg_outp[2];
647         struct scatterlist *p_aad;
648
649         if (!aes->iv)
650                 return -EINVAL;
651
652         if (!((aes->key_len == AES_KEYSIZE_128) ||
653                 (aes->key_len == AES_KEYSIZE_192) ||
654                 (aes->key_len == AES_KEYSIZE_256)))
655                 return -EINVAL;
656
657         if (!aes->key) /* Gotta have a key SGL */
658                 return -EINVAL;
659
660         /* Zero defaults to 16 bytes, the maximum size */
661         authsize = aes->authsize ? aes->authsize : AES_BLOCK_SIZE;
662         switch (authsize) {
663         case 16:
664         case 15:
665         case 14:
666         case 13:
667         case 12:
668         case 8:
669         case 4:
670                 break;
671         default:
672                 return -EINVAL;
673         }
674
675         /* First, decompose the source buffer into AAD & PT,
676          * and the destination buffer into AAD, CT & tag, or
677          * the input into CT & tag.
678          * It is expected that the input and output SGs will
679          * be valid, even if the AAD and input lengths are 0.
680          */
681         p_aad = aes->src;
682         p_inp = scatterwalk_ffwd(sg_inp, aes->src, aes->aad_len);
683         p_outp = scatterwalk_ffwd(sg_outp, aes->dst, aes->aad_len);
684         if (aes->action == CCP_AES_ACTION_ENCRYPT) {
685                 ilen = aes->src_len;
686                 p_tag = scatterwalk_ffwd(sg_tag, p_outp, ilen);
687         } else {
688                 /* Input length for decryption includes tag */
689                 ilen = aes->src_len - authsize;
690                 p_tag = scatterwalk_ffwd(sg_tag, p_inp, ilen);
691         }
692
693         jobid = CCP_NEW_JOBID(cmd_q->ccp);
694
695         memset(&op, 0, sizeof(op));
696         op.cmd_q = cmd_q;
697         op.jobid = jobid;
698         op.sb_key = cmd_q->sb_key; /* Pre-allocated */
699         op.sb_ctx = cmd_q->sb_ctx; /* Pre-allocated */
700         op.init = 1;
701         op.u.aes.type = aes->type;
702
703         /* Copy the key to the LSB */
704         ret = ccp_init_dm_workarea(&key, cmd_q,
705                                    CCP_AES_CTX_SB_COUNT * CCP_SB_BYTES,
706                                    DMA_TO_DEVICE);
707         if (ret)
708                 return ret;
709
710         dm_offset = CCP_SB_BYTES - aes->key_len;
711         ret = ccp_set_dm_area(&key, dm_offset, aes->key, 0, aes->key_len);
712         if (ret)
713                 goto e_key;
714         ret = ccp_copy_to_sb(cmd_q, &key, op.jobid, op.sb_key,
715                              CCP_PASSTHRU_BYTESWAP_256BIT);
716         if (ret) {
717                 cmd->engine_error = cmd_q->cmd_error;
718                 goto e_key;
719         }
720
721         /* Copy the context (IV) to the LSB.
722          * There is an assumption here that the IV is 96 bits in length, plus
723          * a nonce of 32 bits. If no IV is present, use a zeroed buffer.
724          */
725         ret = ccp_init_dm_workarea(&ctx, cmd_q,
726                                    CCP_AES_CTX_SB_COUNT * CCP_SB_BYTES,
727                                    DMA_BIDIRECTIONAL);
728         if (ret)
729                 goto e_key;
730
731         dm_offset = CCP_AES_CTX_SB_COUNT * CCP_SB_BYTES - aes->iv_len;
732         ret = ccp_set_dm_area(&ctx, dm_offset, aes->iv, 0, aes->iv_len);
733         if (ret)
734                 goto e_ctx;
735
736         ret = ccp_copy_to_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
737                              CCP_PASSTHRU_BYTESWAP_256BIT);
738         if (ret) {
739                 cmd->engine_error = cmd_q->cmd_error;
740                 goto e_ctx;
741         }
742
743         op.init = 1;
744         if (aes->aad_len > 0) {
745                 /* Step 1: Run a GHASH over the Additional Authenticated Data */
746                 ret = ccp_init_data(&aad, cmd_q, p_aad, aes->aad_len,
747                                     AES_BLOCK_SIZE,
748                                     DMA_TO_DEVICE);
749                 if (ret)
750                         goto e_ctx;
751
752                 op.u.aes.mode = CCP_AES_MODE_GHASH;
753                 op.u.aes.action = CCP_AES_GHASHAAD;
754
755                 while (aad.sg_wa.bytes_left) {
756                         ccp_prepare_data(&aad, NULL, &op, AES_BLOCK_SIZE, true);
757
758                         ret = cmd_q->ccp->vdata->perform->aes(&op);
759                         if (ret) {
760                                 cmd->engine_error = cmd_q->cmd_error;
761                                 goto e_aad;
762                         }
763
764                         ccp_process_data(&aad, NULL, &op);
765                         op.init = 0;
766                 }
767         }
768
769         op.u.aes.mode = CCP_AES_MODE_GCTR;
770         op.u.aes.action = aes->action;
771
772         if (ilen > 0) {
773                 /* Step 2: Run a GCTR over the plaintext */
774                 in_place = (sg_virt(p_inp) == sg_virt(p_outp)) ? true : false;
775
776                 ret = ccp_init_data(&src, cmd_q, p_inp, ilen,
777                                     AES_BLOCK_SIZE,
778                                     in_place ? DMA_BIDIRECTIONAL
779                                              : DMA_TO_DEVICE);
780                 if (ret)
781                         goto e_aad;
782
783                 if (in_place) {
784                         dst = src;
785                 } else {
786                         ret = ccp_init_data(&dst, cmd_q, p_outp, ilen,
787                                             AES_BLOCK_SIZE, DMA_FROM_DEVICE);
788                         if (ret)
789                                 goto e_src;
790                 }
791
792                 op.soc = 0;
793                 op.eom = 0;
794                 op.init = 1;
795                 while (src.sg_wa.bytes_left) {
796                         ccp_prepare_data(&src, &dst, &op, AES_BLOCK_SIZE, true);
797                         if (!src.sg_wa.bytes_left) {
798                                 unsigned int nbytes = ilen % AES_BLOCK_SIZE;
799
800                                 if (nbytes) {
801                                         op.eom = 1;
802                                         op.u.aes.size = (nbytes * 8) - 1;
803                                 }
804                         }
805
806                         ret = cmd_q->ccp->vdata->perform->aes(&op);
807                         if (ret) {
808                                 cmd->engine_error = cmd_q->cmd_error;
809                                 goto e_dst;
810                         }
811
812                         ccp_process_data(&src, &dst, &op);
813                         op.init = 0;
814                 }
815         }
816
817         /* Step 3: Update the IV portion of the context with the original IV */
818         ret = ccp_copy_from_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
819                                CCP_PASSTHRU_BYTESWAP_256BIT);
820         if (ret) {
821                 cmd->engine_error = cmd_q->cmd_error;
822                 goto e_dst;
823         }
824
825         ret = ccp_set_dm_area(&ctx, dm_offset, aes->iv, 0, aes->iv_len);
826         if (ret)
827                 goto e_dst;
828
829         ret = ccp_copy_to_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
830                              CCP_PASSTHRU_BYTESWAP_256BIT);
831         if (ret) {
832                 cmd->engine_error = cmd_q->cmd_error;
833                 goto e_dst;
834         }
835
836         /* Step 4: Concatenate the lengths of the AAD and source, and
837          * hash that 16 byte buffer.
838          */
839         ret = ccp_init_dm_workarea(&final_wa, cmd_q, AES_BLOCK_SIZE,
840                                    DMA_BIDIRECTIONAL);
841         if (ret)
842                 goto e_dst;
843         final = (__be64 *)final_wa.address;
844         final[0] = cpu_to_be64(aes->aad_len * 8);
845         final[1] = cpu_to_be64(ilen * 8);
846
847         memset(&op, 0, sizeof(op));
848         op.cmd_q = cmd_q;
849         op.jobid = jobid;
850         op.sb_key = cmd_q->sb_key; /* Pre-allocated */
851         op.sb_ctx = cmd_q->sb_ctx; /* Pre-allocated */
852         op.init = 1;
853         op.u.aes.type = aes->type;
854         op.u.aes.mode = CCP_AES_MODE_GHASH;
855         op.u.aes.action = CCP_AES_GHASHFINAL;
856         op.src.type = CCP_MEMTYPE_SYSTEM;
857         op.src.u.dma.address = final_wa.dma.address;
858         op.src.u.dma.length = AES_BLOCK_SIZE;
859         op.dst.type = CCP_MEMTYPE_SYSTEM;
860         op.dst.u.dma.address = final_wa.dma.address;
861         op.dst.u.dma.length = AES_BLOCK_SIZE;
862         op.eom = 1;
863         op.u.aes.size = 0;
864         ret = cmd_q->ccp->vdata->perform->aes(&op);
865         if (ret)
866                 goto e_final_wa;
867
868         if (aes->action == CCP_AES_ACTION_ENCRYPT) {
869                 /* Put the ciphered tag after the ciphertext. */
870                 ccp_get_dm_area(&final_wa, 0, p_tag, 0, authsize);
871         } else {
872                 /* Does this ciphered tag match the input? */
873                 ret = ccp_init_dm_workarea(&tag, cmd_q, authsize,
874                                            DMA_BIDIRECTIONAL);
875                 if (ret)
876                         goto e_final_wa;
877                 ret = ccp_set_dm_area(&tag, 0, p_tag, 0, authsize);
878                 if (ret) {
879                         ccp_dm_free(&tag);
880                         goto e_final_wa;
881                 }
882
883                 ret = crypto_memneq(tag.address, final_wa.address,
884                                     authsize) ? -EBADMSG : 0;
885                 ccp_dm_free(&tag);
886         }
887
888 e_final_wa:
889         ccp_dm_free(&final_wa);
890
891 e_dst:
892         if (ilen > 0 && !in_place)
893                 ccp_free_data(&dst, cmd_q);
894
895 e_src:
896         if (ilen > 0)
897                 ccp_free_data(&src, cmd_q);
898
899 e_aad:
900         if (aes->aad_len)
901                 ccp_free_data(&aad, cmd_q);
902
903 e_ctx:
904         ccp_dm_free(&ctx);
905
906 e_key:
907         ccp_dm_free(&key);
908
909         return ret;
910 }
911
912 static noinline_for_stack int
913 ccp_run_aes_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
914 {
915         struct ccp_aes_engine *aes = &cmd->u.aes;
916         struct ccp_dm_workarea key, ctx;
917         struct ccp_data src, dst;
918         struct ccp_op op;
919         unsigned int dm_offset;
920         bool in_place = false;
921         int ret;
922
923         if (!((aes->key_len == AES_KEYSIZE_128) ||
924               (aes->key_len == AES_KEYSIZE_192) ||
925               (aes->key_len == AES_KEYSIZE_256)))
926                 return -EINVAL;
927
928         if (((aes->mode == CCP_AES_MODE_ECB) ||
929              (aes->mode == CCP_AES_MODE_CBC)) &&
930             (aes->src_len & (AES_BLOCK_SIZE - 1)))
931                 return -EINVAL;
932
933         if (!aes->key || !aes->src || !aes->dst)
934                 return -EINVAL;
935
936         if (aes->mode != CCP_AES_MODE_ECB) {
937                 if (aes->iv_len != AES_BLOCK_SIZE)
938                         return -EINVAL;
939
940                 if (!aes->iv)
941                         return -EINVAL;
942         }
943
944         BUILD_BUG_ON(CCP_AES_KEY_SB_COUNT != 1);
945         BUILD_BUG_ON(CCP_AES_CTX_SB_COUNT != 1);
946
947         ret = -EIO;
948         memset(&op, 0, sizeof(op));
949         op.cmd_q = cmd_q;
950         op.jobid = CCP_NEW_JOBID(cmd_q->ccp);
951         op.sb_key = cmd_q->sb_key;
952         op.sb_ctx = cmd_q->sb_ctx;
953         op.init = (aes->mode == CCP_AES_MODE_ECB) ? 0 : 1;
954         op.u.aes.type = aes->type;
955         op.u.aes.mode = aes->mode;
956         op.u.aes.action = aes->action;
957
958         /* All supported key sizes fit in a single (32-byte) SB entry
959          * and must be in little endian format. Use the 256-bit byte
960          * swap passthru option to convert from big endian to little
961          * endian.
962          */
963         ret = ccp_init_dm_workarea(&key, cmd_q,
964                                    CCP_AES_KEY_SB_COUNT * CCP_SB_BYTES,
965                                    DMA_TO_DEVICE);
966         if (ret)
967                 return ret;
968
969         dm_offset = CCP_SB_BYTES - aes->key_len;
970         ret = ccp_set_dm_area(&key, dm_offset, aes->key, 0, aes->key_len);
971         if (ret)
972                 goto e_key;
973         ret = ccp_copy_to_sb(cmd_q, &key, op.jobid, op.sb_key,
974                              CCP_PASSTHRU_BYTESWAP_256BIT);
975         if (ret) {
976                 cmd->engine_error = cmd_q->cmd_error;
977                 goto e_key;
978         }
979
980         /* The AES context fits in a single (32-byte) SB entry and
981          * must be in little endian format. Use the 256-bit byte swap
982          * passthru option to convert from big endian to little endian.
983          */
984         ret = ccp_init_dm_workarea(&ctx, cmd_q,
985                                    CCP_AES_CTX_SB_COUNT * CCP_SB_BYTES,
986                                    DMA_BIDIRECTIONAL);
987         if (ret)
988                 goto e_key;
989
990         if (aes->mode != CCP_AES_MODE_ECB) {
991                 /* Load the AES context - convert to LE */
992                 dm_offset = CCP_SB_BYTES - AES_BLOCK_SIZE;
993                 ret = ccp_set_dm_area(&ctx, dm_offset, aes->iv, 0, aes->iv_len);
994                 if (ret)
995                         goto e_ctx;
996                 ret = ccp_copy_to_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
997                                      CCP_PASSTHRU_BYTESWAP_256BIT);
998                 if (ret) {
999                         cmd->engine_error = cmd_q->cmd_error;
1000                         goto e_ctx;
1001                 }
1002         }
1003         switch (aes->mode) {
1004         case CCP_AES_MODE_CFB: /* CFB128 only */
1005         case CCP_AES_MODE_CTR:
1006                 op.u.aes.size = AES_BLOCK_SIZE * BITS_PER_BYTE - 1;
1007                 break;
1008         default:
1009                 op.u.aes.size = 0;
1010         }
1011
1012         /* Prepare the input and output data workareas. For in-place
1013          * operations we need to set the dma direction to BIDIRECTIONAL
1014          * and copy the src workarea to the dst workarea.
1015          */
1016         if (sg_virt(aes->src) == sg_virt(aes->dst))
1017                 in_place = true;
1018
1019         ret = ccp_init_data(&src, cmd_q, aes->src, aes->src_len,
1020                             AES_BLOCK_SIZE,
1021                             in_place ? DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
1022         if (ret)
1023                 goto e_ctx;
1024
1025         if (in_place) {
1026                 dst = src;
1027         } else {
1028                 ret = ccp_init_data(&dst, cmd_q, aes->dst, aes->src_len,
1029                                     AES_BLOCK_SIZE, DMA_FROM_DEVICE);
1030                 if (ret)
1031                         goto e_src;
1032         }
1033
1034         /* Send data to the CCP AES engine */
1035         while (src.sg_wa.bytes_left) {
1036                 ccp_prepare_data(&src, &dst, &op, AES_BLOCK_SIZE, true);
1037                 if (!src.sg_wa.bytes_left) {
1038                         op.eom = 1;
1039
1040                         /* Since we don't retrieve the AES context in ECB
1041                          * mode we have to wait for the operation to complete
1042                          * on the last piece of data
1043                          */
1044                         if (aes->mode == CCP_AES_MODE_ECB)
1045                                 op.soc = 1;
1046                 }
1047
1048                 ret = cmd_q->ccp->vdata->perform->aes(&op);
1049                 if (ret) {
1050                         cmd->engine_error = cmd_q->cmd_error;
1051                         goto e_dst;
1052                 }
1053
1054                 ccp_process_data(&src, &dst, &op);
1055         }
1056
1057         if (aes->mode != CCP_AES_MODE_ECB) {
1058                 /* Retrieve the AES context - convert from LE to BE using
1059                  * 32-byte (256-bit) byteswapping
1060                  */
1061                 ret = ccp_copy_from_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
1062                                        CCP_PASSTHRU_BYTESWAP_256BIT);
1063                 if (ret) {
1064                         cmd->engine_error = cmd_q->cmd_error;
1065                         goto e_dst;
1066                 }
1067
1068                 /* ...but we only need AES_BLOCK_SIZE bytes */
1069                 dm_offset = CCP_SB_BYTES - AES_BLOCK_SIZE;
1070                 ccp_get_dm_area(&ctx, dm_offset, aes->iv, 0, aes->iv_len);
1071         }
1072
1073 e_dst:
1074         if (!in_place)
1075                 ccp_free_data(&dst, cmd_q);
1076
1077 e_src:
1078         ccp_free_data(&src, cmd_q);
1079
1080 e_ctx:
1081         ccp_dm_free(&ctx);
1082
1083 e_key:
1084         ccp_dm_free(&key);
1085
1086         return ret;
1087 }
1088
1089 static noinline_for_stack int
1090 ccp_run_xts_aes_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
1091 {
1092         struct ccp_xts_aes_engine *xts = &cmd->u.xts;
1093         struct ccp_dm_workarea key, ctx;
1094         struct ccp_data src, dst;
1095         struct ccp_op op;
1096         unsigned int unit_size, dm_offset;
1097         bool in_place = false;
1098         unsigned int sb_count;
1099         enum ccp_aes_type aestype;
1100         int ret;
1101
1102         switch (xts->unit_size) {
1103         case CCP_XTS_AES_UNIT_SIZE_16:
1104                 unit_size = 16;
1105                 break;
1106         case CCP_XTS_AES_UNIT_SIZE_512:
1107                 unit_size = 512;
1108                 break;
1109         case CCP_XTS_AES_UNIT_SIZE_1024:
1110                 unit_size = 1024;
1111                 break;
1112         case CCP_XTS_AES_UNIT_SIZE_2048:
1113                 unit_size = 2048;
1114                 break;
1115         case CCP_XTS_AES_UNIT_SIZE_4096:
1116                 unit_size = 4096;
1117                 break;
1118
1119         default:
1120                 return -EINVAL;
1121         }
1122
1123         if (xts->key_len == AES_KEYSIZE_128)
1124                 aestype = CCP_AES_TYPE_128;
1125         else if (xts->key_len == AES_KEYSIZE_256)
1126                 aestype = CCP_AES_TYPE_256;
1127         else
1128                 return -EINVAL;
1129
1130         if (!xts->final && (xts->src_len & (AES_BLOCK_SIZE - 1)))
1131                 return -EINVAL;
1132
1133         if (xts->iv_len != AES_BLOCK_SIZE)
1134                 return -EINVAL;
1135
1136         if (!xts->key || !xts->iv || !xts->src || !xts->dst)
1137                 return -EINVAL;
1138
1139         BUILD_BUG_ON(CCP_XTS_AES_KEY_SB_COUNT != 1);
1140         BUILD_BUG_ON(CCP_XTS_AES_CTX_SB_COUNT != 1);
1141
1142         ret = -EIO;
1143         memset(&op, 0, sizeof(op));
1144         op.cmd_q = cmd_q;
1145         op.jobid = CCP_NEW_JOBID(cmd_q->ccp);
1146         op.sb_key = cmd_q->sb_key;
1147         op.sb_ctx = cmd_q->sb_ctx;
1148         op.init = 1;
1149         op.u.xts.type = aestype;
1150         op.u.xts.action = xts->action;
1151         op.u.xts.unit_size = xts->unit_size;
1152
1153         /* A version 3 device only supports 128-bit keys, which fits into a
1154          * single SB entry. A version 5 device uses a 512-bit vector, so two
1155          * SB entries.
1156          */
1157         if (cmd_q->ccp->vdata->version == CCP_VERSION(3, 0))
1158                 sb_count = CCP_XTS_AES_KEY_SB_COUNT;
1159         else
1160                 sb_count = CCP5_XTS_AES_KEY_SB_COUNT;
1161         ret = ccp_init_dm_workarea(&key, cmd_q,
1162                                    sb_count * CCP_SB_BYTES,
1163                                    DMA_TO_DEVICE);
1164         if (ret)
1165                 return ret;
1166
1167         if (cmd_q->ccp->vdata->version == CCP_VERSION(3, 0)) {
1168                 /* All supported key sizes must be in little endian format.
1169                  * Use the 256-bit byte swap passthru option to convert from
1170                  * big endian to little endian.
1171                  */
1172                 dm_offset = CCP_SB_BYTES - AES_KEYSIZE_128;
1173                 ret = ccp_set_dm_area(&key, dm_offset, xts->key, 0, xts->key_len);
1174                 if (ret)
1175                         goto e_key;
1176                 ret = ccp_set_dm_area(&key, 0, xts->key, xts->key_len, xts->key_len);
1177                 if (ret)
1178                         goto e_key;
1179         } else {
1180                 /* Version 5 CCPs use a 512-bit space for the key: each portion
1181                  * occupies 256 bits, or one entire slot, and is zero-padded.
1182                  */
1183                 unsigned int pad;
1184
1185                 dm_offset = CCP_SB_BYTES;
1186                 pad = dm_offset - xts->key_len;
1187                 ret = ccp_set_dm_area(&key, pad, xts->key, 0, xts->key_len);
1188                 if (ret)
1189                         goto e_key;
1190                 ret = ccp_set_dm_area(&key, dm_offset + pad, xts->key,
1191                                       xts->key_len, xts->key_len);
1192                 if (ret)
1193                         goto e_key;
1194         }
1195         ret = ccp_copy_to_sb(cmd_q, &key, op.jobid, op.sb_key,
1196                              CCP_PASSTHRU_BYTESWAP_256BIT);
1197         if (ret) {
1198                 cmd->engine_error = cmd_q->cmd_error;
1199                 goto e_key;
1200         }
1201
1202         /* The AES context fits in a single (32-byte) SB entry and
1203          * for XTS is already in little endian format so no byte swapping
1204          * is needed.
1205          */
1206         ret = ccp_init_dm_workarea(&ctx, cmd_q,
1207                                    CCP_XTS_AES_CTX_SB_COUNT * CCP_SB_BYTES,
1208                                    DMA_BIDIRECTIONAL);
1209         if (ret)
1210                 goto e_key;
1211
1212         ret = ccp_set_dm_area(&ctx, 0, xts->iv, 0, xts->iv_len);
1213         if (ret)
1214                 goto e_ctx;
1215         ret = ccp_copy_to_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
1216                              CCP_PASSTHRU_BYTESWAP_NOOP);
1217         if (ret) {
1218                 cmd->engine_error = cmd_q->cmd_error;
1219                 goto e_ctx;
1220         }
1221
1222         /* Prepare the input and output data workareas. For in-place
1223          * operations we need to set the dma direction to BIDIRECTIONAL
1224          * and copy the src workarea to the dst workarea.
1225          */
1226         if (sg_virt(xts->src) == sg_virt(xts->dst))
1227                 in_place = true;
1228
1229         ret = ccp_init_data(&src, cmd_q, xts->src, xts->src_len,
1230                             unit_size,
1231                             in_place ? DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
1232         if (ret)
1233                 goto e_ctx;
1234
1235         if (in_place) {
1236                 dst = src;
1237         } else {
1238                 ret = ccp_init_data(&dst, cmd_q, xts->dst, xts->src_len,
1239                                     unit_size, DMA_FROM_DEVICE);
1240                 if (ret)
1241                         goto e_src;
1242         }
1243
1244         /* Send data to the CCP AES engine */
1245         while (src.sg_wa.bytes_left) {
1246                 ccp_prepare_data(&src, &dst, &op, unit_size, true);
1247                 if (!src.sg_wa.bytes_left)
1248                         op.eom = 1;
1249
1250                 ret = cmd_q->ccp->vdata->perform->xts_aes(&op);
1251                 if (ret) {
1252                         cmd->engine_error = cmd_q->cmd_error;
1253                         goto e_dst;
1254                 }
1255
1256                 ccp_process_data(&src, &dst, &op);
1257         }
1258
1259         /* Retrieve the AES context - convert from LE to BE using
1260          * 32-byte (256-bit) byteswapping
1261          */
1262         ret = ccp_copy_from_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
1263                                CCP_PASSTHRU_BYTESWAP_256BIT);
1264         if (ret) {
1265                 cmd->engine_error = cmd_q->cmd_error;
1266                 goto e_dst;
1267         }
1268
1269         /* ...but we only need AES_BLOCK_SIZE bytes */
1270         dm_offset = CCP_SB_BYTES - AES_BLOCK_SIZE;
1271         ccp_get_dm_area(&ctx, dm_offset, xts->iv, 0, xts->iv_len);
1272
1273 e_dst:
1274         if (!in_place)
1275                 ccp_free_data(&dst, cmd_q);
1276
1277 e_src:
1278         ccp_free_data(&src, cmd_q);
1279
1280 e_ctx:
1281         ccp_dm_free(&ctx);
1282
1283 e_key:
1284         ccp_dm_free(&key);
1285
1286         return ret;
1287 }
1288
1289 static noinline_for_stack int
1290 ccp_run_des3_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
1291 {
1292         struct ccp_des3_engine *des3 = &cmd->u.des3;
1293
1294         struct ccp_dm_workarea key, ctx;
1295         struct ccp_data src, dst;
1296         struct ccp_op op;
1297         unsigned int dm_offset;
1298         unsigned int len_singlekey;
1299         bool in_place = false;
1300         int ret;
1301
1302         /* Error checks */
1303         if (cmd_q->ccp->vdata->version < CCP_VERSION(5, 0))
1304                 return -EINVAL;
1305
1306         if (!cmd_q->ccp->vdata->perform->des3)
1307                 return -EINVAL;
1308
1309         if (des3->key_len != DES3_EDE_KEY_SIZE)
1310                 return -EINVAL;
1311
1312         if (((des3->mode == CCP_DES3_MODE_ECB) ||
1313                 (des3->mode == CCP_DES3_MODE_CBC)) &&
1314                 (des3->src_len & (DES3_EDE_BLOCK_SIZE - 1)))
1315                 return -EINVAL;
1316
1317         if (!des3->key || !des3->src || !des3->dst)
1318                 return -EINVAL;
1319
1320         if (des3->mode != CCP_DES3_MODE_ECB) {
1321                 if (des3->iv_len != DES3_EDE_BLOCK_SIZE)
1322                         return -EINVAL;
1323
1324                 if (!des3->iv)
1325                         return -EINVAL;
1326         }
1327
1328         /* Zero out all the fields of the command desc */
1329         memset(&op, 0, sizeof(op));
1330
1331         /* Set up the Function field */
1332         op.cmd_q = cmd_q;
1333         op.jobid = CCP_NEW_JOBID(cmd_q->ccp);
1334         op.sb_key = cmd_q->sb_key;
1335
1336         op.init = (des3->mode == CCP_DES3_MODE_ECB) ? 0 : 1;
1337         op.u.des3.type = des3->type;
1338         op.u.des3.mode = des3->mode;
1339         op.u.des3.action = des3->action;
1340
1341         /*
1342          * All supported key sizes fit in a single (32-byte) KSB entry and
1343          * (like AES) must be in little endian format. Use the 256-bit byte
1344          * swap passthru option to convert from big endian to little endian.
1345          */
1346         ret = ccp_init_dm_workarea(&key, cmd_q,
1347                                    CCP_DES3_KEY_SB_COUNT * CCP_SB_BYTES,
1348                                    DMA_TO_DEVICE);
1349         if (ret)
1350                 return ret;
1351
1352         /*
1353          * The contents of the key triplet are in the reverse order of what
1354          * is required by the engine. Copy the 3 pieces individually to put
1355          * them where they belong.
1356          */
1357         dm_offset = CCP_SB_BYTES - des3->key_len; /* Basic offset */
1358
1359         len_singlekey = des3->key_len / 3;
1360         ret = ccp_set_dm_area(&key, dm_offset + 2 * len_singlekey,
1361                               des3->key, 0, len_singlekey);
1362         if (ret)
1363                 goto e_key;
1364         ret = ccp_set_dm_area(&key, dm_offset + len_singlekey,
1365                               des3->key, len_singlekey, len_singlekey);
1366         if (ret)
1367                 goto e_key;
1368         ret = ccp_set_dm_area(&key, dm_offset,
1369                               des3->key, 2 * len_singlekey, len_singlekey);
1370         if (ret)
1371                 goto e_key;
1372
1373         /* Copy the key to the SB */
1374         ret = ccp_copy_to_sb(cmd_q, &key, op.jobid, op.sb_key,
1375                              CCP_PASSTHRU_BYTESWAP_256BIT);
1376         if (ret) {
1377                 cmd->engine_error = cmd_q->cmd_error;
1378                 goto e_key;
1379         }
1380
1381         /*
1382          * The DES3 context fits in a single (32-byte) KSB entry and
1383          * must be in little endian format. Use the 256-bit byte swap
1384          * passthru option to convert from big endian to little endian.
1385          */
1386         if (des3->mode != CCP_DES3_MODE_ECB) {
1387                 op.sb_ctx = cmd_q->sb_ctx;
1388
1389                 ret = ccp_init_dm_workarea(&ctx, cmd_q,
1390                                            CCP_DES3_CTX_SB_COUNT * CCP_SB_BYTES,
1391                                            DMA_BIDIRECTIONAL);
1392                 if (ret)
1393                         goto e_key;
1394
1395                 /* Load the context into the LSB */
1396                 dm_offset = CCP_SB_BYTES - des3->iv_len;
1397                 ret = ccp_set_dm_area(&ctx, dm_offset, des3->iv, 0,
1398                                       des3->iv_len);
1399                 if (ret)
1400                         goto e_ctx;
1401
1402                 ret = ccp_copy_to_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
1403                                      CCP_PASSTHRU_BYTESWAP_256BIT);
1404                 if (ret) {
1405                         cmd->engine_error = cmd_q->cmd_error;
1406                         goto e_ctx;
1407                 }
1408         }
1409
1410         /*
1411          * Prepare the input and output data workareas. For in-place
1412          * operations we need to set the dma direction to BIDIRECTIONAL
1413          * and copy the src workarea to the dst workarea.
1414          */
1415         if (sg_virt(des3->src) == sg_virt(des3->dst))
1416                 in_place = true;
1417
1418         ret = ccp_init_data(&src, cmd_q, des3->src, des3->src_len,
1419                         DES3_EDE_BLOCK_SIZE,
1420                         in_place ? DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
1421         if (ret)
1422                 goto e_ctx;
1423
1424         if (in_place)
1425                 dst = src;
1426         else {
1427                 ret = ccp_init_data(&dst, cmd_q, des3->dst, des3->src_len,
1428                                 DES3_EDE_BLOCK_SIZE, DMA_FROM_DEVICE);
1429                 if (ret)
1430                         goto e_src;
1431         }
1432
1433         /* Send data to the CCP DES3 engine */
1434         while (src.sg_wa.bytes_left) {
1435                 ccp_prepare_data(&src, &dst, &op, DES3_EDE_BLOCK_SIZE, true);
1436                 if (!src.sg_wa.bytes_left) {
1437                         op.eom = 1;
1438
1439                         /* Since we don't retrieve the context in ECB mode
1440                          * we have to wait for the operation to complete
1441                          * on the last piece of data
1442                          */
1443                         op.soc = 0;
1444                 }
1445
1446                 ret = cmd_q->ccp->vdata->perform->des3(&op);
1447                 if (ret) {
1448                         cmd->engine_error = cmd_q->cmd_error;
1449                         goto e_dst;
1450                 }
1451
1452                 ccp_process_data(&src, &dst, &op);
1453         }
1454
1455         if (des3->mode != CCP_DES3_MODE_ECB) {
1456                 /* Retrieve the context and make BE */
1457                 ret = ccp_copy_from_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
1458                                        CCP_PASSTHRU_BYTESWAP_256BIT);
1459                 if (ret) {
1460                         cmd->engine_error = cmd_q->cmd_error;
1461                         goto e_dst;
1462                 }
1463
1464                 /* ...but we only need the last DES3_EDE_BLOCK_SIZE bytes */
1465                 ccp_get_dm_area(&ctx, dm_offset, des3->iv, 0,
1466                                 DES3_EDE_BLOCK_SIZE);
1467         }
1468 e_dst:
1469         if (!in_place)
1470                 ccp_free_data(&dst, cmd_q);
1471
1472 e_src:
1473         ccp_free_data(&src, cmd_q);
1474
1475 e_ctx:
1476         if (des3->mode != CCP_DES3_MODE_ECB)
1477                 ccp_dm_free(&ctx);
1478
1479 e_key:
1480         ccp_dm_free(&key);
1481
1482         return ret;
1483 }
1484
1485 static noinline_for_stack int
1486 ccp_run_sha_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
1487 {
1488         struct ccp_sha_engine *sha = &cmd->u.sha;
1489         struct ccp_dm_workarea ctx;
1490         struct ccp_data src;
1491         struct ccp_op op;
1492         unsigned int ioffset, ooffset;
1493         unsigned int digest_size;
1494         int sb_count;
1495         const void *init;
1496         u64 block_size;
1497         int ctx_size;
1498         int ret;
1499
1500         switch (sha->type) {
1501         case CCP_SHA_TYPE_1:
1502                 if (sha->ctx_len < SHA1_DIGEST_SIZE)
1503                         return -EINVAL;
1504                 block_size = SHA1_BLOCK_SIZE;
1505                 break;
1506         case CCP_SHA_TYPE_224:
1507                 if (sha->ctx_len < SHA224_DIGEST_SIZE)
1508                         return -EINVAL;
1509                 block_size = SHA224_BLOCK_SIZE;
1510                 break;
1511         case CCP_SHA_TYPE_256:
1512                 if (sha->ctx_len < SHA256_DIGEST_SIZE)
1513                         return -EINVAL;
1514                 block_size = SHA256_BLOCK_SIZE;
1515                 break;
1516         case CCP_SHA_TYPE_384:
1517                 if (cmd_q->ccp->vdata->version < CCP_VERSION(4, 0)
1518                     || sha->ctx_len < SHA384_DIGEST_SIZE)
1519                         return -EINVAL;
1520                 block_size = SHA384_BLOCK_SIZE;
1521                 break;
1522         case CCP_SHA_TYPE_512:
1523                 if (cmd_q->ccp->vdata->version < CCP_VERSION(4, 0)
1524                     || sha->ctx_len < SHA512_DIGEST_SIZE)
1525                         return -EINVAL;
1526                 block_size = SHA512_BLOCK_SIZE;
1527                 break;
1528         default:
1529                 return -EINVAL;
1530         }
1531
1532         if (!sha->ctx)
1533                 return -EINVAL;
1534
1535         if (!sha->final && (sha->src_len & (block_size - 1)))
1536                 return -EINVAL;
1537
1538         /* The version 3 device can't handle zero-length input */
1539         if (cmd_q->ccp->vdata->version == CCP_VERSION(3, 0)) {
1540
1541                 if (!sha->src_len) {
1542                         unsigned int digest_len;
1543                         const u8 *sha_zero;
1544
1545                         /* Not final, just return */
1546                         if (!sha->final)
1547                                 return 0;
1548
1549                         /* CCP can't do a zero length sha operation so the
1550                          * caller must buffer the data.
1551                          */
1552                         if (sha->msg_bits)
1553                                 return -EINVAL;
1554
1555                         /* The CCP cannot perform zero-length sha operations
1556                          * so the caller is required to buffer data for the
1557                          * final operation. However, a sha operation for a
1558                          * message with a total length of zero is valid so
1559                          * known values are required to supply the result.
1560                          */
1561                         switch (sha->type) {
1562                         case CCP_SHA_TYPE_1:
1563                                 sha_zero = sha1_zero_message_hash;
1564                                 digest_len = SHA1_DIGEST_SIZE;
1565                                 break;
1566                         case CCP_SHA_TYPE_224:
1567                                 sha_zero = sha224_zero_message_hash;
1568                                 digest_len = SHA224_DIGEST_SIZE;
1569                                 break;
1570                         case CCP_SHA_TYPE_256:
1571                                 sha_zero = sha256_zero_message_hash;
1572                                 digest_len = SHA256_DIGEST_SIZE;
1573                                 break;
1574                         default:
1575                                 return -EINVAL;
1576                         }
1577
1578                         scatterwalk_map_and_copy((void *)sha_zero, sha->ctx, 0,
1579                                                  digest_len, 1);
1580
1581                         return 0;
1582                 }
1583         }
1584
1585         /* Set variables used throughout */
1586         switch (sha->type) {
1587         case CCP_SHA_TYPE_1:
1588                 digest_size = SHA1_DIGEST_SIZE;
1589                 init = (void *) ccp_sha1_init;
1590                 ctx_size = SHA1_DIGEST_SIZE;
1591                 sb_count = 1;
1592                 if (cmd_q->ccp->vdata->version != CCP_VERSION(3, 0))
1593                         ooffset = ioffset = CCP_SB_BYTES - SHA1_DIGEST_SIZE;
1594                 else
1595                         ooffset = ioffset = 0;
1596                 break;
1597         case CCP_SHA_TYPE_224:
1598                 digest_size = SHA224_DIGEST_SIZE;
1599                 init = (void *) ccp_sha224_init;
1600                 ctx_size = SHA256_DIGEST_SIZE;
1601                 sb_count = 1;
1602                 ioffset = 0;
1603                 if (cmd_q->ccp->vdata->version != CCP_VERSION(3, 0))
1604                         ooffset = CCP_SB_BYTES - SHA224_DIGEST_SIZE;
1605                 else
1606                         ooffset = 0;
1607                 break;
1608         case CCP_SHA_TYPE_256:
1609                 digest_size = SHA256_DIGEST_SIZE;
1610                 init = (void *) ccp_sha256_init;
1611                 ctx_size = SHA256_DIGEST_SIZE;
1612                 sb_count = 1;
1613                 ooffset = ioffset = 0;
1614                 break;
1615         case CCP_SHA_TYPE_384:
1616                 digest_size = SHA384_DIGEST_SIZE;
1617                 init = (void *) ccp_sha384_init;
1618                 ctx_size = SHA512_DIGEST_SIZE;
1619                 sb_count = 2;
1620                 ioffset = 0;
1621                 ooffset = 2 * CCP_SB_BYTES - SHA384_DIGEST_SIZE;
1622                 break;
1623         case CCP_SHA_TYPE_512:
1624                 digest_size = SHA512_DIGEST_SIZE;
1625                 init = (void *) ccp_sha512_init;
1626                 ctx_size = SHA512_DIGEST_SIZE;
1627                 sb_count = 2;
1628                 ooffset = ioffset = 0;
1629                 break;
1630         default:
1631                 ret = -EINVAL;
1632                 goto e_data;
1633         }
1634
1635         /* For zero-length plaintext the src pointer is ignored;
1636          * otherwise both parts must be valid
1637          */
1638         if (sha->src_len && !sha->src)
1639                 return -EINVAL;
1640
1641         memset(&op, 0, sizeof(op));
1642         op.cmd_q = cmd_q;
1643         op.jobid = CCP_NEW_JOBID(cmd_q->ccp);
1644         op.sb_ctx = cmd_q->sb_ctx; /* Pre-allocated */
1645         op.u.sha.type = sha->type;
1646         op.u.sha.msg_bits = sha->msg_bits;
1647
1648         /* For SHA1/224/256 the context fits in a single (32-byte) SB entry;
1649          * SHA384/512 require 2 adjacent SB slots, with the right half in the
1650          * first slot, and the left half in the second. Each portion must then
1651          * be in little endian format: use the 256-bit byte swap option.
1652          */
1653         ret = ccp_init_dm_workarea(&ctx, cmd_q, sb_count * CCP_SB_BYTES,
1654                                    DMA_BIDIRECTIONAL);
1655         if (ret)
1656                 return ret;
1657         if (sha->first) {
1658                 switch (sha->type) {
1659                 case CCP_SHA_TYPE_1:
1660                 case CCP_SHA_TYPE_224:
1661                 case CCP_SHA_TYPE_256:
1662                         memcpy(ctx.address + ioffset, init, ctx_size);
1663                         break;
1664                 case CCP_SHA_TYPE_384:
1665                 case CCP_SHA_TYPE_512:
1666                         memcpy(ctx.address + ctx_size / 2, init,
1667                                ctx_size / 2);
1668                         memcpy(ctx.address, init + ctx_size / 2,
1669                                ctx_size / 2);
1670                         break;
1671                 default:
1672                         ret = -EINVAL;
1673                         goto e_ctx;
1674                 }
1675         } else {
1676                 /* Restore the context */
1677                 ret = ccp_set_dm_area(&ctx, 0, sha->ctx, 0,
1678                                       sb_count * CCP_SB_BYTES);
1679                 if (ret)
1680                         goto e_ctx;
1681         }
1682
1683         ret = ccp_copy_to_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
1684                              CCP_PASSTHRU_BYTESWAP_256BIT);
1685         if (ret) {
1686                 cmd->engine_error = cmd_q->cmd_error;
1687                 goto e_ctx;
1688         }
1689
1690         if (sha->src) {
1691                 /* Send data to the CCP SHA engine; block_size is set above */
1692                 ret = ccp_init_data(&src, cmd_q, sha->src, sha->src_len,
1693                                     block_size, DMA_TO_DEVICE);
1694                 if (ret)
1695                         goto e_ctx;
1696
1697                 while (src.sg_wa.bytes_left) {
1698                         ccp_prepare_data(&src, NULL, &op, block_size, false);
1699                         if (sha->final && !src.sg_wa.bytes_left)
1700                                 op.eom = 1;
1701
1702                         ret = cmd_q->ccp->vdata->perform->sha(&op);
1703                         if (ret) {
1704                                 cmd->engine_error = cmd_q->cmd_error;
1705                                 goto e_data;
1706                         }
1707
1708                         ccp_process_data(&src, NULL, &op);
1709                 }
1710         } else {
1711                 op.eom = 1;
1712                 ret = cmd_q->ccp->vdata->perform->sha(&op);
1713                 if (ret) {
1714                         cmd->engine_error = cmd_q->cmd_error;
1715                         goto e_data;
1716                 }
1717         }
1718
1719         /* Retrieve the SHA context - convert from LE to BE using
1720          * 32-byte (256-bit) byteswapping to BE
1721          */
1722         ret = ccp_copy_from_sb(cmd_q, &ctx, op.jobid, op.sb_ctx,
1723                                CCP_PASSTHRU_BYTESWAP_256BIT);
1724         if (ret) {
1725                 cmd->engine_error = cmd_q->cmd_error;
1726                 goto e_data;
1727         }
1728
1729         if (sha->final) {
1730                 /* Finishing up, so get the digest */
1731                 switch (sha->type) {
1732                 case CCP_SHA_TYPE_1:
1733                 case CCP_SHA_TYPE_224:
1734                 case CCP_SHA_TYPE_256:
1735                         ccp_get_dm_area(&ctx, ooffset,
1736                                         sha->ctx, 0,
1737                                         digest_size);
1738                         break;
1739                 case CCP_SHA_TYPE_384:
1740                 case CCP_SHA_TYPE_512:
1741                         ccp_get_dm_area(&ctx, 0,
1742                                         sha->ctx, LSB_ITEM_SIZE - ooffset,
1743                                         LSB_ITEM_SIZE);
1744                         ccp_get_dm_area(&ctx, LSB_ITEM_SIZE + ooffset,
1745                                         sha->ctx, 0,
1746                                         LSB_ITEM_SIZE - ooffset);
1747                         break;
1748                 default:
1749                         ret = -EINVAL;
1750                         goto e_data;
1751                 }
1752         } else {
1753                 /* Stash the context */
1754                 ccp_get_dm_area(&ctx, 0, sha->ctx, 0,
1755                                 sb_count * CCP_SB_BYTES);
1756         }
1757
1758         if (sha->final && sha->opad) {
1759                 /* HMAC operation, recursively perform final SHA */
1760                 struct ccp_cmd hmac_cmd;
1761                 struct scatterlist sg;
1762                 u8 *hmac_buf;
1763
1764                 if (sha->opad_len != block_size) {
1765                         ret = -EINVAL;
1766                         goto e_data;
1767                 }
1768
1769                 hmac_buf = kmalloc(block_size + digest_size, GFP_KERNEL);
1770                 if (!hmac_buf) {
1771                         ret = -ENOMEM;
1772                         goto e_data;
1773                 }
1774                 sg_init_one(&sg, hmac_buf, block_size + digest_size);
1775
1776                 scatterwalk_map_and_copy(hmac_buf, sha->opad, 0, block_size, 0);
1777                 switch (sha->type) {
1778                 case CCP_SHA_TYPE_1:
1779                 case CCP_SHA_TYPE_224:
1780                 case CCP_SHA_TYPE_256:
1781                         memcpy(hmac_buf + block_size,
1782                                ctx.address + ooffset,
1783                                digest_size);
1784                         break;
1785                 case CCP_SHA_TYPE_384:
1786                 case CCP_SHA_TYPE_512:
1787                         memcpy(hmac_buf + block_size,
1788                                ctx.address + LSB_ITEM_SIZE + ooffset,
1789                                LSB_ITEM_SIZE);
1790                         memcpy(hmac_buf + block_size +
1791                                (LSB_ITEM_SIZE - ooffset),
1792                                ctx.address,
1793                                LSB_ITEM_SIZE);
1794                         break;
1795                 default:
1796                         kfree(hmac_buf);
1797                         ret = -EINVAL;
1798                         goto e_data;
1799                 }
1800
1801                 memset(&hmac_cmd, 0, sizeof(hmac_cmd));
1802                 hmac_cmd.engine = CCP_ENGINE_SHA;
1803                 hmac_cmd.u.sha.type = sha->type;
1804                 hmac_cmd.u.sha.ctx = sha->ctx;
1805                 hmac_cmd.u.sha.ctx_len = sha->ctx_len;
1806                 hmac_cmd.u.sha.src = &sg;
1807                 hmac_cmd.u.sha.src_len = block_size + digest_size;
1808                 hmac_cmd.u.sha.opad = NULL;
1809                 hmac_cmd.u.sha.opad_len = 0;
1810                 hmac_cmd.u.sha.first = 1;
1811                 hmac_cmd.u.sha.final = 1;
1812                 hmac_cmd.u.sha.msg_bits = (block_size + digest_size) << 3;
1813
1814                 ret = ccp_run_sha_cmd(cmd_q, &hmac_cmd);
1815                 if (ret)
1816                         cmd->engine_error = hmac_cmd.engine_error;
1817
1818                 kfree(hmac_buf);
1819         }
1820
1821 e_data:
1822         if (sha->src)
1823                 ccp_free_data(&src, cmd_q);
1824
1825 e_ctx:
1826         ccp_dm_free(&ctx);
1827
1828         return ret;
1829 }
1830
1831 static noinline_for_stack int
1832 ccp_run_rsa_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
1833 {
1834         struct ccp_rsa_engine *rsa = &cmd->u.rsa;
1835         struct ccp_dm_workarea exp, src, dst;
1836         struct ccp_op op;
1837         unsigned int sb_count, i_len, o_len;
1838         int ret;
1839
1840         /* Check against the maximum allowable size, in bits */
1841         if (rsa->key_size > cmd_q->ccp->vdata->rsamax)
1842                 return -EINVAL;
1843
1844         if (!rsa->exp || !rsa->mod || !rsa->src || !rsa->dst)
1845                 return -EINVAL;
1846
1847         memset(&op, 0, sizeof(op));
1848         op.cmd_q = cmd_q;
1849         op.jobid = CCP_NEW_JOBID(cmd_q->ccp);
1850
1851         /* The RSA modulus must precede the message being acted upon, so
1852          * it must be copied to a DMA area where the message and the
1853          * modulus can be concatenated.  Therefore the input buffer
1854          * length required is twice the output buffer length (which
1855          * must be a multiple of 256-bits).  Compute o_len, i_len in bytes.
1856          * Buffer sizes must be a multiple of 32 bytes; rounding up may be
1857          * required.
1858          */
1859         o_len = 32 * ((rsa->key_size + 255) / 256);
1860         i_len = o_len * 2;
1861
1862         sb_count = 0;
1863         if (cmd_q->ccp->vdata->version < CCP_VERSION(5, 0)) {
1864                 /* sb_count is the number of storage block slots required
1865                  * for the modulus.
1866                  */
1867                 sb_count = o_len / CCP_SB_BYTES;
1868                 op.sb_key = cmd_q->ccp->vdata->perform->sballoc(cmd_q,
1869                                                                 sb_count);
1870                 if (!op.sb_key)
1871                         return -EIO;
1872         } else {
1873                 /* A version 5 device allows a modulus size that will not fit
1874                  * in the LSB, so the command will transfer it from memory.
1875                  * Set the sb key to the default, even though it's not used.
1876                  */
1877                 op.sb_key = cmd_q->sb_key;
1878         }
1879
1880         /* The RSA exponent must be in little endian format. Reverse its
1881          * byte order.
1882          */
1883         ret = ccp_init_dm_workarea(&exp, cmd_q, o_len, DMA_TO_DEVICE);
1884         if (ret)
1885                 goto e_sb;
1886
1887         ret = ccp_reverse_set_dm_area(&exp, 0, rsa->exp, 0, rsa->exp_len);
1888         if (ret)
1889                 goto e_exp;
1890
1891         if (cmd_q->ccp->vdata->version < CCP_VERSION(5, 0)) {
1892                 /* Copy the exponent to the local storage block, using
1893                  * as many 32-byte blocks as were allocated above. It's
1894                  * already little endian, so no further change is required.
1895                  */
1896                 ret = ccp_copy_to_sb(cmd_q, &exp, op.jobid, op.sb_key,
1897                                      CCP_PASSTHRU_BYTESWAP_NOOP);
1898                 if (ret) {
1899                         cmd->engine_error = cmd_q->cmd_error;
1900                         goto e_exp;
1901                 }
1902         } else {
1903                 /* The exponent can be retrieved from memory via DMA. */
1904                 op.exp.u.dma.address = exp.dma.address;
1905                 op.exp.u.dma.offset = 0;
1906         }
1907
1908         /* Concatenate the modulus and the message. Both the modulus and
1909          * the operands must be in little endian format.  Since the input
1910          * is in big endian format it must be converted.
1911          */
1912         ret = ccp_init_dm_workarea(&src, cmd_q, i_len, DMA_TO_DEVICE);
1913         if (ret)
1914                 goto e_exp;
1915
1916         ret = ccp_reverse_set_dm_area(&src, 0, rsa->mod, 0, rsa->mod_len);
1917         if (ret)
1918                 goto e_src;
1919         ret = ccp_reverse_set_dm_area(&src, o_len, rsa->src, 0, rsa->src_len);
1920         if (ret)
1921                 goto e_src;
1922
1923         /* Prepare the output area for the operation */
1924         ret = ccp_init_dm_workarea(&dst, cmd_q, o_len, DMA_FROM_DEVICE);
1925         if (ret)
1926                 goto e_src;
1927
1928         op.soc = 1;
1929         op.src.u.dma.address = src.dma.address;
1930         op.src.u.dma.offset = 0;
1931         op.src.u.dma.length = i_len;
1932         op.dst.u.dma.address = dst.dma.address;
1933         op.dst.u.dma.offset = 0;
1934         op.dst.u.dma.length = o_len;
1935
1936         op.u.rsa.mod_size = rsa->key_size;
1937         op.u.rsa.input_len = i_len;
1938
1939         ret = cmd_q->ccp->vdata->perform->rsa(&op);
1940         if (ret) {
1941                 cmd->engine_error = cmd_q->cmd_error;
1942                 goto e_dst;
1943         }
1944
1945         ccp_reverse_get_dm_area(&dst, 0, rsa->dst, 0, rsa->mod_len);
1946
1947 e_dst:
1948         ccp_dm_free(&dst);
1949
1950 e_src:
1951         ccp_dm_free(&src);
1952
1953 e_exp:
1954         ccp_dm_free(&exp);
1955
1956 e_sb:
1957         if (sb_count)
1958                 cmd_q->ccp->vdata->perform->sbfree(cmd_q, op.sb_key, sb_count);
1959
1960         return ret;
1961 }
1962
1963 static noinline_for_stack int
1964 ccp_run_passthru_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
1965 {
1966         struct ccp_passthru_engine *pt = &cmd->u.passthru;
1967         struct ccp_dm_workarea mask;
1968         struct ccp_data src, dst;
1969         struct ccp_op op;
1970         bool in_place = false;
1971         unsigned int i;
1972         int ret = 0;
1973
1974         if (!pt->final && (pt->src_len & (CCP_PASSTHRU_BLOCKSIZE - 1)))
1975                 return -EINVAL;
1976
1977         if (!pt->src || !pt->dst)
1978                 return -EINVAL;
1979
1980         if (pt->bit_mod != CCP_PASSTHRU_BITWISE_NOOP) {
1981                 if (pt->mask_len != CCP_PASSTHRU_MASKSIZE)
1982                         return -EINVAL;
1983                 if (!pt->mask)
1984                         return -EINVAL;
1985         }
1986
1987         BUILD_BUG_ON(CCP_PASSTHRU_SB_COUNT != 1);
1988
1989         memset(&op, 0, sizeof(op));
1990         op.cmd_q = cmd_q;
1991         op.jobid = CCP_NEW_JOBID(cmd_q->ccp);
1992
1993         if (pt->bit_mod != CCP_PASSTHRU_BITWISE_NOOP) {
1994                 /* Load the mask */
1995                 op.sb_key = cmd_q->sb_key;
1996
1997                 ret = ccp_init_dm_workarea(&mask, cmd_q,
1998                                            CCP_PASSTHRU_SB_COUNT *
1999                                            CCP_SB_BYTES,
2000                                            DMA_TO_DEVICE);
2001                 if (ret)
2002                         return ret;
2003
2004                 ret = ccp_set_dm_area(&mask, 0, pt->mask, 0, pt->mask_len);
2005                 if (ret)
2006                         goto e_mask;
2007                 ret = ccp_copy_to_sb(cmd_q, &mask, op.jobid, op.sb_key,
2008                                      CCP_PASSTHRU_BYTESWAP_NOOP);
2009                 if (ret) {
2010                         cmd->engine_error = cmd_q->cmd_error;
2011                         goto e_mask;
2012                 }
2013         }
2014
2015         /* Prepare the input and output data workareas. For in-place
2016          * operations we need to set the dma direction to BIDIRECTIONAL
2017          * and copy the src workarea to the dst workarea.
2018          */
2019         if (sg_virt(pt->src) == sg_virt(pt->dst))
2020                 in_place = true;
2021
2022         ret = ccp_init_data(&src, cmd_q, pt->src, pt->src_len,
2023                             CCP_PASSTHRU_MASKSIZE,
2024                             in_place ? DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
2025         if (ret)
2026                 goto e_mask;
2027
2028         if (in_place) {
2029                 dst = src;
2030         } else {
2031                 ret = ccp_init_data(&dst, cmd_q, pt->dst, pt->src_len,
2032                                     CCP_PASSTHRU_MASKSIZE, DMA_FROM_DEVICE);
2033                 if (ret)
2034                         goto e_src;
2035         }
2036
2037         /* Send data to the CCP Passthru engine
2038          *   Because the CCP engine works on a single source and destination
2039          *   dma address at a time, each entry in the source scatterlist
2040          *   (after the dma_map_sg call) must be less than or equal to the
2041          *   (remaining) length in the destination scatterlist entry and the
2042          *   length must be a multiple of CCP_PASSTHRU_BLOCKSIZE
2043          */
2044         dst.sg_wa.sg_used = 0;
2045         for (i = 1; i <= src.sg_wa.dma_count; i++) {
2046                 if (!dst.sg_wa.sg ||
2047                     (sg_dma_len(dst.sg_wa.sg) < sg_dma_len(src.sg_wa.sg))) {
2048                         ret = -EINVAL;
2049                         goto e_dst;
2050                 }
2051
2052                 if (i == src.sg_wa.dma_count) {
2053                         op.eom = 1;
2054                         op.soc = 1;
2055                 }
2056
2057                 op.src.type = CCP_MEMTYPE_SYSTEM;
2058                 op.src.u.dma.address = sg_dma_address(src.sg_wa.sg);
2059                 op.src.u.dma.offset = 0;
2060                 op.src.u.dma.length = sg_dma_len(src.sg_wa.sg);
2061
2062                 op.dst.type = CCP_MEMTYPE_SYSTEM;
2063                 op.dst.u.dma.address = sg_dma_address(dst.sg_wa.sg);
2064                 op.dst.u.dma.offset = dst.sg_wa.sg_used;
2065                 op.dst.u.dma.length = op.src.u.dma.length;
2066
2067                 ret = cmd_q->ccp->vdata->perform->passthru(&op);
2068                 if (ret) {
2069                         cmd->engine_error = cmd_q->cmd_error;
2070                         goto e_dst;
2071                 }
2072
2073                 dst.sg_wa.sg_used += sg_dma_len(src.sg_wa.sg);
2074                 if (dst.sg_wa.sg_used == sg_dma_len(dst.sg_wa.sg)) {
2075                         dst.sg_wa.sg = sg_next(dst.sg_wa.sg);
2076                         dst.sg_wa.sg_used = 0;
2077                 }
2078                 src.sg_wa.sg = sg_next(src.sg_wa.sg);
2079         }
2080
2081 e_dst:
2082         if (!in_place)
2083                 ccp_free_data(&dst, cmd_q);
2084
2085 e_src:
2086         ccp_free_data(&src, cmd_q);
2087
2088 e_mask:
2089         if (pt->bit_mod != CCP_PASSTHRU_BITWISE_NOOP)
2090                 ccp_dm_free(&mask);
2091
2092         return ret;
2093 }
2094
2095 static noinline_for_stack int
2096 ccp_run_passthru_nomap_cmd(struct ccp_cmd_queue *cmd_q,
2097                                       struct ccp_cmd *cmd)
2098 {
2099         struct ccp_passthru_nomap_engine *pt = &cmd->u.passthru_nomap;
2100         struct ccp_dm_workarea mask;
2101         struct ccp_op op;
2102         int ret;
2103
2104         if (!pt->final && (pt->src_len & (CCP_PASSTHRU_BLOCKSIZE - 1)))
2105                 return -EINVAL;
2106
2107         if (!pt->src_dma || !pt->dst_dma)
2108                 return -EINVAL;
2109
2110         if (pt->bit_mod != CCP_PASSTHRU_BITWISE_NOOP) {
2111                 if (pt->mask_len != CCP_PASSTHRU_MASKSIZE)
2112                         return -EINVAL;
2113                 if (!pt->mask)
2114                         return -EINVAL;
2115         }
2116
2117         BUILD_BUG_ON(CCP_PASSTHRU_SB_COUNT != 1);
2118
2119         memset(&op, 0, sizeof(op));
2120         op.cmd_q = cmd_q;
2121         op.jobid = CCP_NEW_JOBID(cmd_q->ccp);
2122
2123         if (pt->bit_mod != CCP_PASSTHRU_BITWISE_NOOP) {
2124                 /* Load the mask */
2125                 op.sb_key = cmd_q->sb_key;
2126
2127                 mask.length = pt->mask_len;
2128                 mask.dma.address = pt->mask;
2129                 mask.dma.length = pt->mask_len;
2130
2131                 ret = ccp_copy_to_sb(cmd_q, &mask, op.jobid, op.sb_key,
2132                                      CCP_PASSTHRU_BYTESWAP_NOOP);
2133                 if (ret) {
2134                         cmd->engine_error = cmd_q->cmd_error;
2135                         return ret;
2136                 }
2137         }
2138
2139         /* Send data to the CCP Passthru engine */
2140         op.eom = 1;
2141         op.soc = 1;
2142
2143         op.src.type = CCP_MEMTYPE_SYSTEM;
2144         op.src.u.dma.address = pt->src_dma;
2145         op.src.u.dma.offset = 0;
2146         op.src.u.dma.length = pt->src_len;
2147
2148         op.dst.type = CCP_MEMTYPE_SYSTEM;
2149         op.dst.u.dma.address = pt->dst_dma;
2150         op.dst.u.dma.offset = 0;
2151         op.dst.u.dma.length = pt->src_len;
2152
2153         ret = cmd_q->ccp->vdata->perform->passthru(&op);
2154         if (ret)
2155                 cmd->engine_error = cmd_q->cmd_error;
2156
2157         return ret;
2158 }
2159
2160 static int ccp_run_ecc_mm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
2161 {
2162         struct ccp_ecc_engine *ecc = &cmd->u.ecc;
2163         struct ccp_dm_workarea src, dst;
2164         struct ccp_op op;
2165         int ret;
2166         u8 *save;
2167
2168         if (!ecc->u.mm.operand_1 ||
2169             (ecc->u.mm.operand_1_len > CCP_ECC_MODULUS_BYTES))
2170                 return -EINVAL;
2171
2172         if (ecc->function != CCP_ECC_FUNCTION_MINV_384BIT)
2173                 if (!ecc->u.mm.operand_2 ||
2174                     (ecc->u.mm.operand_2_len > CCP_ECC_MODULUS_BYTES))
2175                         return -EINVAL;
2176
2177         if (!ecc->u.mm.result ||
2178             (ecc->u.mm.result_len < CCP_ECC_MODULUS_BYTES))
2179                 return -EINVAL;
2180
2181         memset(&op, 0, sizeof(op));
2182         op.cmd_q = cmd_q;
2183         op.jobid = CCP_NEW_JOBID(cmd_q->ccp);
2184
2185         /* Concatenate the modulus and the operands. Both the modulus and
2186          * the operands must be in little endian format.  Since the input
2187          * is in big endian format it must be converted and placed in a
2188          * fixed length buffer.
2189          */
2190         ret = ccp_init_dm_workarea(&src, cmd_q, CCP_ECC_SRC_BUF_SIZE,
2191                                    DMA_TO_DEVICE);
2192         if (ret)
2193                 return ret;
2194
2195         /* Save the workarea address since it is updated in order to perform
2196          * the concatenation
2197          */
2198         save = src.address;
2199
2200         /* Copy the ECC modulus */
2201         ret = ccp_reverse_set_dm_area(&src, 0, ecc->mod, 0, ecc->mod_len);
2202         if (ret)
2203                 goto e_src;
2204         src.address += CCP_ECC_OPERAND_SIZE;
2205
2206         /* Copy the first operand */
2207         ret = ccp_reverse_set_dm_area(&src, 0, ecc->u.mm.operand_1, 0,
2208                                       ecc->u.mm.operand_1_len);
2209         if (ret)
2210                 goto e_src;
2211         src.address += CCP_ECC_OPERAND_SIZE;
2212
2213         if (ecc->function != CCP_ECC_FUNCTION_MINV_384BIT) {
2214                 /* Copy the second operand */
2215                 ret = ccp_reverse_set_dm_area(&src, 0, ecc->u.mm.operand_2, 0,
2216                                               ecc->u.mm.operand_2_len);
2217                 if (ret)
2218                         goto e_src;
2219                 src.address += CCP_ECC_OPERAND_SIZE;
2220         }
2221
2222         /* Restore the workarea address */
2223         src.address = save;
2224
2225         /* Prepare the output area for the operation */
2226         ret = ccp_init_dm_workarea(&dst, cmd_q, CCP_ECC_DST_BUF_SIZE,
2227                                    DMA_FROM_DEVICE);
2228         if (ret)
2229                 goto e_src;
2230
2231         op.soc = 1;
2232         op.src.u.dma.address = src.dma.address;
2233         op.src.u.dma.offset = 0;
2234         op.src.u.dma.length = src.length;
2235         op.dst.u.dma.address = dst.dma.address;
2236         op.dst.u.dma.offset = 0;
2237         op.dst.u.dma.length = dst.length;
2238
2239         op.u.ecc.function = cmd->u.ecc.function;
2240
2241         ret = cmd_q->ccp->vdata->perform->ecc(&op);
2242         if (ret) {
2243                 cmd->engine_error = cmd_q->cmd_error;
2244                 goto e_dst;
2245         }
2246
2247         ecc->ecc_result = le16_to_cpup(
2248                 (const __le16 *)(dst.address + CCP_ECC_RESULT_OFFSET));
2249         if (!(ecc->ecc_result & CCP_ECC_RESULT_SUCCESS)) {
2250                 ret = -EIO;
2251                 goto e_dst;
2252         }
2253
2254         /* Save the ECC result */
2255         ccp_reverse_get_dm_area(&dst, 0, ecc->u.mm.result, 0,
2256                                 CCP_ECC_MODULUS_BYTES);
2257
2258 e_dst:
2259         ccp_dm_free(&dst);
2260
2261 e_src:
2262         ccp_dm_free(&src);
2263
2264         return ret;
2265 }
2266
2267 static int ccp_run_ecc_pm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
2268 {
2269         struct ccp_ecc_engine *ecc = &cmd->u.ecc;
2270         struct ccp_dm_workarea src, dst;
2271         struct ccp_op op;
2272         int ret;
2273         u8 *save;
2274
2275         if (!ecc->u.pm.point_1.x ||
2276             (ecc->u.pm.point_1.x_len > CCP_ECC_MODULUS_BYTES) ||
2277             !ecc->u.pm.point_1.y ||
2278             (ecc->u.pm.point_1.y_len > CCP_ECC_MODULUS_BYTES))
2279                 return -EINVAL;
2280
2281         if (ecc->function == CCP_ECC_FUNCTION_PADD_384BIT) {
2282                 if (!ecc->u.pm.point_2.x ||
2283                     (ecc->u.pm.point_2.x_len > CCP_ECC_MODULUS_BYTES) ||
2284                     !ecc->u.pm.point_2.y ||
2285                     (ecc->u.pm.point_2.y_len > CCP_ECC_MODULUS_BYTES))
2286                         return -EINVAL;
2287         } else {
2288                 if (!ecc->u.pm.domain_a ||
2289                     (ecc->u.pm.domain_a_len > CCP_ECC_MODULUS_BYTES))
2290                         return -EINVAL;
2291
2292                 if (ecc->function == CCP_ECC_FUNCTION_PMUL_384BIT)
2293                         if (!ecc->u.pm.scalar ||
2294                             (ecc->u.pm.scalar_len > CCP_ECC_MODULUS_BYTES))
2295                                 return -EINVAL;
2296         }
2297
2298         if (!ecc->u.pm.result.x ||
2299             (ecc->u.pm.result.x_len < CCP_ECC_MODULUS_BYTES) ||
2300             !ecc->u.pm.result.y ||
2301             (ecc->u.pm.result.y_len < CCP_ECC_MODULUS_BYTES))
2302                 return -EINVAL;
2303
2304         memset(&op, 0, sizeof(op));
2305         op.cmd_q = cmd_q;
2306         op.jobid = CCP_NEW_JOBID(cmd_q->ccp);
2307
2308         /* Concatenate the modulus and the operands. Both the modulus and
2309          * the operands must be in little endian format.  Since the input
2310          * is in big endian format it must be converted and placed in a
2311          * fixed length buffer.
2312          */
2313         ret = ccp_init_dm_workarea(&src, cmd_q, CCP_ECC_SRC_BUF_SIZE,
2314                                    DMA_TO_DEVICE);
2315         if (ret)
2316                 return ret;
2317
2318         /* Save the workarea address since it is updated in order to perform
2319          * the concatenation
2320          */
2321         save = src.address;
2322
2323         /* Copy the ECC modulus */
2324         ret = ccp_reverse_set_dm_area(&src, 0, ecc->mod, 0, ecc->mod_len);
2325         if (ret)
2326                 goto e_src;
2327         src.address += CCP_ECC_OPERAND_SIZE;
2328
2329         /* Copy the first point X and Y coordinate */
2330         ret = ccp_reverse_set_dm_area(&src, 0, ecc->u.pm.point_1.x, 0,
2331                                       ecc->u.pm.point_1.x_len);
2332         if (ret)
2333                 goto e_src;
2334         src.address += CCP_ECC_OPERAND_SIZE;
2335         ret = ccp_reverse_set_dm_area(&src, 0, ecc->u.pm.point_1.y, 0,
2336                                       ecc->u.pm.point_1.y_len);
2337         if (ret)
2338                 goto e_src;
2339         src.address += CCP_ECC_OPERAND_SIZE;
2340
2341         /* Set the first point Z coordinate to 1 */
2342         *src.address = 0x01;
2343         src.address += CCP_ECC_OPERAND_SIZE;
2344
2345         if (ecc->function == CCP_ECC_FUNCTION_PADD_384BIT) {
2346                 /* Copy the second point X and Y coordinate */
2347                 ret = ccp_reverse_set_dm_area(&src, 0, ecc->u.pm.point_2.x, 0,
2348                                               ecc->u.pm.point_2.x_len);
2349                 if (ret)
2350                         goto e_src;
2351                 src.address += CCP_ECC_OPERAND_SIZE;
2352                 ret = ccp_reverse_set_dm_area(&src, 0, ecc->u.pm.point_2.y, 0,
2353                                               ecc->u.pm.point_2.y_len);
2354                 if (ret)
2355                         goto e_src;
2356                 src.address += CCP_ECC_OPERAND_SIZE;
2357
2358                 /* Set the second point Z coordinate to 1 */
2359                 *src.address = 0x01;
2360                 src.address += CCP_ECC_OPERAND_SIZE;
2361         } else {
2362                 /* Copy the Domain "a" parameter */
2363                 ret = ccp_reverse_set_dm_area(&src, 0, ecc->u.pm.domain_a, 0,
2364                                               ecc->u.pm.domain_a_len);
2365                 if (ret)
2366                         goto e_src;
2367                 src.address += CCP_ECC_OPERAND_SIZE;
2368
2369                 if (ecc->function == CCP_ECC_FUNCTION_PMUL_384BIT) {
2370                         /* Copy the scalar value */
2371                         ret = ccp_reverse_set_dm_area(&src, 0,
2372                                                       ecc->u.pm.scalar, 0,
2373                                                       ecc->u.pm.scalar_len);
2374                         if (ret)
2375                                 goto e_src;
2376                         src.address += CCP_ECC_OPERAND_SIZE;
2377                 }
2378         }
2379
2380         /* Restore the workarea address */
2381         src.address = save;
2382
2383         /* Prepare the output area for the operation */
2384         ret = ccp_init_dm_workarea(&dst, cmd_q, CCP_ECC_DST_BUF_SIZE,
2385                                    DMA_FROM_DEVICE);
2386         if (ret)
2387                 goto e_src;
2388
2389         op.soc = 1;
2390         op.src.u.dma.address = src.dma.address;
2391         op.src.u.dma.offset = 0;
2392         op.src.u.dma.length = src.length;
2393         op.dst.u.dma.address = dst.dma.address;
2394         op.dst.u.dma.offset = 0;
2395         op.dst.u.dma.length = dst.length;
2396
2397         op.u.ecc.function = cmd->u.ecc.function;
2398
2399         ret = cmd_q->ccp->vdata->perform->ecc(&op);
2400         if (ret) {
2401                 cmd->engine_error = cmd_q->cmd_error;
2402                 goto e_dst;
2403         }
2404
2405         ecc->ecc_result = le16_to_cpup(
2406                 (const __le16 *)(dst.address + CCP_ECC_RESULT_OFFSET));
2407         if (!(ecc->ecc_result & CCP_ECC_RESULT_SUCCESS)) {
2408                 ret = -EIO;
2409                 goto e_dst;
2410         }
2411
2412         /* Save the workarea address since it is updated as we walk through
2413          * to copy the point math result
2414          */
2415         save = dst.address;
2416
2417         /* Save the ECC result X and Y coordinates */
2418         ccp_reverse_get_dm_area(&dst, 0, ecc->u.pm.result.x, 0,
2419                                 CCP_ECC_MODULUS_BYTES);
2420         dst.address += CCP_ECC_OUTPUT_SIZE;
2421         ccp_reverse_get_dm_area(&dst, 0, ecc->u.pm.result.y, 0,
2422                                 CCP_ECC_MODULUS_BYTES);
2423
2424         /* Restore the workarea address */
2425         dst.address = save;
2426
2427 e_dst:
2428         ccp_dm_free(&dst);
2429
2430 e_src:
2431         ccp_dm_free(&src);
2432
2433         return ret;
2434 }
2435
2436 static noinline_for_stack int
2437 ccp_run_ecc_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
2438 {
2439         struct ccp_ecc_engine *ecc = &cmd->u.ecc;
2440
2441         ecc->ecc_result = 0;
2442
2443         if (!ecc->mod ||
2444             (ecc->mod_len > CCP_ECC_MODULUS_BYTES))
2445                 return -EINVAL;
2446
2447         switch (ecc->function) {
2448         case CCP_ECC_FUNCTION_MMUL_384BIT:
2449         case CCP_ECC_FUNCTION_MADD_384BIT:
2450         case CCP_ECC_FUNCTION_MINV_384BIT:
2451                 return ccp_run_ecc_mm_cmd(cmd_q, cmd);
2452
2453         case CCP_ECC_FUNCTION_PADD_384BIT:
2454         case CCP_ECC_FUNCTION_PMUL_384BIT:
2455         case CCP_ECC_FUNCTION_PDBL_384BIT:
2456                 return ccp_run_ecc_pm_cmd(cmd_q, cmd);
2457
2458         default:
2459                 return -EINVAL;
2460         }
2461 }
2462
2463 int ccp_run_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
2464 {
2465         int ret;
2466
2467         cmd->engine_error = 0;
2468         cmd_q->cmd_error = 0;
2469         cmd_q->int_rcvd = 0;
2470         cmd_q->free_slots = cmd_q->ccp->vdata->perform->get_free_slots(cmd_q);
2471
2472         switch (cmd->engine) {
2473         case CCP_ENGINE_AES:
2474                 switch (cmd->u.aes.mode) {
2475                 case CCP_AES_MODE_CMAC:
2476                         ret = ccp_run_aes_cmac_cmd(cmd_q, cmd);
2477                         break;
2478                 case CCP_AES_MODE_GCM:
2479                         ret = ccp_run_aes_gcm_cmd(cmd_q, cmd);
2480                         break;
2481                 default:
2482                         ret = ccp_run_aes_cmd(cmd_q, cmd);
2483                         break;
2484                 }
2485                 break;
2486         case CCP_ENGINE_XTS_AES_128:
2487                 ret = ccp_run_xts_aes_cmd(cmd_q, cmd);
2488                 break;
2489         case CCP_ENGINE_DES3:
2490                 ret = ccp_run_des3_cmd(cmd_q, cmd);
2491                 break;
2492         case CCP_ENGINE_SHA:
2493                 ret = ccp_run_sha_cmd(cmd_q, cmd);
2494                 break;
2495         case CCP_ENGINE_RSA:
2496                 ret = ccp_run_rsa_cmd(cmd_q, cmd);
2497                 break;
2498         case CCP_ENGINE_PASSTHRU:
2499                 if (cmd->flags & CCP_CMD_PASSTHRU_NO_DMA_MAP)
2500                         ret = ccp_run_passthru_nomap_cmd(cmd_q, cmd);
2501                 else
2502                         ret = ccp_run_passthru_cmd(cmd_q, cmd);
2503                 break;
2504         case CCP_ENGINE_ECC:
2505                 ret = ccp_run_ecc_cmd(cmd_q, cmd);
2506                 break;
2507         default:
2508                 ret = -EINVAL;
2509         }
2510
2511         return ret;
2512 }