summaryrefslogtreecommitdiff
path: root/sys/dev/pci/lofnreg.h
blob: c8a76a92feb2665cf34e889fb52c630015ae22b5 (plain)
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
/*	$OpenBSD: lofnreg.h,v 1.15 2003/06/02 19:08:58 jason Exp $	*/

/*
 * Copyright (c) 2001-2002 Jason L. Wright (jason@thought.net)
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * Effort sponsored in part by the Defense Advanced Research Projects
 * Agency (DARPA) and Air Force Research Laboratory, Air Force
 * Materiel Command, USAF, under agreement number F30602-01-2-0537.
 *
 */

#define	LOFN_BAR0		0x0010		/* base address register */

#define	LOFN_WIN_0		0x0000		/* 0 - rev byte, norm word */
#define	LOFN_WIN_1		0x2000		/* 1 - rev byte, rev word */
#define	LOFN_WIN_2		0x4000		/* 2 - norm byte, norm word */
#define	LOFN_WIN_3		0x6000		/* 3 - norm byte, rev word */

/* Bignum registers */
#define	LOFN_REL_DATA		0x0000		/* Data registers */
#define	LOFN_REL_DATA_END	0x07ff
/* Length registers */
#define	LOFN_REL_LEN		0x1000		/* Length tags */
#define	LOFN_REL_LEN_REGS	0x103f
/* RNG FIFO space */
#define	LOFN_REL_RNG		0x1080		/* RNG FIFO start */
#define	LOFN_REL_RNG_END	0x10bf		/* RNG FIFO end */
/* Instruction space */
#define	LOFN_REL_INSTR		0x1100		/* Instructions */
#define	LOFN_REL_INSTR_END	0x117f
/* Control and status registers, relative to window number */
#define	LOFN_REL_CR		0x1fd4		/* Command */
#define	LOFN_REL_SR		0x1fd8		/* Status */
#define	LOFN_REL_IER		0x1fdc		/* Interrupt enable */
#define	LOFN_REL_RNC		0x1fe0		/* RNG config */
#define	LOFN_REL_CFG1		0x1fe4		/* Config1 */
#define	LOFN_REL_CFG2		0x1fe8		/* Config2 */
#define	LOFN_REL_CHIPID		0x1fec		/* Chip ID */

/* Data register access */
#define	LOFN_REG_MASK		0x0f80		/* Register number mask */
#define	LOFN_REG_SHIFT		7
#define	LOFN_WORD_MASK		0x007c		/* Word index mask */
#define	LOFN_WORD_SHIFT		2

/* Command address register (LOFN_REL_CR) */
#define	LOFN_CR_ADDR_MASK	0x0000003f	/* Instruction addr offset */

/* Status register (LOFN_REL_SR) */
#define	LOFN_SR_CARRY		0x00000008	/* Carry from operation */
#define	LOFN_SR_RNG_UF		0x00001000	/* RNG underflow */
#define	LOFN_SR_RNG_RDY		0x00004000	/* RNG ready */
#define	LOFN_SR_DONE		0x00008000	/* Operation done */

/* Interrupt enable register (LOFN_REL_IER) */
#define	LOFN_IER_RDY		0x00004000	/* RNG ready */
#define	LOFN_IER_DONE		0x00008000	/* Operation done */

/* Random number configuration (LOFN_REL_RNC) */
#define	LOFN_RNC_OUTSCALE	0x00000080	/* Output prescalar */
#define	LOFN_RNC_1STSCALE	0x00000f00	/* First prescalar */

