FreeBSD/Linux Kernel Cross Reference
sys/dev/ic/twereg.h
1 /* $OpenBSD: twereg.h,v 1.9 2008/09/01 17:30:56 deraadt 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 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 /* struct definitions */
150 struct twe_param {
151 u_int16_t table_id;
152 u_int8_t param_id;
153 u_int8_t param_size;
154 u_int8_t data[1];
155 } __packed;
156
157 struct twe_segs {
158 u_int32_t twes_addr;
159 u_int32_t twes_len;
160 } __packed;
161
162 struct twe_cmd {
163 u_int16_t cmd_op;
164 u_int8_t cmd_index;
165 u_int8_t cmd_unit_host;
166 #define TWE_UNITHOST(u, h) (((u) & 0xf) | ((h) << 4))
167 u_int8_t cmd_status;
168 u_int8_t cmd_flags;
169 #define TWE_FLAGS_CACHEDISABLE 0x01
170 union {
171 struct {
172 u_int16_t count;
173 u_int32_t lba;
174 struct twe_segs segs[TWE_MAXOFFSETS];
175 u_int32_t pad;
176 } __packed _cmd_io;
177 #define cmd_io _._cmd_io
178 struct {
179 u_int16_t count;
180 struct twe_segs segs[TWE_MAXOFFSETS];
181 } __packed _cmd_param;
182 #define cmd_param _._cmd_param
183 struct {
184 u_int16_t msgcr;
185 u_int32_t rdy_q_ptr;
186 } __packed _cmd_init;
187 #define cmd_init _._cmd_init
188 struct {
189 u_int8_t action;
190 #define TWE_HSWAP_REMOVE 0
191 #define TWE_HSWAP_ADDCBOD 1
192 #define TWE_HSWAP_ADDSPARE 2
193 u_int8_t port;
194 } __packed _cmd_aport;
195 #define cmd_hswap _._cmd_hswap
196 struct {
197 u_int8_t feature;
198 #define TWE_ATA_WCE 0x02
199 #define TWE_ATA_NWCE 0x82
200 u_int8_t mode;
201 u_int16_t units;
202 u_int16_t persist;
203 } __packed _cmd_ata;
204 #define cmd_ata _._cmd_ata
205 u_int16_t cmd_status;
206 struct {
207 u_int8_t action;
208 #define TWE_REBUILD_NOP 0
209 #define TWE_REBUILD_STOP 2
210 #define TWE_REBUILD_START 4
211 #define TWE_REBUILD_STARTU 5
212 #define TWE_REBUILD_CS 0x80
213 u_int8_t subunit; /* raid10 lu rebuild */
214 } __packed _cmd_rebuild;
215 #define cmd_rebuild _._cmd_rebuild
216 } _;
217 } __packed; /* 512 bytes */
Cache object: e7d4a8114b37ef47e7eaa506f8694eaa
|