1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
|
/* *********************************************************************
* Broadcom Common Firmware Environment (CFE)
*
* BCM5821 cryptoaccelerator File: bcm5821.h
*
*********************************************************************
*
* Copyright 2000,2001,2002,2003
* Broadcom Corporation. All rights reserved.
*
* This software is furnished under license and may be used and
* copied only in accordance with the following terms and
* conditions. Subject to these conditions, you may download,
* copy, install, use, modify and distribute modified or unmodified
* copies of this software in source and/or binary form. No title
* or ownership is transferred hereby.
*
* 1) Any source code used, modified or distributed must reproduce
* and retain this copyright notice and list of conditions
* as they appear in the source file.
*
* 2) No right is granted to use any trade name, trademark, or
* logo of Broadcom Corporation. The "Broadcom Corporation"
* name may not be used to endorse or promote products derived
* from this software without the prior written permission of
* Broadcom Corporation.
*
* 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT
* SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN
* PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
********************************************************************* */
#ifndef _BCM5821_H_
#define _BCM5821_H_
/* Register and field definitions for the Broadcom BCM5821 crypto
accelerator. The BCM5820 implements a compatible (modulo bugs)
subset of the BCM5821. */
#define K_PCI_VENDOR_BROADCOM 0x14e4
#define K_PCI_ID_BCM5820 0x5820
#define K_PCI_ID_BCM5821 0x5821
#define _DD_MAKEMASK1(n) (1 << (n))
#define _DD_MAKEMASK(v,n) ((((1)<<(v))-1) << (n))
#define _DD_MAKEVALUE(v,n) ((v) << (n))
#define _DD_GETVALUE(v,n,m) (((v) & (m)) >> (n))
/* DMA Control and Status Register offsets */
#define R_MCR1 0x00
#define R_DMA_CTRL 0x04
#define R_DMA_STAT 0x08
#define R_DMA_ERR 0x0C
#define R_MCR2 0x10
/* 0x00 MCR1@: Master Command Record 1 Address */
/* 0x10 MCR2@: Master Command Record 2 Address */
/* 0x04 DMA Control */
#define M_DMA_CTRL_WR_BURST _DD_MAKEMASK1(16) /* Not 5820 */
#define K_DMA_WR_BURST_128 0
#define K_DMA_WR_BURST_240 M_DMA_CRTL_WR_BURST
#define M_DMA_CTRL_MOD_NORM _DD_MAKEMASK1(22)
#define M_DMA_CTRL_RNG_MODE _DD_MAKEMASK1(23)
#define M_DMA_CTRL_DMAERR_EN _DD_MAKEMASK1(25)
#define M_DMA_CTRL_NORM_PCI _DD_MAKEMASK1(26) /* Not 5820 */
#define M_DMA_CTRL_LE_CRYPTO _DD_MAKEMASK1(27) /* Not 5820 */
#define M_DMA_CTRL_MCR1_INT_EN _DD_MAKEMASK1(29)
#define M_DMA_CTRL_MCR2_INT_EN _DD_MAKEMASK1(30)
#define M_DMA_CTRL_RESET _DD_MAKEMASK1(31)
/* 0x08 DMA Status */
#define M_DMA_STAT_MCR2_EMPTY _DD_MAKEMASK1(24) /* Not 5820 */
#define M_DMA_STAT_MCR1_EMPTY _DD_MAKEMASK1(25) /* Not 5820 */
#define M_DMA_STAT_MCR2_INTR _DD_MAKEMASK1(26)
#define M_DMA_STAT_MCR2_FULL _DD_MAKEMASK1(27)
#define M_DMA_STAT_DMAERR_INTR _DD_MAKEMASK1(28)
#define M_DMA_STAT_MCR1_INTR _DD_MAKEMASK1(29)
#define M_DMA_STAT_MCR1_FULL _DD_MAKEMASK1(30)
#define M_DMA_STAT_MSTR_ACCESS _DD_MAKEMASK1(31)
/* 0x0C DMA Error Address */
#define M_DMA_ERR_RD_FAULT _DD_MAKEMASK1(1)
#define M_DMA_ERR_ADDR 0xFFFFFFFC
/* Master Command Record Header Format */
#define S_MCR_NUM_PACKETS 0
#define M_MCR_NUM_PACKETS _DD_MAKEMASK(16,S_MCR_NUM_PACKETS)
#define V_MCR_NUM_PACKETS(x) _DD_MAKEVALUE(x,S_MCR_NUM_PACKETS)
#define G_MCR_NUM_PACKETS(x) _DD_GETVALUE(x,S_MCR_NUM_PACKETS,M_MCR_NUM_PACKETS)
/* Input flags */
#define M_MCR_SUPPRESS_INTR _DD_MAKEMASK1(31)
/* Output flags */
#define M_MCR_DONE _DD_MAKEMASK1(16)
#define M_MCR_ERROR _DD_MAKEMASK1(17)
#define S_MCR_ERROR_CODE 24
#define M_MCR_ERROR_CODE _DD_MAKEMASK(8,S_MCR_ERROR_CODE)
#define V_MCR_ERROR_CODE(x) _DD_MAKEVALUE(x,S_MCR_ERROR_CODE)
#define G_MCR_ERROR_CODE(x) _DD_GETVALUE(x,S_MCR_ERROR_CODE,M_MCR_ERROR_CODE)
#define K_MCR_ERROR_OK 0
#define K_MCR_ERROR_UNKNOWN_OP 1
#define K_MCR_ERROR_DSA_SHORT 2
#define K_MCR_ERROR_PKI_SHORT 3
#define K_MCR_ERROR_PKO_SHORT 4 /* Not 5820 */
#define K_MCR_ERROR_CHAIN_SHORT 5 /* Not 5820 */
#define K_MCR_ERROR_FIFO 6 /* Not 5820 */
/* In both cases, the header word is followed by an array of N PD entries:
commandContext[0]
dataBuffer[0]
pktLen[0]
outputBuffer[0]
...
commandContext[n-1]
dataBuffer[n-1]
pktLen[n-1]
outputBuffer[n-1]
*/
#define MCR_WORDS(n) (1+8*(n))
#define MCR_BYTES(n) ((1+8*(n))*4)
/* Data Buffer Chain Entry Offsets */
#define DBC_ADDR 0
#define DBC_NEXT 4
#define DBC_LEN 8
#define CHAIN_WORDS 3
#define S_DBC_DATA_LEN 0
#define M_DBC_DATA_LEN _DD_MAKEMASK(16,S_DBC_DATA_LEN)
#define V_DBC_DATA_LEN(x) _DD_MAKEVALUE(x,S_DBC_DATA_LEN)
#define G_DBC_DATA_LEN(x) _DD_GETVALUE(x,S_DBC_DATA_LEN,M_DBC_DATA_LEN)
/* Packet Descriptor Offsets */
#define PD_CC_ADDR 0
#define PD_INPUT_FRAG 4
#define PD_INPUT_FRAG_ADDR (PD_INPUT_FRAG+DBC_ADDR)
#define PD_INPUT_FRAG_NEXT (PD_INPUT_FRAG+DBC_NEXT)
#define PD_INPUT_FRAG_LEN (PD_INPUT_FRAG+DBC_LEN)
#define PD_PKT_LEN 16
#define PD_OUTPUT_FRAG 20
#define PD_OUTPUT_FRAG_ADDR (PD_OUTPUT_FRAG+DBC_ADDR)
#define PD_OUTPUT_FRAG_NEXT (PD_OUTPUT_FRAG+DBC_NEXT)
#define PD_OUTPUT_FRAG_LEN (PD_OUTPUT_FRAG+DBC_LEN)
#define PD_SIZE 32
#define S_PD_PKT_LEN 16
#define M_PD_PKT_LEN _DD_MAKEMASK(16,S_PD_PKT_LEN)
#define V_PD_PKT_LEN(x) _DD_MAKEVALUE(x,S_PD_PKT_LEN)
#define G_PD_PKT_LEN(x) _DD_GETVALUE(x,S_PD_PKT_LEN,M_PD_PKT_LEN)
/* Crypotographic Operations */
/* MCR1 only (symmetric) */
#define K_IPSEC_3DES 0x0000 /* Not 5820 */
#define K_SSL_MAC 0x0001
#define K_TLS_HMAC 0x0002
#define K_SSL_3DES 0x0003
#define K_ARC4 0x0004
#define K_HASH 0x0005
/* MCR2 only (asymmetric) */
#define K_DH_PK_GEN 0x0001
#define K_DH_SK_GEN 0x0002
#define K_RSA_PK_OP 0x0003
#define K_RSA_SK_OP 0x0004
#define K_DSA_SIGN 0x0005
#define K_DSA_VERIF 0x0006
#define K_RNG_DIRECT 0x0041
#define K_RNG_SHA1 0x0042
#define K_MOD_ADD 0x0043
#define K_MOD_SUB 0x0044
#define K_MOD_MUL 0x0045
#define K_MOD_REDUCE 0x0046
#define K_MOD_EXP 0x0047
#define K_MOD_INV 0x0048 /* Not 5821 */
#define K_MOD_2EXP 0x0049 /* Not 5820 */
/* Command Context Header */
/* Word 0 */
#define S_CC_OPCODE 16
#define M_CC_OPCODE _DD_MAKEMASK(16,S_CC_OPCODE)
#define V_CC_OPCODE(x) _DD_MAKEVALUE(x,S_CC_OPCODE)
#define G_CC_OPCODE(x) _DD_GETVALUE(x,S_CC_OPCODE,M_CC_OPCODE)
#define S_CC_LEN 0
#define M_CC_LEN _DD_MAKEMASK(16,S_CC_LEN)
#define V_CC_LEN(x) _DD_MAKEVALUE(x,S_CC_LEN)
#define G_CC_LEN(x) _DD_GETVALUE(x,S_CC_LEN,M_CC_LEN)
/* Word 1 */
#define S_CC_FLAGS 12
#define M_CC_FLAGS _DD_MAKEMASK(4,S_CC_FLAGS)
#define V_CC_FLAGS(x) _DD_MAKEVALUE(x,S_CC_FLAGS)
#define G_CC_FLAGS(x) _DD_GETVALUE(x,S_CC_OPCODE,M_CC_OPCODE)
/* The remaining command context fields depend on the opcode. */
/* IPSEC 3DES (K_IPSEC_3DES) */
/* SSL MAC (K_SSL_MAC) */
/* TLS HMAC (K_TLS_HMAC) */
/* Pure MD5/SHA-1 Hash (K_HASH) */
#define K_HASH_FLAGS_MD5 1
#define K_HASH_FLAGS_SHA1 2
/* SSL MAC (K_SSL_MAC) */
#define SSL_MAC_CMD_WORDS 22
/* TLS HMAC (K_TLS_HMAC) */
#define TLS_HMAC_CMD_WORDS 16
/* Pure MD5/SHA-1 Hash (K_HASH) */
/* SSL/TLS DES/3DES (K_SSL_3DES) */
/* ARCFOUR (K_ARC4) */
#define ARC4_STATE_WORDS (1 + 256/4)
#define ARC4_CMD_WORDS (2 + ARC4_STATE_WORDS)
#define M_ARC4_FLAGS_KEY _DD_MAKEMASK1(10)
#define M_ARC4_FLAGS_WRITEBACK _DD_MAKEMASK1(11)
#define M_ARC4_FLAGS_NULLDATA _DD_MAKEMASK1(12)
/* Random number generation (K_RNG_DIRECT, K_RNG_SHA1) */
/* Modular arithmetic (K_MOD_ADD, K_MOD_SUB, K_MOD_MUL) */
/* Modular Remainder (K_MOD_REDUCE) */
/* Modular Exponentiation (K_MOD_EXP) */
/* Double Modular Exponentiation (K_MOD_2EXP) */
#endif /* _BCM_5821_H_ */
|