/* Config register 1 (LOFN_REL_CFG1) */
#define	LOFN_CFG1_RESET		0x00000001	/* Reset */
#define	LOFN_CFG1_MULTI		0x00000038	/* PLL multiple */
#define	LOFN_CFG1_MULTI_BYP	0x00000000	/*  PLL bypass */
#define	LOFN_CFG1_MULTI_1X	0x00000008	/*  1x CLK */
#define	LOFN_CFG1_MULTI_15X	0x00000010	/*  1.5x CLK */
#define	LOFN_CFG1_MULTI_2X	0x00000018	/*  2x CLK */
#define	LOFN_CFG1_MULTI_25X	0x00000020	/*  2.5x CLK */
#define	LOFN_CFG1_MULTI_3X	0x00000028	/*  3x CLK */
#define	LOFN_CFG1_MULTI_4X	0x00000030	/*  4x CLK */
#define	LOFN_CFG1_CLOCK		0x00000040	/* Clock select */

/* Config register 2 (LOFN_REL_CFG2) */
#define	LOFN_CFG2_RNGENA	0x00000001	/* RNG enable */
#define	LOFN_CFG2_PRCENA	0x00000002	/* Processor enable */

/* Chip identification (LOFN_REL_CHIPID) */
#define	LOFN_CHIPID_MASK	0x0000ffff	/* Chip ID */

#define	LOFN_REGADDR(win,r,idx) 			\
    ((win) |						\
     (((r) << LOFN_REG_SHIFT) & LOFN_REG_MASK) |	\
     (((idx) << LOFN_WORD_SHIFT) & LOFN_WORD_MASK))

#define	LOFN_LENADDR(win,r)				\
    ((win) | (((r) << 2) + LOFN_REL_LEN))

#define	LOFN_LENMASK		0x000007ff	/* mask for length space */

#define	OP_DONE			0x80000000	/* final instruction */
#define	OP_CODE_MASK		0x7c000000	/* opcode mask */
#define	OP_CODE_MODEXP		0x00000000	/*  modular exponentiation */
#define	OP_CODE_MODMUL		0x04000000	/*  modular multiplication */
#define	OP_CODE_MODRED		0x08000000	/*  modular reduction */
#define	OP_CODE_MODADD		0x0c000000	/*  modular addition */
#define	OP_CODE_MODSUB		0x10000000	/*  modular subtraction */
#define	OP_CODE_ADD		0x14000000	/*  addition */
#define	OP_CODE_SUB		0x18000000	/*  subtraction */
#define	OP_CODE_ADDC		0x1c000000	/*  addition with carry */
#define	OP_CODE_SUBC		0x20000000	/*  subtraction with carry */
#define	OP_CODE_MULT		0x24000000	/*  2048bit multiplication */
#define	OP_CODE_SR		0x28000000	/*  shift right */
#define	OP_CODE_SL		0x2c000000	/*  shift left */
#define	OP_CODE_INC		0x30000000	/*  increment */
#define	OP_CODE_DEC		0x34000000	/*  decrement */
#define	OP_CODE_TAG		0x38000000	/*  set length tag */
#define	OP_CODE_NOP		0x7c000000	/*  nop */

#define	OP_RD_SHIFT		21
#define	OP_RA_SHIFT		16
#define	OP_RB_SHIFT		11
#define	OP_RM_SHIFT		6
#define	OP_R_MASK		0x1f
#define	OP_LEN_MASK		0xffff

#define	LOFN_INSTR(done,op,rd,ra,rb,rm) 		\
    ((done) | (op) |					\
     (((rd) & OP_R_MASK) << OP_RD_SHIFT) |		\
     (((ra) & OP_R_MASK) << OP_RA_SHIFT) |		\
     (((rb) & OP_R_MASK) << OP_RB_SHIFT) |		\
     (((rm) & OP_R_MASK) << OP_RM_SHIFT))

#define	LOFN_INSTR2(done,op,rd,ra,len)			\
    ((done) | (op) |					\
     (((rd) & OP_R_MASK) << OP_RD_SHIFT) |		\
     (((ra) & OP_R_MASK) << OP_RA_SHIFT) |		\
     ((len) & OP_LEN_MASK))

/* registers are 1024 bits wide, but must be addressed by word. */
union lofn_reg {
	u_int8_t b[128];
	u_int32_t w[32];
};