1/*	$NetBSD: icpreg.h,v 1.6 2008/04/28 20:23:50 martin 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 ICP_IC_HEADER_BYTES	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 */
183struct 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 */
195struct 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 */
203struct 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 */
210struct 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 */
218struct 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
226struct 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. */
236struct 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. */
265struct 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. */
273struct 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
292struct icp_sg {
293	u_int32_t	sg_addr;
294	u_int32_t	sg_len;
295} __packed;
296
297struct 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
306struct 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
313struct icp_screencmd {
314	u_int32_t	sc_msghandle;
315	u_int32_t	sc_msgaddr;
316} __packed;
317
318struct 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
338struct 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
344struct 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