cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

n2_core.c (51808B)


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