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