Linux Audio

Check our new training course

Loading...
v6.13.7
   1// SPDX-License-Identifier: GPL-2.0-only
   2/* n2_core.c: Niagara2 Stream Processing Unit (SPU) crypto support.
   3 *
   4 * Copyright (C) 2010, 2011 David S. Miller <davem@davemloft.net>
   5 */
   6
   7#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   8
   9#include <linux/kernel.h>
  10#include <linux/module.h>
  11#include <linux/of.h>
  12#include <linux/of_address.h>
  13#include <linux/platform_device.h>
  14#include <linux/cpumask.h>
  15#include <linux/slab.h>
  16#include <linux/interrupt.h>
  17#include <linux/crypto.h>
  18#include <crypto/md5.h>
  19#include <crypto/sha1.h>
  20#include <crypto/sha2.h>
  21#include <crypto/aes.h>
  22#include <crypto/internal/des.h>
  23#include <linux/mutex.h>
  24#include <linux/delay.h>
  25#include <linux/sched.h>
  26
  27#include <crypto/internal/hash.h>
  28#include <crypto/internal/skcipher.h>
  29#include <crypto/scatterwalk.h>
  30#include <crypto/algapi.h>
  31
  32#include <asm/hypervisor.h>
  33#include <asm/mdesc.h>
  34
  35#include "n2_core.h"
  36
  37#define DRV_MODULE_NAME		"n2_crypto"
  38#define DRV_MODULE_VERSION	"0.2"
  39#define DRV_MODULE_RELDATE	"July 28, 2011"
  40
  41static const char version[] =
  42	DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
  43
  44MODULE_AUTHOR("David S. Miller <davem@davemloft.net>");
  45MODULE_DESCRIPTION("Niagara2 Crypto driver");
  46MODULE_LICENSE("GPL");
  47MODULE_VERSION(DRV_MODULE_VERSION);
  48
  49#define N2_CRA_PRIORITY		200
  50
  51static DEFINE_MUTEX(spu_lock);
  52
  53struct spu_queue {
  54	cpumask_t		sharing;
  55	unsigned long		qhandle;
  56
  57	spinlock_t		lock;
  58	u8			q_type;
  59	void			*q;
  60	unsigned long		head;
  61	unsigned long		tail;
  62	struct list_head	jobs;
  63
  64	unsigned long		devino;
  65
  66	char			irq_name[32];
  67	unsigned int		irq;
  68
  69	struct list_head	list;
  70};
  71
  72struct spu_qreg {
  73	struct spu_queue	*queue;
  74	unsigned long		type;
  75};
  76
  77static struct spu_queue **cpu_to_cwq;
  78static struct spu_queue **cpu_to_mau;
  79
  80static unsigned long spu_next_offset(struct spu_queue *q, unsigned long off)
  81{
  82	if (q->q_type == HV_NCS_QTYPE_MAU) {
  83		off += MAU_ENTRY_SIZE;
  84		if (off == (MAU_ENTRY_SIZE * MAU_NUM_ENTRIES))
  85			off = 0;
  86	} else {
  87		off += CWQ_ENTRY_SIZE;
  88		if (off == (CWQ_ENTRY_SIZE * CWQ_NUM_ENTRIES))
  89			off = 0;
  90	}
  91	return off;
  92}
  93
  94struct n2_request_common {
  95	struct list_head	entry;
  96	unsigned int		offset;
  97};
  98#define OFFSET_NOT_RUNNING	(~(unsigned int)0)
  99
 100/* An async job request records the final tail value it used in
 101 * n2_request_common->offset, test to see if that offset is in
 102 * the range old_head, new_head, inclusive.
 103 */
 104static inline bool job_finished(struct spu_queue *q, unsigned int offset,
 105				unsigned long old_head, unsigned long new_head)
 106{
 107	if (old_head <= new_head) {
 108		if (offset > old_head && offset <= new_head)
 109			return true;
 110	} else {
 111		if (offset > old_head || offset <= new_head)
 112			return true;
 113	}
 114	return false;
 115}
 116
 117/* When the HEAD marker is unequal to the actual HEAD, we get
 118 * a virtual device INO interrupt.  We should process the
 119 * completed CWQ entries and adjust the HEAD marker to clear
 120 * the IRQ.
 121 */
 122static irqreturn_t cwq_intr(int irq, void *dev_id)
 123{
 124	unsigned long off, new_head, hv_ret;
 125	struct spu_queue *q = dev_id;
 126
 127	pr_err("CPU[%d]: Got CWQ interrupt for qhdl[%lx]\n",
 128	       smp_processor_id(), q->qhandle);
 129
 130	spin_lock(&q->lock);
 131
 132	hv_ret = sun4v_ncs_gethead(q->qhandle, &new_head);
 133
 134	pr_err("CPU[%d]: CWQ gethead[%lx] hv_ret[%lu]\n",
 135	       smp_processor_id(), new_head, hv_ret);
 136
 137	for (off = q->head; off != new_head; off = spu_next_offset(q, off)) {
 138		/* XXX ... XXX */
 139	}
 140
 141	hv_ret = sun4v_ncs_sethead_marker(q->qhandle, new_head);
 142	if (hv_ret == HV_EOK)
 143		q->head = new_head;
 144
 145	spin_unlock(&q->lock);
 146
 147	return IRQ_HANDLED;
 148}
 149
 150static irqreturn_t mau_intr(int irq, void *dev_id)
 151{
 152	struct spu_queue *q = dev_id;
 153	unsigned long head, hv_ret;
 154
 155	spin_lock(&q->lock);
 156
 157	pr_err("CPU[%d]: Got MAU interrupt for qhdl[%lx]\n",
 158	       smp_processor_id(), q->qhandle);
 159
 160	hv_ret = sun4v_ncs_gethead(q->qhandle, &head);
 161
 162	pr_err("CPU[%d]: MAU gethead[%lx] hv_ret[%lu]\n",
 163	       smp_processor_id(), head, hv_ret);
 164
 165	sun4v_ncs_sethead_marker(q->qhandle, head);
 166
 167	spin_unlock(&q->lock);
 168
 169	return IRQ_HANDLED;
 170}
 171
 172static void *spu_queue_next(struct spu_queue *q, void *cur)
 173{
 174	return q->q + spu_next_offset(q, cur - q->q);
 175}
 176
 177static int spu_queue_num_free(struct spu_queue *q)
 178{
 179	unsigned long head = q->head;
 180	unsigned long tail = q->tail;
 181	unsigned long end = (CWQ_ENTRY_SIZE * CWQ_NUM_ENTRIES);
 182	unsigned long diff;
 183
 184	if (head > tail)
 185		diff = head - tail;
 186	else
 187		diff = (end - tail) + head;
 188
 189	return (diff / CWQ_ENTRY_SIZE) - 1;
 190}
 191
 192static void *spu_queue_alloc(struct spu_queue *q, int num_entries)
 193{
 194	int avail = spu_queue_num_free(q);
 195
 196	if (avail >= num_entries)
 197		return q->q + q->tail;
 198
 199	return NULL;
 200}
 201
 202static unsigned long spu_queue_submit(struct spu_queue *q, void *last)
 203{
 204	unsigned long hv_ret, new_tail;
 205
 206	new_tail = spu_next_offset(q, last - q->q);
 207
 208	hv_ret = sun4v_ncs_settail(q->qhandle, new_tail);
 209	if (hv_ret == HV_EOK)
 210		q->tail = new_tail;
 211	return hv_ret;
 212}
 213
 214static u64 control_word_base(unsigned int len, unsigned int hmac_key_len,
 215			     int enc_type, int auth_type,
 216			     unsigned int hash_len,
 217			     bool sfas, bool sob, bool eob, bool encrypt,
 218			     int opcode)
 219{
 220	u64 word = (len - 1) & CONTROL_LEN;
 221
 222	word |= ((u64) opcode << CONTROL_OPCODE_SHIFT);
 223	word |= ((u64) enc_type << CONTROL_ENC_TYPE_SHIFT);
 224	word |= ((u64) auth_type << CONTROL_AUTH_TYPE_SHIFT);
 225	if (sfas)
 226		word |= CONTROL_STORE_FINAL_AUTH_STATE;
 227	if (sob)
 228		word |= CONTROL_START_OF_BLOCK;
 229	if (eob)
 230		word |= CONTROL_END_OF_BLOCK;
 231	if (encrypt)
 232		word |= CONTROL_ENCRYPT;
 233	if (hmac_key_len)
 234		word |= ((u64) (hmac_key_len - 1)) << CONTROL_HMAC_KEY_LEN_SHIFT;
 235	if (hash_len)
 236		word |= ((u64) (hash_len - 1)) << CONTROL_HASH_LEN_SHIFT;
 237
 238	return word;
 239}
 240
 241#if 0
 242static inline bool n2_should_run_async(struct spu_queue *qp, int this_len)
 243{
 244	if (this_len >= 64 ||
 245	    qp->head != qp->tail)
 246		return true;
 247	return false;
 248}
 249#endif
 250
 251struct n2_ahash_alg {
 252	struct list_head	entry;
 253	const u8		*hash_zero;
 254	const u8		*hash_init;
 255	u8			hw_op_hashsz;
 256	u8			digest_size;
 257	u8			auth_type;
 258	u8			hmac_type;
 259	struct ahash_alg	alg;
 260};
 261
 262static inline struct n2_ahash_alg *n2_ahash_alg(struct crypto_tfm *tfm)
 263{
 264	struct crypto_alg *alg = tfm->__crt_alg;
 265	struct ahash_alg *ahash_alg;
 266
 267	ahash_alg = container_of(alg, struct ahash_alg, halg.base);
 268
 269	return container_of(ahash_alg, struct n2_ahash_alg, alg);
 270}
 271
 272struct n2_hmac_alg {
 273	const char		*child_alg;
 274	struct n2_ahash_alg	derived;
 275};
 276
 277static inline struct n2_hmac_alg *n2_hmac_alg(struct crypto_tfm *tfm)
 278{
 279	struct crypto_alg *alg = tfm->__crt_alg;
 280	struct ahash_alg *ahash_alg;
 281
 282	ahash_alg = container_of(alg, struct ahash_alg, halg.base);
 283
 284	return container_of(ahash_alg, struct n2_hmac_alg, derived.alg);
 285}
 286
 287struct n2_hash_ctx {
 288	struct crypto_ahash		*fallback_tfm;
 289};
 290
 291#define N2_HASH_KEY_MAX			32 /* HW limit for all HMAC requests */
 292
 293struct n2_hmac_ctx {
 294	struct n2_hash_ctx		base;
 295
 296	struct crypto_shash		*child_shash;
 297
 298	int				hash_key_len;
 299	unsigned char			hash_key[N2_HASH_KEY_MAX];
 300};
 301
 302struct n2_hash_req_ctx {
 303	union {
 304		struct md5_state	md5;
 305		struct sha1_state	sha1;
 306		struct sha256_state	sha256;
 307	} u;
 308
 309	struct ahash_request		fallback_req;
 310};
 311
 312static int n2_hash_async_init(struct ahash_request *req)
 313{
 314	struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 315	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 316	struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
 317
 318	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
 319	rctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
 320
 321	return crypto_ahash_init(&rctx->fallback_req);
 322}
 323
 324static int n2_hash_async_update(struct ahash_request *req)
 325{
 326	struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 327	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 328	struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
 329
 330	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
 331	rctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
 332	rctx->fallback_req.nbytes = req->nbytes;
 333	rctx->fallback_req.src = req->src;
 334
 335	return crypto_ahash_update(&rctx->fallback_req);
 336}
 337
 338static int n2_hash_async_final(struct ahash_request *req)
 339{
 340	struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 341	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 342	struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
 343
 344	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
 345	rctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
 346	rctx->fallback_req.result = req->result;
 347
 348	return crypto_ahash_final(&rctx->fallback_req);
 349}
 350
 351static int n2_hash_async_finup(struct ahash_request *req)
 352{
 353	struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 354	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 355	struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
 356
 357	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
 358	rctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
 359	rctx->fallback_req.nbytes = req->nbytes;
 360	rctx->fallback_req.src = req->src;
 361	rctx->fallback_req.result = req->result;
 362
 363	return crypto_ahash_finup(&rctx->fallback_req);
 364}
 365
 366static int n2_hash_async_noimport(struct ahash_request *req, const void *in)
 367{
 368	return -ENOSYS;
 369}
 370
 371static int n2_hash_async_noexport(struct ahash_request *req, void *out)
 372{
 373	return -ENOSYS;
 374}
 375
 376static int n2_hash_cra_init(struct crypto_tfm *tfm)
 377{
 378	const char *fallback_driver_name = crypto_tfm_alg_name(tfm);
 379	struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);
 380	struct n2_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 381	struct crypto_ahash *fallback_tfm;
 382	int err;
 383
 384	fallback_tfm = crypto_alloc_ahash(fallback_driver_name, 0,
 385					  CRYPTO_ALG_NEED_FALLBACK);
 386	if (IS_ERR(fallback_tfm)) {
 387		pr_warn("Fallback driver '%s' could not be loaded!\n",
 388			fallback_driver_name);
 389		err = PTR_ERR(fallback_tfm);
 390		goto out;
 391	}
 392
 393	crypto_ahash_set_reqsize(ahash, (sizeof(struct n2_hash_req_ctx) +
 394					 crypto_ahash_reqsize(fallback_tfm)));
 395
 396	ctx->fallback_tfm = fallback_tfm;
 397	return 0;
 398
 399out:
 400	return err;
 401}
 402
 403static void n2_hash_cra_exit(struct crypto_tfm *tfm)
 404{
 405	struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);
 406	struct n2_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 407
 408	crypto_free_ahash(ctx->fallback_tfm);
 409}
 410
 411static int n2_hmac_cra_init(struct crypto_tfm *tfm)
 412{
 413	const char *fallback_driver_name = crypto_tfm_alg_name(tfm);
 414	struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);
 415	struct n2_hmac_ctx *ctx = crypto_ahash_ctx(ahash);
 416	struct n2_hmac_alg *n2alg = n2_hmac_alg(tfm);
 417	struct crypto_ahash *fallback_tfm;
 418	struct crypto_shash *child_shash;
 419	int err;
 420
 421	fallback_tfm = crypto_alloc_ahash(fallback_driver_name, 0,
 422					  CRYPTO_ALG_NEED_FALLBACK);
 423	if (IS_ERR(fallback_tfm)) {
 424		pr_warn("Fallback driver '%s' could not be loaded!\n",
 425			fallback_driver_name);
 426		err = PTR_ERR(fallback_tfm);
 427		goto out;
 428	}
 429
 430	child_shash = crypto_alloc_shash(n2alg->child_alg, 0, 0);
 431	if (IS_ERR(child_shash)) {
 432		pr_warn("Child shash '%s' could not be loaded!\n",
 433			n2alg->child_alg);
 434		err = PTR_ERR(child_shash);
 435		goto out_free_fallback;
 436	}
 437
 438	crypto_ahash_set_reqsize(ahash, (sizeof(struct n2_hash_req_ctx) +
 439					 crypto_ahash_reqsize(fallback_tfm)));
 440
 441	ctx->child_shash = child_shash;
 442	ctx->base.fallback_tfm = fallback_tfm;
 443	return 0;
 444
 445out_free_fallback:
 446	crypto_free_ahash(fallback_tfm);
 447
 448out:
 449	return err;
 450}
 451
 452static void n2_hmac_cra_exit(struct crypto_tfm *tfm)
 453{
 454	struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);
 455	struct n2_hmac_ctx *ctx = crypto_ahash_ctx(ahash);
 456
 457	crypto_free_ahash(ctx->base.fallback_tfm);
 458	crypto_free_shash(ctx->child_shash);
 459}
 460
 461static int n2_hmac_async_setkey(struct crypto_ahash *tfm, const u8 *key,
 462				unsigned int keylen)
 463{
 464	struct n2_hmac_ctx *ctx = crypto_ahash_ctx(tfm);
 465	struct crypto_shash *child_shash = ctx->child_shash;
 466	struct crypto_ahash *fallback_tfm;
 
 
 
 
 467	int err, bs, ds;
 468
 469	fallback_tfm = ctx->base.fallback_tfm;
 470	err = crypto_ahash_setkey(fallback_tfm, key, keylen);
 471	if (err)
 472		return err;
 473
 
 
 
 
 474	bs = crypto_shash_blocksize(child_shash);
 475	ds = crypto_shash_digestsize(child_shash);
 476	BUG_ON(ds > N2_HASH_KEY_MAX);
 477	if (keylen > bs) {
 478		err = crypto_shash_tfm_digest(child_shash, key, keylen,
 479					      ctx->hash_key);
 480		if (err)
 481			return err;
 482		keylen = ds;
 483	} else if (keylen <= N2_HASH_KEY_MAX)
 484		memcpy(ctx->hash_key, key, keylen);
 485
 486	ctx->hash_key_len = keylen;
 487
 488	return err;
 489}
 490
 491static unsigned long wait_for_tail(struct spu_queue *qp)
 492{
 493	unsigned long head, hv_ret;
 494
 495	do {
 496		hv_ret = sun4v_ncs_gethead(qp->qhandle, &head);
 497		if (hv_ret != HV_EOK) {
 498			pr_err("Hypervisor error on gethead\n");
 499			break;
 500		}
 501		if (head == qp->tail) {
 502			qp->head = head;
 503			break;
 504		}
 505	} while (1);
 506	return hv_ret;
 507}
 508
 509static unsigned long submit_and_wait_for_tail(struct spu_queue *qp,
 510					      struct cwq_initial_entry *ent)
 511{
 512	unsigned long hv_ret = spu_queue_submit(qp, ent);
 513
 514	if (hv_ret == HV_EOK)
 515		hv_ret = wait_for_tail(qp);
 516
 517	return hv_ret;
 518}
 519
 520static int n2_do_async_digest(struct ahash_request *req,
 521			      unsigned int auth_type, unsigned int digest_size,
 522			      unsigned int result_size, void *hash_loc,
 523			      unsigned long auth_key, unsigned int auth_key_len)
 524{
 525	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 526	struct cwq_initial_entry *ent;
 527	struct crypto_hash_walk walk;
 528	struct spu_queue *qp;
 529	unsigned long flags;
 530	int err = -ENODEV;
 531	int nbytes, cpu;
 532
 533	/* The total effective length of the operation may not
 534	 * exceed 2^16.
 535	 */
 536	if (unlikely(req->nbytes > (1 << 16))) {
 537		struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 538		struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
 539
 540		ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
 541		rctx->fallback_req.base.flags =
 542			req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
 543		rctx->fallback_req.nbytes = req->nbytes;
 544		rctx->fallback_req.src = req->src;
 545		rctx->fallback_req.result = req->result;
 546
 547		return crypto_ahash_digest(&rctx->fallback_req);
 548	}
 549
 550	nbytes = crypto_hash_walk_first(req, &walk);
 551
 552	cpu = get_cpu();
 553	qp = cpu_to_cwq[cpu];
 554	if (!qp)
 555		goto out;
 556
 557	spin_lock_irqsave(&qp->lock, flags);
 558
 559	/* XXX can do better, improve this later by doing a by-hand scatterlist
 560	 * XXX walk, etc.
 561	 */
 562	ent = qp->q + qp->tail;
 563
 564	ent->control = control_word_base(nbytes, auth_key_len, 0,
 565					 auth_type, digest_size,
 566					 false, true, false, false,
 567					 OPCODE_INPLACE_BIT |
 568					 OPCODE_AUTH_MAC);
 569	ent->src_addr = __pa(walk.data);
 570	ent->auth_key_addr = auth_key;
 571	ent->auth_iv_addr = __pa(hash_loc);
 572	ent->final_auth_state_addr = 0UL;
 573	ent->enc_key_addr = 0UL;
 574	ent->enc_iv_addr = 0UL;
 575	ent->dest_addr = __pa(hash_loc);
 576
 577	nbytes = crypto_hash_walk_done(&walk, 0);
 578	while (nbytes > 0) {
 579		ent = spu_queue_next(qp, ent);
 580
 581		ent->control = (nbytes - 1);
 582		ent->src_addr = __pa(walk.data);
 583		ent->auth_key_addr = 0UL;
 584		ent->auth_iv_addr = 0UL;
 585		ent->final_auth_state_addr = 0UL;
 586		ent->enc_key_addr = 0UL;
 587		ent->enc_iv_addr = 0UL;
 588		ent->dest_addr = 0UL;
 589
 590		nbytes = crypto_hash_walk_done(&walk, 0);
 591	}
 592	ent->control |= CONTROL_END_OF_BLOCK;
 593
 594	if (submit_and_wait_for_tail(qp, ent) != HV_EOK)
 595		err = -EINVAL;
 596	else
 597		err = 0;
 598
 599	spin_unlock_irqrestore(&qp->lock, flags);
 600
 601	if (!err)
 602		memcpy(req->result, hash_loc, result_size);
 603out:
 604	put_cpu();
 605
 606	return err;
 607}
 608
 609static int n2_hash_async_digest(struct ahash_request *req)
 610{
 611	struct n2_ahash_alg *n2alg = n2_ahash_alg(req->base.tfm);
 612	struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 613	int ds;
 614
 615	ds = n2alg->digest_size;
 616	if (unlikely(req->nbytes == 0)) {
 617		memcpy(req->result, n2alg->hash_zero, ds);
 618		return 0;
 619	}
 620	memcpy(&rctx->u, n2alg->hash_init, n2alg->hw_op_hashsz);
 621
 622	return n2_do_async_digest(req, n2alg->auth_type,
 623				  n2alg->hw_op_hashsz, ds,
 624				  &rctx->u, 0UL, 0);
 625}
 626
 627static int n2_hmac_async_digest(struct ahash_request *req)
 628{
 629	struct n2_hmac_alg *n2alg = n2_hmac_alg(req->base.tfm);
 630	struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 631	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 632	struct n2_hmac_ctx *ctx = crypto_ahash_ctx(tfm);
 633	int ds;
 634
 635	ds = n2alg->derived.digest_size;
 636	if (unlikely(req->nbytes == 0) ||
 637	    unlikely(ctx->hash_key_len > N2_HASH_KEY_MAX)) {
 638		struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 639		struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
 640
 641		ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
 642		rctx->fallback_req.base.flags =
 643			req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
 644		rctx->fallback_req.nbytes = req->nbytes;
 645		rctx->fallback_req.src = req->src;
 646		rctx->fallback_req.result = req->result;
 647
 648		return crypto_ahash_digest(&rctx->fallback_req);
 649	}
 650	memcpy(&rctx->u, n2alg->derived.hash_init,
 651	       n2alg->derived.hw_op_hashsz);
 652
 653	return n2_do_async_digest(req, n2alg->derived.hmac_type,
 654				  n2alg->derived.hw_op_hashsz, ds,
 655				  &rctx->u,
 656				  __pa(&ctx->hash_key),
 657				  ctx->hash_key_len);
 658}
 659
 660struct n2_skcipher_context {
 661	int			key_len;
 662	int			enc_type;
 663	union {
 664		u8		aes[AES_MAX_KEY_SIZE];
 665		u8		des[DES_KEY_SIZE];
 666		u8		des3[3 * DES_KEY_SIZE];
 
 667	} key;
 668};
 669
 670#define N2_CHUNK_ARR_LEN	16
 671
 672struct n2_crypto_chunk {
 673	struct list_head	entry;
 674	unsigned long		iv_paddr : 44;
 675	unsigned long		arr_len : 20;
 676	unsigned long		dest_paddr;
 677	unsigned long		dest_final;
 678	struct {
 679		unsigned long	src_paddr : 44;
 680		unsigned long	src_len : 20;
 681	} arr[N2_CHUNK_ARR_LEN];
 682};
 683
 684struct n2_request_context {
 685	struct skcipher_walk	walk;
 686	struct list_head	chunk_list;
 687	struct n2_crypto_chunk	chunk;
 688	u8			temp_iv[16];
 689};
 690
 691/* The SPU allows some level of flexibility for partial cipher blocks
 692 * being specified in a descriptor.
 693 *
 694 * It merely requires that every descriptor's length field is at least
 695 * as large as the cipher block size.  This means that a cipher block
 696 * can span at most 2 descriptors.  However, this does not allow a
 697 * partial block to span into the final descriptor as that would
 698 * violate the rule (since every descriptor's length must be at lest
 699 * the block size).  So, for example, assuming an 8 byte block size:
 700 *
 701 *	0xe --> 0xa --> 0x8
 702 *
 703 * is a valid length sequence, whereas:
 704 *
 705 *	0xe --> 0xb --> 0x7
 706 *
 707 * is not a valid sequence.
 708 */
 709
 710struct n2_skcipher_alg {
 711	struct list_head	entry;
 712	u8			enc_type;
 713	struct skcipher_alg	skcipher;
 714};
 715
 716static inline struct n2_skcipher_alg *n2_skcipher_alg(struct crypto_skcipher *tfm)
 717{
 718	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
 719
 720	return container_of(alg, struct n2_skcipher_alg, skcipher);
 721}
 722
 723static int n2_aes_setkey(struct crypto_skcipher *skcipher, const u8 *key,
 
 
 
 
 724			 unsigned int keylen)
 725{
 726	struct crypto_tfm *tfm = crypto_skcipher_tfm(skcipher);
 727	struct n2_skcipher_context *ctx = crypto_tfm_ctx(tfm);
 728	struct n2_skcipher_alg *n2alg = n2_skcipher_alg(skcipher);
 729
 730	ctx->enc_type = (n2alg->enc_type & ENC_TYPE_CHAINING_MASK);
 731
 732	switch (keylen) {
 733	case AES_KEYSIZE_128:
 734		ctx->enc_type |= ENC_TYPE_ALG_AES128;
 735		break;
 736	case AES_KEYSIZE_192:
 737		ctx->enc_type |= ENC_TYPE_ALG_AES192;
 738		break;
 739	case AES_KEYSIZE_256:
 740		ctx->enc_type |= ENC_TYPE_ALG_AES256;
 741		break;
 742	default:
 
 743		return -EINVAL;
 744	}
 745
 746	ctx->key_len = keylen;
 747	memcpy(ctx->key.aes, key, keylen);
 748	return 0;
 749}
 750
 751static int n2_des_setkey(struct crypto_skcipher *skcipher, const u8 *key,
 752			 unsigned int keylen)
 753{
 754	struct crypto_tfm *tfm = crypto_skcipher_tfm(skcipher);
 755	struct n2_skcipher_context *ctx = crypto_tfm_ctx(tfm);
 756	struct n2_skcipher_alg *n2alg = n2_skcipher_alg(skcipher);
 
 757	int err;
 758
 759	err = verify_skcipher_des_key(skcipher, key);
 760	if (err)
 761		return err;
 762
 763	ctx->enc_type = n2alg->enc_type;
 764
 
 
 
 
 
 
 
 
 
 
 
 765	ctx->key_len = keylen;
 766	memcpy(ctx->key.des, key, keylen);
 767	return 0;
 768}
 769
 770static int n2_3des_setkey(struct crypto_skcipher *skcipher, const u8 *key,
 771			  unsigned int keylen)
 772{
 773	struct crypto_tfm *tfm = crypto_skcipher_tfm(skcipher);
 774	struct n2_skcipher_context *ctx = crypto_tfm_ctx(tfm);
 775	struct n2_skcipher_alg *n2alg = n2_skcipher_alg(skcipher);
 776	int err;
 777
 778	err = verify_skcipher_des3_key(skcipher, key);
 779	if (err)
 780		return err;
 781
 782	ctx->enc_type = n2alg->enc_type;
 783
 
 
 
 
 784	ctx->key_len = keylen;
 785	memcpy(ctx->key.des3, key, keylen);
 786	return 0;
 787}
 788
 789static inline int skcipher_descriptor_len(int nbytes, unsigned int block_size)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 790{
 791	int this_len = nbytes;
 792
 793	this_len -= (nbytes & (block_size - 1));
 794	return this_len > (1 << 16) ? (1 << 16) : this_len;
 795}
 796
 797static int __n2_crypt_chunk(struct crypto_skcipher *skcipher,
 798			    struct n2_crypto_chunk *cp,
 799			    struct spu_queue *qp, bool encrypt)
 800{
 801	struct n2_skcipher_context *ctx = crypto_skcipher_ctx(skcipher);
 802	struct cwq_initial_entry *ent;
 803	bool in_place;
 804	int i;
 805
 806	ent = spu_queue_alloc(qp, cp->arr_len);
 807	if (!ent) {
 808		pr_info("queue_alloc() of %d fails\n",
 809			cp->arr_len);
 810		return -EBUSY;
 811	}
 812
 813	in_place = (cp->dest_paddr == cp->arr[0].src_paddr);
 814
 815	ent->control = control_word_base(cp->arr[0].src_len,
 816					 0, ctx->enc_type, 0, 0,
 817					 false, true, false, encrypt,
 818					 OPCODE_ENCRYPT |
 819					 (in_place ? OPCODE_INPLACE_BIT : 0));
 820	ent->src_addr = cp->arr[0].src_paddr;
 821	ent->auth_key_addr = 0UL;
 822	ent->auth_iv_addr = 0UL;
 823	ent->final_auth_state_addr = 0UL;
 824	ent->enc_key_addr = __pa(&ctx->key);
 825	ent->enc_iv_addr = cp->iv_paddr;
 826	ent->dest_addr = (in_place ? 0UL : cp->dest_paddr);
 827
 828	for (i = 1; i < cp->arr_len; i++) {
 829		ent = spu_queue_next(qp, ent);
 830
 831		ent->control = cp->arr[i].src_len - 1;
 832		ent->src_addr = cp->arr[i].src_paddr;
 833		ent->auth_key_addr = 0UL;
 834		ent->auth_iv_addr = 0UL;
 835		ent->final_auth_state_addr = 0UL;
 836		ent->enc_key_addr = 0UL;
 837		ent->enc_iv_addr = 0UL;
 838		ent->dest_addr = 0UL;
 839	}
 840	ent->control |= CONTROL_END_OF_BLOCK;
 841
 842	return (spu_queue_submit(qp, ent) != HV_EOK) ? -EINVAL : 0;
 843}
 844
 845static int n2_compute_chunks(struct skcipher_request *req)
 846{
 847	struct n2_request_context *rctx = skcipher_request_ctx(req);
 848	struct skcipher_walk *walk = &rctx->walk;
 849	struct n2_crypto_chunk *chunk;
 850	unsigned long dest_prev;
 851	unsigned int tot_len;
 852	bool prev_in_place;
 853	int err, nbytes;
 854
 855	err = skcipher_walk_async(walk, req);
 
 856	if (err)
 857		return err;
 858
 859	INIT_LIST_HEAD(&rctx->chunk_list);
 860
 861	chunk = &rctx->chunk;
 862	INIT_LIST_HEAD(&chunk->entry);
 863
 864	chunk->iv_paddr = 0UL;
 865	chunk->arr_len = 0;
 866	chunk->dest_paddr = 0UL;
 867
 868	prev_in_place = false;
 869	dest_prev = ~0UL;
 870	tot_len = 0;
 871
 872	while ((nbytes = walk->nbytes) != 0) {
 873		unsigned long dest_paddr, src_paddr;
 874		bool in_place;
 875		int this_len;
 876
 877		src_paddr = (page_to_phys(walk->src.phys.page) +
 878			     walk->src.phys.offset);
 879		dest_paddr = (page_to_phys(walk->dst.phys.page) +
 880			      walk->dst.phys.offset);
 881		in_place = (src_paddr == dest_paddr);
 882		this_len = skcipher_descriptor_len(nbytes, walk->blocksize);
 883
 884		if (chunk->arr_len != 0) {
 885			if (in_place != prev_in_place ||
 886			    (!prev_in_place &&
 887			     dest_paddr != dest_prev) ||
 888			    chunk->arr_len == N2_CHUNK_ARR_LEN ||
 889			    tot_len + this_len > (1 << 16)) {
 890				chunk->dest_final = dest_prev;
 891				list_add_tail(&chunk->entry,
 892					      &rctx->chunk_list);
 893				chunk = kzalloc(sizeof(*chunk), GFP_ATOMIC);
 894				if (!chunk) {
 895					err = -ENOMEM;
 896					break;
 897				}
 898				INIT_LIST_HEAD(&chunk->entry);
 899			}
 900		}
 901		if (chunk->arr_len == 0) {
 902			chunk->dest_paddr = dest_paddr;
 903			tot_len = 0;
 904		}
 905		chunk->arr[chunk->arr_len].src_paddr = src_paddr;
 906		chunk->arr[chunk->arr_len].src_len = this_len;
 907		chunk->arr_len++;
 908
 909		dest_prev = dest_paddr + this_len;
 910		prev_in_place = in_place;
 911		tot_len += this_len;
 912
 913		err = skcipher_walk_done(walk, nbytes - this_len);
 914		if (err)
 915			break;
 916	}
 917	if (!err && chunk->arr_len != 0) {
 918		chunk->dest_final = dest_prev;
 919		list_add_tail(&chunk->entry, &rctx->chunk_list);
 920	}
 921
 922	return err;
 923}
 924
 925static void n2_chunk_complete(struct skcipher_request *req, void *final_iv)
 926{
 927	struct n2_request_context *rctx = skcipher_request_ctx(req);
 928	struct n2_crypto_chunk *c, *tmp;
 929
 930	if (final_iv)
 931		memcpy(rctx->walk.iv, final_iv, rctx->walk.blocksize);
 932
 
 933	list_for_each_entry_safe(c, tmp, &rctx->chunk_list, entry) {
 934		list_del(&c->entry);
 935		if (unlikely(c != &rctx->chunk))
 936			kfree(c);
 937	}
 938
 939}
 940
 941static int n2_do_ecb(struct skcipher_request *req, bool encrypt)
 942{
 943	struct n2_request_context *rctx = skcipher_request_ctx(req);
 944	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
 945	int err = n2_compute_chunks(req);
 946	struct n2_crypto_chunk *c, *tmp;
 947	unsigned long flags, hv_ret;
 948	struct spu_queue *qp;
 949
 950	if (err)
 951		return err;
 952
 953	qp = cpu_to_cwq[get_cpu()];
 954	err = -ENODEV;
 955	if (!qp)
 956		goto out;
 957
 958	spin_lock_irqsave(&qp->lock, flags);
 959
 960	list_for_each_entry_safe(c, tmp, &rctx->chunk_list, entry) {
 961		err = __n2_crypt_chunk(tfm, c, qp, encrypt);
 962		if (err)
 963			break;
 964		list_del(&c->entry);
 965		if (unlikely(c != &rctx->chunk))
 966			kfree(c);
 967	}
 968	if (!err) {
 969		hv_ret = wait_for_tail(qp);
 970		if (hv_ret != HV_EOK)
 971			err = -EINVAL;
 972	}
 973
 974	spin_unlock_irqrestore(&qp->lock, flags);
 975
 976out:
 977	put_cpu();
 978
 
 979	n2_chunk_complete(req, NULL);
 980	return err;
 981}
 982
 983static int n2_encrypt_ecb(struct skcipher_request *req)
 984{
 985	return n2_do_ecb(req, true);
 986}
 987
 988static int n2_decrypt_ecb(struct skcipher_request *req)
 989{
 990	return n2_do_ecb(req, false);
 991}
 992
 993static int n2_do_chaining(struct skcipher_request *req, bool encrypt)
 994{
 995	struct n2_request_context *rctx = skcipher_request_ctx(req);
 996	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
 997	unsigned long flags, hv_ret, iv_paddr;
 998	int err = n2_compute_chunks(req);
 999	struct n2_crypto_chunk *c, *tmp;
1000	struct spu_queue *qp;
1001	void *final_iv_addr;
1002
1003	final_iv_addr = NULL;
1004
1005	if (err)
1006		return err;
1007
1008	qp = cpu_to_cwq[get_cpu()];
1009	err = -ENODEV;
1010	if (!qp)
1011		goto out;
1012
1013	spin_lock_irqsave(&qp->lock, flags);
1014
1015	if (encrypt) {
1016		iv_paddr = __pa(rctx->walk.iv);
1017		list_for_each_entry_safe(c, tmp, &rctx->chunk_list,
1018					 entry) {
1019			c->iv_paddr = iv_paddr;
1020			err = __n2_crypt_chunk(tfm, c, qp, true);
1021			if (err)
1022				break;
1023			iv_paddr = c->dest_final - rctx->walk.blocksize;
1024			list_del(&c->entry);
1025			if (unlikely(c != &rctx->chunk))
1026				kfree(c);
1027		}
1028		final_iv_addr = __va(iv_paddr);
1029	} else {
1030		list_for_each_entry_safe_reverse(c, tmp, &rctx->chunk_list,
1031						 entry) {
1032			if (c == &rctx->chunk) {
1033				iv_paddr = __pa(rctx->walk.iv);
1034			} else {
1035				iv_paddr = (tmp->arr[tmp->arr_len-1].src_paddr +
1036					    tmp->arr[tmp->arr_len-1].src_len -
1037					    rctx->walk.blocksize);
1038			}
1039			if (!final_iv_addr) {
1040				unsigned long pa;
1041
1042				pa = (c->arr[c->arr_len-1].src_paddr +
1043				      c->arr[c->arr_len-1].src_len -
1044				      rctx->walk.blocksize);
1045				final_iv_addr = rctx->temp_iv;
1046				memcpy(rctx->temp_iv, __va(pa),
1047				       rctx->walk.blocksize);
1048			}
1049			c->iv_paddr = iv_paddr;
1050			err = __n2_crypt_chunk(tfm, c, qp, false);
1051			if (err)
1052				break;
1053			list_del(&c->entry);
1054			if (unlikely(c != &rctx->chunk))
1055				kfree(c);
1056		}
1057	}
1058	if (!err) {
1059		hv_ret = wait_for_tail(qp);
1060		if (hv_ret != HV_EOK)
1061			err = -EINVAL;
1062	}
1063
1064	spin_unlock_irqrestore(&qp->lock, flags);
1065
1066out:
1067	put_cpu();
1068
 
1069	n2_chunk_complete(req, err ? NULL : final_iv_addr);
1070	return err;
1071}
1072
1073static int n2_encrypt_chaining(struct skcipher_request *req)
1074{
1075	return n2_do_chaining(req, true);
1076}
1077
1078static int n2_decrypt_chaining(struct skcipher_request *req)
1079{
1080	return n2_do_chaining(req, false);
1081}
1082
1083struct n2_skcipher_tmpl {
1084	const char		*name;
1085	const char		*drv_name;
1086	u8			block_size;
1087	u8			enc_type;
1088	struct skcipher_alg	skcipher;
1089};
1090
1091static const struct n2_skcipher_tmpl skcipher_tmpls[] = {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1092	/* DES: ECB CBC and CFB are supported */
1093	{	.name		= "ecb(des)",
1094		.drv_name	= "ecb-des",
1095		.block_size	= DES_BLOCK_SIZE,
1096		.enc_type	= (ENC_TYPE_ALG_DES |
1097				   ENC_TYPE_CHAINING_ECB),
1098		.skcipher	= {
1099			.min_keysize	= DES_KEY_SIZE,
1100			.max_keysize	= DES_KEY_SIZE,
1101			.setkey		= n2_des_setkey,
1102			.encrypt	= n2_encrypt_ecb,
1103			.decrypt	= n2_decrypt_ecb,
1104		},
1105	},
1106	{	.name		= "cbc(des)",
1107		.drv_name	= "cbc-des",
1108		.block_size	= DES_BLOCK_SIZE,
1109		.enc_type	= (ENC_TYPE_ALG_DES |
1110				   ENC_TYPE_CHAINING_CBC),
1111		.skcipher	= {
1112			.ivsize		= DES_BLOCK_SIZE,
1113			.min_keysize	= DES_KEY_SIZE,
1114			.max_keysize	= DES_KEY_SIZE,
1115			.setkey		= n2_des_setkey,
1116			.encrypt	= n2_encrypt_chaining,
1117			.decrypt	= n2_decrypt_chaining,
1118		},
1119	},
 
 
 
 
 
 
 
 
 
 
 
 
 
1120
1121	/* 3DES: ECB CBC and CFB are supported */
1122	{	.name		= "ecb(des3_ede)",
1123		.drv_name	= "ecb-3des",
1124		.block_size	= DES_BLOCK_SIZE,
1125		.enc_type	= (ENC_TYPE_ALG_3DES |
1126				   ENC_TYPE_CHAINING_ECB),
1127		.skcipher	= {
1128			.min_keysize	= 3 * DES_KEY_SIZE,
1129			.max_keysize	= 3 * DES_KEY_SIZE,
1130			.setkey		= n2_3des_setkey,
1131			.encrypt	= n2_encrypt_ecb,
1132			.decrypt	= n2_decrypt_ecb,
1133		},
1134	},
1135	{	.name		= "cbc(des3_ede)",
1136		.drv_name	= "cbc-3des",
1137		.block_size	= DES_BLOCK_SIZE,
1138		.enc_type	= (ENC_TYPE_ALG_3DES |
1139				   ENC_TYPE_CHAINING_CBC),
1140		.skcipher	= {
1141			.ivsize		= DES_BLOCK_SIZE,
1142			.min_keysize	= 3 * DES_KEY_SIZE,
1143			.max_keysize	= 3 * DES_KEY_SIZE,
1144			.setkey		= n2_3des_setkey,
1145			.encrypt	= n2_encrypt_chaining,
1146			.decrypt	= n2_decrypt_chaining,
1147		},
1148	},
1149
 
 
 
 
 
 
 
 
 
 
 
 
1150	/* AES: ECB CBC and CTR are supported */
1151	{	.name		= "ecb(aes)",
1152		.drv_name	= "ecb-aes",
1153		.block_size	= AES_BLOCK_SIZE,
1154		.enc_type	= (ENC_TYPE_ALG_AES128 |
1155				   ENC_TYPE_CHAINING_ECB),
1156		.skcipher	= {
1157			.min_keysize	= AES_MIN_KEY_SIZE,
1158			.max_keysize	= AES_MAX_KEY_SIZE,
1159			.setkey		= n2_aes_setkey,
1160			.encrypt	= n2_encrypt_ecb,
1161			.decrypt	= n2_decrypt_ecb,
1162		},
1163	},
1164	{	.name		= "cbc(aes)",
1165		.drv_name	= "cbc-aes",
1166		.block_size	= AES_BLOCK_SIZE,
1167		.enc_type	= (ENC_TYPE_ALG_AES128 |
1168				   ENC_TYPE_CHAINING_CBC),
1169		.skcipher	= {
1170			.ivsize		= AES_BLOCK_SIZE,
1171			.min_keysize	= AES_MIN_KEY_SIZE,
1172			.max_keysize	= AES_MAX_KEY_SIZE,
1173			.setkey		= n2_aes_setkey,
1174			.encrypt	= n2_encrypt_chaining,
1175			.decrypt	= n2_decrypt_chaining,
1176		},
1177	},
1178	{	.name		= "ctr(aes)",
1179		.drv_name	= "ctr-aes",
1180		.block_size	= AES_BLOCK_SIZE,
1181		.enc_type	= (ENC_TYPE_ALG_AES128 |
1182				   ENC_TYPE_CHAINING_COUNTER),
1183		.skcipher	= {
1184			.ivsize		= AES_BLOCK_SIZE,
1185			.min_keysize	= AES_MIN_KEY_SIZE,
1186			.max_keysize	= AES_MAX_KEY_SIZE,
1187			.setkey		= n2_aes_setkey,
1188			.encrypt	= n2_encrypt_chaining,
1189			.decrypt	= n2_encrypt_chaining,
1190		},
1191	},
1192
1193};
1194#define NUM_CIPHER_TMPLS ARRAY_SIZE(skcipher_tmpls)
1195
1196static LIST_HEAD(skcipher_algs);
1197
1198struct n2_hash_tmpl {
1199	const char	*name;
1200	const u8	*hash_zero;
1201	const u8	*hash_init;
1202	u8		hw_op_hashsz;
1203	u8		digest_size;
1204	u8		statesize;
1205	u8		block_size;
1206	u8		auth_type;
1207	u8		hmac_type;
1208};
1209
1210static const __le32 n2_md5_init[MD5_HASH_WORDS] = {
1211	cpu_to_le32(MD5_H0),
1212	cpu_to_le32(MD5_H1),
1213	cpu_to_le32(MD5_H2),
1214	cpu_to_le32(MD5_H3),
 
 
 
 
 
 
 
 
 
1215};
1216static const u32 n2_sha1_init[SHA1_DIGEST_SIZE / 4] = {
1217	SHA1_H0, SHA1_H1, SHA1_H2, SHA1_H3, SHA1_H4,
1218};
1219static const u32 n2_sha256_init[SHA256_DIGEST_SIZE / 4] = {
 
 
 
 
 
 
1220	SHA256_H0, SHA256_H1, SHA256_H2, SHA256_H3,
1221	SHA256_H4, SHA256_H5, SHA256_H6, SHA256_H7,
1222};
1223static const u32 n2_sha224_init[SHA256_DIGEST_SIZE / 4] = {
 
 
 
 
 
 
1224	SHA224_H0, SHA224_H1, SHA224_H2, SHA224_H3,
1225	SHA224_H4, SHA224_H5, SHA224_H6, SHA224_H7,
1226};
1227
1228static const struct n2_hash_tmpl hash_tmpls[] = {
1229	{ .name		= "md5",
1230	  .hash_zero	= md5_zero_message_hash,
1231	  .hash_init	= (u8 *)n2_md5_init,
1232	  .auth_type	= AUTH_TYPE_MD5,
1233	  .hmac_type	= AUTH_TYPE_HMAC_MD5,
1234	  .hw_op_hashsz	= MD5_DIGEST_SIZE,
1235	  .digest_size	= MD5_DIGEST_SIZE,
1236	  .statesize	= sizeof(struct md5_state),
1237	  .block_size	= MD5_HMAC_BLOCK_SIZE },
1238	{ .name		= "sha1",
1239	  .hash_zero	= sha1_zero_message_hash,
1240	  .hash_init	= (u8 *)n2_sha1_init,
1241	  .auth_type	= AUTH_TYPE_SHA1,
1242	  .hmac_type	= AUTH_TYPE_HMAC_SHA1,
1243	  .hw_op_hashsz	= SHA1_DIGEST_SIZE,
1244	  .digest_size	= SHA1_DIGEST_SIZE,
1245	  .statesize	= sizeof(struct sha1_state),
1246	  .block_size	= SHA1_BLOCK_SIZE },
1247	{ .name		= "sha256",
1248	  .hash_zero	= sha256_zero_message_hash,
1249	  .hash_init	= (u8 *)n2_sha256_init,
1250	  .auth_type	= AUTH_TYPE_SHA256,
1251	  .hmac_type	= AUTH_TYPE_HMAC_SHA256,
1252	  .hw_op_hashsz	= SHA256_DIGEST_SIZE,
1253	  .digest_size	= SHA256_DIGEST_SIZE,
1254	  .statesize	= sizeof(struct sha256_state),
1255	  .block_size	= SHA256_BLOCK_SIZE },
1256	{ .name		= "sha224",
1257	  .hash_zero	= sha224_zero_message_hash,
1258	  .hash_init	= (u8 *)n2_sha224_init,
1259	  .auth_type	= AUTH_TYPE_SHA256,
1260	  .hmac_type	= AUTH_TYPE_RESERVED,
1261	  .hw_op_hashsz	= SHA256_DIGEST_SIZE,
1262	  .digest_size	= SHA224_DIGEST_SIZE,
1263	  .statesize	= sizeof(struct sha256_state),
1264	  .block_size	= SHA224_BLOCK_SIZE },
1265};
1266#define NUM_HASH_TMPLS ARRAY_SIZE(hash_tmpls)
1267
1268static LIST_HEAD(ahash_algs);
1269static LIST_HEAD(hmac_algs);
1270
1271static int algs_registered;
1272
1273static void __n2_unregister_algs(void)
1274{
1275	struct n2_skcipher_alg *skcipher, *skcipher_tmp;
1276	struct n2_ahash_alg *alg, *alg_tmp;
1277	struct n2_hmac_alg *hmac, *hmac_tmp;
1278
1279	list_for_each_entry_safe(skcipher, skcipher_tmp, &skcipher_algs, entry) {
1280		crypto_unregister_skcipher(&skcipher->skcipher);
1281		list_del(&skcipher->entry);
1282		kfree(skcipher);
1283	}
1284	list_for_each_entry_safe(hmac, hmac_tmp, &hmac_algs, derived.entry) {
1285		crypto_unregister_ahash(&hmac->derived.alg);
1286		list_del(&hmac->derived.entry);
1287		kfree(hmac);
1288	}
1289	list_for_each_entry_safe(alg, alg_tmp, &ahash_algs, entry) {
1290		crypto_unregister_ahash(&alg->alg);
1291		list_del(&alg->entry);
1292		kfree(alg);
1293	}
1294}
1295
1296static int n2_skcipher_init_tfm(struct crypto_skcipher *tfm)
1297{
1298	crypto_skcipher_set_reqsize(tfm, sizeof(struct n2_request_context));
1299	return 0;
1300}
1301
1302static int __n2_register_one_skcipher(const struct n2_skcipher_tmpl *tmpl)
1303{
1304	struct n2_skcipher_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1305	struct skcipher_alg *alg;
1306	int err;
1307
1308	if (!p)
1309		return -ENOMEM;
1310
1311	alg = &p->skcipher;
1312	*alg = tmpl->skcipher;
1313
1314	snprintf(alg->base.cra_name, CRYPTO_MAX_ALG_NAME, "%s", tmpl->name);
1315	snprintf(alg->base.cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s-n2", tmpl->drv_name);
1316	alg->base.cra_priority = N2_CRA_PRIORITY;
1317	alg->base.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY | CRYPTO_ALG_ASYNC |
1318			      CRYPTO_ALG_ALLOCATES_MEMORY;
1319	alg->base.cra_blocksize = tmpl->block_size;
1320	p->enc_type = tmpl->enc_type;
1321	alg->base.cra_ctxsize = sizeof(struct n2_skcipher_context);
1322	alg->base.cra_module = THIS_MODULE;
1323	alg->init = n2_skcipher_init_tfm;
 
 
1324
1325	list_add(&p->entry, &skcipher_algs);
1326	err = crypto_register_skcipher(alg);
1327	if (err) {
1328		pr_err("%s alg registration failed\n", alg->base.cra_name);
1329		list_del(&p->entry);
1330		kfree(p);
1331	} else {
1332		pr_info("%s alg registered\n", alg->base.cra_name);
1333	}
1334	return err;
1335}
1336
1337static int __n2_register_one_hmac(struct n2_ahash_alg *n2ahash)
1338{
1339	struct n2_hmac_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1340	struct ahash_alg *ahash;
1341	struct crypto_alg *base;
1342	int err;
1343
1344	if (!p)
1345		return -ENOMEM;
1346
1347	p->child_alg = n2ahash->alg.halg.base.cra_name;
1348	memcpy(&p->derived, n2ahash, sizeof(struct n2_ahash_alg));
1349	INIT_LIST_HEAD(&p->derived.entry);
1350
1351	ahash = &p->derived.alg;
1352	ahash->digest = n2_hmac_async_digest;
1353	ahash->setkey = n2_hmac_async_setkey;
1354
1355	base = &ahash->halg.base;
1356	err = -EINVAL;
1357	if (snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "hmac(%s)",
1358		     p->child_alg) >= CRYPTO_MAX_ALG_NAME)
1359		goto out_free_p;
1360	if (snprintf(base->cra_driver_name, CRYPTO_MAX_ALG_NAME, "hmac-%s-n2",
1361		     p->child_alg) >= CRYPTO_MAX_ALG_NAME)
1362		goto out_free_p;
1363
1364	base->cra_ctxsize = sizeof(struct n2_hmac_ctx);
1365	base->cra_init = n2_hmac_cra_init;
1366	base->cra_exit = n2_hmac_cra_exit;
1367
1368	list_add(&p->derived.entry, &hmac_algs);
1369	err = crypto_register_ahash(ahash);
1370	if (err) {
1371		pr_err("%s alg registration failed\n", base->cra_name);
1372		list_del(&p->derived.entry);
1373out_free_p:
1374		kfree(p);
1375	} else {
1376		pr_info("%s alg registered\n", base->cra_name);
1377	}
1378	return err;
1379}
1380
1381static int __n2_register_one_ahash(const struct n2_hash_tmpl *tmpl)
1382{
1383	struct n2_ahash_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1384	struct hash_alg_common *halg;
1385	struct crypto_alg *base;
1386	struct ahash_alg *ahash;
1387	int err;
1388
1389	if (!p)
1390		return -ENOMEM;
1391
1392	p->hash_zero = tmpl->hash_zero;
1393	p->hash_init = tmpl->hash_init;
1394	p->auth_type = tmpl->auth_type;
1395	p->hmac_type = tmpl->hmac_type;
1396	p->hw_op_hashsz = tmpl->hw_op_hashsz;
1397	p->digest_size = tmpl->digest_size;
1398
1399	ahash = &p->alg;
1400	ahash->init = n2_hash_async_init;
1401	ahash->update = n2_hash_async_update;
1402	ahash->final = n2_hash_async_final;
1403	ahash->finup = n2_hash_async_finup;
1404	ahash->digest = n2_hash_async_digest;
1405	ahash->export = n2_hash_async_noexport;
1406	ahash->import = n2_hash_async_noimport;
1407
1408	halg = &ahash->halg;
1409	halg->digestsize = tmpl->digest_size;
1410	halg->statesize = tmpl->statesize;
1411
1412	base = &halg->base;
1413	snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "%s", tmpl->name);
1414	snprintf(base->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s-n2", tmpl->name);
1415	base->cra_priority = N2_CRA_PRIORITY;
1416	base->cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |
1417			  CRYPTO_ALG_NEED_FALLBACK;
1418	base->cra_blocksize = tmpl->block_size;
1419	base->cra_ctxsize = sizeof(struct n2_hash_ctx);
1420	base->cra_module = THIS_MODULE;
1421	base->cra_init = n2_hash_cra_init;
1422	base->cra_exit = n2_hash_cra_exit;
1423
1424	list_add(&p->entry, &ahash_algs);
1425	err = crypto_register_ahash(ahash);
1426	if (err) {
1427		pr_err("%s alg registration failed\n", base->cra_name);
1428		list_del(&p->entry);
1429		kfree(p);
1430	} else {
1431		pr_info("%s alg registered\n", base->cra_name);
1432	}
1433	if (!err && p->hmac_type != AUTH_TYPE_RESERVED)
1434		err = __n2_register_one_hmac(p);
1435	return err;
1436}
1437
1438static int n2_register_algs(void)
1439{
1440	int i, err = 0;
1441
1442	mutex_lock(&spu_lock);
1443	if (algs_registered++)
1444		goto out;
1445
1446	for (i = 0; i < NUM_HASH_TMPLS; i++) {
1447		err = __n2_register_one_ahash(&hash_tmpls[i]);
1448		if (err) {
1449			__n2_unregister_algs();
1450			goto out;
1451		}
1452	}
1453	for (i = 0; i < NUM_CIPHER_TMPLS; i++) {
1454		err = __n2_register_one_skcipher(&skcipher_tmpls[i]);
1455		if (err) {
1456			__n2_unregister_algs();
1457			goto out;
1458		}
1459	}
1460
1461out:
1462	mutex_unlock(&spu_lock);
1463	return err;
1464}
1465
1466static void n2_unregister_algs(void)
1467{
1468	mutex_lock(&spu_lock);
1469	if (!--algs_registered)
1470		__n2_unregister_algs();
1471	mutex_unlock(&spu_lock);
1472}
1473
1474/* To map CWQ queues to interrupt sources, the hypervisor API provides
1475 * a devino.  This isn't very useful to us because all of the
1476 * interrupts listed in the device_node have been translated to
1477 * Linux virtual IRQ cookie numbers.
1478 *
1479 * So we have to back-translate, going through the 'intr' and 'ino'
1480 * property tables of the n2cp MDESC node, matching it with the OF
1481 * 'interrupts' property entries, in order to figure out which
1482 * devino goes to which already-translated IRQ.
1483 */
1484static int find_devino_index(struct platform_device *dev, struct spu_mdesc_info *ip,
1485			     unsigned long dev_ino)
1486{
1487	const unsigned int *dev_intrs;
1488	unsigned int intr;
1489	int i;
1490
1491	for (i = 0; i < ip->num_intrs; i++) {
1492		if (ip->ino_table[i].ino == dev_ino)
1493			break;
1494	}
1495	if (i == ip->num_intrs)
1496		return -ENODEV;
1497
1498	intr = ip->ino_table[i].intr;
1499
1500	dev_intrs = of_get_property(dev->dev.of_node, "interrupts", NULL);
1501	if (!dev_intrs)
1502		return -ENODEV;
1503
1504	for (i = 0; i < dev->archdata.num_irqs; i++) {
1505		if (dev_intrs[i] == intr)
1506			return i;
1507	}
1508
1509	return -ENODEV;
1510}
1511
1512static int spu_map_ino(struct platform_device *dev, struct spu_mdesc_info *ip,
1513		       const char *irq_name, struct spu_queue *p,
1514		       irq_handler_t handler)
1515{
1516	unsigned long herr;
1517	int index;
1518
1519	herr = sun4v_ncs_qhandle_to_devino(p->qhandle, &p->devino);
1520	if (herr)
1521		return -EINVAL;
1522
1523	index = find_devino_index(dev, ip, p->devino);
1524	if (index < 0)
1525		return index;
1526
1527	p->irq = dev->archdata.irqs[index];
1528
1529	sprintf(p->irq_name, "%s-%d", irq_name, index);
1530
1531	return request_irq(p->irq, handler, 0, p->irq_name, p);
 
1532}
1533
1534static struct kmem_cache *queue_cache[2];
1535
1536static void *new_queue(unsigned long q_type)
1537{
1538	return kmem_cache_zalloc(queue_cache[q_type - 1], GFP_KERNEL);
1539}
1540
1541static void free_queue(void *p, unsigned long q_type)
1542{
1543	kmem_cache_free(queue_cache[q_type - 1], p);
1544}
1545
1546static int queue_cache_init(void)
1547{
1548	if (!queue_cache[HV_NCS_QTYPE_MAU - 1])
1549		queue_cache[HV_NCS_QTYPE_MAU - 1] =
1550			kmem_cache_create("mau_queue",
1551					  (MAU_NUM_ENTRIES *
1552					   MAU_ENTRY_SIZE),
1553					  MAU_ENTRY_SIZE, 0, NULL);
1554	if (!queue_cache[HV_NCS_QTYPE_MAU - 1])
1555		return -ENOMEM;
1556
1557	if (!queue_cache[HV_NCS_QTYPE_CWQ - 1])
1558		queue_cache[HV_NCS_QTYPE_CWQ - 1] =
1559			kmem_cache_create("cwq_queue",
1560					  (CWQ_NUM_ENTRIES *
1561					   CWQ_ENTRY_SIZE),
1562					  CWQ_ENTRY_SIZE, 0, NULL);
1563	if (!queue_cache[HV_NCS_QTYPE_CWQ - 1]) {
1564		kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_MAU - 1]);
1565		queue_cache[HV_NCS_QTYPE_MAU - 1] = NULL;
1566		return -ENOMEM;
1567	}
1568	return 0;
1569}
1570
1571static void queue_cache_destroy(void)
1572{
1573	kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_MAU - 1]);
1574	kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_CWQ - 1]);
1575	queue_cache[HV_NCS_QTYPE_MAU - 1] = NULL;
1576	queue_cache[HV_NCS_QTYPE_CWQ - 1] = NULL;
1577}
1578
1579static long spu_queue_register_workfn(void *arg)
1580{
1581	struct spu_qreg *qr = arg;
1582	struct spu_queue *p = qr->queue;
1583	unsigned long q_type = qr->type;
1584	unsigned long hv_ret;
1585
 
 
 
 
 
 
 
 
 
 
1586	hv_ret = sun4v_ncs_qconf(q_type, __pa(p->q),
1587				 CWQ_NUM_ENTRIES, &p->qhandle);
1588	if (!hv_ret)
1589		sun4v_ncs_sethead_marker(p->qhandle, 0);
1590
1591	return hv_ret ? -EINVAL : 0;
1592}
1593
1594static int spu_queue_register(struct spu_queue *p, unsigned long q_type)
1595{
1596	int cpu = cpumask_any_and(&p->sharing, cpu_online_mask);
1597	struct spu_qreg qr = { .queue = p, .type = q_type };
1598
1599	return work_on_cpu_safe(cpu, spu_queue_register_workfn, &qr);
1600}
1601
1602static int spu_queue_setup(struct spu_queue *p)
1603{
1604	int err;
1605
1606	p->q = new_queue(p->q_type);
1607	if (!p->q)
1608		return -ENOMEM;
1609
1610	err = spu_queue_register(p, p->q_type);
1611	if (err) {
1612		free_queue(p->q, p->q_type);
1613		p->q = NULL;
1614	}
1615
1616	return err;
1617}
1618
1619static void spu_queue_destroy(struct spu_queue *p)
1620{
1621	unsigned long hv_ret;
1622
1623	if (!p->q)
1624		return;
1625
1626	hv_ret = sun4v_ncs_qconf(p->q_type, p->qhandle, 0, &p->qhandle);
1627
1628	if (!hv_ret)
1629		free_queue(p->q, p->q_type);
1630}
1631
1632static void spu_list_destroy(struct list_head *list)
1633{
1634	struct spu_queue *p, *n;
1635
1636	list_for_each_entry_safe(p, n, list, list) {
1637		int i;
1638
1639		for (i = 0; i < NR_CPUS; i++) {
1640			if (cpu_to_cwq[i] == p)
1641				cpu_to_cwq[i] = NULL;
1642		}
1643
1644		if (p->irq) {
1645			free_irq(p->irq, p);
1646			p->irq = 0;
1647		}
1648		spu_queue_destroy(p);
1649		list_del(&p->list);
1650		kfree(p);
1651	}
1652}
1653
1654/* Walk the backward arcs of a CWQ 'exec-unit' node,
1655 * gathering cpu membership information.
1656 */
1657static int spu_mdesc_walk_arcs(struct mdesc_handle *mdesc,
1658			       struct platform_device *dev,
1659			       u64 node, struct spu_queue *p,
1660			       struct spu_queue **table)
1661{
1662	u64 arc;
1663
1664	mdesc_for_each_arc(arc, mdesc, node, MDESC_ARC_TYPE_BACK) {
1665		u64 tgt = mdesc_arc_target(mdesc, arc);
1666		const char *name = mdesc_node_name(mdesc, tgt);
1667		const u64 *id;
1668
1669		if (strcmp(name, "cpu"))
1670			continue;
1671		id = mdesc_get_property(mdesc, tgt, "id", NULL);
1672		if (table[*id] != NULL) {
1673			dev_err(&dev->dev, "%pOF: SPU cpu slot already set.\n",
1674				dev->dev.of_node);
1675			return -EINVAL;
1676		}
1677		cpumask_set_cpu(*id, &p->sharing);
1678		table[*id] = p;
1679	}
1680	return 0;
1681}
1682
1683/* Process an 'exec-unit' MDESC node of type 'cwq'.  */
1684static int handle_exec_unit(struct spu_mdesc_info *ip, struct list_head *list,
1685			    struct platform_device *dev, struct mdesc_handle *mdesc,
1686			    u64 node, const char *iname, unsigned long q_type,
1687			    irq_handler_t handler, struct spu_queue **table)
1688{
1689	struct spu_queue *p;
1690	int err;
1691
1692	p = kzalloc(sizeof(struct spu_queue), GFP_KERNEL);
1693	if (!p) {
1694		dev_err(&dev->dev, "%pOF: Could not allocate SPU queue.\n",
1695			dev->dev.of_node);
1696		return -ENOMEM;
1697	}
1698
1699	cpumask_clear(&p->sharing);
1700	spin_lock_init(&p->lock);
1701	p->q_type = q_type;
1702	INIT_LIST_HEAD(&p->jobs);
1703	list_add(&p->list, list);
1704
1705	err = spu_mdesc_walk_arcs(mdesc, dev, node, p, table);
1706	if (err)
1707		return err;
1708
1709	err = spu_queue_setup(p);
1710	if (err)
1711		return err;
1712
1713	return spu_map_ino(dev, ip, iname, p, handler);
1714}
1715
1716static int spu_mdesc_scan(struct mdesc_handle *mdesc, struct platform_device *dev,
1717			  struct spu_mdesc_info *ip, struct list_head *list,
1718			  const char *exec_name, unsigned long q_type,
1719			  irq_handler_t handler, struct spu_queue **table)
1720{
1721	int err = 0;
1722	u64 node;
1723
1724	mdesc_for_each_node_by_name(mdesc, node, "exec-unit") {
1725		const char *type;
1726
1727		type = mdesc_get_property(mdesc, node, "type", NULL);
1728		if (!type || strcmp(type, exec_name))
1729			continue;
1730
1731		err = handle_exec_unit(ip, list, dev, mdesc, node,
1732				       exec_name, q_type, handler, table);
1733		if (err) {
1734			spu_list_destroy(list);
1735			break;
1736		}
1737	}
1738
1739	return err;
1740}
1741
1742static int get_irq_props(struct mdesc_handle *mdesc, u64 node,
1743			 struct spu_mdesc_info *ip)
1744{
1745	const u64 *ino;
1746	int ino_len;
1747	int i;
1748
1749	ino = mdesc_get_property(mdesc, node, "ino", &ino_len);
1750	if (!ino) {
1751		printk("NO 'ino'\n");
1752		return -ENODEV;
1753	}
1754
1755	ip->num_intrs = ino_len / sizeof(u64);
1756	ip->ino_table = kzalloc((sizeof(struct ino_blob) *
1757				 ip->num_intrs),
1758				GFP_KERNEL);
1759	if (!ip->ino_table)
1760		return -ENOMEM;
1761
1762	for (i = 0; i < ip->num_intrs; i++) {
1763		struct ino_blob *b = &ip->ino_table[i];
1764		b->intr = i + 1;
1765		b->ino = ino[i];
1766	}
1767
1768	return 0;
1769}
1770
1771static int grab_mdesc_irq_props(struct mdesc_handle *mdesc,
1772				struct platform_device *dev,
1773				struct spu_mdesc_info *ip,
1774				const char *node_name)
1775{
1776	u64 node, reg;
 
1777
1778	if (of_property_read_reg(dev->dev.of_node, 0, &reg, NULL) < 0)
 
1779		return -ENODEV;
1780
1781	mdesc_for_each_node_by_name(mdesc, node, "virtual-device") {
1782		const char *name;
1783		const u64 *chdl;
1784
1785		name = mdesc_get_property(mdesc, node, "name", NULL);
1786		if (!name || strcmp(name, node_name))
1787			continue;
1788		chdl = mdesc_get_property(mdesc, node, "cfg-handle", NULL);
1789		if (!chdl || (*chdl != reg))
1790			continue;
1791		ip->cfg_handle = *chdl;
1792		return get_irq_props(mdesc, node, ip);
1793	}
1794
1795	return -ENODEV;
1796}
1797
1798static unsigned long n2_spu_hvapi_major;
1799static unsigned long n2_spu_hvapi_minor;
1800
1801static int n2_spu_hvapi_register(void)
1802{
1803	int err;
1804
1805	n2_spu_hvapi_major = 2;
1806	n2_spu_hvapi_minor = 0;
1807
1808	err = sun4v_hvapi_register(HV_GRP_NCS,
1809				   n2_spu_hvapi_major,
1810				   &n2_spu_hvapi_minor);
1811
1812	if (!err)
1813		pr_info("Registered NCS HVAPI version %lu.%lu\n",
1814			n2_spu_hvapi_major,
1815			n2_spu_hvapi_minor);
1816
1817	return err;
1818}
1819
1820static void n2_spu_hvapi_unregister(void)
1821{
1822	sun4v_hvapi_unregister(HV_GRP_NCS);
1823}
1824
1825static int global_ref;
1826
1827static int grab_global_resources(void)
1828{
1829	int err = 0;
1830
1831	mutex_lock(&spu_lock);
1832
1833	if (global_ref++)
1834		goto out;
1835
1836	err = n2_spu_hvapi_register();
1837	if (err)
1838		goto out;
1839
1840	err = queue_cache_init();
1841	if (err)
1842		goto out_hvapi_release;
1843
1844	err = -ENOMEM;
1845	cpu_to_cwq = kcalloc(NR_CPUS, sizeof(struct spu_queue *),
1846			     GFP_KERNEL);
1847	if (!cpu_to_cwq)
1848		goto out_queue_cache_destroy;
1849
1850	cpu_to_mau = kcalloc(NR_CPUS, sizeof(struct spu_queue *),
1851			     GFP_KERNEL);
1852	if (!cpu_to_mau)
1853		goto out_free_cwq_table;
1854
1855	err = 0;
1856
1857out:
1858	if (err)
1859		global_ref--;
1860	mutex_unlock(&spu_lock);
1861	return err;
1862
1863out_free_cwq_table:
1864	kfree(cpu_to_cwq);
1865	cpu_to_cwq = NULL;
1866
1867out_queue_cache_destroy:
1868	queue_cache_destroy();
1869
1870out_hvapi_release:
1871	n2_spu_hvapi_unregister();
1872	goto out;
1873}
1874
1875static void release_global_resources(void)
1876{
1877	mutex_lock(&spu_lock);
1878	if (!--global_ref) {
1879		kfree(cpu_to_cwq);
1880		cpu_to_cwq = NULL;
1881
1882		kfree(cpu_to_mau);
1883		cpu_to_mau = NULL;
1884
1885		queue_cache_destroy();
1886		n2_spu_hvapi_unregister();
1887	}
1888	mutex_unlock(&spu_lock);
1889}
1890
1891static struct n2_crypto *alloc_n2cp(void)
1892{
1893	struct n2_crypto *np = kzalloc(sizeof(struct n2_crypto), GFP_KERNEL);
1894
1895	if (np)
1896		INIT_LIST_HEAD(&np->cwq_list);
1897
1898	return np;
1899}
1900
1901static void free_n2cp(struct n2_crypto *np)
1902{
1903	kfree(np->cwq_info.ino_table);
1904	np->cwq_info.ino_table = NULL;
 
 
1905
1906	kfree(np);
1907}
1908
1909static void n2_spu_driver_version(void)
1910{
1911	static int n2_spu_version_printed;
1912
1913	if (n2_spu_version_printed++ == 0)
1914		pr_info("%s", version);
1915}
1916
1917static int n2_crypto_probe(struct platform_device *dev)
1918{
1919	struct mdesc_handle *mdesc;
 
1920	struct n2_crypto *np;
1921	int err;
1922
1923	n2_spu_driver_version();
1924
1925	pr_info("Found N2CP at %pOF\n", dev->dev.of_node);
 
1926
1927	np = alloc_n2cp();
1928	if (!np) {
1929		dev_err(&dev->dev, "%pOF: Unable to allocate n2cp.\n",
1930			dev->dev.of_node);
1931		return -ENOMEM;
1932	}
1933
1934	err = grab_global_resources();
1935	if (err) {
1936		dev_err(&dev->dev, "%pOF: Unable to grab global resources.\n",
1937			dev->dev.of_node);
1938		goto out_free_n2cp;
1939	}
1940
1941	mdesc = mdesc_grab();
1942
1943	if (!mdesc) {
1944		dev_err(&dev->dev, "%pOF: Unable to grab MDESC.\n",
1945			dev->dev.of_node);
1946		err = -ENODEV;
1947		goto out_free_global;
1948	}
1949	err = grab_mdesc_irq_props(mdesc, dev, &np->cwq_info, "n2cp");
1950	if (err) {
1951		dev_err(&dev->dev, "%pOF: Unable to grab IRQ props.\n",
1952			dev->dev.of_node);
1953		mdesc_release(mdesc);
1954		goto out_free_global;
1955	}
1956
1957	err = spu_mdesc_scan(mdesc, dev, &np->cwq_info, &np->cwq_list,
1958			     "cwq", HV_NCS_QTYPE_CWQ, cwq_intr,
1959			     cpu_to_cwq);
1960	mdesc_release(mdesc);
1961
1962	if (err) {
1963		dev_err(&dev->dev, "%pOF: CWQ MDESC scan failed.\n",
1964			dev->dev.of_node);
1965		goto out_free_global;
1966	}
1967
1968	err = n2_register_algs();
1969	if (err) {
1970		dev_err(&dev->dev, "%pOF: Unable to register algorithms.\n",
1971			dev->dev.of_node);
1972		goto out_free_spu_list;
1973	}
1974
1975	dev_set_drvdata(&dev->dev, np);
1976
1977	return 0;
1978
1979out_free_spu_list:
1980	spu_list_destroy(&np->cwq_list);
1981
1982out_free_global:
1983	release_global_resources();
1984
1985out_free_n2cp:
1986	free_n2cp(np);
1987
1988	return err;
1989}
1990
1991static void n2_crypto_remove(struct platform_device *dev)
1992{
1993	struct n2_crypto *np = dev_get_drvdata(&dev->dev);
1994
1995	n2_unregister_algs();
1996
1997	spu_list_destroy(&np->cwq_list);
1998
1999	release_global_resources();
2000
2001	free_n2cp(np);
 
 
2002}
2003
2004static struct n2_mau *alloc_ncp(void)
2005{
2006	struct n2_mau *mp = kzalloc(sizeof(struct n2_mau), GFP_KERNEL);
2007
2008	if (mp)
2009		INIT_LIST_HEAD(&mp->mau_list);
2010
2011	return mp;
2012}
2013
2014static void free_ncp(struct n2_mau *mp)
2015{
2016	kfree(mp->mau_info.ino_table);
2017	mp->mau_info.ino_table = NULL;
 
 
2018
2019	kfree(mp);
2020}
2021
2022static int n2_mau_probe(struct platform_device *dev)
2023{
2024	struct mdesc_handle *mdesc;
 
2025	struct n2_mau *mp;
2026	int err;
2027
2028	n2_spu_driver_version();
2029
2030	pr_info("Found NCP at %pOF\n", dev->dev.of_node);
 
2031
2032	mp = alloc_ncp();
2033	if (!mp) {
2034		dev_err(&dev->dev, "%pOF: Unable to allocate ncp.\n",
2035			dev->dev.of_node);
2036		return -ENOMEM;
2037	}
2038
2039	err = grab_global_resources();
2040	if (err) {
2041		dev_err(&dev->dev, "%pOF: Unable to grab global resources.\n",
2042			dev->dev.of_node);
2043		goto out_free_ncp;
2044	}
2045
2046	mdesc = mdesc_grab();
2047
2048	if (!mdesc) {
2049		dev_err(&dev->dev, "%pOF: Unable to grab MDESC.\n",
2050			dev->dev.of_node);
2051		err = -ENODEV;
2052		goto out_free_global;
2053	}
2054
2055	err = grab_mdesc_irq_props(mdesc, dev, &mp->mau_info, "ncp");
2056	if (err) {
2057		dev_err(&dev->dev, "%pOF: Unable to grab IRQ props.\n",
2058			dev->dev.of_node);
2059		mdesc_release(mdesc);
2060		goto out_free_global;
2061	}
2062
2063	err = spu_mdesc_scan(mdesc, dev, &mp->mau_info, &mp->mau_list,
2064			     "mau", HV_NCS_QTYPE_MAU, mau_intr,
2065			     cpu_to_mau);
2066	mdesc_release(mdesc);
2067
2068	if (err) {
2069		dev_err(&dev->dev, "%pOF: MAU MDESC scan failed.\n",
2070			dev->dev.of_node);
2071		goto out_free_global;
2072	}
2073
2074	dev_set_drvdata(&dev->dev, mp);
2075
2076	return 0;
2077
2078out_free_global:
2079	release_global_resources();
2080
2081out_free_ncp:
2082	free_ncp(mp);
2083
2084	return err;
2085}
2086
2087static void n2_mau_remove(struct platform_device *dev)
2088{
2089	struct n2_mau *mp = dev_get_drvdata(&dev->dev);
2090
2091	spu_list_destroy(&mp->mau_list);
2092
2093	release_global_resources();
2094
2095	free_ncp(mp);
 
 
2096}
2097
2098static const struct of_device_id n2_crypto_match[] = {
2099	{
2100		.name = "n2cp",
2101		.compatible = "SUNW,n2-cwq",
2102	},
2103	{
2104		.name = "n2cp",
2105		.compatible = "SUNW,vf-cwq",
2106	},
2107	{
2108		.name = "n2cp",
2109		.compatible = "SUNW,kt-cwq",
2110	},
2111	{},
2112};
2113
2114MODULE_DEVICE_TABLE(of, n2_crypto_match);
2115
2116static struct platform_driver n2_crypto_driver = {
2117	.driver = {
2118		.name		=	"n2cp",
 
2119		.of_match_table	=	n2_crypto_match,
2120	},
2121	.probe		=	n2_crypto_probe,
2122	.remove		=	n2_crypto_remove,
2123};
2124
2125static const struct of_device_id n2_mau_match[] = {
2126	{
2127		.name = "ncp",
2128		.compatible = "SUNW,n2-mau",
2129	},
2130	{
2131		.name = "ncp",
2132		.compatible = "SUNW,vf-mau",
2133	},
2134	{
2135		.name = "ncp",
2136		.compatible = "SUNW,kt-mau",
2137	},
2138	{},
2139};
2140
2141MODULE_DEVICE_TABLE(of, n2_mau_match);
2142
2143static struct platform_driver n2_mau_driver = {
2144	.driver = {
2145		.name		=	"ncp",
 
2146		.of_match_table	=	n2_mau_match,
2147	},
2148	.probe		=	n2_mau_probe,
2149	.remove		=	n2_mau_remove,
2150};
2151
2152static struct platform_driver * const drivers[] = {
2153	&n2_crypto_driver,
2154	&n2_mau_driver,
2155};
2156
2157static int __init n2_init(void)
2158{
2159	return platform_register_drivers(drivers, ARRAY_SIZE(drivers));
 
 
 
 
 
 
 
2160}
2161
2162static void __exit n2_exit(void)
2163{
2164	platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));
 
