Linux Audio

Check our new training course

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