1 | /* $NetBSD: icpreg.h,v 1.7 2008/09/08 23:36:54 gmcgarry Exp $ */ |
2 | |
3 | /*- |
4 | * Copyright (c) 2002 The NetBSD Foundation, Inc. |
5 | * All rights reserved. |
6 | * |
7 | * This code is derived from software contributed to The NetBSD Foundation |
8 | * by Andrew Doran. |
9 | * |
10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions |
12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. |
15 | * 2. Redistributions in binary form must reproduce the above copyright |
16 | * notice, this list of conditions and the following disclaimer in the |
17 | * documentation and/or other materials provided with the distribution. |
18 | * |
19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |
20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
29 | * POSSIBILITY OF SUCH DAMAGE. |
30 | */ |
31 | |
32 | /* |
33 | * Copyright (c) 1999, 2000 Niklas Hallqvist. All rights reserved. |
34 | * |
35 | * Redistribution and use in source and binary forms, with or without |
36 | * modification, are permitted provided that the following conditions |
37 | * are met: |
38 | * 1. Redistributions of source code must retain the above copyright |
39 | * notice, this list of conditions and the following disclaimer. |
40 | * 2. Redistributions in binary form must reproduce the above copyright |
41 | * notice, this list of conditions and the following disclaimer in the |
42 | * documentation and/or other materials provided with the distribution. |
43 | * 3. All advertising materials mentioning features or use of this software |
44 | * must display the following acknowledgement: |
45 | * This product includes software developed by Niklas Hallqvist. |
46 | * 4. The name of the author may not be used to endorse or promote products |
47 | * derived from this software without specific prior written permission. |
48 | * |
49 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
50 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
51 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
52 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
53 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
54 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
55 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
56 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
57 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
58 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
59 | * |
60 | * from OpenBSD: gdtreg.h,v 1.1 2000/02/07 00:33:03 niklas Exp |
61 | */ |
62 | |
63 | #ifndef _IC_ICPREG_H_ |
64 | #define _IC_ICPREG_H_ |
65 | |
66 | #define ICP_MAXBUS 6 /* XXX Why not 5? */ |
67 | #define ICP_MAX_LDRIVES 255 /* max logical drive count */ |
68 | #define ICP_MAX_HDRIVES 100 /* max host drive count */ |
69 | #define ICP_MAXID_FC 127 /* Fibre-channel maximum ID */ |
70 | #define ICP_MAXOFFSETS 128 |
71 | #define ICP_MAXSG 17 /* Max. s/g elements; actually 128 */ |
72 | #define ICP_PROTOCOL_VERSION 1 |
73 | #define ICP_LINUX_OS 8 /* Used for cache optimization */ |
74 | #define ICP_SCATTER_GATHER 1 /* s/g feature */ |
75 | #define ICP_SECS32 0x1f /* round capacity */ |
76 | #define ICP_LOCALBOARD 0 /* Board node always 0 */ |
77 | #define ICP_MAX_CMDS 124 |
78 | #define ICP_SECTOR_SIZE 0x200 /* Always 512 bytes for cache devs */ |
79 | #define ICP_MAX_EVENTS 0x100 /* event buffer */ |
80 | |
81 | /* DPMEM constants */ |
82 | #define ICP_MPR_MAGIC 0xc0ffee11 |
83 | #define 48 |
84 | #define ICP_IC_QUEUE_BYTES 4 |
85 | |
86 | /* Cache/raw service commands */ |
87 | #define ICP_INIT 0 /* service initialization */ |
88 | #define ICP_READ 1 /* read command */ |
89 | #define ICP_WRITE 2 /* write command */ |
90 | #define ICP_INFO 3 /* information about devices */ |
91 | #define ICP_FLUSH 4 /* flush dirty cache buffers */ |
92 | #define ICP_IOCTL 5 /* ioctl command */ |
93 | #define ICP_DEVTYPE 9 /* additional information */ |
94 | #define ICP_MOUNT 10 /* mount cache device */ |
95 | #define ICP_UNMOUNT 11 /* unmount cache device */ |
96 | #define ICP_SET_FEAT 12 /* set features (scatter/gather) */ |
97 | #define ICP_GET_FEAT 13 /* get features */ |
98 | #define ICP_WRITE_THR 16 /* write through */ |
99 | #define ICP_READ_THR 17 /* read through */ |
100 | #define ICP_EXT_INFO 18 /* extended info */ |
101 | #define ICP_RESET 19 /* controller reset */ |
102 | #define ICP_FREEZE_IO 25 /* freeze all IOs */ |
103 | #define ICP_UNFREEZE_IO 26 /* unfreeze all IOs */ |
104 | |
105 | /* Additional raw service commands */ |
106 | #define ICP_RESERVE 14 /* reserve device to raw service */ |
107 | #define ICP_RELEASE 15 /* release device */ |
108 | #define ICP_RESERVE_ALL 16 /* reserve all devices */ |
109 | #define ICP_RELEASE_ALL 17 /* release all devices */ |
110 | #define ICP_RESET_BUS 18 /* reset bus */ |
111 | #define ICP_SCAN_START 19 /* start device scan */ |
112 | #define ICP_SCAN_END 20 /* stop device scan */ |
113 | |
114 | /* IOCTL command defines */ |
115 | #define ICP_SCSI_DR_INFO 0x00 /* SCSI drive info */ |
116 | #define ICP_SCSI_CHAN_CNT 0x05 /* SCSI channel count */ |
117 | #define ICP_SCSI_DR_LIST 0x06 /* SCSI drive list */ |
118 | #define ICP_SCSI_DEF_CNT 0x15 /* grown/primary defects */ |
119 | #define ICP_DSK_STATISTICS 0x4b /* SCSI disk statistics */ |
120 | #define ICP_IOCHAN_DESC 0x5d /* description of IO channel */ |
121 | #define ICP_IOCHAN_RAW_DESC 0x5e /* description of raw IO channel */ |
122 | |
123 | #define ICP_L_CTRL_PATTERN 0x20000000 /* SCSI IOCTL mask */ |
124 | #define ICP_ARRAY_INFO 0x12 /* array drive info */ |
125 | #define ICP_ARRAY_DRV_LIST 0x0f /* array drive list */ |
126 | #define ICP_LA_CTRL_PATTERN 0x10000000 /* array IOCTL mask */ |
127 | #define ICP_CACHE_DRV_CNT 0x01 /* cache drive count */ |
128 | #define ICP_CACHE_DRV_LIST 0x02 /* cache drive list */ |
129 | #define ICP_CACHE_INFO 0x04 /* cache info */ |
130 | #define ICP_CACHE_CONFIG 0x05 /* cache configuration */ |
131 | #define ICP_CACHE_DRV_INFO 0x07 /* cache drive info */ |
132 | #define ICP_BOARD_FEATURES 0x15 /* controller features */ |
133 | #define ICP_BOARD_INFO 0x28 /* controller info */ |
134 | #define ICP_HOST_GET 0x10001 /* get host drive list */ |
135 | #define ICP_IO_CHANNEL 0x20000 /* default IO channel */ |
136 | #define ICP_INVALID_CHANNEL 0xffff /* invalid channel */ |
137 | |
138 | /* Service errors */ |
139 | #define ICP_S_MSG_REQUEST 0 /* screen service: async evt message */ |
140 | #define ICP_S_OK 1 /* no error */ |
141 | #define ICP_S_BSY 7 /* controller busy */ |
142 | #define ICP_S_RAW_SCSI 12 /* raw service: target error */ |
143 | #define ICP_S_RAW_ILL 0xff /* raw service: illegal */ |
144 | #define ICP_S_NO_STATUS 0x1000 /* got no status (driver-generated) */ |
145 | |
146 | /* Controller services */ |
147 | #define ICP_SCSIRAWSERVICE 3 |
148 | #define ICP_CACHESERVICE 9 |
149 | #define ICP_SCREENSERVICE 11 |
150 | |
151 | /* Data direction raw service. */ |
152 | #define ICP_DATA_IN 0x01000000 |
153 | #define ICP_DATA_OUT 0x00000000 |
154 | |
155 | /* Command queue entries */ |
156 | #define ICP_OFFSET 0x00 /* u_int16_t, command offset in the DP RAM */ |
157 | #define ICP_SERV_ID 0x02 /* u_int16_t, service */ |
158 | #define ICP_COMM_Q_SZ 0x04 |
159 | |
160 | /* Interface area */ |
161 | #define ICP_S_CMD_INDX 0x00 /* u_int8_t, special command */ |
162 | #define ICP_S_STATUS 0x01 /* volatile u_int8_t, status special command */ |
163 | #define ICP_S_INFO 0x04 /* u_int32_t [4], add. info special command */ |
164 | #define ICP_SEMA0 0x14 /* volatile u_int8_t, command semaphore */ |
165 | #define ICP_CMD_INDEX 0x18 /* u_int8_t, command number */ |
166 | #define ICP_STATUS 0x1c /* volatile u_int16_t, command status */ |
167 | #define ICP_SERVICE 0x1e /* u_int16_t, service (for asynch. events) */ |
168 | #define ICP_DPR_INFO 0x20 /* u_int32_t [2], additional info */ |
169 | #define ICP_COMM_QUEUE 0x28 /* command queue */ |
170 | #define ICP_DPR_CMD (0x30 + ICP_MAXOFFSETS * ICP_COMM_Q_SZ) |
171 | /* u_int8_t [], commands */ |
172 | #define ICP_DPR_IF_SZ ICP_DPR_CMD |
173 | |
174 | /* Get cache info */ |
175 | #define ICP_CINFO_CPAR 0x00 |
176 | #define ICP_CINFO_CSTAT 0x0c |
177 | |
178 | /* Other defines */ |
179 | #define ICP_ASYNCINDEX 0 /* command index asynchronous event */ |
180 | #define ICP_SPEZINDEX 1 /* command index unknown service */ |
181 | |
182 | /* I/O channel header */ |
183 | struct icp_ioc_version { |
184 | u_int32_t iv_version; /* version (~0: newest) */ |
185 | u_int8_t iv_listents; /* list entry count */ |
186 | u_int8_t iv_firstchan; /* first channel number */ |
187 | u_int8_t iv_lastchan; /* last channel number */ |
188 | u_int8_t iv_chancount; /* channel count */ |
189 | u_int32_t iv_listoffset; /* offset of list[0] */ |
190 | } __packed; |
191 | |
192 | #define ICP_IOC_NEWEST 0xffffffff |
193 | |
194 | /* Get I/O channel description */ |
195 | struct icp_ioc { |
196 | u_int32_t io_addr; /* channel address */ |
197 | u_int8_t io_type; /* type (SCSI/FCAL) */ |
198 | u_int8_t io_localno; /* local number */ |
199 | u_int16_t io_features; /* channel features */ |
200 | } __packed; |
201 | |
202 | /* Get raw I/O channel description */ |
203 | struct icp_rawioc { |
204 | u_int8_t ri_procid; /* processor ID */ |
205 | u_int8_t ri_defect; /* defect? */ |
206 | u_int16_t ri_padding; |
207 | } __packed; |
208 | |
209 | /* Get SCSI channel count */ |
210 | struct icp_getch { |
211 | u_int32_t gc_channo; /* channel number */ |
212 | u_int32_t gc_drivecnt; /* drive count */ |
213 | u_int8_t gc_scsiid; /* SCSI initiator ID */ |
214 | u_int8_t gc_scsistate; /* SCSI processor state */ |
215 | } __packed; |
216 | |
217 | /* Cache info/config IOCTL structures */ |
218 | struct icp_cpar { |
219 | u_int32_t cp_version; /* firmware version */ |
220 | u_int16_t cp_state; /* cache state (on/off) */ |
221 | u_int16_t cp_strategy; /* cache strategy */ |
222 | u_int16_t cp_write_back; /* write back (on/off) */ |
223 | u_int16_t cp_block_size; /* cache block size */ |
224 | } __packed; |
225 | |
226 | struct icp_cstat { |
227 | u_int32_t cs_size; /* cache size */ |
228 | u_int32_t cs_readcnt; /* read counter */ |
229 | u_int32_t cs_writecnt; /* write counter */ |
230 | u_int32_t cs_trhits; /* track hits */ |
231 | u_int32_t cs_sechits; /* sector hits */ |
232 | u_int32_t cs_secmiss; /* sector misses */ |
233 | } __packed; |
234 | |
235 | /* Board information. */ |
236 | struct icp_binfo { |
237 | u_int32_t bi_ser_no; /* serial number */ |
238 | u_int8_t bi_oem_id[2]; /* OEM ID */ |
239 | u_int16_t bi_ep_flags; /* eprom flags */ |
240 | u_int32_t bi_proc_id; /* processor ID */ |
241 | u_int32_t bi_memsize; /* memory size (bytes) */ |
242 | u_int8_t bi_mem_banks; /* memory banks */ |
243 | u_int8_t bi_chan_type; /* channel type */ |
244 | u_int8_t bi_chan_count; /* channel count */ |
245 | u_int8_t bi_rdongle_pres; /* dongle present */ |
246 | u_int32_t bi_epr_fw_ver; /* (eprom) firmware ver */ |
247 | u_int32_t bi_upd_fw_ver; /* (update) firmware ver */ |
248 | u_int32_t bi_upd_revision; /* update revision */ |
249 | char bi_type_string[16]; /* char controller name */ |
250 | char bi_raid_string[16]; /* char RAID firmware name */ |
251 | u_int8_t bi_update_pres; /* update present? */ |
252 | u_int8_t bi_xor_pres; /* XOR engine present */ |
253 | u_int8_t bi_prom_type; /* ROM type (eprom/flash) */ |
254 | u_int8_t bi_prom_count; /* number of ROM devices */ |
255 | u_int32_t bi_dup_pres; /* duplexing module pres? */ |
256 | u_int32_t bi_chan_pres; /* # of exp. channels */ |
257 | u_int32_t bi_mem_pres; /* memory expansion inst? */ |
258 | u_int8_t bi_ft_bus_system; /* fault bus supported? */ |
259 | u_int8_t bi_subtype_valid; /* board_subtype valid */ |
260 | u_int8_t bi_board_subtype; /* subtype/hardware level */ |
261 | u_int8_t bi_rampar_pres; /* RAM parity check hw? */ |
262 | } __packed; |
263 | |
264 | /* Board features. */ |
265 | struct icp_bfeat { |
266 | u_int8_t bf_chaining; /* chaining supported */ |
267 | u_int8_t bf_striping; /* striping (RAID-0) supported */ |
268 | u_int8_t bf_mirroring; /* mirroring (RAID-1) supported */ |
269 | u_int8_t bf_raid; /* RAID-4/5/10 supported */ |
270 | } __packed; |
271 | |
272 | /* Cache drive information. */ |
273 | struct icp_cdevinfo { |
274 | char cd_name[8]; |
275 | u_int32_t cd_devtype; |
276 | u_int32_t cd_ldcnt; |
277 | u_int32_t cd_last_error; |
278 | u_int8_t cd_initialized; |
279 | u_int8_t cd_removable; |
280 | u_int8_t cd_write_protected; |
281 | u_int8_t cd_flags; |
282 | u_int32_t ld_blkcnt; |
283 | u_int32_t ld_blksize; |
284 | u_int32_t ld_dcnt; |
285 | u_int32_t ld_slave; |
286 | u_int32_t ld_dtype; |
287 | u_int32_t ld_last_error; |
288 | char ld_name[8]; |
289 | u_int8_t ld_error; |
290 | } __packed; |
291 | |
292 | struct icp_sg { |
293 | u_int32_t sg_addr; |
294 | u_int32_t sg_len; |
295 | } __packed; |
296 | |
297 | struct icp_cachecmd { |
298 | u_int16_t cc_deviceno; |
299 | u_int32_t cc_blockno; |
300 | u_int32_t cc_blockcnt; |
301 | u_int32_t cc_addr; /* ~0 == s/g */ |
302 | u_int32_t cc_nsgent; |
303 | struct icp_sg cc_sg[ICP_MAXSG]; |
304 | } __packed; |
305 | |
306 | struct icp_ioctlcmd { |
307 | u_int16_t ic_bufsize; |
308 | u_int32_t ic_subfunc; |
309 | u_int32_t ic_channel; |
310 | u_int32_t ic_addr; |
311 | } __packed; |
312 | |
313 | struct icp_screencmd { |
314 | u_int32_t sc_msghandle; |
315 | u_int32_t sc_msgaddr; |
316 | } __packed; |
317 | |
318 | struct icp_rawcmd { |
319 | u_int16_t rc_padding0; /* unused */ |
320 | u_int32_t rc_direction; /* data direction */ |
321 | u_int32_t rc_mdisc_time; /* disc. time (0: none) */ |
322 | u_int32_t rc_mcon_time; /* conn. time (0: none) */ |
323 | u_int32_t rc_sdata; /* dest address */ |
324 | u_int32_t rc_sdlen; /* data length */ |
325 | u_int32_t rc_clen; /* CDB length */ |
326 | u_int8_t rc_cdb[12]; /* SCSI CDB */ |
327 | u_int8_t rc_target; /* target ID */ |
328 | u_int8_t rc_lun; /* LUN */ |
329 | u_int8_t rc_bus; /* channel */ |
330 | u_int8_t rc_priority; /* priority; 0 only */ |
331 | u_int32_t rc_sense_len; /* sense length */ |
332 | u_int32_t rc_sense_addr; /* sense address */ |
333 | u_int32_t rc_padding1; /* unused */ |
334 | u_int32_t rc_nsgent; /* s/g element count */ |
335 | struct icp_sg rc_sg[ICP_MAXSG]; /* s/g list */ |
336 | } __packed; |
337 | |
338 | struct icp_cmdhdr { |
339 | u_int32_t cmd_boardnode; /* always 0 */ |
340 | u_int32_t cmd_cmdindex; /* command identifier */ |
341 | u_int16_t cmd_opcode; |
342 | } __packed; |
343 | |
344 | struct icp_cmd { |
345 | u_int32_t cmd_boardnode; /* always 0 */ |
346 | u_int32_t cmd_cmdindex; /* command identifier */ |
347 | u_int16_t cmd_opcode; |
348 | |
349 | union { |
350 | struct icp_rawcmd rc; |
351 | struct icp_screencmd sc; |
352 | struct icp_ioctlcmd ic; |
353 | struct icp_cachecmd cc; |
354 | } cmd_packet; |
355 | } __packed; |
356 | |
357 | #endif /* !_IC_ICPREG_H_ */ |
358 | |