2165}
2166
2167module_init(n2_init);
2168module_exit(n2_exit);
v3.1
 
   1/* n2_core.c: Niagara2 Stream Processing Unit (SPU) crypto support.
   2 *
   3 * Copyright (C) 2010, 2011 David S. Miller <davem@davemloft.net>
   4 */
   5
   6#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   7
   8#include <linux/kernel.h>
   9#include <linux/module.h>
  10#include <linux/of.h>
  11#include <linux/of_device.h>
 
  12#include <linux/cpumask.h>
  13#include <linux/slab.h>
  14#include <linux/interrupt.h>
  15#include <linux/crypto.h>
  16#include <crypto/md5.h>
  17#include <crypto/sha.h>
 
  18#include <crypto/aes.h>
  19#include <crypto/des.h>
  20#include <linux/mutex.h>
  21#include <linux/delay.h>
  22#include <linux/sched.h>
  23
  24#include <crypto/internal/hash.h>
 
  25#include <crypto/scatterwalk.h>
  26#include <crypto/algapi.h>
  27
  28#include <asm/hypervisor.h>
  29#include <asm/mdesc.h>
  30
  31#include "n2_core.h"
  32
  33#define DRV_MODULE_NAME		"n2_crypto"
  34#define DRV_MODULE_VERSION	"0.2"
  35#define DRV_MODULE_RELDATE	"July 28, 2011"
  36
  37static char version[] __devinitdata =
  38	DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
  39
  40MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
  41MODULE_DESCRIPTION("Niagara2 Crypto driver");
  42MODULE_LICENSE("GPL");
  43MODULE_VERSION(DRV_MODULE_VERSION);
  44
  45#define N2_CRA_PRIORITY		300
  46
  47static DEFINE_MUTEX(spu_lock);
  48
  49struct spu_queue {
  50	cpumask_t		sharing;
  51	unsigned long		qhandle;
  52
  53	spinlock_t		lock;
  54	u8			q_type;
  55	void			*q;
  56	unsigned long		head;
  57	unsigned long		tail;
  58	struct list_head	jobs;
  59
  60	unsigned long		devino;
  61
  62	char			irq_name[32];
  63	unsigned int		irq;
  64
  65	struct list_head	list;
  66};
  67
 
 
 
 
 
  68static struct spu_queue **cpu_to_cwq;
  69static struct spu_queue **cpu_to_mau;
  70
  71static unsigned long spu_next_offset(struct spu_queue *q, unsigned long off)
  72{
  73	if (q->q_type == HV_NCS_QTYPE_MAU) {
  74		off += MAU_ENTRY_SIZE;
  75		if (off == (MAU_ENTRY_SIZE * MAU_NUM_ENTRIES))
  76			off = 0;
  77	} else {
  78		off += CWQ_ENTRY_SIZE;
  79		if (off == (CWQ_ENTRY_SIZE * CWQ_NUM_ENTRIES))
  80			off = 0;
  81	}
  82	return off;
  83}
  84
  85struct n2_request_common {
  86	struct list_head	entry;
  87	unsigned int		offset;
  88};
  89#define OFFSET_NOT_RUNNING	(~(unsigned int)0)
  90
  91/* An async job request records the final tail value it used in
  92 * n2_request_common->offset, test to see if that offset is in
  93 * the range old_head, new_head, inclusive.
  94 */
  95static inline bool job_finished(struct spu_queue *q, unsigned int offset,
  96				unsigned long old_head, unsigned long new_head)
  97{
  98	if (old_head <= new_head) {
  99		if (offset > old_head && offset <= new_head)
 100			return true;
 101	} else {
 102		if (offset > old_head || offset <= new_head)
 103			return true;
 104	}
 105	return false;
 106}
 107
 108/* When the HEAD marker is unequal to the actual HEAD, we get
 109 * a virtual device INO interrupt.  We should process the
 110 * completed CWQ entries and adjust the HEAD marker to clear
 111 * the IRQ.
 112 */
 113static irqreturn_t cwq_intr(int irq, void *dev_id)
 114{
 115	unsigned long off, new_head, hv_ret;
 116	struct spu_queue *q = dev_id;
 117
 118	pr_err("CPU[%d]: Got CWQ interrupt for qhdl[%lx]\n",
 119	       smp_processor_id(), q->qhandle);
 120
 121	spin_lock(&q->lock);
 122
 123	hv_ret = sun4v_ncs_gethead(q->qhandle, &new_head);
 124
 125	pr_err("CPU[%d]: CWQ gethead[%lx] hv_ret[%lu]\n",
 126	       smp_processor_id(), new_head, hv_ret);
 127
 128	for (off = q->head; off != new_head; off = spu_next_offset(q, off)) {
 129		/* XXX ... XXX */
 130	}
 131
 132	hv_ret = sun4v_ncs_sethead_marker(q->qhandle, new_head);
 133	if (hv_ret == HV_EOK)
 134		q->head = new_head;
 135
 136	spin_unlock(&q->lock);
 137
 138	return IRQ_HANDLED;
 139}
 140
 141static irqreturn_t mau_intr(int irq, void *dev_id)
 142{
 143	struct spu_queue *q = dev_id;
 144	unsigned long head, hv_ret;
 145
 146	spin_lock(&q->lock);
 147
 148	pr_err("CPU[%d]: Got MAU interrupt for qhdl[%lx]\n",
 149	       smp_processor_id(), q->qhandle);
 150
 151	hv_ret = sun4v_ncs_gethead(q->qhandle, &head);
 152
 153	pr_err("CPU[%d]: MAU gethead[%lx] hv_ret[%lu]\n",
 154	       smp_processor_id(), head, hv_ret);
 155
 156	sun4v_ncs_sethead_marker(q->qhandle, head);
 157
 158	spin_unlock(&q->lock);
 159
 160	return IRQ_HANDLED;
 161}
 162
 163static void *spu_queue_next(struct spu_queue *q, void *cur)
 164{
 165	return q->q + spu_next_offset(q, cur - q->q);
 166}
 167
 168static int spu_queue_num_free(struct spu_queue *q)
 169{
 170	unsigned long head = q->head;
 171	unsigned long tail = q->tail;
 172	unsigned long end = (CWQ_ENTRY_SIZE * CWQ_NUM_ENTRIES);
 173	unsigned long diff;
 174
 175	if (head > tail)
 176		diff = head - tail;
 177	else
 178		diff = (end - tail) + head;
 179
 180	return (diff / CWQ_ENTRY_SIZE) - 1;
 181}
 182
 183static void *spu_queue_alloc(struct spu_queue *q, int num_entries)
 184{
 185	int avail = spu_queue_num_free(q);
 186
 187	if (avail >= num_entries)
 188		return q->q + q->tail;
 189
 190	return NULL;
 191}
 192
 193static unsigned long spu_queue_submit(struct spu_queue *q, void *last)
 194{
 195	unsigned long hv_ret, new_tail;
 196
 197	new_tail = spu_next_offset(q, last - q->q);
 198
 199	hv_ret = sun4v_ncs_settail(q->qhandle, new_tail);
 200	if (hv_ret == HV_EOK)
 201		q->tail = new_tail;
 202	return hv_ret;
 203}
 204
 205static u64 control_word_base(unsigned int len, unsigned int hmac_key_len,
 206			     int enc_type, int auth_type,
 207			     unsigned int hash_len,
 208			     bool sfas, bool sob, bool eob, bool encrypt,
 209			     int opcode)
 210{
 211	u64 word = (len - 1) & CONTROL_LEN;
 212
 213	word |= ((u64) opcode << CONTROL_OPCODE_SHIFT);
 214	word |= ((u64) enc_type << CONTROL_ENC_TYPE_SHIFT);
 215	word |= ((u64) auth_type << CONTROL_AUTH_TYPE_SHIFT);
 216	if (sfas)
 217		word |= CONTROL_STORE_FINAL_AUTH_STATE;
 218	if (sob)
 219		word |= CONTROL_START_OF_BLOCK;
 220	if (eob)
 221		word |= CONTROL_END_OF_BLOCK;
 222	if (encrypt)
 223		word |= CONTROL_ENCRYPT;
 224	if (hmac_key_len)
 225		word |= ((u64) (hmac_key_len - 1)) << CONTROL_HMAC_KEY_LEN_SHIFT;
 226	if (hash_len)
 227		word |= ((u64) (hash_len - 1)) << CONTROL_HASH_LEN_SHIFT;
 228
 229	return word;
 230}
 231
 232#if 0
 233static inline bool n2_should_run_async(struct spu_queue *qp, int this_len)
 234{
 235	if (this_len >= 64 ||
 236	    qp->head != qp->tail)
 237		return true;
 238	return false;
 239}
 240#endif
 241
 242struct n2_ahash_alg {
 243	struct list_head	entry;
 244	const char		*hash_zero;
 245	const u32		*hash_init;
 246	u8			hw_op_hashsz;
 247	u8			digest_size;
 248	u8			auth_type;
 249	u8			hmac_type;
 250	struct ahash_alg	alg;
 251};
 252
 253static inline struct n2_ahash_alg *n2_ahash_alg(struct crypto_tfm *tfm)
 254{
 255	struct crypto_alg *alg = tfm->__crt_alg;
 256	struct ahash_alg *ahash_alg;
 257
 258	ahash_alg = container_of(alg, struct ahash_alg, halg.base);
 259
 260	return container_of(ahash_alg, struct n2_ahash_alg, alg);
 261}
 262
 263struct n2_hmac_alg {
 264	const char		*child_alg;
 265	struct n2_ahash_alg	derived;
 266};
 267
 268static inline struct n2_hmac_alg *n2_hmac_alg(struct crypto_tfm *tfm)
 269{
 270	struct crypto_alg *alg = tfm->__crt_alg;
 271	struct ahash_alg *ahash_alg;
 272
 273	ahash_alg = container_of(alg, struct ahash_alg, halg.base);
 274
 275	return container_of(ahash_alg, struct n2_hmac_alg, derived.alg);
 276}
 277
 278struct n2_hash_ctx {
 279	struct crypto_ahash		*fallback_tfm;
 280};
 281
 282#define N2_HASH_KEY_MAX			32 /* HW limit for all HMAC requests */
 283
 284struct n2_hmac_ctx {
 285	struct n2_hash_ctx		base;
 286
 287	struct crypto_shash		*child_shash;
 288
 289	int				hash_key_len;
 290	unsigned char			hash_key[N2_HASH_KEY_MAX];
 291};
 292
 293struct n2_hash_req_ctx {
 294	union {
 295		struct md5_state	md5;
 296		struct sha1_state	sha1;
 297		struct sha256_state	sha256;
 298	} u;
 299
 300	struct ahash_request		fallback_req;
 301};
 302
 303static int n2_hash_async_init(struct ahash_request *req)
 304{
 305	struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 306	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 307	struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
 308
 309	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
 310	rctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
 311
 312	return crypto_ahash_init(&rctx->fallback_req);
 313}
 314
 315static int n2_hash_async_update(struct ahash_request *req)
 316{
 317	struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 318	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 319	struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
 320
 321	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
 322	rctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
 323	rctx->fallback_req.nbytes = req->nbytes;
 324	rctx->fallback_req.src = req->src;
 325
 326	return crypto_ahash_update(&rctx->fallback_req);
 327}
 328
 329static int n2_hash_async_final(struct ahash_request *req)
 330{
 331	struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 332	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 333	struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
 334
 335	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
 336	rctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
 337	rctx->fallback_req.result = req->result;
 338
 339	return crypto_ahash_final(&rctx->fallback_req);
 340}
 341
 342static int n2_hash_async_finup(struct ahash_request *req)
 343{
 344	struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 345	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 346	struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
 347
 348	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
 349	rctx->fallback_req.base.flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
 350	rctx->fallback_req.nbytes = req->nbytes;
 351	rctx->fallback_req.src = req->src;
 352	rctx->fallback_req.result = req->result;
 353
 354	return crypto_ahash_finup(&rctx->fallback_req);
 355}
 356
 
 
 
 
 
 
 
 
 
 
 357static int n2_hash_cra_init(struct crypto_tfm *tfm)
 358{
 359	const char *fallback_driver_name = tfm->__crt_alg->cra_name;
 360	struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);
 361	struct n2_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 362	struct crypto_ahash *fallback_tfm;
 363	int err;
 364
 365	fallback_tfm = crypto_alloc_ahash(fallback_driver_name, 0,
 366					  CRYPTO_ALG_NEED_FALLBACK);
 367	if (IS_ERR(fallback_tfm)) {
 368		pr_warning("Fallback driver '%s' could not be loaded!\n",
 369			   fallback_driver_name);
 370		err = PTR_ERR(fallback_tfm);
 371		goto out;
 372	}
 373
 374	crypto_ahash_set_reqsize(ahash, (sizeof(struct n2_hash_req_ctx) +
 375					 crypto_ahash_reqsize(fallback_tfm)));
 376
 377	ctx->fallback_tfm = fallback_tfm;
 378	return 0;
 379
 380out:
 381	return err;
 382}
 383
 384static void n2_hash_cra_exit(struct crypto_tfm *tfm)
 385{
 386	struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);
 387	struct n2_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 388
 389	crypto_free_ahash(ctx->fallback_tfm);
 390}
 391
 392static int n2_hmac_cra_init(struct crypto_tfm *tfm)
 393{
 394	const char *fallback_driver_name = tfm->__crt_alg->cra_name;
 395	struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);
 396	struct n2_hmac_ctx *ctx = crypto_ahash_ctx(ahash);
 397	struct n2_hmac_alg *n2alg = n2_hmac_alg(tfm);
 398	struct crypto_ahash *fallback_tfm;
 399	struct crypto_shash *child_shash;
 400	int err;
 401
 402	fallback_tfm = crypto_alloc_ahash(fallback_driver_name, 0,
 403					  CRYPTO_ALG_NEED_FALLBACK);
 404	if (IS_ERR(fallback_tfm)) {
 405		pr_warning("Fallback driver '%s' could not be loaded!\n",
 406			   fallback_driver_name);
 407		err = PTR_ERR(fallback_tfm);
 408		goto out;
 409	}
 410
 411	child_shash = crypto_alloc_shash(n2alg->child_alg, 0, 0);
 412	if (IS_ERR(child_shash)) {
 413		pr_warning("Child shash '%s' could not be loaded!\n",
 414			   n2alg->child_alg);
 415		err = PTR_ERR(child_shash);
 416		goto out_free_fallback;
 417	}
 418
 419	crypto_ahash_set_reqsize(ahash, (sizeof(struct n2_hash_req_ctx) +
 420					 crypto_ahash_reqsize(fallback_tfm)));
 421
 422	ctx->child_shash = child_shash;
 423	ctx->base.fallback_tfm = fallback_tfm;
 424	return 0;
 425
 426out_free_fallback:
 427	crypto_free_ahash(fallback_tfm);
 428
 429out:
 430	return err;
 431}
 432
 433static void n2_hmac_cra_exit(struct crypto_tfm *tfm)
 434{
 435	struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);
 436	struct n2_hmac_ctx *ctx = crypto_ahash_ctx(ahash);
 437
 438	crypto_free_ahash(ctx->base.fallback_tfm);
 439	crypto_free_shash(ctx->child_shash);
 440}
 441
 442static int n2_hmac_async_setkey(struct crypto_ahash *tfm, const u8 *key,
 443				unsigned int keylen)
 444{
 445	struct n2_hmac_ctx *ctx = crypto_ahash_ctx(tfm);
 446	struct crypto_shash *child_shash = ctx->child_shash;
 447	struct crypto_ahash *fallback_tfm;
 448	struct {
 449		struct shash_desc shash;
 450		char ctx[crypto_shash_descsize(child_shash)];
 451	} desc;
 452	int err, bs, ds;
 453
 454	fallback_tfm = ctx->base.fallback_tfm;
 455	err = crypto_ahash_setkey(fallback_tfm, key, keylen);
 456	if (err)
 457		return err;
 458
 459	desc.shash.tfm = child_shash;
 460	desc.shash.flags = crypto_ahash_get_flags(tfm) &
 461		CRYPTO_TFM_REQ_MAY_SLEEP;
 462
 463	bs = crypto_shash_blocksize(child_shash);
 464	ds = crypto_shash_digestsize(child_shash);
 465	BUG_ON(ds > N2_HASH_KEY_MAX);
 466	if (keylen > bs) {
 467		err = crypto_shash_digest(&desc.shash, key, keylen,
 468					  ctx->hash_key);
 469		if (err)
 470			return err;
 471		keylen = ds;
 472	} else if (keylen <= N2_HASH_KEY_MAX)
 473		memcpy(ctx->hash_key, key, keylen);
 474
 475	ctx->hash_key_len = keylen;
 476
 477	return err;
 478}
 479
 480static unsigned long wait_for_tail(struct spu_queue *qp)
 481{
 482	unsigned long head, hv_ret;
 483
 484	do {
 485		hv_ret = sun4v_ncs_gethead(qp->qhandle, &head);
 486		if (hv_ret != HV_EOK) {
 487			pr_err("Hypervisor error on gethead\n");
 488			break;
 489		}
 490		if (head == qp->tail) {
 491			qp->head = head;
 492			break;
 493		}
 494	} while (1);
 495	return hv_ret;
 496}
 497
 498static unsigned long submit_and_wait_for_tail(struct spu_queue *qp,
 499					      struct cwq_initial_entry *ent)
 500{
 501	unsigned long hv_ret = spu_queue_submit(qp, ent);
 502
 503	if (hv_ret == HV_EOK)
 504		hv_ret = wait_for_tail(qp);
 505
 506	return hv_ret;
 507}
 508
 509static int n2_do_async_digest(struct ahash_request *req,
 510			      unsigned int auth_type, unsigned int digest_size,
 511			      unsigned int result_size, void *hash_loc,
 512			      unsigned long auth_key, unsigned int auth_key_len)
 513{
 514	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 515	struct cwq_initial_entry *ent;
 516	struct crypto_hash_walk walk;
 517	struct spu_queue *qp;
 518	unsigned long flags;
 519	int err = -ENODEV;
 520	int nbytes, cpu;
 521
 522	/* The total effective length of the operation may not
 523	 * exceed 2^16.
 524	 */
 525	if (unlikely(req->nbytes > (1 << 16))) {
 526		struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 527		struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
 528
 529		ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
 530		rctx->fallback_req.base.flags =
 531			req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
 532		rctx->fallback_req.nbytes = req->nbytes;
 533		rctx->fallback_req.src = req->src;
 534		rctx->fallback_req.result = req->result;
 535
 536		return crypto_ahash_digest(&rctx->fallback_req);
 537	}
 538
 539	nbytes = crypto_hash_walk_first(req, &walk);
 540
 541	cpu = get_cpu();
 542	qp = cpu_to_cwq[cpu];
 543	if (!qp)
 544		goto out;
 545
 546	spin_lock_irqsave(&qp->lock, flags);
 547
 548	/* XXX can do better, improve this later by doing a by-hand scatterlist
 549	 * XXX walk, etc.
 550	 */
 551	ent = qp->q + qp->tail;
 552
 553	ent->control = control_word_base(nbytes, auth_key_len, 0,
 554					 auth_type, digest_size,
 555					 false, true, false, false,
 556					 OPCODE_INPLACE_BIT |
 557					 OPCODE_AUTH_MAC);
 558	ent->src_addr = __pa(walk.data);
 559	ent->auth_key_addr = auth_key;
 560	ent->auth_iv_addr = __pa(hash_loc);
 561	ent->final_auth_state_addr = 0UL;
 562	ent->enc_key_addr = 0UL;
 563	ent->enc_iv_addr = 0UL;
 564	ent->dest_addr = __pa(hash_loc);
 565
 566	nbytes = crypto_hash_walk_done(&walk, 0);
 567	while (nbytes > 0) {
 568		ent = spu_queue_next(qp, ent);
 569
 570		ent->control = (nbytes - 1);
 571		ent->src_addr = __pa(walk.data);
 572		ent->auth_key_addr = 0UL;
 573		ent->auth_iv_addr = 0UL;
 574		ent->final_auth_state_addr = 0UL;
 575		ent->enc_key_addr = 0UL;
 576		ent->enc_iv_addr = 0UL;
 577		ent->dest_addr = 0UL;
 578
 579		nbytes = crypto_hash_walk_done(&walk, 0);
 580	}
 581	ent->control |= CONTROL_END_OF_BLOCK;
 582
 583	if (submit_and_wait_for_tail(qp, ent) != HV_EOK)
 584		err = -EINVAL;
 585	else
 586		err = 0;
 587
 588	spin_unlock_irqrestore(&qp->lock, flags);
 589
 590	if (!err)
 591		memcpy(req->result, hash_loc, result_size);
 592out:
 593	put_cpu();
 594
 595	return err;
 596}
 597
 598static int n2_hash_async_digest(struct ahash_request *req)
 599{
 600	struct n2_ahash_alg *n2alg = n2_ahash_alg(req->base.tfm);
 601	struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 602	int ds;
 603
 604	ds = n2alg->digest_size;
 605	if (unlikely(req->nbytes == 0)) {
 606		memcpy(req->result, n2alg->hash_zero, ds);
 607		return 0;
 608	}
 609	memcpy(&rctx->u, n2alg->hash_init, n2alg->hw_op_hashsz);
 610
 611	return n2_do_async_digest(req, n2alg->auth_type,
 612				  n2alg->hw_op_hashsz, ds,
 613				  &rctx->u, 0UL, 0);
 614}
 615
 616static int n2_hmac_async_digest(struct ahash_request *req)
 617{
 618	struct n2_hmac_alg *n2alg = n2_hmac_alg(req->base.tfm);
 619	struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 620	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 621	struct n2_hmac_ctx *ctx = crypto_ahash_ctx(tfm);
 622	int ds;
 623
 624	ds = n2alg->derived.digest_size;
 625	if (unlikely(req->nbytes == 0) ||
 626	    unlikely(ctx->hash_key_len > N2_HASH_KEY_MAX)) {
 627		struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
 628		struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
 629
 630		ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
 631		rctx->fallback_req.base.flags =
 632			req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
 633		rctx->fallback_req.nbytes = req->nbytes;
 634		rctx->fallback_req.src = req->src;
 635		rctx->fallback_req.result = req->result;
 636
 637		return crypto_ahash_digest(&rctx->fallback_req);
 638	}
 639	memcpy(&rctx->u, n2alg->derived.hash_init,
 640	       n2alg->derived.hw_op_hashsz);
 641
 642	return n2_do_async_digest(req, n2alg->derived.hmac_type,
 643				  n2alg->derived.hw_op_hashsz, ds,
 644				  &rctx->u,
 645				  __pa(&ctx->hash_key),
 646				  ctx->hash_key_len);
 647}
 648
 649struct n2_cipher_context {
 650	int			key_len;
 651	int			enc_type;
 652	union {
 653		u8		aes[AES_MAX_KEY_SIZE];
 654		u8		des[DES_KEY_SIZE];
 655		u8		des3[3 * DES_KEY_SIZE];
 656		u8		arc4[258]; /* S-box, X, Y */
 657	} key;
 658};
 659
 660#define N2_CHUNK_ARR_LEN	16
 661
 662struct n2_crypto_chunk {
 663	struct list_head	entry;
 664	unsigned long		iv_paddr : 44;
 665	unsigned long		arr_len : 20;
 666	unsigned long		dest_paddr;
 667	unsigned long		dest_final;
 668	struct {
 669		unsigned long	src_paddr : 44;
 670		unsigned long	src_len : 20;
 671	} arr[N2_CHUNK_ARR_LEN];
 672};
 673
 674struct n2_request_context {
 675	struct ablkcipher_walk	walk;
 676	struct list_head	chunk_list;
 677	struct n2_crypto_chunk	chunk;
 678	u8			temp_iv[16];
 679};
 680
 681/* The SPU allows some level of flexibility for partial cipher blocks
 682 * being specified in a descriptor.
 683 *
 684 * It merely requires that every descriptor's length field is at least
 685 * as large as the cipher block size.  This means that a cipher block
 686 * can span at most 2 descriptors.  However, this does not allow a
 687 * partial block to span into the final descriptor as that would
 688 * violate the rule (since every descriptor's length must be at lest
 689 * the block size).  So, for example, assuming an 8 byte block size:
 690 *
 691 *	0xe --> 0xa --> 0x8
 692 *
 693 * is a valid length sequence, whereas:
 694 *
 695 *	0xe --> 0xb --> 0x7
 696 *
 697 * is not a valid sequence.
 698 */
 699
 700struct n2_cipher_alg {
 701	struct list_head	entry;
 702	u8			enc_type;
 703	struct crypto_alg	alg;
 704};
 705
 706static inline struct n2_cipher_alg *n2_cipher_alg(struct crypto_tfm *tfm)
 707{
 708	struct crypto_alg *alg = tfm->__crt_alg;
 709
 710	return container_of(alg, struct n2_cipher_alg, alg);
 711}
 712
 713struct n2_cipher_request_context {
 714	struct ablkcipher_walk	walk;
 715};
 716
 717static int n2_aes_setkey(struct crypto_ablkcipher *cipher, const u8 *key,
 718			 unsigned int keylen)
 719{
 720	struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
 721	struct n2_cipher_context *ctx = crypto_tfm_ctx(tfm);
 722	struct n2_cipher_alg *n2alg = n2_cipher_alg(tfm);
 723
 724	ctx->enc_type = (n2alg->enc_type & ENC_TYPE_CHAINING_MASK);
 725
 726	switch (keylen) {
 727	case AES_KEYSIZE_128:
 728		ctx->enc_type |= ENC_TYPE_ALG_AES128;
 729		break;
 730	case AES_KEYSIZE_192:
 731		ctx->enc_type |= ENC_TYPE_ALG_AES192;
 732		break;
 733	case AES_KEYSIZE_256:
 734		ctx->enc_type |= ENC_TYPE_ALG_AES256;
 735		break;
 736	default:
 737		crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_BAD_KEY_LEN);
 738		return -EINVAL;
 739	}
 740
 741	ctx->key_len = keylen;
 742	memcpy(ctx->key.aes, key, keylen);
 743	return 0;
 744}
 745
 746static int n2_des_setkey(struct crypto_ablkcipher *cipher, const u8 *key,
 747			 unsigned int keylen)
 748{
 749	struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
 750	struct n2_cipher_context *ctx = crypto_tfm_ctx(tfm);
 751	struct n2_cipher_alg *n2alg = n2_cipher_alg(tfm);
 752	u32 tmp[DES_EXPKEY_WORDS];
 753	int err;
 754
 
 
 
 
 755	ctx->enc_type = n2alg->enc_type;
 756
 757	if (keylen != DES_KEY_SIZE) {
 758		crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_BAD_KEY_LEN);
 759		return -EINVAL;
 760	}
 761
 762	err = des_ekey(tmp, key);
 763	if (err == 0 && (tfm->crt_flags & CRYPTO_TFM_REQ_WEAK_KEY)) {
 764		tfm->crt_flags |= CRYPTO_TFM_RES_WEAK_KEY;
 765		return -EINVAL;
 766	}
 767
 768	ctx->key_len = keylen;
 769	memcpy(ctx->key.des, key, keylen);
 770	return 0;
 771}
 772
 773static int n2_3des_setkey(struct crypto_ablkcipher *cipher, const u8 *key,
 774			  unsigned int keylen)
 775{
 776	struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
 777	struct n2_cipher_context *ctx = crypto_tfm_ctx(tfm);
 778	struct n2_cipher_alg *n2alg = n2_cipher_alg(tfm);
 
 
 
 
 
 779
 780	ctx->enc_type = n2alg->enc_type;
 781
 782	if (keylen != (3 * DES_KEY_SIZE)) {
 783		crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_BAD_KEY_LEN);
 784		return -EINVAL;
 785	}
 786	ctx->key_len = keylen;
 787	memcpy(ctx->key.des3, key, keylen);
 788	return 0;
 789}
 790
 791static int n2_arc4_setkey(struct crypto_ablkcipher *cipher, const u8 *key,
 792			  unsigned int keylen)
 793{
 794	struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
 795	struct n2_cipher_context *ctx = crypto_tfm_ctx(tfm);
 796	struct n2_cipher_alg *n2alg = n2_cipher_alg(tfm);
 797	u8 *s = ctx->key.arc4;
 798	u8 *x = s + 256;
 799	u8 *y = x + 1;
 800	int i, j, k;
 801
 802	ctx->enc_type = n2alg->enc_type;
 803
 804	j = k = 0;
 805	*x = 0;
 806	*y = 0;
 807	for (i = 0; i < 256; i++)
 808		s[i] = i;
 809	for (i = 0; i < 256; i++) {
 810		u8 a = s[i];
 811		j = (j + key[k] + a) & 0xff;
 812		s[i] = s[j];
 813		s[j] = a;
 814		if (++k >= keylen)
 815			k = 0;
 816	}
 817
 818	return 0;
 819}
 820
 821static inline int cipher_descriptor_len(int nbytes, unsigned int block_size)
 822{
 823	int this_len = nbytes;
 824
 825	this_len -= (nbytes & (block_size - 1));
 826	return this_len > (1 << 16) ? (1 << 16) : this_len;
 827}
 828
 829static int __n2_crypt_chunk(struct crypto_tfm *tfm, struct n2_crypto_chunk *cp,
 
 830			    struct spu_queue *qp, bool encrypt)
 831{
 832	struct n2_cipher_context *ctx = crypto_tfm_ctx(tfm);
 833	struct cwq_initial_entry *ent;
 834	bool in_place;
 835	int i;
 836
 837	ent = spu_queue_alloc(qp, cp->arr_len);
 838	if (!ent) {
 839		pr_info("queue_alloc() of %d fails\n",
 840			cp->arr_len);
 841		return -EBUSY;
 842	}
 843
 844	in_place = (cp->dest_paddr == cp->arr[0].src_paddr);
 845
 846	ent->control = control_word_base(cp->arr[0].src_len,
 847					 0, ctx->enc_type, 0, 0,
 848					 false, true, false, encrypt,
 849					 OPCODE_ENCRYPT |
 850					 (in_place ? OPCODE_INPLACE_BIT : 0));
 851	ent->src_addr = cp->arr[0].src_paddr;
 852	ent->auth_key_addr = 0UL;
 853	ent->auth_iv_addr = 0UL;
 854	ent->final_auth_state_addr = 0UL;
 855	ent->enc_key_addr = __pa(&ctx->key);
 856	ent->enc_iv_addr = cp->iv_paddr;
 857	ent->dest_addr = (in_place ? 0UL : cp->dest_paddr);
 858
 859	for (i = 1; i < cp->arr_len; i++) {
 860		ent = spu_queue_next(qp, ent);
 861
 862		ent->control = cp->arr[i].src_len - 1;
 863		ent->src_addr = cp->arr[i].src_paddr;
 864		ent->auth_key_addr = 0UL;
 865		ent->auth_iv_addr = 0UL;
 866		ent->final_auth_state_addr = 0UL;
 867		ent->enc_key_addr = 0UL;
 868		ent->enc_iv_addr = 0UL;
 869		ent->dest_addr = 0UL;
 870	}
 871	ent->control |= CONTROL_END_OF_BLOCK;
 872
 873	return (spu_queue_submit(qp, ent) != HV_EOK) ? -EINVAL : 0;
 874}
 875
 876static int n2_compute_chunks(struct ablkcipher_request *req)
 877{
 878	struct n2_request_context *rctx = ablkcipher_request_ctx(req);
 879	struct ablkcipher_walk *walk = &rctx->walk;
 880	struct n2_crypto_chunk *chunk;
 881	unsigned long dest_prev;
 882	unsigned int tot_len;
 883	bool prev_in_place;
 884	int err, nbytes;
 885
 886	ablkcipher_walk_init(walk, req->dst, req->src, req->nbytes);
 887	err = ablkcipher_walk_phys(req, walk);
 888	if (err)
 889		return err;
 890
 891	INIT_LIST_HEAD(&rctx->chunk_list);
 892
 893	chunk = &rctx->chunk;
 894	INIT_LIST_HEAD(&chunk->entry);
 895
 896	chunk->iv_paddr = 0UL;
 897	chunk->arr_len = 0;
 898	chunk->dest_paddr = 0UL;
 899
 900	prev_in_place = false;
 901	dest_prev = ~0UL;
 902	tot_len = 0;
 903
 904	while ((nbytes = walk->nbytes) != 0) {
 905		unsigned long dest_paddr, src_paddr;
 906		bool in_place;
 907		int this_len;
 908
 909		src_paddr = (page_to_phys(walk->src.page) +
 910			     walk->src.offset);
 911		dest_paddr = (page_to_phys(walk->dst.page) +
 912			      walk->dst.offset);
 913		in_place = (src_paddr == dest_paddr);
 914		this_len = cipher_descriptor_len(nbytes, walk->blocksize);
 915
 916		if (chunk->arr_len != 0) {
 917			if (in_place != prev_in_place ||
 918			    (!prev_in_place &&
 919			     dest_paddr != dest_prev) ||
 920			    chunk->arr_len == N2_CHUNK_ARR_LEN ||
 921			    tot_len + this_len > (1 << 16)) {
 922				chunk->dest_final = dest_prev;
 923				list_add_tail(&chunk->entry,
 924					      &rctx->chunk_list);
 925				chunk = kzalloc(sizeof(*chunk), GFP_ATOMIC);
 926				if (!chunk) {
 927					err = -ENOMEM;
 928					break;
 929				}
 930				INIT_LIST_HEAD(&chunk->entry);
 931			}
 932		}
 933		if (chunk->arr_len == 0) {
 934			chunk->dest_paddr = dest_paddr;
 935			tot_len = 0;
 936		}
 937		chunk->arr[chunk->arr_len].src_paddr = src_paddr;
 938		chunk->arr[chunk->arr_len].src_len = this_len;
 939		chunk->arr_len++;
 940
 941		dest_prev = dest_paddr + this_len;
 942		prev_in_place = in_place;
 943		tot_len += this_len;
 944
 945		err = ablkcipher_walk_done(req, walk, nbytes - this_len);
 946		if (err)
 947			break;
 948	}
 949	if (!err && chunk->arr_len != 0) {
 950		chunk->dest_final = dest_prev;
 951		list_add_tail(&chunk->entry, &rctx->chunk_list);
 952	}
 953
 954	return err;
 955}
 956
 957static void n2_chunk_complete(struct ablkcipher_request *req, void *final_iv)
 958{
 959	struct n2_request_context *rctx = ablkcipher_request_ctx(req);
 960	struct n2_crypto_chunk *c, *tmp;
 961
 962	if (final_iv)
 963		memcpy(rctx->walk.iv, final_iv, rctx->walk.blocksize);
 964
 965	ablkcipher_walk_complete(&rctx->walk);
 966	list_for_each_entry_safe(c, tmp, &rctx->chunk_list, entry) {
 967		list_del(&c->entry);
 968		if (unlikely(c != &rctx->chunk))
 969			kfree(c);
 970	}
 971
 972}
 973
 974static int n2_do_ecb(struct ablkcipher_request *req, bool encrypt)
 975{
 976	struct n2_request_context *rctx = ablkcipher_request_ctx(req);
 977	struct crypto_tfm *tfm = req->base.tfm;
 978	int err = n2_compute_chunks(req);
 979	struct n2_crypto_chunk *c, *tmp;
 980	unsigned long flags, hv_ret;
 981	struct spu_queue *qp;
 982
 983	if (err)
 984		return err;
 985
 986	qp = cpu_to_cwq[get_cpu()];
 987	err = -ENODEV;
 988	if (!qp)
 989		goto out;
 990
 991	spin_lock_irqsave(&qp->lock, flags);
 992
 993	list_for_each_entry_safe(c, tmp, &rctx->chunk_list, entry) {
 994		err = __n2_crypt_chunk(tfm, c, qp, encrypt);
 995		if (err)
 996			break;
 997		list_del(&c->entry);
 998		if (unlikely(c != &rctx->chunk))
 999			kfree(c);
1000	}
1001	if (!err) {
1002		hv_ret = wait_for_tail(qp);
1003		if (hv_ret != HV_EOK)
1004			err = -EINVAL;
1005	}
1006
1007	spin_unlock_irqrestore(&qp->lock, flags);
1008
 
1009	put_cpu();
1010
1011out:
1012	n2_chunk_complete(req, NULL);
1013	return err;
1014}
1015
1016static int n2_encrypt_ecb(struct ablkcipher_request *req)
1017{
1018	return n2_do_ecb(req, true);
1019}
1020
1021static int n2_decrypt_ecb(struct ablkcipher_request *req)
1022{
1023	return n2_do_ecb(req, false);
1024}
1025
1026static int n2_do_chaining(struct ablkcipher_request *req, bool encrypt)
1027{
1028	struct n2_request_context *rctx = ablkcipher_request_ctx(req);
1029	struct crypto_tfm *tfm = req->base.tfm;
1030	unsigned long flags, hv_ret, iv_paddr;
1031	int err = n2_compute_chunks(req);
1032	struct n2_crypto_chunk *c, *tmp;
1033	struct spu_queue *qp;
1034	void *final_iv_addr;
1035
1036	final_iv_addr = NULL;
1037
1038	if (err)
1039		return err;
1040
1041	qp = cpu_to_cwq[get_cpu()];
1042	err = -ENODEV;
1043	if (!qp)
1044		goto out;
1045
1046	spin_lock_irqsave(&qp->lock, flags);
1047
1048	if (encrypt) {
1049		iv_paddr = __pa(rctx->walk.iv);
1050		list_for_each_entry_safe(c, tmp, &rctx->chunk_list,
1051					 entry) {
1052			c->iv_paddr = iv_paddr;
1053			err = __n2_crypt_chunk(tfm, c, qp, true);
1054			if (err)
1055				break;
1056			iv_paddr = c->dest_final - rctx->walk.blocksize;
1057			list_del(&c->entry);
1058			if (unlikely(c != &rctx->chunk))
1059				kfree(c);
1060		}
1061		final_iv_addr = __va(iv_paddr);
1062	} else {
1063		list_for_each_entry_safe_reverse(c, tmp, &rctx->chunk_list,
1064						 entry) {
1065			if (c == &rctx->chunk) {
1066				iv_paddr = __pa(rctx->walk.iv);
1067			} else {
1068				iv_paddr = (tmp->arr[tmp->arr_len-1].src_paddr +
1069					    tmp->arr[tmp->arr_len-1].src_len -
1070					    rctx->walk.blocksize);
1071			}
1072			if (!final_iv_addr) {
1073				unsigned long pa;
1074
1075				pa = (c->arr[c->arr_len-1].src_paddr +
1076				      c->arr[c->arr_len-1].src_len -
1077				      rctx->walk.blocksize);
1078				final_iv_addr = rctx->temp_iv;
1079				memcpy(rctx->temp_iv, __va(pa),
1080				       rctx->walk.blocksize);
1081			}
1082			c->iv_paddr = iv_paddr;
1083			err = __n2_crypt_chunk(tfm, c, qp, false);
1084			if (err)
1085				break;
1086			list_del(&c->entry);
1087			if (unlikely(c != &rctx->chunk))
1088				kfree(c);
1089		}
1090	}
1091	if (!err) {
1092		hv_ret = wait_for_tail(qp);
1093		if (hv_ret != HV_EOK)
1094			err = -EINVAL;
1095	}
1096
1097	spin_unlock_irqrestore(&qp->lock, flags);
1098
 
1099	put_cpu();
1100
1101out:
1102	n2_chunk_complete(req, err ? NULL : final_iv_addr);
1103	return err;
1104}
1105
1106static int n2_encrypt_chaining(struct ablkcipher_request *req)
1107{
1108	return n2_do_chaining(req, true);
1109}
1110
1111static int n2_decrypt_chaining(struct ablkcipher_request *req)
1112{
1113	return n2_do_chaining(req, false);
1114}
1115
1116struct n2_cipher_tmpl {
1117	const char		*name;
1118	const char		*drv_name;
1119	u8			block_size;
1120	u8			enc_type;
1121	struct ablkcipher_alg	ablkcipher;
1122};
1123
1124static const struct n2_cipher_tmpl cipher_tmpls[] = {
1125	/* ARC4: only ECB is supported (chaining bits ignored) */
1126	{	.name		= "ecb(arc4)",
1127		.drv_name	= "ecb-arc4",
1128		.block_size	= 1,
1129		.enc_type	= (ENC_TYPE_ALG_RC4_STREAM |
1130				   ENC_TYPE_CHAINING_ECB),
1131		.ablkcipher	= {
1132			.min_keysize	= 1,
1133			.max_keysize	= 256,
1134			.setkey		= n2_arc4_setkey,
1135			.encrypt	= n2_encrypt_ecb,
1136			.decrypt	= n2_decrypt_ecb,
1137		},
1138	},
1139
1140	/* DES: ECB CBC and CFB are supported */
1141	{	.name		= "ecb(des)",
1142		.drv_name	= "ecb-des",
1143		.block_size	= DES_BLOCK_SIZE,
1144		.enc_type	= (ENC_TYPE_ALG_DES |
1145				   ENC_TYPE_CHAINING_ECB),
1146		.ablkcipher	= {
1147			.min_keysize	= DES_KEY_SIZE,
1148			.max_keysize	= DES_KEY_SIZE,
1149			.setkey		= n2_des_setkey,
1150			.encrypt	= n2_encrypt_ecb,
1151			.decrypt	= n2_decrypt_ecb,
1152		},
1153	},
1154	{	.name		= "cbc(des)",
1155		.drv_name	= "cbc-des",
1156		.block_size	= DES_BLOCK_SIZE,
1157		.enc_type	= (ENC_TYPE_ALG_DES |
1158				   ENC_TYPE_CHAINING_CBC),
1159		.ablkcipher	= {
1160			.ivsize		= DES_BLOCK_SIZE,
1161			.min_keysize	= DES_KEY_SIZE,
1162			.max_keysize	= DES_KEY_SIZE,
1163			.setkey		= n2_des_setkey,
1164			.encrypt	= n2_encrypt_chaining,
1165			.decrypt	= n2_decrypt_chaining,
1166		},
1167	},
1168	{	.name		= "cfb(des)",
1169		.drv_name	= "cfb-des",
1170		.block_size	= DES_BLOCK_SIZE,
1171		.enc_type	= (ENC_TYPE_ALG_DES |
1172				   ENC_TYPE_CHAINING_CFB),
1173		.ablkcipher	= {
1174			.min_keysize	= DES_KEY_SIZE,
1175			.max_keysize	= DES_KEY_SIZE,
1176			.setkey		= n2_des_setkey,
1177			.encrypt	= n2_encrypt_chaining,
1178			.decrypt	= n2_decrypt_chaining,
1179		},
1180	},
1181
1182	/* 3DES: ECB CBC and CFB are supported */
1183	{	.name		= "ecb(des3_ede)",
1184		.drv_name	= "ecb-3des",
1185		.block_size	= DES_BLOCK_SIZE,
1186		.enc_type	= (ENC_TYPE_ALG_3DES |
1187				   ENC_TYPE_CHAINING_ECB),
1188		.ablkcipher	= {
1189			.min_keysize	= 3 * DES_KEY_SIZE,
1190			.max_keysize	= 3 * DES_KEY_SIZE,
1191			.setkey		= n2_3des_setkey,
1192			.encrypt	= n2_encrypt_ecb,
1193			.decrypt	= n2_decrypt_ecb,
1194		},
1195	},
1196	{	.name		= "cbc(des3_ede)",
1197		.drv_name	= "cbc-3des",
1198		.block_size	= DES_BLOCK_SIZE,
1199		.enc_type	= (ENC_TYPE_ALG_3DES |
1200				   ENC_TYPE_CHAINING_CBC),
1201		.ablkcipher	= {
1202			.ivsize		= DES_BLOCK_SIZE,
1203			.min_keysize	= 3 * DES_KEY_SIZE,
1204			.max_keysize	= 3 * DES_KEY_SIZE,
1205			.setkey		= n2_3des_setkey,
1206			.encrypt	= n2_encrypt_chaining,
1207			.decrypt	= n2_decrypt_chaining,
1208		},
1209	},
1210	{	.name		= "cfb(des3_ede)",
1211		.drv_name	= "cfb-3des",
1212		.block_size	= DES_BLOCK_SIZE,
1213		.enc_type	= (ENC_TYPE_ALG_3DES |
1214				   ENC_TYPE_CHAINING_CFB),
1215		.ablkcipher	= {
1216			.min_keysize	= 3 * DES_KEY_SIZE,
1217			.max_keysize	= 3 * DES_KEY_SIZE,
1218			.setkey		= n2_3des_setkey,
1219			.encrypt	= n2_encrypt_chaining,
1220			.decrypt	= n2_decrypt_chaining,
1221		},
1222	},
1223	/* AES: ECB CBC and CTR are supported */
1224	{	.name		= "ecb(aes)",
1225		.drv_name	= "ecb-aes",
1226		.block_size	= AES_BLOCK_SIZE,
1227		.enc_type	= (ENC_TYPE_ALG_AES128 |
1228				   ENC_TYPE_CHAINING_ECB),
1229		.ablkcipher	= {
1230			.min_keysize	= AES_MIN_KEY_SIZE,
1231			.max_keysize	= AES_MAX_KEY_SIZE,
1232			.setkey		= n2_aes_setkey,
1233			.encrypt	= n2_encrypt_ecb,
1234			.decrypt	= n2_decrypt_ecb,
1235		},
1236	},
1237	{	.name		= "cbc(aes)",
1238		.drv_name	= "cbc-aes",
1239		.block_size	= AES_BLOCK_SIZE,
1240		.enc_type	= (ENC_TYPE_ALG_AES128 |
1241				   ENC_TYPE_CHAINING_CBC),
1242		.ablkcipher	= {
1243			.ivsize		= AES_BLOCK_SIZE,
1244			.min_keysize	= AES_MIN_KEY_SIZE,
1245			.max_keysize	= AES_MAX_KEY_SIZE,
1246			.setkey		= n2_aes_setkey,
1247			.encrypt	= n2_encrypt_chaining,
1248			.decrypt	= n2_decrypt_chaining,
1249		},
1250	},
1251	{	.name		= "ctr(aes)",
1252		.drv_name	= "ctr-aes",
1253		.block_size	= AES_BLOCK_SIZE,
1254		.enc_type	= (ENC_TYPE_ALG_AES128 |
1255				   ENC_TYPE_CHAINING_COUNTER),
1256		.ablkcipher	= {
1257			.ivsize		= AES_BLOCK_SIZE,
1258			.min_keysize	= AES_MIN_KEY_SIZE,
1259			.max_keysize	= AES_MAX_KEY_SIZE,
1260			.setkey		= n2_aes_setkey,
1261			.encrypt	= n2_encrypt_chaining,
1262			.decrypt	= n2_encrypt_chaining,
1263		},
1264	},
1265
1266};
1267#define NUM_CIPHER_TMPLS ARRAY_SIZE(cipher_tmpls)
1268
1269static LIST_HEAD(cipher_algs);
1270
1271struct n2_hash_tmpl {
1272	const char	*name;
1273	const char	*hash_zero;
1274	const u32	*hash_init;
1275	u8		hw_op_hashsz;
1276	u8		digest_size;
 
1277	u8		block_size;
1278	u8		auth_type;
1279	u8		hmac_type;
1280};
1281
1282static const char md5_zero[MD5_DIGEST_SIZE] = {
1283	0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
1284	0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e,
1285};
1286static const u32 md5_init[MD5_HASH_WORDS] = {
1287	cpu_to_le32(0x67452301),
1288	cpu_to_le32(0xefcdab89),
1289	cpu_to_le32(0x98badcfe),
1290	cpu_to_le32(0x10325476),
1291};
1292static const char sha1_zero[SHA1_DIGEST_SIZE] = {
1293	0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32,
1294	0x55, 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8,
1295	0x07, 0x09
1296};
1297static const u32 sha1_init[SHA1_DIGEST_SIZE / 4] = {
1298	SHA1_H0, SHA1_H1, SHA1_H2, SHA1_H3, SHA1_H4,
1299};
1300static const char sha256_zero[SHA256_DIGEST_SIZE] = {
1301	0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a,
1302	0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae,
1303	0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99,
1304	0x1b, 0x78, 0x52, 0xb8, 0x55
1305};
1306static const u32 sha256_init[SHA256_DIGEST_SIZE / 4] = {
1307	SHA256_H0, SHA256_H1, SHA256_H2, SHA256_H3,
1308	SHA256_H4, SHA256_H5, SHA256_H6, SHA256_H7,
1309};
1310static const char sha224_zero[SHA224_DIGEST_SIZE] = {
1311	0xd1, 0x4a, 0x02, 0x8c, 0x2a, 0x3a, 0x2b, 0xc9, 0x47,
1312	0x61, 0x02, 0xbb, 0x28, 0x82, 0x34, 0xc4, 0x15, 0xa2,
1313	0xb0, 0x1f, 0x82, 0x8e, 0xa6, 0x2a, 0xc5, 0xb3, 0xe4,
1314	0x2f
1315};
1316static const u32 sha224_init[SHA256_DIGEST_SIZE / 4] = {
1317	SHA224_H0, SHA224_H1, SHA224_H2, SHA224_H3,
1318	SHA224_H4, SHA224_H5, SHA224_H6, SHA224_H7,
1319};
1320
1321static const struct n2_hash_tmpl hash_tmpls[] = {
1322	{ .name		= "md5",
1323	  .hash_zero	= md5_zero,
1324	  .hash_init	= md5_init,
1325	  .auth_type	= AUTH_TYPE_MD5,
1326	  .hmac_type	= AUTH_TYPE_HMAC_MD5,
1327	  .hw_op_hashsz	= MD5_DIGEST_SIZE,
1328	  .digest_size	= MD5_DIGEST_SIZE,
 
1329	  .block_size	= MD5_HMAC_BLOCK_SIZE },
1330	{ .name		= "sha1",
1331	  .hash_zero	= sha1_zero,
1332	  .hash_init	= sha1_init,
1333	  .auth_type	= AUTH_TYPE_SHA1,
1334	  .hmac_type	= AUTH_TYPE_HMAC_SHA1,
1335	  .hw_op_hashsz	= SHA1_DIGEST_SIZE,
1336	  .digest_size	= SHA1_DIGEST_SIZE,
 
1337	  .block_size	= SHA1_BLOCK_SIZE },
1338	{ .name		= "sha256",
1339	  .hash_zero	= sha256_zero,
1340	  .hash_init	= sha256_init,
1341	  .auth_type	= AUTH_TYPE_SHA256,
1342	  .hmac_type	= AUTH_TYPE_HMAC_SHA256,
1343	  .hw_op_hashsz	= SHA256_DIGEST_SIZE,
1344	  .digest_size	= SHA256_DIGEST_SIZE,
 
1345	  .block_size	= SHA256_BLOCK_SIZE },
1346	{ .name		= "sha224",
1347	  .hash_zero	= sha224_zero,
1348	  .hash_init	= sha224_init,
1349	  .auth_type	= AUTH_TYPE_SHA256,
1350	  .hmac_type	= AUTH_TYPE_RESERVED,
1351	  .hw_op_hashsz	= SHA256_DIGEST_SIZE,
1352	  .digest_size	= SHA224_DIGEST_SIZE,
 
1353	  .block_size	= SHA224_BLOCK_SIZE },
1354};
1355#define NUM_HASH_TMPLS ARRAY_SIZE(hash_tmpls)
1356
1357static LIST_HEAD(ahash_algs);
1358static LIST_HEAD(hmac_algs);
1359
1360static int algs_registered;
1361
1362static void __n2_unregister_algs(void)
1363{
1364	struct n2_cipher_alg *cipher, *cipher_tmp;
1365	struct n2_ahash_alg *alg, *alg_tmp;
1366	struct n2_hmac_alg *hmac, *hmac_tmp;
1367
1368	list_for_each_entry_safe(cipher, cipher_tmp, &cipher_algs, entry) {
1369		crypto_unregister_alg(&cipher->alg);
1370		list_del(&cipher->entry);
1371		kfree(cipher);
1372	}
1373	list_for_each_entry_safe(hmac, hmac_tmp, &hmac_algs, derived.entry) {
1374		crypto_unregister_ahash(&hmac->derived.alg);
1375		list_del(&hmac->derived.entry);
1376		kfree(hmac);
1377	}
1378	list_for_each_entry_safe(alg, alg_tmp, &ahash_algs, entry) {
1379		crypto_unregister_ahash(&alg->alg);
1380		list_del(&alg->entry);
1381		kfree(alg);
1382	}
1383}
1384
1385static int n2_cipher_cra_init(struct crypto_tfm *tfm)
1386{
1387	tfm->crt_ablkcipher.reqsize = sizeof(struct n2_request_context);
1388	return 0;
1389}
1390
1391static int __devinit __n2_register_one_cipher(const struct n2_cipher_tmpl *tmpl)
1392{
1393	struct n2_cipher_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1394	struct crypto_alg *alg;
1395	int err;
1396
1397	if (!p)
1398		return -ENOMEM;
1399
1400	alg = &p->alg;
 
1401
1402	snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s", tmpl->name);
1403	snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s-n2", tmpl->drv_name);
1404	alg->cra_priority = N2_CRA_PRIORITY;
1405	alg->cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC;
1406	alg->cra_blocksize = tmpl->block_size;
 
1407	p->enc_type = tmpl->enc_type;
1408	alg->cra_ctxsize = sizeof(struct n2_cipher_context);
1409	alg->cra_type = &crypto_ablkcipher_type;
1410	alg->cra_u.ablkcipher = tmpl->ablkcipher;
1411	alg->cra_init = n2_cipher_cra_init;
1412	alg->cra_module = THIS_MODULE;
1413
1414	list_add(&p->entry, &cipher_algs);
1415	err = crypto_register_alg(alg);
1416	if (err) {
1417		pr_err("%s alg registration failed\n", alg->cra_name);
1418		list_del(&p->entry);
1419		kfree(p);
1420	} else {
1421		pr_info("%s alg registered\n", alg->cra_name);
1422	}
1423	return err;
1424}
1425
1426static int __devinit __n2_register_one_hmac(struct n2_ahash_alg *n2ahash)
1427{
1428	struct n2_hmac_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1429	struct ahash_alg *ahash;
1430	struct crypto_alg *base;
1431	int err;
1432
1433	if (!p)
1434		return -ENOMEM;
1435
1436	p->child_alg = n2ahash->alg.halg.base.cra_name;
1437	memcpy(&p->derived, n2ahash, sizeof(struct n2_ahash_alg));
1438	INIT_LIST_HEAD(&p->derived.entry);
1439
1440	ahash = &p->derived.alg;
1441	ahash->digest = n2_hmac_async_digest;
1442	ahash->setkey = n2_hmac_async_setkey;
1443
1444	base = &ahash->halg.base;
1445	snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "hmac(%s)", p->child_alg);
1446	snprintf(base->cra_driver_name, CRYPTO_MAX_ALG_NAME, "hmac-%s-n2", p->child_alg);
 
 
 
 
 
