]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/crypto/n2_core.c
Merge remote-tracking branch 'mips/mips-for-linux-next'
[karo-tx-linux.git] / drivers / crypto / n2_core.c
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
37 static const char version[] =
38         DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
39
40 MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
41 MODULE_DESCRIPTION("Niagara2 Crypto driver");
42 MODULE_LICENSE("GPL");
43 MODULE_VERSION(DRV_MODULE_VERSION);
44
45 #define N2_CRA_PRIORITY         200
46
47 static DEFINE_MUTEX(spu_lock);
48
49 struct 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
68 static struct spu_queue **cpu_to_cwq;
69 static struct spu_queue **cpu_to_mau;
70
71 static 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
85 struct 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  */
95 static 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  */
113 static 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
141 static 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
163 static void *spu_queue_next(struct spu_queue *q, void *cur)
164 {
165         return q->q + spu_next_offset(q, cur - q->q);
166 }
167
168 static 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
183 static 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
193 static 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
205 static 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
233 static 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
242 struct 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
253 static 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
263 struct n2_hmac_alg {
264         const char              *child_alg;
265         struct n2_ahash_alg     derived;
266 };
267
268 static 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
278 struct 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
284 struct 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
293 struct 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
303 static 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
315 static 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
329 static 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
342 static 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
357 static int n2_hash_cra_init(struct crypto_tfm *tfm)
358 {
359         const char *fallback_driver_name = crypto_tfm_alg_name(tfm);
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
380 out:
381         return err;
382 }
383
384 static 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
392 static int n2_hmac_cra_init(struct crypto_tfm *tfm)
393 {
394         const char *fallback_driver_name = crypto_tfm_alg_name(tfm);
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
426 out_free_fallback:
427         crypto_free_ahash(fallback_tfm);
428
429 out:
430         return err;
431 }
432
433 static 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
442 static 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         SHASH_DESC_ON_STACK(shash, child_shash);
449         int err, bs, ds;
450
451         fallback_tfm = ctx->base.fallback_tfm;
452         err = crypto_ahash_setkey(fallback_tfm, key, keylen);
453         if (err)
454                 return err;
455
456         shash->tfm = child_shash;
457         shash->flags = crypto_ahash_get_flags(tfm) &
458                 CRYPTO_TFM_REQ_MAY_SLEEP;
459
460         bs = crypto_shash_blocksize(child_shash);
461         ds = crypto_shash_digestsize(child_shash);
462         BUG_ON(ds > N2_HASH_KEY_MAX);
463         if (keylen > bs) {
464                 err = crypto_shash_digest(shash, key, keylen,
465                                           ctx->hash_key);
466                 if (err)
467                         return err;
468                 keylen = ds;
469         } else if (keylen <= N2_HASH_KEY_MAX)
470                 memcpy(ctx->hash_key, key, keylen);
471
472         ctx->hash_key_len = keylen;
473
474         return err;
475 }
476
477 static unsigned long wait_for_tail(struct spu_queue *qp)
478 {
479         unsigned long head, hv_ret;
480
481         do {
482                 hv_ret = sun4v_ncs_gethead(qp->qhandle, &head);
483                 if (hv_ret != HV_EOK) {
484                         pr_err("Hypervisor error on gethead\n");
485                         break;
486                 }
487                 if (head == qp->tail) {
488                         qp->head = head;
489                         break;
490                 }
491         } while (1);
492         return hv_ret;
493 }
494
495 static unsigned long submit_and_wait_for_tail(struct spu_queue *qp,
496                                               struct cwq_initial_entry *ent)
497 {
498         unsigned long hv_ret = spu_queue_submit(qp, ent);
499
500         if (hv_ret == HV_EOK)
501                 hv_ret = wait_for_tail(qp);
502
503         return hv_ret;
504 }
505
506 static int n2_do_async_digest(struct ahash_request *req,
507                               unsigned int auth_type, unsigned int digest_size,
508                               unsigned int result_size, void *hash_loc,
509                               unsigned long auth_key, unsigned int auth_key_len)
510 {
511         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
512         struct cwq_initial_entry *ent;
513         struct crypto_hash_walk walk;
514         struct spu_queue *qp;
515         unsigned long flags;
516         int err = -ENODEV;
517         int nbytes, cpu;
518
519         /* The total effective length of the operation may not
520          * exceed 2^16.
521          */
522         if (unlikely(req->nbytes > (1 << 16))) {
523                 struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
524                 struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
525
526                 ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
527                 rctx->fallback_req.base.flags =
528                         req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
529                 rctx->fallback_req.nbytes = req->nbytes;
530                 rctx->fallback_req.src = req->src;
531                 rctx->fallback_req.result = req->result;
532
533                 return crypto_ahash_digest(&rctx->fallback_req);
534         }
535
536         nbytes = crypto_hash_walk_first(req, &walk);
537
538         cpu = get_cpu();
539         qp = cpu_to_cwq[cpu];
540         if (!qp)
541                 goto out;
542
543         spin_lock_irqsave(&qp->lock, flags);
544
545         /* XXX can do better, improve this later by doing a by-hand scatterlist
546          * XXX walk, etc.
547          */
548         ent = qp->q + qp->tail;
549
550         ent->control = control_word_base(nbytes, auth_key_len, 0,
551                                          auth_type, digest_size,
552                                          false, true, false, false,
553                                          OPCODE_INPLACE_BIT |
554                                          OPCODE_AUTH_MAC);
555         ent->src_addr = __pa(walk.data);
556         ent->auth_key_addr = auth_key;
557         ent->auth_iv_addr = __pa(hash_loc);
558         ent->final_auth_state_addr = 0UL;
559         ent->enc_key_addr = 0UL;
560         ent->enc_iv_addr = 0UL;
561         ent->dest_addr = __pa(hash_loc);
562
563         nbytes = crypto_hash_walk_done(&walk, 0);
564         while (nbytes > 0) {
565                 ent = spu_queue_next(qp, ent);
566
567                 ent->control = (nbytes - 1);
568                 ent->src_addr = __pa(walk.data);
569                 ent->auth_key_addr = 0UL;
570                 ent->auth_iv_addr = 0UL;
571                 ent->final_auth_state_addr = 0UL;
572                 ent->enc_key_addr = 0UL;
573                 ent->enc_iv_addr = 0UL;
574                 ent->dest_addr = 0UL;
575
576                 nbytes = crypto_hash_walk_done(&walk, 0);
577         }
578         ent->control |= CONTROL_END_OF_BLOCK;
579
580         if (submit_and_wait_for_tail(qp, ent) != HV_EOK)
581                 err = -EINVAL;
582         else
583                 err = 0;
584
585         spin_unlock_irqrestore(&qp->lock, flags);
586
587         if (!err)
588                 memcpy(req->result, hash_loc, result_size);
589 out:
590         put_cpu();
591
592         return err;
593 }
594
595 static int n2_hash_async_digest(struct ahash_request *req)
596 {
597         struct n2_ahash_alg *n2alg = n2_ahash_alg(req->base.tfm);
598         struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
599         int ds;
600
601         ds = n2alg->digest_size;
602         if (unlikely(req->nbytes == 0)) {
603                 memcpy(req->result, n2alg->hash_zero, ds);
604                 return 0;
605         }
606         memcpy(&rctx->u, n2alg->hash_init, n2alg->hw_op_hashsz);
607
608         return n2_do_async_digest(req, n2alg->auth_type,
609                                   n2alg->hw_op_hashsz, ds,
610                                   &rctx->u, 0UL, 0);
611 }
612
613 static int n2_hmac_async_digest(struct ahash_request *req)
614 {
615         struct n2_hmac_alg *n2alg = n2_hmac_alg(req->base.tfm);
616         struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
617         struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
618         struct n2_hmac_ctx *ctx = crypto_ahash_ctx(tfm);
619         int ds;
620
621         ds = n2alg->derived.digest_size;
622         if (unlikely(req->nbytes == 0) ||
623             unlikely(ctx->hash_key_len > N2_HASH_KEY_MAX)) {
624                 struct n2_hash_req_ctx *rctx = ahash_request_ctx(req);
625                 struct n2_hash_ctx *ctx = crypto_ahash_ctx(tfm);
626
627                 ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
628                 rctx->fallback_req.base.flags =
629                         req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;
630                 rctx->fallback_req.nbytes = req->nbytes;
631                 rctx->fallback_req.src = req->src;
632                 rctx->fallback_req.result = req->result;
633
634                 return crypto_ahash_digest(&rctx->fallback_req);
635         }
636         memcpy(&rctx->u, n2alg->derived.hash_init,
637                n2alg->derived.hw_op_hashsz);
638
639         return n2_do_async_digest(req, n2alg->derived.hmac_type,
640                                   n2alg->derived.hw_op_hashsz, ds,
641                                   &rctx->u,
642                                   __pa(&ctx->hash_key),
643                                   ctx->hash_key_len);
644 }
645
646 struct n2_cipher_context {
647         int                     key_len;
648         int                     enc_type;
649         union {
650                 u8              aes[AES_MAX_KEY_SIZE];
651                 u8              des[DES_KEY_SIZE];
652                 u8              des3[3 * DES_KEY_SIZE];
653                 u8              arc4[258]; /* S-box, X, Y */
654         } key;
655 };
656
657 #define N2_CHUNK_ARR_LEN        16
658
659 struct n2_crypto_chunk {
660         struct list_head        entry;
661         unsigned long           iv_paddr : 44;
662         unsigned long           arr_len : 20;
663         unsigned long           dest_paddr;
664         unsigned long           dest_final;
665         struct {
666                 unsigned long   src_paddr : 44;
667                 unsigned long   src_len : 20;
668         } arr[N2_CHUNK_ARR_LEN];
669 };
670
671 struct n2_request_context {
672         struct ablkcipher_walk  walk;
673         struct list_head        chunk_list;
674         struct n2_crypto_chunk  chunk;
675         u8                      temp_iv[16];
676 };
677
678 /* The SPU allows some level of flexibility for partial cipher blocks
679  * being specified in a descriptor.
680  *
681  * It merely requires that every descriptor's length field is at least
682  * as large as the cipher block size.  This means that a cipher block
683  * can span at most 2 descriptors.  However, this does not allow a
684  * partial block to span into the final descriptor as that would
685  * violate the rule (since every descriptor's length must be at lest
686  * the block size).  So, for example, assuming an 8 byte block size:
687  *
688  *      0xe --> 0xa --> 0x8
689  *
690  * is a valid length sequence, whereas:
691  *
692  *      0xe --> 0xb --> 0x7
693  *
694  * is not a valid sequence.
695  */
696
697 struct n2_cipher_alg {
698         struct list_head        entry;
699         u8                      enc_type;
700         struct crypto_alg       alg;
701 };
702
703 static inline struct n2_cipher_alg *n2_cipher_alg(struct crypto_tfm *tfm)
704 {
705         struct crypto_alg *alg = tfm->__crt_alg;
706
707         return container_of(alg, struct n2_cipher_alg, alg);
708 }
709
710 struct n2_cipher_request_context {
711         struct ablkcipher_walk  walk;
712 };
713
714 static int n2_aes_setkey(struct crypto_ablkcipher *cipher, const u8 *key,
715                          unsigned int keylen)
716 {
717         struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
718         struct n2_cipher_context *ctx = crypto_tfm_ctx(tfm);
719         struct n2_cipher_alg *n2alg = n2_cipher_alg(tfm);
720
721         ctx->enc_type = (n2alg->enc_type & ENC_TYPE_CHAINING_MASK);
722
723         switch (keylen) {
724         case AES_KEYSIZE_128:
725                 ctx->enc_type |= ENC_TYPE_ALG_AES128;
726                 break;
727         case AES_KEYSIZE_192:
728                 ctx->enc_type |= ENC_TYPE_ALG_AES192;
729                 break;
730         case AES_KEYSIZE_256:
731                 ctx->enc_type |= ENC_TYPE_ALG_AES256;
732                 break;
733         default:
734                 crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_BAD_KEY_LEN);
735                 return -EINVAL;
736         }
737
738         ctx->key_len = keylen;
739         memcpy(ctx->key.aes, key, keylen);
740         return 0;
741 }
742
743 static int n2_des_setkey(struct crypto_ablkcipher *cipher, const u8 *key,
744                          unsigned int keylen)
745 {
746         struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
747         struct n2_cipher_context *ctx = crypto_tfm_ctx(tfm);
748         struct n2_cipher_alg *n2alg = n2_cipher_alg(tfm);
749         u32 tmp[DES_EXPKEY_WORDS];
750         int err;
751
752         ctx->enc_type = n2alg->enc_type;
753
754         if (keylen != DES_KEY_SIZE) {
755                 crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_BAD_KEY_LEN);
756                 return -EINVAL;
757         }
758
759         err = des_ekey(tmp, key);
760         if (err == 0 && (tfm->crt_flags & CRYPTO_TFM_REQ_WEAK_KEY)) {
761                 tfm->crt_flags |= CRYPTO_TFM_RES_WEAK_KEY;
762                 return -EINVAL;
763         }
764
765         ctx->key_len = keylen;
766         memcpy(ctx->key.des, key, keylen);
767         return 0;
768 }
769
770 static int n2_3des_setkey(struct crypto_ablkcipher *cipher, const u8 *key,
771                           unsigned int keylen)
772 {
773         struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
774         struct n2_cipher_context *ctx = crypto_tfm_ctx(tfm);
775         struct n2_cipher_alg *n2alg = n2_cipher_alg(tfm);
776
777         ctx->enc_type = n2alg->enc_type;
778
779         if (keylen != (3 * DES_KEY_SIZE)) {
780                 crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_BAD_KEY_LEN);
781                 return -EINVAL;
782         }
783         ctx->key_len = keylen;
784         memcpy(ctx->key.des3, key, keylen);
785         return 0;
786 }
787
788 static int n2_arc4_setkey(struct crypto_ablkcipher *cipher, const u8 *key,
789                           unsigned int keylen)
790 {
791         struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
792         struct n2_cipher_context *ctx = crypto_tfm_ctx(tfm);
793         struct n2_cipher_alg *n2alg = n2_cipher_alg(tfm);
794         u8 *s = ctx->key.arc4;
795         u8 *x = s + 256;
796         u8 *y = x + 1;
797         int i, j, k;
798
799         ctx->enc_type = n2alg->enc_type;
800
801         j = k = 0;
802         *x = 0;
803         *y = 0;
804         for (i = 0; i < 256; i++)
805                 s[i] = i;
806         for (i = 0; i < 256; i++) {
807                 u8 a = s[i];
808                 j = (j + key[k] + a) & 0xff;
809                 s[i] = s[j];
810                 s[j] = a;
811                 if (++k >= keylen)
812                         k = 0;
813         }
814
815         return 0;
816 }
817
818 static inline int cipher_descriptor_len(int nbytes, unsigned int block_size)
819 {
820         int this_len = nbytes;
821
822         this_len -= (nbytes & (block_size - 1));
823         return this_len > (1 << 16) ? (1 << 16) : this_len;
824 }
825
826 static int __n2_crypt_chunk(struct crypto_tfm *tfm, struct n2_crypto_chunk *cp,
827                             struct spu_queue *qp, bool encrypt)
828 {
829         struct n2_cipher_context *ctx = crypto_tfm_ctx(tfm);
830         struct cwq_initial_entry *ent;
831         bool in_place;
832         int i;
833
834         ent = spu_queue_alloc(qp, cp->arr_len);
835         if (!ent) {
836                 pr_info("queue_alloc() of %d fails\n",
837                         cp->arr_len);
838                 return -EBUSY;
839         }
840
841         in_place = (cp->dest_paddr == cp->arr[0].src_paddr);
842
843         ent->control = control_word_base(cp->arr[0].src_len,
844                                          0, ctx->enc_type, 0, 0,
845                                          false, true, false, encrypt,
846                                          OPCODE_ENCRYPT |
847                                          (in_place ? OPCODE_INPLACE_BIT : 0));
848         ent->src_addr = cp->arr[0].src_paddr;
849         ent->auth_key_addr = 0UL;
850         ent->auth_iv_addr = 0UL;
851         ent->final_auth_state_addr = 0UL;
852         ent->enc_key_addr = __pa(&ctx->key);
853         ent->enc_iv_addr = cp->iv_paddr;
854         ent->dest_addr = (in_place ? 0UL : cp->dest_paddr);
855
856         for (i = 1; i < cp->arr_len; i++) {
857                 ent = spu_queue_next(qp, ent);
858
859                 ent->control = cp->arr[i].src_len - 1;
860                 ent->src_addr = cp->arr[i].src_paddr;
861                 ent->auth_key_addr = 0UL;
862                 ent->auth_iv_addr = 0UL;
863                 ent->final_auth_state_addr = 0UL;
864                 ent->enc_key_addr = 0UL;
865                 ent->enc_iv_addr = 0UL;
866                 ent->dest_addr = 0UL;
867         }
868         ent->control |= CONTROL_END_OF_BLOCK;
869
870         return (spu_queue_submit(qp, ent) != HV_EOK) ? -EINVAL : 0;
871 }
872
873 static int n2_compute_chunks(struct ablkcipher_request *req)
874 {
875         struct n2_request_context *rctx = ablkcipher_request_ctx(req);
876         struct ablkcipher_walk *walk = &rctx->walk;
877         struct n2_crypto_chunk *chunk;
878         unsigned long dest_prev;
879         unsigned int tot_len;
880         bool prev_in_place;
881         int err, nbytes;
882
883         ablkcipher_walk_init(walk, req->dst, req->src, req->nbytes);
884         err = ablkcipher_walk_phys(req, walk);
885         if (err)
886                 return err;
887
888         INIT_LIST_HEAD(&rctx->chunk_list);
889
890         chunk = &rctx->chunk;
891         INIT_LIST_HEAD(&chunk->entry);
892
893         chunk->iv_paddr = 0UL;
894         chunk->arr_len = 0;
895         chunk->dest_paddr = 0UL;
896
897         prev_in_place = false;
898         dest_prev = ~0UL;
899         tot_len = 0;
900
901         while ((nbytes = walk->nbytes) != 0) {
902                 unsigned long dest_paddr, src_paddr;
903                 bool in_place;
904                 int this_len;
905
906                 src_paddr = (page_to_phys(walk->src.page) +
907                              walk->src.offset);
908                 dest_paddr = (page_to_phys(walk->dst.page) +
909                               walk->dst.offset);
910                 in_place = (src_paddr == dest_paddr);
911                 this_len = cipher_descriptor_len(nbytes, walk->blocksize);
912
913                 if (chunk->arr_len != 0) {
914                         if (in_place != prev_in_place ||
915                             (!prev_in_place &&
916                              dest_paddr != dest_prev) ||
917                             chunk->arr_len == N2_CHUNK_ARR_LEN ||
918                             tot_len + this_len > (1 << 16)) {
919                                 chunk->dest_final = dest_prev;
920                                 list_add_tail(&chunk->entry,
921                                               &rctx->chunk_list);
922                                 chunk = kzalloc(sizeof(*chunk), GFP_ATOMIC);
923                                 if (!chunk) {
924                                         err = -ENOMEM;
925                                         break;
926                                 }
927                                 INIT_LIST_HEAD(&chunk->entry);
928                         }
929                 }
930                 if (chunk->arr_len == 0) {
931                         chunk->dest_paddr = dest_paddr;
932                         tot_len = 0;
933                 }
934                 chunk->arr[chunk->arr_len].src_paddr = src_paddr;
935                 chunk->arr[chunk->arr_len].src_len = this_len;
936                 chunk->arr_len++;
937
938                 dest_prev = dest_paddr + this_len;
939                 prev_in_place = in_place;
940                 tot_len += this_len;
941
942                 err = ablkcipher_walk_done(req, walk, nbytes - this_len);
943                 if (err)
944                         break;
945         }
946         if (!err && chunk->arr_len != 0) {
947                 chunk->dest_final = dest_prev;
948                 list_add_tail(&chunk->entry, &rctx->chunk_list);
949         }
950
951         return err;
952 }
953
954 static void n2_chunk_complete(struct ablkcipher_request *req, void *final_iv)
955 {
956         struct n2_request_context *rctx = ablkcipher_request_ctx(req);
957         struct n2_crypto_chunk *c, *tmp;
958
959         if (final_iv)
960                 memcpy(rctx->walk.iv, final_iv, rctx->walk.blocksize);
961
962         ablkcipher_walk_complete(&rctx->walk);
963         list_for_each_entry_safe(c, tmp, &rctx->chunk_list, entry) {
964                 list_del(&c->entry);
965                 if (unlikely(c != &rctx->chunk))
966                         kfree(c);
967         }
968
969 }
970
971 static int n2_do_ecb(struct ablkcipher_request *req, bool encrypt)
972 {
973         struct n2_request_context *rctx = ablkcipher_request_ctx(req);
974         struct crypto_tfm *tfm = req->base.tfm;
975         int err = n2_compute_chunks(req);
976         struct n2_crypto_chunk *c, *tmp;
977         unsigned long flags, hv_ret;
978         struct spu_queue *qp;
979
980         if (err)
981                 return err;
982
983         qp = cpu_to_cwq[get_cpu()];
984         err = -ENODEV;
985         if (!qp)
986                 goto out;
987
988         spin_lock_irqsave(&qp->lock, flags);
989
990         list_for_each_entry_safe(c, tmp, &rctx->chunk_list, entry) {
991                 err = __n2_crypt_chunk(tfm, c, qp, encrypt);
992                 if (err)
993                         break;
994                 list_del(&c->entry);
995                 if (unlikely(c != &rctx->chunk))
996                         kfree(c);
997         }
998         if (!err) {
999                 hv_ret = wait_for_tail(qp);
1000                 if (hv_ret != HV_EOK)
1001                         err = -EINVAL;
1002         }
1003
1004         spin_unlock_irqrestore(&qp->lock, flags);
1005
1006 out:
1007         put_cpu();
1008
1009         n2_chunk_complete(req, NULL);
1010         return err;
1011 }
1012
1013 static int n2_encrypt_ecb(struct ablkcipher_request *req)
1014 {
1015         return n2_do_ecb(req, true);
1016 }
1017
1018 static int n2_decrypt_ecb(struct ablkcipher_request *req)
1019 {
1020         return n2_do_ecb(req, false);
1021 }
1022
1023 static int n2_do_chaining(struct ablkcipher_request *req, bool encrypt)
1024 {
1025         struct n2_request_context *rctx = ablkcipher_request_ctx(req);
1026         struct crypto_tfm *tfm = req->base.tfm;
1027         unsigned long flags, hv_ret, iv_paddr;
1028         int err = n2_compute_chunks(req);
1029         struct n2_crypto_chunk *c, *tmp;
1030         struct spu_queue *qp;
1031         void *final_iv_addr;
1032
1033         final_iv_addr = NULL;
1034
1035         if (err)
1036                 return err;
1037
1038         qp = cpu_to_cwq[get_cpu()];
1039         err = -ENODEV;
1040         if (!qp)
1041                 goto out;
1042
1043         spin_lock_irqsave(&qp->lock, flags);
1044
1045         if (encrypt) {
1046                 iv_paddr = __pa(rctx->walk.iv);
1047                 list_for_each_entry_safe(c, tmp, &rctx->chunk_list,
1048                                          entry) {
1049                         c->iv_paddr = iv_paddr;
1050                         err = __n2_crypt_chunk(tfm, c, qp, true);
1051                         if (err)
1052                                 break;
1053                         iv_paddr = c->dest_final - rctx->walk.blocksize;
1054                         list_del(&c->entry);
1055                         if (unlikely(c != &rctx->chunk))
1056                                 kfree(c);
1057                 }
1058                 final_iv_addr = __va(iv_paddr);
1059         } else {
1060                 list_for_each_entry_safe_reverse(c, tmp, &rctx->chunk_list,
1061                                                  entry) {
1062                         if (c == &rctx->chunk) {
1063                                 iv_paddr = __pa(rctx->walk.iv);
1064                         } else {
1065                                 iv_paddr = (tmp->arr[tmp->arr_len-1].src_paddr +
1066                                             tmp->arr[tmp->arr_len-1].src_len -
1067                                             rctx->walk.blocksize);
1068                         }
1069                         if (!final_iv_addr) {
1070                                 unsigned long pa;
1071
1072                                 pa = (c->arr[c->arr_len-1].src_paddr +
1073                                       c->arr[c->arr_len-1].src_len -
1074                                       rctx->walk.blocksize);
1075                                 final_iv_addr = rctx->temp_iv;
1076                                 memcpy(rctx->temp_iv, __va(pa),
1077                                        rctx->walk.blocksize);
1078                         }
1079                         c->iv_paddr = iv_paddr;
1080                         err = __n2_crypt_chunk(tfm, c, qp, false);
1081                         if (err)
1082                                 break;
1083                         list_del(&c->entry);
1084                         if (unlikely(c != &rctx->chunk))
1085                                 kfree(c);
1086                 }
1087         }
1088         if (!err) {
1089                 hv_ret = wait_for_tail(qp);
1090                 if (hv_ret != HV_EOK)
1091                         err = -EINVAL;
1092         }
1093
1094         spin_unlock_irqrestore(&qp->lock, flags);
1095
1096 out:
1097         put_cpu();
1098
1099         n2_chunk_complete(req, err ? NULL : final_iv_addr);
1100         return err;
1101 }
1102
1103 static int n2_encrypt_chaining(struct ablkcipher_request *req)
1104 {
1105         return n2_do_chaining(req, true);
1106 }
1107
1108 static int n2_decrypt_chaining(struct ablkcipher_request *req)
1109 {
1110         return n2_do_chaining(req, false);
1111 }
1112
1113 struct n2_cipher_tmpl {
1114         const char              *name;
1115         const char              *drv_name;
1116         u8                      block_size;
1117         u8                      enc_type;
1118         struct ablkcipher_alg   ablkcipher;
1119 };
1120
1121 static const struct n2_cipher_tmpl cipher_tmpls[] = {
1122         /* ARC4: only ECB is supported (chaining bits ignored) */
1123         {       .name           = "ecb(arc4)",
1124                 .drv_name       = "ecb-arc4",
1125                 .block_size     = 1,
1126                 .enc_type       = (ENC_TYPE_ALG_RC4_STREAM |
1127                                    ENC_TYPE_CHAINING_ECB),
1128                 .ablkcipher     = {
1129                         .min_keysize    = 1,
1130                         .max_keysize    = 256,
1131                         .setkey         = n2_arc4_setkey,
1132                         .encrypt        = n2_encrypt_ecb,
1133                         .decrypt        = n2_decrypt_ecb,
1134                 },
1135         },
1136
1137         /* DES: ECB CBC and CFB are supported */
1138         {       .name           = "ecb(des)",
1139                 .drv_name       = "ecb-des",
1140                 .block_size     = DES_BLOCK_SIZE,
1141                 .enc_type       = (ENC_TYPE_ALG_DES |
1142                                    ENC_TYPE_CHAINING_ECB),
1143                 .ablkcipher     = {
1144                         .min_keysize    = DES_KEY_SIZE,
1145                         .max_keysize    = DES_KEY_SIZE,
1146                         .setkey         = n2_des_setkey,
1147                         .encrypt        = n2_encrypt_ecb,
1148                         .decrypt        = n2_decrypt_ecb,
1149                 },
1150         },
1151         {       .name           = "cbc(des)",
1152                 .drv_name       = "cbc-des",
1153                 .block_size     = DES_BLOCK_SIZE,
1154                 .enc_type       = (ENC_TYPE_ALG_DES |
1155                                    ENC_TYPE_CHAINING_CBC),
1156                 .ablkcipher     = {
1157                         .ivsize         = DES_BLOCK_SIZE,
1158                         .min_keysize    = DES_KEY_SIZE,
1159                         .max_keysize    = DES_KEY_SIZE,
1160                         .setkey         = n2_des_setkey,
1161                         .encrypt        = n2_encrypt_chaining,
1162                         .decrypt        = n2_decrypt_chaining,
1163                 },
1164         },
1165         {       .name           = "cfb(des)",
1166                 .drv_name       = "cfb-des",
1167                 .block_size     = DES_BLOCK_SIZE,
1168                 .enc_type       = (ENC_TYPE_ALG_DES |
1169                                    ENC_TYPE_CHAINING_CFB),
1170                 .ablkcipher     = {
1171                         .min_keysize    = DES_KEY_SIZE,
1172                         .max_keysize    = DES_KEY_SIZE,
1173                         .setkey         = n2_des_setkey,
1174                         .encrypt        = n2_encrypt_chaining,
1175                         .decrypt        = n2_decrypt_chaining,
1176                 },
1177         },
1178
1179         /* 3DES: ECB CBC and CFB are supported */
1180         {       .name           = "ecb(des3_ede)",
1181                 .drv_name       = "ecb-3des",
1182                 .block_size     = DES_BLOCK_SIZE,
1183                 .enc_type       = (ENC_TYPE_ALG_3DES |
1184                                    ENC_TYPE_CHAINING_ECB),
1185                 .ablkcipher     = {
1186                         .min_keysize    = 3 * DES_KEY_SIZE,
1187                         .max_keysize    = 3 * DES_KEY_SIZE,
1188                         .setkey         = n2_3des_setkey,
1189                         .encrypt        = n2_encrypt_ecb,
1190                         .decrypt        = n2_decrypt_ecb,
1191                 },
1192         },
1193         {       .name           = "cbc(des3_ede)",
1194                 .drv_name       = "cbc-3des",
1195                 .block_size     = DES_BLOCK_SIZE,
1196                 .enc_type       = (ENC_TYPE_ALG_3DES |
1197                                    ENC_TYPE_CHAINING_CBC),
1198                 .ablkcipher     = {
1199                         .ivsize         = DES_BLOCK_SIZE,
1200                         .min_keysize    = 3 * DES_KEY_SIZE,
1201                         .max_keysize    = 3 * DES_KEY_SIZE,
1202                         .setkey         = n2_3des_setkey,
1203                         .encrypt        = n2_encrypt_chaining,
1204                         .decrypt        = n2_decrypt_chaining,
1205                 },
1206         },
1207         {       .name           = "cfb(des3_ede)",
1208                 .drv_name       = "cfb-3des",
1209                 .block_size     = DES_BLOCK_SIZE,
1210                 .enc_type       = (ENC_TYPE_ALG_3DES |
1211                                    ENC_TYPE_CHAINING_CFB),
1212                 .ablkcipher     = {
1213                         .min_keysize    = 3 * DES_KEY_SIZE,
1214                         .max_keysize    = 3 * DES_KEY_SIZE,
1215                         .setkey         = n2_3des_setkey,
1216                         .encrypt        = n2_encrypt_chaining,
1217                         .decrypt        = n2_decrypt_chaining,
1218                 },
1219         },
1220         /* AES: ECB CBC and CTR are supported */
1221         {       .name           = "ecb(aes)",
1222                 .drv_name       = "ecb-aes",
1223                 .block_size     = AES_BLOCK_SIZE,
1224                 .enc_type       = (ENC_TYPE_ALG_AES128 |
1225                                    ENC_TYPE_CHAINING_ECB),
1226                 .ablkcipher     = {
1227                         .min_keysize    = AES_MIN_KEY_SIZE,
1228                         .max_keysize    = AES_MAX_KEY_SIZE,
1229                         .setkey         = n2_aes_setkey,
1230                         .encrypt        = n2_encrypt_ecb,
1231                         .decrypt        = n2_decrypt_ecb,
1232                 },
1233         },
1234         {       .name           = "cbc(aes)",
1235                 .drv_name       = "cbc-aes",
1236                 .block_size     = AES_BLOCK_SIZE,
1237                 .enc_type       = (ENC_TYPE_ALG_AES128 |
1238                                    ENC_TYPE_CHAINING_CBC),
1239                 .ablkcipher     = {
1240                         .ivsize         = AES_BLOCK_SIZE,
1241                         .min_keysize    = AES_MIN_KEY_SIZE,
1242                         .max_keysize    = AES_MAX_KEY_SIZE,
1243                         .setkey         = n2_aes_setkey,
1244                         .encrypt        = n2_encrypt_chaining,
1245                         .decrypt        = n2_decrypt_chaining,
1246                 },
1247         },
1248         {       .name           = "ctr(aes)",
1249                 .drv_name       = "ctr-aes",
1250                 .block_size     = AES_BLOCK_SIZE,
1251                 .enc_type       = (ENC_TYPE_ALG_AES128 |
1252                                    ENC_TYPE_CHAINING_COUNTER),
1253                 .ablkcipher     = {
1254                         .ivsize         = AES_BLOCK_SIZE,
1255                         .min_keysize    = AES_MIN_KEY_SIZE,
1256                         .max_keysize    = AES_MAX_KEY_SIZE,
1257                         .setkey         = n2_aes_setkey,
1258                         .encrypt        = n2_encrypt_chaining,
1259                         .decrypt        = n2_encrypt_chaining,
1260                 },
1261         },
1262
1263 };
1264 #define NUM_CIPHER_TMPLS ARRAY_SIZE(cipher_tmpls)
1265
1266 static LIST_HEAD(cipher_algs);
1267
1268 struct n2_hash_tmpl {
1269         const char      *name;
1270         const char      *hash_zero;
1271         const u32       *hash_init;
1272         u8              hw_op_hashsz;
1273         u8              digest_size;
1274         u8              block_size;
1275         u8              auth_type;
1276         u8              hmac_type;
1277 };
1278
1279 static const char md5_zero[MD5_DIGEST_SIZE] = {
1280         0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
1281         0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e,
1282 };
1283 static const u32 md5_init[MD5_HASH_WORDS] = {
1284         cpu_to_le32(MD5_H0),
1285         cpu_to_le32(MD5_H1),
1286         cpu_to_le32(MD5_H2),
1287         cpu_to_le32(MD5_H3),
1288 };
1289 static const char sha1_zero[SHA1_DIGEST_SIZE] = {
1290         0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32,
1291         0x55, 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8,
1292         0x07, 0x09
1293 };
1294 static const u32 sha1_init[SHA1_DIGEST_SIZE / 4] = {
1295         SHA1_H0, SHA1_H1, SHA1_H2, SHA1_H3, SHA1_H4,
1296 };
1297 static const char sha256_zero[SHA256_DIGEST_SIZE] = {
1298         0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a,
1299         0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae,
1300         0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99,
1301         0x1b, 0x78, 0x52, 0xb8, 0x55
1302 };
1303 static const u32 sha256_init[SHA256_DIGEST_SIZE / 4] = {
1304         SHA256_H0, SHA256_H1, SHA256_H2, SHA256_H3,
1305         SHA256_H4, SHA256_H5, SHA256_H6, SHA256_H7,
1306 };
1307 static const char sha224_zero[SHA224_DIGEST_SIZE] = {
1308         0xd1, 0x4a, 0x02, 0x8c, 0x2a, 0x3a, 0x2b, 0xc9, 0x47,
1309         0x61, 0x02, 0xbb, 0x28, 0x82, 0x34, 0xc4, 0x15, 0xa2,
1310         0xb0, 0x1f, 0x82, 0x8e, 0xa6, 0x2a, 0xc5, 0xb3, 0xe4,
1311         0x2f
1312 };
1313 static const u32 sha224_init[SHA256_DIGEST_SIZE / 4] = {
1314         SHA224_H0, SHA224_H1, SHA224_H2, SHA224_H3,
1315         SHA224_H4, SHA224_H5, SHA224_H6, SHA224_H7,
1316 };
1317
1318 static const struct n2_hash_tmpl hash_tmpls[] = {
1319         { .name         = "md5",
1320           .hash_zero    = md5_zero,
1321           .hash_init    = md5_init,
1322           .auth_type    = AUTH_TYPE_MD5,
1323           .hmac_type    = AUTH_TYPE_HMAC_MD5,
1324           .hw_op_hashsz = MD5_DIGEST_SIZE,
1325           .digest_size  = MD5_DIGEST_SIZE,
1326           .block_size   = MD5_HMAC_BLOCK_SIZE },
1327         { .name         = "sha1",
1328           .hash_zero    = sha1_zero,
1329           .hash_init    = sha1_init,
1330           .auth_type    = AUTH_TYPE_SHA1,
1331           .hmac_type    = AUTH_TYPE_HMAC_SHA1,
1332           .hw_op_hashsz = SHA1_DIGEST_SIZE,
1333           .digest_size  = SHA1_DIGEST_SIZE,
1334           .block_size   = SHA1_BLOCK_SIZE },
1335         { .name         = "sha256",
1336           .hash_zero    = sha256_zero,
1337           .hash_init    = sha256_init,
1338           .auth_type    = AUTH_TYPE_SHA256,
1339           .hmac_type    = AUTH_TYPE_HMAC_SHA256,
1340           .hw_op_hashsz = SHA256_DIGEST_SIZE,
1341           .digest_size  = SHA256_DIGEST_SIZE,
1342           .block_size   = SHA256_BLOCK_SIZE },
1343         { .name         = "sha224",
1344           .hash_zero    = sha224_zero,
1345           .hash_init    = sha224_init,
1346           .auth_type    = AUTH_TYPE_SHA256,
1347           .hmac_type    = AUTH_TYPE_RESERVED,
1348           .hw_op_hashsz = SHA256_DIGEST_SIZE,
1349           .digest_size  = SHA224_DIGEST_SIZE,
1350           .block_size   = SHA224_BLOCK_SIZE },
1351 };
1352 #define NUM_HASH_TMPLS ARRAY_SIZE(hash_tmpls)
1353
1354 static LIST_HEAD(ahash_algs);
1355 static LIST_HEAD(hmac_algs);
1356
1357 static int algs_registered;
1358
1359 static void __n2_unregister_algs(void)
1360 {
1361         struct n2_cipher_alg *cipher, *cipher_tmp;
1362         struct n2_ahash_alg *alg, *alg_tmp;
1363         struct n2_hmac_alg *hmac, *hmac_tmp;
1364
1365         list_for_each_entry_safe(cipher, cipher_tmp, &cipher_algs, entry) {
1366                 crypto_unregister_alg(&cipher->alg);
1367                 list_del(&cipher->entry);
1368                 kfree(cipher);
1369         }
1370         list_for_each_entry_safe(hmac, hmac_tmp, &hmac_algs, derived.entry) {
1371                 crypto_unregister_ahash(&hmac->derived.alg);
1372                 list_del(&hmac->derived.entry);
1373                 kfree(hmac);
1374         }
1375         list_for_each_entry_safe(alg, alg_tmp, &ahash_algs, entry) {
1376                 crypto_unregister_ahash(&alg->alg);
1377                 list_del(&alg->entry);
1378                 kfree(alg);
1379         }
1380 }
1381
1382 static int n2_cipher_cra_init(struct crypto_tfm *tfm)
1383 {
1384         tfm->crt_ablkcipher.reqsize = sizeof(struct n2_request_context);
1385         return 0;
1386 }
1387
1388 static int __n2_register_one_cipher(const struct n2_cipher_tmpl *tmpl)
1389 {
1390         struct n2_cipher_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1391         struct crypto_alg *alg;
1392         int err;
1393
1394         if (!p)
1395                 return -ENOMEM;
1396
1397         alg = &p->alg;
1398
1399         snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s", tmpl->name);
1400         snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s-n2", tmpl->drv_name);
1401         alg->cra_priority = N2_CRA_PRIORITY;
1402         alg->cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
1403                          CRYPTO_ALG_KERN_DRIVER_ONLY | CRYPTO_ALG_ASYNC;
1404         alg->cra_blocksize = tmpl->block_size;
1405         p->enc_type = tmpl->enc_type;
1406         alg->cra_ctxsize = sizeof(struct n2_cipher_context);
1407         alg->cra_type = &crypto_ablkcipher_type;
1408         alg->cra_u.ablkcipher = tmpl->ablkcipher;
1409         alg->cra_init = n2_cipher_cra_init;
1410         alg->cra_module = THIS_MODULE;
1411
1412         list_add(&p->entry, &cipher_algs);
1413         err = crypto_register_alg(alg);
1414         if (err) {
1415                 pr_err("%s alg registration failed\n", alg->cra_name);
1416                 list_del(&p->entry);
1417                 kfree(p);
1418         } else {
1419                 pr_info("%s alg registered\n", alg->cra_name);
1420         }
1421         return err;
1422 }
1423
1424 static int __n2_register_one_hmac(struct n2_ahash_alg *n2ahash)
1425 {
1426         struct n2_hmac_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1427         struct ahash_alg *ahash;
1428         struct crypto_alg *base;
1429         int err;
1430
1431         if (!p)
1432                 return -ENOMEM;
1433
1434         p->child_alg = n2ahash->alg.halg.base.cra_name;
1435         memcpy(&p->derived, n2ahash, sizeof(struct n2_ahash_alg));
1436         INIT_LIST_HEAD(&p->derived.entry);
1437
1438         ahash = &p->derived.alg;
1439         ahash->digest = n2_hmac_async_digest;
1440         ahash->setkey = n2_hmac_async_setkey;
1441
1442         base = &ahash->halg.base;
1443         snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "hmac(%s)", p->child_alg);
1444         snprintf(base->cra_driver_name, CRYPTO_MAX_ALG_NAME, "hmac-%s-n2", p->child_alg);
1445
1446         base->cra_ctxsize = sizeof(struct n2_hmac_ctx);
1447         base->cra_init = n2_hmac_cra_init;
1448         base->cra_exit = n2_hmac_cra_exit;
1449
1450         list_add(&p->derived.entry, &hmac_algs);
1451         err = crypto_register_ahash(ahash);
1452         if (err) {
1453                 pr_err("%s alg registration failed\n", base->cra_name);
1454                 list_del(&p->derived.entry);
1455                 kfree(p);
1456         } else {
1457                 pr_info("%s alg registered\n", base->cra_name);
1458         }
1459         return err;
1460 }
1461
1462 static int __n2_register_one_ahash(const struct n2_hash_tmpl *tmpl)
1463 {
1464         struct n2_ahash_alg *p = kzalloc(sizeof(*p), GFP_KERNEL);
1465         struct hash_alg_common *halg;
1466         struct crypto_alg *base;
1467         struct ahash_alg *ahash;
1468         int err;
1469
1470         if (!p)
1471                 return -ENOMEM;
1472
1473         p->hash_zero = tmpl->hash_zero;
1474         p->hash_init = tmpl->hash_init;
1475         p->auth_type = tmpl->auth_type;
1476         p->hmac_type = tmpl->hmac_type;
1477         p->hw_op_hashsz = tmpl->hw_op_hashsz;
1478         p->digest_size = tmpl->digest_size;
1479
1480         ahash = &p->alg;
1481         ahash->init = n2_hash_async_init;
1482         ahash->update = n2_hash_async_update;
1483         ahash->final = n2_hash_async_final;
1484         ahash->finup = n2_hash_async_finup;
1485         ahash->digest = n2_hash_async_digest;
1486
1487         halg = &ahash->halg;
1488         halg->digestsize = tmpl->digest_size;
1489
1490         base = &halg->base;
1491         snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "%s", tmpl->name);
1492         snprintf(base->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s-n2", tmpl->name);
1493         base->cra_priority = N2_CRA_PRIORITY;
1494         base->cra_flags = CRYPTO_ALG_TYPE_AHASH |
1495                           CRYPTO_ALG_KERN_DRIVER_ONLY |
1496                           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
1517 static int 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
1540 out:
1541         mutex_unlock(&spu_lock);
1542         return err;
1543 }
1544
1545 static void 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  */
1563 static 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
1591 static 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, 0, p->irq_name, p);
1611 }
1612
1613 static struct kmem_cache *queue_cache[2];
1614
1615 static void *new_queue(unsigned long q_type)
1616 {
1617         return kmem_cache_zalloc(queue_cache[q_type - 1], GFP_KERNEL);
1618 }
1619
1620 static void free_queue(void *p, unsigned long q_type)
1621 {
1622         return kmem_cache_free(queue_cache[q_type - 1], p);
1623 }
1624
1625 static int queue_cache_init(void)
1626 {
1627         if (!queue_cache[HV_NCS_QTYPE_MAU - 1])
1628                 queue_cache[HV_NCS_QTYPE_MAU - 1] =
1629                         kmem_cache_create("mau_queue",
1630                                           (MAU_NUM_ENTRIES *
1631                                            MAU_ENTRY_SIZE),
1632                                           MAU_ENTRY_SIZE, 0, NULL);
1633         if (!queue_cache[HV_NCS_QTYPE_MAU - 1])
1634                 return -ENOMEM;
1635
1636         if (!queue_cache[HV_NCS_QTYPE_CWQ - 1])
1637                 queue_cache[HV_NCS_QTYPE_CWQ - 1] =
1638                         kmem_cache_create("cwq_queue",
1639                                           (CWQ_NUM_ENTRIES *
1640                                            CWQ_ENTRY_SIZE),
1641                                           CWQ_ENTRY_SIZE, 0, NULL);
1642         if (!queue_cache[HV_NCS_QTYPE_CWQ - 1]) {
1643                 kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_MAU - 1]);
1644                 return -ENOMEM;
1645         }
1646         return 0;
1647 }
1648
1649 static void queue_cache_destroy(void)
1650 {
1651         kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_MAU - 1]);
1652         kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_CWQ - 1]);
1653 }
1654
1655 static int spu_queue_register(struct spu_queue *p, unsigned long q_type)
1656 {
1657         cpumask_var_t old_allowed;
1658         unsigned long hv_ret;
1659
1660         if (cpumask_empty(&p->sharing))
1661                 return -EINVAL;
1662
1663         if (!alloc_cpumask_var(&old_allowed, GFP_KERNEL))
1664                 return -ENOMEM;
1665
1666         cpumask_copy(old_allowed, &current->cpus_allowed);
1667
1668         set_cpus_allowed_ptr(current, &p->sharing);
1669
1670         hv_ret = sun4v_ncs_qconf(q_type, __pa(p->q),
1671                                  CWQ_NUM_ENTRIES, &p->qhandle);
1672         if (!hv_ret)
1673                 sun4v_ncs_sethead_marker(p->qhandle, 0);
1674
1675         set_cpus_allowed_ptr(current, old_allowed);
1676
1677         free_cpumask_var(old_allowed);
1678
1679         return (hv_ret ? -EINVAL : 0);
1680 }
1681
1682 static int spu_queue_setup(struct spu_queue *p)
1683 {
1684         int err;
1685
1686         p->q = new_queue(p->q_type);
1687         if (!p->q)
1688                 return -ENOMEM;
1689
1690         err = spu_queue_register(p, p->q_type);
1691         if (err) {
1692                 free_queue(p->q, p->q_type);
1693                 p->q = NULL;
1694         }
1695
1696         return err;
1697 }
1698
1699 static void spu_queue_destroy(struct spu_queue *p)
1700 {
1701         unsigned long hv_ret;
1702
1703         if (!p->q)
1704                 return;
1705
1706         hv_ret = sun4v_ncs_qconf(p->q_type, p->qhandle, 0, &p->qhandle);
1707
1708         if (!hv_ret)
1709                 free_queue(p->q, p->q_type);
1710 }
1711
1712 static void spu_list_destroy(struct list_head *list)
1713 {
1714         struct spu_queue *p, *n;
1715
1716         list_for_each_entry_safe(p, n, list, list) {
1717                 int i;
1718
1719                 for (i = 0; i < NR_CPUS; i++) {
1720                         if (cpu_to_cwq[i] == p)
1721                                 cpu_to_cwq[i] = NULL;
1722                 }
1723
1724                 if (p->irq) {
1725                         free_irq(p->irq, p);
1726                         p->irq = 0;
1727                 }
1728                 spu_queue_destroy(p);
1729                 list_del(&p->list);
1730                 kfree(p);
1731         }
1732 }
1733
1734 /* Walk the backward arcs of a CWQ 'exec-unit' node,
1735  * gathering cpu membership information.
1736  */
1737 static int spu_mdesc_walk_arcs(struct mdesc_handle *mdesc,
1738                                struct platform_device *dev,
1739                                u64 node, struct spu_queue *p,
1740                                struct spu_queue **table)
1741 {
1742         u64 arc;
1743
1744         mdesc_for_each_arc(arc, mdesc, node, MDESC_ARC_TYPE_BACK) {
1745                 u64 tgt = mdesc_arc_target(mdesc, arc);
1746                 const char *name = mdesc_node_name(mdesc, tgt);
1747                 const u64 *id;
1748
1749                 if (strcmp(name, "cpu"))
1750                         continue;
1751                 id = mdesc_get_property(mdesc, tgt, "id", NULL);
1752                 if (table[*id] != NULL) {
1753                         dev_err(&dev->dev, "%s: SPU cpu slot already set.\n",
1754                                 dev->dev.of_node->full_name);
1755                         return -EINVAL;
1756                 }
1757                 cpumask_set_cpu(*id, &p->sharing);
1758                 table[*id] = p;
1759         }
1760         return 0;
1761 }
1762
1763 /* Process an 'exec-unit' MDESC node of type 'cwq'.  */
1764 static int handle_exec_unit(struct spu_mdesc_info *ip, struct list_head *list,
1765                             struct platform_device *dev, struct mdesc_handle *mdesc,
1766                             u64 node, const char *iname, unsigned long q_type,
1767                             irq_handler_t handler, struct spu_queue **table)
1768 {
1769         struct spu_queue *p;
1770         int err;
1771
1772         p = kzalloc(sizeof(struct spu_queue), GFP_KERNEL);
1773         if (!p) {
1774                 dev_err(&dev->dev, "%s: Could not allocate SPU queue.\n",
1775                         dev->dev.of_node->full_name);
1776                 return -ENOMEM;
1777         }
1778
1779         cpumask_clear(&p->sharing);
1780         spin_lock_init(&p->lock);
1781         p->q_type = q_type;
1782         INIT_LIST_HEAD(&p->jobs);
1783         list_add(&p->list, list);
1784
1785         err = spu_mdesc_walk_arcs(mdesc, dev, node, p, table);
1786         if (err)
1787                 return err;
1788
1789         err = spu_queue_setup(p);
1790         if (err)
1791                 return err;
1792
1793         return spu_map_ino(dev, ip, iname, p, handler);
1794 }
1795
1796 static int spu_mdesc_scan(struct mdesc_handle *mdesc, struct platform_device *dev,
1797                           struct spu_mdesc_info *ip, struct list_head *list,
1798                           const char *exec_name, unsigned long q_type,
1799                           irq_handler_t handler, struct spu_queue **table)
1800 {
1801         int err = 0;
1802         u64 node;
1803
1804         mdesc_for_each_node_by_name(mdesc, node, "exec-unit") {
1805                 const char *type;
1806
1807                 type = mdesc_get_property(mdesc, node, "type", NULL);
1808                 if (!type || strcmp(type, exec_name))
1809                         continue;
1810
1811                 err = handle_exec_unit(ip, list, dev, mdesc, node,
1812                                        exec_name, q_type, handler, table);
1813                 if (err) {
1814                         spu_list_destroy(list);
1815                         break;
1816                 }
1817         }
1818
1819         return err;
1820 }
1821
1822 static int get_irq_props(struct mdesc_handle *mdesc, u64 node,
1823                          struct spu_mdesc_info *ip)
1824 {
1825         const u64 *ino;
1826         int ino_len;
1827         int i;
1828
1829         ino = mdesc_get_property(mdesc, node, "ino", &ino_len);
1830         if (!ino) {
1831                 printk("NO 'ino'\n");
1832                 return -ENODEV;
1833         }
1834
1835         ip->num_intrs = ino_len / sizeof(u64);
1836         ip->ino_table = kzalloc((sizeof(struct ino_blob) *
1837                                  ip->num_intrs),
1838                                 GFP_KERNEL);
1839         if (!ip->ino_table)
1840                 return -ENOMEM;
1841
1842         for (i = 0; i < ip->num_intrs; i++) {
1843                 struct ino_blob *b = &ip->ino_table[i];
1844                 b->intr = i + 1;
1845                 b->ino = ino[i];
1846         }
1847
1848         return 0;
1849 }
1850
1851 static int grab_mdesc_irq_props(struct mdesc_handle *mdesc,
1852                                 struct platform_device *dev,
1853                                 struct spu_mdesc_info *ip,
1854                                 const char *node_name)
1855 {
1856         const unsigned int *reg;
1857         u64 node;
1858
1859         reg = of_get_property(dev->dev.of_node, "reg", NULL);
1860         if (!reg)
1861                 return -ENODEV;
1862
1863         mdesc_for_each_node_by_name(mdesc, node, "virtual-device") {
1864                 const char *name;
1865                 const u64 *chdl;
1866
1867                 name = mdesc_get_property(mdesc, node, "name", NULL);
1868                 if (!name || strcmp(name, node_name))
1869                         continue;
1870                 chdl = mdesc_get_property(mdesc, node, "cfg-handle", NULL);
1871                 if (!chdl || (*chdl != *reg))
1872                         continue;
1873                 ip->cfg_handle = *chdl;
1874                 return get_irq_props(mdesc, node, ip);
1875         }
1876
1877         return -ENODEV;
1878 }
1879
1880 static unsigned long n2_spu_hvapi_major;
1881 static unsigned long n2_spu_hvapi_minor;
1882
1883 static int n2_spu_hvapi_register(void)
1884 {
1885         int err;
1886
1887         n2_spu_hvapi_major = 2;
1888         n2_spu_hvapi_minor = 0;
1889
1890         err = sun4v_hvapi_register(HV_GRP_NCS,
1891                                    n2_spu_hvapi_major,
1892                                    &n2_spu_hvapi_minor);
1893
1894         if (!err)
1895                 pr_info("Registered NCS HVAPI version %lu.%lu\n",
1896                         n2_spu_hvapi_major,
1897                         n2_spu_hvapi_minor);
1898
1899         return err;
1900 }
1901
1902 static void n2_spu_hvapi_unregister(void)
1903 {
1904         sun4v_hvapi_unregister(HV_GRP_NCS);
1905 }
1906
1907 static int global_ref;
1908
1909 static int grab_global_resources(void)
1910 {
1911         int err = 0;
1912
1913         mutex_lock(&spu_lock);
1914
1915         if (global_ref++)
1916                 goto out;
1917
1918         err = n2_spu_hvapi_register();
1919         if (err)
1920                 goto out;
1921
1922         err = queue_cache_init();
1923         if (err)
1924                 goto out_hvapi_release;
1925
1926         err = -ENOMEM;
1927         cpu_to_cwq = kzalloc(sizeof(struct spu_queue *) * NR_CPUS,
1928                              GFP_KERNEL);
1929         if (!cpu_to_cwq)
1930                 goto out_queue_cache_destroy;
1931
1932         cpu_to_mau = kzalloc(sizeof(struct spu_queue *) * NR_CPUS,
1933                              GFP_KERNEL);
1934         if (!cpu_to_mau)
1935                 goto out_free_cwq_table;
1936
1937         err = 0;
1938
1939 out:
1940         if (err)
1941                 global_ref--;
1942         mutex_unlock(&spu_lock);
1943         return err;
1944
1945 out_free_cwq_table:
1946         kfree(cpu_to_cwq);
1947         cpu_to_cwq = NULL;
1948
1949 out_queue_cache_destroy:
1950         queue_cache_destroy();
1951
1952 out_hvapi_release:
1953         n2_spu_hvapi_unregister();
1954         goto out;
1955 }
1956
1957 static void release_global_resources(void)
1958 {
1959         mutex_lock(&spu_lock);
1960         if (!--global_ref) {
1961                 kfree(cpu_to_cwq);
1962                 cpu_to_cwq = NULL;
1963
1964                 kfree(cpu_to_mau);
1965                 cpu_to_mau = NULL;
1966
1967                 queue_cache_destroy();
1968                 n2_spu_hvapi_unregister();
1969         }
1970         mutex_unlock(&spu_lock);
1971 }
1972
1973 static struct n2_crypto *alloc_n2cp(void)
1974 {
1975         struct n2_crypto *np = kzalloc(sizeof(struct n2_crypto), GFP_KERNEL);
1976
1977         if (np)
1978                 INIT_LIST_HEAD(&np->cwq_list);
1979
1980         return np;
1981 }
1982
1983 static void free_n2cp(struct n2_crypto *np)
1984 {
1985         if (np->cwq_info.ino_table) {
1986                 kfree(np->cwq_info.ino_table);
1987                 np->cwq_info.ino_table = NULL;
1988         }
1989
1990         kfree(np);
1991 }
1992
1993 static void n2_spu_driver_version(void)
1994 {
1995         static int n2_spu_version_printed;
1996
1997         if (n2_spu_version_printed++ == 0)
1998                 pr_info("%s", version);
1999 }
2000
2001 static int n2_crypto_probe(struct platform_device *dev)
2002 {
2003         struct mdesc_handle *mdesc;
2004         const char *full_name;
2005         struct n2_crypto *np;
2006         int err;
2007
2008         n2_spu_driver_version();
2009
2010         full_name = dev->dev.of_node->full_name;
2011         pr_info("Found N2CP at %s\n", full_name);
2012
2013         np = alloc_n2cp();
2014         if (!np) {
2015                 dev_err(&dev->dev, "%s: Unable to allocate n2cp.\n",
2016                         full_name);
2017                 return -ENOMEM;
2018         }
2019
2020         err = grab_global_resources();
2021         if (err) {
2022                 dev_err(&dev->dev, "%s: Unable to grab "
2023                         "global resources.\n", full_name);
2024                 goto out_free_n2cp;
2025         }
2026
2027         mdesc = mdesc_grab();
2028
2029         if (!mdesc) {
2030                 dev_err(&dev->dev, "%s: Unable to grab MDESC.\n",
2031                         full_name);
2032                 err = -ENODEV;
2033                 goto out_free_global;
2034         }
2035         err = grab_mdesc_irq_props(mdesc, dev, &np->cwq_info, "n2cp");
2036         if (err) {
2037                 dev_err(&dev->dev, "%s: Unable to grab IRQ props.\n",
2038                         full_name);
2039                 mdesc_release(mdesc);
2040                 goto out_free_global;
2041         }
2042
2043         err = spu_mdesc_scan(mdesc, dev, &np->cwq_info, &np->cwq_list,
2044                              "cwq", HV_NCS_QTYPE_CWQ, cwq_intr,
2045                              cpu_to_cwq);
2046         mdesc_release(mdesc);
2047
2048         if (err) {
2049                 dev_err(&dev->dev, "%s: CWQ MDESC scan failed.\n",
2050                         full_name);
2051                 goto out_free_global;
2052         }
2053
2054         err = n2_register_algs();
2055         if (err) {
2056                 dev_err(&dev->dev, "%s: Unable to register algorithms.\n",
2057                         full_name);
2058                 goto out_free_spu_list;
2059         }
2060
2061         dev_set_drvdata(&dev->dev, np);
2062
2063         return 0;
2064
2065 out_free_spu_list:
2066         spu_list_destroy(&np->cwq_list);
2067
2068 out_free_global:
2069         release_global_resources();
2070
2071 out_free_n2cp:
2072         free_n2cp(np);
2073
2074         return err;
2075 }
2076
2077 static int n2_crypto_remove(struct platform_device *dev)
2078 {
2079         struct n2_crypto *np = dev_get_drvdata(&dev->dev);
2080
2081         n2_unregister_algs();
2082
2083         spu_list_destroy(&np->cwq_list);
2084
2085         release_global_resources();
2086
2087         free_n2cp(np);
2088
2089         return 0;
2090 }
2091
2092 static struct n2_mau *alloc_ncp(void)
2093 {
2094         struct n2_mau *mp = kzalloc(sizeof(struct n2_mau), GFP_KERNEL);
2095
2096         if (mp)
2097                 INIT_LIST_HEAD(&mp->mau_list);
2098
2099         return mp;
2100 }
2101
2102 static void free_ncp(struct n2_mau *mp)
2103 {
2104         if (mp->mau_info.ino_table) {
2105                 kfree(mp->mau_info.ino_table);
2106                 mp->mau_info.ino_table = NULL;
2107         }
2108
2109         kfree(mp);
2110 }
2111
2112 static int n2_mau_probe(struct platform_device *dev)
2113 {
2114         struct mdesc_handle *mdesc;
2115         const char *full_name;
2116         struct n2_mau *mp;
2117         int err;
2118
2119         n2_spu_driver_version();
2120
2121         full_name = dev->dev.of_node->full_name;
2122         pr_info("Found NCP at %s\n", full_name);
2123
2124         mp = alloc_ncp();
2125         if (!mp) {
2126                 dev_err(&dev->dev, "%s: Unable to allocate ncp.\n",
2127                         full_name);
2128                 return -ENOMEM;
2129         }
2130
2131         err = grab_global_resources();
2132         if (err) {
2133                 dev_err(&dev->dev, "%s: Unable to grab "
2134                         "global resources.\n", full_name);
2135                 goto out_free_ncp;
2136         }
2137
2138         mdesc = mdesc_grab();
2139
2140         if (!mdesc) {
2141                 dev_err(&dev->dev, "%s: Unable to grab MDESC.\n",
2142                         full_name);
2143                 err = -ENODEV;
2144                 goto out_free_global;
2145         }
2146
2147         err = grab_mdesc_irq_props(mdesc, dev, &mp->mau_info, "ncp");
2148         if (err) {
2149                 dev_err(&dev->dev, "%s: Unable to grab IRQ props.\n",
2150                         full_name);
2151                 mdesc_release(mdesc);
2152                 goto out_free_global;
2153         }
2154
2155         err = spu_mdesc_scan(mdesc, dev, &mp->mau_info, &mp->mau_list,
2156                              "mau", HV_NCS_QTYPE_MAU, mau_intr,
2157                              cpu_to_mau);
2158         mdesc_release(mdesc);
2159
2160         if (err) {
2161                 dev_err(&dev->dev, "%s: MAU MDESC scan failed.\n",
2162                         full_name);
2163                 goto out_free_global;
2164         }
2165
2166         dev_set_drvdata(&dev->dev, mp);
2167
2168         return 0;
2169
2170 out_free_global:
2171         release_global_resources();
2172
2173 out_free_ncp:
2174         free_ncp(mp);
2175
2176         return err;
2177 }
2178
2179 static int n2_mau_remove(struct platform_device *dev)
2180 {
2181         struct n2_mau *mp = dev_get_drvdata(&dev->dev);
2182
2183         spu_list_destroy(&mp->mau_list);
2184
2185         release_global_resources();
2186
2187         free_ncp(mp);
2188
2189         return 0;
2190 }
2191
2192 static struct of_device_id n2_crypto_match[] = {
2193         {
2194                 .name = "n2cp",
2195                 .compatible = "SUNW,n2-cwq",
2196         },
2197         {
2198                 .name = "n2cp",
2199                 .compatible = "SUNW,vf-cwq",
2200         },
2201         {
2202                 .name = "n2cp",
2203                 .compatible = "SUNW,kt-cwq",
2204         },
2205         {},
2206 };
2207
2208 MODULE_DEVICE_TABLE(of, n2_crypto_match);
2209
2210 static struct platform_driver n2_crypto_driver = {
2211         .driver = {
2212                 .name           =       "n2cp",
2213                 .of_match_table =       n2_crypto_match,
2214         },
2215         .probe          =       n2_crypto_probe,
2216         .remove         =       n2_crypto_remove,
2217 };
2218
2219 static struct of_device_id n2_mau_match[] = {
2220         {
2221                 .name = "ncp",
2222                 .compatible = "SUNW,n2-mau",
2223         },
2224         {
2225                 .name = "ncp",
2226                 .compatible = "SUNW,vf-mau",
2227         },
2228         {
2229                 .name = "ncp",
2230                 .compatible = "SUNW,kt-mau",
2231         },
2232         {},
2233 };
2234
2235 MODULE_DEVICE_TABLE(of, n2_mau_match);
2236
2237 static struct platform_driver n2_mau_driver = {
2238         .driver = {
2239                 .name           =       "ncp",
2240                 .of_match_table =       n2_mau_match,
2241         },
2242         .probe          =       n2_mau_probe,
2243         .remove         =       n2_mau_remove,
2244 };
2245
2246 static int __init n2_init(void)
2247 {
2248         int err = platform_driver_register(&n2_crypto_driver);
2249
2250         if (!err) {
2251                 err = platform_driver_register(&n2_mau_driver);
2252                 if (err)
2253                         platform_driver_unregister(&n2_crypto_driver);
2254         }
2255         return err;
2256 }
2257
2258 static void __exit n2_exit(void)
2259 {
2260         platform_driver_unregister(&n2_mau_driver);
2261         platform_driver_unregister(&n2_crypto_driver);
2262 }
2263
2264 module_init(n2_init);
2265 module_exit(n2_exit);