Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / dev / pci / amrreg.h @ 13

History | View | Annotate | Download (13.7 KB)

1 13 up20180614
/*        $NetBSD: amrreg.h,v 1.5 2008/09/08 23:36:54 gmcgarry Exp $        */
2
3
/*-
4
 * Copyright (c) 2002, 2003 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 Michael Smith
34
 * Copyright (c) 2000 BSDi
35
 * All rights reserved.
36
 *
37
 * Redistribution and use in source and binary forms, with or without
38
 * modification, are permitted provided that the following conditions
39
 * are met:
40
 * 1. Redistributions of source code must retain the above copyright
41
 *    notice, this list of conditions and the following disclaimer.
42
 * 2. Redistributions in binary form must reproduce the above copyright
43
 *    notice, this list of conditions and the following disclaimer in the
44
 *    documentation and/or other materials provided with the distribution.
45
 *
46
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
47
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
48
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
49
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
50
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
51
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
52
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
53
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
54
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
55
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56
 * SUCH DAMAGE.
57
 *
58
 * from FreeBSD: amrreg.h,v 1.2 2000/08/30 07:52:40 msmith Exp
59
 */
60
61
#ifndef        _PCI_AMRREG_H_
62
#define        _PCI_AMRREG_H_
63
64
#ifdef AMR_CRASH_ME
65
#define        AMR_MAX_CMDS                255                /* ident = 0 not allowed */
66
#else
67
#define        AMR_MAX_CMDS                120
68
#endif
69
#define        AMR_MAXLD                      40
70
71
#define        AMR_MAX_CMDS_PU                63
72
73
#define        AMR_MAX_SEGS                26
74
#define        AMR_MAX_CHANNEL                3
75
#define        AMR_MAX_TARGET                15
76
#define        AMR_MAX_LUN                7
77
78
#define        AMR_MAX_CDB_LEN                0x0a
79
#define        AMR_MAX_REQ_SENSE_LEN        0x20
80
81
#define        AMR_SECTOR_SIZE                512
82
83
/* Mailbox commands.*/
84
#define        AMR_CMD_LREAD                0x01
85
#define        AMR_CMD_LWRITE                0x02
86
#define        AMR_CMD_PASS                0x03
87
#define        AMR_CMD_EXT_ENQUIRY        0x04
88
#define        AMR_CMD_ENQUIRY                0x05
89
#define        AMR_CMD_FLUSH                0x0a
90
#define        AMR_CMD_EXT_ENQUIRY2        0x0c
91
#define        AMR_CMD_GET_MACHINEID        0x36
92
#define        AMR_CMD_GET_INITIATOR        0x7d        /* returns one byte */
93
#define        AMR_CMD_CONFIG                0xa1
94
#define        AMR_CONFIG_PRODUCT_INFO                        0x0e
95
#define        AMR_CONFIG_ENQ3                                0x0f
96
#define        AMR_CONFIG_ENQ3_SOLICITED_NOTIFY        0x01
97
#define        AMR_CONFIG_ENQ3_SOLICITED_FULL                0x02
98
#define        AMR_CONFIG_ENQ3_UNSOLICITED                0x03
99
100
/* Command completion status. */
101
#define        AMR_STATUS_SUCCESS        0x00
102
#define        AMR_STATUS_ABORTED        0x02
103
#define        AMR_STATUS_FAILED        0x80
104
105
/* Physical/logical drive states. */
106
#define        AMR_DRV_CURSTATE(x)        ((x) & 0x0f)
107
#define        AMR_DRV_PREVSTATE(x)        (((x) >> 4) & 0x0f)
108
#define        AMR_DRV_OFFLINE                0x00
109
#define        AMR_DRV_DEGRADED        0x01
110
#define        AMR_DRV_OPTIMAL                0x02
111
#define        AMR_DRV_ONLINE                0x03
112
#define        AMR_DRV_FAILED                0x04
113
#define        AMR_DRV_REBUILD                0x05
114
#define        AMR_DRV_HOTSPARE        0x06
115
116
/* Logical drive properties. */
117
#define        AMR_DRV_RAID_MASK        0x0f        /* RAID level 0, 1, 3, 5, etc. */
118
#define        AMR_DRV_WRITEBACK        0x10        /* write-back enabled */
119
#define        AMR_DRV_READHEAD        0x20        /* readhead policy enabled */
120
#define        AMR_DRV_ADAPTIVE        0x40        /* adaptive I/O policy enabled */
121
122
/* Battery status. */
123
#define        AMR_BATT_MODULE_MISSING                0x01
124
#define        AMR_BATT_LOW_VOLTAGE                0x02
125
#define        AMR_BATT_TEMP_HIGH                0x04
126
#define        AMR_BATT_PACK_MISSING                0x08
127
#define        AMR_BATT_CHARGE_MASK                0x30
128
#define        AMR_BATT_CHARGE_DONE                0x00
129
#define        AMR_BATT_CHARGE_INPROG                0x10
130
#define        AMR_BATT_CHARGE_FAIL                0x20
131
#define        AMR_BATT_CYCLES_EXCEEDED        0x40
132
133
/*
134
 * 8LD firmware interface.
135
 */