1447
1448	base->cra_ctxsize = sizeof(struct n2_hmac_ctx);
1449	base->cra_init = n2_hmac_cra_init;
1450	base->cra_exit = n2_hmac_cra_exit;
1451
1452	list_add(&p->derived.entry, &hmac_algs);
1453	err = crypto_register_ahash(ahash);
1454	if (err) {
1455		pr_err("%s alg registration failed\n", base->cra_name);
1456		list_del(&p->derived.entry);
 
1457		kfree(p);
1458	} else {
1459		pr_info("%s alg registered\n", base->cra_name);
1460	}
1461	return err;
1462}
1463
1464static int __devinit __n2_register_one_ahash(const struct n2_hash_tmpl *tmpl)
1465{
1466	struct n2_ahash_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1467	struct hash_alg_common *halg;
1468	struct crypto_alg *base;
1469	struct ahash_alg *ahash;
1470	int err;
1471
1472	if (!p)
1473		return -ENOMEM;
1474
1475	p->hash_zero = tmpl->hash_zero;
1476	p->hash_init = tmpl->hash_init;
1477	p->auth_type = tmpl->auth_type;
1478	p->hmac_type = tmpl->hmac_type;
1479	p->hw_op_hashsz = tmpl->hw_op_hashsz;
1480	p->digest_size = tmpl->digest_size;
1481
1482	ahash = &p->alg;
1483	ahash->init = n2_hash_async_init;
1484	ahash->update = n2_hash_async_update;
1485	ahash->final = n2_hash_async_final;
1486	ahash->finup = n2_hash_async_finup;
1487	ahash->digest = n2_hash_async_digest;
 
 
1488
1489	halg = &ahash->halg;
1490	halg->digestsize = tmpl->digest_size;
 
1491
1492	base = &halg->base;
1493	snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "%s", tmpl->name);
1494	snprintf(base->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s-n2", tmpl->name);
1495	base->cra_priority = N2_CRA_PRIORITY;
1496	base->cra_flags = CRYPTO_ALG_TYPE_AHASH | CRYPTO_ALG_NEED_FALLBACK;
 
1497	base->cra_blocksize = tmpl->block_size;
1498	base->cra_ctxsize = sizeof(struct n2_hash_ctx);
1499	base->cra_module = THIS_MODULE;
1500	base->cra_init = n2_hash_cra_init;
1501	base->cra_exit = n2_hash_cra_exit;
1502
1503	list_add(&p->entry, &ahash_algs);
1504	err = crypto_register_ahash(ahash);
1505	if (err) {
1506		pr_err("%s alg registration failed\n", base->cra_name);
1507		list_del(&p->entry);
1508		kfree(p);
1509	} else {
1510		pr_info("%s alg registered\n", base->cra_name);
1511	}
1512	if (!err && p->hmac_type != AUTH_TYPE_RESERVED)
1513		err = __n2_register_one_hmac(p);
1514	return err;
1515}
1516
1517static int __devinit n2_register_algs(void)
1518{
1519	int i, err = 0;
1520
1521	mutex_lock(&spu_lock);
1522	if (algs_registered++)
1523		goto out;
1524
1525	for (i = 0; i < NUM_HASH_TMPLS; i++) {
1526		err = __n2_register_one_ahash(&hash_tmpls[i]);
1527		if (err) {
1528			__n2_unregister_algs();
1529			goto out;
1530		}
1531	}
1532	for (i = 0; i < NUM_CIPHER_TMPLS; i++) {
1533		err = __n2_register_one_cipher(&cipher_tmpls[i]);
1534		if (err) {
1535			__n2_unregister_algs();
1536			goto out;
1537		}
1538	}
1539
1540out:
1541	mutex_unlock(&spu_lock);
1542	return err;
1543}
1544
1545static void __devexit n2_unregister_algs(void)
1546{
1547	mutex_lock(&spu_lock);
1548	if (!--algs_registered)
1549		__n2_unregister_algs();
1550	mutex_unlock(&spu_lock);
1551}
1552
1553/* To map CWQ queues to interrupt sources, the hypervisor API provides
1554 * a devino.  This isn't very useful to us because all of the
1555 * interrupts listed in the device_node have been translated to
1556 * Linux virtual IRQ cookie numbers.
1557 *
1558 * So we have to back-translate, going through the 'intr' and 'ino'
1559 * property tables of the n2cp MDESC node, matching it with the OF
1560 * 'interrupts' property entries, in order to to figure out which
1561 * devino goes to which already-translated IRQ.
1562 */
1563static int find_devino_index(struct platform_device *dev, struct spu_mdesc_info *ip,
1564			     unsigned long dev_ino)
1565{
1566	const unsigned int *dev_intrs;
1567	unsigned int intr;
1568	int i;
1569
1570	for (i = 0; i < ip->num_intrs; i++) {
1571		if (ip->ino_table[i].ino == dev_ino)
1572			break;
1573	}
1574	if (i == ip->num_intrs)
1575		return -ENODEV;
1576
1577	intr = ip->ino_table[i].intr;
1578
1579	dev_intrs = of_get_property(dev->dev.of_node, "interrupts", NULL);
1580	if (!dev_intrs)
1581		return -ENODEV;
1582
1583	for (i = 0; i < dev->archdata.num_irqs; i++) {
1584		if (dev_intrs[i] == intr)
1585			return i;
1586	}
1587
1588	return -ENODEV;
1589}
1590
1591static int spu_map_ino(struct platform_device *dev, struct spu_mdesc_info *ip,
1592		       const char *irq_name, struct spu_queue *p,
1593		       irq_handler_t handler)
1594{
1595	unsigned long herr;
1596	int index;
1597
1598	herr = sun4v_ncs_qhandle_to_devino(p->qhandle, &p->devino);
1599	if (herr)
1600		return -EINVAL;
1601
1602	index = find_devino_index(dev, ip, p->devino);
1603	if (index < 0)
1604		return index;
1605
1606	p->irq = dev->archdata.irqs[index];
1607
1608	sprintf(p->irq_name, "%s-%d", irq_name, index);
1609
1610	return request_irq(p->irq, handler, IRQF_SAMPLE_RANDOM,
1611			   p->irq_name, p);
1612}
1613
1614static struct kmem_cache *queue_cache[2];
1615
1616static void *new_queue(unsigned long q_type)
1617{
1618	return kmem_cache_zalloc(queue_cache[q_type - 1], GFP_KERNEL);
1619}
1620
1621static void free_queue(void *p, unsigned long q_type)
1622{
1623	return kmem_cache_free(queue_cache[q_type - 1], p);
1624}
1625
1626static int queue_cache_init(void)
1627{
1628	if (!queue_cache[HV_NCS_QTYPE_MAU - 1])
1629		queue_cache[HV_NCS_QTYPE_MAU - 1] =
1630			kmem_cache_create("mau_queue",
1631					  (MAU_NUM_ENTRIES *
1632					   MAU_ENTRY_SIZE),
1633					  MAU_ENTRY_SIZE, 0, NULL);
1634	if (!queue_cache[HV_NCS_QTYPE_MAU - 1])
1635		return -ENOMEM;
1636
1637	if (!queue_cache[HV_NCS_QTYPE_CWQ - 1])
1638		queue_cache[HV_NCS_QTYPE_CWQ - 1] =
1639			kmem_cache_create("cwq_queue",
1640					  (CWQ_NUM_ENTRIES *
1641					   CWQ_ENTRY_SIZE),
1642					  CWQ_ENTRY_SIZE, 0, NULL);
1643	if (!queue_cache[HV_NCS_QTYPE_CWQ - 1]) {
1644		kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_MAU - 1]);
 
