Linux Audio

Check our new training course

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