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