xref: /freebsd/sys/dev/safe/safereg.h (revision 4d846d260e2b9a3d4d0a701462568268cbfe7a5b)
1b7e3f244SSam Leffler /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni  *
4b7e3f244SSam Leffler  * Copyright (c) 2003 Sam Leffler, Errno Consulting
5b7e3f244SSam Leffler  * Copyright (c) 2003 Global Technology Associates, Inc.
6b7e3f244SSam Leffler  * All rights reserved.
7b7e3f244SSam Leffler  *
8b7e3f244SSam Leffler  * Redistribution and use in source and binary forms, with or without
9b7e3f244SSam Leffler  * modification, are permitted provided that the following conditions
10b7e3f244SSam Leffler  * are met:
11b7e3f244SSam Leffler  * 1. Redistributions of source code must retain the above copyright
12b7e3f244SSam Leffler  *    notice, this list of conditions and the following disclaimer.
13b7e3f244SSam Leffler  * 2. Redistributions in binary form must reproduce the above copyright
14b7e3f244SSam Leffler  *    notice, this list of conditions and the following disclaimer in the
15b7e3f244SSam Leffler  *    documentation and/or other materials provided with the distribution.
16b7e3f244SSam Leffler  *
17b7e3f244SSam Leffler  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18b7e3f244SSam Leffler  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19b7e3f244SSam Leffler  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20b7e3f244SSam Leffler  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21b7e3f244SSam Leffler  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22b7e3f244SSam Leffler  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23b7e3f244SSam Leffler  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24b7e3f244SSam Leffler  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25b7e3f244SSam Leffler  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26b7e3f244SSam Leffler  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27b7e3f244SSam Leffler  * SUCH DAMAGE.
28b7e3f244SSam Leffler  *
29b7e3f244SSam Leffler  * $FreeBSD$
30b7e3f244SSam Leffler  */
31b7e3f244SSam Leffler #ifndef _SAFE_SAFEREG_H_
32b7e3f244SSam Leffler #define	_SAFE_SAFEREG_H_
33b7e3f244SSam Leffler 
34b7e3f244SSam Leffler /*
35b7e3f244SSam Leffler  * Register definitions for SafeNet SafeXcel-1141 crypto device.
36b7e3f244SSam Leffler  * Definitions from revision 1.3 (Nov 6 2002) of the User's Manual.
37b7e3f244SSam Leffler  */
38b7e3f244SSam Leffler 
39b7e3f244SSam Leffler #define BS_BAR			0x10	/* DMA base address register */
40b7e3f244SSam Leffler #define	BS_TRDY_TIMEOUT		0x40	/* TRDY timeout */
41b7e3f244SSam Leffler #define	BS_RETRY_TIMEOUT	0x41	/* DMA retry timeout */
42b7e3f244SSam Leffler 
43b7e3f244SSam Leffler #define	PCI_VENDOR_SAFENET	0x16ae		/* SafeNet, Inc. */
44b7e3f244SSam Leffler 
45b7e3f244SSam Leffler /* SafeNet */
46b7e3f244SSam Leffler #define	PCI_PRODUCT_SAFEXCEL	0x1141		/* 1141 */
47b7e3f244SSam Leffler 
48b7e3f244SSam Leffler #define	SAFE_PE_CSR		0x0000	/* Packet Enginge Ctrl/Status */
49b7e3f244SSam Leffler #define	SAFE_PE_SRC		0x0004	/* Packet Engine Source */
50b7e3f244SSam Leffler #define	SAFE_PE_DST		0x0008	/* Packet Engine Destination */
51b7e3f244SSam Leffler #define	SAFE_PE_SA		0x000c	/* Packet Engine SA */
52b7e3f244SSam Leffler #define	SAFE_PE_LEN		0x0010	/* Packet Engine Length */
53b7e3f244SSam Leffler #define	SAFE_PE_DMACFG		0x0040	/* Packet Engine DMA Configuration */
54b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT		0x0044	/* Packet Engine DMA Status */
55b7e3f244SSam Leffler #define	SAFE_PE_PDRBASE		0x0048	/* Packet Engine Descriptor Ring Base */
56b7e3f244SSam Leffler #define	SAFE_PE_RDRBASE		0x004c	/* Packet Engine Result Ring Base */
57b7e3f244SSam Leffler #define	SAFE_PE_RINGCFG		0x0050	/* Packet Engine Ring Configuration */
58b7e3f244SSam Leffler #define	SAFE_PE_RINGPOLL	0x0054	/* Packet Engine Ring Poll */
59b7e3f244SSam Leffler #define	SAFE_PE_IRNGSTAT	0x0058	/* Packet Engine Internal Ring Status */
60b7e3f244SSam Leffler #define	SAFE_PE_ERNGSTAT	0x005c	/* Packet Engine External Ring Status */
61b7e3f244SSam Leffler #define	SAFE_PE_IOTHRESH	0x0060	/* Packet Engine I/O Threshold */
62b7e3f244SSam Leffler #define	SAFE_PE_GRNGBASE	0x0064	/* Packet Engine Gather Ring Base */
63b7e3f244SSam Leffler #define	SAFE_PE_SRNGBASE	0x0068	/* Packet Engine Scatter Ring Base */
64b7e3f244SSam Leffler #define	SAFE_PE_PARTSIZE	0x006c	/* Packet Engine Particlar Ring Size */
65b7e3f244SSam Leffler #define	SAFE_PE_PARTCFG		0x0070	/* Packet Engine Particle Ring Config */
66b7e3f244SSam Leffler #define	SAFE_CRYPTO_CTRL	0x0080	/* Crypto Control */
67b7e3f244SSam Leffler #define	SAFE_DEVID		0x0084	/* Device ID */
68b7e3f244SSam Leffler #define	SAFE_DEVINFO		0x0088	/* Device Info */
69b7e3f244SSam Leffler #define	SAFE_HU_STAT		0x00a0	/* Host Unmasked Status */
70b7e3f244SSam Leffler #define	SAFE_HM_STAT		0x00a4	/* Host Masked Status (read-only) */
71b7e3f244SSam Leffler #define	SAFE_HI_CLR		0x00a4	/* Host Clear Interrupt (write-only) */
72b7e3f244SSam Leffler #define	SAFE_HI_MASK		0x00a8	/* Host Mask Control */
73b7e3f244SSam Leffler #define	SAFE_HI_CFG		0x00ac	/* Interrupt Configuration */
74b7e3f244SSam Leffler #define	SAFE_HI_RD_DESCR	0x00b4	/* Force Descriptor Read */
75b7e3f244SSam Leffler #define	SAFE_HI_DESC_CNT	0x00b8	/* Host Descriptor Done Count */
76b7e3f244SSam Leffler #define	SAFE_DMA_ENDIAN		0x00c0	/* Master Endian Status */
77b7e3f244SSam Leffler #define	SAFE_DMA_SRCADDR	0x00c4	/* DMA Source Address Status */
78b7e3f244SSam Leffler #define	SAFE_DMA_DSTADDR	0x00c8	/* DMA Destination Address Status */
79b7e3f244SSam Leffler #define	SAFE_DMA_STAT		0x00cc	/* DMA Current Status */
80b7e3f244SSam Leffler #define	SAFE_DMA_CFG		0x00d4	/* DMA Configuration/Status */
81b7e3f244SSam Leffler #define	SAFE_ENDIAN		0x00e0	/* Endian Configuration */
82b7e3f244SSam Leffler #define	SAFE_PK_A_ADDR		0x0800	/* Public Key A Address */
83b7e3f244SSam Leffler #define	SAFE_PK_B_ADDR		0x0804	/* Public Key B Address */
84b7e3f244SSam Leffler #define	SAFE_PK_C_ADDR		0x0808	/* Public Key C Address */
85b7e3f244SSam Leffler #define	SAFE_PK_D_ADDR		0x080c	/* Public Key D Address */
86b7e3f244SSam Leffler #define	SAFE_PK_A_LEN		0x0810	/* Public Key A Length */
87b7e3f244SSam Leffler #define	SAFE_PK_B_LEN		0x0814	/* Public Key B Length */
88b7e3f244SSam Leffler #define	SAFE_PK_SHIFT		0x0818	/* Public Key Shift */
89b7e3f244SSam Leffler #define	SAFE_PK_FUNC		0x081c	/* Public Key Function */
90b7e3f244SSam Leffler #define	SAFE_RNG_OUT		0x0100	/* RNG Output */
91b7e3f244SSam Leffler #define	SAFE_RNG_STAT		0x0104	/* RNG Status */
92b7e3f244SSam Leffler #define	SAFE_RNG_CTRL		0x0108	/* RNG Control */
93b7e3f244SSam Leffler #define	SAFE_RNG_A		0x010c	/* RNG A */
94b7e3f244SSam Leffler #define	SAFE_RNG_B		0x0110	/* RNG B */
95b7e3f244SSam Leffler #define	SAFE_RNG_X_LO		0x0114	/* RNG X [31:0] */
96b7e3f244SSam Leffler #define	SAFE_RNG_X_MID		0x0118	/* RNG X [63:32] */
97b7e3f244SSam Leffler #define	SAFE_RNG_X_HI		0x011c	/* RNG X [80:64] */
98b7e3f244SSam Leffler #define	SAFE_RNG_X_CNTR		0x0120	/* RNG Counter */
99b7e3f244SSam Leffler #define	SAFE_RNG_ALM_CNT	0x0124	/* RNG Alarm Count */
100b7e3f244SSam Leffler #define	SAFE_RNG_CNFG		0x0128	/* RNG Configuration */
101b7e3f244SSam Leffler #define	SAFE_RNG_LFSR1_LO	0x012c	/* RNG LFSR1 [31:0] */
102b7e3f244SSam Leffler #define	SAFE_RNG_LFSR1_HI	0x0130	/* RNG LFSR1 [47:32] */
103b7e3f244SSam Leffler #define	SAFE_RNG_LFSR2_LO	0x0134	/* RNG LFSR1 [31:0] */
104b7e3f244SSam Leffler #define	SAFE_RNG_LFSR2_HI	0x0138	/* RNG LFSR1 [47:32] */
105b7e3f244SSam Leffler 
106b7e3f244SSam Leffler #define	SAFE_PE_CSR_READY	0x00000001	/* ready for processing */
107b7e3f244SSam Leffler #define	SAFE_PE_CSR_DONE	0x00000002	/* h/w completed processing */
108b7e3f244SSam Leffler #define	SAFE_PE_CSR_LOADSA	0x00000004	/* load SA digests */
109b7e3f244SSam Leffler #define	SAFE_PE_CSR_HASHFINAL	0x00000010	/* do hash pad & write result */
110b7e3f244SSam Leffler #define	SAFE_PE_CSR_SABUSID	0x000000c0	/* bus id for SA */
111b7e3f244SSam Leffler #define	SAFE_PE_CSR_SAPCI	0x00000040	/* PCI bus id for SA */
112b7e3f244SSam Leffler #define	SAFE_PE_CSR_NXTHDR	0x0000ff00	/* next hdr value for IPsec */
113b7e3f244SSam Leffler #define	SAFE_PE_CSR_FPAD	0x0000ff00	/* fixed pad for basic ops */
114b7e3f244SSam Leffler #define	SAFE_PE_CSR_STATUS	0x00ff0000	/* operation result status */
115b7e3f244SSam Leffler #define	SAFE_PE_CSR_AUTH_FAIL	0x00010000	/* ICV mismatch (inbound) */
116b7e3f244SSam Leffler #define	SAFE_PE_CSR_PAD_FAIL	0x00020000	/* pad verify fail (inbound) */
117b7e3f244SSam Leffler #define	SAFE_PE_CSR_SEQ_FAIL	0x00040000	/* sequence number (inbound) */
118b7e3f244SSam Leffler #define	SAFE_PE_CSR_XERROR	0x00080000	/* extended error follows */
119b7e3f244SSam Leffler #define	SAFE_PE_CSR_XECODE	0x00f00000	/* extended error code */
120b7e3f244SSam Leffler #define	SAFE_PE_CSR_XECODE_S	20
121b7e3f244SSam Leffler #define	SAFE_PE_CSR_XECODE_BADCMD	0	/* invalid command */
122b7e3f244SSam Leffler #define	SAFE_PE_CSR_XECODE_BADALG	1	/* invalid algorithm */
123b7e3f244SSam Leffler #define	SAFE_PE_CSR_XECODE_ALGDIS	2	/* algorithm disabled */
124b7e3f244SSam Leffler #define	SAFE_PE_CSR_XECODE_ZEROLEN	3	/* zero packet length */
125b7e3f244SSam Leffler #define	SAFE_PE_CSR_XECODE_DMAERR	4	/* bus DMA error */
126b7e3f244SSam Leffler #define	SAFE_PE_CSR_XECODE_PIPEABORT	5	/* secondary bus DMA error */
127b7e3f244SSam Leffler #define	SAFE_PE_CSR_XECODE_BADSPI	6	/* IPsec SPI mismatch */
128b7e3f244SSam Leffler #define	SAFE_PE_CSR_XECODE_TIMEOUT	10	/* failsafe timeout */
129b7e3f244SSam Leffler #define	SAFE_PE_CSR_PAD		0xff000000	/* ESP padding control/status */
130b7e3f244SSam Leffler #define	SAFE_PE_CSR_PAD_MIN	0x00000000	/* minimum IPsec padding */
131b7e3f244SSam Leffler #define	SAFE_PE_CSR_PAD_16	0x08000000	/* pad to 16-byte boundary */
132b7e3f244SSam Leffler #define	SAFE_PE_CSR_PAD_32	0x10000000	/* pad to 32-byte boundary */
133b7e3f244SSam Leffler #define	SAFE_PE_CSR_PAD_64	0x20000000	/* pad to 64-byte boundary */
134b7e3f244SSam Leffler #define	SAFE_PE_CSR_PAD_128	0x40000000	/* pad to 128-byte boundary */
135b7e3f244SSam Leffler #define	SAFE_PE_CSR_PAD_256	0x80000000	/* pad to 256-byte boundary */
136b7e3f244SSam Leffler 
137b7e3f244SSam Leffler /*
138b7e3f244SSam Leffler  * Check the CSR to see if the PE has returned ownership to
139b7e3f244SSam Leffler  * the host.  Note that before processing a descriptor this
140b7e3f244SSam Leffler  * must be done followed by a check of the SAFE_PE_LEN register
141b7e3f244SSam Leffler  * status bits to avoid premature processing of a descriptor
142b7e3f244SSam Leffler  * on its way back to the host.
143b7e3f244SSam Leffler  */
144b7e3f244SSam Leffler #define	SAFE_PE_CSR_IS_DONE(_csr) \
145b7e3f244SSam Leffler     (((_csr) & (SAFE_PE_CSR_READY | SAFE_PE_CSR_DONE)) == SAFE_PE_CSR_DONE)
146b7e3f244SSam Leffler 
147b7e3f244SSam Leffler #define	SAFE_PE_LEN_LENGTH	0x000fffff	/* total length (bytes) */
148b7e3f244SSam Leffler #define	SAFE_PE_LEN_READY	0x00400000	/* ready for processing */
149b7e3f244SSam Leffler #define	SAFE_PE_LEN_DONE	0x00800000	/* h/w completed processing */
150b7e3f244SSam Leffler #define	SAFE_PE_LEN_BYPASS	0xff000000	/* bypass offset (bytes) */
151b7e3f244SSam Leffler #define	SAFE_PE_LEN_BYPASS_S	24
152b7e3f244SSam Leffler 
153b7e3f244SSam Leffler #define	SAFE_PE_LEN_IS_DONE(_len) \
154b7e3f244SSam Leffler     (((_len) & (SAFE_PE_LEN_READY | SAFE_PE_LEN_DONE)) == SAFE_PE_LEN_DONE)
155b7e3f244SSam Leffler 
156b7e3f244SSam Leffler /* NB: these apply to HU_STAT, HM_STAT, HI_CLR, and HI_MASK */
157b7e3f244SSam Leffler #define	SAFE_INT_PE_CDONE	0x00000002	/* PE context done */
158b7e3f244SSam Leffler #define	SAFE_INT_PE_DDONE	0x00000008	/* PE descriptor done */
159b7e3f244SSam Leffler #define	SAFE_INT_PE_ERROR	0x00000010	/* PE error */
160b7e3f244SSam Leffler #define	SAFE_INT_PE_ODONE	0x00000020	/* PE operation done */
161b7e3f244SSam Leffler 
162b7e3f244SSam Leffler #define	SAFE_HI_CFG_PULSE	0x00000001	/* use pulse interrupt */
163b7e3f244SSam Leffler #define	SAFE_HI_CFG_LEVEL	0x00000000	/* use level interrupt */
164b7e3f244SSam Leffler #define	SAFE_HI_CFG_AUTOCLR	0x00000002	/* auto-clear pulse interrupt */
165b7e3f244SSam Leffler 
166b7e3f244SSam Leffler #define	SAFE_ENDIAN_PASS	0x000000e4	/* straight pass-thru */
167b7e3f244SSam Leffler #define	SAFE_ENDIAN_SWAB	0x0000001b	/* swap bytes in 32-bit word */
168b7e3f244SSam Leffler 
169b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_PERESET	0x00000001	/* reset packet engine */
170b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_PDRRESET	0x00000002	/* reset PDR counters/ptrs */
171b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_SGRESET	0x00000004	/* reset scatter/gather cache */
172b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_FSENA	0x00000008	/* enable failsafe reset */
173b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_PEMODE	0x00000100	/* packet engine mode */
174b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_SAPREC	0x00000200	/* SA precedes packet */
175b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_PKFOLL	0x00000400	/* packet follows descriptor */
176b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_GPRBID	0x00003000	/* gather particle ring busid */
177b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_GPRPCI	0x00001000	/* PCI gather particle ring */
178b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_SPRBID	0x0000c000	/* scatter part. ring busid */
179b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_SPRPCI	0x00004000	/* PCI scatter part. ring */
180b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_ESDESC	0x00010000	/* endian swap descriptors */
181b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_ESSA	0x00020000	/* endian swap SA data */
182b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_ESPACKET	0x00040000	/* endian swap packet data */
183b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_ESPDESC	0x00080000	/* endian swap particle desc. */
184b7e3f244SSam Leffler #define	SAFE_PE_DMACFG_NOPDRUP	0x00100000	/* supp. PDR ownership update */
185b7e3f244SSam Leffler #define	SAFE_PD_EDMACFG_PCIMODE	0x01000000	/* PCI target mode */
186b7e3f244SSam Leffler 
187b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_PEIDONE	0x00000001	/* PE core input done */
188b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_PEODONE	0x00000002	/* PE core output done */
189b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_ENCDONE	0x00000004	/* encryption done */
190b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_IHDONE	0x00000008	/* inner hash done */
191b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_OHDONE	0x00000010	/* outer hash (HMAC) done */
192b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_PADFLT	0x00000020	/* crypto pad fault */
193b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_ICVFLT	0x00000040	/* ICV fault */
194b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_SPIMIS	0x00000080	/* SPI mismatch */
195b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_CRYPTO	0x00000100	/* crypto engine timeout */
196b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_CQACT	0x00000200	/* command queue active */
197b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_IRACT	0x00000400	/* input request active */
198b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_ORACT	0x00000800	/* output request active */
199b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_PEISIZE	0x003ff000	/* PE input size:32-bit words */
200b7e3f244SSam Leffler #define	SAFE_PE_DMASTAT_PEOSIZE	0xffc00000	/* PE out. size:32-bit words */
201b7e3f244SSam Leffler 
202b7e3f244SSam Leffler #define	SAFE_PE_RINGCFG_SIZE	0x000003ff	/* ring size (descriptors) */
203b7e3f244SSam Leffler #define	SAFE_PE_RINGCFG_OFFSET	0xffff0000	/* offset btw desc's (dwords) */
204b7e3f244SSam Leffler #define	SAFE_PE_RINGCFG_OFFSET_S	16
205b7e3f244SSam Leffler 
206b7e3f244SSam Leffler #define	SAFE_PE_RINGPOLL_POLL	0x00000fff	/* polling frequency/divisor */
207b7e3f244SSam Leffler #define	SAFE_PE_RINGPOLL_RETRY	0x03ff0000	/* polling frequency/divisor */
208b7e3f244SSam Leffler #define	SAFE_PE_RINGPOLL_CONT	0x80000000	/* continuously poll */
209b7e3f244SSam Leffler 
210b7e3f244SSam Leffler #define	SAFE_PE_IRNGSTAT_CQAVAIL 0x00000001	/* command queue available */
211b7e3f244SSam Leffler 
212b7e3f244SSam Leffler #define	SAFE_PE_ERNGSTAT_NEXT	0x03ff0000	/* index of next packet desc. */
213b7e3f244SSam Leffler #define	SAFE_PE_ERNGSTAT_NEXT_S	16
214b7e3f244SSam Leffler 
215b7e3f244SSam Leffler #define	SAFE_PE_IOTHRESH_INPUT	0x000003ff	/* input threshold (dwords) */
216b7e3f244SSam Leffler #define	SAFE_PE_IOTHRESH_OUTPUT	0x03ff0000	/* output threshold (dwords) */
217b7e3f244SSam Leffler 
218b7e3f244SSam Leffler #define	SAFE_PE_PARTCFG_SIZE	0x0000ffff	/* scatter particle size */
219b7e3f244SSam Leffler #define	SAFE_PE_PARTCFG_GBURST	0x00030000	/* gather particle burst */
220b7e3f244SSam Leffler #define	SAFE_PE_PARTCFG_GBURST_2	0x00000000
221b7e3f244SSam Leffler #define	SAFE_PE_PARTCFG_GBURST_4	0x00010000
222b7e3f244SSam Leffler #define	SAFE_PE_PARTCFG_GBURST_8	0x00020000
223b7e3f244SSam Leffler #define	SAFE_PE_PARTCFG_GBURST_16	0x00030000
224b7e3f244SSam Leffler #define	SAFE_PE_PARTCFG_SBURST	0x000c0000	/* scatter particle burst */
225b7e3f244SSam Leffler #define	SAFE_PE_PARTCFG_SBURST_2	0x00000000
226b7e3f244SSam Leffler #define	SAFE_PE_PARTCFG_SBURST_4	0x00040000
227b7e3f244SSam Leffler #define	SAFE_PE_PARTCFG_SBURST_8	0x00080000
228b7e3f244SSam Leffler #define	SAFE_PE_PARTCFG_SBURST_16	0x000c0000
229b7e3f244SSam Leffler 
230b7e3f244SSam Leffler #define	SAFE_PE_PARTSIZE_SCAT	0xffff0000	/* scatter particle ring size */
231b7e3f244SSam Leffler #define	SAFE_PE_PARTSIZE_GATH	0x0000ffff	/* gather particle ring size */
232b7e3f244SSam Leffler 
233b7e3f244SSam Leffler #define	SAFE_CRYPTO_CTRL_3DES	0x00000001	/* enable 3DES support */
234b7e3f244SSam Leffler #define	SAFE_CRYPTO_CTRL_PKEY	0x00010000	/* enable public key support */
235b7e3f244SSam Leffler #define	SAFE_CRYPTO_CTRL_RNG	0x00020000	/* enable RNG support */
236b7e3f244SSam Leffler 
237b7e3f244SSam Leffler #define	SAFE_DEVINFO_REV_MIN	0x0000000f	/* minor rev for chip */
238b7e3f244SSam Leffler #define	SAFE_DEVINFO_REV_MAJ	0x000000f0	/* major rev for chip */
239b7e3f244SSam Leffler #define	SAFE_DEVINFO_REV_MAJ_S	4
240b7e3f244SSam Leffler #define	SAFE_DEVINFO_DES	0x00000100	/* DES/3DES support present */
241b7e3f244SSam Leffler #define	SAFE_DEVINFO_ARC4	0x00000200	/* ARC4 support present */
242b7e3f244SSam Leffler #define	SAFE_DEVINFO_AES	0x00000400	/* AES support present */
243b7e3f244SSam Leffler #define	SAFE_DEVINFO_MD5	0x00001000	/* MD5 support present */
244b7e3f244SSam Leffler #define	SAFE_DEVINFO_SHA1	0x00002000	/* SHA-1 support present */
245b7e3f244SSam Leffler #define	SAFE_DEVINFO_RIPEMD	0x00004000	/* RIPEMD support present */
246b7e3f244SSam Leffler #define	SAFE_DEVINFO_DEFLATE	0x00010000	/* Deflate support present */
247b7e3f244SSam Leffler #define	SAFE_DEVINFO_SARAM	0x00100000	/* on-chip SA RAM present */
248b7e3f244SSam Leffler #define	SAFE_DEVINFO_EMIBUS	0x00200000	/* EMI bus present */
249b7e3f244SSam Leffler #define	SAFE_DEVINFO_PKEY	0x00400000	/* public key support present */
250b7e3f244SSam Leffler #define	SAFE_DEVINFO_RNG	0x00800000	/* RNG present */
251b7e3f244SSam Leffler 
252b7e3f244SSam Leffler #define	SAFE_REV(_maj, _min)	(((_maj) << SAFE_DEVINFO_REV_MAJ_S) | (_min))
253b7e3f244SSam Leffler #define	SAFE_REV_MAJ(_chiprev) \
254b7e3f244SSam Leffler 	(((_chiprev) & SAFE_DEVINFO_REV_MAJ) >> SAFE_DEVINFO_REV_MAJ_S)
255b7e3f244SSam Leffler #define	SAFE_REV_MIN(_chiprev)	((_chiprev) & SAFE_DEVINFO_REV_MIN)
256b7e3f244SSam Leffler 
257b7e3f244SSam Leffler #define	SAFE_PK_FUNC_MULT	0x00000001	/* Multiply function */
258b7e3f244SSam Leffler #define	SAFE_PK_FUNC_SQUARE	0x00000004	/* Square function */
259b7e3f244SSam Leffler #define	SAFE_PK_FUNC_ADD	0x00000010	/* Add function */
260b7e3f244SSam Leffler #define	SAFE_PK_FUNC_SUB	0x00000020	/* Subtract function */
261b7e3f244SSam Leffler #define	SAFE_PK_FUNC_LSHIFT	0x00000040	/* Left-shift function */
262b7e3f244SSam Leffler #define	SAFE_PK_FUNC_RSHIFT	0x00000080	/* Right-shift function */
263b7e3f244SSam Leffler #define	SAFE_PK_FUNC_DIV	0x00000100	/* Divide function */
264b7e3f244SSam Leffler #define	SAFE_PK_FUNC_CMP	0x00000400	/* Compare function */
265b7e3f244SSam Leffler #define	SAFE_PK_FUNC_COPY	0x00000800	/* Copy function */
266b7e3f244SSam Leffler #define	SAFE_PK_FUNC_EXP16	0x00002000	/* Exponentiate (4-bit ACT) */
267b7e3f244SSam Leffler #define	SAFE_PK_FUNC_EXP4	0x00004000	/* Exponentiate (2-bit ACT) */
268b7e3f244SSam Leffler 
269b7e3f244SSam Leffler #define	SAFE_RNG_STAT_BUSY	0x00000001	/* busy, data not valid */
270b7e3f244SSam Leffler 
271b7e3f244SSam Leffler #define	SAFE_RNG_CTRL_PRE_LFSR	0x00000001	/* enable output pre-LFSR */
272b7e3f244SSam Leffler #define	SAFE_RNG_CTRL_TST_MODE	0x00000002	/* enable test mode */
273b7e3f244SSam Leffler #define	SAFE_RNG_CTRL_TST_RUN	0x00000004	/* start test state machine */
274b7e3f244SSam Leffler #define	SAFE_RNG_CTRL_ENA_RING1	0x00000008	/* test entropy oscillator #1 */
275b7e3f244SSam Leffler #define	SAFE_RNG_CTRL_ENA_RING2	0x00000010	/* test entropy oscillator #2 */
276b7e3f244SSam Leffler #define	SAFE_RNG_CTRL_DIS_ALARM	0x00000020	/* disable RNG alarm reports */
277b7e3f244SSam Leffler #define	SAFE_RNG_CTRL_TST_CLOCK	0x00000040	/* enable test clock */
278b7e3f244SSam Leffler #define	SAFE_RNG_CTRL_SHORTEN	0x00000080	/* shorten state timers */
279b7e3f244SSam Leffler #define	SAFE_RNG_CTRL_TST_ALARM	0x00000100	/* simulate alarm state */
280b7e3f244SSam Leffler #define	SAFE_RNG_CTRL_RST_LFSR	0x00000200	/* reset LFSR */
281b7e3f244SSam Leffler 
282b7e3f244SSam Leffler /*
283b7e3f244SSam Leffler  * Packet engine descriptor.  Note that d_csr is a copy of the
284b7e3f244SSam Leffler  * SAFE_PE_CSR register and all definitions apply, and d_len
285b7e3f244SSam Leffler  * is a copy of the SAFE_PE_LEN register and all definitions apply.
286b7e3f244SSam Leffler  * d_src and d_len may point directly to contiguous data or to a
287b7e3f244SSam Leffler  * list of ``particle descriptors'' when using scatter/gather i/o.
288b7e3f244SSam Leffler  */
289b7e3f244SSam Leffler struct safe_desc {
290b7e3f244SSam Leffler 	u_int32_t	d_csr;			/* per-packet control/status */
291b7e3f244SSam Leffler 	u_int32_t	d_src;			/* source address */
292b7e3f244SSam Leffler 	u_int32_t	d_dst;			/* destination address */
293b7e3f244SSam Leffler 	u_int32_t	d_sa;			/* SA address */
294b7e3f244SSam Leffler 	u_int32_t	d_len;			/* length, bypass, status */
295b7e3f244SSam Leffler };
296b7e3f244SSam Leffler 
297b7e3f244SSam Leffler /*
298b7e3f244SSam Leffler  * Scatter/Gather particle descriptor.
299b7e3f244SSam Leffler  *
300b7e3f244SSam Leffler  * NB: scatter descriptors do not specify a size; this is fixed
301b7e3f244SSam Leffler  *     by the setting of the SAFE_PE_PARTCFG register.
302b7e3f244SSam Leffler  */
303b7e3f244SSam Leffler struct safe_pdesc {
304b7e3f244SSam Leffler 	u_int32_t	pd_addr;		/* particle address */
305b7e3f244SSam Leffler 	u_int16_t	pd_flags;		/* control word */
306b7e3f244SSam Leffler 	u_int16_t	pd_size;		/* particle size (bytes) */
307b7e3f244SSam Leffler };
308b7e3f244SSam Leffler 
309b7e3f244SSam Leffler #define	SAFE_PD_READY	0x0001			/* ready for processing */
310b7e3f244SSam Leffler #define	SAFE_PD_DONE	0x0002			/* h/w completed processing */
311b7e3f244SSam Leffler 
312b7e3f244SSam Leffler /*
313b7e3f244SSam Leffler  * Security Association (SA) Record (Rev 1).  One of these is
314b7e3f244SSam Leffler  * required for each operation processed by the packet engine.
315b7e3f244SSam Leffler  */
316b7e3f244SSam Leffler struct safe_sarec {
317b7e3f244SSam Leffler 	u_int32_t	sa_cmd0;
318b7e3f244SSam Leffler 	u_int32_t	sa_cmd1;
319b7e3f244SSam Leffler 	u_int32_t	sa_resv0;
320b7e3f244SSam Leffler 	u_int32_t	sa_resv1;
321b7e3f244SSam Leffler 	u_int32_t	sa_key[8];		/* DES/3DES/AES key */
322b7e3f244SSam Leffler 	u_int32_t	sa_indigest[5];		/* inner digest */
323b7e3f244SSam Leffler 	u_int32_t	sa_outdigest[5];	/* outer digest */
324b7e3f244SSam Leffler 	u_int32_t	sa_spi;			/* SPI */
325b7e3f244SSam Leffler 	u_int32_t	sa_seqnum;		/* sequence number */
326b7e3f244SSam Leffler 	u_int32_t	sa_seqmask[2];		/* sequence number mask */
327b7e3f244SSam Leffler 	u_int32_t	sa_resv2;
328b7e3f244SSam Leffler 	u_int32_t	sa_staterec;		/* address of state record */
329b7e3f244SSam Leffler 	u_int32_t	sa_resv3[2];
330b7e3f244SSam Leffler 	u_int32_t	sa_samgmt0;		/* SA management field 0 */
331b7e3f244SSam Leffler 	u_int32_t	sa_samgmt1;		/* SA management field 0 */
332b7e3f244SSam Leffler };
333b7e3f244SSam Leffler 
334b7e3f244SSam Leffler #define	SAFE_SA_CMD0_OP		0x00000007	/* operation code */
335b7e3f244SSam Leffler #define	SAFE_SA_CMD0_OP_CRYPT	0x00000000	/* encrypt/decrypt (basic) */
336b7e3f244SSam Leffler #define	SAFE_SA_CMD0_OP_BOTH	0x00000001	/* encrypt-hash/hash-decrypto */
337b7e3f244SSam Leffler #define	SAFE_SA_CMD0_OP_HASH	0x00000003	/* hash (outbound-only) */
338b7e3f244SSam Leffler #define	SAFE_SA_CMD0_OP_ESP	0x00000000	/* ESP in/out (proto) */
339b7e3f244SSam Leffler #define	SAFE_SA_CMD0_OP_AH	0x00000001	/* AH in/out (proto) */
340b7e3f244SSam Leffler #define	SAFE_SA_CMD0_INBOUND	0x00000008	/* inbound operation */
341b7e3f244SSam Leffler #define	SAFE_SA_CMD0_OUTBOUND	0x00000000	/* outbound operation */
342b7e3f244SSam Leffler #define	SAFE_SA_CMD0_GROUP	0x00000030	/* operation group */
343b7e3f244SSam Leffler #define	SAFE_SA_CMD0_BASIC	0x00000000	/* basic operation */
344b7e3f244SSam Leffler #define	SAFE_SA_CMD0_PROTO	0x00000010	/* protocol/packet operation */
345b7e3f244SSam Leffler #define	SAFE_SA_CMD0_BUNDLE	0x00000020	/* bundled operation (resvd) */
346b7e3f244SSam Leffler #define	SAFE_SA_CMD0_PAD	0x000000c0	/* crypto pad method */
347b7e3f244SSam Leffler #define	SAFE_SA_CMD0_PAD_IPSEC	0x00000000	/* IPsec padding */
348b7e3f244SSam Leffler #define	SAFE_SA_CMD0_PAD_PKCS7	0x00000040	/* PKCS#7 padding */
349b7e3f244SSam Leffler #define	SAFE_SA_CMD0_PAD_CONS	0x00000080	/* constant padding */
350b7e3f244SSam Leffler #define	SAFE_SA_CMD0_PAD_ZERO	0x000000c0	/* zero padding */
351b7e3f244SSam Leffler #define	SAFE_SA_CMD0_CRYPT_ALG	0x00000f00	/* symmetric crypto algorithm */
352b7e3f244SSam Leffler #define	SAFE_SA_CMD0_DES	0x00000000	/* DES crypto algorithm */
353b7e3f244SSam Leffler #define	SAFE_SA_CMD0_3DES	0x00000100	/* 3DES crypto algorithm */
354b7e3f244SSam Leffler #define	SAFE_SA_CMD0_AES	0x00000300	/* AES crypto algorithm */
355b7e3f244SSam Leffler #define	SAFE_SA_CMD0_CRYPT_NULL	0x00000f00	/* null crypto algorithm */
356b7e3f244SSam Leffler #define	SAFE_SA_CMD0_HASH_ALG	0x0000f000	/* hash algorithm */
357b7e3f244SSam Leffler #define	SAFE_SA_CMD0_MD5	0x00000000	/* MD5 hash algorithm */
358b7e3f244SSam Leffler #define	SAFE_SA_CMD0_SHA1	0x00001000	/* SHA-1 hash algorithm */
359b7e3f244SSam Leffler #define	SAFE_SA_CMD0_HASH_NULL	0x0000f000	/* null hash algorithm */
360b7e3f244SSam Leffler #define	SAFE_SA_CMD0_HDR_PROC	0x00080000	/* header processing */
361b7e3f244SSam Leffler #define	SAFE_SA_CMD0_IBUSID	0x00300000	/* input bus id */
362b7e3f244SSam Leffler #define	SAFE_SA_CMD0_IPCI	0x00100000	/* PCI input bus id */
363b7e3f244SSam Leffler #define	SAFE_SA_CMD0_OBUSID	0x00c00000	/* output bus id */
364b7e3f244SSam Leffler #define	SAFE_SA_CMD0_OPCI	0x00400000	/* PCI output bus id */
365b7e3f244SSam Leffler #define	SAFE_SA_CMD0_IVLD	0x03000000	/* IV loading */
366b7e3f244SSam Leffler #define	SAFE_SA_CMD0_IVLD_NONE	0x00000000	/* IV no load (reuse) */
367b7e3f244SSam Leffler #define	SAFE_SA_CMD0_IVLD_IBUF	0x01000000	/* IV load from input buffer */
368b7e3f244SSam Leffler #define	SAFE_SA_CMD0_IVLD_STATE	0x02000000	/* IV load from state */
369b7e3f244SSam Leffler #define	SAFE_SA_CMD0_HSLD	0x0c000000	/* hash state loading */
370b7e3f244SSam Leffler #define	SAFE_SA_CMD0_HSLD_SA	0x00000000	/* hash state load from SA */
371b7e3f244SSam Leffler #define	SAFE_SA_CMD0_HSLD_STATE	0x08000000	/* hash state load from state */
372b7e3f244SSam Leffler #define	SAFE_SA_CMD0_HSLD_NONE	0x0c000000	/* hash state no load */
373b7e3f244SSam Leffler #define	SAFE_SA_CMD0_SAVEIV	0x10000000	/* save IV */
374b7e3f244SSam Leffler #define	SAFE_SA_CMD0_SAVEHASH	0x20000000	/* save hash state */
375b7e3f244SSam Leffler #define	SAFE_SA_CMD0_IGATHER	0x40000000	/* input gather */
376b7e3f244SSam Leffler #define	SAFE_SA_CMD0_OSCATTER	0x80000000	/* output scatter */
377b7e3f244SSam Leffler 
378b7e3f244SSam Leffler #define	SAFE_SA_CMD1_HDRCOPY	0x00000002	/* copy header to output */
379b7e3f244SSam Leffler #define	SAFE_SA_CMD1_PAYCOPY	0x00000004	/* copy payload to output */
380b7e3f244SSam Leffler #define	SAFE_SA_CMD1_PADCOPY	0x00000008	/* copy pad to output */
381b7e3f244SSam Leffler #define	SAFE_SA_CMD1_IPV4	0x00000000	/* IPv4 protocol */
382b7e3f244SSam Leffler #define	SAFE_SA_CMD1_IPV6	0x00000010	/* IPv6 protocol */
383b7e3f244SSam Leffler #define	SAFE_SA_CMD1_MUTABLE	0x00000020	/* mutable bit processing */
384b7e3f244SSam Leffler #define	SAFE_SA_CMD1_SRBUSID	0x000000c0	/* state record bus id */
385b7e3f244SSam Leffler #define	SAFE_SA_CMD1_SRPCI	0x00000040	/* state record from PCI */
386b7e3f244SSam Leffler #define	SAFE_SA_CMD1_CRMODE	0x00000300	/* crypto mode */
387b7e3f244SSam Leffler #define	SAFE_SA_CMD1_ECB	0x00000000	/* ECB crypto mode */
388b7e3f244SSam Leffler #define	SAFE_SA_CMD1_CBC	0x00000100	/* CBC crypto mode */
389b7e3f244SSam Leffler #define	SAFE_SA_CMD1_OFB	0x00000200	/* OFB crypto mode */
390b7e3f244SSam Leffler #define	SAFE_SA_CMD1_CFB	0x00000300	/* CFB crypto mode */
391b7e3f244SSam Leffler #define	SAFE_SA_CMD1_CRFEEDBACK	0x00000c00	/* crypto feedback mode */
392b7e3f244SSam Leffler #define	SAFE_SA_CMD1_64BIT	0x00000000	/* 64-bit crypto feedback */
393b7e3f244SSam Leffler #define	SAFE_SA_CMD1_8BIT	0x00000400	/* 8-bit crypto feedback */
394b7e3f244SSam Leffler #define	SAFE_SA_CMD1_1BIT	0x00000800	/* 1-bit crypto feedback */
395b7e3f244SSam Leffler #define	SAFE_SA_CMD1_128BIT	0x00000c00	/* 128-bit crypto feedback */
396b7e3f244SSam Leffler #define	SAFE_SA_CMD1_OPTIONS	0x00001000	/* HMAC/options mutable bit */
397b7e3f244SSam Leffler #define	SAFE_SA_CMD1_HMAC	SAFE_SA_CMD1_OPTIONS
398b7e3f244SSam Leffler #define	SAFE_SA_CMD1_SAREV1	0x00008000	/* SA Revision 1 */
399b7e3f244SSam Leffler #define	SAFE_SA_CMD1_OFFSET	0x00ff0000	/* hash/crypto offset(dwords) */
400b7e3f244SSam Leffler #define	SAFE_SA_CMD1_OFFSET_S	16
401b7e3f244SSam Leffler #define	SAFE_SA_CMD1_AESKEYLEN	0x0f000000	/* AES key length */
402b7e3f244SSam Leffler #define	SAFE_SA_CMD1_AES128	0x02000000	/* 128-bit AES key */
403b7e3f244SSam Leffler #define	SAFE_SA_CMD1_AES192	0x03000000	/* 192-bit AES key */
404b7e3f244SSam Leffler #define	SAFE_SA_CMD1_AES256	0x04000000	/* 256-bit AES key */
405b7e3f244SSam Leffler 
406b7e3f244SSam Leffler /*
407b7e3f244SSam Leffler  * Security Associate State Record (Rev 1).
408b7e3f244SSam Leffler  */
409b7e3f244SSam Leffler struct safe_sastate {
410b7e3f244SSam Leffler 	u_int32_t	sa_saved_iv[4];		/* saved IV (DES/3DES/AES) */
411b7e3f244SSam Leffler 	u_int32_t	sa_saved_hashbc;	/* saved hash byte count */
412b7e3f244SSam Leffler 	u_int32_t	sa_saved_indigest[5];	/* saved inner digest */
413b7e3f244SSam Leffler };
414b7e3f244SSam Leffler #endif /* _SAFE_SAFEREG_H_ */
415