Linux Audio

Check our new training course

Loading...
v6.8
   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
 723struct n2_skcipher_request_context {
 724	struct skcipher_walk	walk;
 725};
 726
 727static int n2_aes_setkey(struct crypto_skcipher *skcipher, const u8 *key,
 728			 unsigned int keylen)
 729{
 730	struct crypto_tfm *tfm = crypto_skcipher_tfm(skcipher);
 731	struct n2_skcipher_context *ctx = crypto_tfm_ctx(tfm);
 732	struct n2_skcipher_alg *n2alg = n2_skcipher_alg(skcipher);
 733
 734	ctx->enc_type = (n2alg->enc_type & ENC_TYPE_CHAINING_MASK);
 735
 736	switch (keylen) {
 737	case AES_KEYSIZE_128:
 738		ctx->enc_type |= ENC_TYPE_ALG_AES128;
 739		break;
 740	case AES_KEYSIZE_192:
 741		ctx->enc_type |= ENC_TYPE_ALG_AES192;
 742		break;
 743	case AES_KEYSIZE_256:
 744		ctx->enc_type |= ENC_TYPE_ALG_AES256;
 745		break;
 746	default:
 
 747		return -EINVAL;
 748	}
 749
 750	ctx->key_len = keylen;
 751	memcpy(ctx->key.aes, key, keylen);
 752	return 0;
 753}
 754
 755static int n2_des_setkey(struct crypto_skcipher *skcipher, const u8 *key,
 756			 unsigned int keylen)
 757{
 758	struct crypto_tfm *tfm = crypto_skcipher_tfm(skcipher);
 759	struct n2_skcipher_context *ctx = crypto_tfm_ctx(tfm);
 760	struct n2_skcipher_alg *n2alg = n2_skcipher_alg(skcipher);
 
 761	int err;
 762
 763	err = verify_skcipher_des_key(skcipher, key);
 764	if (err)
 765		return err;
 766
 767	ctx->enc_type = n2alg->enc_type;
 768
 
 
 
 
 
 
 
 
 
 
 
 769	ctx->key_len = keylen;
 770	memcpy(ctx->key.des, key, keylen);
 771	return 0;
 772}
 773
 774static int n2_3des_setkey(struct crypto_skcipher *skcipher, const u8 *key,
 775			  unsigned int keylen)
 776{
 777	struct crypto_tfm *tfm = crypto_skcipher_tfm(skcipher);
 778	struct n2_skcipher_context *ctx = crypto_tfm_ctx(tfm);
 779	struct n2_skcipher_alg *n2alg = n2_skcipher_alg(skcipher);
 780	int err;
 781
 782	err = verify_skcipher_des3_key(skcipher, key);
 783	if (err)
 784		return err;
 785
 786	ctx->enc_type = n2alg->enc_type;
 787
 
 
 
 
 788	ctx->key_len = keylen;
 789	memcpy(ctx->key.des3, key, keylen);
 790	return 0;
 791}
 792
 793static inline int skcipher_descriptor_len(int nbytes, unsigned int block_size)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 794{
 795	int this_len = nbytes;
 796
 797	this_len -= (nbytes & (block_size - 1));
 798	return this_len > (1 << 16) ? (1 << 16) : this_len;
 799}
 800
 801static int __n2_crypt_chunk(struct crypto_skcipher *skcipher,
 802			    struct n2_crypto_chunk *cp,
 803			    struct spu_queue *qp, bool encrypt)
 804{
 805	struct n2_skcipher_context *ctx = crypto_skcipher_ctx(skcipher);
 806	struct cwq_initial_entry *ent;
 807	bool in_place;
 808	int i;
 809
 810	ent = spu_queue_alloc(qp, cp->arr_len);
 811	if (!ent) {
 812		pr_info("queue_alloc() of %d fails\n",
 813			cp->arr_len);
 814		return -EBUSY;
 815	}
 816
 817	in_place = (cp->dest_paddr == cp->arr[0].src_paddr);
 818
 819	ent->control = control_word_base(cp->arr[0].src_len,
 820					 0, ctx->enc_type, 0, 0,
 821					 false, true, false, encrypt,
 822					 OPCODE_ENCRYPT |
 823					 (in_place ? OPCODE_INPLACE_BIT : 0));
 824	ent->src_addr = cp->arr[0].src_paddr;
 825	ent->auth_key_addr = 0UL;
 826	ent->auth_iv_addr = 0UL;
 827	ent->final_auth_state_addr = 0UL;
 828	ent->enc_key_addr = __pa(&ctx->key);
 829	ent->enc_iv_addr = cp->iv_paddr;
 830	ent->dest_addr = (in_place ? 0UL : cp->dest_paddr);
 831
 832	for (i = 1; i < cp->arr_len; i++) {
 833		ent = spu_queue_next(qp, ent);
 834
 835		ent->control = cp->arr[i].src_len - 1;
 836		ent->src_addr = cp->arr[i].src_paddr;
 837		ent->auth_key_addr = 0UL;
 838		ent->auth_iv_addr = 0UL;
 839		ent->final_auth_state_addr = 0UL;
 840		ent->enc_key_addr = 0UL;
 841		ent->enc_iv_addr = 0UL;
 842		ent->dest_addr = 0UL;
 843	}
 844	ent->control |= CONTROL_END_OF_BLOCK;
 845
 846	return (spu_queue_submit(qp, ent) != HV_EOK) ? -EINVAL : 0;
 847}
 848
 849static int n2_compute_chunks(struct skcipher_request *req)
 850{
 851	struct n2_request_context *rctx = skcipher_request_ctx(req);
 852	struct skcipher_walk *walk = &rctx->walk;
 853	struct n2_crypto_chunk *chunk;
 854	unsigned long dest_prev;
 855	unsigned int tot_len;
 856	bool prev_in_place;
 857	int err, nbytes;
 858
 859	err = skcipher_walk_async(walk, req);
 
 860	if (err)
 861		return err;
 862
 863	INIT_LIST_HEAD(&rctx->chunk_list);
 864
 865	chunk = &rctx->chunk;
 866	INIT_LIST_HEAD(&chunk->entry);
 867
 868	chunk->iv_paddr = 0UL;
 869	chunk->arr_len = 0;
 870	chunk->dest_paddr = 0UL;
 871
 872	prev_in_place = false;
 873	dest_prev = ~0UL;
 874	tot_len = 0;
 875
 876	while ((nbytes = walk->nbytes) != 0) {
 877		unsigned long dest_paddr, src_paddr;
 878		bool in_place;
 879		int this_len;
 880
 881		src_paddr = (page_to_phys(walk->src.phys.page) +
 882			     walk->src.phys.offset);
 883		dest_paddr = (page_to_phys(walk->dst.phys.page) +
 884			      walk->dst.phys.offset);
 885		in_place = (src_paddr == dest_paddr);
 886		this_len = skcipher_descriptor_len(nbytes, walk->blocksize);
 887
 888		if (chunk->arr_len != 0) {
 889			if (in_place != prev_in_place ||
 890			    (!prev_in_place &&
 891			     dest_paddr != dest_prev) ||
 892			    chunk->arr_len == N2_CHUNK_ARR_LEN ||
 893			    tot_len + this_len > (1 << 16)) {
 894				chunk->dest_final = dest_prev;
 895				list_add_tail(&chunk->entry,
 896					      &rctx->chunk_list);
 897				chunk = kzalloc(sizeof(*chunk), GFP_ATOMIC);
 898				if (!chunk) {
 899					err = -ENOMEM;
 900					break;
 901				}
 902				INIT_LIST_HEAD(&chunk->entry);
 903			}
 904		}
 905		if (chunk->arr_len == 0) {
 906			chunk->dest_paddr = dest_paddr;
 907			tot_len = 0;
 908		}
 909		chunk->arr[chunk->arr_len].src_paddr = src_paddr;
 910		chunk->arr[chunk->arr_len].src_len = this_len;
 911		chunk->arr_len++;
 912
 913		dest_prev = dest_paddr + this_len;
 914		prev_in_place = in_place;
 915		tot_len += this_len;
 916
 917		err = skcipher_walk_done(walk, nbytes - this_len);
 918		if (err)
 919			break;
 920	}
 921	if (!err && chunk->arr_len != 0) {
 922		chunk->dest_final = dest_prev;
 923		list_add_tail(&chunk->entry, &rctx->chunk_list);
 924	}
 925
 926	return err;
 927}
 928
 929static void n2_chunk_complete(struct skcipher_request *req, void *final_iv)
 930{
 931	struct n2_request_context *rctx = skcipher_request_ctx(req);
 932	struct n2_crypto_chunk *c, *tmp;
 933
 934	if (final_iv)
 935		memcpy(rctx->walk.iv, final_iv, rctx->walk.blocksize);
 936
 
 937	list_for_each_entry_safe(c, tmp, &rctx->chunk_list, entry) {
 938		list_del(&c->entry);
 939		if (unlikely(c != &rctx->chunk))
 940			kfree(c);
 941	}
 942
 943}
 944
 945static int n2_do_ecb(struct skcipher_request *req, bool encrypt)
 946{
 947	struct n2_request_context *rctx = skcipher_request_ctx(req);
 948	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
 949	int err = n2_compute_chunks(req);
 950	struct n2_crypto_chunk *c, *tmp;
 951	unsigned long flags, hv_ret;
 952	struct spu_queue *qp;
 953
 954	if (err)
 955		return err;
 956
 957	qp = cpu_to_cwq[get_cpu()];
 958	err = -ENODEV;
 959	if (!qp)
 960		goto out;
 961
 962	spin_lock_irqsave(&qp->lock, flags);
 963
 964	list_for_each_entry_safe(c, tmp, &rctx->chunk_list, entry) {
 965		err = __n2_crypt_chunk(tfm, c, qp, encrypt);
 966		if (err)
 967			break;
 968		list_del(&c->entry);
 969		if (unlikely(c != &rctx->chunk))
 970			kfree(c);
 971	}
 972	if (!err) {
 973		hv_ret = wait_for_tail(qp);
 974		if (hv_ret != HV_EOK)
 975			err = -EINVAL;
 976	}
 977
 978	spin_unlock_irqrestore(&qp->lock, flags);
 979
 980out:
 981	put_cpu();
 982
 
 983	n2_chunk_complete(req, NULL);
 984	return err;
 985}
 986
 987static int n2_encrypt_ecb(struct skcipher_request *req)
 988{
 989	return n2_do_ecb(req, true);
 990}
 991
 992static int n2_decrypt_ecb(struct skcipher_request *req)
 993{
 994	return n2_do_ecb(req, false);
 995}
 996
 997static int n2_do_chaining(struct skcipher_request *req, bool encrypt)
 998{
 999	struct n2_request_context *rctx = skcipher_request_ctx(req);
1000	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
1001	unsigned long flags, hv_ret, iv_paddr;
1002	int err = n2_compute_chunks(req);
1003	struct n2_crypto_chunk *c, *tmp;
1004	struct spu_queue *qp;
1005	void *final_iv_addr;
1006
1007	final_iv_addr = NULL;
1008
1009	if (err)
1010		return err;
1011
1012	qp = cpu_to_cwq[get_cpu()];
1013	err = -ENODEV;
1014	if (!qp)
1015		goto out;
1016
1017	spin_lock_irqsave(&qp->lock, flags);
1018
1019	if (encrypt) {
1020		iv_paddr = __pa(rctx->walk.iv);
1021		list_for_each_entry_safe(c, tmp, &rctx->chunk_list,
1022					 entry) {
1023			c->iv_paddr = iv_paddr;
1024			err = __n2_crypt_chunk(tfm, c, qp, true);
1025			if (err)
1026				break;
1027			iv_paddr = c->dest_final - rctx->walk.blocksize;
1028			list_del(&c->entry);
1029			if (unlikely(c != &rctx->chunk))
1030				kfree(c);
1031		}
1032		final_iv_addr = __va(iv_paddr);
1033	} else {
1034		list_for_each_entry_safe_reverse(c, tmp, &rctx->chunk_list,
1035						 entry) {
1036			if (c == &rctx->chunk) {
1037				iv_paddr = __pa(rctx->walk.iv);
1038			} else {
1039				iv_paddr = (tmp->arr[tmp->arr_len-1].src_paddr +
1040					    tmp->arr[tmp->arr_len-1].src_len -
1041					    rctx->walk.blocksize);
1042			}
1043			if (!final_iv_addr) {
1044				unsigned long pa;
1045
1046				pa = (c->arr[c->arr_len-1].src_paddr +
1047				      c->arr[c->arr_len-1].src_len -
1048				      rctx->walk.blocksize);
1049				final_iv_addr = rctx->temp_iv;
1050				memcpy(rctx->temp_iv, __va(pa),
1051				       rctx->walk.blocksize);
1052			}
1053			c->iv_paddr = iv_paddr;
1054			err = __n2_crypt_chunk(tfm, c, qp, false);
1055			if (err)
1056				break;
1057			list_del(&c->entry);
1058			if (unlikely(c != &rctx->chunk))
1059				kfree(c);
1060		}
1061	}
1062	if (!err) {
1063		hv_ret = wait_for_tail(qp);
1064		if (hv_ret != HV_EOK)
1065			err = -EINVAL;
1066	}
1067
1068	spin_unlock_irqrestore(&qp->lock, flags);
1069
1070out:
1071	put_cpu();
1072
 
1073	n2_chunk_complete(req, err ? NULL : final_iv_addr);
1074	return err;
1075}
1076
1077static int n2_encrypt_chaining(struct skcipher_request *req)
1078{
1079	return n2_do_chaining(req, true);
1080}
1081
1082static int n2_decrypt_chaining(struct skcipher_request *req)
1083{
1084	return n2_do_chaining(req, false);
1085}
1086
1087struct n2_skcipher_tmpl {
1088	const char		*name;
1089	const char		*drv_name;
1090	u8			block_size;
1091	u8			enc_type;
1092	struct skcipher_alg	skcipher;
1093};
1094
1095static const struct n2_skcipher_tmpl skcipher_tmpls[] = {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1096	/* DES: ECB CBC and CFB are supported */
1097	{	.name		= "ecb(des)",
1098		.drv_name	= "ecb-des",
1099		.block_size	= DES_BLOCK_SIZE,
1100		.enc_type	= (ENC_TYPE_ALG_DES |
1101				   ENC_TYPE_CHAINING_ECB),
1102		.skcipher	= {
1103			.min_keysize	= DES_KEY_SIZE,
1104			.max_keysize	= DES_KEY_SIZE,
1105			.setkey		= n2_des_setkey,
1106			.encrypt	= n2_encrypt_ecb,
1107			.decrypt	= n2_decrypt_ecb,
1108		},
1109	},
1110	{	.name		= "cbc(des)",
1111		.drv_name	= "cbc-des",
1112		.block_size	= DES_BLOCK_SIZE,
1113		.enc_type	= (ENC_TYPE_ALG_DES |
1114				   ENC_TYPE_CHAINING_CBC),
1115		.skcipher	= {
1116			.ivsize		= DES_BLOCK_SIZE,
1117			.min_keysize	= DES_KEY_SIZE,
1118			.max_keysize	= DES_KEY_SIZE,
1119			.setkey		= n2_des_setkey,
1120			.encrypt	= n2_encrypt_chaining,
1121			.decrypt	= n2_decrypt_chaining,
1122		},
1123	},
 
 
 
 
 
 
 
 
 
 
 
 
 
1124
1125	/* 3DES: ECB CBC and CFB are supported */
1126	{	.name		= "ecb(des3_ede)",
1127		.drv_name	= "ecb-3des",
1128		.block_size	= DES_BLOCK_SIZE,
1129		.enc_type	= (ENC_TYPE_ALG_3DES |
1130				   ENC_TYPE_CHAINING_ECB),
1131		.skcipher	= {
1132			.min_keysize	= 3 * DES_KEY_SIZE,
1133			.max_keysize	= 3 * DES_KEY_SIZE,
1134			.setkey		= n2_3des_setkey,
1135			.encrypt	= n2_encrypt_ecb,
1136			.decrypt	= n2_decrypt_ecb,
1137		},
1138	},
1139	{	.name		= "cbc(des3_ede)",
1140		.drv_name	= "cbc-3des",
1141		.block_size	= DES_BLOCK_SIZE,
1142		.enc_type	= (ENC_TYPE_ALG_3DES |
1143				   ENC_TYPE_CHAINING_CBC),
1144		.skcipher	= {
1145			.ivsize		= DES_BLOCK_SIZE,
1146			.min_keysize	= 3 * DES_KEY_SIZE,
1147			.max_keysize	= 3 * DES_KEY_SIZE,
1148			.setkey		= n2_3des_setkey,
1149			.encrypt	= n2_encrypt_chaining,
1150			.decrypt	= n2_decrypt_chaining,
1151		},
1152	},
1153
 
 
 
 
 
 
 
 
 
 
 
 
1154	/* AES: ECB CBC and CTR are supported */
1155	{	.name		= "ecb(aes)",
1156		.drv_name	= "ecb-aes",
1157		.block_size	= AES_BLOCK_SIZE,
1158		.enc_type	= (ENC_TYPE_ALG_AES128 |
1159				   ENC_TYPE_CHAINING_ECB),
1160		.skcipher	= {
1161			.min_keysize	= AES_MIN_KEY_SIZE,
1162			.max_keysize	= AES_MAX_KEY_SIZE,
1163			.setkey		= n2_aes_setkey,
1164			.encrypt	= n2_encrypt_ecb,
1165			.decrypt	= n2_decrypt_ecb,
1166		},
1167	},
1168	{	.name		= "cbc(aes)",
1169		.drv_name	= "cbc-aes",
1170		.block_size	= AES_BLOCK_SIZE,
1171		.enc_type	= (ENC_TYPE_ALG_AES128 |
1172				   ENC_TYPE_CHAINING_CBC),
1173		.skcipher	= {
1174			.ivsize		= AES_BLOCK_SIZE,
1175			.min_keysize	= AES_MIN_KEY_SIZE,
1176			.max_keysize	= AES_MAX_KEY_SIZE,
1177			.setkey		= n2_aes_setkey,
1178			.encrypt	= n2_encrypt_chaining,
1179			.decrypt	= n2_decrypt_chaining,
1180		},
1181	},
1182	{	.name		= "ctr(aes)",
1183		.drv_name	= "ctr-aes",
1184		.block_size	= AES_BLOCK_SIZE,
1185		.enc_type	= (ENC_TYPE_ALG_AES128 |
1186				   ENC_TYPE_CHAINING_COUNTER),
1187		.skcipher	= {
1188			.ivsize		= AES_BLOCK_SIZE,
1189			.min_keysize	= AES_MIN_KEY_SIZE,
1190			.max_keysize	= AES_MAX_KEY_SIZE,
1191			.setkey		= n2_aes_setkey,
1192			.encrypt	= n2_encrypt_chaining,
1193			.decrypt	= n2_encrypt_chaining,
1194		},
1195	},
1196
1197};
1198#define NUM_CIPHER_TMPLS ARRAY_SIZE(skcipher_tmpls)
1199
1200static LIST_HEAD(skcipher_algs);
1201
1202struct n2_hash_tmpl {
1203	const char	*name;
1204	const u8	*hash_zero;
1205	const u8	*hash_init;
1206	u8		hw_op_hashsz;
1207	u8		digest_size;
1208	u8		statesize;
1209	u8		block_size;
1210	u8		auth_type;
1211	u8		hmac_type;
1212};
1213
1214static const __le32 n2_md5_init[MD5_HASH_WORDS] = {
1215	cpu_to_le32(MD5_H0),
1216	cpu_to_le32(MD5_H1),
1217	cpu_to_le32(MD5_H2),
1218	cpu_to_le32(MD5_H3),
 
 
 
 
 
 
 
 
 
1219};
1220static const u32 n2_sha1_init[SHA1_DIGEST_SIZE / 4] = {
1221	SHA1_H0, SHA1_H1, SHA1_H2, SHA1_H3, SHA1_H4,
1222};
1223static const u32 n2_sha256_init[SHA256_DIGEST_SIZE / 4] = {
 
 
 
 
 
 
1224	SHA256_H0, SHA256_H1, SHA256_H2, SHA256_H3,
1225	SHA256_H4, SHA256_H5, SHA256_H6, SHA256_H7,
1226};
1227static const u32 n2_sha224_init[SHA256_DIGEST_SIZE / 4] = {
 
 
 
 
 
 
1228	SHA224_H0, SHA224_H1, SHA224_H2, SHA224_H3,
1229	SHA224_H4, SHA224_H5, SHA224_H6, SHA224_H7,
1230};
1231
1232static const struct n2_hash_tmpl hash_tmpls[] = {
1233	{ .name		= "md5",
1234	  .hash_zero	= md5_zero_message_hash,
1235	  .hash_init	= (u8 *)n2_md5_init,
1236	  .auth_type	= AUTH_TYPE_MD5,
1237	  .hmac_type	= AUTH_TYPE_HMAC_MD5,
1238	  .hw_op_hashsz	= MD5_DIGEST_SIZE,
1239	  .digest_size	= MD5_DIGEST_SIZE,
1240	  .statesize	= sizeof(struct md5_state),
1241	  .block_size	= MD5_HMAC_BLOCK_SIZE },
1242	{ .name		= "sha1",
1243	  .hash_zero	= sha1_zero_message_hash,
1244	  .hash_init	= (u8 *)n2_sha1_init,
1245	  .auth_type	= AUTH_TYPE_SHA1,
1246	  .hmac_type	= AUTH_TYPE_HMAC_SHA1,
1247	  .hw_op_hashsz	= SHA1_DIGEST_SIZE,
1248	  .digest_size	= SHA1_DIGEST_SIZE,
1249	  .statesize	= sizeof(struct sha1_state),
1250	  .block_size	= SHA1_BLOCK_SIZE },
1251	{ .name		= "sha256",
1252	  .hash_zero	= sha256_zero_message_hash,
1253	  .hash_init	= (u8 *)n2_sha256_init,
1254	  .auth_type	= AUTH_TYPE_SHA256,
1255	  .hmac_type	= AUTH_TYPE_HMAC_SHA256,
1256	  .hw_op_hashsz	= SHA256_DIGEST_SIZE,
1257	  .digest_size	= SHA256_DIGEST_SIZE,
1258	  .statesize	= sizeof(struct sha256_state),
1259	  .block_size	= SHA256_BLOCK_SIZE },
1260	{ .name		= "sha224",
1261	  .hash_zero	= sha224_zero_message_hash,
1262	  .hash_init	= (u8 *)n2_sha224_init,
1263	  .auth_type	= AUTH_TYPE_SHA256,
1264	  .hmac_type	= AUTH_TYPE_RESERVED,
1265	  .hw_op_hashsz	= SHA256_DIGEST_SIZE,
1266	  .digest_size	= SHA224_DIGEST_SIZE,
1267	  .statesize	= sizeof(struct sha256_state),
1268	  .block_size	= SHA224_BLOCK_SIZE },
1269};
1270#define NUM_HASH_TMPLS ARRAY_SIZE(hash_tmpls)
1271
1272static LIST_HEAD(ahash_algs);
1273static LIST_HEAD(hmac_algs);
1274
1275static int algs_registered;
1276
1277static void __n2_unregister_algs(void)
1278{
1279	struct n2_skcipher_alg *skcipher, *skcipher_tmp;
1280	struct n2_ahash_alg *alg, *alg_tmp;
1281	struct n2_hmac_alg *hmac, *hmac_tmp;
1282
1283	list_for_each_entry_safe(skcipher, skcipher_tmp, &skcipher_algs, entry) {
1284		crypto_unregister_skcipher(&skcipher->skcipher);
1285		list_del(&skcipher->entry);
1286		kfree(skcipher);
1287	}
1288	list_for_each_entry_safe(hmac, hmac_tmp, &hmac_algs, derived.entry) {
1289		crypto_unregister_ahash(&hmac->derived.alg);
1290		list_del(&hmac->derived.entry);
1291		kfree(hmac);
1292	}
1293	list_for_each_entry_safe(alg, alg_tmp, &ahash_algs, entry) {
1294		crypto_unregister_ahash(&alg->alg);
1295		list_del(&alg->entry);
1296		kfree(alg);
1297	}
1298}
1299
1300static int n2_skcipher_init_tfm(struct crypto_skcipher *tfm)
1301{
1302	crypto_skcipher_set_reqsize(tfm, sizeof(struct n2_request_context));
1303	return 0;
1304}
1305
1306static int __n2_register_one_skcipher(const struct n2_skcipher_tmpl *tmpl)
1307{
1308	struct n2_skcipher_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1309	struct skcipher_alg *alg;
1310	int err;
1311
1312	if (!p)
1313		return -ENOMEM;
1314
1315	alg = &p->skcipher;
1316	*alg = tmpl->skcipher;
1317
1318	snprintf(alg->base.cra_name, CRYPTO_MAX_ALG_NAME, "%s", tmpl->name);
1319	snprintf(alg->base.cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s-n2", tmpl->drv_name);
1320	alg->base.cra_priority = N2_CRA_PRIORITY;
1321	alg->base.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY | CRYPTO_ALG_ASYNC |
1322			      CRYPTO_ALG_ALLOCATES_MEMORY;
1323	alg->base.cra_blocksize = tmpl->block_size;
1324	p->enc_type = tmpl->enc_type;
1325	alg->base.cra_ctxsize = sizeof(struct n2_skcipher_context);
1326	alg->base.cra_module = THIS_MODULE;
1327	alg->init = n2_skcipher_init_tfm;
 
 
1328
1329	list_add(&p->entry, &skcipher_algs);
1330	err = crypto_register_skcipher(alg);
1331	if (err) {
1332		pr_err("%s alg registration failed\n", alg->base.cra_name);
1333		list_del(&p->entry);
1334		kfree(p);
1335	} else {
1336		pr_info("%s alg registered\n", alg->base.cra_name);
1337	}
1338	return err;
1339}
1340
1341static int __n2_register_one_hmac(struct n2_ahash_alg *n2ahash)
1342{
1343	struct n2_hmac_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1344	struct ahash_alg *ahash;
1345	struct crypto_alg *base;
1346	int err;
1347
1348	if (!p)
1349		return -ENOMEM;
1350
1351	p->child_alg = n2ahash->alg.halg.base.cra_name;
1352	memcpy(&p->derived, n2ahash, sizeof(struct n2_ahash_alg));
1353	INIT_LIST_HEAD(&p->derived.entry);
1354
1355	ahash = &p->derived.alg;
1356	ahash->digest = n2_hmac_async_digest;
1357	ahash->setkey = n2_hmac_async_setkey;
1358
1359	base = &ahash->halg.base;
1360	if (snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "hmac(%s)",
1361		     p->child_alg) >= CRYPTO_MAX_ALG_NAME)
1362		goto out_free_p;
1363	if (snprintf(base->cra_driver_name, CRYPTO_MAX_ALG_NAME, "hmac-%s-n2",
1364		     p->child_alg) >= CRYPTO_MAX_ALG_NAME)
1365		goto out_free_p;
1366
1367	base->cra_ctxsize = sizeof(struct n2_hmac_ctx);
1368	base->cra_init = n2_hmac_cra_init;
1369	base->cra_exit = n2_hmac_cra_exit;
1370
1371	list_add(&p->derived.entry, &hmac_algs);
1372	err = crypto_register_ahash(ahash);
1373	if (err) {
1374		pr_err("%s alg registration failed\n", base->cra_name);
1375		list_del(&p->derived.entry);
1376out_free_p:
1377		kfree(p);
1378	} else {
1379		pr_info("%s alg registered\n", base->cra_name);
1380	}
1381	return err;
1382}
1383
1384static int __n2_register_one_ahash(const struct n2_hash_tmpl *tmpl)
1385{
1386	struct n2_ahash_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1387	struct hash_alg_common *halg;
1388	struct crypto_alg *base;
1389	struct ahash_alg *ahash;
1390	int err;
1391
1392	if (!p)
1393		return -ENOMEM;
1394
1395	p->hash_zero = tmpl->hash_zero;
1396	p->hash_init = tmpl->hash_init;
1397	p->auth_type = tmpl->auth_type;
1398	p->hmac_type = tmpl->hmac_type;
1399	p->hw_op_hashsz = tmpl->hw_op_hashsz;
1400	p->digest_size = tmpl->digest_size;
1401
1402	ahash = &p->alg;
1403	ahash->init = n2_hash_async_init;
1404	ahash->update = n2_hash_async_update;
1405	ahash->final = n2_hash_async_final;
1406	ahash->finup = n2_hash_async_finup;
1407	ahash->digest = n2_hash_async_digest;
1408	ahash->export = n2_hash_async_noexport;
1409	ahash->import = n2_hash_async_noimport;
1410
1411	halg = &ahash->halg;
1412	halg->digestsize = tmpl->digest_size;
1413	halg->statesize = tmpl->statesize;
1414
1415	base = &halg->base;
1416	snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "%s", tmpl->name);
1417	snprintf(base->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s-n2", tmpl->name);
1418	base->cra_priority = N2_CRA_PRIORITY;
1419	base->cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |
1420			  CRYPTO_ALG_NEED_FALLBACK;
1421	base->cra_blocksize = tmpl->block_size;
1422	base->cra_ctxsize = sizeof(struct n2_hash_ctx);
1423	base->cra_module = THIS_MODULE;
1424	base->cra_init = n2_hash_cra_init;
1425	base->cra_exit = n2_hash_cra_exit;
1426
1427	list_add(&p->entry, &ahash_algs);
1428	err = crypto_register_ahash(ahash);
1429	if (err) {
1430		pr_err("%s alg registration failed\n", base->cra_name);
1431		list_del(&p->entry);
1432		kfree(p);
1433	} else {
1434		pr_info("%s alg registered\n", base->cra_name);
1435	}
1436	if (!err && p->hmac_type != AUTH_TYPE_RESERVED)
1437		err = __n2_register_one_hmac(p);
1438	return err;
1439}
1440
1441static int n2_register_algs(void)
1442{
1443	int i, err = 0;
1444
1445	mutex_lock(&spu_lock);
1446	if (algs_registered++)
1447		goto out;
1448
1449	for (i = 0; i < NUM_HASH_TMPLS; i++) {
1450		err = __n2_register_one_ahash(&hash_tmpls[i]);
1451		if (err) {
1452			__n2_unregister_algs();
1453			goto out;
1454		}
1455	}
1456	for (i = 0; i < NUM_CIPHER_TMPLS; i++) {
1457		err = __n2_register_one_skcipher(&skcipher_tmpls[i]);
1458		if (err) {
1459			__n2_unregister_algs();
1460			goto out;
1461		}
1462	}
1463
1464out:
1465	mutex_unlock(&spu_lock);
1466	return err;
1467}
1468
1469static void n2_unregister_algs(void)
1470{
1471	mutex_lock(&spu_lock);
1472	if (!--algs_registered)
1473		__n2_unregister_algs();
1474	mutex_unlock(&spu_lock);
1475}
1476
1477/* To map CWQ queues to interrupt sources, the hypervisor API provides
1478 * a devino.  This isn't very useful to us because all of the
1479 * interrupts listed in the device_node have been translated to
1480 * Linux virtual IRQ cookie numbers.
1481 *
1482 * So we have to back-translate, going through the 'intr' and 'ino'
1483 * property tables of the n2cp MDESC node, matching it with the OF
1484 * 'interrupts' property entries, in order to figure out which
1485 * devino goes to which already-translated IRQ.
1486 */
1487static int find_devino_index(struct platform_device *dev, struct spu_mdesc_info *ip,
1488			     unsigned long dev_ino)
1489{
1490	const unsigned int *dev_intrs;
1491	unsigned int intr;
1492	int i;
1493
1494	for (i = 0; i < ip->num_intrs; i++) {
1495		if (ip->ino_table[i].ino == dev_ino)
1496			break;
1497	}
1498	if (i == ip->num_intrs)
1499		return -ENODEV;
1500
1501	intr = ip->ino_table[i].intr;
1502
1503	dev_intrs = of_get_property(dev->dev.of_node, "interrupts", NULL);
1504	if (!dev_intrs)
1505		return -ENODEV;
1506
1507	for (i = 0; i < dev->archdata.num_irqs; i++) {
1508		if (dev_intrs[i] == intr)
1509			return i;
1510	}
1511
1512	return -ENODEV;
1513}
1514
1515static int spu_map_ino(struct platform_device *dev, struct spu_mdesc_info *ip,
1516		       const char *irq_name, struct spu_queue *p,
1517		       irq_handler_t handler)
1518{
1519	unsigned long herr;
1520	int index;
1521
1522	herr = sun4v_ncs_qhandle_to_devino(p->qhandle, &p->devino);
1523	if (herr)
1524		return -EINVAL;
1525
1526	index = find_devino_index(dev, ip, p->devino);
1527	if (index < 0)
1528		return index;
1529
1530	p->irq = dev->archdata.irqs[index];
1531
1532	sprintf(p->irq_name, "%s-%d", irq_name, index);
1533
1534	return request_irq(p->irq, handler, 0, p->irq_name, p);
 
1535}
1536
1537static struct kmem_cache *queue_cache[2];
1538
1539static void *new_queue(unsigned long q_type)
1540{
1541	return kmem_cache_zalloc(queue_cache[q_type - 1], GFP_KERNEL);
1542}
1543
1544static void free_queue(void *p, unsigned long q_type)
1545{
1546	kmem_cache_free(queue_cache[q_type - 1], p);
1547}
1548
1549static int queue_cache_init(void)
1550{
1551	if (!queue_cache[HV_NCS_QTYPE_MAU - 1])
1552		queue_cache[HV_NCS_QTYPE_MAU - 1] =
1553			kmem_cache_create("mau_queue",
1554					  (MAU_NUM_ENTRIES *
1555					   MAU_ENTRY_SIZE),
1556					  MAU_ENTRY_SIZE, 0, NULL);
1557	if (!queue_cache[HV_NCS_QTYPE_MAU - 1])
1558		return -ENOMEM;
1559
1560	if (!queue_cache[HV_NCS_QTYPE_CWQ - 1])
1561		queue_cache[HV_NCS_QTYPE_CWQ - 1] =
1562			kmem_cache_create("cwq_queue",
1563					  (CWQ_NUM_ENTRIES *
1564					   CWQ_ENTRY_SIZE),
1565					  CWQ_ENTRY_SIZE, 0, NULL);
1566	if (!queue_cache[HV_NCS_QTYPE_CWQ - 1]) {
1567		kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_MAU - 1]);
1568		queue_cache[HV_NCS_QTYPE_MAU - 1] = NULL;
1569		return -ENOMEM;
1570	}
1571	return 0;
1572}
1573
1574static void queue_cache_destroy(void)
1575{
1576	kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_MAU - 1]);
1577	kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_CWQ - 1]);
1578	queue_cache[HV_NCS_QTYPE_MAU - 1] = NULL;
1579	queue_cache[HV_NCS_QTYPE_CWQ - 1] = NULL;
1580}
1581
1582static long spu_queue_register_workfn(void *arg)
1583{
1584	struct spu_qreg *qr = arg;
1585	struct spu_queue *p = qr->queue;
1586	unsigned long q_type = qr->type;
1587	unsigned long hv_ret;
1588
 
 
 
 
 
 
 
 
 
 
1589	hv_ret = sun4v_ncs_qconf(q_type, __pa(p->q),
1590				 CWQ_NUM_ENTRIES, &p->qhandle);
1591	if (!hv_ret)
1592		sun4v_ncs_sethead_marker(p->qhandle, 0);
1593
1594	return hv_ret ? -EINVAL : 0;
1595}
1596
1597static int spu_queue_register(struct spu_queue *p, unsigned long q_type)
1598{
1599	int cpu = cpumask_any_and(&p->sharing, cpu_online_mask);
1600	struct spu_qreg qr = { .queue = p, .type = q_type };
1601
1602	return work_on_cpu_safe(cpu, spu_queue_register_workfn, &qr);
1603}
1604
1605static int spu_queue_setup(struct spu_queue *p)
1606{
1607	int err;
1608
1609	p->q = new_queue(p->q_type);
1610	if (!p->q)
1611		return -ENOMEM;
1612
1613	err = spu_queue_register(p, p->q_type);
1614	if (err) {
1615		free_queue(p->q, p->q_type);
1616		p->q = NULL;
1617	}
1618
1619	return err;
1620}
1621
1622static void spu_queue_destroy(struct spu_queue *p)
1623{
1624	unsigned long hv_ret;
1625
1626	if (!p->q)
1627		return;
1628
1629	hv_ret = sun4v_ncs_qconf(p->q_type, p->qhandle, 0, &p->qhandle);
1630
1631	if (!hv_ret)
1632		free_queue(p->q, p->q_type);
1633}
1634
1635static void spu_list_destroy(struct list_head *list)
1636{
1637	struct spu_queue *p, *n;
1638
1639	list_for_each_entry_safe(p, n, list, list) {
1640		int i;
1641
1642		for (i = 0; i < NR_CPUS; i++) {
1643			if (cpu_to_cwq[i] == p)
1644				cpu_to_cwq[i] = NULL;
1645		}
1646
1647		if (p->irq) {
1648			free_irq(p->irq, p);
1649			p->irq = 0;
1650		}
1651		spu_queue_destroy(p);
1652		list_del(&p->list);
1653		kfree(p);
1654	}
1655}
1656
1657/* Walk the backward arcs of a CWQ 'exec-unit' node,
1658 * gathering cpu membership information.
1659 */
1660static int spu_mdesc_walk_arcs(struct mdesc_handle *mdesc,
1661			       struct platform_device *dev,
1662			       u64 node, struct spu_queue *p,
1663			       struct spu_queue **table)
1664{
1665	u64 arc;
1666
1667	mdesc_for_each_arc(arc, mdesc, node, MDESC_ARC_TYPE_BACK) {
1668		u64 tgt = mdesc_arc_target(mdesc, arc);
1669		const char *name = mdesc_node_name(mdesc, tgt);
1670		const u64 *id;
1671
1672		if (strcmp(name, "cpu"))
1673			continue;
1674		id = mdesc_get_property(mdesc, tgt, "id", NULL);
1675		if (table[*id] != NULL) {
1676			dev_err(&dev->dev, "%pOF: SPU cpu slot already set.\n",
1677				dev->dev.of_node);
1678			return -EINVAL;
1679		}
1680		cpumask_set_cpu(*id, &p->sharing);
1681		table[*id] = p;
1682	}
1683	return 0;
1684}
1685
1686/* Process an 'exec-unit' MDESC node of type 'cwq'.  */
1687static int handle_exec_unit(struct spu_mdesc_info *ip, struct list_head *list,
1688			    struct platform_device *dev, struct mdesc_handle *mdesc,
1689			    u64 node, const char *iname, unsigned long q_type,
1690			    irq_handler_t handler, struct spu_queue **table)
1691{
1692	struct spu_queue *p;
1693	int err;
1694
1695	p = kzalloc(sizeof(struct spu_queue), GFP_KERNEL);
1696	if (!p) {
1697		dev_err(&dev->dev, "%pOF: Could not allocate SPU queue.\n",
1698			dev->dev.of_node);
1699		return -ENOMEM;
1700	}
1701
1702	cpumask_clear(&p->sharing);
1703	spin_lock_init(&p->lock);
1704	p->q_type = q_type;
1705	INIT_LIST_HEAD(&p->jobs);
1706	list_add(&p->list, list);
1707
1708	err = spu_mdesc_walk_arcs(mdesc, dev, node, p, table);
1709	if (err)
1710		return err;
1711
1712	err = spu_queue_setup(p);
1713	if (err)
1714		return err;
1715
1716	return spu_map_ino(dev, ip, iname, p, handler);
1717}
1718
1719static int spu_mdesc_scan(struct mdesc_handle *mdesc, struct platform_device *dev,
1720			  struct spu_mdesc_info *ip, struct list_head *list,
1721			  const char *exec_name, unsigned long q_type,
1722			  irq_handler_t handler, struct spu_queue **table)
1723{
1724	int err = 0;
1725	u64 node;
1726
1727	mdesc_for_each_node_by_name(mdesc, node, "exec-unit") {
1728		const char *type;
1729
1730		type = mdesc_get_property(mdesc, node, "type", NULL);
1731		if (!type || strcmp(type, exec_name))
1732			continue;
1733
1734		err = handle_exec_unit(ip, list, dev, mdesc, node,
1735				       exec_name, q_type, handler, table);
1736		if (err) {
1737			spu_list_destroy(list);
1738			break;
1739		}
1740	}
1741
1742	return err;
1743}
1744
1745static int get_irq_props(struct mdesc_handle *mdesc, u64 node,
1746			 struct spu_mdesc_info *ip)
1747{
1748	const u64 *ino;
1749	int ino_len;
1750	int i;
1751
1752	ino = mdesc_get_property(mdesc, node, "ino", &ino_len);
1753	if (!ino) {
1754		printk("NO 'ino'\n");
1755		return -ENODEV;
1756	}
1757
1758	ip->num_intrs = ino_len / sizeof(u64);
1759	ip->ino_table = kzalloc((sizeof(struct ino_blob) *
1760				 ip->num_intrs),
1761				GFP_KERNEL);
1762	if (!ip->ino_table)
1763		return -ENOMEM;
1764
1765	for (i = 0; i < ip->num_intrs; i++) {
1766		struct ino_blob *b = &ip->ino_table[i];
1767		b->intr = i + 1;
1768		b->ino = ino[i];
1769	}
1770
1771	return 0;
1772}
1773
1774static int grab_mdesc_irq_props(struct mdesc_handle *mdesc,
1775				struct platform_device *dev,
1776				struct spu_mdesc_info *ip,
1777				const char *node_name)
1778{
1779	u64 node, reg;
 
1780
1781	if (of_property_read_reg(dev->dev.of_node, 0, &reg, NULL) < 0)
 
1782		return -ENODEV;
1783
1784	mdesc_for_each_node_by_name(mdesc, node, "virtual-device") {
1785		const char *name;
1786		const u64 *chdl;
1787
1788		name = mdesc_get_property(mdesc, node, "name", NULL);
1789		if (!name || strcmp(name, node_name))
1790			continue;
1791		chdl = mdesc_get_property(mdesc, node, "cfg-handle", NULL);
1792		if (!chdl || (*chdl != reg))
1793			continue;
1794		ip->cfg_handle = *chdl;
1795		return get_irq_props(mdesc, node, ip);
1796	}
1797
1798	return -ENODEV;
1799}
1800
1801static unsigned long n2_spu_hvapi_major;
1802static unsigned long n2_spu_hvapi_minor;
1803
1804static int n2_spu_hvapi_register(void)
1805{
1806	int err;
1807
1808	n2_spu_hvapi_major = 2;
1809	n2_spu_hvapi_minor = 0;
1810
1811	err = sun4v_hvapi_register(HV_GRP_NCS,
1812				   n2_spu_hvapi_major,
1813				   &n2_spu_hvapi_minor);
1814
1815	if (!err)
1816		pr_info("Registered NCS HVAPI version %lu.%lu\n",
1817			n2_spu_hvapi_major,
1818			n2_spu_hvapi_minor);
1819
1820	return err;
1821}
1822
1823static void n2_spu_hvapi_unregister(void)
1824{
1825	sun4v_hvapi_unregister(HV_GRP_NCS);
1826}
1827
1828static int global_ref;
1829
1830static int grab_global_resources(void)
1831{
1832	int err = 0;
1833
1834	mutex_lock(&spu_lock);
1835
1836	if (global_ref++)
1837		goto out;
1838
1839	err = n2_spu_hvapi_register();
1840	if (err)
1841		goto out;
1842
1843	err = queue_cache_init();
1844	if (err)
1845		goto out_hvapi_release;
1846
1847	err = -ENOMEM;
1848	cpu_to_cwq = kcalloc(NR_CPUS, sizeof(struct spu_queue *),
1849			     GFP_KERNEL);
1850	if (!cpu_to_cwq)
1851		goto out_queue_cache_destroy;
1852
1853	cpu_to_mau = kcalloc(NR_CPUS, sizeof(struct spu_queue *),
1854			     GFP_KERNEL);
1855	if (!cpu_to_mau)
1856		goto out_free_cwq_table;
1857
1858	err = 0;
1859
1860out:
1861	if (err)
1862		global_ref--;
1863	mutex_unlock(&spu_lock);
1864	return err;
1865
1866out_free_cwq_table:
1867	kfree(cpu_to_cwq);
1868	cpu_to_cwq = NULL;
1869
1870out_queue_cache_destroy:
1871	queue_cache_destroy();
1872
1873out_hvapi_release:
1874	n2_spu_hvapi_unregister();
1875	goto out;
1876}
1877
1878static void release_global_resources(void)
1879{
1880	mutex_lock(&spu_lock);
1881	if (!--global_ref) {
1882		kfree(cpu_to_cwq);
1883		cpu_to_cwq = NULL;
1884
1885		kfree(cpu_to_mau);
1886		cpu_to_mau = NULL;
1887
1888		queue_cache_destroy();
1889		n2_spu_hvapi_unregister();
1890	}
1891	mutex_unlock(&spu_lock);
1892}
1893
1894static struct n2_crypto *alloc_n2cp(void)
1895{
1896	struct n2_crypto *np = kzalloc(sizeof(struct n2_crypto), GFP_KERNEL);
1897
1898	if (np)
1899		INIT_LIST_HEAD(&np->cwq_list);
1900
1901	return np;
1902}
1903
1904static void free_n2cp(struct n2_crypto *np)
1905{
1906	kfree(np->cwq_info.ino_table);
1907	np->cwq_info.ino_table = NULL;
 
 
1908
1909	kfree(np);
1910}
1911
1912static void n2_spu_driver_version(void)
1913{
1914	static int n2_spu_version_printed;
1915
1916	if (n2_spu_version_printed++ == 0)
1917		pr_info("%s", version);
1918}
1919
1920static int n2_crypto_probe(struct platform_device *dev)
1921{
1922	struct mdesc_handle *mdesc;
 
1923	struct n2_crypto *np;
1924	int err;
1925
1926	n2_spu_driver_version();
1927
1928	pr_info("Found N2CP at %pOF\n", dev->dev.of_node);
 
1929
1930	np = alloc_n2cp();
1931	if (!np) {
1932		dev_err(&dev->dev, "%pOF: Unable to allocate n2cp.\n",
1933			dev->dev.of_node);
1934		return -ENOMEM;
1935	}
1936
1937	err = grab_global_resources();
1938	if (err) {
1939		dev_err(&dev->dev, "%pOF: Unable to grab global resources.\n",
1940			dev->dev.of_node);
1941		goto out_free_n2cp;
1942	}
1943
1944	mdesc = mdesc_grab();
1945
1946	if (!mdesc) {
1947		dev_err(&dev->dev, "%pOF: Unable to grab MDESC.\n",
1948			dev->dev.of_node);
1949		err = -ENODEV;
1950		goto out_free_global;
1951	}
1952	err = grab_mdesc_irq_props(mdesc, dev, &np->cwq_info, "n2cp");
1953	if (err) {
1954		dev_err(&dev->dev, "%pOF: Unable to grab IRQ props.\n",
1955			dev->dev.of_node);
1956		mdesc_release(mdesc);
1957		goto out_free_global;
1958	}
1959
1960	err = spu_mdesc_scan(mdesc, dev, &np->cwq_info, &np->cwq_list,
1961			     "cwq", HV_NCS_QTYPE_CWQ, cwq_intr,
1962			     cpu_to_cwq);
1963	mdesc_release(mdesc);
1964
1965	if (err) {
1966		dev_err(&dev->dev, "%pOF: CWQ MDESC scan failed.\n",
1967			dev->dev.of_node);
1968		goto out_free_global;
1969	}
1970
1971	err = n2_register_algs();
1972	if (err) {
1973		dev_err(&dev->dev, "%pOF: Unable to register algorithms.\n",
1974			dev->dev.of_node);
1975		goto out_free_spu_list;
1976	}
1977
1978	dev_set_drvdata(&dev->dev, np);
1979
1980	return 0;
1981
1982out_free_spu_list:
1983	spu_list_destroy(&np->cwq_list);
1984
1985out_free_global:
1986	release_global_resources();
1987
1988out_free_n2cp:
1989	free_n2cp(np);
1990
1991	return err;
1992}
1993
1994static void n2_crypto_remove(struct platform_device *dev)
1995{
1996	struct n2_crypto *np = dev_get_drvdata(&dev->dev);
1997
1998	n2_unregister_algs();
1999
2000	spu_list_destroy(&np->cwq_list);
2001
2002	release_global_resources();
2003
2004	free_n2cp(np);
 
 
2005}
2006
2007static struct n2_mau *alloc_ncp(void)
2008{
2009	struct n2_mau *mp = kzalloc(sizeof(struct n2_mau), GFP_KERNEL);
2010
2011	if (mp)
2012		INIT_LIST_HEAD(&mp->mau_list);
2013
2014	return mp;
2015}
2016
2017static void free_ncp(struct n2_mau *mp)
2018{
2019	kfree(mp->mau_info.ino_table);
2020	mp->mau_info.ino_table = NULL;
 
 
2021
2022	kfree(mp);
2023}
2024
2025static int n2_mau_probe(struct platform_device *dev)
2026{
2027	struct mdesc_handle *mdesc;
 
2028	struct n2_mau *mp;
2029	int err;
2030
2031	n2_spu_driver_version();
2032
2033	pr_info("Found NCP at %pOF\n", dev->dev.of_node);
 
2034
2035	mp = alloc_ncp();
2036	if (!mp) {
2037		dev_err(&dev->dev, "%pOF: Unable to allocate ncp.\n",
2038			dev->dev.of_node);
2039		return -ENOMEM;
2040	}
2041
2042	err = grab_global_resources();
2043	if (err) {
2044		dev_err(&dev->dev, "%pOF: Unable to grab global resources.\n",
2045			dev->dev.of_node);
2046		goto out_free_ncp;
2047	}
2048
2049	mdesc = mdesc_grab();
2050
2051	if (!mdesc) {
2052		dev_err(&dev->dev, "%pOF: Unable to grab MDESC.\n",
2053			dev->dev.of_node);
2054		err = -ENODEV;
2055		goto out_free_global;
2056	}
2057
2058	err = grab_mdesc_irq_props(mdesc, dev, &mp->mau_info, "ncp");
2059	if (err) {
2060		dev_err(&dev->dev, "%pOF: Unable to grab IRQ props.\n",
2061			dev->dev.of_node);
2062		mdesc_release(mdesc);
2063		goto out_free_global;
2064	}
2065
2066	err = spu_mdesc_scan(mdesc, dev, &mp->mau_info, &mp->mau_list,
2067			     "mau", HV_NCS_QTYPE_MAU, mau_intr,
2068			     cpu_to_mau);
2069	mdesc_release(mdesc);
2070
2071	if (err) {
2072		dev_err(&dev->dev, "%pOF: MAU MDESC scan failed.\n",
2073			dev->dev.of_node);
2074		goto out_free_global;
2075	}
2076
2077	dev_set_drvdata(&dev->dev, mp);
2078
2079	return 0;
2080
2081out_free_global:
2082	release_global_resources();
2083
2084out_free_ncp:
2085	free_ncp(mp);
2086
2087	return err;
2088}
2089
2090static void n2_mau_remove(struct platform_device *dev)
2091{
2092	struct n2_mau *mp = dev_get_drvdata(&dev->dev);
2093
2094	spu_list_destroy(&mp->mau_list);
2095
2096	release_global_resources();
2097
2098	free_ncp(mp);
 
 
2099}
2100
2101static const struct of_device_id n2_crypto_match[] = {
2102	{
2103		.name = "n2cp",
2104		.compatible = "SUNW,n2-cwq",
2105	},
2106	{
2107		.name = "n2cp",
2108		.compatible = "SUNW,vf-cwq",
2109	},
2110	{
2111		.name = "n2cp",
2112		.compatible = "SUNW,kt-cwq",
2113	},
2114	{},
2115};
2116
2117MODULE_DEVICE_TABLE(of, n2_crypto_match);
2118
2119static struct platform_driver n2_crypto_driver = {
2120	.driver = {
2121		.name		=	"n2cp",
 
2122		.of_match_table	=	n2_crypto_match,
2123	},
2124	.probe		=	n2_crypto_probe,
2125	.remove_new	=	n2_crypto_remove,
2126};
2127
2128static const struct of_device_id n2_mau_match[] = {
2129	{
2130		.name = "ncp",
2131		.compatible = "SUNW,n2-mau",
2132	},
2133	{
2134		.name = "ncp",
2135		.compatible = "SUNW,vf-mau",
2136	},
2137	{
2138		.name = "ncp",
2139		.compatible = "SUNW,kt-mau",
2140	},
2141	{},
2142};
2143
2144MODULE_DEVICE_TABLE(of, n2_mau_match);
2145
2146static struct platform_driver n2_mau_driver = {
2147	.driver = {
2148		.name		=	"ncp",
 
2149		.of_match_table	=	n2_mau_match,
2150	},
2151	.probe		=	n2_mau_probe,
2152	.remove_new	=	n2_mau_remove,
2153};
2154
2155static struct platform_driver * const drivers[] = {
2156	&n2_crypto_driver,
2157	&n2_mau_driver,
2158};
2159
2160static int __init n2_init(void)
2161{
2162	return platform_register_drivers(drivers, ARRAY_SIZE(drivers));
 
 
 
 
 
 
 
2163}
2164
2165static void __exit n2_exit(void)
2166{
2167	platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));
 
2168}
2169
2170module_init(n2_init);
2171module_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);