88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * CDDL HEADER START
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm *
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * The contents of this file are subject to the terms of the
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Common Development and Distribution License (the "License").
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * You may not use this file except in compliance with the License.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm *
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * or http://www.opensolaris.org/os/licensing.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * See the License for the specific language governing permissions
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * and limitations under the License.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm *
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * When distributing Covered Code, include this CDDL HEADER in each
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * If applicable, add the following below this CDDL HEADER, with the
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * fields enclosed by brackets "[]" replaced with your own identifying
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * information: Portions Copyright [yyyy] [name of copyright owner]
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm *
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * CDDL HEADER END
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
436935a13231964207120b7e50a063b53b8e579cVladimir Kotal * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Use is subject to license terms.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#ifndef _SYS_CRYPTO_DCA_H
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define _SYS_CRYPTO_DCA_H
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#ifdef __cplusplus
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmextern "C" {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#endif
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#include <sys/types.h>
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#include <sys/varargs.h>
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#include <sys/crypto/spi.h>
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Deimos - cryptographic acceleration based upon Broadcom 582x.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm *
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Note: Everything in this file is private to the Deimos device
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * driver! Do not include this in any other file.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DRIVER "dca"
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DCA_MANUFACTURER_ID "SUNWdca"
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#ifdef _KERNEL
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Tunables.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCR1LOWATER 16 /* these numbers favor overall throughput */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCR1HIWATER 24
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCR1MAXREQS 8
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCR2LOWATER 16
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCR2HIWATER 24
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCR2MAXREQS 4
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MAXMCR 2 /* there are 2 mcrs */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MAXREQSPERMCR 16 /* there are 4 subunits serviced by MCR2 */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MAXFRAGS 6 /* Limit on the number of fragments */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MAXWORK 6 /* How many work structures to preallocate */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * These are constants. Do not change them.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#if defined(i386) || defined(__i386) || defined(__amd64)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MAXPACKET 0xefff /* rootnex INT_MAX_BUF hack. */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#else
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MAXPACKET 0xffff /* Max size of a packet or fragment */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#endif
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DESBLOCK 8 /* Size of a DES or 3DES block */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DSAPARTLEN 20 /* Size of fixed DSA parts (r, s, q, x, v) */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DSASIGLEN 40 /* Size of a DSA signature */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define SHA1LEN 20 /* Size of a SHA1 hash */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define SECOND 1000000 /* One second in usec */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MSEC 1000 /* One millisecond in usec */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DES_KEYSIZE 8
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DES_IV_LEN 8
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DES3_KEYSIZE (3 * DES_KEYSIZE)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Mechanism info structure passed to KCF during registration.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MD5_HMAC_BLOCK_SIZE 64 /* MD5-HMAC block size */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MD5_HMAC_MIN_KEY_LEN 1 /* MD5-HMAC min key length in bytes */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MD5_HMAC_MAX_KEY_LEN 64 /* MD5-HMAC max key length in bytes */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define SHA1_HMAC_BLOCK_SIZE 64 /* SHA1-HMAC block size */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define SHA1_HMAC_MIN_KEY_LEN 1 /* SHA1-HMAC min key length in bytes */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define SHA1_HMAC_MAX_KEY_LEN 64 /* SHA1-HMAC max key length in bytes */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DES_KEY_LEN 8 /* DES key length in bytes */
436935a13231964207120b7e50a063b53b8e579cVladimir Kotal#define DES3_MIN_KEY_LEN 16 /* 3DES min key length in bytes */
436935a13231964207120b7e50a063b53b8e579cVladimir Kotal#define DES3_MAX_KEY_LEN 24 /* 3DES max key length in bytes */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DSA_MIN_KEY_LEN 64 /* DSA min key length in bytes */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DSA_MAX_KEY_LEN 128 /* DSA max key length in bytes */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define RSA_MIN_KEY_LEN 32 /* RSA min key length in bytes */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define RSA_MAX_KEY_LEN 256 /* RSA max key length in bytes */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * RSA implementation.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DCA_RSA_ENC 0
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DCA_RSA_DEC 1
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DCA_RSA_SIGN 2
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DCA_RSA_VRFY 3
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DCA_RSA_SIGNR 4
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DCA_RSA_VRFYR 5
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * DSA implementation.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DCA_DSA_SIGN 0
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DCA_DSA_VRFY 1
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * FMA eclass index definitions. Note that this enum must be consistent
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * with the dca_fma_eclass_sca1000 and dca_fma_eclass_sca500 string arrays.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmtypedef enum dca_fma_eclass {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm DCA_FM_ECLASS_HW_DEVICE = 0,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm DCA_FM_ECLASS_HW_TIMEOUT,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm DCA_FM_ECLASS_NONE
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm} dca_fma_eclass_t;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Forward typedefs.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmtypedef struct dca dca_t;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmtypedef struct dca_chain dca_chain_t;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmtypedef struct dca_listnode dca_listnode_t;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmtypedef struct dca_worklist dca_worklist_t;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmtypedef struct dca_work dca_work_t;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmtypedef struct dca_request dca_request_t;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmtypedef struct dca_stat dca_stat_t;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmtypedef struct dca_cookie dca_cookie_t;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmtypedef struct dca_device dca_device_t;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * This structure is used to identify a specific board.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmstruct dca_device {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ushort_t dd_vendor_id;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ushort_t dd_device_id;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm char *dd_model;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm};
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Structure representing a node in a DMA chain. (Broadcom calls
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * these "Data Buffer Chain Entries".)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm *
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * note, this structure must be a multiple of sizeof (intptr_t)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmstruct dca_chain {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /* the descriptor */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm caddr_t dc_desc_kaddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /* and the buffer to which it points */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm size_t dc_buffer_length;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_dma_handle_t dc_buffer_dmah;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm caddr_t dc_buffer_kaddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /* physical addresses */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dc_desc_paddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dc_buffer_paddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dc_next_paddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm};
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Linked-list linkage.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmstruct dca_listnode {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_listnode_t *dl_next;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_listnode_t *dl_prev;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_listnode_t *dl_next2;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_listnode_t *dl_prev2;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm};
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmtypedef enum dca_mech_type {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm DES_CBC_MECH_INFO_TYPE, /* SUN_CKM_DES_CBC */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm DES3_CBC_MECH_INFO_TYPE, /* SUN_CKM_DES3_CBC */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm DSA_MECH_INFO_TYPE, /* SUN_CKM_DSA */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm RSA_X_509_MECH_INFO_TYPE, /* SUN_CKM_RSA_X_509 */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm RSA_PKCS_MECH_INFO_TYPE /* SUN_CKM_RSA_PKCS */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm} dca_mech_type_t;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define SUN_CKM_DSA "CKM_DSA"
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmstruct dca_rng {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dr_chunklen;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm};
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmunion dca_parameters {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm struct dca_rng dp_rng;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm};
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmtypedef struct dca_ctx {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * The following are context fields for Deimos 2.0.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_mech_type_t ctx_cm_type; /* Mechanism type */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int mode; /* Mode of operation */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int atomic; /* Boolean */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /* Fields for RSA and DSA */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uchar_t *mod; /* RSA modulus */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm unsigned modlen; /* RSA modulus length */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm unsigned pqfix; /* RSA flag */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /* Fields for DES and 3DES */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t iv[2];
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t key[6];
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int residlen;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uchar_t resid[DESBLOCK];
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int activeresidlen;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uchar_t activeresid[DESBLOCK];
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_data_t in_dup; /* input data duplicate */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm} dca_ctx_t;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Work structure. One of these per actual job submitted to an MCR.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Contains everything we need to submit the job, and everything we
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * need to notify caller and release resources when the completion
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * interrupt comes.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmstruct dca_request {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_listnode_t dr_linkage;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint16_t dr_pkt_length;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_req_handle_t dr_kcf_req;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_t *dr_dca;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_worklist_t *dr_wlp;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Consumer's I/O buffers.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_data_t *dr_in;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_data_t *dr_out;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_ctx_t dr_ctx;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Chains and DMA structures.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm size_t dr_dma_size;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dr_ctx_paddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm caddr_t dr_ctx_kaddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_acc_handle_t dr_ctx_acch;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_dma_handle_t dr_ctx_dmah;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Scratch input buffer.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_acc_handle_t dr_ibuf_acch;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_dma_handle_t dr_ibuf_dmah;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm caddr_t dr_ibuf_kaddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dr_ibuf_paddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Scratch output buffer.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_acc_handle_t dr_obuf_acch;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_dma_handle_t dr_obuf_dmah;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm caddr_t dr_obuf_kaddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dr_obuf_paddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Values to program MCR with.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dr_in_paddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dr_out_paddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dr_in_next;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dr_out_next;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint16_t dr_in_len;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint16_t dr_out_len;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Callback.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm void (*dr_callback)(dca_request_t *, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Other stuff.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dr_flags;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Algorithm specific parameters.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm void *dr_context;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm union dca_parameters dr_param;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Statistics.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int dr_job_stat;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int dr_byte_stat;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /* Pre-mapped input and output data buffer chain support */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_chain_t dr_ibuf_head;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_chain_t dr_obuf_head;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * User buffers are mapped to DMA handles dynamically. The physically
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * contigous blocks ( >= a page) are built into a data buffer chain.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_chain_t dr_chain_in_head;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_dma_handle_t dr_chain_in_dmah;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_chain_t dr_chain_out_head;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_dma_handle_t dr_chain_out_dmah;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /* Offset in the context page for storing dynamic buffer chains */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int dr_offset;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /* Destroy this request if true */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int destroy;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm};
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Request flags (dca_request_t.dr_flags).
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DR_INPLACE 0x002
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DR_SCATTER 0x004
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DR_GATHER 0x008
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DR_NOCACHE 0x020
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DR_ENCRYPT 0x040
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DR_DECRYPT 0x080
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DR_TRIPLE 0x100 /* triple DES vs. single DES */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DR_ATOMIC 0x200 /* for atomic operation */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmstruct dca_work {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_listnode_t dw_linkage;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_worklist_t *dw_wlp;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /* DMA access to the MCR and context */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_acc_handle_t dw_mcr_acch;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_dma_handle_t dw_mcr_dmah;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm caddr_t dw_mcr_kaddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dw_mcr_paddr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_request_t *dw_reqs[MAXREQSPERMCR];
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm clock_t dw_lbolt;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm};
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * MCRs.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCR1 0x1
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCR2 0x2
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmstruct dca_worklist {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_t *dwl_dca;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_kcf_provider_handle_t dwl_prov;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm char dwl_name[16];
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int dwl_mcr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kmutex_t dwl_lock;
3383b6dda001791704e0e66f7b78dd0dfe74f547qs kmutex_t dwl_freelock;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kmutex_t dwl_freereqslock;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kcondvar_t dwl_cv;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_listnode_t dwl_freereqs; /* available requests */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_listnode_t dwl_waitq; /* requests arrive here */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_listnode_t dwl_freework; /* available work structures */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_listnode_t dwl_runq; /* work structs sent to chip */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm timeout_id_t dwl_schedtid;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm clock_t dwl_lastsubmit;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int dwl_count;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int dwl_busy;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int dwl_lowater;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int dwl_hiwater;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int dwl_reqspermcr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int dwl_drain; /* for DR (suspend) */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /* Kstats */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm u_longlong_t dwl_submit;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm u_longlong_t dwl_flowctl;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm};
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Operations for MCR1 (bulk stuff).
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_IPSEC 0x0 /* IPsec packet processing */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_SSLMAC 0x1 /* SSL HMAC processing */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_TLSMAC 0x2 /* TLS HMAC processing */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_3DES 0x3 /* SSL/TLS/raw 3DES processing */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_RC4 0x4 /* ARCFOUR procesing */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_PUREHASH 0x5 /* Pure MD5/SHA1 hash processing */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Operations for MCR2 (key stuff).
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_DHPUBLIC 0x1 /* DH public key generation */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_DHSHARED 0x2 /* DH shared secret generation */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_RSAPUBLIC 0x3 /* RSA public key operation */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_RSAPRIVATE 0x4 /* RSA private key operation (CRT) */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_DSASIGN 0x5 /* DSA signing operation */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_DSAVERIFY 0x6 /* DSA verification operation */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_RNGDIRECT 0x41 /* Direct access to the RNG */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_RNGSHA1 0x42 /* RNG output processed by SHA1 */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_MODADD 0x43 /* Modular add */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_MODSUB 0x44 /* Moduler subtract */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_MODMUL 0x45 /* Modular multiply */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_MODREM 0x46 /* Modular remainder */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_MODEXP 0x47 /* Modular exponentiation */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CMD_MODINV 0x48 /* Modular inverse */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Kstats.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_3DESJOBS 0
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_3DESBYTES 1
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_RSAPUBLIC 2
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_RSAPRIVATE 3
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_DSASIGN 4
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_DSAVERIFY 5
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_RNGJOBS 6
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_RNGBYTES 7
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_RNGSHA1JOBS 8
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_RNGSHA1BYTES 9
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_MAX 10
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#if 0
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * note that when reenabling any of these stats, DS_MAX will need to
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * be adjusted.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_RC4JOBS 11
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_RC4BYTES 12
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_DHPUBLIC 13
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DS_DHSECRET 14
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#endif
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmstruct dca_stat {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kstat_named_t ds_status;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kstat_named_t ds_algs[DS_MAX];
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm struct {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kstat_named_t ds_submit;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kstat_named_t ds_flowctl;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kstat_named_t ds_lowater;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kstat_named_t ds_hiwater;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kstat_named_t ds_maxreqs;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm } ds_mcr[MAXMCR];
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm};
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Blocking structure for ioctls.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmstruct dca_cookie {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kmutex_t dc_mx;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kcondvar_t dc_cv;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int dc_outstanding;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int dc_status;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm};
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Per instance structure.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmstruct dca {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dev_info_t *dca_dip;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kmutex_t dca_intrlock;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm caddr_t dca_regs;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_acc_handle_t dca_regs_handle;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_iblock_cookie_t dca_icookie;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm timeout_id_t dca_jobtid;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ulong_t dca_pagesize;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm unsigned dca_flags; /* dev state flags */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Work requests.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_worklist_t dca_worklist[MAXMCR];
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * hardware model
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm char *dca_model;
3383b6dda001791704e0e66f7b78dd0dfe74f547qs ushort_t dca_devid;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Kstats. There is no standard for what standards
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Cryptographic Providers should supply, so we're
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * making them up for now.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kstat_t *dca_ksp;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kstat_t *dca_intrstats;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm u_longlong_t dca_stats[DS_MAX];
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /* For the local random number pool used internally by the dca driver */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm char *dca_buf1;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm char *dca_buf2;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm char *dca_buf_ptr;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int dca_index;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t dca_random_filling;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kmutex_t dca_random_lock;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm /* FMA capabilities */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int fm_capabilities; /* FMA capabilities */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm kmutex_t dca_ctx_list_lock;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_listnode_t dca_ctx_list;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm};
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Device flags (dca_t.dca_flags)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DCA_FAILED 0x1
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DCA_POWERMGMT 0x4
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DCA_RNGSHA1 0x8
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define KIOIP(dca) KSTAT_INTR_PTR((dca)->dca_intrstats)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Scatter/gather checks.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmtypedef enum dca_sg_param {
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm DCA_SG_CONTIG = 1,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm DCA_SG_WALIGN,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm DCA_SG_PALIGN
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm} dca_sg_param_t;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define FALSE 0
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define TRUE 1
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * PCI configuration registers.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_VENID 0x00 /* vendor id, 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_DEVID 0x02 /* device id, 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_COMM 0x04 /* command, 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_STATUS 0x06 /* status, 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_REVID 0x08 /* revision id, 8 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_PROGCLASS 0x09 /* programming class, 8 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_SUBCLASS 0x0A /* subclass, 8 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_CACHELINESZ 0x0C /* cache line size, 8 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_LATTMR 0x0D /* latency timer, 8 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_BIST 0x0F /* builtin-self-test, 8 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_SUBVENID 0x2C /* subsystem vendor id, 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_SUBSYSID 0x2E /* subsystem id, 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_MINGNT 0x3E /* min grant for burst, 8 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_MAXLAT 0x3F /* maximum grant for burst, 8 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_TRDYTO 0x40 /* TRDY timeout, 8 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCI_RETRIES 0x41 /* retries bus will perform, 8 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * PCI configuration register bit values.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCICOMM_FBBE 0x0200 /* fast back-to-back enable */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCICOMM_SEE 0x0100 /* system error enable */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCICOMM_PEE 0x0040 /* parity error enable */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCICOMM_MWIE 0x0010 /* memory write & invalidate enable */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCICOMM_BME 0x0004 /* bus master enable */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCICOMM_MAE 0x0002 /* memory access enable */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCISTAT_PERR 0x8000 /* parity error detected */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCISTAT_SERR 0x4000 /* system error detected */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCISTAT_MABRT 0x2000 /* master abort detected */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCISTAT_TABRT 0x1000 /* target abort detected */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCISTAT_TABRTS 0x0800 /* target abort signaled */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCISTAT_PARITY 0x0100 /* data parity error detected */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCIREVID_DOMESTIC 0x01 /* domestic version */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCIREVID_EXPORT 0xE1 /* export version */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/* Note: 5820 errata: BIST feature does not work */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCIBIST_CAP 0x80 /* BIST capable */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCIBIST_START 0x40 /* start BIST test */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PCIBIST_ERRMASK 0x0F /* mask of BIST error codes */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Command and Status Registers.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CSR_MCR1 0x00 /* pointer to MCR1 (bulk) */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CSR_DMACTL 0x04 /* DMA control */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CSR_DMASTAT 0x08 /* DMA status */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CSR_DMAEA 0x0C /* DMA error address */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CSR_MCR2 0x10 /* pointer to MCR2 (exponentiator) */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Command and status register bits.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_RESET 0x80000000U /* reset the chip */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_MCR2IE 0x40000000U /* MCR2 interrupt enable */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_MCR1IE 0x20000000U /* MCR1 interrupt enable */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_OFM 0x10000000U /* output fragment mode */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_BE32 0x08000000U /* 32-bit big endian mode */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_BE64 0x04000000U /* 64-bit big endian mode */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_EIE 0x02000000U /* error interrupt enable */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_RNGMASK 0x01800000U /* RNG mode mask */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_RNG1 0x00000000U /* 1 RNG bit per cycle */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_RNG4 0x00800000U /* 1 RNG bit per 4 cycles */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_RNG8 0x01000000U /* 1 RNG bit per 8 cycles */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_RNG16 0x01800000U /* 1 RNG bit per 16 cycles */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_MODNORM 0x00400000U /* s/w modulus normalization */
3383b6dda001791704e0e66f7b78dd0dfe74f547qs#define DMACTL_RD256 0x00020000U /* 256 byte read DMA size */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMACTL_FRAGMASK 0x0000FFFFU /* output fragment size */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMASTAT_MAIP 0x80000000U /* master access in progress */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMASTAT_MCR1FULL 0x40000000U /* MCR1 is full */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMASTAT_MCR1INT 0x20000000U /* MCR1 interrupted */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMASTAT_ERRINT 0x10000000U /* error interrupted */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMASTAT_MCR2FULL 0x08000000U /* MCR2 is full */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMASTAT_MCR2INT 0x04000000U /* MCR2 interrupted */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMASTAT_INTERRUPTS 0x34000000U /* all interrupts */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Offsets of things relative to an MCR.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCR_COUNT 0 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCR_FLAGS 2 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCR_CTXADDR 4 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Basis for size (should be optimized by constant folding):
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * 4 bytes for flags and #packets.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * for each packet:
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * 2 descriptors (DESC_SIZE)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * 4 bytes for context address
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * 4 bytes for packet length and reserved
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCR_SIZE (4 + MAXREQSPERMCR * ((2 * DESC_SIZE) + 8))
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * MCR flags.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCRFLAG_FINISHED 0x0001 /* MCR processing complete */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCRFLAG_ERROR 0x0002 /* set if an error occured */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define MCRFLAG_ERRORMASK 0xff00 /* error code bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Fields within a descriptor (data buffer chain).
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DESC_BUFADDR 0 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DESC_NEXT 4 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DESC_LENGTH 8 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DESC_RSVD 10 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DESC_SIZE 16 /* ROUNDUP(12, 16) - descriptor size (bytes) */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Offsets of fields within context structures, see Broadcom spec.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_LENGTH 0 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_CMD 2 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_MAXLENGTH 768 /* max size of ctx, fits anything */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_3DESDIRECTION 4 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_3DESKEY1HI 8 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_3DESKEY1LO 12 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_3DESKEY2HI 16 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_3DESKEY2LO 20 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_3DESKEY3HI 24 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_3DESKEY3LO 28 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_3DESIVHI 32 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_3DESIVLO 36 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECFLAGS 4 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECOFFSET 6 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECKEY1HI 8 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECKEY1LO 12 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECKEY2HI 16 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECKEY2LO 20 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECKEY3HI 24 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECKEY3LO 28 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECIVHI 32 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECIVLO 36 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECHMACINNER1 40 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECHMACINNER2 44 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECHMACINNER3 48 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECHMACINNER4 52 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECHMACINNER5 56 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECHMACOUTER1 60 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECHMACOUTER2 64 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECHMACOUTER3 68 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECHMACOUTER4 72 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSECHMACOUTER5 76 /* 32 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_RSAEXPLEN 4 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_RSAMODLEN 6 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_RSABIGNUMS 8 /* variable length */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_RSAQLEN 4 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_RSAPLEN 6 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_DSAMSGTYPE 4 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_DSARSVD 6 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_DSARNG 8 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_DSAPLEN 10 /* 16 bits */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_DSABIGNUMS 12 /* variable length */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Values for specific operations.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_RNG_LENGTH 64 /* context length for RNG (64 min) */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_3DES_LENGTH 64 /* context length for 3DES (64 min) */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_3DES_DECRYPT 0x4000 /* perform decryption */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_3DES_ENCRYPT 0x0000 /* perform encryption */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSEC_LENGTH 80 /* context length for IPsec */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSEC_ENCRYPT 0x8000 /* perform encryption */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSEC_DECRYPT 0xc000 /* perform decryption */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSEC_HMAC_MD5 0x1000 /* HMAC-MD5 authentication */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_IPSEC_HMAC_SHA1 0x2000 /* HMAC-MD5 authentication */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_DSAMSGTYPE_SHA1 0 /* Message is SHA1 */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_DSAMSGTYPE_TEXT 1 /* Generate SHA1 hash first */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_DSARNG_GEN 1 /* Generate random k */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTX_DSARNG_SUPPLY 0 /* Random k is supplied */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Macros to access fields within the MCR. Note that this includes the
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * context fields as well, since the context is just offset from the
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * base of the MCR.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PUTMCR32(work, reg, val) \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_put32(work->dw_mcr_acch, \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm (uint32_t *)(work->dw_mcr_kaddr + reg), val)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PUTMCR16(work, reg, val) \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_put16(work->dw_mcr_acch, \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm (uint16_t *)(work->dw_mcr_kaddr + reg), val)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define GETMCR32(work, reg) \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_get32(work->dw_mcr_acch, (uint32_t *)(work->dw_mcr_kaddr + reg))
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define GETMCR16(work, reg) \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_get16(work->dw_mcr_acch, (uint16_t *)(work->dw_mcr_kaddr + reg))
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PUTDESC32(req, dc_desc_kaddr, reg, val) \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_put32(req->dr_ctx_acch, \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm (uint32_t *)(dc_desc_kaddr + reg), val)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PUTDESC16(req, dc_desc_kaddr, reg, val) \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_put16(req->dr_ctx_acch, \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm (uint16_t *)(dc_desc_kaddr + reg), val)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/* XXX: define the GET forms for descriptors only if needed */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PUTCTX32(req, reg, val) \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_put32(req->dr_ctx_acch, \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm (uint32_t *)(req->dr_ctx_kaddr + reg), val)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PUTCTX16(req, reg, val) \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_put16(req->dr_ctx_acch, \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm (uint16_t *)(req->dr_ctx_kaddr + reg), val)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CTXBCOPY(req, src, dst, count) \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_rep_put8(req->dr_ctx_acch, (uchar_t *)src, (uchar_t *)dst, count, \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm DDI_DEV_AUTOINCR)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Register access.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define GETCSR(dca, reg) \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_get32(dca->dca_regs_handle, (uint_t *)(dca->dca_regs + reg))
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define PUTCSR(dca, reg, val) \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm ddi_put32(dca->dca_regs_handle, (uint_t *)(dca->dca_regs + reg), val)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define SETBIT(dca, reg, val) \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm PUTCSR(dca, reg, GETCSR(dca, reg) | val)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CLRBIT(dca, reg, val) \
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm PUTCSR(dca, reg, GETCSR(dca, reg) & ~val)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Used to guarantee alignment.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define ROUNDUP(a, n) (((a) + ((n) - 1)) & ~((n) - 1))
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define ROUNDDOWN(a, n) (((a) & ~((n) - 1)))
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define HIDBLWORD(x) (((x) & 0xffffffff00000000ULL) >> 32)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define LODBLWORD(x) ((x) & 0xffffffffULL)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Driver hardening related.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CHECK_REGS(dca) ddi_check_acc_handle(dca->dca_regs_handle)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Other utility macros.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define QEMPTY(q) ((q)->dl_next == (q))
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define BITS2BYTES(b) ((b) >> 3)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define WORKLIST(dca, mcr) (&((dca)->dca_worklist[mcr - 1]))
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Debug stuff.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#ifdef DEBUG
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DWARN 0x0001
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DPCI 0x0002
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DINTR 0x0004
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DSTART 0x0008
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DRECLAIM 0x0010
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DCHATTY 0x0020
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DMOD 0x0040 /* _init/_fini/_info/attach/detach */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DENTRY 0x0080 /* crypto routine entry/exit points */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_dprintf(dca_t *, int, const char *, ...);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DBG dca_dprintf
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#else
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define DBG(dca, lvl, ...)
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#endif
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Some pkcs#11 defines as there are no pkcs#11 header files included.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKO_PUBLIC_KEY 0x00000002
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKO_PRIVATE_KEY 0x00000003
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_CLASS 0x00000000
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_VALUE 0x00000011
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_KEY_TYPE 0x00000100
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_MODULUS 0x00000120
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_PUBLIC_EXPONENT 0x00000122
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_PRIVATE_EXPONENT 0x00000123
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_PRIME_1 0x00000124
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_PRIME_2 0x00000125
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_EXPONENT_1 0x00000126
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_EXPONENT_2 0x00000127
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_COEFFICIENT 0x00000128
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_PRIME 0x00000130
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_SUBPRIME 0x00000131
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#define CKA_BASE 0x00000132
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Driver globals.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmextern int dca_mindma;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmextern int dca_hardening;
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * Prototypes.
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * dca_debug.c
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_error(dca_t *, const char *, ...);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_diperror(dev_info_t *, const char *, ...);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_dipverror(dev_info_t *, const char *, va_list);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * dca_3des.c
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_3desctxinit(crypto_ctx_t *, crypto_mechanism_t *, crypto_key_t *,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_3des(crypto_ctx_t *, crypto_data_t *, crypto_data_t *,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_req_handle_t, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_3desupdate(crypto_ctx_t *, crypto_data_t *, crypto_data_t *,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_req_handle_t, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_3desfinal(crypto_ctx_t *, crypto_data_t *, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_3desatomic(crypto_provider_handle_t, crypto_session_id_t,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_mechanism_t *, crypto_key_t *, crypto_data_t *, crypto_data_t *,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int, crypto_req_handle_t, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_3desctxfree(void *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * dca_rsa.c
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_rsastart(crypto_ctx_t *, crypto_data_t *, crypto_data_t *,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_req_handle_t, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_rsainit(crypto_ctx_t *, crypto_mechanism_t *, crypto_key_t *, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_rsactxfree(void *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_rsaatomic(crypto_provider_handle_t, crypto_session_id_t,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_mechanism_t *, crypto_key_t *, crypto_data_t *, crypto_data_t *,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int, crypto_req_handle_t, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * dca_dsa.c
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_dsa_sign(crypto_ctx_t *, crypto_data_t *, crypto_data_t *,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_req_handle_t);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_dsa_verify(crypto_ctx_t *, crypto_data_t *, crypto_data_t *,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_req_handle_t);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_dsainit(crypto_ctx_t *, crypto_mechanism_t *, crypto_key_t *, int,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_dsactxfree(void *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_dsaatomic(crypto_provider_handle_t, crypto_session_id_t,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm crypto_mechanism_t *, crypto_key_t *, crypto_data_t *, crypto_data_t *,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm int, crypto_req_handle_t, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * dca_rng.c
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_rng(dca_t *, uchar_t *, size_t len, crypto_req_handle_t);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_random_buffer(dca_t *dca, caddr_t buf, int len);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_random_init();
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_random_fini();
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * dca_kstat.c
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_ksinit(dca_t *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm/*
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm * dca.c
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_rmqueue(dca_listnode_t *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmdca_request_t *dca_getreq(dca_t *, int, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_freereq(dca_request_t *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_bindchains(dca_request_t *, size_t, size_t);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_unbindchains(dca_request_t *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_start(dca_t *, dca_request_t *, int, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_done(dca_request_t *, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_destroyreq(dca_request_t *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_length(crypto_data_t *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_gather(crypto_data_t *, char *, int, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_resid_gather(crypto_data_t *, char *, int *, char *, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_scatter(const char *, crypto_data_t *, int, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_bcmp_reverse(const void *s1, const void *s2, size_t n);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_dupcrypto(crypto_data_t *, crypto_data_t *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_verifyio(crypto_data_t *, crypto_data_t *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_getbufbytes(crypto_data_t *, size_t, int, uchar_t *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_sgcheck(dca_t *, crypto_data_t *, dca_sg_param_t);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmcrypto_object_attribute_t *
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_get_key_attr(crypto_key_t *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_attr_lookup_uint32(crypto_object_attribute_t *, uint_t, uint64_t,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint32_t *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_attr_lookup_uint8_array(crypto_object_attribute_t *, uint_t,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm uint64_t, void **, unsigned int *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmcrypto_object_attribute_t *
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_find_attribute(crypto_object_attribute_t *, uint_t, uint64_t);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmcaddr_t dca_bufdaddr(crypto_data_t *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_rcoalesce(dca_request_t *, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_runcoalesce(dca_request_t *);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_bitlen(unsigned char *, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmuint16_t dca_padhalf(int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmuint16_t dca_padfull(int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmvoid dca_reverse(void *, void *, int, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_numcmp(caddr_t, int, caddr_t, int);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_check_dma_handle(dca_t *dca, ddi_dma_handle_t handle,
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm dca_fma_eclass_t eclass_index);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gmint dca_free_context(crypto_ctx_t *ctx);
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#endif /* _KERNEL */
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#ifdef __cplusplus
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm}
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#endif
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm
88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98gm#endif /* _SYS_CRYPTO_DCA_H */