xref: /freebsd/sys/dev/ida/idareg.h (revision af23369a6deaaeb612ab266eb88b8bb8d560c322)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 1999,2000 Jonathan Lemon
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 AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30 
31 /*
32  * #defines and software structures for the Compaq RAID card
33  */
34 
35 /*
36  * board register offsets for SMART-2 controllers
37  */
38 #define	R_CMD_FIFO	0x04
39 #define	R_DONE_FIFO	0x08
40 #define	R_INT_MASK	0x0C
41 #define	R_STATUS	0x10
42 #define	R_INT_PENDING	0x14
43 
44 /*
45  * interrupt mask values for SMART series
46  */
47 #define	INT_DISABLE	0x00
48 #define	INT_ENABLE	0x01
49 
50 /*
51  * board offsets for the 42xx series
52  */
53 #define	R_42XX_STATUS	0x30
54 #define	R_42XX_INT_MASK	0x34
55 #define	R_42XX_REQUEST	0x40
56 #define	R_42XX_REPLY	0x44
57 
58 /*
59  * interrupt values for 42xx series
60  */
61 #define	INT_ENABLE_42XX			0x00
62 #define	INT_DISABLE_42XX		0x08
63 #define	STATUS_42XX_INT_PENDING		0x08
64 
65 /*
66  * return status codes
67  */
68 #define	SOFT_ERROR	0x02	/* Non-fatal error. */
69 #define	HARD_ERROR	0x04	/* Fatal error. */
70 #define	INVALID_ERROR	0x10	/* Invalid Request Block. */
71 #define	CMD_REJECTED	0x14
72 
73 /*
74  * command types
75  */
76 #define	CMD_GET_LOG_DRV_INFO	0x10	/* Identify controller */
77 #define	CMD_GET_CTRL_INFO	0x11	/* Identify logical driver */
78 #define	CMD_SENSE_DRV_STATUS	0x12	/* Sense logical drive status */
79 #define	CMD_START_RECOVERY	0x13	/* Start recover */
80 #define	CMD_GET_PHYS_DRV_INFO	0x15	/* Identify physical drive */
81 #define	CMD_BLINK_DRV_LEDS	0x16	/* Blink drive tray LEDs */
82 #define	CMD_SENSE_DRV_LEDS	0x17	/* Sense Blinking drive tray LEDs */
83 #define	CMD_GET_LOG_DRV_EXT	0x18	/* Identify logical drive, Extended */
84 #define	CMD_READ		0x20	/* Read */
85 #define	CMD_WRITE		0x30	/* Write */
86 #define	CMD_WRITE_MEDIA		0x31	/* Write media */
87 #define	CMD_RESET_CTRL		0x40	/* Reset controller */
88 #define	CMD_DIAG_PASS_THRU	0x41	/* ??? */
89 #define	CMD_GET_CONFIG		0x50	/* Sense configuration */
90 #define	CMD_SET_CONFIG		0x51	/* Set configuration */
91 
92 #define	CMD_BYPASS_VOL_STATE	0x52	/* ??? */
93 #define	CMD_SS_CREATE_VOL	0x53	/* ??? */
94 #define	CMD_CHANGE_CONFIG	0x54	/* ??? */
95 #define	CMD_SENSE_ORIG_CONF	0x55	/* ??? */
96 #define	CMD_REORDER_LOG_DRV	0x56	/* ??? */
97 
98 #define	CMD_LABEL_LOG_DRV	0x57	/* Label logical drive */
99 #define	CMD_SS_TO_VOL		0x58	/* ??? */
100 #define	CMD_SET_SURFACE_DELAY	0x60	/* Set surface delay */
101 #define	CMD_SET_OVERHEAT_DELAY	0x61	/* ??? */
102 #define	CMD_SENSE_BUS_PARAMS	0x65	/* Sense bus parameters */
103 #define	CMD_SENSE_SUBSYS_INFO	0x66	/* Sense Subsystem Information */
104 #define	CMD_SENSE_SURFACE_ATS	0x70	/* Sense surface analysis task status */
105 #define	CMD_PASSTHROUGH		0x90	/* Pass-through operation */
106 #define	CMD_PASSTHROUGH_A	0x91	/* ??? */
107 #define	CMD_RESET_SCSI_DEV	0x94	/* Reset SCSI device */
108 #define	CMD_PAUSE_BG_ACT	0x98	/* Pause Background Activity */
109 #define	CMD_RESUME_BG_ACT	0x99	/* Resume Background Activity */
110 #define	CMD_START_FIRMWARE	0x99	/* for integrated RAID */
111 #define	CMD_SENSE_DRV_ERR_LOG	0xa6	/* Sense drive error log */
112 #define	CMD_START_CPM		0xa7	/* Start controller performance monitoring */
113 #define	CMD_SENSE_CP		0xa8	/* Sense controller performance */
114 #define	CMD_STOP_CPM		0xa9	/* Stop controller performance monitoring */
115 #define	CMD_FLUSH_CACHE		0xc2	/* Flush/disable write cache */
116 #define	CMD_COLLECT_BUFFER	0xd2	/* ??? */
117 #define	CMD_ACCEPT_MEDIA_EXCH	0xe0	/* Accept Media Exchange */
118 
119 #define	CMD_FLASH_READ		0xf6	/* Read FLASH */
120 #define	CMD_FLASH_WRITE		0xf7	/* Write FLASH */
121 
122 /* logical drive parameter table */
123 struct ida_drive_param {
124 	u_int16_t	ncylinders;
125 	u_int8_t	nheads;
126 	u_int8_t	signature;
127 	u_int8_t	psectors;
128 	u_int16_t	wprecomp;
129 	u_int8_t	max_acc;
130 	u_int8_t	control;
131 	u_int16_t	pcylinders;
132 	u_int8_t	ptracks;
133 	u_int16_t	landing_zone;
134 	u_int8_t	nsectors;
135 	u_int8_t	checksum;
136 } __packed;
137 
138 #define	IDA_RAID0	0	/* No fault tolerance. */
139 #define	IDA_RAID4	1	/* Data Guard */
140 #define	IDA_RAID1	2	/* Mirroring */
141 #define	IDA_RAID5	3	/* Distributed Data Guard */
142 
143 /*
144  * CMD_GET_LOG_DRV_INFO (0x10)
145  * Identify Logical Drive
146  */
147 struct ida_drive_info {
148 	u_int16_t	secsize;	/* block size in bytes */
149 	u_int32_t	secperunit;	/* blocks available */
150 	struct ida_drive_param	dp;	/* logical drive parameter table */
151 	u_int8_t	mirror;		/* fault tolerance */
152 	u_int8_t	reserved;
153 	u_int8_t	bios_disable;
154 } __packed;
155 
156 /*
157  * CMD_GET_LOG_DRV_EXT (0x18)
158  * Identify Logical Drive, Extended
159  */
160 struct ida_drive_info_ext {
161 	u_int16_t	secsize;	/* block size in bytes */
162 	u_int32_t	secperunit;	/* blocks available */
163 	struct ida_drive_param	dp;	/* logical drive parameter table */
164 	u_int8_t	mirror;		/* fault tolerance */
165 	u_int8_t	reserved;
166 	u_int8_t	bios_disable;
167 	u_int32_t	ld_id;		/* Logical drive identifier */
168 	u_int8_t	ld_label[64];	/* Logical drive label */
169 } __packed;
170 
171 /*
172  * CMD_GET_CTRL_INFO (0x11)
173  * Identify Controller
174  */
175 struct ida_controller_info {
176 	u_int8_t	num_drvs;	/* Number of configured logical drives */
177 	u_int32_t	signature;	/* Configuration signature */
178 	u_int8_t	firm_rev[4];	/* ASCII firmware revision */
179 	u_int8_t	rom_rev[4];	/* ROM firmware revision */
180 	u_int8_t	hw_rev;		/* Revision level of the hardware */
181 	u_int32_t	bb_rev;
182 	u_int32_t	dp_map;		/* Drive present bit map */
183 	u_int32_t	ed_map;		/* External drive bit map */
184 	u_int32_t	board_id;
185 	u_int8_t	cfg_error;
186 	u_int32_t	nd_map;		/* Non-disk map */
187 	u_int8_t	bad_ram_addr;
188 	u_int8_t	cpu_rev;
189 	u_int8_t	pdpi_rev;
190 	u_int8_t	epic_rev;
191 	u_int8_t	wcxc_rev;
192 	u_int8_t	mkt_rev;	/* Marketing revision */
193 	u_int8_t	cflag;		/* Controller flags */
194 #define	IDA_CI_CFLAG_7DPB	(1<<3)
195 #define	IDA_CI_CFLAG_BIGMAP	(1<<7)
196 	u_int8_t	hflag;
197 	u_int8_t	expand_dis;
198 	u_int8_t	scsi_cc;	/* SCSI chip count */
199 	u_int32_t	max_req_blocks;
200 	u_int32_t	cclock;		/* Controller Clock */
201 	u_int8_t	dp_scsi;	/* Drives per SCSI bus */
202 	u_int16_t	big_dp_map[8];	/* Big drive present bit map */
203 	u_int16_t	big_ed_map[8];	/* Big external drive bit map */
204 	u_int16_t	big_nd_map[8];	/* Big non-disk map */
205 	u_int16_t	task_flags;
206 	u_int8_t	icl_bus;
207 	u_int8_t	red_modes;
208 	u_int8_t	cur_red_mode;
209 	u_int8_t	red_ctlr_stat;
210 	u_int8_t	red_fail_reason;
211 	u_int8_t	reserved[403];
212 } __packed;
213 
214 /*
215  * CMD_SENSE_DRV_STATUS (0x12)
216  * Sense logical drive status
217  */
218 struct ida_drive_status {
219 	u_int8_t	status;
220 	u_int32_t	failure_map;
221 	u_int16_t	read_err[32];
222 	u_int16_t	write_error[32];
223 	u_int8_t	reserved0[288];
224 	u_int32_t	secrecover;
225 	u_int8_t	rebuilding;
226 	u_int16_t	remap_cnt[32];
227 	u_int32_t	repl_map;
228 	u_int32_t	spare_map;
229 	u_int8_t	spare_status;
230 	u_int8_t	spare_repl_map[32];
231 	u_int32_t	repl_ok_map;
232 	u_int8_t	media_exchange;
233 	u_int8_t	cache_failure;
234 	u_int8_t	expand_failure;
235 	u_int8_t	unit_flags;
236 	u_int16_t	big_failure_map[8];
237 	u_int16_t	big_remap_cnt[128];
238 	u_int16_t	big_repl_map[8];
239 	u_int16_t	big_act_spare_map[8];
240 	u_int8_t	big_spare_repl_map[128];
241 	u_int16_t	big_repl_ok_map[8];
242 	u_int8_t	big_rebuilding;
243 	u_int8_t	reserved1[36];
244 } __packed;
245 
246 /*
247  * CMD_GET_PHYS_DRV_INFO (0x15)
248  * Identify Physical Drive
249  */
250 struct ida_phys_drv_info {
251 	u_int8_t	scsi_bus;	/* SCSI Bus */
252 	u_int8_t	scsi_id;	/* SCSI ID */
253 	u_int16_t	blksize;	/* block size in bytes */
254 	u_int32_t	blkcount;	/* total blocks */
255 	u_int32_t	blkreserved;	/* reserved blocks */
256 	u_int8_t	drv_model[40];	/* drive model */
257 	u_int8_t	drv_serial[40];	/* drive serial number */
258 	u_int8_t	drv_fwrev[8];	/* drive firmware revision */
259 	u_int8_t	scsi_inq;	/* SCSI inquiry bits */
260 	u_int8_t	cpq_drv_stmp;
261 	u_int8_t	last_fail;
262 	u_int8_t	pd_flags;	/* physical drive flags */
263 #define	PDF_DISK_PRESENT	0x01
264 #define	PDF_NONDISK_PRESENT	0x02
265 #define	PDF_WIDE_ENABLED	0x04
266 #define	PDF_SYNC		0x08
267 #define	PDF_NARROW_TRAY		0x10
268 #define	PDF_WIDEFAIL		0x20
269 #define	PDF_ULTRA		0x40
270 #define	PDF_ULTRA2		0x80
271 	u_int8_t	mpd_flags;	/* more physical drive flags */
272 #define	MPDF_SMART_SUPPORT	0x01	/* S.M.A.R.T supported */
273 #define	MPDF_SMART_ERRORS	0x02	/* S.M.A.R.T errors recorded */
274 #define	MPDF_SMART_ENABLED	0x04	/* S.M.A.R.T predictive failure is enabled */
275 #define	MPDF_SMART_ERR_RESET	0x08	/* S.M.A.R.T errors recorded since last reset */
276 #define	MPDF_DRIVE_EXTERNAL	0x10	/* Connected to external connector. */
277 #define	MPDF_DRIVE_CONF_LVOL	0x20	/* Configured as part of a logical volume */
278 #define	MPDF_DRIVE_CONF_SPARE	0x40	/* Configured as a spare */
279 #define	MPDF_DRIVE_WCE		0x80	/* Drive WCE set on spinup */
280 	u_int8_t	scsi_lun;
281 	u_int8_t	ympd_flags;	/* yet more physical drive flags */
282 #define	YMPDF_DRIVE_WCE_SET	0x40	/* WCE currently set */
283 #define	YMPDF_DRIVE_WCE_CHNG	0x80	/* WCE changeable */
284 	u_int8_t	reserved;
285 	u_int32_t	spi_speed_rules;
286 	u_int8_t	phys_con[2];	/* Physical Connector */
287 	u_int8_t	phys_box;	/* Physical Box on Bus */
288 	u_int8_t	phys_bay;	/* Physical Bay in Box */
289 } __packed;
290 
291 /*
292  * CMD_BLINK_DRV_LEDS (0x16)
293  * Blink Drive Tray LEDs
294  *
295  * CMD_SENSE_DRV_LEDS (0x17)
296  * Sense Blinking Drive Tray LEDs
297  */
298 struct ida_blink_drv_leds {
299 	u_int32_t	bd;		/* Blink duration (in 10ths sec) */
300 	u_int32_t	bte;		/* Blink time elapsed (sense only) */
301 	u_int8_t	bse[256];	/* Blink/seek enable */
302 	u_int8_t	reserved1[248];
303 } __packed;
304 
305 /*
306  * CMD_LABEL_LOG_DRV (0x57)
307  * Label Logical Drive
308  */
309 struct ida_label_logical {
310 	u_int32_t	ld_id;		/* Logical drive identifier */
311 	u_int8_t	ld_label[64];	/* Logical drive label */
312 } __packed;
313