136
137
/* Array constraints. */
138
#define        AMR_8LD_MAXDRIVES        8
139
#define        AMR_8LD_MAXCHAN                5
140
#define        AMR_8LD_MAXTARG                15
141
#define        AMR_8LD_MAXPHYSDRIVES        (AMR_8LD_MAXCHAN * AMR_8LD_MAXTARG)
142
143
/* Adapter information. */
144
struct amr_adapter_info {
145
        u_int8_t        aa_maxio;
146
        u_int8_t        aa_rebuild_rate;
147
        u_int8_t        aa_maxtargchan;
148
        u_int8_t        aa_channels;
149
        u_int8_t        aa_firmware[4];
150
        u_int16_t        aa_flashage;
151
        u_int8_t        aa_chipsetvalue;
152
        u_int8_t        aa_memorysize;
153
        u_int8_t        aa_cacheflush;
154
        u_int8_t        aa_bios[4];
155
        u_int8_t        aa_boardtype;
156
        u_int8_t        aa_scsisensealert;
157
        u_int8_t        aa_writeconfigcount;
158
        u_int8_t        aa_driveinsertioncount;
159
        u_int8_t        aa_inserteddrive;
160
        u_int8_t        aa_batterystatus;
161
        u_int8_t           aa_res1;
162
} __packed;
163
164
/* Logical drive information. */
165
struct amr_logdrive_info {
166
        u_int8_t        al_numdrives;
167
        u_int8_t        al_res1[3];
168
        u_int32_t        al_size[AMR_8LD_MAXDRIVES];
169
        u_int8_t        al_properties[AMR_8LD_MAXDRIVES];
170
        u_int8_t        al_state[AMR_8LD_MAXDRIVES];
171
} __packed;
172
173
/* Physical drive information. */
174
struct amr_physdrive_info {
175
        /* Low nybble is current state, high nybble is previous state. */
176
        u_int8_t        ap_state[AMR_8LD_MAXPHYSDRIVES];
177
        u_int8_t        ap_predictivefailure;
178
} __packed;
179
180
/*
181
 * Enquiry response structure for AMR_CMD_ENQUIRY (e), AMR_CMD_EXT_ENQUIRY (x)
182
 * and AMR_CMD_EXT_ENQUIRY2 (2).
183
 */
184
struct amr_enquiry {
185
        struct                amr_adapter_info ae_adapter;                /* e x 2 */
186
        struct                amr_logdrive_info ae_ldrv;                /* e x 2 */
187
        struct                amr_physdrive_info ae_pdrv;                /* e x 2 */
188
        u_int8_t        ae_formatting[AMR_8LD_MAXDRIVES];        /*   x 2 */
189
        u_int8_t        res1[AMR_8LD_MAXDRIVES];                /*   x 2 */
190
        u_int32_t        ae_extlen;                                /*     2 */
191
        u_int16_t        ae_subsystem;                                /*     2 */
192
        u_int16_t        ae_subvendor;                                /*     2 */
193
        u_int32_t        ae_signature;                                /*     2 */
194
#define        AMR_SIG_431        0xfffe0001
195
#define        AMR_SIG_438        0xfffd0002
196
#define        AMR_SIG_762        0xfffc0003
197
#define        AMR_SIG_T5        0xfffb0004
198
#define        AMR_SIG_466        0xfffa0005
199
#define        AMR_SIG_467        0xfff90006
200
#define        AMR_SIG_T7        0xfff80007
201
#define        AMR_SIG_490        0xfff70008
202
        u_int8_t        res2[844];                                /*     2 */
203
} __packed;
204
205
/*
206
 * 40LD firmware interface.
207
 */
