Linux Audio

Check our new training course

Loading...
   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
1009out:
1010	put_cpu();
1011
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
1099out:
1100	put_cpu();
1101
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 |
1406			 CRYPTO_ALG_KERN_DRIVER_ONLY | CRYPTO_ALG_ASYNC;
1407	alg->cra_blocksize = tmpl->block_size;
1408	p->enc_type = tmpl->enc_type;
1409	alg->cra_ctxsize = sizeof(struct n2_cipher_context);
1410	alg->cra_type = &crypto_ablkcipher_type;
1411	alg->cra_u.ablkcipher = tmpl->ablkcipher;
1412	alg->cra_init = n2_cipher_cra_init;
1413	alg->cra_module = THIS_MODULE;
1414
1415	list_add(&p->entry, &cipher_algs);
1416	err = crypto_register_alg(alg);
1417	if (err) {
1418		pr_err("%s alg registration failed\n", alg->cra_name);
1419		list_del(&p->entry);
1420		kfree(p);
1421	} else {
1422		pr_info("%s alg registered\n", alg->cra_name);
1423	}
1424	return err;
1425}
1426
1427static int __devinit __n2_register_one_hmac(struct n2_ahash_alg *n2ahash)
1428{
1429	struct n2_hmac_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1430	struct ahash_alg *ahash;
1431	struct crypto_alg *base;
1432	int err;
1433
1434	if (!p)
1435		return -ENOMEM;
1436
1437	p->child_alg = n2ahash->alg.halg.base.cra_name;
1438	memcpy(&p->derived, n2ahash, sizeof(struct n2_ahash_alg));
1439	INIT_LIST_HEAD(&p->derived.entry);
1440
1441	ahash = &p->derived.alg;
1442	ahash->digest = n2_hmac_async_digest;
1443	ahash->setkey = n2_hmac_async_setkey;
1444
1445	base = &ahash->halg.base;
1446	snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "hmac(%s)", p->child_alg);
1447	snprintf(base->cra_driver_name, CRYPTO_MAX_ALG_NAME, "hmac-%s-n2", p->child_alg);
1448
1449	base->cra_ctxsize = sizeof(struct n2_hmac_ctx);
1450	base->cra_init = n2_hmac_cra_init;
1451	base->cra_exit = n2_hmac_cra_exit;
1452
1453	list_add(&p->derived.entry, &hmac_algs);
1454	err = crypto_register_ahash(ahash);
1455	if (err) {
1456		pr_err("%s alg registration failed\n", base->cra_name);
1457		list_del(&p->derived.entry);
1458		kfree(p);
1459	} else {
1460		pr_info("%s alg registered\n", base->cra_name);
1461	}
1462	return err;
1463}
1464
1465static int __devinit __n2_register_one_ahash(const struct n2_hash_tmpl *tmpl)
1466{
1467	struct n2_ahash_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1468	struct hash_alg_common *halg;
1469	struct crypto_alg *base;
1470	struct ahash_alg *ahash;
1471	int err;
1472
1473	if (!p)
1474		return -ENOMEM;
1475
1476	p->hash_zero = tmpl->hash_zero;
1477	p->hash_init = tmpl->hash_init;
1478	p->auth_type = tmpl->auth_type;
1479	p->hmac_type = tmpl->hmac_type;
1480	p->hw_op_hashsz = tmpl->hw_op_hashsz;
1481	p->digest_size = tmpl->digest_size;
1482
1483	ahash = &p->alg;
1484	ahash->init = n2_hash_async_init;
1485	ahash->update = n2_hash_async_update;
1486	ahash->final = n2_hash_async_final;
1487	ahash->finup = n2_hash_async_finup;
1488	ahash->digest = n2_hash_async_digest;
1489
1490	halg = &ahash->halg;
1491	halg->digestsize = tmpl->digest_size;
1492
1493	base = &halg->base;
1494	snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "%s", tmpl->name);
1495	snprintf(base->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s-n2", tmpl->name);
1496	base->cra_priority = N2_CRA_PRIORITY;
1497	base->cra_flags = CRYPTO_ALG_TYPE_AHASH |
1498			  CRYPTO_ALG_KERN_DRIVER_ONLY |
1499			  CRYPTO_ALG_NEED_FALLBACK;
1500	base->cra_blocksize = tmpl->block_size;
1501	base->cra_ctxsize = sizeof(struct n2_hash_ctx);
1502	base->cra_module = THIS_MODULE;
1503	base->cra_init = n2_hash_cra_init;
1504	base->cra_exit = n2_hash_cra_exit;
1505
1506	list_add(&p->entry, &ahash_algs);
1507	err = crypto_register_ahash(ahash);
1508	if (err) {
1509		pr_err("%s alg registration failed\n", base->cra_name);
1510		list_del(&p->entry);
1511		kfree(p);
1512	} else {
1513		pr_info("%s alg registered\n", base->cra_name);
1514	}
1515	if (!err && p->hmac_type != AUTH_TYPE_RESERVED)
1516		err = __n2_register_one_hmac(p);
1517	return err;
1518}
1519
1520static int __devinit n2_register_algs(void)
1521{
1522	int i, err = 0;
1523
1524	mutex_lock(&spu_lock);
1525	if (algs_registered++)
1526		goto out;
1527
1528	for (i = 0; i < NUM_HASH_TMPLS; i++) {
1529		err = __n2_register_one_ahash(&hash_tmpls[i]);
1530		if (err) {
1531			__n2_unregister_algs();
1532			goto out;
1533		}
1534	}
1535	for (i = 0; i < NUM_CIPHER_TMPLS; i++) {
1536		err = __n2_register_one_cipher(&cipher_tmpls[i]);
1537		if (err) {
1538			__n2_unregister_algs();
1539			goto out;
1540		}
1541	}
1542
1543out:
1544	mutex_unlock(&spu_lock);
1545	return err;
1546}
1547
1548static void __devexit n2_unregister_algs(void)
1549{
1550	mutex_lock(&spu_lock);
1551	if (!--algs_registered)
1552		__n2_unregister_algs();
1553	mutex_unlock(&spu_lock);
1554}
1555
1556/* To map CWQ queues to interrupt sources, the hypervisor API provides
1557 * a devino.  This isn't very useful to us because all of the
1558 * interrupts listed in the device_node have been translated to
1559 * Linux virtual IRQ cookie numbers.
1560 *
1561 * So we have to back-translate, going through the 'intr' and 'ino'
1562 * property tables of the n2cp MDESC node, matching it with the OF
1563 * 'interrupts' property entries, in order to to figure out which
1564 * devino goes to which already-translated IRQ.
1565 */
1566static int find_devino_index(struct platform_device *dev, struct spu_mdesc_info *ip,
1567			     unsigned long dev_ino)
1568{
1569	const unsigned int *dev_intrs;
1570	unsigned int intr;
1571	int i;
1572
1573	for (i = 0; i < ip->num_intrs; i++) {
1574		if (ip->ino_table[i].ino == dev_ino)
1575			break;
1576	}
1577	if (i == ip->num_intrs)
1578		return -ENODEV;
1579
1580	intr = ip->ino_table[i].intr;
1581
1582	dev_intrs = of_get_property(dev->dev.of_node, "interrupts", NULL);
1583	if (!dev_intrs)
1584		return -ENODEV;
1585
1586	for (i = 0; i < dev->archdata.num_irqs; i++) {
1587		if (dev_intrs[i] == intr)
1588			return i;
1589	}
1590
1591	return -ENODEV;
1592}
1593
1594static int spu_map_ino(struct platform_device *dev, struct spu_mdesc_info *ip,
1595		       const char *irq_name, struct spu_queue *p,
1596		       irq_handler_t handler)
1597{
1598	unsigned long herr;
1599	int index;
1600
1601	herr = sun4v_ncs_qhandle_to_devino(p->qhandle, &p->devino);
1602	if (herr)
1603		return -EINVAL;
1604
1605	index = find_devino_index(dev, ip, p->devino);
1606	if (index < 0)
1607		return index;
1608
1609	p->irq = dev->archdata.irqs[index];
1610
1611	sprintf(p->irq_name, "%s-%d", irq_name, index);
1612
1613	return request_irq(p->irq, handler, IRQF_SAMPLE_RANDOM,
1614			   p->irq_name, p);
1615}
1616
1617static struct kmem_cache *queue_cache[2];
1618
1619static void *new_queue(unsigned long q_type)
1620{
1621	return kmem_cache_zalloc(queue_cache[q_type - 1], GFP_KERNEL);
1622}
1623
1624static void free_queue(void *p, unsigned long q_type)
1625{
1626	return kmem_cache_free(queue_cache[q_type - 1], p);
1627}
1628
1629static int queue_cache_init(void)
1630{
1631	if (!queue_cache[HV_NCS_QTYPE_MAU - 1])
1632		queue_cache[HV_NCS_QTYPE_MAU - 1] =
1633			kmem_cache_create("mau_queue",
1634					  (MAU_NUM_ENTRIES *
1635					   MAU_ENTRY_SIZE),
1636					  MAU_ENTRY_SIZE, 0, NULL);
1637	if (!queue_cache[HV_NCS_QTYPE_MAU - 1])
1638		return -ENOMEM;
1639
1640	if (!queue_cache[HV_NCS_QTYPE_CWQ - 1])
1641		queue_cache[HV_NCS_QTYPE_CWQ - 1] =
1642			kmem_cache_create("cwq_queue",
1643					  (CWQ_NUM_ENTRIES *
1644					   CWQ_ENTRY_SIZE),
1645					  CWQ_ENTRY_SIZE, 0, NULL);
1646	if (!queue_cache[HV_NCS_QTYPE_CWQ - 1]) {
1647		kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_MAU - 1]);
1648		return -ENOMEM;
1649	}
1650	return 0;
1651}
1652
1653static void queue_cache_destroy(void)
1654{
1655	kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_MAU - 1]);
1656	kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_CWQ - 1]);
1657}
1658
1659static int spu_queue_register(struct spu_queue *p, unsigned long q_type)
1660{
1661	cpumask_var_t old_allowed;
1662	unsigned long hv_ret;
1663
1664	if (cpumask_empty(&p->sharing))
1665		return -EINVAL;
1666
1667	if (!alloc_cpumask_var(&old_allowed, GFP_KERNEL))
1668		return -ENOMEM;
1669
1670	cpumask_copy(old_allowed, &current->cpus_allowed);
1671
1672	set_cpus_allowed_ptr(current, &p->sharing);
1673
1674	hv_ret = sun4v_ncs_qconf(q_type, __pa(p->q),
1675				 CWQ_NUM_ENTRIES, &p->qhandle);
1676	if (!hv_ret)
1677		sun4v_ncs_sethead_marker(p->qhandle, 0);
1678
1679	set_cpus_allowed_ptr(current, old_allowed);
1680
1681	free_cpumask_var(old_allowed);
1682
1683	return (hv_ret ? -EINVAL : 0);
1684}
1685
1686static int spu_queue_setup(struct spu_queue *p)
1687{
1688	int err;
1689
1690	p->q = new_queue(p->q_type);
1691	if (!p->q)
1692		return -ENOMEM;
1693
1694	err = spu_queue_register(p, p->q_type);
1695	if (err) {
1696		free_queue(p->q, p->q_type);
1697		p->q = NULL;
1698	}
1699
1700	return err;
1701}
1702
1703static void spu_queue_destroy(struct spu_queue *p)
1704{
1705	unsigned long hv_ret;
1706
1707	if (!p->q)
1708		return;
1709
1710	hv_ret = sun4v_ncs_qconf(p->q_type, p->qhandle, 0, &p->qhandle);
1711
1712	if (!hv_ret)
1713		free_queue(p->q, p->q_type);
1714}
1715
1716static void spu_list_destroy(struct list_head *list)
1717{
1718	struct spu_queue *p, *n;
1719
1720	list_for_each_entry_safe(p, n, list, list) {
1721		int i;
1722
1723		for (i = 0; i < NR_CPUS; i++) {
1724			if (cpu_to_cwq[i] == p)
1725				cpu_to_cwq[i] = NULL;
1726		}
1727
1728		if (p->irq) {
1729			free_irq(p->irq, p);
1730			p->irq = 0;
1731		}
1732		spu_queue_destroy(p);
1733		list_del(&p->list);
1734		kfree(p);
1735	}
1736}
1737
1738/* Walk the backward arcs of a CWQ 'exec-unit' node,
1739 * gathering cpu membership information.
1740 */
1741static int spu_mdesc_walk_arcs(struct mdesc_handle *mdesc,
1742			       struct platform_device *dev,
1743			       u64 node, struct spu_queue *p,
1744			       struct spu_queue **table)
1745{
1746	u64 arc;
1747
1748	mdesc_for_each_arc(arc, mdesc, node, MDESC_ARC_TYPE_BACK) {
1749		u64 tgt = mdesc_arc_target(mdesc, arc);
1750		const char *name = mdesc_node_name(mdesc, tgt);
1751		const u64 *id;
1752
1753		if (strcmp(name, "cpu"))
1754			continue;
1755		id = mdesc_get_property(mdesc, tgt, "id", NULL);
1756		if (table[*id] != NULL) {
1757			dev_err(&dev->dev, "%s: SPU cpu slot already set.\n",
1758				dev->dev.of_node->full_name);
1759			return -EINVAL;
1760		}
1761		cpu_set(*id, p->sharing);
1762		table[*id] = p;
1763	}
1764	return 0;
1765}
1766
1767/* Process an 'exec-unit' MDESC node of type 'cwq'.  */
1768static int handle_exec_unit(struct spu_mdesc_info *ip, struct list_head *list,
1769			    struct platform_device *dev, struct mdesc_handle *mdesc,
1770			    u64 node, const char *iname, unsigned long q_type,
1771			    irq_handler_t handler, struct spu_queue **table)
1772{
1773	struct spu_queue *p;
1774	int err;
1775
1776	p = kzalloc(sizeof(struct spu_queue), GFP_KERNEL);
1777	if (!p) {
1778		dev_err(&dev->dev, "%s: Could not allocate SPU queue.\n",
1779			dev->dev.of_node->full_name);
1780		return -ENOMEM;
1781	}
1782
1783	cpus_clear(p->sharing);
1784	spin_lock_init(&p->lock);
1785	p->q_type = q_type;
1786	INIT_LIST_HEAD(&p->jobs);
1787	list_add(&p->list, list);
1788
1789	err = spu_mdesc_walk_arcs(mdesc, dev, node, p, table);
1790	if (err)
1791		return err;
1792
1793	err = spu_queue_setup(p);
1794	if (err)
1795		return err;
1796
1797	return spu_map_ino(dev, ip, iname, p, handler);
1798}
1799
1800static int spu_mdesc_scan(struct mdesc_handle *mdesc, struct platform_device *dev,
1801			  struct spu_mdesc_info *ip, struct list_head *list,
1802			  const char *exec_name, unsigned long q_type,
1803			  irq_handler_t handler, struct spu_queue **table)
1804{
1805	int err = 0;
1806	u64 node;
1807
1808	mdesc_for_each_node_by_name(mdesc, node, "exec-unit") {
1809		const char *type;
1810
1811		type = mdesc_get_property(mdesc, node, "type", NULL);
1812		if (!type || strcmp(type, exec_name))
1813			continue;
1814
1815		err = handle_exec_unit(ip, list, dev, mdesc, node,
1816				       exec_name, q_type, handler, table);
1817		if (err) {
1818			spu_list_destroy(list);
1819			break;
1820		}
1821	}
1822
1823	return err;
1824}
1825
1826static int __devinit get_irq_props(struct mdesc_handle *mdesc, u64 node,
1827				   struct spu_mdesc_info *ip)
1828{
1829	const u64 *ino;
1830	int ino_len;
1831	int i;
1832
1833	ino = mdesc_get_property(mdesc, node, "ino", &ino_len);
1834	if (!ino) {
1835		printk("NO 'ino'\n");
1836		return -ENODEV;
1837	}
1838
1839	ip->num_intrs = ino_len / sizeof(u64);
1840	ip->ino_table = kzalloc((sizeof(struct ino_blob) *
1841				 ip->num_intrs),
1842				GFP_KERNEL);
1843	if (!ip->ino_table)
1844		return -ENOMEM;
1845
1846	for (i = 0; i < ip->num_intrs; i++) {
1847		struct ino_blob *b = &ip->ino_table[i];
1848		b->intr = i + 1;
1849		b->ino = ino[i];
1850	}
1851
1852	return 0;
1853}
1854
1855static int __devinit grab_mdesc_irq_props(struct mdesc_handle *mdesc,
1856					  struct platform_device *dev,
1857					  struct spu_mdesc_info *ip,
1858					  const char *node_name)
1859{
1860	const unsigned int *reg;
1861	u64 node;
1862
1863	reg = of_get_property(dev->dev.of_node, "reg", NULL);
1864	if (!reg)
1865		return -ENODEV;
1866
1867	mdesc_for_each_node_by_name(mdesc, node, "virtual-device") {
1868		const char *name;
1869		const u64 *chdl;
1870
1871		name = mdesc_get_property(mdesc, node, "name", NULL);
1872		if (!name || strcmp(name, node_name))
1873			continue;
1874		chdl = mdesc_get_property(mdesc, node, "cfg-handle", NULL);
1875		if (!chdl || (*chdl != *reg))
1876			continue;
1877		ip->cfg_handle = *chdl;
1878		return get_irq_props(mdesc, node, ip);
1879	}
1880
1881	return -ENODEV;
1882}
1883
1884static unsigned long n2_spu_hvapi_major;
1885static unsigned long n2_spu_hvapi_minor;
1886
1887static int __devinit n2_spu_hvapi_register(void)
1888{
1889	int err;
1890
1891	n2_spu_hvapi_major = 2;
1892	n2_spu_hvapi_minor = 0;
1893
1894	err = sun4v_hvapi_register(HV_GRP_NCS,
1895				   n2_spu_hvapi_major,
1896				   &n2_spu_hvapi_minor);
1897
1898	if (!err)
1899		pr_info("Registered NCS HVAPI version %lu.%lu\n",
1900			n2_spu_hvapi_major,
1901			n2_spu_hvapi_minor);
1902
1903	return err;
1904}
1905
1906static void n2_spu_hvapi_unregister(void)
1907{
1908	sun4v_hvapi_unregister(HV_GRP_NCS);
1909}
1910
1911static int global_ref;
1912
1913static int __devinit grab_global_resources(void)
1914{
1915	int err = 0;
1916
1917	mutex_lock(&spu_lock);
1918
1919	if (global_ref++)
1920		goto out;
1921
1922	err = n2_spu_hvapi_register();
1923	if (err)
1924		goto out;
1925
1926	err = queue_cache_init();
1927	if (err)
1928		goto out_hvapi_release;
1929
1930	err = -ENOMEM;
1931	cpu_to_cwq = kzalloc(sizeof(struct spu_queue *) * NR_CPUS,
1932			     GFP_KERNEL);
1933	if (!cpu_to_cwq)
1934		goto out_queue_cache_destroy;
1935
1936	cpu_to_mau = kzalloc(sizeof(struct spu_queue *) * NR_CPUS,
1937			     GFP_KERNEL);
1938	if (!cpu_to_mau)
1939		goto out_free_cwq_table;
1940
1941	err = 0;
1942
1943out:
1944	if (err)
1945		global_ref--;
1946	mutex_unlock(&spu_lock);
1947	return err;
1948
1949out_free_cwq_table:
1950	kfree(cpu_to_cwq);
1951	cpu_to_cwq = NULL;
1952
1953out_queue_cache_destroy:
1954	queue_cache_destroy();
1955
1956out_hvapi_release:
1957	n2_spu_hvapi_unregister();
1958	goto out;
1959}
1960
1961static void release_global_resources(void)
1962{
1963	mutex_lock(&spu_lock);
1964	if (!--global_ref) {
1965		kfree(cpu_to_cwq);
1966		cpu_to_cwq = NULL;
1967
1968		kfree(cpu_to_mau);
1969		cpu_to_mau = NULL;
1970
1971		queue_cache_destroy();
1972		n2_spu_hvapi_unregister();
1973	}
1974	mutex_unlock(&spu_lock);
1975}
1976
1977static struct n2_crypto * __devinit alloc_n2cp(void)
1978{
1979	struct n2_crypto *np = kzalloc(sizeof(struct n2_crypto), GFP_KERNEL);
1980
1981	if (np)
1982		INIT_LIST_HEAD(&np->cwq_list);
1983
1984	return np;
1985}
1986
1987static void free_n2cp(struct n2_crypto *np)
1988{
1989	if (np->cwq_info.ino_table) {
1990		kfree(np->cwq_info.ino_table);
1991		np->cwq_info.ino_table = NULL;
1992	}
1993
1994	kfree(np);
1995}
1996
1997static void __devinit n2_spu_driver_version(void)
1998{
1999	static int n2_spu_version_printed;
2000
2001	if (n2_spu_version_printed++ == 0)
2002		pr_info("%s", version);
2003}
2004
2005static int __devinit n2_crypto_probe(struct platform_device *dev)
2006{
2007	struct mdesc_handle *mdesc;
2008	const char *full_name;
2009	struct n2_crypto *np;
2010	int err;
2011
2012	n2_spu_driver_version();
2013
2014	full_name = dev->dev.of_node->full_name;
2015	pr_info("Found N2CP at %s\n", full_name);
2016
2017	np = alloc_n2cp();
2018	if (!np) {
2019		dev_err(&dev->dev, "%s: Unable to allocate n2cp.\n",
2020			full_name);
2021		return -ENOMEM;
2022	}
2023
2024	err = grab_global_resources();
2025	if (err) {
2026		dev_err(&dev->dev, "%s: Unable to grab "
2027			"global resources.\n", full_name);
2028		goto out_free_n2cp;
2029	}
2030
2031	mdesc = mdesc_grab();
2032
2033	if (!mdesc) {
2034		dev_err(&dev->dev, "%s: Unable to grab MDESC.\n",
2035			full_name);
2036		err = -ENODEV;
2037		goto out_free_global;
2038	}
2039	err = grab_mdesc_irq_props(mdesc, dev, &np->cwq_info, "n2cp");
2040	if (err) {
2041		dev_err(&dev->dev, "%s: Unable to grab IRQ props.\n",
2042			full_name);
2043		mdesc_release(mdesc);
2044		goto out_free_global;
2045	}
2046
2047	err = spu_mdesc_scan(mdesc, dev, &np->cwq_info, &np->cwq_list,
2048			     "cwq", HV_NCS_QTYPE_CWQ, cwq_intr,
2049			     cpu_to_cwq);
2050	mdesc_release(mdesc);
2051
2052	if (err) {
2053		dev_err(&dev->dev, "%s: CWQ MDESC scan failed.\n",
2054			full_name);
2055		goto out_free_global;
2056	}
2057
2058	err = n2_register_algs();
2059	if (err) {
2060		dev_err(&dev->dev, "%s: Unable to register algorithms.\n",
2061			full_name);
2062		goto out_free_spu_list;
2063	}
2064
2065	dev_set_drvdata(&dev->dev, np);
2066
2067	return 0;
2068
2069out_free_spu_list:
2070	spu_list_destroy(&np->cwq_list);
2071
2072out_free_global:
2073	release_global_resources();
2074
2075out_free_n2cp:
2076	free_n2cp(np);
2077
2078	return err;
2079}
2080
2081static int __devexit n2_crypto_remove(struct platform_device *dev)
2082{
2083	struct n2_crypto *np = dev_get_drvdata(&dev->dev);
2084
2085	n2_unregister_algs();
2086
2087	spu_list_destroy(&np->cwq_list);
2088
2089	release_global_resources();
2090
2091	free_n2cp(np);
2092
2093	return 0;
2094}
2095
2096static struct n2_mau * __devinit alloc_ncp(void)
2097{
2098	struct n2_mau *mp = kzalloc(sizeof(struct n2_mau), GFP_KERNEL);
2099
2100	if (mp)
2101		INIT_LIST_HEAD(&mp->mau_list);
2102
2103	return mp;
2104}
2105
2106static void free_ncp(struct n2_mau *mp)
2107{
2108	if (mp->mau_info.ino_table) {
2109		kfree(mp->mau_info.ino_table);
2110		mp->mau_info.ino_table = NULL;
2111	}
2112
2113	kfree(mp);
2114}
2115
2116static int __devinit n2_mau_probe(struct platform_device *dev)
2117{
2118	struct mdesc_handle *mdesc;
2119	const char *full_name;
2120	struct n2_mau *mp;
2121	int err;
2122
2123	n2_spu_driver_version();
2124
2125	full_name = dev->dev.of_node->full_name;
2126	pr_info("Found NCP at %s\n", full_name);
2127
2128	mp = alloc_ncp();
2129	if (!mp) {
2130		dev_err(&dev->dev, "%s: Unable to allocate ncp.\n",
2131			full_name);
2132		return -ENOMEM;
2133	}
2134
2135	err = grab_global_resources();
2136	if (err) {
2137		dev_err(&dev->dev, "%s: Unable to grab "
2138			"global resources.\n", full_name);
2139		goto out_free_ncp;
2140	}
2141
2142	mdesc = mdesc_grab();
2143
2144	if (!mdesc) {
2145		dev_err(&dev->dev, "%s: Unable to grab MDESC.\n",
2146			full_name);
2147		err = -ENODEV;
2148		goto out_free_global;
2149	}
2150
2151	err = grab_mdesc_irq_props(mdesc, dev, &mp->mau_info, "ncp");
2152	if (err) {
2153		dev_err(&dev->dev, "%s: Unable to grab IRQ props.\n",
2154			full_name);
2155		mdesc_release(mdesc);
2156		goto out_free_global;
2157	}
2158
2159	err = spu_mdesc_scan(mdesc, dev, &mp->mau_info, &mp->mau_list,
2160			     "mau", HV_NCS_QTYPE_MAU, mau_intr,
2161			     cpu_to_mau);
2162	mdesc_release(mdesc);
2163
2164	if (err) {
2165		dev_err(&dev->dev, "%s: MAU MDESC scan failed.\n",
2166			full_name);
2167		goto out_free_global;
2168	}
2169
2170	dev_set_drvdata(&dev->dev, mp);
2171
2172	return 0;
2173
2174out_free_global:
2175	release_global_resources();
2176
2177out_free_ncp:
2178	free_ncp(mp);
2179
2180	return err;
2181}
2182
2183static int __devexit n2_mau_remove(struct platform_device *dev)
2184{
2185	struct n2_mau *mp = dev_get_drvdata(&dev->dev);
2186
2187	spu_list_destroy(&mp->mau_list);
2188
2189	release_global_resources();
2190
2191	free_ncp(mp);
2192
2193	return 0;
2194}
2195
2196static struct of_device_id n2_crypto_match[] = {
2197	{
2198		.name = "n2cp",
2199		.compatible = "SUNW,n2-cwq",
2200	},
2201	{
2202		.name = "n2cp",
2203		.compatible = "SUNW,vf-cwq",
2204	},
2205	{
2206		.name = "n2cp",
2207		.compatible = "SUNW,kt-cwq",
2208	},
2209	{},
2210};
2211
2212MODULE_DEVICE_TABLE(of, n2_crypto_match);
2213
2214static struct platform_driver n2_crypto_driver = {
2215	.driver = {
2216		.name		=	"n2cp",
2217		.owner		=	THIS_MODULE,
2218		.of_match_table	=	n2_crypto_match,
2219	},
2220	.probe		=	n2_crypto_probe,
2221	.remove		=	__devexit_p(n2_crypto_remove),
2222};
2223
2224static struct of_device_id n2_mau_match[] = {
2225	{
2226		.name = "ncp",
2227		.compatible = "SUNW,n2-mau",
2228	},
2229	{
2230		.name = "ncp",
2231		.compatible = "SUNW,vf-mau",
2232	},
2233	{
2234		.name = "ncp",
2235		.compatible = "SUNW,kt-mau",
2236	},
2237	{},
2238};
2239
2240MODULE_DEVICE_TABLE(of, n2_mau_match);
2241
2242static struct platform_driver n2_mau_driver = {
2243	.driver = {
2244		.name		=	"ncp",
2245		.owner		=	THIS_MODULE,
2246		.of_match_table	=	n2_mau_match,
2247	},
2248	.probe		=	n2_mau_probe,
2249	.remove		=	__devexit_p(n2_mau_remove),
2250};
2251
2252static int __init n2_init(void)
2253{
2254	int err = platform_driver_register(&n2_crypto_driver);
2255
2256	if (!err) {
2257		err = platform_driver_register(&n2_mau_driver);
2258		if (err)
2259			platform_driver_unregister(&n2_crypto_driver);
2260	}
2261	return err;
2262}
2263
2264static void __exit n2_exit(void)
2265{
2266	platform_driver_unregister(&n2_mau_driver);
2267	platform_driver_unregister(&n2_crypto_driver);
2268}
2269
2270module_init(n2_init);
2271module_exit(n2_exit);