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