1 /*	$OpenBSD: twereg.h,v 1.7 2003/06/02 19:24:22 mickey Exp $	*/
2 
3 /*
4  * Copyright (c) 2000 Michael Shalayeff
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
20  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
25  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26  * THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 /*
29  * most of the meaning for registers were taken from
30  * freebsd driver, which in turn got 'em from linux.
31  * it seems those got 'em from windows driver, in it's turn.
32  */
33 
34 
35 /* general parameters */
36 #define	TWE_MAX_UNITS		16
37 #define	TWE_MAXOFFSETS		62
38 #define	TWE_MAXCMDS		255
39 #define	TWE_SECTOR_SIZE		512
40 #define	TWE_ALIGN		512
41 #define	TWE_MAXFER		(TWE_MAXOFFSETS * PAGE_SIZE)
42 
43 /* registers */
44 #define	TWE_CONTROL		0x00
45 #define		TWE_CTRL_CHOSTI	0x00080000	/* clear host int */
46 #define		TWE_CTRL_CATTNI	0x00040000	/* clear attention int */
47 #define		TWE_CTRL_MCMDI	0x00020000	/* mask cmd int */
48 #define		TWE_CTRL_MRDYI	0x00010000	/* mask ready int */
49 #define		TWE_CTRL_ECMDI	0x00008000	/* enable cmd int */
50 #define		TWE_CTRL_ERDYI	0x00004000	/* enable ready int */
51 #define		TWE_CTRL_CERR	0x00000200	/* clear error status */
52 #define		TWE_CTRL_SRST	0x00000100	/* soft reset */
53 #define		TWE_CTRL_EINT	0x00000080	/* enable ints */
54 #define		TWE_CTRL_MINT	0x00000040	/* mask ints */
55 #define		TWE_CTRL_HOSTI	0x00000020	/* generate host int */
56 #define	TWE_STATUS		0x04
57 #define		TWE_STAT_MAJV	0xf0000000
58 #define		TWE_MAJV(st)	(((st) >> 28) & 0xf)
59 #define		TWE_STAT_MINV	0x0f000000
60 #define		TWE_MINV(st)	(((st) >> 24) & 0xf)
61 #define		TWE_STAT_PCIPAR	0x00800000
62 #define		TWE_STAT_QUEUEE	0x00400000
63 #define		TWE_STAT_CPUERR	0x00200000
64 #define		TWE_STAT_PCIABR	0x00100000
65 #define		TWE_STAT_HOSTI	0x00080000
66 #define		TWE_STAT_ATTNI	0x00040000
67 #define		TWE_STAT_CMDI	0x00020000
68 #define		TWE_STAT_RDYI	0x00010000
69 #define		TWE_STAT_CQF	0x00008000	/* cmd queue full */
70 #define		TWE_STAT_RQE	0x00004000	/* ready queue empty */
71 #define		TWE_STAT_CPURDY	0x00002000	/* cpu ready */
72 #define		TWE_STAT_CQR	0x00001000	/* cmd queue ready */
73 #define		TWE_STAT_FLAGS	0x00fff000	/* mask out other stuff */
74 #define		TWE_STAT_BITS	"\020\015cqr\016cpurdy\017rqe\20cqf"	\
75     "\021rdyi\022cmdi\023attni\024hosti\025pciabr\026cpuerr\027queuee\030pcipar"
76 
77 #define	TWE_COMMANDQUEUE	0x08
78 	/*
79 	 * the segs offset is encoded into upper 3 bits of the opcode.
80 	 * i bet other bits mean something too
81 	 * upper 8 bits is the command size in 32bit words.
82 	 */
83 #define		TWE_CMD_NOP	0x0200
84 #define		TWE_CMD_INIT	0x0301
85 #define		TWE_CMD_READ	0x0362
86 #define		TWE_CMD_WRITE	0x0363
87 #define		TWE_CMD_RDVRFY	0x0364
88 #define		TWE_CMD_VERIFY	0x0365
89 #define		TWE_CMD_ZRFUNIT	0x0208
90 #define		TWE_CMD_RPLUNIT	0x0209
91 #define		TWE_CMD_HOTSWAP	0x020a
92 #define		TWE_CMD_SETATA	0x020c
93 #define		TWE_CMD_FLUSH	0x020e
94 #define		TWE_CMD_ABORT	0x020f
95 #define		TWE_CMD_QSTAT	0x0210
96 #define		TWE_CMD_GPARAM	0x0252
97 #define		TWE_CMD_SPARAM	0x0253
98 #define		TWE_CMD_NEWUNIT	0x0214
99 #define		TWE_CMD_DELUNIT	0x0215
100 #define		TWE_CMD_RBLUNIT	0x0217	/* rebuild */
101 #define		TWE_CMD_SECINF	0x021a
102 #define		TWE_CMD_AEN	0x021c
103 #define		TWE_CMD_CMDPK	0x021d
104 #define	TWE_READYQUEUE		0x0c
105 #define		TWE_READYID(u)	(((u) >> 4) & 0xff)
106 
107 /*
108  * From 3ware's documentation:
109  *
110  *   All parameters maintained by the controller are grouped into related
111  *   tables.  Tables are are accessed indirectly via get and set parameter
112  *   commands.  To access a specific parameter in a table, the table ID and
113  *   parameter index are used to uniquely identify a parameter.  Table
114  *   0xffff is the directory table and provides a list of the table IDs and
115  *   sizes of all other tables.  Index zero in each table specifies the
116  *   entire table, and index one specifies the size of the table.  An entire
117  *   table can be read or set by using index zero.
118  */
119 
120 /* get/set param table ids */
121 #define	TWE_PARAM_ALL	0x000	/* everything */
122 #define	TWE_PARAM_DSUM	0x002	/* drive summary */
123 #define	TWE_PARAM_UC	0x003	/* unit config */
124 #define	TWE_PARAM_DC	0x200	/* + 15 -- drive config (doc says 0x100) */
125 #define	TWE_PARAM_UI	0x300	/* + 16 -- unit information */
126 #define	TWE_PARAM_AEN	0x401
127 #define	TWE_PARAM_VER	0x402	/* version info */
128 #define	TWE_PARAM_CTRL	0x403	/* controller info */
129 #define	TWE_PARAM_FTRS	0x404	/* features */
130 #define	TWE_PARAM_DIR	0xffff	/* param table directory */
131 
132 #define	TWE_AEN_QEMPTY	0x0000
133 #define	TWE_AEN_SRST	0x0001	/* soft reset */
134 #define	TWE_AEN_DMIRROR	0x0002	/* degraded mirror */
135 #define	TWE_AEN_CERROR	0x0003	/* controller error */
136 #define	TWE_AEN_RBFAIL	0x0004	/* rebuild failed */
137 #define	TWE_AEN_RBDONE	0x0005	/* rebuild done */
138 #define	TWE_AEN_ILLUN	0x0006	/* incompatible unit */
139 #define	TWE_AEN_INDONE	0x0007	/* init done */
140 #define	TWE_AEN_DSHUT	0x0008	/* unclean shutdown */
141 #define	TWE_AEN_APORT	0x0009	/* aport timeout */
142 #define	TWE_AEN_DRVERR	0x000a	/* drive error */
143 #define	TWE_AEN_RBSTART	0x000b	/* rebuild start */
144 #define	TWE_AEN_ISTART	0x000c	/* init started */
145 #define	TWE_AEN_TUN	0x0015	/* table undefined */
146 /*	TWE_AEN_	0x0000	 * dunno what this is (yet) */
147 #define	TWE_AEN_QFULL	0x00ff
148 
149 #pragma pack(1)
150 
151 /* struct definitions */
152 struct twe_param {
153 	u_int16_t	table_id;
154 	u_int8_t	param_id;
155 	u_int8_t	param_size;
156 	u_int8_t	data[1];
157 };
158 
159 struct twe_segs {
160 	u_int32_t twes_addr;
161 	u_int32_t twes_len;
162 };
163 
164 struct twe_cmd {
165 	u_int16_t	cmd_op;
166 	u_int8_t	cmd_index;
167 	u_int8_t	cmd_unit_host;
168 #define	TWE_UNITHOST(u, h)	(((u) & 0xf) | ((h) << 4))
169 	u_int8_t	cmd_status;
170 	u_int8_t	cmd_flags;
171 #define	TWE_FLAGS_CACHEDISABLE		0x01
172 	union {
173 		struct {
174 			u_int16_t	count;
175 			u_int32_t	lba;
176 			struct twe_segs	segs[TWE_MAXOFFSETS];
177 			u_int32_t	pad;
178 		} _cmd_io;
179 #define	cmd_io		_._cmd_io
180 		struct {
181 			u_int16_t	count;
182 			struct twe_segs	segs[TWE_MAXOFFSETS];
183 		} _cmd_param;
184 #define	cmd_param	_._cmd_param
185 		struct {
186 			u_int16_t	msgcr;
187 			u_int32_t	rdy_q_ptr;
188 		} _cmd_init;
189 #define	cmd_init	_._cmd_init
190 		struct {
191 			u_int8_t	action;
192 #define	TWE_HSWAP_REMOVE	0
193 #define	TWE_HSWAP_ADDCBOD	1
194 #define	TWE_HSWAP_ADDSPARE	2
195 			u_int8_t	port;
196 		} _cmd_aport;
197 #define	cmd_hswap	_._cmd_hswap
198 		struct {
199 			u_int8_t	feature;
200 #define	TWE_ATA_WCE	0x02
201 #define	TWE_ATA_NWCE	0x82
202 			u_int8_t	mode;
203 			u_int16_t	units;
204 			u_int16_t	persist;
205 		} _cmd_ata;
206 #define	cmd_ata		_._cmd_ata
207 		u_int16_t	cmd_status;
208 		struct {
209 			u_int8_t	action;
210 #define	TWE_REBUILD_NOP		0
211 #define	TWE_REBUILD_STOP	2
212 #define	TWE_REBUILD_START	4
213 #define	TWE_REBUILD_STARTU	5
214 #define	TWE_REBUILD_CS		0x80
215 			u_int8_t	subunit;	/* raid10 lu rebuild */
216 		} _cmd_rebuild;
217 #define	cmd_rebuild	_._cmd_rebuild
218 	} _;
219 };	/* 512 bytes */
220 
221 #pragma pack()
222