ocf: update to version 20120127
[openwrt/svn-archive/archive.git] / target / linux / generic / files / crypto / ocf / safe / safe.c
1 /*-
2 * Linux port done by David McCullough <david_mccullough@mcafee.com>
3 * Copyright (C) 2004-2010 David McCullough
4 * The license and original author are listed below.
5 *
6 * Copyright (c) 2003 Sam Leffler, Errno Consulting
7 * Copyright (c) 2003 Global Technology Associates, Inc.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 __FBSDID("$FreeBSD: src/sys/dev/safe/safe.c,v 1.18 2007/03/21 03:42:50 sam Exp $");
32 */
33
34 #include <linux/version.h>
35 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38) && !defined(AUTOCONF_INCLUDED)
36 #include <linux/config.h>
37 #endif
38 #include <linux/module.h>
39 #include <linux/kernel.h>
40 #include <linux/init.h>
41 #include <linux/list.h>
42 #include <linux/slab.h>
43 #include <linux/wait.h>
44 #include <linux/sched.h>
45 #include <linux/pci.h>
46 #include <linux/delay.h>
47 #include <linux/interrupt.h>
48 #include <linux/spinlock.h>
49 #include <linux/random.h>
50 #include <linux/skbuff.h>
51 #include <asm/io.h>
52
53 /*
54 * SafeNet SafeXcel-1141 hardware crypto accelerator
55 */
56
57 #include <cryptodev.h>
58 #include <uio.h>
59 #include <safe/safereg.h>
60 #include <safe/safevar.h>
61
62 #if 1
63 #define DPRINTF(a) do { \
64 if (debug) { \
65 printk("%s: ", sc ? \
66 device_get_nameunit(sc->sc_dev) : "safe"); \
67 printk a; \
68 } \
69 } while (0)
70 #else
71 #define DPRINTF(a)
72 #endif
73
74 /*
75 * until we find a cleaner way, include the BSD md5/sha1 code
76 * here
77 */
78 #define HMAC_HACK 1
79 #ifdef HMAC_HACK
80 #include <safe/hmachack.h>
81 #include <safe/md5.h>
82 #include <safe/md5.c>
83 #include <safe/sha1.h>
84 #include <safe/sha1.c>
85 #endif /* HMAC_HACK */
86
87 /* add proc entry for this */
88 struct safe_stats safestats;
89
90 #define debug safe_debug
91 int safe_debug = 0;
92 module_param(safe_debug, int, 0644);
93 MODULE_PARM_DESC(safe_debug, "Enable debug");
94
95 static void safe_callback(struct safe_softc *, struct safe_ringentry *);
96 static void safe_feed(struct safe_softc *, struct safe_ringentry *);
97 #if defined(CONFIG_OCF_RANDOMHARVEST) && !defined(SAFE_NO_RNG)
98 static void safe_rng_init(struct safe_softc *);
99 int safe_rngbufsize = 8; /* 32 bytes each read */
100 module_param(safe_rngbufsize, int, 0644);
101 MODULE_PARM_DESC(safe_rngbufsize, "RNG polling buffer size (32-bit words)");
102 int safe_rngmaxalarm = 8; /* max alarms before reset */
103 module_param(safe_rngmaxalarm, int, 0644);
104 MODULE_PARM_DESC(safe_rngmaxalarm, "RNG max alarms before reset");
105 #endif /* SAFE_NO_RNG */
106
107 static void safe_totalreset(struct safe_softc *sc);
108 static int safe_dmamap_aligned(struct safe_softc *sc, const struct safe_operand *op);
109 static int safe_dmamap_uniform(struct safe_softc *sc, const struct safe_operand *op);
110 static int safe_free_entry(struct safe_softc *sc, struct safe_ringentry *re);
111 static int safe_kprocess(device_t dev, struct cryptkop *krp, int hint);
112 static int safe_kstart(struct safe_softc *sc);
113 static int safe_ksigbits(struct safe_softc *sc, struct crparam *cr);
114 static void safe_kfeed(struct safe_softc *sc);
115 static void safe_kpoll(unsigned long arg);
116 static void safe_kload_reg(struct safe_softc *sc, u_int32_t off,
117 u_int32_t len, struct crparam *n);
118
119 static int safe_newsession(device_t, u_int32_t *, struct cryptoini *);
120 static int safe_freesession(device_t, u_int64_t);
121 static int safe_process(device_t, struct cryptop *, int);
122
123 static device_method_t safe_methods = {
124 /* crypto device methods */
125 DEVMETHOD(cryptodev_newsession, safe_newsession),
126 DEVMETHOD(cryptodev_freesession,safe_freesession),
127 DEVMETHOD(cryptodev_process, safe_process),
128 DEVMETHOD(cryptodev_kprocess, safe_kprocess),
129 };
130
131 #define READ_REG(sc,r) readl((sc)->sc_base_addr + (r))
132 #define WRITE_REG(sc,r,val) writel((val), (sc)->sc_base_addr + (r))
133
134 #define SAFE_MAX_CHIPS 8
135 static struct safe_softc *safe_chip_idx[SAFE_MAX_CHIPS];
136
137 /*
138 * split our buffers up into safe DMAable byte fragments to avoid lockup
139 * bug in 1141 HW on rev 1.0.
140 */
141
142 static int
143 pci_map_linear(
144 struct safe_softc *sc,
145 struct safe_operand *buf,
146 void *addr,
147 int len)
148 {
149 dma_addr_t tmp;
150 int chunk, tlen = len;
151
152 tmp = pci_map_single(sc->sc_pcidev, addr, len, PCI_DMA_BIDIRECTIONAL);
153
154 buf->mapsize += len;
155 while (len > 0) {
156 chunk = (len > sc->sc_max_dsize) ? sc->sc_max_dsize : len;
157 buf->segs[buf->nsegs].ds_addr = tmp;
158 buf->segs[buf->nsegs].ds_len = chunk;
159 buf->segs[buf->nsegs].ds_tlen = tlen;
160 buf->nsegs++;
161 tmp += chunk;
162 len -= chunk;
163 tlen = 0;
164 }
165 return 0;
166 }
167
168 /*
169 * map in a given uio buffer (great on some arches :-)
170 */
171
172 static int
173 pci_map_uio(struct safe_softc *sc, struct safe_operand *buf, struct uio *uio)
174 {
175 struct iovec *iov = uio->uio_iov;
176 int n;
177
178 DPRINTF(("%s()\n", __FUNCTION__));
179
180 buf->mapsize = 0;
181 buf->nsegs = 0;
182
183 for (n = 0; n < uio->uio_iovcnt; n++) {
184 pci_map_linear(sc, buf, iov->iov_base, iov->iov_len);
185 iov++;
186 }
187
188 /* identify this buffer by the first segment */
189 buf->map = (void *) buf->segs[0].ds_addr;
190 return(0);
191 }
192
193 /*
194 * map in a given sk_buff
195 */
196
197 static int
198 pci_map_skb(struct safe_softc *sc,struct safe_operand *buf,struct sk_buff *skb)
199 {
200 int i;
201
202 DPRINTF(("%s()\n", __FUNCTION__));
203
204 buf->mapsize = 0;
205 buf->nsegs = 0;
206
207 pci_map_linear(sc, buf, skb->data, skb_headlen(skb));
208
209 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
210 pci_map_linear(sc, buf,
211 page_address(skb_frag_page(&skb_shinfo(skb)->frags[i])) +
212 skb_shinfo(skb)->frags[i].page_offset,
213 skb_shinfo(skb)->frags[i].size);
214 }
215
216 /* identify this buffer by the first segment */
217 buf->map = (void *) buf->segs[0].ds_addr;
218 return(0);
219 }
220
221
222 #if 0 /* not needed at this time */
223 static void
224 pci_sync_operand(struct safe_softc *sc, struct safe_operand *buf)
225 {
226 int i;
227
228 DPRINTF(("%s()\n", __FUNCTION__));
229 for (i = 0; i < buf->nsegs; i++)
230 pci_dma_sync_single_for_cpu(sc->sc_pcidev, buf->segs[i].ds_addr,
231 buf->segs[i].ds_len, PCI_DMA_BIDIRECTIONAL);
232 }
233 #endif
234
235 static void
236 pci_unmap_operand(struct safe_softc *sc, struct safe_operand *buf)
237 {
238 int i;
239 DPRINTF(("%s()\n", __FUNCTION__));
240 for (i = 0; i < buf->nsegs; i++) {
241 if (buf->segs[i].ds_tlen) {
242 DPRINTF(("%s - unmap %d 0x%x %d\n", __FUNCTION__, i, buf->segs[i].ds_addr, buf->segs[i].ds_tlen));
243 pci_unmap_single(sc->sc_pcidev, buf->segs[i].ds_addr,
244 buf->segs[i].ds_tlen, PCI_DMA_BIDIRECTIONAL);
245 DPRINTF(("%s - unmap %d 0x%x %d done\n", __FUNCTION__, i, buf->segs[i].ds_addr, buf->segs[i].ds_tlen));
246 }
247 buf->segs[i].ds_addr = 0;
248 buf->segs[i].ds_len = 0;
249 buf->segs[i].ds_tlen = 0;
250 }
251 buf->nsegs = 0;
252 buf->mapsize = 0;
253 buf->map = 0;
254 }
255
256
257 /*
258 * SafeXcel Interrupt routine
259 */
260 static irqreturn_t
261 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
262 safe_intr(int irq, void *arg)
263 #else
264 safe_intr(int irq, void *arg, struct pt_regs *regs)
265 #endif
266 {
267 struct safe_softc *sc = arg;
268 int stat;
269 unsigned long flags;
270
271 stat = READ_REG(sc, SAFE_HM_STAT);
272
273 DPRINTF(("%s(stat=0x%x)\n", __FUNCTION__, stat));
274
275 if (stat == 0) /* shared irq, not for us */
276 return IRQ_NONE;
277
278 WRITE_REG(sc, SAFE_HI_CLR, stat); /* IACK */
279
280 if ((stat & SAFE_INT_PE_DDONE)) {
281 /*
282 * Descriptor(s) done; scan the ring and
283 * process completed operations.
284 */
285 spin_lock_irqsave(&sc->sc_ringmtx, flags);
286 while (sc->sc_back != sc->sc_front) {
287 struct safe_ringentry *re = sc->sc_back;
288
289 #ifdef SAFE_DEBUG
290 if (debug) {
291 safe_dump_ringstate(sc, __func__);
292 safe_dump_request(sc, __func__, re);
293 }
294 #endif
295 /*
296 * safe_process marks ring entries that were allocated
297 * but not used with a csr of zero. This insures the
298 * ring front pointer never needs to be set backwards
299 * in the event that an entry is allocated but not used
300 * because of a setup error.
301 */
302 DPRINTF(("%s re->re_desc.d_csr=0x%x\n", __FUNCTION__, re->re_desc.d_csr));
303 if (re->re_desc.d_csr != 0) {
304 if (!SAFE_PE_CSR_IS_DONE(re->re_desc.d_csr)) {
305 DPRINTF(("%s !CSR_IS_DONE\n", __FUNCTION__));
306 break;
307 }
308 if (!SAFE_PE_LEN_IS_DONE(re->re_desc.d_len)) {
309 DPRINTF(("%s !LEN_IS_DONE\n", __FUNCTION__));
310 break;
311 }
312 sc->sc_nqchip--;
313 safe_callback(sc, re);
314 }
315 if (++(sc->sc_back) == sc->sc_ringtop)
316 sc->sc_back = sc->sc_ring;
317 }
318 spin_unlock_irqrestore(&sc->sc_ringmtx, flags);
319 }
320
321 /*
322 * Check to see if we got any DMA Error
323 */
324 if (stat & SAFE_INT_PE_ERROR) {
325 printk("%s: dmaerr dmastat %08x\n", device_get_nameunit(sc->sc_dev),
326 (int)READ_REG(sc, SAFE_PE_DMASTAT));
327 safestats.st_dmaerr++;
328 safe_totalreset(sc);
329 #if 0
330 safe_feed(sc);
331 #endif
332 }
333
334 if (sc->sc_needwakeup) { /* XXX check high watermark */
335 int wakeup = sc->sc_needwakeup & (CRYPTO_SYMQ|CRYPTO_ASYMQ);
336 DPRINTF(("%s: wakeup crypto %x\n", __func__,
337 sc->sc_needwakeup));
338 sc->sc_needwakeup &= ~wakeup;
339 crypto_unblock(sc->sc_cid, wakeup);
340 }
341
342 return IRQ_HANDLED;
343 }
344
345 /*
346 * safe_feed() - post a request to chip
347 */
348 static void
349 safe_feed(struct safe_softc *sc, struct safe_ringentry *re)
350 {
351 DPRINTF(("%s()\n", __FUNCTION__));
352 #ifdef SAFE_DEBUG
353 if (debug) {
354 safe_dump_ringstate(sc, __func__);
355 safe_dump_request(sc, __func__, re);
356 }
357 #endif
358 sc->sc_nqchip++;
359 if (sc->sc_nqchip > safestats.st_maxqchip)
360 safestats.st_maxqchip = sc->sc_nqchip;
361 /* poke h/w to check descriptor ring, any value can be written */
362 WRITE_REG(sc, SAFE_HI_RD_DESCR, 0);
363 }
364
365 #define N(a) (sizeof(a) / sizeof (a[0]))
366 static void
367 safe_setup_enckey(struct safe_session *ses, caddr_t key)
368 {
369 int i;
370
371 bcopy(key, ses->ses_key, ses->ses_klen / 8);
372
373 /* PE is little-endian, insure proper byte order */
374 for (i = 0; i < N(ses->ses_key); i++)
375 ses->ses_key[i] = htole32(ses->ses_key[i]);
376 }
377
378 static void
379 safe_setup_mackey(struct safe_session *ses, int algo, caddr_t key, int klen)
380 {
381 #ifdef HMAC_HACK
382 MD5_CTX md5ctx;
383 SHA1_CTX sha1ctx;
384 int i;
385
386
387 for (i = 0; i < klen; i++)
388 key[i] ^= HMAC_IPAD_VAL;
389
390 if (algo == CRYPTO_MD5_HMAC) {
391 MD5Init(&md5ctx);
392 MD5Update(&md5ctx, key, klen);
393 MD5Update(&md5ctx, hmac_ipad_buffer, MD5_HMAC_BLOCK_LEN - klen);
394 bcopy(md5ctx.md5_st8, ses->ses_hminner, sizeof(md5ctx.md5_st8));
395 } else {
396 SHA1Init(&sha1ctx);
397 SHA1Update(&sha1ctx, key, klen);
398 SHA1Update(&sha1ctx, hmac_ipad_buffer,
399 SHA1_HMAC_BLOCK_LEN - klen);
400 bcopy(sha1ctx.h.b32, ses->ses_hminner, sizeof(sha1ctx.h.b32));
401 }
402
403 for (i = 0; i < klen; i++)
404 key[i] ^= (HMAC_IPAD_VAL ^ HMAC_OPAD_VAL);
405
406 if (algo == CRYPTO_MD5_HMAC) {
407 MD5Init(&md5ctx);
408 MD5Update(&md5ctx, key, klen);
409 MD5Update(&md5ctx, hmac_opad_buffer, MD5_HMAC_BLOCK_LEN - klen);
410 bcopy(md5ctx.md5_st8, ses->ses_hmouter, sizeof(md5ctx.md5_st8));
411 } else {
412 SHA1Init(&sha1ctx);
413 SHA1Update(&sha1ctx, key, klen);
414 SHA1Update(&sha1ctx, hmac_opad_buffer,
415 SHA1_HMAC_BLOCK_LEN - klen);
416 bcopy(sha1ctx.h.b32, ses->ses_hmouter, sizeof(sha1ctx.h.b32));
417 }
418
419 for (i = 0; i < klen; i++)
420 key[i] ^= HMAC_OPAD_VAL;
421
422 #if 0
423 /*
424 * this code prevents SHA working on a BE host,
425 * so it is obviously wrong. I think the byte
426 * swap setup we do with the chip fixes this for us
427 */
428
429 /* PE is little-endian, insure proper byte order */
430 for (i = 0; i < N(ses->ses_hminner); i++) {
431 ses->ses_hminner[i] = htole32(ses->ses_hminner[i]);
432 ses->ses_hmouter[i] = htole32(ses->ses_hmouter[i]);
433 }
434 #endif
435 #else /* HMAC_HACK */
436 printk("safe: md5/sha not implemented\n");
437 #endif /* HMAC_HACK */
438 }
439 #undef N
440
441 /*
442 * Allocate a new 'session' and return an encoded session id. 'sidp'
443 * contains our registration id, and should contain an encoded session
444 * id on successful allocation.
445 */
446 static int
447 safe_newsession(device_t dev, u_int32_t *sidp, struct cryptoini *cri)
448 {
449 struct safe_softc *sc = device_get_softc(dev);
450 struct cryptoini *c, *encini = NULL, *macini = NULL;
451 struct safe_session *ses = NULL;
452 int sesn;
453
454 DPRINTF(("%s()\n", __FUNCTION__));
455
456 if (sidp == NULL || cri == NULL || sc == NULL)
457 return (EINVAL);
458
459 for (c = cri; c != NULL; c = c->cri_next) {
460 if (c->cri_alg == CRYPTO_MD5_HMAC ||
461 c->cri_alg == CRYPTO_SHA1_HMAC ||
462 c->cri_alg == CRYPTO_NULL_HMAC) {
463 if (macini)
464 return (EINVAL);
465 macini = c;
466 } else if (c->cri_alg == CRYPTO_DES_CBC ||
467 c->cri_alg == CRYPTO_3DES_CBC ||
468 c->cri_alg == CRYPTO_AES_CBC ||
469 c->cri_alg == CRYPTO_NULL_CBC) {
470 if (encini)
471 return (EINVAL);
472 encini = c;
473 } else
474 return (EINVAL);
475 }
476 if (encini == NULL && macini == NULL)
477 return (EINVAL);
478 if (encini) { /* validate key length */
479 switch (encini->cri_alg) {
480 case CRYPTO_DES_CBC:
481 if (encini->cri_klen != 64)
482 return (EINVAL);
483 break;
484 case CRYPTO_3DES_CBC:
485 if (encini->cri_klen != 192)
486 return (EINVAL);
487 break;
488 case CRYPTO_AES_CBC:
489 if (encini->cri_klen != 128 &&
490 encini->cri_klen != 192 &&
491 encini->cri_klen != 256)
492 return (EINVAL);
493 break;
494 }
495 }
496
497 if (sc->sc_sessions == NULL) {
498 ses = sc->sc_sessions = (struct safe_session *)
499 kmalloc(sizeof(struct safe_session), SLAB_ATOMIC);
500 if (ses == NULL)
501 return (ENOMEM);
502 memset(ses, 0, sizeof(struct safe_session));
503 sesn = 0;
504 sc->sc_nsessions = 1;
505 } else {
506 for (sesn = 0; sesn < sc->sc_nsessions; sesn++) {
507 if (sc->sc_sessions[sesn].ses_used == 0) {
508 ses = &sc->sc_sessions[sesn];
509 break;
510 }
511 }
512
513 if (ses == NULL) {
514 sesn = sc->sc_nsessions;
515 ses = (struct safe_session *)
516 kmalloc((sesn + 1) * sizeof(struct safe_session), SLAB_ATOMIC);
517 if (ses == NULL)
518 return (ENOMEM);
519 memset(ses, 0, (sesn + 1) * sizeof(struct safe_session));
520 bcopy(sc->sc_sessions, ses, sesn *
521 sizeof(struct safe_session));
522 bzero(sc->sc_sessions, sesn *
523 sizeof(struct safe_session));
524 kfree(sc->sc_sessions);
525 sc->sc_sessions = ses;
526 ses = &sc->sc_sessions[sesn];
527 sc->sc_nsessions++;
528 }
529 }
530
531 bzero(ses, sizeof(struct safe_session));
532 ses->ses_used = 1;
533
534 if (encini) {
535 ses->ses_klen = encini->cri_klen;
536 if (encini->cri_key != NULL)
537 safe_setup_enckey(ses, encini->cri_key);
538 }
539
540 if (macini) {
541 ses->ses_mlen = macini->cri_mlen;
542 if (ses->ses_mlen == 0) {
543 if (macini->cri_alg == CRYPTO_MD5_HMAC)
544 ses->ses_mlen = MD5_HASH_LEN;
545 else
546 ses->ses_mlen = SHA1_HASH_LEN;
547 }
548
549 if (macini->cri_key != NULL) {
550 safe_setup_mackey(ses, macini->cri_alg, macini->cri_key,
551 macini->cri_klen / 8);
552 }
553 }
554
555 *sidp = SAFE_SID(device_get_unit(sc->sc_dev), sesn);
556 return (0);
557 }
558
559 /*
560 * Deallocate a session.
561 */
562 static int
563 safe_freesession(device_t dev, u_int64_t tid)
564 {
565 struct safe_softc *sc = device_get_softc(dev);
566 int session, ret;
567 u_int32_t sid = ((u_int32_t) tid) & 0xffffffff;
568
569 DPRINTF(("%s()\n", __FUNCTION__));
570
571 if (sc == NULL)
572 return (EINVAL);
573
574 session = SAFE_SESSION(sid);
575 if (session < sc->sc_nsessions) {
576 bzero(&sc->sc_sessions[session], sizeof(sc->sc_sessions[session]));
577 ret = 0;
578 } else
579 ret = EINVAL;
580 return (ret);
581 }
582
583
584 static int
585 safe_process(device_t dev, struct cryptop *crp, int hint)
586 {
587 struct safe_softc *sc = device_get_softc(dev);
588 int err = 0, i, nicealign, uniform;
589 struct cryptodesc *crd1, *crd2, *maccrd, *enccrd;
590 int bypass, oplen, ivsize;
591 caddr_t iv;
592 int16_t coffset;
593 struct safe_session *ses;
594 struct safe_ringentry *re;
595 struct safe_sarec *sa;
596 struct safe_pdesc *pd;
597 u_int32_t cmd0, cmd1, staterec, rand_iv[4];
598 unsigned long flags;
599
600 DPRINTF(("%s()\n", __FUNCTION__));
601
602 if (crp == NULL || crp->crp_callback == NULL || sc == NULL) {
603 safestats.st_invalid++;
604 return (EINVAL);
605 }
606 if (SAFE_SESSION(crp->crp_sid) >= sc->sc_nsessions) {
607 safestats.st_badsession++;
608 return (EINVAL);
609 }
610
611 spin_lock_irqsave(&sc->sc_ringmtx, flags);
612 if (sc->sc_front == sc->sc_back && sc->sc_nqchip != 0) {
613 safestats.st_ringfull++;
614 sc->sc_needwakeup |= CRYPTO_SYMQ;
615 spin_unlock_irqrestore(&sc->sc_ringmtx, flags);
616 return (ERESTART);
617 }
618 re = sc->sc_front;
619
620 staterec = re->re_sa.sa_staterec; /* save */
621 /* NB: zero everything but the PE descriptor */
622 bzero(&re->re_sa, sizeof(struct safe_ringentry) - sizeof(re->re_desc));
623 re->re_sa.sa_staterec = staterec; /* restore */
624
625 re->re_crp = crp;
626 re->re_sesn = SAFE_SESSION(crp->crp_sid);
627
628 re->re_src.nsegs = 0;
629 re->re_dst.nsegs = 0;
630
631 if (crp->crp_flags & CRYPTO_F_SKBUF) {
632 re->re_src_skb = (struct sk_buff *)crp->crp_buf;
633 re->re_dst_skb = (struct sk_buff *)crp->crp_buf;
634 } else if (crp->crp_flags & CRYPTO_F_IOV) {
635 re->re_src_io = (struct uio *)crp->crp_buf;
636 re->re_dst_io = (struct uio *)crp->crp_buf;
637 } else {
638 safestats.st_badflags++;
639 err = EINVAL;
640 goto errout; /* XXX we don't handle contiguous blocks! */
641 }
642
643 sa = &re->re_sa;
644 ses = &sc->sc_sessions[re->re_sesn];
645
646 crd1 = crp->crp_desc;
647 if (crd1 == NULL) {
648 safestats.st_nodesc++;
649 err = EINVAL;
650 goto errout;
651 }
652 crd2 = crd1->crd_next;
653
654 cmd0 = SAFE_SA_CMD0_BASIC; /* basic group operation */
655 cmd1 = 0;
656 if (crd2 == NULL) {
657 if (crd1->crd_alg == CRYPTO_MD5_HMAC ||
658 crd1->crd_alg == CRYPTO_SHA1_HMAC ||
659 crd1->crd_alg == CRYPTO_NULL_HMAC) {
660 maccrd = crd1;
661 enccrd = NULL;
662 cmd0 |= SAFE_SA_CMD0_OP_HASH;
663 } else if (crd1->crd_alg == CRYPTO_DES_CBC ||
664 crd1->crd_alg == CRYPTO_3DES_CBC ||
665 crd1->crd_alg == CRYPTO_AES_CBC ||
666 crd1->crd_alg == CRYPTO_NULL_CBC) {
667 maccrd = NULL;
668 enccrd = crd1;
669 cmd0 |= SAFE_SA_CMD0_OP_CRYPT;
670 } else {
671 safestats.st_badalg++;
672 err = EINVAL;
673 goto errout;
674 }
675 } else {
676 if ((crd1->crd_alg == CRYPTO_MD5_HMAC ||
677 crd1->crd_alg == CRYPTO_SHA1_HMAC ||
678 crd1->crd_alg == CRYPTO_NULL_HMAC) &&
679 (crd2->crd_alg == CRYPTO_DES_CBC ||
680 crd2->crd_alg == CRYPTO_3DES_CBC ||
681 crd2->crd_alg == CRYPTO_AES_CBC ||
682 crd2->crd_alg == CRYPTO_NULL_CBC) &&
683 ((crd2->crd_flags & CRD_F_ENCRYPT) == 0)) {
684 maccrd = crd1;
685 enccrd = crd2;
686 } else if ((crd1->crd_alg == CRYPTO_DES_CBC ||
687 crd1->crd_alg == CRYPTO_3DES_CBC ||
688 crd1->crd_alg == CRYPTO_AES_CBC ||
689 crd1->crd_alg == CRYPTO_NULL_CBC) &&
690 (crd2->crd_alg == CRYPTO_MD5_HMAC ||
691 crd2->crd_alg == CRYPTO_SHA1_HMAC ||
692 crd2->crd_alg == CRYPTO_NULL_HMAC) &&
693 (crd1->crd_flags & CRD_F_ENCRYPT)) {
694 enccrd = crd1;
695 maccrd = crd2;
696 } else {
697 safestats.st_badalg++;
698 err = EINVAL;
699 goto errout;
700 }
701 cmd0 |= SAFE_SA_CMD0_OP_BOTH;
702 }
703
704 if (enccrd) {
705 if (enccrd->crd_flags & CRD_F_KEY_EXPLICIT)
706 safe_setup_enckey(ses, enccrd->crd_key);
707
708 if (enccrd->crd_alg == CRYPTO_DES_CBC) {
709 cmd0 |= SAFE_SA_CMD0_DES;
710 cmd1 |= SAFE_SA_CMD1_CBC;
711 ivsize = 2*sizeof(u_int32_t);
712 } else if (enccrd->crd_alg == CRYPTO_3DES_CBC) {
713 cmd0 |= SAFE_SA_CMD0_3DES;
714 cmd1 |= SAFE_SA_CMD1_CBC;
715 ivsize = 2*sizeof(u_int32_t);
716 } else if (enccrd->crd_alg == CRYPTO_AES_CBC) {
717 cmd0 |= SAFE_SA_CMD0_AES;
718 cmd1 |= SAFE_SA_CMD1_CBC;
719 if (ses->ses_klen == 128)
720 cmd1 |= SAFE_SA_CMD1_AES128;
721 else if (ses->ses_klen == 192)
722 cmd1 |= SAFE_SA_CMD1_AES192;
723 else
724 cmd1 |= SAFE_SA_CMD1_AES256;
725 ivsize = 4*sizeof(u_int32_t);
726 } else {
727 cmd0 |= SAFE_SA_CMD0_CRYPT_NULL;
728 ivsize = 0;
729 }
730
731 /*
732 * Setup encrypt/decrypt state. When using basic ops
733 * we can't use an inline IV because hash/crypt offset
734 * must be from the end of the IV to the start of the
735 * crypt data and this leaves out the preceding header
736 * from the hash calculation. Instead we place the IV
737 * in the state record and set the hash/crypt offset to
738 * copy both the header+IV.
739 */
740 if (enccrd->crd_flags & CRD_F_ENCRYPT) {
741 cmd0 |= SAFE_SA_CMD0_OUTBOUND;
742
743 if (enccrd->crd_flags & CRD_F_IV_EXPLICIT)
744 iv = enccrd->crd_iv;
745 else
746 read_random((iv = (caddr_t) &rand_iv[0]), sizeof(rand_iv));
747 if ((enccrd->crd_flags & CRD_F_IV_PRESENT) == 0) {
748 crypto_copyback(crp->crp_flags, crp->crp_buf,
749 enccrd->crd_inject, ivsize, iv);
750 }
751 bcopy(iv, re->re_sastate.sa_saved_iv, ivsize);
752 /* make iv LE */
753 for (i = 0; i < ivsize/sizeof(re->re_sastate.sa_saved_iv[0]); i++)
754 re->re_sastate.sa_saved_iv[i] =
755 cpu_to_le32(re->re_sastate.sa_saved_iv[i]);
756 cmd0 |= SAFE_SA_CMD0_IVLD_STATE | SAFE_SA_CMD0_SAVEIV;
757 re->re_flags |= SAFE_QFLAGS_COPYOUTIV;
758 } else {
759 cmd0 |= SAFE_SA_CMD0_INBOUND;
760
761 if (enccrd->crd_flags & CRD_F_IV_EXPLICIT) {
762 bcopy(enccrd->crd_iv,
763 re->re_sastate.sa_saved_iv, ivsize);
764 } else {
765 crypto_copydata(crp->crp_flags, crp->crp_buf,
766 enccrd->crd_inject, ivsize,
767 (caddr_t)re->re_sastate.sa_saved_iv);
768 }
769 /* make iv LE */
770 for (i = 0; i < ivsize/sizeof(re->re_sastate.sa_saved_iv[0]); i++)
771 re->re_sastate.sa_saved_iv[i] =
772 cpu_to_le32(re->re_sastate.sa_saved_iv[i]);
773 cmd0 |= SAFE_SA_CMD0_IVLD_STATE;
774 }
775 /*
776 * For basic encryption use the zero pad algorithm.
777 * This pads results to an 8-byte boundary and
778 * suppresses padding verification for inbound (i.e.
779 * decrypt) operations.
780 *
781 * NB: Not sure if the 8-byte pad boundary is a problem.
782 */
783 cmd0 |= SAFE_SA_CMD0_PAD_ZERO;
784
785 /* XXX assert key bufs have the same size */
786 bcopy(ses->ses_key, sa->sa_key, sizeof(sa->sa_key));
787 }
788
789 if (maccrd) {
790 if (maccrd->crd_flags & CRD_F_KEY_EXPLICIT) {
791 safe_setup_mackey(ses, maccrd->crd_alg,
792 maccrd->crd_key, maccrd->crd_klen / 8);
793 }
794
795 if (maccrd->crd_alg == CRYPTO_MD5_HMAC) {
796 cmd0 |= SAFE_SA_CMD0_MD5;
797 cmd1 |= SAFE_SA_CMD1_HMAC; /* NB: enable HMAC */
798 } else if (maccrd->crd_alg == CRYPTO_SHA1_HMAC) {
799 cmd0 |= SAFE_SA_CMD0_SHA1;
800 cmd1 |= SAFE_SA_CMD1_HMAC; /* NB: enable HMAC */
801 } else {
802 cmd0 |= SAFE_SA_CMD0_HASH_NULL;
803 }
804 /*
805 * Digest data is loaded from the SA and the hash
806 * result is saved to the state block where we
807 * retrieve it for return to the caller.
808 */
809 /* XXX assert digest bufs have the same size */
810 bcopy(ses->ses_hminner, sa->sa_indigest,
811 sizeof(sa->sa_indigest));
812 bcopy(ses->ses_hmouter, sa->sa_outdigest,
813 sizeof(sa->sa_outdigest));
814
815 cmd0 |= SAFE_SA_CMD0_HSLD_SA | SAFE_SA_CMD0_SAVEHASH;
816 re->re_flags |= SAFE_QFLAGS_COPYOUTICV;
817 }
818
819 if (enccrd && maccrd) {
820 /*
821 * The offset from hash data to the start of
822 * crypt data is the difference in the skips.
823 */
824 bypass = maccrd->crd_skip;
825 coffset = enccrd->crd_skip - maccrd->crd_skip;
826 if (coffset < 0) {
827 DPRINTF(("%s: hash does not precede crypt; "
828 "mac skip %u enc skip %u\n",
829 __func__, maccrd->crd_skip, enccrd->crd_skip));
830 safestats.st_skipmismatch++;
831 err = EINVAL;
832 goto errout;
833 }
834 oplen = enccrd->crd_skip + enccrd->crd_len;
835 if (maccrd->crd_skip + maccrd->crd_len != oplen) {
836 DPRINTF(("%s: hash amount %u != crypt amount %u\n",
837 __func__, maccrd->crd_skip + maccrd->crd_len,
838 oplen));
839 safestats.st_lenmismatch++;
840 err = EINVAL;
841 goto errout;
842 }
843 #ifdef SAFE_DEBUG
844 if (debug) {
845 printf("mac: skip %d, len %d, inject %d\n",
846 maccrd->crd_skip, maccrd->crd_len,
847 maccrd->crd_inject);
848 printf("enc: skip %d, len %d, inject %d\n",
849 enccrd->crd_skip, enccrd->crd_len,
850 enccrd->crd_inject);
851 printf("bypass %d coffset %d oplen %d\n",
852 bypass, coffset, oplen);
853 }
854 #endif
855 if (coffset & 3) { /* offset must be 32-bit aligned */
856 DPRINTF(("%s: coffset %u misaligned\n",
857 __func__, coffset));
858 safestats.st_coffmisaligned++;
859 err = EINVAL;
860 goto errout;
861 }
862 coffset >>= 2;
863 if (coffset > 255) { /* offset must be <256 dwords */
864 DPRINTF(("%s: coffset %u too big\n",
865 __func__, coffset));
866 safestats.st_cofftoobig++;
867 err = EINVAL;
868 goto errout;
869 }
870 /*
871 * Tell the hardware to copy the header to the output.
872 * The header is defined as the data from the end of
873 * the bypass to the start of data to be encrypted.
874 * Typically this is the inline IV. Note that you need
875 * to do this even if src+dst are the same; it appears
876 * that w/o this bit the crypted data is written
877 * immediately after the bypass data.
878 */
879 cmd1 |= SAFE_SA_CMD1_HDRCOPY;
880 /*
881 * Disable IP header mutable bit handling. This is
882 * needed to get correct HMAC calculations.
883 */
884 cmd1 |= SAFE_SA_CMD1_MUTABLE;
885 } else {
886 if (enccrd) {
887 bypass = enccrd->crd_skip;
888 oplen = bypass + enccrd->crd_len;
889 } else {
890 bypass = maccrd->crd_skip;
891 oplen = bypass + maccrd->crd_len;
892 }
893 coffset = 0;
894 }
895 /* XXX verify multiple of 4 when using s/g */
896 if (bypass > 96) { /* bypass offset must be <= 96 bytes */
897 DPRINTF(("%s: bypass %u too big\n", __func__, bypass));
898 safestats.st_bypasstoobig++;
899 err = EINVAL;
900 goto errout;
901 }
902
903 if (crp->crp_flags & CRYPTO_F_SKBUF) {
904 if (pci_map_skb(sc, &re->re_src, re->re_src_skb)) {
905 safestats.st_noload++;
906 err = ENOMEM;
907 goto errout;
908 }
909 } else if (crp->crp_flags & CRYPTO_F_IOV) {
910 if (pci_map_uio(sc, &re->re_src, re->re_src_io)) {
911 safestats.st_noload++;
912 err = ENOMEM;
913 goto errout;
914 }
915 }
916 nicealign = safe_dmamap_aligned(sc, &re->re_src);
917 uniform = safe_dmamap_uniform(sc, &re->re_src);
918
919 DPRINTF(("src nicealign %u uniform %u nsegs %u\n",
920 nicealign, uniform, re->re_src.nsegs));
921 if (re->re_src.nsegs > 1) {
922 re->re_desc.d_src = sc->sc_spalloc.dma_paddr +
923 ((caddr_t) sc->sc_spfree - (caddr_t) sc->sc_spring);
924 for (i = 0; i < re->re_src_nsegs; i++) {
925 /* NB: no need to check if there's space */
926 pd = sc->sc_spfree;
927 if (++(sc->sc_spfree) == sc->sc_springtop)
928 sc->sc_spfree = sc->sc_spring;
929
930 KASSERT((pd->pd_flags&3) == 0 ||
931 (pd->pd_flags&3) == SAFE_PD_DONE,
932 ("bogus source particle descriptor; flags %x",
933 pd->pd_flags));
934 pd->pd_addr = re->re_src_segs[i].ds_addr;
935 pd->pd_size = re->re_src_segs[i].ds_len;
936 pd->pd_flags = SAFE_PD_READY;
937 }
938 cmd0 |= SAFE_SA_CMD0_IGATHER;
939 } else {
940 /*
941 * No need for gather, reference the operand directly.
942 */
943 re->re_desc.d_src = re->re_src_segs[0].ds_addr;
944 }
945
946 if (enccrd == NULL && maccrd != NULL) {
947 /*
948 * Hash op; no destination needed.
949 */
950 } else {
951 if (crp->crp_flags & (CRYPTO_F_IOV|CRYPTO_F_SKBUF)) {
952 if (!nicealign) {
953 safestats.st_iovmisaligned++;
954 err = EINVAL;
955 goto errout;
956 }
957 if (uniform != 1) {
958 device_printf(sc->sc_dev, "!uniform source\n");
959 if (!uniform) {
960 /*
961 * There's no way to handle the DMA
962 * requirements with this uio. We
963 * could create a separate DMA area for
964 * the result and then copy it back,
965 * but for now we just bail and return
966 * an error. Note that uio requests
967 * > SAFE_MAX_DSIZE are handled because
968 * the DMA map and segment list for the
969 * destination wil result in a
970 * destination particle list that does
971 * the necessary scatter DMA.
972 */
973 safestats.st_iovnotuniform++;
974 err = EINVAL;
975 goto errout;
976 }
977 } else
978 re->re_dst = re->re_src;
979 } else {
980 safestats.st_badflags++;
981 err = EINVAL;
982 goto errout;
983 }
984
985 if (re->re_dst.nsegs > 1) {
986 re->re_desc.d_dst = sc->sc_dpalloc.dma_paddr +
987 ((caddr_t) sc->sc_dpfree - (caddr_t) sc->sc_dpring);
988 for (i = 0; i < re->re_dst_nsegs; i++) {
989 pd = sc->sc_dpfree;
990 KASSERT((pd->pd_flags&3) == 0 ||
991 (pd->pd_flags&3) == SAFE_PD_DONE,
992 ("bogus dest particle descriptor; flags %x",
993 pd->pd_flags));
994 if (++(sc->sc_dpfree) == sc->sc_dpringtop)
995 sc->sc_dpfree = sc->sc_dpring;
996 pd->pd_addr = re->re_dst_segs[i].ds_addr;
997 pd->pd_flags = SAFE_PD_READY;
998 }
999 cmd0 |= SAFE_SA_CMD0_OSCATTER;
1000 } else {
1001 /*
1002 * No need for scatter, reference the operand directly.
1003 */
1004 re->re_desc.d_dst = re->re_dst_segs[0].ds_addr;
1005 }
1006 }
1007
1008 /*
1009 * All done with setup; fillin the SA command words
1010 * and the packet engine descriptor. The operation
1011 * is now ready for submission to the hardware.
1012 */
1013 sa->sa_cmd0 = cmd0 | SAFE_SA_CMD0_IPCI | SAFE_SA_CMD0_OPCI;
1014 sa->sa_cmd1 = cmd1
1015 | (coffset << SAFE_SA_CMD1_OFFSET_S)
1016 | SAFE_SA_CMD1_SAREV1 /* Rev 1 SA data structure */
1017 | SAFE_SA_CMD1_SRPCI
1018 ;
1019 /*
1020 * NB: the order of writes is important here. In case the
1021 * chip is scanning the ring because of an outstanding request
1022 * it might nab this one too. In that case we need to make
1023 * sure the setup is complete before we write the length
1024 * field of the descriptor as it signals the descriptor is
1025 * ready for processing.
1026 */
1027 re->re_desc.d_csr = SAFE_PE_CSR_READY | SAFE_PE_CSR_SAPCI;
1028 if (maccrd)
1029 re->re_desc.d_csr |= SAFE_PE_CSR_LOADSA | SAFE_PE_CSR_HASHFINAL;
1030 wmb();
1031 re->re_desc.d_len = oplen
1032 | SAFE_PE_LEN_READY
1033 | (bypass << SAFE_PE_LEN_BYPASS_S)
1034 ;
1035
1036 safestats.st_ipackets++;
1037 safestats.st_ibytes += oplen;
1038
1039 if (++(sc->sc_front) == sc->sc_ringtop)
1040 sc->sc_front = sc->sc_ring;
1041
1042 /* XXX honor batching */
1043 safe_feed(sc, re);
1044 spin_unlock_irqrestore(&sc->sc_ringmtx, flags);
1045 return (0);
1046
1047 errout:
1048 if (re->re_src.map != re->re_dst.map)
1049 pci_unmap_operand(sc, &re->re_dst);
1050 if (re->re_src.map)
1051 pci_unmap_operand(sc, &re->re_src);
1052 spin_unlock_irqrestore(&sc->sc_ringmtx, flags);
1053 if (err != ERESTART) {
1054 crp->crp_etype = err;
1055 crypto_done(crp);
1056 } else {
1057 sc->sc_needwakeup |= CRYPTO_SYMQ;
1058 }
1059 return (err);
1060 }
1061
1062 static void
1063 safe_callback(struct safe_softc *sc, struct safe_ringentry *re)
1064 {
1065 struct cryptop *crp = (struct cryptop *)re->re_crp;
1066 struct cryptodesc *crd;
1067
1068 DPRINTF(("%s()\n", __FUNCTION__));
1069
1070 safestats.st_opackets++;
1071 safestats.st_obytes += re->re_dst.mapsize;
1072
1073 if (re->re_desc.d_csr & SAFE_PE_CSR_STATUS) {
1074 device_printf(sc->sc_dev, "csr 0x%x cmd0 0x%x cmd1 0x%x\n",
1075 re->re_desc.d_csr,
1076 re->re_sa.sa_cmd0, re->re_sa.sa_cmd1);
1077 safestats.st_peoperr++;
1078 crp->crp_etype = EIO; /* something more meaningful? */
1079 }
1080
1081 if (re->re_dst.map != NULL && re->re_dst.map != re->re_src.map)
1082 pci_unmap_operand(sc, &re->re_dst);
1083 pci_unmap_operand(sc, &re->re_src);
1084
1085 /*
1086 * If result was written to a differet mbuf chain, swap
1087 * it in as the return value and reclaim the original.
1088 */
1089 if ((crp->crp_flags & CRYPTO_F_SKBUF) && re->re_src_skb != re->re_dst_skb) {
1090 device_printf(sc->sc_dev, "no CRYPTO_F_SKBUF swapping support\n");
1091 /* kfree_skb(skb) */
1092 /* crp->crp_buf = (caddr_t)re->re_dst_skb */
1093 return;
1094 }
1095
1096 if (re->re_flags & SAFE_QFLAGS_COPYOUTICV) {
1097 /* copy out ICV result */
1098 for (crd = crp->crp_desc; crd; crd = crd->crd_next) {
1099 if (!(crd->crd_alg == CRYPTO_MD5_HMAC ||
1100 crd->crd_alg == CRYPTO_SHA1_HMAC ||
1101 crd->crd_alg == CRYPTO_NULL_HMAC))
1102 continue;
1103 if (crd->crd_alg == CRYPTO_SHA1_HMAC) {
1104 /*
1105 * SHA-1 ICV's are byte-swapped; fix 'em up
1106 * before copy them to their destination.
1107 */
1108 re->re_sastate.sa_saved_indigest[0] =
1109 cpu_to_be32(re->re_sastate.sa_saved_indigest[0]);
1110 re->re_sastate.sa_saved_indigest[1] =
1111 cpu_to_be32(re->re_sastate.sa_saved_indigest[1]);
1112 re->re_sastate.sa_saved_indigest[2] =
1113 cpu_to_be32(re->re_sastate.sa_saved_indigest[2]);
1114 } else {
1115 re->re_sastate.sa_saved_indigest[0] =
1116 cpu_to_le32(re->re_sastate.sa_saved_indigest[0]);
1117 re->re_sastate.sa_saved_indigest[1] =
1118 cpu_to_le32(re->re_sastate.sa_saved_indigest[1]);
1119 re->re_sastate.sa_saved_indigest[2] =
1120 cpu_to_le32(re->re_sastate.sa_saved_indigest[2]);
1121 }
1122 crypto_copyback(crp->crp_flags, crp->crp_buf,
1123 crd->crd_inject,
1124 sc->sc_sessions[re->re_sesn].ses_mlen,
1125 (caddr_t)re->re_sastate.sa_saved_indigest);
1126 break;
1127 }
1128 }
1129 crypto_done(crp);
1130 }
1131
1132
1133 #if defined(CONFIG_OCF_RANDOMHARVEST) && !defined(SAFE_NO_RNG)
1134 #define SAFE_RNG_MAXWAIT 1000
1135
1136 static void
1137 safe_rng_init(struct safe_softc *sc)
1138 {
1139 u_int32_t w, v;
1140 int i;
1141
1142 DPRINTF(("%s()\n", __FUNCTION__));
1143
1144 WRITE_REG(sc, SAFE_RNG_CTRL, 0);
1145 /* use default value according to the manual */
1146 WRITE_REG(sc, SAFE_RNG_CNFG, 0x834); /* magic from SafeNet */
1147 WRITE_REG(sc, SAFE_RNG_ALM_CNT, 0);
1148
1149 /*
1150 * There is a bug in rev 1.0 of the 1140 that when the RNG
1151 * is brought out of reset the ready status flag does not
1152 * work until the RNG has finished its internal initialization.
1153 *
1154 * So in order to determine the device is through its
1155 * initialization we must read the data register, using the
1156 * status reg in the read in case it is initialized. Then read
1157 * the data register until it changes from the first read.
1158 * Once it changes read the data register until it changes
1159 * again. At this time the RNG is considered initialized.
1160 * This could take between 750ms - 1000ms in time.
1161 */
1162 i = 0;
1163 w = READ_REG(sc, SAFE_RNG_OUT);
1164 do {
1165 v = READ_REG(sc, SAFE_RNG_OUT);
1166 if (v != w) {
1167 w = v;
1168 break;
1169 }
1170 DELAY(10);
1171 } while (++i < SAFE_RNG_MAXWAIT);
1172
1173 /* Wait Until data changes again */
1174 i = 0;
1175 do {
1176 v = READ_REG(sc, SAFE_RNG_OUT);
1177 if (v != w)
1178 break;
1179 DELAY(10);
1180 } while (++i < SAFE_RNG_MAXWAIT);
1181 }
1182
1183 static __inline void
1184 safe_rng_disable_short_cycle(struct safe_softc *sc)
1185 {
1186 DPRINTF(("%s()\n", __FUNCTION__));
1187
1188 WRITE_REG(sc, SAFE_RNG_CTRL,
1189 READ_REG(sc, SAFE_RNG_CTRL) &~ SAFE_RNG_CTRL_SHORTEN);
1190 }
1191
1192 static __inline void
1193 safe_rng_enable_short_cycle(struct safe_softc *sc)
1194 {
1195 DPRINTF(("%s()\n", __FUNCTION__));
1196
1197 WRITE_REG(sc, SAFE_RNG_CTRL,
1198 READ_REG(sc, SAFE_RNG_CTRL) | SAFE_RNG_CTRL_SHORTEN);
1199 }
1200
1201 static __inline u_int32_t
1202 safe_rng_read(struct safe_softc *sc)
1203 {
1204 int i;
1205
1206 i = 0;
1207 while (READ_REG(sc, SAFE_RNG_STAT) != 0 && ++i < SAFE_RNG_MAXWAIT)
1208 ;
1209 return READ_REG(sc, SAFE_RNG_OUT);
1210 }
1211
1212 static int
1213 safe_read_random(void *arg, u_int32_t *buf, int maxwords)
1214 {
1215 struct safe_softc *sc = (struct safe_softc *) arg;
1216 int i, rc;
1217
1218 DPRINTF(("%s()\n", __FUNCTION__));
1219
1220 safestats.st_rng++;
1221 /*
1222 * Fetch the next block of data.
1223 */
1224 if (maxwords > safe_rngbufsize)
1225 maxwords = safe_rngbufsize;
1226 if (maxwords > SAFE_RNG_MAXBUFSIZ)
1227 maxwords = SAFE_RNG_MAXBUFSIZ;
1228 retry:
1229 /* read as much as we can */
1230 for (rc = 0; rc < maxwords; rc++) {
1231 if (READ_REG(sc, SAFE_RNG_STAT) != 0)
1232 break;
1233 buf[rc] = READ_REG(sc, SAFE_RNG_OUT);
1234 }
1235 if (rc == 0)
1236 return 0;
1237 /*
1238 * Check the comparator alarm count and reset the h/w if
1239 * it exceeds our threshold. This guards against the
1240 * hardware oscillators resonating with external signals.
1241 */
1242 if (READ_REG(sc, SAFE_RNG_ALM_CNT) > safe_rngmaxalarm) {
1243 u_int32_t freq_inc, w;
1244
1245 DPRINTF(("%s: alarm count %u exceeds threshold %u\n", __func__,
1246 (unsigned)READ_REG(sc, SAFE_RNG_ALM_CNT), safe_rngmaxalarm));
1247 safestats.st_rngalarm++;
1248 safe_rng_enable_short_cycle(sc);
1249 freq_inc = 18;
1250 for (i = 0; i < 64; i++) {
1251 w = READ_REG(sc, SAFE_RNG_CNFG);
1252 freq_inc = ((w + freq_inc) & 0x3fL);
1253 w = ((w & ~0x3fL) | freq_inc);
1254 WRITE_REG(sc, SAFE_RNG_CNFG, w);
1255
1256 WRITE_REG(sc, SAFE_RNG_ALM_CNT, 0);
1257
1258 (void) safe_rng_read(sc);
1259 DELAY(25);
1260
1261 if (READ_REG(sc, SAFE_RNG_ALM_CNT) == 0) {
1262 safe_rng_disable_short_cycle(sc);
1263 goto retry;
1264 }
1265 freq_inc = 1;
1266 }
1267 safe_rng_disable_short_cycle(sc);
1268 } else
1269 WRITE_REG(sc, SAFE_RNG_ALM_CNT, 0);
1270
1271 return(rc);
1272 }
1273 #endif /* defined(CONFIG_OCF_RANDOMHARVEST) && !defined(SAFE_NO_RNG) */
1274
1275
1276 /*
1277 * Resets the board. Values in the regesters are left as is
1278 * from the reset (i.e. initial values are assigned elsewhere).
1279 */
1280 static void
1281 safe_reset_board(struct safe_softc *sc)
1282 {
1283 u_int32_t v;
1284 /*
1285 * Reset the device. The manual says no delay
1286 * is needed between marking and clearing reset.
1287 */
1288 DPRINTF(("%s()\n", __FUNCTION__));
1289
1290 v = READ_REG(sc, SAFE_PE_DMACFG) &~
1291 (SAFE_PE_DMACFG_PERESET | SAFE_PE_DMACFG_PDRRESET |
1292 SAFE_PE_DMACFG_SGRESET);
1293 WRITE_REG(sc, SAFE_PE_DMACFG, v
1294 | SAFE_PE_DMACFG_PERESET
1295 | SAFE_PE_DMACFG_PDRRESET
1296 | SAFE_PE_DMACFG_SGRESET);
1297 WRITE_REG(sc, SAFE_PE_DMACFG, v);
1298 }
1299
1300 /*
1301 * Initialize registers we need to touch only once.
1302 */
1303 static void
1304 safe_init_board(struct safe_softc *sc)
1305 {
1306 u_int32_t v, dwords;
1307
1308 DPRINTF(("%s()\n", __FUNCTION__));
1309
1310 v = READ_REG(sc, SAFE_PE_DMACFG);
1311 v &=~ ( SAFE_PE_DMACFG_PEMODE
1312 | SAFE_PE_DMACFG_FSENA /* failsafe enable */
1313 | SAFE_PE_DMACFG_GPRPCI /* gather ring on PCI */
1314 | SAFE_PE_DMACFG_SPRPCI /* scatter ring on PCI */
1315 | SAFE_PE_DMACFG_ESDESC /* endian-swap descriptors */
1316 | SAFE_PE_DMACFG_ESPDESC /* endian-swap part. desc's */
1317 | SAFE_PE_DMACFG_ESSA /* endian-swap SA's */
1318 | SAFE_PE_DMACFG_ESPACKET /* swap the packet data */
1319 );
1320 v |= SAFE_PE_DMACFG_FSENA /* failsafe enable */
1321 | SAFE_PE_DMACFG_GPRPCI /* gather ring on PCI */
1322 | SAFE_PE_DMACFG_SPRPCI /* scatter ring on PCI */
1323 | SAFE_PE_DMACFG_ESDESC /* endian-swap descriptors */
1324 | SAFE_PE_DMACFG_ESPDESC /* endian-swap part. desc's */
1325 | SAFE_PE_DMACFG_ESSA /* endian-swap SA's */
1326 #if 0
1327 | SAFE_PE_DMACFG_ESPACKET /* swap the packet data */
1328 #endif
1329 ;
1330 WRITE_REG(sc, SAFE_PE_DMACFG, v);
1331
1332 #ifdef __BIG_ENDIAN
1333 /* tell the safenet that we are 4321 and not 1234 */
1334 WRITE_REG(sc, SAFE_ENDIAN, 0xe4e41b1b);
1335 #endif
1336
1337 if (sc->sc_chiprev == SAFE_REV(1,0)) {
1338 /*
1339 * Avoid large PCI DMA transfers. Rev 1.0 has a bug where
1340 * "target mode transfers" done while the chip is DMA'ing
1341 * >1020 bytes cause the hardware to lockup. To avoid this
1342 * we reduce the max PCI transfer size and use small source
1343 * particle descriptors (<= 256 bytes).
1344 */
1345 WRITE_REG(sc, SAFE_DMA_CFG, 256);
1346 device_printf(sc->sc_dev,
1347 "Reduce max DMA size to %u words for rev %u.%u WAR\n",
1348 (unsigned) ((READ_REG(sc, SAFE_DMA_CFG)>>2) & 0xff),
1349 (unsigned) SAFE_REV_MAJ(sc->sc_chiprev),
1350 (unsigned) SAFE_REV_MIN(sc->sc_chiprev));
1351 sc->sc_max_dsize = 256;
1352 } else {
1353 sc->sc_max_dsize = SAFE_MAX_DSIZE;
1354 }
1355
1356 /* NB: operands+results are overlaid */
1357 WRITE_REG(sc, SAFE_PE_PDRBASE, sc->sc_ringalloc.dma_paddr);
1358 WRITE_REG(sc, SAFE_PE_RDRBASE, sc->sc_ringalloc.dma_paddr);
1359 /*
1360 * Configure ring entry size and number of items in the ring.
1361 */
1362 KASSERT((sizeof(struct safe_ringentry) % sizeof(u_int32_t)) == 0,
1363 ("PE ring entry not 32-bit aligned!"));
1364 dwords = sizeof(struct safe_ringentry) / sizeof(u_int32_t);
1365 WRITE_REG(sc, SAFE_PE_RINGCFG,
1366 (dwords << SAFE_PE_RINGCFG_OFFSET_S) | SAFE_MAX_NQUEUE);
1367 WRITE_REG(sc, SAFE_PE_RINGPOLL, 0); /* disable polling */
1368
1369 WRITE_REG(sc, SAFE_PE_GRNGBASE, sc->sc_spalloc.dma_paddr);
1370 WRITE_REG(sc, SAFE_PE_SRNGBASE, sc->sc_dpalloc.dma_paddr);
1371 WRITE_REG(sc, SAFE_PE_PARTSIZE,
1372 (SAFE_TOTAL_DPART<<16) | SAFE_TOTAL_SPART);
1373 /*
1374 * NB: destination particles are fixed size. We use
1375 * an mbuf cluster and require all results go to
1376 * clusters or smaller.
1377 */
1378 WRITE_REG(sc, SAFE_PE_PARTCFG, sc->sc_max_dsize);
1379
1380 /* it's now safe to enable PE mode, do it */
1381 WRITE_REG(sc, SAFE_PE_DMACFG, v | SAFE_PE_DMACFG_PEMODE);
1382
1383 /*
1384 * Configure hardware to use level-triggered interrupts and
1385 * to interrupt after each descriptor is processed.
1386 */
1387 WRITE_REG(sc, SAFE_HI_CFG, SAFE_HI_CFG_LEVEL);
1388 WRITE_REG(sc, SAFE_HI_CLR, 0xffffffff);
1389 WRITE_REG(sc, SAFE_HI_DESC_CNT, 1);
1390 WRITE_REG(sc, SAFE_HI_MASK, SAFE_INT_PE_DDONE | SAFE_INT_PE_ERROR);
1391 }
1392
1393
1394 /*
1395 * Clean up after a chip crash.
1396 * It is assumed that the caller in splimp()
1397 */
1398 static void
1399 safe_cleanchip(struct safe_softc *sc)
1400 {
1401 DPRINTF(("%s()\n", __FUNCTION__));
1402
1403 if (sc->sc_nqchip != 0) {
1404 struct safe_ringentry *re = sc->sc_back;
1405
1406 while (re != sc->sc_front) {
1407 if (re->re_desc.d_csr != 0)
1408 safe_free_entry(sc, re);
1409 if (++re == sc->sc_ringtop)
1410 re = sc->sc_ring;
1411 }
1412 sc->sc_back = re;
1413 sc->sc_nqchip = 0;
1414 }
1415 }
1416
1417 /*
1418 * free a safe_q
1419 * It is assumed that the caller is within splimp().
1420 */
1421 static int
1422 safe_free_entry(struct safe_softc *sc, struct safe_ringentry *re)
1423 {
1424 struct cryptop *crp;
1425
1426 DPRINTF(("%s()\n", __FUNCTION__));
1427
1428 /*
1429 * Free header MCR
1430 */
1431 if ((re->re_dst_skb != NULL) && (re->re_src_skb != re->re_dst_skb))
1432 #ifdef NOTYET
1433 m_freem(re->re_dst_m);
1434 #else
1435 printk("%s,%d: SKB not supported\n", __FILE__, __LINE__);
1436 #endif
1437
1438 crp = (struct cryptop *)re->re_crp;
1439
1440 re->re_desc.d_csr = 0;
1441
1442 crp->crp_etype = EFAULT;
1443 crypto_done(crp);
1444 return(0);
1445 }
1446
1447 /*
1448 * Routine to reset the chip and clean up.
1449 * It is assumed that the caller is in splimp()
1450 */
1451 static void
1452 safe_totalreset(struct safe_softc *sc)
1453 {
1454 DPRINTF(("%s()\n", __FUNCTION__));
1455
1456 safe_reset_board(sc);
1457 safe_init_board(sc);
1458 safe_cleanchip(sc);
1459 }
1460
1461 /*
1462 * Is the operand suitable aligned for direct DMA. Each
1463 * segment must be aligned on a 32-bit boundary and all
1464 * but the last segment must be a multiple of 4 bytes.
1465 */
1466 static int
1467 safe_dmamap_aligned(struct safe_softc *sc, const struct safe_operand *op)
1468 {
1469 int i;
1470
1471 DPRINTF(("%s()\n", __FUNCTION__));
1472
1473 for (i = 0; i < op->nsegs; i++) {
1474 if (op->segs[i].ds_addr & 3)
1475 return (0);
1476 if (i != (op->nsegs - 1) && (op->segs[i].ds_len & 3))
1477 return (0);
1478 }
1479 return (1);
1480 }
1481
1482 /*
1483 * Is the operand suitable for direct DMA as the destination
1484 * of an operation. The hardware requires that each ``particle''
1485 * but the last in an operation result have the same size. We
1486 * fix that size at SAFE_MAX_DSIZE bytes. This routine returns
1487 * 0 if some segment is not a multiple of of this size, 1 if all
1488 * segments are exactly this size, or 2 if segments are at worst
1489 * a multple of this size.
1490 */
1491 static int
1492 safe_dmamap_uniform(struct safe_softc *sc, const struct safe_operand *op)
1493 {
1494 int result = 1;
1495
1496 DPRINTF(("%s()\n", __FUNCTION__));
1497
1498 if (op->nsegs > 0) {
1499 int i;
1500
1501 for (i = 0; i < op->nsegs-1; i++) {
1502 if (op->segs[i].ds_len % sc->sc_max_dsize)
1503 return (0);
1504 if (op->segs[i].ds_len != sc->sc_max_dsize)
1505 result = 2;
1506 }
1507 }
1508 return (result);
1509 }
1510
1511 static int
1512 safe_kprocess(device_t dev, struct cryptkop *krp, int hint)
1513 {
1514 struct safe_softc *sc = device_get_softc(dev);
1515 struct safe_pkq *q;
1516 unsigned long flags;
1517
1518 DPRINTF(("%s()\n", __FUNCTION__));
1519
1520 if (sc == NULL) {
1521 krp->krp_status = EINVAL;
1522 goto err;
1523 }
1524
1525 if (krp->krp_op != CRK_MOD_EXP) {
1526 krp->krp_status = EOPNOTSUPP;
1527 goto err;
1528 }
1529
1530 q = (struct safe_pkq *) kmalloc(sizeof(*q), GFP_KERNEL);
1531 if (q == NULL) {
1532 krp->krp_status = ENOMEM;
1533 goto err;
1534 }
1535 memset(q, 0, sizeof(*q));
1536 q->pkq_krp = krp;
1537 INIT_LIST_HEAD(&q->pkq_list);
1538
1539 spin_lock_irqsave(&sc->sc_pkmtx, flags);
1540 list_add_tail(&q->pkq_list, &sc->sc_pkq);
1541 safe_kfeed(sc);
1542 spin_unlock_irqrestore(&sc->sc_pkmtx, flags);
1543 return (0);
1544
1545 err:
1546 crypto_kdone(krp);
1547 return (0);
1548 }
1549
1550 #define SAFE_CRK_PARAM_BASE 0
1551 #define SAFE_CRK_PARAM_EXP 1
1552 #define SAFE_CRK_PARAM_MOD 2
1553
1554 static int
1555 safe_kstart(struct safe_softc *sc)
1556 {
1557 struct cryptkop *krp = sc->sc_pkq_cur->pkq_krp;
1558 int exp_bits, mod_bits, base_bits;
1559 u_int32_t op, a_off, b_off, c_off, d_off;
1560
1561 DPRINTF(("%s()\n", __FUNCTION__));
1562
1563 if (krp->krp_iparams < 3 || krp->krp_oparams != 1) {
1564 krp->krp_status = EINVAL;
1565 return (1);
1566 }
1567
1568 base_bits = safe_ksigbits(sc, &krp->krp_param[SAFE_CRK_PARAM_BASE]);
1569 if (base_bits > 2048)
1570 goto too_big;
1571 if (base_bits <= 0) /* 5. base not zero */
1572 goto too_small;
1573
1574 exp_bits = safe_ksigbits(sc, &krp->krp_param[SAFE_CRK_PARAM_EXP]);
1575 if (exp_bits > 2048)
1576 goto too_big;
1577 if (exp_bits <= 0) /* 1. exponent word length > 0 */
1578 goto too_small; /* 4. exponent not zero */
1579
1580 mod_bits = safe_ksigbits(sc, &krp->krp_param[SAFE_CRK_PARAM_MOD]);
1581 if (mod_bits > 2048)
1582 goto too_big;
1583 if (mod_bits <= 32) /* 2. modulus word length > 1 */
1584 goto too_small; /* 8. MSW of modulus != zero */
1585 if (mod_bits < exp_bits) /* 3 modulus len >= exponent len */
1586 goto too_small;
1587 if ((krp->krp_param[SAFE_CRK_PARAM_MOD].crp_p[0] & 1) == 0)
1588 goto bad_domain; /* 6. modulus is odd */
1589 if (mod_bits > krp->krp_param[krp->krp_iparams].crp_nbits)
1590 goto too_small; /* make sure result will fit */
1591
1592 /* 7. modulus > base */
1593 if (mod_bits < base_bits)
1594 goto too_small;
1595 if (mod_bits == base_bits) {
1596 u_int8_t *basep, *modp;
1597 int i;
1598
1599 basep = krp->krp_param[SAFE_CRK_PARAM_BASE].crp_p +
1600 ((base_bits + 7) / 8) - 1;
1601 modp = krp->krp_param[SAFE_CRK_PARAM_MOD].crp_p +
1602 ((mod_bits + 7) / 8) - 1;
1603
1604 for (i = 0; i < (mod_bits + 7) / 8; i++, basep--, modp--) {
1605 if (*modp < *basep)
1606 goto too_small;
1607 if (*modp > *basep)
1608 break;
1609 }
1610 }
1611
1612 /* And on the 9th step, he rested. */
1613
1614 WRITE_REG(sc, SAFE_PK_A_LEN, (exp_bits + 31) / 32);
1615 WRITE_REG(sc, SAFE_PK_B_LEN, (mod_bits + 31) / 32);
1616 if (mod_bits > 1024) {
1617 op = SAFE_PK_FUNC_EXP4;
1618 a_off = 0x000;
1619 b_off = 0x100;
1620 c_off = 0x200;
1621 d_off = 0x300;
1622 } else {
1623 op = SAFE_PK_FUNC_EXP16;
1624 a_off = 0x000;
1625 b_off = 0x080;
1626 c_off = 0x100;
1627 d_off = 0x180;
1628 }
1629 sc->sc_pk_reslen = b_off - a_off;
1630 sc->sc_pk_resoff = d_off;
1631
1632 /* A is exponent, B is modulus, C is base, D is result */
1633 safe_kload_reg(sc, a_off, b_off - a_off,
1634 &krp->krp_param[SAFE_CRK_PARAM_EXP]);
1635 WRITE_REG(sc, SAFE_PK_A_ADDR, a_off >> 2);
1636 safe_kload_reg(sc, b_off, b_off - a_off,
1637 &krp->krp_param[SAFE_CRK_PARAM_MOD]);
1638 WRITE_REG(sc, SAFE_PK_B_ADDR, b_off >> 2);
1639 safe_kload_reg(sc, c_off, b_off - a_off,
1640 &krp->krp_param[SAFE_CRK_PARAM_BASE]);
1641 WRITE_REG(sc, SAFE_PK_C_ADDR, c_off >> 2);
1642 WRITE_REG(sc, SAFE_PK_D_ADDR, d_off >> 2);
1643
1644 WRITE_REG(sc, SAFE_PK_FUNC, op | SAFE_PK_FUNC_RUN);
1645
1646 return (0);
1647
1648 too_big:
1649 krp->krp_status = E2BIG;
1650 return (1);
1651 too_small:
1652 krp->krp_status = ERANGE;
1653 return (1);
1654 bad_domain:
1655 krp->krp_status = EDOM;
1656 return (1);
1657 }
1658
1659 static int
1660 safe_ksigbits(struct safe_softc *sc, struct crparam *cr)
1661 {
1662 u_int plen = (cr->crp_nbits + 7) / 8;
1663 int i, sig = plen * 8;
1664 u_int8_t c, *p = cr->crp_p;
1665
1666 DPRINTF(("%s()\n", __FUNCTION__));
1667
1668 for (i = plen - 1; i >= 0; i--) {
1669 c = p[i];
1670 if (c != 0) {
1671 while ((c & 0x80) == 0) {
1672 sig--;
1673 c <<= 1;
1674 }
1675 break;
1676 }
1677 sig -= 8;
1678 }
1679 return (sig);
1680 }
1681
1682 static void
1683 safe_kfeed(struct safe_softc *sc)
1684 {
1685 struct safe_pkq *q, *tmp;
1686
1687 DPRINTF(("%s()\n", __FUNCTION__));
1688
1689 if (list_empty(&sc->sc_pkq) && sc->sc_pkq_cur == NULL)
1690 return;
1691 if (sc->sc_pkq_cur != NULL)
1692 return;
1693 list_for_each_entry_safe(q, tmp, &sc->sc_pkq, pkq_list) {
1694 sc->sc_pkq_cur = q;
1695 list_del(&q->pkq_list);
1696 if (safe_kstart(sc) != 0) {
1697 crypto_kdone(q->pkq_krp);
1698 kfree(q);
1699 sc->sc_pkq_cur = NULL;
1700 } else {
1701 /* op started, start polling */
1702 mod_timer(&sc->sc_pkto, jiffies + 1);
1703 break;
1704 }
1705 }
1706 }
1707
1708 static void
1709 safe_kpoll(unsigned long arg)
1710 {
1711 struct safe_softc *sc = NULL;
1712 struct safe_pkq *q;
1713 struct crparam *res;
1714 int i;
1715 u_int32_t buf[64];
1716 unsigned long flags;
1717
1718 DPRINTF(("%s()\n", __FUNCTION__));
1719
1720 if (arg >= SAFE_MAX_CHIPS)
1721 return;
1722 sc = safe_chip_idx[arg];
1723 if (!sc) {
1724 DPRINTF(("%s() - bad callback\n", __FUNCTION__));
1725 return;
1726 }
1727
1728 spin_lock_irqsave(&sc->sc_pkmtx, flags);
1729 if (sc->sc_pkq_cur == NULL)
1730 goto out;
1731 if (READ_REG(sc, SAFE_PK_FUNC) & SAFE_PK_FUNC_RUN) {
1732 /* still running, check back later */
1733 mod_timer(&sc->sc_pkto, jiffies + 1);
1734 goto out;
1735 }
1736
1737 q = sc->sc_pkq_cur;
1738 res = &q->pkq_krp->krp_param[q->pkq_krp->krp_iparams];
1739 bzero(buf, sizeof(buf));
1740 bzero(res->crp_p, (res->crp_nbits + 7) / 8);
1741 for (i = 0; i < sc->sc_pk_reslen >> 2; i++)
1742 buf[i] = le32_to_cpu(READ_REG(sc, SAFE_PK_RAM_START +
1743 sc->sc_pk_resoff + (i << 2)));
1744 bcopy(buf, res->crp_p, (res->crp_nbits + 7) / 8);
1745 /*
1746 * reduce the bits that need copying if possible
1747 */
1748 res->crp_nbits = min(res->crp_nbits,sc->sc_pk_reslen * 8);
1749 res->crp_nbits = safe_ksigbits(sc, res);
1750
1751 for (i = SAFE_PK_RAM_START; i < SAFE_PK_RAM_END; i += 4)
1752 WRITE_REG(sc, i, 0);
1753
1754 crypto_kdone(q->pkq_krp);
1755 kfree(q);
1756 sc->sc_pkq_cur = NULL;
1757
1758 safe_kfeed(sc);
1759 out:
1760 spin_unlock_irqrestore(&sc->sc_pkmtx, flags);
1761 }
1762
1763 static void
1764 safe_kload_reg(struct safe_softc *sc, u_int32_t off, u_int32_t len,
1765 struct crparam *n)
1766 {
1767 u_int32_t buf[64], i;
1768
1769 DPRINTF(("%s()\n", __FUNCTION__));
1770
1771 bzero(buf, sizeof(buf));
1772 bcopy(n->crp_p, buf, (n->crp_nbits + 7) / 8);
1773
1774 for (i = 0; i < len >> 2; i++)
1775 WRITE_REG(sc, SAFE_PK_RAM_START + off + (i << 2),
1776 cpu_to_le32(buf[i]));
1777 }
1778
1779 #ifdef SAFE_DEBUG
1780 static void
1781 safe_dump_dmastatus(struct safe_softc *sc, const char *tag)
1782 {
1783 printf("%s: ENDIAN 0x%x SRC 0x%x DST 0x%x STAT 0x%x\n"
1784 , tag
1785 , READ_REG(sc, SAFE_DMA_ENDIAN)
1786 , READ_REG(sc, SAFE_DMA_SRCADDR)
1787 , READ_REG(sc, SAFE_DMA_DSTADDR)
1788 , READ_REG(sc, SAFE_DMA_STAT)
1789 );
1790 }
1791
1792 static void
1793 safe_dump_intrstate(struct safe_softc *sc, const char *tag)
1794 {
1795 printf("%s: HI_CFG 0x%x HI_MASK 0x%x HI_DESC_CNT 0x%x HU_STAT 0x%x HM_STAT 0x%x\n"
1796 , tag
1797 , READ_REG(sc, SAFE_HI_CFG)
1798 , READ_REG(sc, SAFE_HI_MASK)
1799 , READ_REG(sc, SAFE_HI_DESC_CNT)
1800 , READ_REG(sc, SAFE_HU_STAT)
1801 , READ_REG(sc, SAFE_HM_STAT)
1802 );
1803 }
1804
1805 static void
1806 safe_dump_ringstate(struct safe_softc *sc, const char *tag)
1807 {
1808 u_int32_t estat = READ_REG(sc, SAFE_PE_ERNGSTAT);
1809
1810 /* NB: assume caller has lock on ring */
1811 printf("%s: ERNGSTAT %x (next %u) back %lu front %lu\n",
1812 tag,
1813 estat, (estat >> SAFE_PE_ERNGSTAT_NEXT_S),
1814 (unsigned long)(sc->sc_back - sc->sc_ring),
1815 (unsigned long)(sc->sc_front - sc->sc_ring));
1816 }
1817
1818 static void
1819 safe_dump_request(struct safe_softc *sc, const char* tag, struct safe_ringentry *re)
1820 {
1821 int ix, nsegs;
1822
1823 ix = re - sc->sc_ring;
1824 printf("%s: %p (%u): csr %x src %x dst %x sa %x len %x\n"
1825 , tag
1826 , re, ix
1827 , re->re_desc.d_csr
1828 , re->re_desc.d_src
1829 , re->re_desc.d_dst
1830 , re->re_desc.d_sa
1831 , re->re_desc.d_len
1832 );
1833 if (re->re_src.nsegs > 1) {
1834 ix = (re->re_desc.d_src - sc->sc_spalloc.dma_paddr) /
1835 sizeof(struct safe_pdesc);
1836 for (nsegs = re->re_src.nsegs; nsegs; nsegs--) {
1837 printf(" spd[%u] %p: %p size %u flags %x"
1838 , ix, &sc->sc_spring[ix]
1839 , (caddr_t)(uintptr_t) sc->sc_spring[ix].pd_addr
1840 , sc->sc_spring[ix].pd_size
1841 , sc->sc_spring[ix].pd_flags
1842 );
1843 if (sc->sc_spring[ix].pd_size == 0)
1844 printf(" (zero!)");
1845 printf("\n");
1846 if (++ix == SAFE_TOTAL_SPART)
1847 ix = 0;
1848 }
1849 }
1850 if (re->re_dst.nsegs > 1) {
1851 ix = (re->re_desc.d_dst - sc->sc_dpalloc.dma_paddr) /
1852 sizeof(struct safe_pdesc);
1853 for (nsegs = re->re_dst.nsegs; nsegs; nsegs--) {
1854 printf(" dpd[%u] %p: %p flags %x\n"
1855 , ix, &sc->sc_dpring[ix]
1856 , (caddr_t)(uintptr_t) sc->sc_dpring[ix].pd_addr
1857 , sc->sc_dpring[ix].pd_flags
1858 );
1859 if (++ix == SAFE_TOTAL_DPART)
1860 ix = 0;
1861 }
1862 }
1863 printf("sa: cmd0 %08x cmd1 %08x staterec %x\n",
1864 re->re_sa.sa_cmd0, re->re_sa.sa_cmd1, re->re_sa.sa_staterec);
1865 printf("sa: key %x %x %x %x %x %x %x %x\n"
1866 , re->re_sa.sa_key[0]
1867 , re->re_sa.sa_key[1]
1868 , re->re_sa.sa_key[2]
1869 , re->re_sa.sa_key[3]
1870 , re->re_sa.sa_key[4]
1871 , re->re_sa.sa_key[5]
1872 , re->re_sa.sa_key[6]
1873 , re->re_sa.sa_key[7]
1874 );
1875 printf("sa: indigest %x %x %x %x %x\n"
1876 , re->re_sa.sa_indigest[0]
1877 , re->re_sa.sa_indigest[1]
1878 , re->re_sa.sa_indigest[2]
1879 , re->re_sa.sa_indigest[3]
1880 , re->re_sa.sa_indigest[4]
1881 );
1882 printf("sa: outdigest %x %x %x %x %x\n"
1883 , re->re_sa.sa_outdigest[0]
1884 , re->re_sa.sa_outdigest[1]
1885 , re->re_sa.sa_outdigest[2]
1886 , re->re_sa.sa_outdigest[3]
1887 , re->re_sa.sa_outdigest[4]
1888 );
1889 printf("sr: iv %x %x %x %x\n"
1890 , re->re_sastate.sa_saved_iv[0]
1891 , re->re_sastate.sa_saved_iv[1]
1892 , re->re_sastate.sa_saved_iv[2]
1893 , re->re_sastate.sa_saved_iv[3]
1894 );
1895 printf("sr: hashbc %u indigest %x %x %x %x %x\n"
1896 , re->re_sastate.sa_saved_hashbc
1897 , re->re_sastate.sa_saved_indigest[0]
1898 , re->re_sastate.sa_saved_indigest[1]
1899 , re->re_sastate.sa_saved_indigest[2]
1900 , re->re_sastate.sa_saved_indigest[3]
1901 , re->re_sastate.sa_saved_indigest[4]
1902 );
1903 }
1904
1905 static void
1906 safe_dump_ring(struct safe_softc *sc, const char *tag)
1907 {
1908 unsigned long flags;
1909
1910 spin_lock_irqsave(&sc->sc_ringmtx, flags);
1911 printf("\nSafeNet Ring State:\n");
1912 safe_dump_intrstate(sc, tag);
1913 safe_dump_dmastatus(sc, tag);
1914 safe_dump_ringstate(sc, tag);
1915 if (sc->sc_nqchip) {
1916 struct safe_ringentry *re = sc->sc_back;
1917 do {
1918 safe_dump_request(sc, tag, re);
1919 if (++re == sc->sc_ringtop)
1920 re = sc->sc_ring;
1921 } while (re != sc->sc_front);
1922 }
1923 spin_unlock_irqrestore(&sc->sc_ringmtx, flags);
1924 }
1925 #endif /* SAFE_DEBUG */
1926
1927
1928 static int safe_probe(struct pci_dev *dev, const struct pci_device_id *ent)
1929 {
1930 struct safe_softc *sc = NULL;
1931 u32 mem_start, mem_len, cmd;
1932 int i, rc, devinfo;
1933 dma_addr_t raddr;
1934 static int num_chips = 0;
1935
1936 DPRINTF(("%s()\n", __FUNCTION__));
1937
1938 if (pci_enable_device(dev) < 0)
1939 return(-ENODEV);
1940
1941 if (!dev->irq) {
1942 printk("safe: found device with no IRQ assigned. check BIOS settings!");
1943 pci_disable_device(dev);
1944 return(-ENODEV);
1945 }
1946
1947 if (pci_set_mwi(dev)) {
1948 printk("safe: pci_set_mwi failed!");
1949 return(-ENODEV);
1950 }
1951
1952 sc = (struct safe_softc *) kmalloc(sizeof(*sc), GFP_KERNEL);
1953 if (!sc)
1954 return(-ENOMEM);
1955 memset(sc, 0, sizeof(*sc));
1956
1957 softc_device_init(sc, "safe", num_chips, safe_methods);
1958
1959 sc->sc_irq = -1;
1960 sc->sc_cid = -1;
1961 sc->sc_pcidev = dev;
1962 if (num_chips < SAFE_MAX_CHIPS) {
1963 safe_chip_idx[device_get_unit(sc->sc_dev)] = sc;
1964 num_chips++;
1965 }
1966
1967 INIT_LIST_HEAD(&sc->sc_pkq);
1968 spin_lock_init(&sc->sc_pkmtx);
1969
1970 pci_set_drvdata(sc->sc_pcidev, sc);
1971
1972 /* we read its hardware registers as memory */
1973 mem_start = pci_resource_start(sc->sc_pcidev, 0);
1974 mem_len = pci_resource_len(sc->sc_pcidev, 0);
1975
1976 sc->sc_base_addr = (ocf_iomem_t) ioremap(mem_start, mem_len);
1977 if (!sc->sc_base_addr) {
1978 device_printf(sc->sc_dev, "failed to ioremap 0x%x-0x%x\n",
1979 mem_start, mem_start + mem_len - 1);
1980 goto out;
1981 }
1982
1983 /* fix up the bus size */
1984 if (pci_set_dma_mask(sc->sc_pcidev, DMA_32BIT_MASK)) {
1985 device_printf(sc->sc_dev, "No usable DMA configuration, aborting.\n");
1986 goto out;
1987 }
1988 if (pci_set_consistent_dma_mask(sc->sc_pcidev, DMA_32BIT_MASK)) {
1989 device_printf(sc->sc_dev, "No usable consistent DMA configuration, aborting.\n");
1990 goto out;
1991 }
1992
1993 pci_set_master(sc->sc_pcidev);
1994
1995 pci_read_config_dword(sc->sc_pcidev, PCI_COMMAND, &cmd);
1996
1997 if (!(cmd & PCI_COMMAND_MEMORY)) {
1998 device_printf(sc->sc_dev, "failed to enable memory mapping\n");
1999 goto out;
2000 }
2001
2002 if (!(cmd & PCI_COMMAND_MASTER)) {
2003 device_printf(sc->sc_dev, "failed to enable bus mastering\n");
2004 goto out;
2005 }
2006
2007 rc = request_irq(dev->irq, safe_intr, IRQF_SHARED, "safe", sc);
2008 if (rc) {
2009 device_printf(sc->sc_dev, "failed to hook irq %d\n", sc->sc_irq);
2010 goto out;
2011 }
2012 sc->sc_irq = dev->irq;
2013
2014 sc->sc_chiprev = READ_REG(sc, SAFE_DEVINFO) &
2015 (SAFE_DEVINFO_REV_MAJ | SAFE_DEVINFO_REV_MIN);
2016
2017 /*
2018 * Allocate packet engine descriptors.
2019 */
2020 sc->sc_ringalloc.dma_vaddr = pci_alloc_consistent(sc->sc_pcidev,
2021 SAFE_MAX_NQUEUE * sizeof (struct safe_ringentry),
2022 &sc->sc_ringalloc.dma_paddr);
2023 if (!sc->sc_ringalloc.dma_vaddr) {
2024 device_printf(sc->sc_dev, "cannot allocate PE descriptor ring\n");
2025 goto out;
2026 }
2027
2028 /*
2029 * Hookup the static portion of all our data structures.
2030 */
2031 sc->sc_ring = (struct safe_ringentry *) sc->sc_ringalloc.dma_vaddr;
2032 sc->sc_ringtop = sc->sc_ring + SAFE_MAX_NQUEUE;
2033 sc->sc_front = sc->sc_ring;
2034 sc->sc_back = sc->sc_ring;
2035 raddr = sc->sc_ringalloc.dma_paddr;
2036 bzero(sc->sc_ring, SAFE_MAX_NQUEUE * sizeof(struct safe_ringentry));
2037 for (i = 0; i < SAFE_MAX_NQUEUE; i++) {
2038 struct safe_ringentry *re = &sc->sc_ring[i];
2039
2040 re->re_desc.d_sa = raddr +
2041 offsetof(struct safe_ringentry, re_sa);
2042 re->re_sa.sa_staterec = raddr +
2043 offsetof(struct safe_ringentry, re_sastate);
2044
2045 raddr += sizeof (struct safe_ringentry);
2046 }
2047 spin_lock_init(&sc->sc_ringmtx);
2048
2049 /*
2050 * Allocate scatter and gather particle descriptors.
2051 */
2052 sc->sc_spalloc.dma_vaddr = pci_alloc_consistent(sc->sc_pcidev,
2053 SAFE_TOTAL_SPART * sizeof (struct safe_pdesc),
2054 &sc->sc_spalloc.dma_paddr);
2055 if (!sc->sc_spalloc.dma_vaddr) {
2056 device_printf(sc->sc_dev, "cannot allocate source particle descriptor ring\n");
2057 goto out;
2058 }
2059 sc->sc_spring = (struct safe_pdesc *) sc->sc_spalloc.dma_vaddr;
2060 sc->sc_springtop = sc->sc_spring + SAFE_TOTAL_SPART;
2061 sc->sc_spfree = sc->sc_spring;
2062 bzero(sc->sc_spring, SAFE_TOTAL_SPART * sizeof(struct safe_pdesc));
2063
2064 sc->sc_dpalloc.dma_vaddr = pci_alloc_consistent(sc->sc_pcidev,
2065 SAFE_TOTAL_DPART * sizeof (struct safe_pdesc),
2066 &sc->sc_dpalloc.dma_paddr);
2067 if (!sc->sc_dpalloc.dma_vaddr) {
2068 device_printf(sc->sc_dev, "cannot allocate destination particle descriptor ring\n");
2069 goto out;
2070 }
2071 sc->sc_dpring = (struct safe_pdesc *) sc->sc_dpalloc.dma_vaddr;
2072 sc->sc_dpringtop = sc->sc_dpring + SAFE_TOTAL_DPART;
2073 sc->sc_dpfree = sc->sc_dpring;
2074 bzero(sc->sc_dpring, SAFE_TOTAL_DPART * sizeof(struct safe_pdesc));
2075
2076 sc->sc_cid = crypto_get_driverid(softc_get_device(sc), CRYPTOCAP_F_HARDWARE);
2077 if (sc->sc_cid < 0) {
2078 device_printf(sc->sc_dev, "could not get crypto driver id\n");
2079 goto out;
2080 }
2081
2082 printf("%s:", device_get_nameunit(sc->sc_dev));
2083
2084 devinfo = READ_REG(sc, SAFE_DEVINFO);
2085 if (devinfo & SAFE_DEVINFO_RNG) {
2086 sc->sc_flags |= SAFE_FLAGS_RNG;
2087 printf(" rng");
2088 }
2089 if (devinfo & SAFE_DEVINFO_PKEY) {
2090 printf(" key");
2091 sc->sc_flags |= SAFE_FLAGS_KEY;
2092 crypto_kregister(sc->sc_cid, CRK_MOD_EXP, 0);
2093 #if 0
2094 crypto_kregister(sc->sc_cid, CRK_MOD_EXP_CRT, 0);
2095 #endif
2096 init_timer(&sc->sc_pkto);
2097 sc->sc_pkto.function = safe_kpoll;
2098 sc->sc_pkto.data = (unsigned long) device_get_unit(sc->sc_dev);
2099 }
2100 if (devinfo & SAFE_DEVINFO_DES) {
2101 printf(" des/3des");
2102 crypto_register(sc->sc_cid, CRYPTO_3DES_CBC, 0, 0);
2103 crypto_register(sc->sc_cid, CRYPTO_DES_CBC, 0, 0);
2104 }
2105 if (devinfo & SAFE_DEVINFO_AES) {
2106 printf(" aes");
2107 crypto_register(sc->sc_cid, CRYPTO_AES_CBC, 0, 0);
2108 }
2109 if (devinfo & SAFE_DEVINFO_MD5) {
2110 printf(" md5");
2111 crypto_register(sc->sc_cid, CRYPTO_MD5_HMAC, 0, 0);
2112 }
2113 if (devinfo & SAFE_DEVINFO_SHA1) {
2114 printf(" sha1");
2115 crypto_register(sc->sc_cid, CRYPTO_SHA1_HMAC, 0, 0);
2116 }
2117 printf(" null");
2118 crypto_register(sc->sc_cid, CRYPTO_NULL_CBC, 0, 0);
2119 crypto_register(sc->sc_cid, CRYPTO_NULL_HMAC, 0, 0);
2120 /* XXX other supported algorithms */
2121 printf("\n");
2122
2123 safe_reset_board(sc); /* reset h/w */
2124 safe_init_board(sc); /* init h/w */
2125
2126 #if defined(CONFIG_OCF_RANDOMHARVEST) && !defined(SAFE_NO_RNG)
2127 if (sc->sc_flags & SAFE_FLAGS_RNG) {
2128 safe_rng_init(sc);
2129 crypto_rregister(sc->sc_cid, safe_read_random, sc);
2130 }
2131 #endif /* SAFE_NO_RNG */
2132
2133 return (0);
2134
2135 out:
2136 if (sc->sc_cid >= 0)
2137 crypto_unregister_all(sc->sc_cid);
2138 if (sc->sc_irq != -1)
2139 free_irq(sc->sc_irq, sc);
2140 if (sc->sc_ringalloc.dma_vaddr)
2141 pci_free_consistent(sc->sc_pcidev,
2142 SAFE_MAX_NQUEUE * sizeof (struct safe_ringentry),
2143 sc->sc_ringalloc.dma_vaddr, sc->sc_ringalloc.dma_paddr);
2144 if (sc->sc_spalloc.dma_vaddr)
2145 pci_free_consistent(sc->sc_pcidev,
2146 SAFE_TOTAL_DPART * sizeof (struct safe_pdesc),
2147 sc->sc_spalloc.dma_vaddr, sc->sc_spalloc.dma_paddr);
2148 if (sc->sc_dpalloc.dma_vaddr)
2149 pci_free_consistent(sc->sc_pcidev,
2150 SAFE_TOTAL_DPART * sizeof (struct safe_pdesc),
2151 sc->sc_dpalloc.dma_vaddr, sc->sc_dpalloc.dma_paddr);
2152 kfree(sc);
2153 return(-ENODEV);
2154 }
2155
2156 static void safe_remove(struct pci_dev *dev)
2157 {
2158 struct safe_softc *sc = pci_get_drvdata(dev);
2159
2160 DPRINTF(("%s()\n", __FUNCTION__));
2161
2162 /* XXX wait/abort active ops */
2163
2164 WRITE_REG(sc, SAFE_HI_MASK, 0); /* disable interrupts */
2165
2166 del_timer_sync(&sc->sc_pkto);
2167
2168 crypto_unregister_all(sc->sc_cid);
2169
2170 safe_cleanchip(sc);
2171
2172 if (sc->sc_irq != -1)
2173 free_irq(sc->sc_irq, sc);
2174 if (sc->sc_ringalloc.dma_vaddr)
2175 pci_free_consistent(sc->sc_pcidev,
2176 SAFE_MAX_NQUEUE * sizeof (struct safe_ringentry),
2177 sc->sc_ringalloc.dma_vaddr, sc->sc_ringalloc.dma_paddr);
2178 if (sc->sc_spalloc.dma_vaddr)
2179 pci_free_consistent(sc->sc_pcidev,
2180 SAFE_TOTAL_DPART * sizeof (struct safe_pdesc),
2181 sc->sc_spalloc.dma_vaddr, sc->sc_spalloc.dma_paddr);
2182 if (sc->sc_dpalloc.dma_vaddr)
2183 pci_free_consistent(sc->sc_pcidev,
2184 SAFE_TOTAL_DPART * sizeof (struct safe_pdesc),
2185 sc->sc_dpalloc.dma_vaddr, sc->sc_dpalloc.dma_paddr);
2186 sc->sc_irq = -1;
2187 sc->sc_ringalloc.dma_vaddr = NULL;
2188 sc->sc_spalloc.dma_vaddr = NULL;
2189 sc->sc_dpalloc.dma_vaddr = NULL;
2190 }
2191
2192 static struct pci_device_id safe_pci_tbl[] = {
2193 { PCI_VENDOR_SAFENET, PCI_PRODUCT_SAFEXCEL,
2194 PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
2195 { },
2196 };
2197 MODULE_DEVICE_TABLE(pci, safe_pci_tbl);
2198
2199 static struct pci_driver safe_driver = {
2200 .name = "safe",
2201 .id_table = safe_pci_tbl,
2202 .probe = safe_probe,
2203 .remove = safe_remove,
2204 /* add PM stuff here one day */
2205 };
2206
2207 static int __init safe_init (void)
2208 {
2209 struct safe_softc *sc = NULL;
2210 int rc;
2211
2212 DPRINTF(("%s(%p)\n", __FUNCTION__, safe_init));
2213
2214 rc = pci_register_driver(&safe_driver);
2215 pci_register_driver_compat(&safe_driver, rc);
2216
2217 return rc;
2218 }
2219
2220 static void __exit safe_exit (void)
2221 {
2222 pci_unregister_driver(&safe_driver);
2223 }
2224
2225 module_init(safe_init);
2226 module_exit(safe_exit);
2227
2228 MODULE_LICENSE("BSD");
2229 MODULE_AUTHOR("David McCullough <david_mccullough@mcafee.com>");
2230 MODULE_DESCRIPTION("OCF driver for safenet PCI crypto devices");