208
209
/* Array constraints. */
210
#define        AMR_40LD_MAXDRIVES        40
211
#define        AMR_40LD_MAXCHAN        16
212
#define        AMR_40LD_MAXTARG        16
213
#define        AMR_40LD_MAXPHYSDRIVES        256
214
215
/* Product information structure. */
216
struct amr_prodinfo {
217
        u_int32_t        ap_size;                /* current size in bytes (not including resvd) */
218
        u_int32_t        ap_configsig;                /* default is 0x00282008, indicating 0x28 maximum
219
                                         * logical drives, 0x20 maximum stripes and 0x08
220
                                         * maximum spans */
221
        u_int8_t        ap_firmware[16];        /* printable identifiers */
222
        u_int8_t        ap_bios[16];
223
        u_int8_t        ap_product[80];
224
        u_int8_t        ap_maxio;                /* maximum number of concurrent commands supported */
225
        u_int8_t        ap_nschan;                /* number of SCSI channels present */
226
        u_int8_t        ap_fcloops;                /* number of fibre loops present */
227
        u_int8_t        ap_memtype;                /* memory type */
228
        u_int32_t        ap_signature;
229
        u_int16_t        ap_memsize;                /* onboard memory in MB */
230
        u_int16_t        ap_subsystem;                /* subsystem identifier */
231
        u_int16_t        ap_subvendor;                /* subsystem vendor ID */
232
        u_int8_t        ap_numnotifyctr;        /* number of notify counters */
233
} __packed;
234
235
/* Notify structure. */
236
struct amr_notify {
237
        u_int32_t        an_globalcounter;        /* change counter */
238
239
        u_int8_t        an_paramcounter;        /* parameter change counter */
240
        u_int8_t        an_paramid;
241
#define        AMR_PARAM_REBUILD_RATE                0x01        /* value = new rebuild rate */
242
#define        AMR_PARAM_FLUSH_INTERVAL        0x02        /* value = new flush interval */
243
#define        AMR_PARAM_SENSE_ALERT                0x03        /* value = last physical drive with check condition set */
244
#define        AMR_PARAM_DRIVE_INSERTED        0x04        /* value = last physical drive inserted */
245
#define        AMR_PARAM_BATTERY_STATUS        0x05        /* value = battery status */
246
        u_int16_t        an_paramval;
247
248
        u_int8_t        an_writeconfigcounter;        /* write config occurred */
249
        u_int8_t        res1[3];
250
251
        u_int8_t        an_ldrvopcounter;        /* logical drive operation started/completed */
252
        u_int8_t        an_ldrvopid;
253
        u_int8_t        an_ldrvopcmd;
254
#define        AMR_LDRVOP_CHECK        0x01
255
#define        AMR_LDRVOP_INIT                0x02
256
#define        AMR_LDRVOP_REBUILD        0x03
257
        u_int8_t        an_ldrvopstatus;
258
#define        AMR_LDRVOP_SUCCESS        0x00
259
#define        AMR_LDRVOP_FAILED        0x01
260
#define        AMR_LDRVOP_ABORTED        0x02
261
#define        AMR_LDRVOP_CORRECTED        0x03
262
#define        AMR_LDRVOP_STARTED        0x04
263
264
        u_int8_t        an_ldrvstatecounter;        /* logical drive state change occurred */
265
        u_int8_t        an_ldrvstateid;
266
        u_int8_t        an_ldrvstatenew;
267
        u_int8_t        an_ldrvstateold;
268
269
        u_int8_t        an_pdrvstatecounter;        /* physical drive state change occurred */
270
        u_int8_t        an_pdrvstateid;
271
        u_int8_t        an_pdrvstatenew;
272
        u_int8_t        an_pdrvstateold;
273
274
        u_int8_t        an_pdrvfmtcounter;
275
        u_int8_t        an_pdrvfmtid;
276
        u_int8_t        an_pdrvfmtval;
277
#define        AMR_FORMAT_START        0x01
278
#define        AMR_FORMAT_COMPLETE        0x02
279
        u_int8_t        res2;
280
281
        u_int8_t        an_targxfercounter;        /* scsi xfer rate change */
282
        u_int8_t        an_targxferid;
283
        u_int8_t        an_targxferval;
284
        u_int8_t        res3;
285
286
        u_int8_t        an_fcloopidcounter;        /* FC/AL loop ID changed */
287
        u_int8_t        an_fcloopidpdrvid;
288
        u_int8_t        an_fcloopid0;
289
        u_int8_t        an_fcloopid1;
290
291
        u_int8_t        an_fcloopstatecounter;        /* FC/AL loop status changed */
292
        u_int8_t        an_fcloopstate0;
293
        u_int8_t        an_fcloopstate1;
294
        u_int8_t        res4;
295
} __packed;
296
297
/* Enquiry3 structure. */
298
struct amr_enquiry3 {
299
        u_int32_t        ae_datasize;                /* valid data size in this structure */
300
        union {                                /* event notify structure */
301
        struct amr_notify        n;
302
        u_int8_t                pad[0x80];
303
        }                 ae_notify;
304
        u_int8_t        ae_rebuildrate;                /* current rebuild rate in % */
305
        u_int8_t        ae_cacheflush;                /* flush interval in seconds */
306
        u_int8_t        ae_sensealert;
307
        u_int8_t        ae_driveinsertcount;        /* count of inserted drives */
308
        u_int8_t        ae_batterystatus;
309
        u_int8_t        ae_numldrives;
310
        u_int8_t        ae_reconstate[AMR_40LD_MAXDRIVES / 8];        /* reconstruction state */
311
        u_int16_t        ae_opstatus[AMR_40LD_MAXDRIVES / 8];        /* operation status per drive */
312
        u_int32_t        ae_drivesize[AMR_40LD_MAXDRIVES];        /* logical drive size */
313
        u_int8_t        ae_driveprop[AMR_40LD_MAXDRIVES];        /* logical drive properties */
314
        u_int8_t        ae_drivestate[AMR_40LD_MAXDRIVES];        /* physical drive state */
315
        u_int8_t        ae_pdrivestate[AMR_40LD_MAXPHYSDRIVES]; /* physical drive state */
316
        u_int16_t        ae_driveformat[AMR_40LD_MAXPHYSDRIVES];
317
        u_int8_t        ae_targxfer[80];                        /* physical drive transfer rates */
318
319
        u_int8_t        res1[263];                /* pad to 1024 bytes */
320
} __packed;
321
322
/*
323
 * Mailbox and command structures.
324
 */