1645		return -ENOMEM;
1646	}
1647	return 0;
1648}
1649
1650static void queue_cache_destroy(void)
1651{
1652	kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_MAU - 1]);
1653	kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_CWQ - 1]);
 
 
1654}
1655
1656static int spu_queue_register(struct spu_queue *p, unsigned long q_type)
1657{
1658	cpumask_var_t old_allowed;
 
 
1659	unsigned long hv_ret;
1660
1661	if (cpumask_empty(&p->sharing))
1662		return -EINVAL;
1663
1664	if (!alloc_cpumask_var(&old_allowed, GFP_KERNEL))
1665		return -ENOMEM;
1666
1667	cpumask_copy(old_allowed, &current->cpus_allowed);
1668
1669	set_cpus_allowed_ptr(current, &p->sharing);
1670
1671	hv_ret = sun4v_ncs_qconf(q_type, __pa(p->q),
1672				 CWQ_NUM_ENTRIES, &p->qhandle);
1673	if (!hv_ret)
1674		sun4v_ncs_sethead_marker(p->qhandle, 0);
1675
1676	set_cpus_allowed_ptr(current, old_allowed);
 
1677
1678	free_cpumask_var(old_allowed);
 
 
 
1679
1680	return (hv_ret ? -EINVAL : 0);
1681}
1682
1683static int spu_queue_setup(struct spu_queue *p)
1684{
1685	int err;
1686
1687	p->q = new_queue(p->q_type);
1688	if (!p->q)
1689		return -ENOMEM;
1690
1691	err = spu_queue_register(p, p->q_type);
1692	if (err) {
1693		free_queue(p->q, p->q_type);
1694		p->q = NULL;
1695	}
1696
1697	return err;
1698}
1699
1700static void spu_queue_destroy(struct spu_queue *p)
1701{
1702	unsigned long hv_ret;
1703
1704	if (!p->q)
1705		return;
1706
1707	hv_ret = sun4v_ncs_qconf(p->q_type, p->qhandle, 0, &p->qhandle);
1708
1709	if (!hv_ret)
1710		free_queue(p->q, p->q_type);
1711}
1712
1713static void spu_list_destroy(struct list_head *list)
1714{
1715	struct spu_queue *p, *n;
1716
1717	list_for_each_entry_safe(p, n, list, list) {
1718		int i;
1719
1720		for (i = 0; i < NR_CPUS; i++) {
1721			if (cpu_to_cwq[i] == p)
1722				cpu_to_cwq[i] = NULL;
1723		}
1724
1725		if (p->irq) {
1726			free_irq(p->irq, p);
1727			p->irq = 0;
1728		}
1729		spu_queue_destroy(p);
1730		list_del(&p->list);
1731		kfree(p);
1732	}
1733}
1734
1735/* Walk the backward arcs of a CWQ 'exec-unit' node,
1736 * gathering cpu membership information.
1737 */
1738static int spu_mdesc_walk_arcs(struct mdesc_handle *mdesc,
1739			       struct platform_device *dev,
1740			       u64 node, struct spu_queue *p,
1741			       struct spu_queue **table)
1742{
1743	u64 arc;
1744
1745	mdesc_for_each_arc(arc, mdesc, node, MDESC_ARC_TYPE_BACK) {
1746		u64 tgt = mdesc_arc_target(mdesc, arc);
1747		const char *name = mdesc_node_name(mdesc, tgt);
1748		const u64 *id;
1749
1750		if (strcmp(name, "cpu"))
1751			continue;
1752		id = mdesc_get_property(mdesc, tgt, "id", NULL);
1753		if (table[*id] != NULL) {
1754			dev_err(&dev->dev, "%s: SPU cpu slot already set.\n",
1755				dev->dev.of_node->full_name);
1756			return -EINVAL;
1757		}
1758		cpu_set(*id, p->sharing);
1759		table[*id] = p;
1760	}
1761	return 0;
1762}
1763
1764/* Process an 'exec-unit' MDESC node of type 'cwq'.  */
1765static int handle_exec_unit(struct spu_mdesc_info *ip, struct list_head *list,
1766			    struct platform_device *dev, struct mdesc_handle *mdesc,
1767			    u64 node, const char *iname, unsigned long q_type,
1768			    irq_handler_t handler, struct spu_queue **table)
1769{
1770	struct spu_queue *p;
1771	int err;
1772
1773	p = kzalloc(sizeof(struct spu_queue), GFP_KERNEL);
1774	if (!p) {
1775		dev_err(&dev->dev, "%s: Could not allocate SPU queue.\n",
1776			dev->dev.of_node->full_name);
1777		return -ENOMEM;
1778	}
1779
1780	cpus_clear(p->sharing);
1781	spin_lock_init(&p->lock);
1782	p->q_type = q_type;
1783	INIT_LIST_HEAD(&p->jobs);
1784	list_add(&p->list, list);
1785
1786	err = spu_mdesc_walk_arcs(mdesc, dev, node, p, table);
1787	if (err)
1788		return err;
1789
1790	err = spu_queue_setup(p);
1791	if (err)
1792		return err;
1793
1794	return spu_map_ino(dev, ip, iname, p, handler);
1795}
1796
1797static int spu_mdesc_scan(struct mdesc_handle *mdesc, struct platform_device *dev,
1798			  struct spu_mdesc_info *ip, struct list_head *list,
1799			  const char *exec_name, unsigned long q_type,
1800			  irq_handler_t handler, struct spu_queue **table)
1801{
1802	int err = 0;
1803	u64 node;
1804
1805	mdesc_for_each_node_by_name(mdesc, node, "exec-unit") {
1806		const char *type;
1807
1808		type = mdesc_get_property(mdesc, node, "type", NULL);
1809		if (!type || strcmp(type, exec_name))
1810			continue;
1811
1812		err = handle_exec_unit(ip, list, dev, mdesc, node,
1813				       exec_name, q_type, handler, table);
1814		if (err) {
1815			spu_list_destroy(list);
1816			break;
1817		}
1818	}
1819
1820	return err;
1821}
1822
1823static int __devinit get_irq_props(struct mdesc_handle *mdesc, u64 node,
1824				   struct spu_mdesc_info *ip)
1825{
1826	const u64 *ino;
1827	int ino_len;
1828	int i;
1829
1830	ino = mdesc_get_property(mdesc, node, "ino", &ino_len);
1831	if (!ino) {
1832		printk("NO 'ino'\n");
1833		return -ENODEV;
1834	}
1835
1836	ip->num_intrs = ino_len / sizeof(u64);
1837	ip->ino_table = kzalloc((sizeof(struct ino_blob) *
1838				 ip->num_intrs),
1839				GFP_KERNEL);
1840	if (!ip->ino_table)
1841		return -ENOMEM;
1842
1843	for (i = 0; i < ip->num_intrs; i++) {
1844		struct ino_blob *b = &ip->ino_table[i];
1845		b->intr = i + 1;
1846		b->ino = ino[i];
1847	}
1848
1849	return 0;
1850}
1851
1852static int __devinit grab_mdesc_irq_props(struct mdesc_handle *mdesc,
1853					  struct platform_device *dev,
1854					  struct spu_mdesc_info *ip,
1855					  const char *node_name)
1856{
1857	const unsigned int *reg;
1858	u64 node;
1859
1860	reg = of_get_property(dev->dev.of_node, "reg", NULL);
1861	if (!reg)
1862		return -ENODEV;
1863
1864	mdesc_for_each_node_by_name(mdesc, node, "virtual-device") {
1865		const char *name;
1866		const u64 *chdl;
1867
1868		name = mdesc_get_property(mdesc, node, "name", NULL);
1869		if (!name || strcmp(name, node_name))
1870			continue;
1871		chdl = mdesc_get_property(mdesc, node, "cfg-handle", NULL);
1872		if (!chdl || (*chdl != *reg))
1873			continue;
1874		ip->cfg_handle = *chdl;
1875		return get_irq_props(mdesc, node, ip);
1876	}
1877
1878	return -ENODEV;
1879}
1880
1881static unsigned long n2_spu_hvapi_major;
1882static unsigned long n2_spu_hvapi_minor;
1883
1884static int __devinit n2_spu_hvapi_register(void)
1885{
1886	int err;
1887
1888	n2_spu_hvapi_major = 2;
1889	n2_spu_hvapi_minor = 0;
1890
1891	err = sun4v_hvapi_register(HV_GRP_NCS,
1892				   n2_spu_hvapi_major,
1893				   &n2_spu_hvapi_minor);
1894
1895	if (!err)
1896		pr_info("Registered NCS HVAPI version %lu.%lu\n",
1897			n2_spu_hvapi_major,
1898			n2_spu_hvapi_minor);
1899
1900	return err;
1901}
1902
1903static void n2_spu_hvapi_unregister(void)
1904{
1905	sun4v_hvapi_unregister(HV_GRP_NCS);
1906}
1907
1908static int global_ref;
1909
1910static int __devinit grab_global_resources(void)
1911{
1912	int err = 0;
1913
1914	mutex_lock(&spu_lock);
1915
1916	if (global_ref++)
1917		goto out;
1918
1919	err = n2_spu_hvapi_register();
1920	if (err)
1921		goto out;
1922
1923	err = queue_cache_init();
1924	if (err)
1925		goto out_hvapi_release;
1926
1927	err = -ENOMEM;
1928	cpu_to_cwq = kzalloc(sizeof(struct spu_queue *) * NR_CPUS,
1929			     GFP_KERNEL);
1930	if (!cpu_to_cwq)
1931		goto out_queue_cache_destroy;
1932
1933	cpu_to_mau = kzalloc(sizeof(struct spu_queue *) * NR_CPUS,
1934			     GFP_KERNEL);
1935	if (!cpu_to_mau)
1936		goto out_free_cwq_table;
1937
1938	err = 0;
1939
1940out:
1941	if (err)
1942		global_ref--;
1943	mutex_unlock(&spu_lock);
1944	return err;
1945
1946out_free_cwq_table:
1947	kfree(cpu_to_cwq);
1948	cpu_to_cwq = NULL;
1949
1950out_queue_cache_destroy:
1951	queue_cache_destroy();
1952
1953out_hvapi_release:
1954	n2_spu_hvapi_unregister();
1955	goto out;
1956}
1957
1958static void release_global_resources(void)
1959{
1960	mutex_lock(&spu_lock);
1961	if (!--global_ref) {
1962		kfree(cpu_to_cwq);
1963		cpu_to_cwq = NULL;
1964
1965		kfree(cpu_to_mau);
1966		cpu_to_mau = NULL;
1967
1968		queue_cache_destroy();
1969		n2_spu_hvapi_unregister();
1970	}
1971	mutex_unlock(&spu_lock);
1972}
1973
1974static struct n2_crypto * __devinit alloc_n2cp(void)
1975{
1976	struct n2_crypto *np = kzalloc(sizeof(struct n2_crypto), GFP_KERNEL);
1977
1978	if (np)
1979		INIT_LIST_HEAD(&np->cwq_list);
1980
1981	return np;
1982}
1983
1984static void free_n2cp(struct n2_crypto *np)
1985{
1986	if (np->cwq_info.ino_table) {
1987		kfree(np->cwq_info.ino_table);
1988		np->cwq_info.ino_table = NULL;
1989	}
1990
1991	kfree(np);
1992}
1993
1994static void __devinit n2_spu_driver_version(void)
1995{
1996	static int n2_spu_version_printed;
1997
1998	if (n2_spu_version_printed++ == 0)
1999		pr_info("%s", version);
2000}
2001
2002static int __devinit n2_crypto_probe(struct platform_device *dev)
2003{
2004	struct mdesc_handle *mdesc;
2005	const char *full_name;
2006	struct n2_crypto *np;
2007	int err;
2008
2009	n2_spu_driver_version();
2010
2011	full_name = dev->dev.of_node->full_name;
2012	pr_info("Found N2CP at %s\n", full_name);
2013
2014	np = alloc_n2cp();
2015	if (!np) {
2016		dev_err(&dev->dev, "%s: Unable to allocate n2cp.\n",
2017			full_name);
2018		return -ENOMEM;
2019	}
2020
2021	err = grab_global_resources();
2022	if (err) {
2023		dev_err(&dev->dev, "%s: Unable to grab "
2024			"global resources.\n", full_name);
2025		goto out_free_n2cp;
2026	}
2027
2028	mdesc = mdesc_grab();
2029
2030	if (!mdesc) {
2031		dev_err(&dev->dev, "%s: Unable to grab MDESC.\n",
2032			full_name);
2033		err = -ENODEV;
2034		goto out_free_global;
2035	}
2036	err = grab_mdesc_irq_props(mdesc, dev, &np->cwq_info, "n2cp");
2037	if (err) {
2038		dev_err(&dev->dev, "%s: Unable to grab IRQ props.\n",
2039			full_name);
2040		mdesc_release(mdesc);
2041		goto out_free_global;
2042	}
2043
2044	err = spu_mdesc_scan(mdesc, dev, &np->cwq_info, &np->cwq_list,
2045			     "cwq", HV_NCS_QTYPE_CWQ, cwq_intr,
2046			     cpu_to_cwq);
2047	mdesc_release(mdesc);
2048
2049	if (err) {
2050		dev_err(&dev->dev, "%s: CWQ MDESC scan failed.\n",
2051			full_name);
2052		goto out_free_global;
2053	}
2054
2055	err = n2_register_algs();
2056	if (err) {
2057		dev_err(&dev->dev, "%s: Unable to register algorithms.\n",
2058			full_name);
2059		goto out_free_spu_list;
2060	}
2061
2062	dev_set_drvdata(&dev->dev, np);
2063
2064	return 0;
2065
2066out_free_spu_list:
2067	spu_list_destroy(&np->cwq_list);
2068
2069out_free_global:
2070	release_global_resources();
2071
2072out_free_n2cp:
2073	free_n2cp(np);
2074
2075	return err;
2076}
2077
2078static int __devexit n2_crypto_remove(struct platform_device *dev)
2079{
2080	struct n2_crypto *np = dev_get_drvdata(&dev->dev);
2081
2082	n2_unregister_algs();
2083
2084	spu_list_destroy(&np->cwq_list);
2085
2086	release_global_resources();
2087
2088	free_n2cp(np);
2089
2090	return 0;
2091}
2092
2093static struct n2_mau * __devinit alloc_ncp(void)
2094{
2095	struct n2_mau *mp = kzalloc(sizeof(struct n2_mau), GFP_KERNEL);
2096
2097	if (mp)
2098		INIT_LIST_HEAD(&mp->mau_list);
2099
2100	return mp;
2101}
2102
2103static void free_ncp(struct n2_mau *mp)
2104{
2105	if (mp->mau_info.ino_table) {
2106		kfree(mp->mau_info.ino_table);
2107		mp->mau_info.ino_table = NULL;
2108	}
2109
2110	kfree(mp);
2111}
2112
2113static int __devinit n2_mau_probe(struct platform_device *dev)
2114{
2115	struct mdesc_handle *mdesc;
2116	const char *full_name;
2117	struct n2_mau *mp;
2118	int err;
2119
2120	n2_spu_driver_version();
2121
2122	full_name = dev->dev.of_node->full_name;
2123	pr_info("Found NCP at %s\n", full_name);
2124
2125	mp = alloc_ncp();
2126	if (!mp) {
2127		dev_err(&dev->dev, "%s: Unable to allocate ncp.\n",
2128			full_name);
2129		return -ENOMEM;
2130	}
2131
2132	err = grab_global_resources();
2133	if (err) {
2134		dev_err(&dev->dev, "%s: Unable to grab "
2135			"global resources.\n", full_name);
2136		goto out_free_ncp;
2137	}
2138
2139	mdesc = mdesc_grab();
2140
2141	if (!mdesc) {
2142		dev_err(&dev->dev, "%s: Unable to grab MDESC.\n",
2143			full_name);
2144		err = -ENODEV;
2145		goto out_free_global;
2146	}
2147
2148	err = grab_mdesc_irq_props(mdesc, dev, &mp->mau_info, "ncp");
2149	if (err) {
2150		dev_err(&dev->dev, "%s: Unable to grab IRQ props.\n",
2151			full_name);
2152		mdesc_release(mdesc);
2153		goto out_free_global;
2154	}
2155
2156	err = spu_mdesc_scan(mdesc, dev, &mp->mau_info, &mp->mau_list,
2157			     "mau", HV_NCS_QTYPE_MAU, mau_intr,
2158			     cpu_to_mau);
2159	mdesc_release(mdesc);
2160
2161	if (err) {
2162		dev_err(&dev->dev, "%s: MAU MDESC scan failed.\n",
2163			full_name);
2164		goto out_free_global;
2165	}
2166
2167	dev_set_drvdata(&dev->dev, mp);
2168
2169	return 0;
2170
2171out_free_global:
2172	release_global_resources();
2173
2174out_free_ncp:
2175	free_ncp(mp);
2176
2177	return err;
2178}
2179
2180static int __devexit n2_mau_remove(struct platform_device *dev)
2181{
2182	struct n2_mau *mp = dev_get_drvdata(&dev->dev);
2183
2184	spu_list_destroy(&mp->mau_list);
2185
2186	release_global_resources();
2187
2188	free_ncp(mp);
2189
2190	return 0;
2191}
2192
2193static struct of_device_id n2_crypto_match[] = {
2194	{
2195		.name = "n2cp",
2196		.compatible = "SUNW,n2-cwq",
2197	},
2198	{
2199		.name = "n2cp",
2200		.compatible = "SUNW,vf-cwq",
2201	},
2202	{
2203		.name = "n2cp",
2204		.compatible = "SUNW,kt-cwq",
2205	},
2206	{},
2207};
2208
2209MODULE_DEVICE_TABLE(of, n2_crypto_match);
2210
2211static struct platform_driver n2_crypto_driver = {
2212	.driver = {
2213		.name		=	"n2cp",
2214		.owner		=	THIS_MODULE,
2215		.of_match_table	=	n2_crypto_match,
2216	},
2217	.probe		=	n2_crypto_probe,
2218	.remove		=	__devexit_p(n2_crypto_remove),
2219};
2220
2221static struct of_device_id n2_mau_match[] = {
2222	{
2223		.name = "ncp",
2224		.compatible = "SUNW,n2-mau",
2225	},
2226	{
2227		.name = "ncp",
2228		.compatible = "SUNW,vf-mau",
2229	},
2230	{
2231		.name = "ncp",
2232		.compatible = "SUNW,kt-mau",
2233	},
2234	{},
2235};
2236
2237MODULE_DEVICE_TABLE(of, n2_mau_match);
2238
2239static struct platform_driver n2_mau_driver = {
2240	.driver = {
2241		.name		=	"ncp",
2242		.owner		=	THIS_MODULE,
2243		.of_match_table	=	n2_mau_match,
2244	},
2245	.probe		=	n2_mau_probe,
2246	.remove		=	__devexit_p(n2_mau_remove),
 
 
 
 
 
2247};
2248
2249static int __init n2_init(void)
2250{
2251	int err = platform_driver_register(&n2_crypto_driver);
2252
2253	if (!err) {
2254		err = platform_driver_register(&n2_mau_driver);
2255		if (err)
2256			platform_driver_unregister(&n2_crypto_driver);
2257	}
2258	return err;
2259}
2260
2261static void __exit n2_exit(void)
2262{
2263	platform_driver_unregister(&n2_mau_driver);
2264	platform_driver_unregister(&n2_crypto_driver);
2265}
2266
2267module_init(n2_init);
2268module_exit(n2_exit);