diff options
-rw-r--r-- | sys/dev/pci/ises.c | 2153 | ||||
-rw-r--r-- | sys/dev/pci/isesreg.h | 363 |
2 files changed, 0 insertions, 2516 deletions
diff --git a/sys/dev/pci/ises.c b/sys/dev/pci/ises.c deleted file mode 100644 index 83e2bb3f669..00000000000 --- a/sys/dev/pci/ises.c +++ /dev/null @@ -1,2153 +0,0 @@ -/* $OpenBSD: ises.c,v 1.33 2007/10/01 15:34:48 krw Exp $ */ - -/* - * Copyright (c) 2000, 2001 Håkan Olsson (ho@crt.se) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * PCC-ISES hardware crypto accelerator - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/proc.h> -#include <sys/errno.h> -#include <sys/malloc.h> -#include <sys/kernel.h> -#include <sys/mbuf.h> -#include <sys/timeout.h> -#include <sys/device.h> -#include <sys/queue.h> - -#include <crypto/cryptodev.h> -#include <crypto/cryptosoft.h> -#include <dev/rndvar.h> -#include <crypto/md5.h> -#include <crypto/sha1.h> -#include <crypto/rmd160.h> - -#include <dev/pci/pcireg.h> -#include <dev/pci/pcivar.h> -#include <dev/pci/pcidevs.h> - -#include <dev/pci/isesreg.h> -#include <dev/pci/isesvar.h> -#include <dev/microcode/ises/ises_fw.h> - -/* - * Prototypes and count for the pci_device structure - */ -int ises_match(struct device *, void *, void *); -void ises_attach(struct device *, struct device *, void *); - -void ises_initstate(void *); -void ises_hrng_init(struct ises_softc *); -void ises_hrng(void *); -void ises_process_oqueue(struct ises_softc *); -int ises_queue_cmd(struct ises_softc *, u_int32_t, u_int32_t *, - u_int32_t (*)(struct ises_softc *, struct ises_cmd *)); -u_int32_t ises_get_fwversion(struct ises_softc *); -int ises_assert_cmd_mode(struct ises_softc *); - -int ises_intr(void *); -int ises_newsession(u_int32_t *, struct cryptoini *); -int ises_freesession(u_int64_t); -int ises_process(struct cryptop *); -void ises_callback(struct ises_q *); -int ises_feed(struct ises_softc *); -int ises_bchu_switch_session(struct ises_softc *, - struct ises_session *, int); -u_int32_t ises_bchu_switch_final(struct ises_softc *, struct ises_cmd *); - -void ises_read_dma(struct ises_softc *); - -#define READ_REG(sc,r) \ - bus_space_read_4((sc)->sc_memt, (sc)->sc_memh,r) - -#define WRITE_REG(sc,reg,val) \ - bus_space_write_4((sc)->sc_memt, (sc)->sc_memh, reg, val) - -/* XXX This should probably be (x) = htole32((x)) */ -#define SWAP32(x) ((x) = swap32((x))) - -#ifdef ISESDEBUG -# define DPRINTF(x) printf x -#else -# define DPRINTF(x) -#endif - -#ifdef ISESDEBUG -void ises_debug_init(struct ises_softc *); -void ises_debug_2(void); -void ises_debug_loop(void *); -void ises_showreg(void); -void ises_debug_parse_omr(struct ises_softc *); -void ises_debug_simple_cmd(struct ises_softc *, u_int32_t, u_int32_t); -struct ises_softc *ises_sc; -struct timeout ises_db_timeout; -int ises_db; -#endif - -/* For HRNG entropy collection, these values gather 1600 bytes/s */ -#ifndef ISESRNGBITS -#define ISESRNGBITS 128 /* Bits per iteration (mult. of 32) */ -#define ISESRNGIPS 100 /* Iterations per second */ -#endif - -/* XXX Disable HRNG while debugging. */ -#define ISES_HRNG_DISABLED - -/* Maximum number of times we try to download the firmware. */ -#define ISES_MAX_DOWNLOAD_RETRIES 3 - -struct cfattach ises_ca = { - sizeof(struct ises_softc), ises_match, ises_attach, -}; - -struct cfdriver ises_cd = { - 0, "ises", DV_DULL -}; - -struct ises_stats { - u_int64_t ibytes; - u_int64_t obytes; - u_int32_t ipkts; - u_int32_t opkts; - u_int32_t invalid; - u_int32_t nomem; -} isesstats; - -int -ises_match(struct device *parent, void *match, void *aux) -{ - struct pci_attach_args *pa = (struct pci_attach_args *)aux; - - if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_PIJNENBURG && - PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_PIJNENBURG_PCC_ISES) - return (1); - - return (0); -} - -void -ises_attach(struct device *parent, struct device *self, void *aux) -{ - struct ises_softc *sc = (struct ises_softc *)self; - struct pci_attach_args *pa = aux; - pci_chipset_tag_t pc = pa->pa_pc; - pci_intr_handle_t ih; - const char *intrstr = NULL; - bus_size_t memsize; - - bus_dma_segment_t seg; - int nsegs, error, state; - - SIMPLEQ_INIT(&sc->sc_queue); - SIMPLEQ_INIT(&sc->sc_qchip); - SIMPLEQ_INIT(&sc->sc_cmdq); - state = 0; - - /* Map control/status registers. */ - if (pci_mapreg_map(pa, PCI_MAPREG_START, - PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT, 0, &sc->sc_memt, - &sc->sc_memh, NULL, &memsize, 0)) { - printf(": can't find mem space\n"); - return; - } - state++; - - /* Map interrupt. */ - if (pci_intr_map(pa, &ih)) { - printf(": couldn't map interrupt\n"); - goto fail; - } - state++; - - intrstr = pci_intr_string(pc, ih); - sc->sc_ih = pci_intr_establish(pc, ih, IPL_NET, ises_intr, sc, - self->dv_xname); - if (sc->sc_ih == NULL) { - printf(": couldn't establish interrupt\n"); - if (intrstr != NULL) - printf(" at %s", intrstr); - printf("\n"); - goto fail; - } - - /* Initialize DMA map */ - sc->sc_dmat = pa->pa_dmat; - error = bus_dmamap_create(sc->sc_dmat, 1 << PGSHIFT, 1, 1 << PGSHIFT, - 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &sc->sc_dmamap); - if (error) { - printf(": cannot create dma map (%d)\n", error); - goto fail; - } - state++; - - /* Allocate in DMAable memory. */ - if (bus_dmamem_alloc(sc->sc_dmat, ISES_B_DATASIZE, 1, 0, &seg, 1, - &nsegs, BUS_DMA_NOWAIT)) { - printf(": can't alloc dma buffer space\n"); - goto fail; - } - state++; - - if (bus_dmamem_map(sc->sc_dmat, &seg, nsegs, ISES_B_DATASIZE, - &sc->sc_dma_data, 0)) { - printf(": can't map dma buffer space\n"); - goto fail; - } - state++; - - printf(": %s\n", intrstr); - - bzero(&isesstats, sizeof(isesstats)); - - sc->sc_cid = crypto_get_driverid(0); - - if (sc->sc_cid < 0) - goto fail; - - /* - * Since none of the initialization steps generate interrupts - * for example, the hardware reset, we use a number of timeouts - * (or init states) to do the rest of the chip initialization. - */ - - sc->sc_initstate = 0; - startuphook_establish(ises_initstate, sc); - -#ifdef ISESDEBUG - ises_debug_init(sc); -#endif - return; - - fail: - switch (state) { /* Always fallthrough here. */ - case 5: - bus_dmamem_unmap(sc->sc_dmat, (caddr_t)&sc->sc_dma_data, - sizeof sc->sc_dma_data); - /* FALLTHROUGH */ - case 4: - bus_dmamem_free(sc->sc_dmat, &seg, nsegs); - /* FALLTHROUGH */ - case 3: - bus_dmamap_destroy(sc->sc_dmat, sc->sc_dmamap); - /* FALLTHROUGH */ - case 2: - pci_intr_disestablish(pc, sc->sc_ih); - /* FALLTHROUGH */ - case 1: - bus_space_unmap(sc->sc_memt, sc->sc_memh, memsize); - /* FALLTHROUGH */ - default: /* 0 */ - break; - } - return; -} - -void -ises_initstate(void *v) -{ - /* - * Step through chip initialization. - * sc->sc_initstate tells us what to do. - */ - extern int hz; - struct ises_softc *sc = v; - char *dv = sc->sc_dv.dv_xname; - u_int32_t stat; - int p, ticks, algs[CRYPTO_ALGORITHM_MAX + 1]; - static int retry_count = 0; /* XXX Should be in softc */ - - ticks = hz * 3 / 2; /* 1.5s */ - - p = ISES_STAT_IDP_STATE(READ_REG(sc, ISES_A_STAT)); - DPRINTF(("%s: initstate %d, IDP state is %d \"%s\"\n", dv, - sc->sc_initstate, p, ises_idp_state[p])); - - switch (sc->sc_initstate) { - case 0: - /* Called by dostartuphooks(9). */ - timeout_set(&sc->sc_timeout, ises_initstate, sc); - sc->sc_initstate++; - - /* FALLTHROUGH */ - case 1: - /* Power up the chip (clear powerdown bit) */ - stat = READ_REG(sc, ISES_BO_STAT); - if (stat & ISES_BO_STAT_POWERDOWN) { - stat &= ~ISES_BO_STAT_POWERDOWN; - WRITE_REG(sc, ISES_BO_STAT, stat); - /* Selftests will take 1 second. */ - break; - } -#if 1 - else { - /* Power down the chip for sane init, then rerun. */ - stat |= ISES_BO_STAT_POWERDOWN; - WRITE_REG(sc, ISES_BO_STAT, stat); - sc->sc_initstate--; /* Rerun state 1. */ - break; - } -#else - /* FALLTHROUGH (chip is already powered up) */ - sc->sc_initstate++; -#endif - - case 2: - /* Perform a hardware reset */ - stat = 0; - - printf ("%s: initializing...\n", dv); - - /* Clear all possible bypass bits. */ - for (p = 0; p < 128; p++) - WRITE_REG(sc, ISES_B_BDATAOUT, 0L); - - stat |= ISES_BO_STAT_HWRESET; - WRITE_REG(sc, ISES_BO_STAT, stat); - stat &= ~ISES_BO_STAT_HWRESET; - WRITE_REG(sc, ISES_BO_STAT, stat); - /* Again, selftests will take 1 second. */ - break; - - case 3: - /* Set AConf to zero, i.e 32-bits access to A-int. */ - stat = READ_REG(sc, ISES_BO_STAT); - stat &= ~ISES_BO_STAT_ACONF; - WRITE_REG(sc, ISES_BO_STAT, stat); - - /* Is the firmware already loaded? */ - if (READ_REG(sc, ISES_A_STAT) & ISES_STAT_HW_DA) { - /* Yes it is, jump ahead a bit */ - ticks = 1; - sc->sc_initstate += 3; /* Next step --> 7 */ - break; - } - - /* - * Download the Basic Functionality firmware. - */ - - p = ISES_STAT_IDP_STATE(READ_REG(sc, ISES_A_STAT)); - if (p == ISES_IDP_WFPL) { - /* We're ready to download. */ - ticks = 1; - sc->sc_initstate += 2; /* Next step --> 6 */ - break; - } - - /* - * Prior to downloading we need to reset the NSRAM. - * Setting the tamper bit will erase the contents - * in 1 microsecond. - */ - stat = READ_REG(sc, ISES_BO_STAT); - stat |= ISES_BO_STAT_TAMPER; - WRITE_REG(sc, ISES_BO_STAT, stat); - ticks = 1; - break; - - case 4: - /* After tamper bit has been set, powerdown chip. */ - stat = READ_REG(sc, ISES_BO_STAT); - stat |= ISES_BO_STAT_POWERDOWN; - WRITE_REG(sc, ISES_BO_STAT, stat); - /* Wait one second for power to dissipate. */ - break; - - case 5: - /* Clear tamper and powerdown bits. */ - stat = READ_REG(sc, ISES_BO_STAT); - stat &= ~(ISES_BO_STAT_TAMPER | ISES_BO_STAT_POWERDOWN); - WRITE_REG(sc, ISES_BO_STAT, stat); - /* Again we need to wait a second for selftests. */ - break; - - case 6: - /* - * We'll need some space in the input queue (IQF) - * and we need to be in the 'waiting for program - * length' IDP state (0x4). - */ - p = ISES_STAT_IDP_STATE(READ_REG(sc, ISES_A_STAT)); - if (READ_REG(sc, ISES_A_IQF) < 4 || p != ISES_IDP_WFPL) { - if (retry_count++ < ISES_MAX_DOWNLOAD_RETRIES) { - /* Retry download. */ - sc->sc_initstate -= 5; /* Next step --> 2 */ - ticks = 1; - break; - } - retry_count = 0; - printf("%s: cannot download firmware, " - "IDP state is \"%s\"\n", dv, ises_idp_state[p]); - return; - } - - /* Write firmware length */ - WRITE_REG(sc, ISES_A_IQD, ISES_BF_IDPLEN); - - /* Write firmware code */ - for (p = 0; p < sizeof(ises_bf_fw)/sizeof(u_int32_t); p++) { - WRITE_REG(sc, ISES_A_IQD, ises_bf_fw[p]); - if (READ_REG(sc, ISES_A_IQF) < 4) - DELAY(10); - } - - /* Write firmware CRC */ - WRITE_REG(sc, ISES_A_IQD, ISES_BF_IDPCRC); - - /* Wait 1s while chip resets and runs selftests */ - break; - - case 7: - /* Did the download succed? */ - if (READ_REG(sc, ISES_A_STAT) & ISES_STAT_HW_DA) { - ticks = 1; - break; - } - - /* We failed. */ - goto fail; - - case 8: - if (ises_assert_cmd_mode(sc) < 0) - goto fail; - - /* - * Now that the basic functionality firmware should be - * up and running, try to get the firmware version. - */ - - stat = ises_get_fwversion(sc); - if (stat == 0) - goto fail; - - printf("%s: firmware v%d.%d loaded (%d bytes)", dv, - stat & 0xffff, (stat >> 16) & 0xffff, ISES_BF_IDPLEN << 2); - - /* We can use firmware versions 1.x & 2.x */ - switch (stat & 0xffff) { - case 0: - printf(" diagnostic, %s disabled\n", dv); - goto fail; - case 1: /* Basic Func "base" firmware */ - case 2: /* Basic Func "ipsec" firmware, no ADP code */ - break; - default: - printf(" unknown, %s disabled\n", dv); - goto fail; - } - - stat = READ_REG(sc, ISES_A_STAT); - DPRINTF((", mode %s", - ises_sw_mode[ISES_STAT_SW_MODE(stat)])); - - /* Reuse the timeout for HRNG entropy collection. */ - timeout_del(&sc->sc_timeout); - ises_hrng_init(sc); - - /* Set the interrupt mask */ - sc->sc_intrmask = ISES_STAT_BCHU_OAF | ISES_STAT_BCHU_ERR | - ISES_STAT_BCHU_OFHF | ISES_STAT_SW_OQSINC | - ISES_STAT_LNAU_BUSY_1 | ISES_STAT_LNAU_ERR_1 | - ISES_STAT_LNAU_BUSY_2 | ISES_STAT_LNAU_ERR_2; -#if 0 - ISES_STAT_BCHU_ERR | ISES_STAT_BCHU_OAF | - ISES_STAT_BCHU_IFE | ISES_STAT_BCHU_IFHE | - ISES_STAT_BCHU_OFHF | ISES_STAT_BCHU_OFF; -#endif - - WRITE_REG(sc, ISES_A_INTE, sc->sc_intrmask); - - /* We're done. */ - printf("\n"); - - /* Register ourselves with crypto framework. */ - bzero(algs, sizeof(algs)); - - algs[CRYPTO_3DES_CBC] = CRYPTO_ALG_FLAG_SUPPORTED; - algs[CRYPTO_DES_CBC] = CRYPTO_ALG_FLAG_SUPPORTED; - algs[CRYPTO_MD5_HMAC] = CRYPTO_ALG_FLAG_SUPPORTED; - algs[CRYPTO_SHA1_HMAC] = CRYPTO_ALG_FLAG_SUPPORTED; - algs[CRYPTO_RIPEMD160_HMAC] = CRYPTO_ALG_FLAG_SUPPORTED; - - crypto_register(sc->sc_cid, algs, - ises_newsession, ises_freesession, ises_process); - return; - - default: - printf("%s: entered unknown initstate %d\n", dv, - sc->sc_initstate); - goto fail; - } - - /* Increment state counter and schedule next step in 'ticks' ticks. */ - sc->sc_initstate++; - timeout_add(&sc->sc_timeout, ticks); - return; - - fail: - printf("%s: firmware failure\n", dv); - timeout_del(&sc->sc_timeout); - return; -} - -/* Put a command on the A-interface queue. */ -int -ises_queue_cmd(struct ises_softc *sc, u_int32_t cmd, u_int32_t *data, - u_int32_t (*callback)(struct ises_softc *, struct ises_cmd *)) -{ - struct ises_cmd *cq; - int p, len, s, code; - - len = cmd >> 24; - code = (cmd >> 16) & 0xFF; - -#ifdef ISESDEBUG - if (code != ISES_CMD_HBITS) /* ... since this happens 100 times/s */ - DPRINTF(("%s: queueing cmd 0x%x len %d\n", sc->sc_dv.dv_xname, - code, len)); -#endif - - s = splnet(); - - if (len > READ_REG(sc, ISES_A_IQF)) { - splx(s); - return (EAGAIN); /* XXX ENOMEM ? */ - } - - cq = malloc(sizeof(*cq), M_DEVBUF, M_NOWAIT | M_ZERO); - if (cq == NULL) { - splx(s); - isesstats.nomem++; - return (ENOMEM); - } - cq->cmd_code = code; - cq->cmd_cb = callback; - cq->cmd_session = sc->sc_cursession; - SIMPLEQ_INSERT_TAIL(&sc->sc_cmdq, cq, cmd_next); - - WRITE_REG(sc, ISES_A_IQD, cmd); - - /* LNAU register data should be written in reverse order */ - if ((code >= ISES_CMD_LW_A_1 && code <= ISES_CMD_LW_U_1) || /* LNAU1 */ - (code >= ISES_CMD_LW_A_2 && code <= ISES_CMD_LW_U_2)) /* LNAU2 */ - for (p = len - 1; p >= 0; p--) - WRITE_REG(sc, ISES_A_IQD, *(data + p)); - else - for (p = 0; p < len; p++) - WRITE_REG(sc, ISES_A_IQD, *(data + p)); - - /* Signal 'command ready'. */ - WRITE_REG(sc, ISES_A_IQS, 0); - - splx(s); - return (0); -} - -/* Process all completed responses in the output queue. */ -void -ises_process_oqueue(struct ises_softc *sc) -{ -#ifdef ISESDEBUG - char *dv = sc->sc_dv.dv_xname; -#endif - struct ises_cmd *cq; - struct ises_session *ses; - u_int32_t oqs, r, d; - int cmd, len, c, s; - - r = READ_REG(sc, ISES_A_OQS); - if (r > 1) - DPRINTF(("%s:process_oqueue: OQS=%d\n", dv, r)); - - /* OQS gives us the number of responses we have to process. */ - while ((oqs = READ_REG(sc, ISES_A_OQS)) > 0) { - /* Read command response. [ len(8) | cmd(8) | rc(16) ] */ - r = READ_REG(sc, ISES_A_OQD); - len = (r >> 24); - cmd = (r >> 16) & 0xff; - r = r & 0xffff; - - s = splnet(); - if (!SIMPLEQ_EMPTY(&sc->sc_cmdq)) { - cq = SIMPLEQ_FIRST(&sc->sc_cmdq); - SIMPLEQ_REMOVE_HEAD(&sc->sc_cmdq, cmd_next); - cq->cmd_rlen = len; - } else { - cq = NULL; - DPRINTF(("%s:process_oqueue: cmd queue empty!\n", dv)); - } - splx(s); - - if (r) { - /* Ouch. This command generated an error */ - DPRINTF(("%s:process_oqueue: cmd 0x%x err %d\n", dv, - cmd, (r & ISES_RC_MASK))); - /* Abort any running session switch to force a retry.*/ - sc->sc_switching = 0; - /* Return to CMD mode. This will reset all queues. */ - (void)ises_assert_cmd_mode(sc); - } else { - /* Use specified callback, if any */ - if (cq && cq->cmd_cb) { - if (cmd == cq->cmd_code) { - cq->cmd_cb(sc, cq); - cmd = ISES_CMD_NONE; - } else { - DPRINTF(("%s:process_oqueue: expected" - " cmd 0x%x, got 0x%x\n", dv, - cq->cmd_code, cmd)); - /* XXX Some error handling here? */ - } - } - - switch (cmd) { - case ISES_CMD_NONE: - break; - - case ISES_CMD_HBITS: - /* XXX How about increasing the pool size? */ - /* XXX Use add_entropy_words instead? */ - /* XXX ... at proper spl */ - /* Cmd generated by ises_rng() via timeouts */ - while (len--) { - d = READ_REG(sc, ISES_A_OQD); - add_true_randomness(d); - } - break; - - case ISES_CMD_LUPLOAD_1: - /* Get result of LNAU 1 operation. */ - DPRINTF(("%s:process_oqueue: LNAU 1 result " - "upload (len=%d)\n", dv, len)); - sc->sc_lnau1_rlen = len; - bzero(sc->sc_lnau1_r, 2048 / 8); - while (len--) { - /* first word is LSW */ - sc->sc_lnau1_r[len] = - READ_REG(sc, ISES_A_OQD); - } - break; - - case ISES_CMD_LUPLOAD_2: - /* Get result of LNAU 1 operation. */ - DPRINTF(("%s:process_oqueue: LNAU 2 result " - "upload (len=%d)\n", dv, len)); - sc->sc_lnau2_rlen = len; - bzero(sc->sc_lnau1_r, 2048 / 8); - while (len--) { - /* first word is LSW */ - sc->sc_lnau2_r[len] = - READ_REG(sc, ISES_A_OQD); - } - break; - - case ISES_CMD_BR_OMR: - ses = &sc->sc_sessions[cq->cmd_session]; - ses->omr = READ_REG(sc, ISES_A_OQD); - DPRINTF(("%s:process_oqueue: read OMR[%08x]\n", - dv, ses->omr)); -#ifdef ISESDEBUG - ises_debug_parse_omr(sc); -#endif - break; - - case ISES_CMD_BSWITCH: - /* XXX Currently BSWITCH does not work. */ - DPRINTF(("%s:process_oqueue: BCHU_SWITCH\n")); - /* Put switched BCHU session in cur session. */ - ses = &sc->sc_sessions[cq->cmd_session]; - for(c = 0; len > 0; len--, c++) -#if 0 /* Don't store the key, just drain the data */ - *((u_int32_t *)&ses + c) = -#endif - READ_REG(sc, ISES_A_OQD); - - sc->sc_switching = 0; - ises_feed (sc); - break; - - case ISES_CMD_BW_HMLR: - /* XXX Obsoleted by ises_bchu_switch_final */ - DPRINTF(("%s:process_oqueue: CMD_BW_HMLR !?\n", - dv)); - break; - - default: - /* All other are ok (no response data) */ - DPRINTF(("%s:process_oqueue cmd 0x%x len %d\n", - dv, cmd, len)); - if (cq && cq->cmd_cb) - len -= cq->cmd_cb(sc, cq); - } - } - - if (cq) - free(cq, M_DEVBUF); - - /* This will drain any remaining data and ACK this reponse. */ - while (len-- > 0) - d = READ_REG(sc, ISES_A_OQD); - WRITE_REG(sc, ISES_A_OQS, 0); - if (oqs > 1) - DELAY(1); /* Wait for fw to decrement OQS (8 clocks) */ - } -} - -int -ises_intr(void *arg) -{ - struct ises_softc *sc = arg; - u_int32_t ints, dma_status, cmd; - char *dv = sc->sc_dv.dv_xname; - - dma_status = READ_REG(sc, ISES_DMA_STATUS); - - if (!(dma_status & (ISES_DMA_STATUS_R_ERR | ISES_DMA_STATUS_W_ERR))) { - if ((sc->sc_dma_mask & ISES_DMA_STATUS_R_RUN) != 0 && - (dma_status & ISES_DMA_STATUS_R_RUN) == 0) { - DPRINTF(("%s: DMA read complete\n", dv)); - - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, 0, - sc->sc_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD); - - /* XXX Pick up and return the data.*/ - - WRITE_REG(sc, ISES_DMA_RESET, 0); - } - if ((sc->sc_dma_mask & ISES_DMA_STATUS_W_RUN) != 0 && - (dma_status & ISES_DMA_STATUS_W_RUN) == 0) { - DPRINTF(("%s: DMA write complete\n", dv)); - - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, 0, - sc->sc_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE); - - WRITE_REG(sc, ISES_DMA_RESET, 0); - ises_feed(sc); - } - } else { - printf ("%s: DMA error\n", dv); - WRITE_REG(sc, ISES_DMA_RESET, 0); - } - - ints = READ_REG(sc, ISES_A_INTS); - if (!(ints & sc->sc_intrmask)) { - DPRINTF (("%s: other intr mask [%08x]\n", ints)); - return (0); /* Not our interrupt. */ - } - - /* Clear all set intr bits. */ - WRITE_REG(sc, ISES_A_INTS, ints); - -#if 0 - /* Check it we've got room for more data. */ - if (READ_REG(sc, ISES_A_STAT) & - (ISES_STAT_BCHU_IFE | ISES_STAT_BCHU_IFHE)) - ises_feed(sc); -#endif - - /* Does the A-intf output queue have data we need to process? */ - if (ints & ISES_STAT_SW_OQSINC) - ises_process_oqueue(sc); - - if (ints & ISES_STAT_LNAU_BUSY_1) { - DPRINTF(("%s:ises_intr: LNAU 1 job complete\n", dv)); - /* upload LNAU 1 result (into sc->sc_lnau1_r) */ - cmd = ISES_MKCMD(ISES_CMD_LUPLOAD_1, 0); - ises_queue_cmd(sc, cmd, NULL, NULL); - } - - if (ints & ISES_STAT_LNAU_BUSY_2) { - DPRINTF(("%s:ises_intr: LNAU 2 job complete\n", dv)); - /* upload LNAU 2 result (into sc->sc_lnau2_r) */ - cmd = ISES_MKCMD(ISES_CMD_LUPLOAD_2, 0); - ises_queue_cmd(sc, cmd, NULL, NULL); - } - - if (ints & ISES_STAT_LNAU_ERR_1) { - DPRINTF(("%s:ises_intr: LNAU 1 error\n", dv)); - sc->sc_lnau1_rlen = -1; - } - - if (ints & ISES_STAT_LNAU_ERR_2) { - DPRINTF(("%s:ises_intr: LNAU 2 error\n", dv)); - sc->sc_lnau2_rlen = -1; - } - - if (ints & ISES_STAT_BCHU_OAF) { /* output data available */ - DPRINTF(("%s:ises_intr: BCHU_OAF bit set\n", dv)); - /* Read DMA data from B-interface. */ - ises_read_dma (sc); - } - - if (ints & ISES_STAT_BCHU_ERR) { /* We got a BCHU error */ - DPRINTF(("%s:ises_intr: BCHU error\n", dv)); - /* XXX Error handling */ - } - - if (ints & ISES_STAT_BCHU_OFHF) { /* Output is half full */ - DPRINTF(("%s:ises_intr: BCHU output FIFO half full\n", dv)); - /* XXX drain data? */ - } - -#if 0 /* XXX Useful? */ - if (ints & ISES_STAT_BCHU_OFF) { /* Output is full */ - /* XXX drain data / error handling? */ - } -#endif - return (1); -} - -int -ises_feed(struct ises_softc *sc) -{ - struct ises_q *q; - bus_dma_segment_t *ds = &sc->sc_dmamap->dm_segs[0]; - u_int32_t dma_status; - int s; -#ifdef ISESDEBUG - char *dv = sc->sc_dv.dv_xname; -#endif - - DPRINTF(("%s:ises_feed: called (sc = %p)\n", dv, sc)); - DELAY(1000000); - - s = splnet(); - /* Anything to do? */ - if (SIMPLEQ_EMPTY(&sc->sc_queue) || - (READ_REG(sc, ISES_A_STAT) & ISES_STAT_BCHU_IFF)) { - splx(s); - return (0); - } - - /* Pick the first */ - q = SIMPLEQ_FIRST(&sc->sc_queue); - splx(s); - - /* If we're currently switching sessions, we'll have to wait. */ - if (sc->sc_switching != 0) { - DPRINTF(("%s:ises_feed: waiting for session switch\n", dv)); - return (0); - } - - /* If on-chip data is not correct for this data, switch session. */ - if (sc->sc_cursession != q->q_sesn) { - /* Session switch required */ - DPRINTF(("%s:ises_feed: initiating session switch\n", dv)); - if (ises_bchu_switch_session (sc, &q->q_session, q->q_sesn)) - sc->sc_cursession = q->q_sesn; - else - DPRINTF(("%s:ises_feed: session switch failed\n", dv)); - return (0); - } - - DPRINTF(("%s:ises_feed: feed to chip (q = %p)\n", dv, q)); - DELAY(2000000); - - s = splnet(); - SIMPLEQ_REMOVE_HEAD(&sc->sc_queue, q_next); - SIMPLEQ_INSERT_TAIL(&sc->sc_qchip, q, q_next); - --sc->sc_nqueue; - splx(s); - - if (q->q_crp->crp_flags & CRYPTO_F_IMBUF) - bus_dmamap_load_mbuf(sc->sc_dmat, sc->sc_dmamap, - q->q_src.mbuf, BUS_DMA_NOWAIT); - else if (q->q_crp->crp_flags & CRYPTO_F_IOV) - bus_dmamap_load_uio(sc->sc_dmat, sc->sc_dmamap, q->q_src.uio, - BUS_DMA_NOWAIT); - /* ... else */ - - /* Start writing data to the ises. */ - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, 0, - sc->sc_dmamap->dm_mapsize, BUS_DMASYNC_PREWRITE); - - DPRINTF(("%s:ises_feed: writing DMA\n", dv)); - DELAY(1000000); - - sc->sc_dma_mask |= ISES_DMA_STATUS_W_RUN; - - WRITE_REG(sc, ISES_DMA_WRITE_START, ds->ds_addr); - WRITE_REG(sc, ISES_DMA_WRITE_COUNT, ISES_DMA_WCOUNT(ds->ds_len)); - - dma_status = READ_REG(sc, ISES_DMA_STATUS); - dma_status |= ISES_DMA_CTRL_ILT | ISES_DMA_CTRL_RLINE; - WRITE_REG(sc, ISES_DMA_CTRL, dma_status); - - DPRINTF(("%s:ises_feed: done\n", dv)); - return (0); -} - -/* - * Allocate a new 'session' and return an encoded session id. 'sidp' - * contains our registration id, and should contain an encoded session - * id on successful allocation. - */ -int -ises_newsession(u_int32_t *sidp, struct cryptoini *cri) -{ - struct cryptoini *c, *mac = NULL, *enc = NULL; - struct ises_softc *sc = NULL; - struct ises_session *ses; - MD5_CTX md5ctx; - SHA1_CTX sha1ctx; - RMD160_CTX rmd160ctx; - int i, sesn; -#ifdef ISESDEBUG - char *dv; -#endif - - if (sidp == NULL || cri == NULL) - return (EINVAL); - - for (i = 0; i < ises_cd.cd_ndevs; i++) { - sc = ises_cd.cd_devs[i]; - if (sc == NULL || sc->sc_cid == (*sidp)) - break; - } - if (sc == NULL) - return (EINVAL); -#ifdef ISESDEBUG - dv = sc->sc_dv.dv_xname; -#endif - - DPRINTF(("%s:ises_newsession: start\n", dv)); - - for (c = cri; c != NULL; c = c->cri_next) { - if (c->cri_alg == CRYPTO_MD5_HMAC || - c->cri_alg == CRYPTO_SHA1_HMAC || - c->cri_alg == CRYPTO_RIPEMD160_HMAC) { - if (mac) - return (EINVAL); - mac = c; - } else if (c->cri_alg == CRYPTO_DES_CBC || - c->cri_alg == CRYPTO_3DES_CBC) { - if (enc) - return (EINVAL); - enc = c; - } else - return (EINVAL); - } - if (mac == 0 && enc == 0) - return (EINVAL); - -#ifdef ISESDEBUG - printf ("%s:ises_newsession: mac=%p(%d) enc=%p(%d)\n", - dv, mac, (mac ? mac->cri_alg : -1), enc, (enc ? enc->cri_alg : -1)); -#endif - - /* Allocate a new session */ - if (sc->sc_sessions == NULL) { - ses = sc->sc_sessions = (struct ises_session *) - malloc(sizeof(struct ises_session), M_DEVBUF, M_NOWAIT); - if (ses == NULL) { - isesstats.nomem++; - return (ENOMEM); - } - sc->sc_cursession = -1; - sesn = 0; - sc->sc_nsessions = 1; - } else { - ses = NULL; - for (sesn = 0; sesn < sc->sc_nsessions; sesn++) - if (sc->sc_sessions[sesn].omr == 0) { - ses = &sc->sc_sessions[sesn]; - sc->sc_cursession = sesn; - break; - } - - if (ses == NULL) { - i = sc->sc_nsessions * sizeof(struct ises_session); - ses = (struct ises_session *) - malloc(i + sizeof(struct ises_session), M_DEVBUF, - M_NOWAIT); - if (ses == NULL) { - isesstats.nomem++; - return (ENOMEM); - } - - bcopy(sc->sc_sessions, ses, i); - bzero(sc->sc_sessions, i); - free(sc->sc_sessions, M_DEVBUF); - sc->sc_sessions = ses; - ses = &sc->sc_sessions[sc->sc_nsessions]; - sc->sc_cursession = sc->sc_nsessions; - sc->sc_nsessions++; - } - } - - DPRINTF(("%s:ises_newsession: nsessions=%d cursession=%d\n", dv, - sc->sc_nsessions, sc->sc_cursession)); - - bzero(ses, sizeof(struct ises_session)); - - /* Select data path through B-interface. */ - ses->omr |= ISES_SELR_BCHU_DIS; - - if (enc) { - /* get an IV, network byte order */ - /* XXX switch to using builtin HRNG ! */ - arc4random_bytes(ses->sccr, sizeof(ses->sccr)); - - /* crypto key */ - if (enc->cri_alg == CRYPTO_DES_CBC) { - bcopy(enc->cri_key, &ses->kr[0], 8); - bcopy(enc->cri_key, &ses->kr[2], 8); - bcopy(enc->cri_key, &ses->kr[4], 8); - } else - bcopy(enc->cri_key, &ses->kr[0], 24); - - SWAP32(ses->kr[0]); - SWAP32(ses->kr[1]); - SWAP32(ses->kr[2]); - SWAP32(ses->kr[3]); - SWAP32(ses->kr[4]); - SWAP32(ses->kr[5]); - } - - if (mac) { - for (i = 0; i < mac->cri_klen / 8; i++) - mac->cri_key[i] ^= HMAC_IPAD_VAL; - - switch (mac->cri_alg) { - case CRYPTO_MD5_HMAC: - MD5Init(&md5ctx); - MD5Update(&md5ctx, mac->cri_key, mac->cri_klen / 8); - MD5Update(&md5ctx, hmac_ipad_buffer, HMAC_BLOCK_LEN - - (mac->cri_klen / 8)); - MD5Final((u_int8_t *)&ses->cvr, &md5ctx); - break; - case CRYPTO_SHA1_HMAC: - SHA1Init(&sha1ctx); - SHA1Update(&sha1ctx, mac->cri_key, mac->cri_klen / 8); - SHA1Update(&sha1ctx, hmac_ipad_buffer, HMAC_BLOCK_LEN - - (mac->cri_klen / 8)); - SHA1Final((u_int8_t *)ses->cvr, &sha1ctx); - break; - case CRYPTO_RIPEMD160_HMAC: - default: - RMD160Init(&rmd160ctx); - RMD160Update(&rmd160ctx, mac->cri_key, - mac->cri_klen / 8); - RMD160Update(&rmd160ctx, hmac_ipad_buffer, - HMAC_BLOCK_LEN - (mac->cri_klen / 8)); - RMD160Final((u_int8_t *)ses->cvr, &rmd160ctx); - break; - } - - for (i = 0; i < mac->cri_klen / 8; i++) - mac->cri_key[i] ^= (HMAC_IPAD_VAL ^ HMAC_OPAD_VAL); - - switch (mac->cri_alg) { - case CRYPTO_MD5_HMAC: - MD5Init(&md5ctx); - MD5Update(&md5ctx, mac->cri_key, mac->cri_klen / 8); - MD5Update(&md5ctx, hmac_opad_buffer, HMAC_BLOCK_LEN - - (mac->cri_klen / 8)); - MD5Update(&md5ctx, (u_int8_t *)ses->cvr, - sizeof(md5ctx.state)); - MD5Final((u_int8_t *)ses->cvr, &md5ctx); - break; - case CRYPTO_SHA1_HMAC: - SHA1Init(&sha1ctx); - SHA1Update(&sha1ctx, mac->cri_key, mac->cri_klen / 8); - SHA1Update(&sha1ctx, hmac_opad_buffer, HMAC_BLOCK_LEN - - (mac->cri_klen / 8)); - SHA1Update(&sha1ctx, (u_int8_t *)ses->cvr, - sizeof(sha1ctx.state)); - SHA1Final((u_int8_t *)ses->cvr, &sha1ctx); - break; - case CRYPTO_RIPEMD160_HMAC: - default: - RMD160Init(&rmd160ctx); - RMD160Update(&rmd160ctx, mac->cri_key, - mac->cri_klen / 8); - RMD160Update(&rmd160ctx, hmac_opad_buffer, - HMAC_BLOCK_LEN - (mac->cri_klen / 8)); - RMD160Update(&rmd160ctx, (u_int8_t *)ses->cvr, - sizeof(rmd160ctx.state)); - RMD160Final((u_int8_t *)ses->cvr, &rmd160ctx); - break; - } - - for (i = 0; i < mac->cri_klen / 8; i++) - mac->cri_key[i] ^= HMAC_OPAD_VAL; - } - - DPRINTF(("%s:ises_newsession: done\n", dv)); - *sidp = ISES_SID(sc->sc_dv.dv_unit, sesn); - return (0); -} - -/* Deallocate a session. */ -int -ises_freesession(u_int64_t tsid) -{ - struct ises_softc *sc; - int card, sesn; - u_int32_t sid = ((u_int32_t)tsid) & 0xffffffff; - - card = ISES_CARD(sid); - if (card >= ises_cd.cd_ndevs || ises_cd.cd_devs[card] == NULL) - return (EINVAL); - - sc = ises_cd.cd_devs[card]; - sesn = ISES_SESSION(sid); - - DPRINTF(("%s:ises_freesession: freeing session %d\n", - sc->sc_dv.dv_xname, sesn)); - - if (sc->sc_cursession == sesn) - sc->sc_cursession = -1; - - bzero(&sc->sc_sessions[sesn], sizeof(sc->sc_sessions[sesn])); - - return (0); -} - -/* Called by the crypto framework, crypto(9). */ -int -ises_process(struct cryptop *crp) -{ - struct ises_softc *sc; - struct ises_q *q; - struct cryptodesc *maccrd, *enccrd, *crd; - struct ises_session *ses; - int card, s, err = EINVAL; - int encoffset, macoffset, cpskip, sskip, dskip, stheend, dtheend; - int cpoffset, coffset; -#if 0 - int nicealign; -#endif -#ifdef ISESDEBUG - char *dv; -#endif - - if (crp == NULL || crp->crp_callback == NULL) - return (EINVAL); - - card = ISES_CARD(crp->crp_sid); - if (card >= ises_cd.cd_ndevs || ises_cd.cd_devs[card] == NULL) - goto errout; - - sc = ises_cd.cd_devs[card]; -#ifdef ISESDEBUG - dv = sc->sc_dv.dv_xname; -#endif - - DPRINTF(("%s:ises_process: start (crp = %p)\n", dv, crp)); - - s = splnet(); - if (sc->sc_nqueue == ISES_MAX_NQUEUE) { - splx(s); - goto memerr; - } - splx(s); - - q = malloc(sizeof(*q), M_DEVBUF, M_NOWAIT | M_ZERO); - if (q == NULL) - goto memerr; - - q->q_sesn = ISES_SESSION(crp->crp_sid); - ses = &sc->sc_sessions[q->q_sesn]; - - DPRINTF(("%s:ises_process: session %d selected\n", dv, q->q_sesn)); - - q->q_sc = sc; - q->q_crp = crp; - - if (crp->crp_flags & CRYPTO_F_IMBUF) { - q->q_src.mbuf = (struct mbuf *)crp->crp_buf; - q->q_dst.mbuf = (struct mbuf *)crp->crp_buf; - } else if (crp->crp_flags & CRYPTO_F_IOV) { - q->q_src.uio = (struct uio *)crp->crp_buf; - q->q_dst.uio = (struct uio *)crp->crp_buf; - } else { - /* XXX for now... */ - goto errout; - } - - /* - * Check if the crypto descriptors are sane. We accept: - * - just one crd; either auth or crypto - * - two crds; must be one auth and one crypto, although now - * for encryption we only want the first to be crypto, while - * for decryption the second one should be crypto. - */ - maccrd = enccrd = NULL; - for (crd = crp->crp_desc; crd; crd = crd->crd_next) { - switch (crd->crd_alg) { - case CRYPTO_MD5_HMAC: - case CRYPTO_SHA1_HMAC: - case CRYPTO_RIPEMD160_HMAC: - if (maccrd || (enccrd && - (enccrd->crd_flags & CRD_F_ENCRYPT) == 0)) - goto errout; - maccrd = crd; - break; - case CRYPTO_DES_CBC: - case CRYPTO_3DES_CBC: - if (enccrd || - (maccrd && (crd->crd_flags & CRD_F_ENCRYPT))) - goto errout; - enccrd = crd; - break; - default: - goto errout; - } - } - if (!maccrd && !enccrd) - goto errout; - - DPRINTF(("%s:ises_process: enc=%p mac=%p\n", dv, enccrd, maccrd)); - - /* Select data path through B-interface. */ - q->q_session.omr |= ISES_SELR_BCHU_DIS; - - if (enccrd) { - encoffset = enccrd->crd_skip; - - /* Select algorithm */ - if (enccrd->crd_alg == CRYPTO_3DES_CBC) - q->q_session.omr |= ISES_SOMR_BOMR_3DES; - else - q->q_session.omr |= ISES_SOMR_BOMR_DES; - - /* Set CBC mode */ - q->q_session.omr |= ISES_SOMR_FMR_CBC; - - if (enccrd->crd_flags & CRD_F_ENCRYPT) { - /* Set encryption bit */ - q->q_session.omr |= ISES_SOMR_EDR; - - if (enccrd->crd_flags & CRD_F_IV_EXPLICIT) - bcopy(enccrd->crd_iv, q->q_session.sccr, 8); - else { - q->q_session.sccr[0] = ses->sccr[0]; - q->q_session.sccr[1] = ses->sccr[1]; - } - - if ((enccrd->crd_flags & CRD_F_IV_PRESENT) == 0) { - if (crp->crp_flags & CRYPTO_F_IMBUF) - m_copyback(q->q_src.mbuf, - enccrd->crd_inject, 8, - (caddr_t)q->q_session.sccr); - else if (crp->crp_flags & CRYPTO_F_IOV) - cuio_copyback(q->q_src.uio, - enccrd->crd_inject, 8, - (caddr_t)q->q_session.sccr); - /* XXX else ... */ - } - } else { - /* Clear encryption bit == decrypt mode */ - q->q_session.omr &= ~ISES_SOMR_EDR; - - if (enccrd->crd_flags & CRD_F_IV_EXPLICIT) - bcopy(enccrd->crd_iv, q->q_session.sccr, 8); - else if (crp->crp_flags & CRYPTO_F_IMBUF) - m_copydata(q->q_src.mbuf, enccrd->crd_inject, - 8, (caddr_t)q->q_session.sccr); - else if (crp->crp_flags & CRYPTO_F_IOV) - cuio_copydata(q->q_src.uio, - enccrd->crd_inject, 8, - (caddr_t)q->q_session.sccr); - /* XXX else ... */ - } - - q->q_session.kr[0] = ses->kr[0]; - q->q_session.kr[1] = ses->kr[1]; - q->q_session.kr[2] = ses->kr[2]; - q->q_session.kr[3] = ses->kr[3]; - q->q_session.kr[4] = ses->kr[4]; - q->q_session.kr[5] = ses->kr[5]; - - SWAP32(q->q_session.sccr[0]); - SWAP32(q->q_session.sccr[1]); - } - - if (maccrd) { - macoffset = maccrd->crd_skip; - - /* Select algorithm */ - switch (crd->crd_alg) { - case CRYPTO_MD5_HMAC: - q->q_session.omr |= ISES_HOMR_HFR_MD5; - break; - case CRYPTO_SHA1_HMAC: - q->q_session.omr |= ISES_HOMR_HFR_SHA1; - break; - case CRYPTO_RIPEMD160_HMAC: - default: - q->q_session.omr |= ISES_HOMR_HFR_RMD160; - break; - } - - q->q_session.cvr[0] = ses->cvr[0]; - q->q_session.cvr[1] = ses->cvr[1]; - q->q_session.cvr[2] = ses->cvr[2]; - q->q_session.cvr[3] = ses->cvr[3]; - q->q_session.cvr[4] = ses->cvr[4]; - } - - if (enccrd && maccrd) { - /* XXX Check if ises handles differing end of auth/enc etc */ - /* XXX For now, assume not (same as ubsec). */ - if (((encoffset + enccrd->crd_len) != - (macoffset + maccrd->crd_len)) || - (enccrd->crd_skip < maccrd->crd_skip)) { - goto errout; - } - - sskip = maccrd->crd_skip; - cpskip = dskip = enccrd->crd_skip; - stheend = maccrd->crd_len; - dtheend = enccrd->crd_len; - coffset = cpskip - sskip; - cpoffset = cpskip + dtheend; - /* XXX DEBUG ? */ - } else { - cpskip = dskip = sskip = macoffset + encoffset; - dtheend = enccrd ? enccrd->crd_len : maccrd->crd_len; - stheend = dtheend; - cpoffset = cpskip + dtheend; - coffset = 0; - } - q->q_offset = coffset >> 2; - -#if 0 /* XXX not sure about this, in bus_dma context */ - - if (crp->crp_flags & CRYPTO_F_IMBUF) - q->q_src_l = mbuf2pages(q->q_src.mbuf, &q->q_src_npa, - q->q_src_packp, q->q_src_packl, 1, &nicealign); - else if (crp->crp_flags & CRYPTO_F_IOV) - q->q_src_l = iov2pages(q->q_src.uio, &q->q_src_npa, - q->q_src_packp, q->q_src_packl, 1, &nicealign); - /* XXX else */ - - DPRINTF(("%s:ises_process: foo2pages called!\n", dv)); - - if (q->q_src_l == 0) - goto memerr; - else if (q->q_src_l > 0xfffc) { - err = EIO; - goto errout; - } - - /* XXX ... */ - - if (enccrd == NULL && maccrd != NULL) { - /* XXX ... */ - } else { - if (!nicealign && (crp->crp_flags & CRYPTO_F_IOV)) { - goto errout; - } else if (!nicealign && (crp->crp_flags & CRYPTO_F_IMBUF)) { - int totlen, len; - struct mbuf *m, *top, **mp; - - totlen = q->q_dst_l = q->q_src_l; - if (q->q_src.mbuf->m_flags & M_PKTHDR) { - MGETHDR(m, M_DONTWAIT, MT_DATA); - M_DUP_PKTHDR(m, q->q_src.mbuf); - len = MHLEN; - } else { - MGET(m, M_DONTWAIT, MT_DATA); - len = MLEN; - } - if (m == NULL) - goto memerr; - if (totlen >= MINCLSIZE) { - MCLGET(m, M_DONTWAIT); - if (m->m_flags & M_EXT) - len = MCLBYTES; - } - m->m_len = len; - top = NULL; - mp = ⊤ - - while (totlen > 0) { - if (top) { - MGET(m, M_DONTWAIT, MT_DATA); - if (m == NULL) { - m_freem(top); - goto memerr; - } - len = MLEN; - } - if (top && totlen >= MINCLSIZE) { - MCLGET(m, M_DONTWAIT); - if (m->m_flags & M_EXT) - len = MCLBYTES; - } - m->m_len = len = min(totlen, len); - totlen -= len; - *mp = m; - - mp = &m->m_next; - } - q->q_dst.mbuf = top; -#if notyet - ubsec_mcopy(q->q_src.mbuf, q->q_dst.mbuf, cpskip, cpoffset); -#endif - } else - q->q_dst.mbuf = q->q_src.mbuf; - -#if 0 - /* XXX ? */ - q->q_dst_l = mbuf2pages(q->q_dst.mbuf, &q->q_dst_npa, - &q->q_dst_packp, &q->q_dst_packl, 1, NULL); -#endif - } - -#endif /* XXX */ - - DPRINTF(("%s:ises_process: queueing request\n", dv)); - - s = splnet(); - SIMPLEQ_INSERT_TAIL(&sc->sc_queue, q, q_next); - sc->sc_nqueue++; - splx(s); - ises_feed(sc); - - return (0); - -memerr: - err = ENOMEM; - isesstats.nomem++; -errout: - DPRINTF(("%s:ises_process: an error occurred, err=%d, q=%p\n", dv, - err, q)); - - if (err == EINVAL) - isesstats.invalid++; - - if (q) { - if (q->q_src.mbuf != q->q_dst.mbuf) - m_freem(q->q_dst.mbuf); - free(q, M_DEVBUF); - } - crp->crp_etype = err; - crypto_done(crp); - return (0); -} - -void -ises_callback(struct ises_q *q) -{ - struct cryptop *crp = (struct cryptop *)q->q_crp; - struct cryptodesc *crd; - struct ises_softc *sc = q->q_sc; - u_int8_t *sccr; - - if ((crp->crp_flags & CRYPTO_F_IMBUF) && - (q->q_src.mbuf != q->q_dst.mbuf)) { - m_freem(q->q_src.mbuf); - crp->crp_buf = (caddr_t)q->q_dst.mbuf; - } - - if (q->q_session.omr & ISES_SOMR_EDR) { - /* Copy out IV after encryption. */ - sccr = (u_int8_t *)&sc->sc_sessions[q->q_sesn].sccr; - for (crd = crp->crp_desc; crd; crd = crd->crd_next) { - if (crd->crd_alg != CRYPTO_DES_CBC && - crd->crd_alg != CRYPTO_3DES_CBC) - continue; - if (crp->crp_flags & CRYPTO_F_IMBUF) - m_copydata((struct mbuf *)crp->crp_buf, - crd->crd_skip + crd->crd_len - 8, 8, sccr); - else if (crp->crp_flags & CRYPTO_F_IOV) - cuio_copydata((struct uio *)crp->crp_buf, - crd->crd_skip + crd->crd_len - 8, 8, sccr); - } - } - - for (crd = crp->crp_desc; crd; crd = crd->crd_next) { - if (crd->crd_alg != CRYPTO_MD5_HMAC && - crd->crd_alg != CRYPTO_SHA1_HMAC && - crd->crd_alg != CRYPTO_RIPEMD160_HMAC) - continue; - if (crp->crp_flags & CRYPTO_F_IMBUF) - m_copyback((struct mbuf *)crp->crp_buf, - crd->crd_inject, 12, (u_int8_t *)q->q_macbuf); - else if (crp->crp_flags & CRYPTO_F_IOV) - bcopy((u_int8_t *)q->q_macbuf, crp->crp_mac, 12); - /* XXX else ... */ - break; - } - - free(q, M_DEVBUF); - DPRINTF(("%s:ises_callback: calling crypto_done\n", - sc->sc_dv.dv_xname)); - crypto_done(crp); -} - -/* Initilize the ISES hardware RNG, and set up timeouts. */ -void -ises_hrng_init(struct ises_softc *sc) -{ - u_int32_t cmd, r; - int i; -#ifdef ISESDEBUG - struct timeval tv1, tv2; -#endif - - /* Asking for random data will seed LFSR and start the RBG */ - cmd = ISES_MKCMD(ISES_CMD_HBITS, 1); - r = 8; /* 8 * 32 = 256 bits */ - - if (ises_queue_cmd(sc, cmd, &r, NULL)) - return; - - /* Wait until response arrives. */ - for (i = 1000; i && READ_REG(sc, ISES_A_OQS) == 0; i--) - DELAY(10); - - if (!READ_REG(sc, ISES_A_OQS)) - return; - - /* Drain cmd response and 8*32 bits data */ - for (i = 0; i <= r; i++) - (void)READ_REG(sc, ISES_A_OQD); - - /* ACK the response */ - WRITE_REG(sc, ISES_A_OQS, 0); - DELAY(1); - printf(", rng active"); - -#ifdef ISESDEBUG - /* Benchmark the HRNG. */ - - /* - * XXX These values gets surprisingly large. Docs state the - * HNRG produces > 1 mbit/s of random data. The values I'm seeing - * are much higher, ca 2.7-2.8 mbit/s. AFAICT the algorithm is sound. - * Compiler optimization issues, perhaps? - */ - -#define ISES_WPR 250 -#define ISES_ROUNDS 100 - cmd = ISES_MKCMD(ISES_CMD_HBITS, 1); - r = ISES_WPR; - - /* Queue 100 cmds; each generate 250 32-bit words of rnd data. */ - microtime(&tv1); - for (i = 0; i < ISES_ROUNDS; i++) - ises_queue_cmd(sc, cmd, &r, NULL); - for (i = 0; i < ISES_ROUNDS; i++) { - while (READ_REG(sc, ISES_A_OQS) == 0) ; /* Wait for response */ - - (void)READ_REG(sc, ISES_A_OQD); /* read response */ - for (r = ISES_WPR; r--;) - (void)READ_REG(sc, ISES_A_OQD); /* read data */ - WRITE_REG(sc, ISES_A_OQS, 0); /* ACK resp */ - DELAY(1); /* OQS needs 1us to decrement */ - } - microtime(&tv2); - - timersub(&tv2, &tv1, &tv1); - tv1.tv_usec += 1000000 * tv1.tv_sec; - printf(", %dKb/sec", - ISES_WPR * ISES_ROUNDS * 32 / 1024 * 1000000 / tv1.tv_usec); -#endif - - timeout_set(&sc->sc_timeout, ises_hrng, sc); -#ifndef ISES_HRNG_DISABLED - ises_hrng(sc); /* Call first update */ -#endif -} - -/* Called by timeout (and once by ises_init_hrng()). */ -void -ises_hrng(void *v) -{ - /* - * Throw a HRNG read random bits command on the command queue. - * The normal loop will manage the result and add it to the pool. - */ - struct ises_softc *sc = v; - u_int32_t cmd, n; - extern int hz; /* from param.c */ - - timeout_add(&sc->sc_timeout, hz / ISESRNGIPS); - - if (ises_assert_cmd_mode(sc) != 0) - return; - - cmd = ISES_MKCMD(ISES_CMD_HBITS, 1); - n = (ISESRNGBITS >> 5) & 0xff; /* ask for N 32 bit words */ - - ises_queue_cmd(sc, cmd, &n, NULL); -} - -u_int32_t -ises_get_fwversion(struct ises_softc *sc) -{ - u_int32_t r; - int i; - - r = ISES_MKCMD(ISES_CMD_CHIP_ID, 0); - WRITE_REG(sc, ISES_A_IQD, r); - WRITE_REG(sc, ISES_A_IQS, 0); - - for (i = 100; i > 0 && READ_REG(sc, ISES_A_OQS) == 0; i--) - DELAY(1); - - if (i < 1) - return (0); /* No response */ - - r = READ_REG(sc, ISES_A_OQD); - - /* Check validity. On error drain reponse data. */ - if (((r >> 16) & 0xff) != ISES_CMD_CHIP_ID || - ((r >> 24) & 0xff) != 3 || (r & ISES_RC_MASK) != ISES_RC_SUCCESS) { - if ((r & ISES_RC_MASK) == ISES_RC_SUCCESS) - for (i = ((r >> 24) & 0xff); i; i--) - (void)READ_REG(sc, ISES_A_OQD); - r = 0; - goto out; - } - - r = READ_REG(sc, ISES_A_OQD); /* read version */ - (void)READ_REG(sc, ISES_A_OQD); /* Discard 64bit "chip-id" */ - (void)READ_REG(sc, ISES_A_OQD); - out: - WRITE_REG(sc, ISES_A_OQS, 0); /* Ack the response */ - DELAY(1); - return (r); -} - -/* - * ises_assert_cmd_mode() returns - * -1 for failure to go to cmd - * 0 if mode already was cmd - * >0 if mode was other (WFC/WFR) but now is cmd (this has reset the queues) - */ -int -ises_assert_cmd_mode(struct ises_softc *sc) -{ - switch (ISES_STAT_SW_MODE(READ_REG(sc, ISES_A_STAT))) { - case 0x0: /* Selftest. XXX This is a transient state. */ - DELAY(1000000); - if (ISES_STAT_SW_MODE(READ_REG(sc, ISES_A_STAT)) == 0) - return (-1); - return (ises_assert_cmd_mode(sc)); - case 0x1: /* Command mode */ - return (0); - case 0x2: /* Waiting For Continue / WFC */ - bus_space_write_2(sc->sc_memt, sc->sc_memh, ISES_A_CTRL, - ISES_A_CTRL_CONTINUE); - DELAY(1); - return ((ISES_STAT_SW_MODE(READ_REG(sc, ISES_A_STAT)) == 0) ? - 1 : -1); - case 0x3: /* Waiting For Reset / WFR */ - bus_space_write_2(sc->sc_memt, sc->sc_memh, ISES_A_CTRL, - ISES_A_CTRL_RESET); - DELAY(1000000); - return ((ISES_STAT_SW_MODE(READ_REG(sc, ISES_A_STAT)) == 0) ? - 2 : -1); - default: - return (-1); /* Unknown mode */ - } -} - -int -ises_bchu_switch_session (struct ises_softc *sc, struct ises_session *ss, - int new_session) -{ - /* It appears that the BCHU_SWITCH_SESSION command is broken. */ - /* We have to work around it. */ - - u_int32_t cmd; - - /* Do we have enough in-queue space? Count cmds + data, 16bit words. */ - if ((8 * 2 + sizeof (*ss) / 2) > READ_REG(sc, ISES_A_IQF)) - return (0); - - /* Mark 'switch' in progress. */ - sc->sc_switching = new_session + 1; - - /* Write the key. */ - cmd = ISES_MKCMD(ISES_CMD_BW_KR0, 2); - ises_queue_cmd(sc, cmd, &ss->kr[4], NULL); - cmd = ISES_MKCMD(ISES_CMD_BW_KR1, 2); - ises_queue_cmd(sc, cmd, &ss->kr[2], NULL); - cmd = ISES_MKCMD(ISES_CMD_BW_KR2, 2); - ises_queue_cmd(sc, cmd, &ss->kr[0], NULL); - - /* Write OMR - Operation Method Register, clears SCCR+CVR+DBCR+HMLR */ - cmd = ISES_MKCMD(ISES_CMD_BW_OMR, 1); - ises_queue_cmd(sc, cmd, &ss->omr, NULL); - - /* Write SCCR - Symmetric Crypto Chaining Register (IV) */ - cmd = ISES_MKCMD(ISES_CMD_BW_SCCR, 2); - ises_queue_cmd(sc, cmd, &ss->sccr[0], NULL); - - /* Write CVR - Chaining Variables Register (hash state) */ - cmd = ISES_MKCMD(ISES_CMD_BW_CVR, 5); - ises_queue_cmd(sc, cmd, &ss->cvr[0], NULL); - - /* Write DBCR - Data Block Count Register */ - cmd = ISES_MKCMD(ISES_CMD_BW_DBCR, 2); - ises_queue_cmd(sc, cmd, &ss->dbcr[0], NULL); - - /* Write HMLR - Hash Message Length Register - last cmd in switch */ - cmd = ISES_MKCMD(ISES_CMD_BW_HMLR, 2); - ises_queue_cmd(sc, cmd, &ss->hmlr[0], ises_bchu_switch_final); - - return (1); -} - -u_int32_t -ises_bchu_switch_final (struct ises_softc *sc, struct ises_cmd *cmd) -{ - /* Session switch is complete. */ - - DPRINTF(("%s:ises_bchu_switch_final: switch complete\n", - sc->sc_dv.dv_xname)); - - sc->sc_cursession = sc->sc_switching - 1; - sc->sc_switching = 0; - - /* Retry/restart feed. */ - ises_feed(sc); - - return (0); -} - -/* XXX Currently unused. */ -void -ises_read_dma (struct ises_softc *sc) -{ - bus_dma_segment_t *ds = &sc->sc_dmamap->dm_segs[0]; - u_int32_t dma_status; - - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, 0, - sc->sc_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD); - - WRITE_REG(sc, ISES_DMA_READ_START, ds->ds_addr); - WRITE_REG(sc, ISES_DMA_READ_START, ISES_DMA_RCOUNT(ds->ds_len)); - - dma_status = READ_REG(sc, ISES_DMA_STATUS); - dma_status |= ISES_DMA_CTRL_ILT | ISES_DMA_CTRL_WRITE; - WRITE_REG(sc, ISES_DMA_CTRL, dma_status); -} - -#ifdef ISESDEBUG -/* - * Development code section below here. - */ - -void -ises_debug_init (struct ises_softc *sc) -{ - ises_sc = sc; - ises_db = 0; - timeout_set (&ises_db_timeout, ises_debug_loop, sc); - timeout_add (&ises_db_timeout, 100); - printf ("ises0: ISESDEBUG active (ises_sc = %p)\n", ises_sc); -} - -void -ises_debug_2 (void) -{ - timeout_set (&ises_db_timeout, ises_debug_loop, ises_sc); - timeout_add (&ises_db_timeout, 100); - printf ("ises0: another debug timeout scheduled!\n"); -} - -void -ises_debug_simple_cmd (struct ises_softc *sc, u_int32_t code, u_int32_t d) -{ - u_int32_t cmd, data; - - cmd = ISES_MKCMD(code, (d ? 1 : 0)); - data = d; - ises_queue_cmd(sc, cmd, &d, NULL); -} - -void -ises_debug_loop (void *v) -{ - struct ises_softc *sc = (struct ises_softc *)v; - struct ises_session ses; - u_int32_t cmd, stat; - int i; - - if (ises_db) - printf ("ises0: ises_db = %d sc = %p\n", ises_db, sc); - - timeout_add (&ises_db_timeout, 300); /* Every 3 secs */ - - stat = READ_REG(sc, ISES_A_OQS); - cmd = READ_REG(sc, ISES_A_IQS); - if (stat || cmd) - printf ("ises0: IQS=%d OQS=%d / IQF=%d OQF=%d\n", - cmd, stat, READ_REG(sc, ISES_A_IQF), - READ_REG(sc, ISES_A_OQF)); - - switch (ises_db) { - default: - /* 0 - do nothing (just loop) */ - break; - case 1: - /* Just dump register info */ - ises_showreg(); - break; - case 2: - /* Reset LNAU 1 registers */ - ises_debug_simple_cmd(sc, ISES_CMD_LRESET_1, 0); - - /* Compute R = (141 * 5623) % 117 (R should be 51 (0x33)) */ - ises_debug_simple_cmd(sc, ISES_CMD_LW_A_1, 141); - ises_debug_simple_cmd(sc, ISES_CMD_LW_B_1, 5623); - ises_debug_simple_cmd(sc, ISES_CMD_LW_N_1, 117); - - /* Launch LNAU operation. */ - ises_debug_simple_cmd(sc, ISES_CMD_LMULMOD_1, 0); - break; - case 3: - /* Read result LNAU_1 R register (should not be necessary) */ - ises_debug_simple_cmd(sc, ISES_CMD_LUPLOAD_1, 0); - break; - case 4: - /* Print result */ - printf ("LNAU_1 R length = %d\n", sc->sc_lnau1_rlen); - for (i = 0; i < sc->sc_lnau1_rlen; i++) - printf ("W%02d-[%08x]-(%u)\t%s", i, sc->sc_lnau1_r[i], - sc->sc_lnau1_r[i], (i%4)==3 ? "\n" : ""); - printf ("%s", (i%4) ? "\n" : ""); - break; - case 5: - /* Crypto. */ - - /* Load BCHU session data */ - bzero(&ses, sizeof ses); - ses.kr[0] = 0xD0; - ses.kr[1] = 0xD1; - ses.kr[2] = 0xD2; - ses.kr[3] = 0xD3; - ses.kr[4] = 0xD4; - ses.kr[5] = 0xD5; - - /* cipher data out is hash in, SHA1, 3DES, encrypt, ECB */ - ses.omr = ISES_SELR_BCHU_HISOF | ISES_HOMR_HFR_SHA1 | - ISES_SOMR_BOMR_3DES | ISES_SOMR_EDR | ISES_SOMR_FMR_ECB; - -#if 1 - printf ("Queueing home-cooked session switch\n"); - ises_bchu_switch_session(sc, &ses, 0); -#else /* switch session does not appear to work - it never returns */ - printf ("Queueing BCHU session switch\n"); - cmd = ISES_MKCMD(ISES_CMD_BSWITCH, sizeof ses / 4); - printf ("session is %d 32bit words (== 18 ?), cmd = [%08x]\n", - sizeof ses / 4, cmd); - ises_queue_cmd(sc, cmd, (u_int32_t *)&ses, NULL); -#endif - - break; - case 96: - printf ("Stopping HRNG data collection\n"); - timeout_del(&sc->sc_timeout); - break; - case 97: - printf ("Restarting HRNG data collection\n"); - if (!timeout_pending(&sc->sc_timeout)) - timeout_add(&sc->sc_timeout, hz); - break; - case 98: - printf ("Resetting (wait >1s before cont.)\n"); - stat = ISES_BO_STAT_HWRESET; - WRITE_REG(sc, ISES_BO_STAT, stat); - stat &= ~ISES_BO_STAT_HWRESET; - WRITE_REG(sc, ISES_BO_STAT, stat); - break; - case 99: - printf ("Resetting everything!\n"); - if (timeout_pending(&sc->sc_timeout)) - timeout_del(&sc->sc_timeout); - timeout_set(&sc->sc_timeout, ises_initstate, sc); - sc->sc_initstate = 0; - ises_initstate(sc); - break; - } - - ises_db = 0; -} - -void -ises_showreg (void) -{ - struct ises_softc *sc = ises_sc; - u_int32_t stat, cmd; - - /* Board register */ - - printf ("Board register: "); - stat = READ_REG(sc, ISES_BO_STAT); - - if (stat & ISES_BO_STAT_LOOP) - printf ("LoopMode "); - if (stat & ISES_BO_STAT_TAMPER) - printf ("Tamper "); - if (stat & ISES_BO_STAT_POWERDOWN) - printf ("PowerDown "); - if (stat & ISES_BO_STAT_ACONF) - printf ("16bitA-IF "); - if (stat & ISES_BO_STAT_HWRESET) - printf ("HWReset"); - if (stat & ISES_BO_STAT_AIRQ) - printf ("A-IFintr"); - printf("\n"); - - /* A interface */ - - printf ("A Interface STAT register: \n\tLNAU-["); - stat = READ_REG(sc, ISES_A_STAT); - if (stat & ISES_STAT_LNAU_MASKED) - printf ("masked"); - else { - if (stat & ISES_STAT_LNAU_BUSY_1) - printf ("busy1 "); - if (stat & ISES_STAT_LNAU_ERR_1) - printf ("err1 "); - if (stat & ISES_STAT_LNAU_BUSY_2) - printf ("busy2 "); - if (stat & ISES_STAT_LNAU_ERR_2) - printf ("err2 "); - } - printf ("]\n\tBCHU-["); - - if (stat & ISES_STAT_BCHU_MASKED) - printf ("masked"); - else { - if (stat & ISES_STAT_BCHU_BUSY) - printf ("busy "); - if (stat & ISES_STAT_BCHU_ERR) - printf ("err "); - if (stat & ISES_STAT_BCHU_SCIF) - printf ("cr-inop "); - if (stat & ISES_STAT_BCHU_HIF) - printf ("ha-inop "); - if (stat & ISES_STAT_BCHU_DDB) - printf ("dscd-data "); - if (stat & ISES_STAT_BCHU_IRF) - printf ("inp-req "); - if (stat & ISES_STAT_BCHU_OAF) - printf ("out-avail "); - if (stat & ISES_STAT_BCHU_DIE) - printf ("inp-enabled "); - if (stat & ISES_STAT_BCHU_UE) - printf ("ififo-empty "); - if (stat & ISES_STAT_BCHU_IFE) - printf ("ififo-half "); - if (stat & ISES_STAT_BCHU_IFHE) - printf ("ififo-full "); - if (stat & ISES_STAT_BCHU_OFE) - printf ("ofifo-empty "); - if (stat & ISES_STAT_BCHU_OFHF) - printf ("ofifo-half "); - if (stat & ISES_STAT_BCHU_OFF) - printf ("ofifo-full "); - } - printf ("] \n\tmisc-["); - - if (stat & ISES_STAT_HW_DA) - printf ("downloaded-appl "); - if (stat & ISES_STAT_HW_ACONF) - printf ("A-IF-conf "); - if (stat & ISES_STAT_SW_WFOQ) - printf ("OQ-wait "); - if (stat & ISES_STAT_SW_OQSINC) - printf ("OQS-increased "); - printf ("]\n\t"); - - if (stat & ISES_STAT_HW_DA) - printf ("SW-mode is \"%s\"", - ises_sw_mode[ISES_STAT_SW_MODE(stat)]); - else - printf ("IDP-state is \"%s\"", - ises_idp_state[ISES_STAT_IDP_STATE(stat)]); - printf ("\n"); - - printf ("\tOQS = %d IQS = %d OQF = %d IQF = %d\n", - READ_REG(sc, ISES_A_OQS), READ_REG(sc, ISES_A_IQS), - READ_REG(sc, ISES_A_OQF), READ_REG(sc, ISES_A_IQF)); - - /* B interface */ - - printf ("B-interface status register contains [%08x]\n", - READ_REG(sc, ISES_B_STAT)); - - /* DMA */ - - printf ("DMA read starts at 0x%x, length %d bytes\n", - READ_REG(sc, ISES_DMA_READ_START), - READ_REG(sc, ISES_DMA_READ_COUNT) >> 16); - - printf ("DMA write starts at 0x%x, length %d bytes\n", - READ_REG(sc, ISES_DMA_WRITE_START), - READ_REG(sc, ISES_DMA_WRITE_COUNT) & 0x00ff); - - stat = READ_REG(sc, ISES_DMA_STATUS); - printf ("DMA status register contains [%08x]\n", stat); - - if (stat & ISES_DMA_CTRL_ILT) - printf (" -- Ignore latency timer\n"); - if (stat & 0x0C000000) - printf (" -- PCI Read - multiple\n"); - else if (stat & 0x08000000) - printf (" -- PCI Read - line\n"); - - if (stat & ISES_DMA_STATUS_R_RUN) - printf (" -- PCI Read running/incomplete\n"); - else - printf (" -- PCI Read complete\n"); - if (stat & ISES_DMA_STATUS_R_ERR) - printf (" -- PCI Read DMA Error\n"); - - if (stat & ISES_DMA_STATUS_W_RUN) - printf (" -- PCI Write running/incomplete\n"); - else - printf (" -- PCI Write complete\n"); - if (stat & ISES_DMA_STATUS_W_ERR) - printf (" -- PCI Write DMA Error\n"); - - /* OMR / HOMR / SOMR */ - - /* - * All these means throwing a cmd on to the A-interface, and then - * reading the result. - * - * Currently, put debug output in process_oqueue... - */ - - printf ("Queueing Operation Method Register (OMR) READ cmd...\n"); - cmd = ISES_MKCMD(ISES_CMD_BR_OMR, 0); - ises_queue_cmd(sc, cmd, NULL, NULL); -} - -void -ises_debug_parse_omr (struct ises_softc *sc) -{ - u_int32_t omr = sc->sc_sessions[sc->sc_cursession].omr; - - printf ("SELR : "); - if (omr & ISES_SELR_BCHU_EH) - printf ("cont-on-error "); - else - printf ("stop-on-error "); - - if (omr & ISES_SELR_BCHU_HISOF) - printf ("HU-input-is-SCU-output "); - - if (omr & ISES_SELR_BCHU_DIS) - printf ("data-interface-select=B "); - else - printf ("data-interface-select=DataIn/DataOut "); - - printf ("\n"); - - printf ("HOMR : "); - if (omr & ISES_HOMR_HMTR) - printf ("expect-padded-hash-msg "); - else - printf ("expect-plaintext-hash-msg "); - - printf ("ER=%d ", (omr & ISES_HOMR_ER) >> 20); /* ick */ - - printf ("HFR="); - switch (omr & ISES_HOMR_HFR) { - case ISES_HOMR_HFR_NOP: - printf ("inactive "); - break; - case ISES_HOMR_HFR_MD5: - printf ("MD5 "); - break; - case ISES_HOMR_HFR_RMD160: - printf ("RMD160 "); - break; - case ISES_HOMR_HFR_RMD128: - printf ("RMD128 "); - break; - case ISES_HOMR_HFR_SHA1: - printf ("SHA-1 "); - break; - default: - printf ("reserved! "); - break; - } - printf ("\nSOMR : "); - - switch (omr & ISES_SOMR_BOMR) { - case ISES_SOMR_BOMR_NOP: - printf ("NOP "); - break; - case ISES_SOMR_BOMR_TRANSPARENT: - printf ("transparent "); - break; - case ISES_SOMR_BOMR_DES: - printf ("DES "); - break; - case ISES_SOMR_BOMR_3DES2: - printf ("3DES-2 "); - break; - case ISES_SOMR_BOMR_3DES: - printf ("3DES-3 "); - break; - default: - if (omr & ISES_SOMR_BOMR_SAFER) - printf ("SAFER "); - else - printf ("reserved! "); - break; - } - - if (omr & ISES_SOMR_EDR) - printf ("mode=encrypt "); - else - printf ("mode=decrypt "); - - switch (omr & ISES_SOMR_FMR) { - case ISES_SOMR_FMR_ECB: - printf ("ECB"); - break; - case ISES_SOMR_FMR_CBC: - printf ("CBC"); - break; - case ISES_SOMR_FMR_CFB64: - printf ("CFB64"); - break; - case ISES_SOMR_FMR_OFB64: - printf ("OFB64"); - break; - default: - /* Nada */ - } - printf ("\n"); -} - -#endif /* ISESDEBUG */ diff --git a/sys/dev/pci/isesreg.h b/sys/dev/pci/isesreg.h deleted file mode 100644 index 0d8dd550025..00000000000 --- a/sys/dev/pci/isesreg.h +++ /dev/null @@ -1,363 +0,0 @@ -/* $OpenBSD: isesreg.h,v 1.10 2007/05/25 21:27:16 krw Exp $ $ */ - -/* - * Copyright (c) 2000 Håkan Olsson (ho@crt.se) - * Copyright (c) 2000 Theo de Raadt - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Register definitions for Pijnenburg PCC-ISES crypto chip. - * Definitions from revision 1.6 of the product datasheet. - */ - -/* - * PCC-ISES Evaluation board DMA offsets - */ -#define ISES_DMA_READ_COUNT 0x0100 /* bit 31-16 */ -#define ISES_DMA_RCOUNT(x) ((x) << 16) -#define ISES_DMA_WRITE_COUNT 0x0100 /* bit 15-0 */ -#define ISES_DMA_WCOUNT(x) ((x) & 0x00FF) - -#define ISES_DMA_WRITE_START 0x0104 -#define ISES_DMA_READ_START 0x0108 -#define ISES_DMA_CTRL 0x010C -#define ISES_DMA_STATUS ISES_DMA_CTRL -#define ISES_DMA_RESET 0x0110 - -#define ISES_DMA_CTRL_ILT 0x40000000 /* Ignore Latency Timer */ -#define ISES_DMA_CTRL_RMULT 0x0D000000 /* Enable PCI Read Multiple */ -#define ISES_DMA_CTRL_RLINE 0x09000000 /* Enable PCI Read Line */ -#define ISES_DMA_CTRL_READ 0x01000000 /* Enable PCI Read */ -#define ISES_DMA_CTRL_WRITE 0x00000100 /* Enable PCI Write */ - -#define ISES_DMA_STATUS_R_RUN 0x01000000 /* PCI Read running */ -#define ISES_DMA_STATUS_R_ERR 0x02000000 /* PCI Read error */ -#define ISES_DMA_STATUS_W_RUN 0x00000100 /* PCI Write running */ -#define ISES_DMA_STATUS_W_ERR 0x00000200 /* PCI Write error */ - -/* - * PCC-ISES A-interface - */ - -#define ISES_A_OFFSET 0x0200 -#define ISES_A(x) (ISES_A_OFFSET + (x)) - -#define ISES_A_STAT ISES_A(0x00) /* status register */ -#define ISES_A_INTS ISES_A(0x04) /* interrupt status register */ -#define ISES_A_INTE ISES_A(0x08) /* interrupt enable register */ -#define ISES_A_SREQ ISES_A(0x0C) /* service request (read) */ -#define ISES_A_CTRL ISES_A_SREQ /* control register (write) */ -#define ISES_A_OQD ISES_A(0x10) /* Output Queue Data (read) */ -#define ISES_A_IQD ISES_A_OQD /* Input Queue Data (write) */ -#define ISES_A_OQS ISES_A(0x14) /* Output Queue Semaphore */ -#define ISES_A_IQS ISES_A(0x18) /* Input Queue Semaphore */ -#define ISES_A_OQF ISES_A(0x1C) /* Output Queue Filled (ro) */ -#define ISES_A_IQF ISES_A(0x20) /* Input Queue Free (ro) */ - -/* - * PCC-ISES B-interface - */ - -#define ISES_B_OFFSET 0x0300 -#define ISES_B(x) (ISES_B_OFFSET + (x)) - -#define ISES_B_BDATAIN ISES_B(0x0) -#define ISES_B_BDATAOUT ISES_B(0x4) -#define ISES_B_STAT ISES_B(0x8) - -/* - * PCC-ISES I-interface (not used) - */ - -#define ISES_I_OFFSET 0x0400 - -/* - * PCC-ISES board registers - */ - -#define ISES_BO_OFFSET 0x0500 -#define ISES_BO(x) (ISES_BO_OFFSET + (x)) - -#define ISES_BO_STAT ISES_BO(0x0) -#define ISES_BO_LOOPCOUNTER ISES_BO(0x4) -#define ISES_BO_TESTREG ISES_BO(0x8) - -#define ISES_BO_STAT_LOOP 0x00000001 /* B-interface LoopMode */ -#define ISES_BO_STAT_TAMPER 0x00000002 /* Set tamper */ -#define ISES_BO_STAT_POWERDOWN 0x00000004 /* Set power down */ -#define ISES_BO_STAT_ACONF 0x00000008 /* Set A-intf access to 16b */ -#define ISES_BO_STAT_HWRESET 0x00000010 /* Reset PCC-ISES (hw) */ -#define ISES_BO_STAT_AIRQ 0x00000020 /* A-interface interrupt (ro)*/ - -/* - * PCC-ISES A-interface STAT register bits - */ - -#define ISES_STAT_LNAU_MASKED 0x00000001 /* LNAU flags masked, this bit - must be zero for the other - LNAU flags to be read - correctly. */ -#define ISES_STAT_LNAU_BUSY_1 0x00000002 /* LNAU unit 1 is busy */ -#define ISES_STAT_LNAU_ERR_1 0x00000004 /* LNAU unit 1 error */ -#define ISES_STAT_LNAU_BUSY_2 0x00000008 /* LNAU unit 2 is busy */ -#define ISES_STAT_LNAU_ERR_2 0x00000010 /* LNAU unit 2 error */ -#define ISES_STAT_BCHU_MASKED 0x00000020 /* BCHU flags masked */ -#define ISES_STAT_BCHU_BUSY 0x00000040 /* BCHU is busy */ -#define ISES_STAT_BCHU_ERR 0x00000080 /* BCHU error flag */ -#define ISES_STAT_BCHU_SCIF 0x00000100 /* symm. crypto inoperative */ -#define ISES_STAT_BCHU_HIF 0x00000200 /* hash unit inoperative */ -#define ISES_STAT_BCHU_DDB 0x00000400 /* discard data blocks */ -#define ISES_STAT_BCHU_IRF 0x00000800 /* input request flag */ -#define ISES_STAT_BCHU_OAF 0x00001000 /* output available flag */ -#define ISES_STAT_BCHU_DIE 0x00002000 /* data input enabled */ -#define ISES_STAT_BCHU_UE 0x00004000 /* unit enable bit */ -#define ISES_STAT_BCHU_IFE 0x00008000 /* input FIFO empty */ -#define ISES_STAT_BCHU_IFHE 0x00010000 /* input FIFO half emtpy */ -#define ISES_STAT_BCHU_IFF 0x00020000 /* input FIFO full */ -#define ISES_STAT_BCHU_OFE 0x00040000 /* output FIFO emtpy */ -#define ISES_STAT_BCHU_OFHF 0x00080000 /* output FIFO half full */ -#define ISES_STAT_BCHU_OFF 0x00100000 /* output FIFO full */ -#define ISES_STAT_HW_DA 0x00200000 /* downloaded appl flag */ -#define ISES_STAT_HW_ACONF 0x00400000 /* A-intf configuration flag */ -#define ISES_STAT_SW_WFOQ 0x00800000 /* SW: Waiting for out queue */ -#define ISES_STAT_SW_OQSINC 0x08000000 /* SW 2.x: OQS increased */ - -#define ISES_STAT_IDP_MASK 0x0f000000 /* IDP state mask (HW_DA=0) */ -#define ISES_STAT_IDP_STATE(x) (((x) & ISES_STAT_IDP_MASK) >> 24) -#define ISES_IDP_WFPL 0x4 /* Waiting for pgm len state */ - -static const char *ises_idp_state[] = -{ - "reset state", /* 0x0 */ - "testing NSRAM", /* 0x1 */ - "checking for firmware", /* 0x2 */ - "clearing NSRAM", /* 0x3 */ - "waiting for program length", /* 0x4 */ - "waiting for program data", /* 0x5 */ - "waiting for program CRC", /* 0x6 */ - "functional test program", /* 0x7 */ - 0, 0, 0, 0, 0, 0, 0, /* 0x8-0xe */ - "Error: NSRAM or firmware failed" /* 0xf */ -}; - -#define ISES_STAT_SW_MASK 0x03000000 /* SW mode (HW_DA=1) */ -#define ISES_STAT_SW_MODE(x) (((x) & ISES_STAT_SW_MASK) >> 24) - -#define ISES_A_CTRL_RESET 0x0000 /* SW reset (go to ST mode) */ -#define ISES_A_CTRL_CONTINUE 0x0001 /* Return to CMD from WFC */ - -#ifdef ISESDEBUG -static const char *ises_sw_mode[] = -{ - "ST (SelfTest)", /* 0x0 */ - "CMD", /* 0x1 (normal) */ - "WFC (Wait for continue)", /* 0x2 */ - "CMD (Wait for reset)" /* 0x3 */ -}; -#endif - -/* BERR (BCHU Error Register) */ -#define ISES_BERR_DPAR 0x00000001 /* DES parity error */ -#define ISES_BERR_IDESBCP 0x00000002 /* illegal DES mode value */ -#define ISES_BERR_ISFRBCP 0x00000004 /* illegal SAFER rounds spec */ -#define ISES_BERR_INCMBCP 0x00000008 /* illegal non-crypto mode */ -#define ISES_BERR_IBCF 0x00000010 /* illegal value in BCFR */ -#define ISES_BERR_reserved 0x00000020 /* reserved */ -#define ISES_BERR_SRB 0x00000040 /* write SCU while busy */ -#define ISES_BERR_HRB 0x00000080 /* write HU while busy */ -#define ISES_BERR_IHFR 0x00000100 /* illegal value in HFR */ -#define ISES_BERR_PADERR 0x00000200 /* padding error */ -#define ISES_BERR_BIDM 0x00000400 /* B-interface input data - misalignment */ -/* BCHCR (BCHU Control Register) */ -#define ISES_BCHCR_BCHU_DIE 0x00000001 /* data input enabled */ -#define ISES_BCHCR_BCHU_UE 0x00000002 /* unit enable */ -#define ISES_BCHCR_BCHU_RST 0x00000004 /* BCHU reset */ - -/* - * OMR (Operation Method Register) - */ -/* -- SELR (Selector Register) */ -#define ISES_SELR_BCHU_EH 0x80000000 /* stop/continue on error */ -#define ISES_SELR_BCHU_HISOF 0x01000000 /* HU input is SCU output */ -#define ISES_SELR_BCHU_DIS 0x02000000 /* data interface select */ - -/* -- HOMR (HU Operation Mode Register) */ -#define ISES_HOMR_HMTR 0x00800000 /* hash message type reg bit */ -#define ISES_HOMR_ER 0x00300000 /* BE/LE, 2bit mask */ - -#define ISES_HOMR_HFR 0x00070000 /* Hash function mask, 3bits */ -#define ISES_HOMR_HFR_NOP 0x00000000 /* NOP */ -#define ISES_HOMR_HFR_MD5 0x00010000 /* MD5 */ -#define ISES_HOMR_HFR_RMD160 0x00020000 /* RIPEMD-160 */ -#define ISES_HOMR_HFR_RMD128 0x00030000 /* RIPEMD-128 */ -#define ISES_HOMR_HFR_SHA1 0x00040000 /* SHA-1 */ - -/* -- SOMR (Symmetric crypto Operation Method Register) */ -#define ISES_SOMR_BCFR 0x0000f000 /* block cipher function reg */ -#define ISES_SOMR_BCPR 0x00000ff0 /* block cipher parameters */ -#define ISES_SOMR_BOMR (ISES_SOMR_BCFR | ISES_SOMR_BCPR) -#define ISES_SOMR_BOMR_NOP 0x00000000 /* NOP */ -#define ISES_SOMR_BOMR_TRANSPARENT 0x00000010 /* Transparent */ -#define ISES_SOMR_BOMR_DES 0x00001000 /* DES */ -#define ISES_SOMR_BOMR_3DES2 0x00001010 /* 3DES-2 */ -#define ISES_SOMR_BOMR_3DES 0x00001020 /* 3DES-3 */ -#define ISES_SOMR_BOMR_SAFER 0x00002000 /* SAFER (actually more) */ -#define ISES_SOMR_EDR 0x00000008 /* Encrypt/Decrypt register */ -#define ISES_SOMR_FMR 0x00000003 /* feedback mode mask */ -#define ISES_SOMR_FMR_ECB 0x00000000 /* EBC */ -#define ISES_SOMR_FMR_CBC 0x00000001 /* CBC */ -#define ISES_SOMR_FMR_CFB64 0x00000002 /* CFB64 */ -#define ISES_SOMR_FMR_OFB64 0x00000003 /* OFB64 */ - -/* - * HRNG (Hardware Random Number Generator) - */ -#define ISES_OFFSET_HRNG_CTRL 0x00 /* Control register */ -#define ISES_OFFSET_HRNG_LFSR 0x04 /* Linear feedback shift reg */ -#define ISES_HRNG_CTRL_HE 0x00000001 /* HRNG enable */ - -/* - * A-interface commands - */ -#define ISES_MKCMD(cmd,len) (cmd | cmd << 16 | len << 8 | len << 24) -#define ISES_CMD_NONE -1 - -/* Command name Code Len RLen Desc */ -#define ISES_CMD_CHIP_ID 0x00 /* 0 3 Read chipID */ -/* LNAU commands - LNAU 1 */ -#define ISES_CMD_LRESET_1 0x01 /* 0 0 LNAU reset */ -#define ISES_CMD_LRSFLG_1 0x02 /* 0 0 LNAU flags reset */ -#define ISES_CMD_LUPLOAD_1 0x03 /* 0 64 Upload result */ -#define ISES_CMD_LW_A_1 0x04 /* ?64 0 Load A register */ -#define ISES_CMD_LW_B_1 0x05 /* ?64 0 Load B register */ -#define ISES_CMD_LW_N_1 0x06 /* ?64 0 Load N register */ -#define ISES_CMD_LW_Bq_1 0x07 /* ?32 0 Load Bq register */ -#define ISES_CMD_LW_Nq_1 0x08 /* ?32 0 Load Nq register */ -#define ISES_CMD_LW_Bp_1 0x09 /* ?34 0 Load Bp register */ -#define ISES_CMD_LW_Np_1 0x0a /* ?34 0 Load Np register */ -#define ISES_CMD_LW_U_1 0x0b /* ?34 0 Load U register */ -#define ISES_CMD_LMOD_1 0x0c /* 0 0 Start A % N */ -#define ISES_CMD_LMULMOD_1 0x0d /* 0 0 Start (A*B) % N */ -#define ISES_CMD_LEXPMOD_1 0x0e /* 0 0 Start (A^B) % N */ -#define ISES_CMD_LEXPCRTMOD_1 0x0f /* 0 0 Start (A^B)%N w/ CRT */ -/* LNAU commands - LNAU 2 */ -#define ISES_CMD_LRESET_2 0x10 /* 0 0 Reset */ -#define ISES_CMD_LRSFLG_2 0x11 /* 0 0 Flags reset */ -#define ISES_CMD_LUPLOAD_2 0x12 /* 0 64 Upload result */ -#define ISES_CMD_LW_A_2 0x13 /* ?64 0 Load A register */ -#define ISES_CMD_LW_B_2 0x14 /* ?64 0 Load B register */ -#define ISES_CMD_LW_N_2 0x15 /* ?64 0 Load N register */ -#define ISES_CMD_LW_Bq_2 0x16 /* ?32 0 Load Bq register */ -#define ISES_CMD_LW_Nq_2 0x17 /* ?32 0 Load Nq register */ -#define ISES_CMD_LW_Bp_2 0x18 /* ?34 0 Load Bp register */ -#define ISES_CMD_LW_Np_2 0x19 /* ?34 0 Load Np register */ -#define ISES_CMD_LW_U_2 0x1a /* ?34 0 Load U register */ -#define ISES_CMD_LMOD_2 0x1b /* 0 0 Start A % N */ -#define ISES_CMD_LMULMOD_2 0x1c /* 0 0 Start (A*B) % N */ -#define ISES_CMD_LEXPMOD_2 0x1d /* 0 0 Start (A^B) % N */ -#define ISES_CMD_LEXPCRTMOD_2 0x1e /* 0 0 Start (A^B)%N w/ CRT */ -/* BCHU commands */ -#define ISES_CMD_RST_BERR 0x1f /* 0 0 Reset BERR */ -#define ISES_CMD_BR_BERR 0x20 /* 0 0 Read BERR */ -#define ISES_CMD_BW_DATA 0x21 /* 2 0 Write DATA */ -#define ISES_CMD_BR_DATA 0x22 /* 0 2 Read DATA */ -#define ISES_CMD_BW_BCHCR 0x23 /* 1 0 Write BCHCR */ -#define ISES_CMD_BR_BCHCR 0x24 /* 0 0 Read BCHCR */ -#define ISES_CMD_BW_OMR 0x25 /* 1 0 Write OMR */ -#define ISES_CMD_BR_OMR 0x26 /* 0 1 Read OMR */ -#define ISES_CMD_BW_KR0 0x27 /* 2 0 Write key 0 */ -#define ISES_CMD_BR_KR0 0x28 /* 0 2 Read key 0 */ -#define ISES_CMD_BW_KR1 0x29 /* 2 0 Write key 1 */ -#define ISES_CMD_BR_KR1 0x2a /* 0 2 Read key 1 */ -#define ISES_CMD_BW_KR2 0x2b /* 2 0 Write key 2 */ -#define ISES_CMD_BR_KR2 0x2c /* 0 2 Read key 2 */ -#define ISES_CMD_BW_SCCR 0x2d /* 2 0 Write SCCR */ -#define ISES_CMD_BR_SCCR 0x2e /* 0 2 Read SCCR */ -#define ISES_CMD_BW_DBCR 0x2f /* 2 0 Write DBCR */ -#define ISES_CMD_BR_DBCR 0x30 /* 0 2 Read DBCR */ -#define ISES_CMD_BW_HMLR 0x31 /* 2 0 Write HMLR */ -#define ISES_CMD_BR_HMLR 0x32 /* 0 2 Read HMLR */ -#define ISES_CMD_BW_CVR 0x33 /* 5 0 Write CVR */ -#define ISES_CMD_BR_CVR 0x34 /* 0 5 Read CVR */ -#define ISES_CMD_BPROC 0x35 /* ?255 ?255 Process data blocks */ -#define ISES_CMD_BTERM 0x36 /* 0 0 Terminate session */ -#define ISES_CMD_BSWITCH 0x37 /* 18 18 Switch BCHU session */ -/* HRNG commands */ -#define ISES_CMD_HSTART 0x38 /* 0 0 Start RBG unit */ -#define ISES_CMD_HSTOP 0x39 /* 0 0 Stop RGB unit */ -#define ISES_CMD_HSEED 0x3a /* 1 0 Seed LFSR */ -#define ISES_CMD_HBITS 0x3b /* 1 ?255 Return n*32 rnd bits */ - -/* Command return codes (RC) */ -#define ISES_RC_MASK 0x0000ffff -#define ISES_RC_SUCCESS 0x0000 /* success */ -#define ISES_RC_CMDERR 0x0001 /* cmd interpretation error */ -#define ISES_RC_QERR 0x0002 /* queue handling error */ -#define ISES_RC_LNAU_ERR 0x0003 /* LNAU cmd proc error */ -#define ISES_RC_BCHU_ERR 0x0004 /* BCHU cmd proc error */ -#define ISES_RC_BCHU_BIFCSEL 0x0005 /* OMR says B-if, must be A */ -#define ISES_RC_BCHU_ODD 0x0006 /* odd #words in param list */ -#define ISES_RC_HRNG_ILLEN 0x0007 /* too large bitstream */ - -/* Interrupt bits, IRQE, IRQES, IRQEC, IRQSS, IRQ registers */ -#define ISES_IRQ_TIMER_1 0x00000001 /* Timer 1 reached zero */ -#define ISES_IRQ_TIMER_2 0x00000002 /* Timer 2 reached zero */ -#define ISES_IRQ_I_IIN0 0x00000004 /* I-int 'Iin0' */ -#define ISES_IRQ_I_IIN1 0x00000008 /* I-int 'Iin1' */ -#define ISES_IRQ_I_IIN2 0x00000010 /* I-int 'Iin2' */ -#define ISES_IRQ_I_IIN3 0x00000020 /* I-int 'Iin3' */ -#define ISES_IRQ_LNAU_1_ERROR 0x00000040 /* LNAU 1 op error/abort */ -#define ISES_IRQ_LNAU_1_DONE 0x00000080 /* LNAU 1 op done */ -#define ISES_IRQ_LNAU_2_ERROR 0x00000100 /* LNAU 2 op error/abort */ -#define ISES_IRQ_LNAU_2_DONE 0x00000200 /* LNAU 1 op done */ -#define ISES_IRQ_BCHU_DONE 0x00000400 /* BCHU operation done */ -#define ISES_IRQ_BCHU_ERROR 0x00000800 /* BCHU operation error/abrt */ -#define ISES_IRQ_BCHU_IRF 0x00001000 /* BCHU input request flag >1*/ -#define ISES_IRQ_BCHU_OAF 0x00002000 /* BCHU output avail flag >1 */ -#define ISES_IRQ_BCHU_IEF 0x00004000 /* BCHU input empty flag >1 */ -#define ISES_IRQ_A_WCTRL 0x00008000 /* A-int CTRL reg was written*/ -#define ISES_IRQ_A_RSREQ 0x00010000 /* A-int SREQ reg was read */ -#define ISES_IRQ_A_DIQ 0x00020000 /* in queue emtpy, IQD write */ -#define ISES_IRQ_A_CIQ 0x00040000 /* in queue has complete cmd */ -#define ISES_IRQ_A_OQF 0x00080000 /* output queue full */ - -#define ISES_SESSION(sid) ( (sid) & 0x0fffffff) -#define ISES_CARD(sid) (((sid) & 0xf0000000) >> 28) -#define ISES_SID(crd,ses) (((crd) << 28) | ((ses) & 0x0fffffff)) - -/* Size and layout of ises_session is firmware dependent. */ -/* This structure should be usable for the SWITCH_SESSION command. */ -struct ises_session { - u_int32_t kr[6]; /* Key register KR2,KR1,KR0 */ - u_int32_t omr; /* Operation method register */ - - /* The following values (on-chip) are cleared after an OMR write */ - u_int32_t sccr[2]; /* Symm. crypto chaining reg. (IV) */ - u_int32_t cvr[5]; /* Chaining variables reg. */ - u_int32_t dbcr[2]; /* Data block count register */ - u_int32_t hmlr[2]; /* Hash message length reg. */ -} __attribute__((packed)); - -#define ISES_B_DATASIZE 4096 |