325
326
struct amr_mailbox_cmd {
327
        u_int8_t        mb_command;
328
        u_int8_t        mb_ident;
329
        u_int16_t        mb_blkcount;
330
        u_int32_t        mb_lba;
331
        u_int32_t        mb_physaddr;
332
        u_int8_t        mb_drive;
333
        u_int8_t        mb_nsgelem;
334
        u_int8_t        res1;
335
        u_int8_t        mb_busy;
336
} __packed;
337
338
struct amr_mailbox_resp {
339
        u_int8_t        mb_nstatus;
340
        u_int8_t        mb_status;
341
        u_int8_t        mb_completed[46];
342
}  __packed;
343
344
struct amr_mailbox {
345
        u_int32_t        mb_res1[3];
346
        u_int32_t        mb_segment;
347
        struct                amr_mailbox_cmd mb_cmd;
348
        struct                amr_mailbox_resp mb_resp;
349
        u_int8_t        mb_poll;
350
        u_int8_t        mb_ack;
351
        u_int8_t        res2[62];                /* Pad to 128+16 bytes. */
352
} __packed;
353
354
struct amr_mailbox_ioctl {
355
        u_int8_t        mb_command;
356
        u_int8_t        mb_ident;
357
        u_int8_t        mb_channel;
358
        u_int8_t        mb_param;
359
        u_int8_t        mb_pad[4];
360
        u_int32_t        mb_physaddr;
361
        u_int8_t        mb_drive;
362
        u_int8_t        mb_nsgelem;
363
        u_int8_t        res1;
364
        u_int8_t        mb_busy;
365
        u_int8_t        mb_nstatus;
366
        u_int8_t        mb_completed[46];
367
        u_int8_t        mb_poll;
368
        u_int8_t        mb_ack;
369
        u_int8_t        res4[16];
370
} __packed;
371
372
struct amr_sgentry {
373
        u_int32_t        sge_addr;
374
        u_int32_t        sge_count;
375
} __packed;
376
377
struct amr_passthrough {
378
        u_int8_t        ap_timeout:3;
379
        u_int8_t        ap_ars:1;
380
        u_int8_t        ap_dummy:3;
381
        u_int8_t        ap_islogical:1;
382
        u_int8_t        ap_logical_drive_no;
383
        u_int8_t        ap_channel;
384
        u_int8_t        ap_scsi_id;
385
        u_int8_t        ap_queue_tag;
386
        u_int8_t        ap_queue_action;
387
        u_int8_t        ap_cdb[AMR_MAX_CDB_LEN];
388
        u_int8_t        ap_cdb_length;
389
        u_int8_t        ap_request_sense_length;
390
        u_int8_t        ap_request_sense_area[AMR_MAX_REQ_SENSE_LEN];
391
        u_int8_t        ap_no_sg_elements;
392
        u_int8_t        ap_scsi_status;
393
        u_int32_t        ap_data_transfer_address;
394
        u_int32_t        ap_data_transfer_length;
395
} __packed;
396
397
/*
398
 * "Quartz" i960 PCI bridge interface.
399
 */
400
401
#define        AMR_QUARTZ_SIG_REG        0xa0
402
#define        AMR_QUARTZ_SIG0                0xcccc
403
#define        AMR_QUARTZ_SIG1                0x3344
404
405
/* Doorbell registers. */
406
#define        AMR_QREG_IDB                0x20
407
#define        AMR_QREG_ODB                0x2c
408
409
#define        AMR_QIDB_SUBMIT                0x00000001        /* mailbox ready for work */
410
#define        AMR_QIDB_ACK                0x00000002        /* mailbox done */
411
#define        AMR_QODB_READY                0x10001234        /* work ready to be processed */
412
413
/*
414
 * Old-style ("standard") ASIC bridge interface.
415
 */
416
417
/* I/O registers. */
418
#define        AMR_SREG_CMD                0x10        /* Command/ack register (w) */
419
#define        AMR_SREG_MBOX_BUSY        0x10        /* Mailbox status (r) */
420
#define        AMR_SREG_TOGL                0x11        /* Interrupt enable */
421
#define        AMR_SREG_MBOX                0x14        /* Mailbox physical address */
422
#define        AMR_SREG_MBOX_ENABLE        0x18        /* Atomic mailbox address enable */
423
#define        AMR_SREG_INTR                0x1a        /* Interrupt status */
424
425
/* I/O magic numbers. */
426
#define        AMR_SCMD_POST                0x10        /* in SCMD to initiate action on mailbox */
427
#define        AMR_SCMD_ACKINTR        0x08        /* in SCMD to ack mailbox retrieved */
428
#define        AMR_STOGL_ENABLE        0xc0        /* in STOGL */
429
#define        AMR_SINTR_VALID                0x40        /* in SINTR */
430
#define        AMR_SMBOX_BUSY_FLAG        0x10        /* in SMBOX_BUSY */
431
#define        AMR_SMBOX_ENABLE_ADDR        0x00        /* in SMBOX_ENABLE */
432
433
#endif        /* !_PCI_AMRREG_H_ */