d64af712f659bde7beb12fbc54e44bda4a9920ad
[dragonfly.git] / sys / dev / raid / mfi / mfireg.h
1 /*-
2  * Copyright (c) 2006 IronPort Systems
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 /*-
27  * Copyright (c) 2007 LSI Corp.
28  * Copyright (c) 2007 Rajesh Prabhakaran.
29  * All rights reserved.
30  *
31  * Redistribution and use in source and binary forms, with or without
32  * modification, are permitted provided that the following conditions
33  * are met:
34  * 1. Redistributions of source code must retain the above copyright
35  *    notice, this list of conditions and the following disclaimer.
36  * 2. Redistributions in binary form must reproduce the above copyright
37  *    notice, this list of conditions and the following disclaimer in the
38  *    documentation and/or other materials provided with the distribution.
39  *
40  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  */
52 /*-
53  * Redistribution and use in source and binary forms, with or without
54  * modification, are permitted provided that the following conditions
55  * are met:
56  *
57  *            Copyright 1994-2009 The FreeBSD Project.
58  *            All rights reserved.
59  *
60  * 1. Redistributions of source code must retain the above copyright
61  *    notice, this list of conditions and the following disclaimer.
62  * 2. Redistributions in binary form must reproduce the above copyright
63  *    notice, this list of conditions and the following disclaimer in the
64  *    documentation and/or other materials provided with the distribution.
65  *
66  *    THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT``AS IS'' AND
67  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
68  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
69  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FREEBSD PROJECT OR
70  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
71  * EXEMPLARY,OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
72  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
73  * PROFITS; OR BUSINESS INTERRUPTION)HOWEVER CAUSED AND ON ANY THEORY
74  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
75  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
76  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
77  *
78  * The views and conclusions contained in the software and documentation
79  * are those of the authors and should not be interpreted as representing
80  * official policies,either expressed or implied, of the FreeBSD Project.
81  *
82  * $FreeBSD: src/sys/dev/mfi/mfireg.h,v 1.16 2011/07/14 20:20:33 jhb Exp $
83  */
84
85 #ifndef _MFIREG_H
86 #define _MFIREG_H
87
88 /*
89  * MegaRAID SAS MFI firmware definitions
90  *
91  * Calling this driver 'MegaRAID SAS' is a bit misleading.  It's a completely
92  * new firmware interface from the old AMI MegaRAID one, and there is no
93  * reason why this interface should be limited to just SAS.  In any case, LSI
94  * seems to also call this interface 'MFI', so that will be used here.
95  */
96
97 /*
98  * Start with the register set.  All registers are 32 bits wide.
99  * The usual Intel IOP style setup.
100  */
101 #define MFI_IMSG0       0x10    /* Inbound message 0 */
102 #define MFI_IMSG1       0x14    /* Inbound message 1 */
103 #define MFI_OMSG0       0x18    /* Outbound message 0 */
104 #define MFI_OMSG1       0x1c    /* Outbound message 1 */
105 #define MFI_IDB         0x20    /* Inbound doorbell */
106 #define MFI_ISTS        0x24    /* Inbound interrupt status */
107 #define MFI_IMSK        0x28    /* Inbound interrupt mask */
108 #define MFI_ODB         0x2c    /* Outbound doorbell */
109 #define MFI_OSTS        0x30    /* Outbound interrupt status */
110 #define MFI_OMSK        0x34    /* Outbound interrupt mask */
111 #define MFI_IQP         0x40    /* Inbound queue port */
112 #define MFI_OQP         0x44    /* Outbound queue port */
113
114 /*
115  * 1078 specific related register
116  */
117 #define MFI_ODR0        0x9c            /* outbound doorbell register0 */
118 #define MFI_ODCR0       0xa0            /* outbound doorbell clear register0  */
119 #define MFI_OSP0        0xb0            /* outbound scratch pad0  */
120 #define MFI_1078_EIM    0x80000004      /* 1078 enable intrrupt mask  */
121 #define MFI_RMI         0x2             /* reply message interrupt  */
122 #define MFI_1078_RM     0x80000000      /* reply 1078 message interrupt  */
123 #define MFI_ODC         0x4             /* outbound doorbell change interrupt */
124
125 /*
126  * GEN2 specific changes
127  */
128 #define MFI_GEN2_EIM    0x00000005      /* GEN2 enable interrupt mask */
129 #define MFI_GEN2_RM     0x00000001      /* reply GEN2 message interrupt */
130
131 /*
132  * gen2 specific changes
133  */
134 #define MFI_GEN2_EIM    0x00000005      /* gen2 enable interrupt mask */
135 #define MFI_GEN2_RM     0x00000001      /* reply gen2 message interrupt */
136
137 /*
138  * skinny specific changes
139  */
140 #define MFI_SKINNY_IDB  0x00    /* Inbound doorbell is at 0x00 for skinny */
141 #define MFI_IQPL        0x000000c0
142 #define MFI_IQPH        0x000000c4
143 #define MFI_SKINNY_RM   0x00000001      /* reply skinny message interrupt */
144
145 /* Bits for MFI_OSTS */
146 #define MFI_OSTS_INTR_VALID     0x00000002
147
148 /*
149  * Firmware state values.  Found in OMSG0 during initialization.
150  */
151 #define MFI_FWSTATE_MASK                0xf0000000
152 #define MFI_FWSTATE_UNDEFINED           0x00000000
153 #define MFI_FWSTATE_BB_INIT             0x10000000
154 #define MFI_FWSTATE_FW_INIT             0x40000000
155 #define MFI_FWSTATE_WAIT_HANDSHAKE      0x60000000
156 #define MFI_FWSTATE_FW_INIT_2           0x70000000
157 #define MFI_FWSTATE_DEVICE_SCAN         0x80000000
158 #define MFI_FWSTATE_BOOT_MESSAGE_PENDING        0x90000000
159 #define MFI_FWSTATE_FLUSH_CACHE         0xa0000000
160 #define MFI_FWSTATE_READY               0xb0000000
161 #define MFI_FWSTATE_OPERATIONAL         0xc0000000
162 #define MFI_FWSTATE_FAULT               0xf0000000
163 #define MFI_FWSTATE_MAXSGL_MASK         0x00ff0000
164 #define MFI_FWSTATE_MAXCMD_MASK         0x0000ffff
165 #define MFI_FWSTATE_HOSTMEMREQD_MASK    0x08000000
166 #define MFI_FWSTATE_BOOT_MESSAGE_PENDING        0x90000000
167
168 /*
169  * Control bits to drive the card to ready state.  These go into the IDB
170  * register.
171  */
172 #define MFI_FWINIT_ABORT        0x00000000 /* Abort all pending commands */
173 #define MFI_FWINIT_READY        0x00000002 /* Move from operational to ready */
174 #define MFI_FWINIT_MFIMODE      0x00000004 /* unknown */
175 #define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */
176 #define MFI_FWINIT_HOTPLUG      0x00000010
177
178 /* MFI Commands */
179 typedef enum {
180         MFI_CMD_INIT =          0x00,
181         MFI_CMD_LD_READ,
182         MFI_CMD_LD_WRITE,
183         MFI_CMD_LD_SCSI_IO,
184         MFI_CMD_PD_SCSI_IO,
185         MFI_CMD_DCMD,
186         MFI_CMD_ABORT,
187         MFI_CMD_SMP,
188         MFI_CMD_STP
189 } mfi_cmd_t;
190
191 /* Direct commands */
192 typedef enum {
193         MFI_DCMD_CTRL_MFI_HOST_MEM_ALLOC = 0x0100e100,
194         MFI_DCMD_CTRL_GETINFO =         0x01010000,
195         MFI_DCMD_CTRL_MFC_DEFAULTS_GET =0x010e0201,
196         MFI_DCMD_CTRL_MFC_DEFAULTS_SET =0x010e0202,
197         MFI_DCMD_CTRL_FLUSHCACHE =      0x01101000,
198         MFI_DCMD_CTRL_SHUTDOWN =        0x01050000,
199         MFI_DCMD_CTRL_EVENT_GETINFO =   0x01040100,
200         MFI_DCMD_CTRL_EVENT_GET =       0x01040300,
201         MFI_DCMD_CTRL_EVENT_WAIT =      0x01040500,
202         MFI_DCMD_PR_GET_STATUS =        0x01070100,
203         MFI_DCMD_PR_GET_PROPERTIES =    0x01070200,
204         MFI_DCMD_PR_SET_PROPERTIES =    0x01070300,
205         MFI_DCMD_PR_START =             0x01070400,
206         MFI_DCMD_PR_STOP =              0x01070500,
207         MFI_DCMD_TIME_SECS_GET =        0x01080201,
208         MFI_DCMD_FLASH_FW_OPEN =        0x010f0100,
209         MFI_DCMD_FLASH_FW_DOWNLOAD =    0x010f0200,
210         MFI_DCMD_FLASH_FW_FLASH =       0x010f0300,
211         MFI_DCMD_FLASH_FW_CLOSE =       0x010f0400,
212         MFI_DCMD_PD_GET_LIST =          0x02010000,
213         MFI_DCMD_PD_LIST_QUERY =        0x02010100,
214         MFI_DCMD_PD_GET_INFO =          0x02020000,
215         MFI_DCMD_PD_STATE_SET =         0x02030100,
216         MFI_DCMD_PD_REBUILD_START =     0x02040100,
217         MFI_DCMD_PD_REBUILD_ABORT =     0x02040200,
218         MFI_DCMD_PD_CLEAR_START =       0x02050100,
219         MFI_DCMD_PD_CLEAR_ABORT =       0x02050200,
220         MFI_DCMD_PD_GET_PROGRESS =      0x02060000,
221         MFI_DCMD_PD_LOCATE_START =      0x02070100,
222         MFI_DCMD_PD_LOCATE_STOP =       0x02070200,
223         MFI_DCMD_LD_GET_LIST =          0x03010000,
224         MFI_DCMD_LD_GET_INFO =          0x03020000,
225         MFI_DCMD_LD_GET_PROP =          0x03030000,
226         MFI_DCMD_LD_SET_PROP =          0x03040000,
227         MFI_DCMD_LD_INIT_START =        0x03060100,
228         MFI_DCMD_LD_DELETE =            0x03090000,
229         MFI_DCMD_CFG_READ =             0x04010000,
230         MFI_DCMD_CFG_ADD =              0x04020000,
231         MFI_DCMD_CFG_CLEAR =            0x04030000,
232         MFI_DCMD_CFG_MAKE_SPARE =       0x04040000,
233         MFI_DCMD_CFG_REMOVE_SPARE =     0x04050000,
234         MFI_DCMD_CFG_FOREIGN_IMPORT =   0x04060400,
235         MFI_DCMD_BBU_GET_STATUS =       0x05010000,
236         MFI_DCMD_BBU_GET_CAPACITY_INFO =0x05020000,
237         MFI_DCMD_BBU_GET_DESIGN_INFO =  0x05030000,
238         MFI_DCMD_CLUSTER =              0x08000000,
239         MFI_DCMD_CLUSTER_RESET_ALL =    0x08010100,
240         MFI_DCMD_CLUSTER_RESET_LD =     0x08010200
241 } mfi_dcmd_t;
242
243 /* Modifiers for MFI_DCMD_CTRL_FLUSHCACHE */
244 #define MFI_FLUSHCACHE_CTRL     0x01
245 #define MFI_FLUSHCACHE_DISK     0x02
246
247 /* Modifiers for MFI_DCMD_CTRL_SHUTDOWN */
248 #define MFI_SHUTDOWN_SPINDOWN   0x01
249
250 /*
251  * MFI Frame flags
252  */
253 #define MFI_FRAME_POST_IN_REPLY_QUEUE           0x0000
254 #define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE      0x0001
255 #define MFI_FRAME_SGL32                         0x0000
256 #define MFI_FRAME_SGL64                         0x0002
257 #define MFI_FRAME_SENSE32                       0x0000
258 #define MFI_FRAME_SENSE64                       0x0004
259 #define MFI_FRAME_DIR_NONE                      0x0000
260 #define MFI_FRAME_DIR_WRITE                     0x0008
261 #define MFI_FRAME_DIR_READ                      0x0010
262 #define MFI_FRAME_DIR_BOTH                      0x0018
263 #define MFI_FRAME_IEEE_SGL                      0x0020
264
265 /* MFI Status codes */
266 typedef enum {
267         MFI_STAT_OK =                   0x00,
268         MFI_STAT_INVALID_CMD,
269         MFI_STAT_INVALID_DCMD,
270         MFI_STAT_INVALID_PARAMETER,
271         MFI_STAT_INVALID_SEQUENCE_NUMBER,
272         MFI_STAT_ABORT_NOT_POSSIBLE,
273         MFI_STAT_APP_HOST_CODE_NOT_FOUND,
274         MFI_STAT_APP_IN_USE,
275         MFI_STAT_APP_NOT_INITIALIZED,
276         MFI_STAT_ARRAY_INDEX_INVALID,
277         MFI_STAT_ARRAY_ROW_NOT_EMPTY,
278         MFI_STAT_CONFIG_RESOURCE_CONFLICT,
279         MFI_STAT_DEVICE_NOT_FOUND,
280         MFI_STAT_DRIVE_TOO_SMALL,
281         MFI_STAT_FLASH_ALLOC_FAIL,
282         MFI_STAT_FLASH_BUSY,
283         MFI_STAT_FLASH_ERROR =          0x10,
284         MFI_STAT_FLASH_IMAGE_BAD,
285         MFI_STAT_FLASH_IMAGE_INCOMPLETE,
286         MFI_STAT_FLASH_NOT_OPEN,
287         MFI_STAT_FLASH_NOT_STARTED,
288         MFI_STAT_FLUSH_FAILED,
289         MFI_STAT_HOST_CODE_NOT_FOUNT,
290         MFI_STAT_LD_CC_IN_PROGRESS,
291         MFI_STAT_LD_INIT_IN_PROGRESS,
292         MFI_STAT_LD_LBA_OUT_OF_RANGE,
293         MFI_STAT_LD_MAX_CONFIGURED,
294         MFI_STAT_LD_NOT_OPTIMAL,
295         MFI_STAT_LD_RBLD_IN_PROGRESS,
296         MFI_STAT_LD_RECON_IN_PROGRESS,
297         MFI_STAT_LD_WRONG_RAID_LEVEL,
298         MFI_STAT_MAX_SPARES_EXCEEDED,
299         MFI_STAT_MEMORY_NOT_AVAILABLE = 0x20,
300         MFI_STAT_MFC_HW_ERROR,
301         MFI_STAT_NO_HW_PRESENT,
302         MFI_STAT_NOT_FOUND,
303         MFI_STAT_NOT_IN_ENCL,
304         MFI_STAT_PD_CLEAR_IN_PROGRESS,
305         MFI_STAT_PD_TYPE_WRONG,
306         MFI_STAT_PR_DISABLED,
307         MFI_STAT_ROW_INDEX_INVALID,
308         MFI_STAT_SAS_CONFIG_INVALID_ACTION,
309         MFI_STAT_SAS_CONFIG_INVALID_DATA,
310         MFI_STAT_SAS_CONFIG_INVALID_PAGE,
311         MFI_STAT_SAS_CONFIG_INVALID_TYPE,
312         MFI_STAT_SCSI_DONE_WITH_ERROR,
313         MFI_STAT_SCSI_IO_FAILED,
314         MFI_STAT_SCSI_RESERVATION_CONFLICT,
315         MFI_STAT_SHUTDOWN_FAILED =      0x30,
316         MFI_STAT_TIME_NOT_SET,
317         MFI_STAT_WRONG_STATE,
318         MFI_STAT_LD_OFFLINE,
319         MFI_STAT_PEER_NOTIFICATION_REJECTED,
320         MFI_STAT_PEER_NOTIFICATION_FAILED,
321         MFI_STAT_RESERVATION_IN_PROGRESS,
322         MFI_STAT_I2C_ERRORS_DETECTED,
323         MFI_STAT_PCI_ERRORS_DETECTED,
324         MFI_STAT_DIAG_FAILED,
325         MFI_STAT_BOOT_MSG_PENDING,
326         MFI_STAT_FOREIGN_CONFIG_INCOMPLETE,
327         MFI_STAT_INVALID_STATUS =       0xFF
328 } mfi_status_t;
329
330 typedef enum {
331         MFI_EVT_CLASS_DEBUG =           -2,
332         MFI_EVT_CLASS_PROGRESS =        -1,
333         MFI_EVT_CLASS_INFO =            0,
334         MFI_EVT_CLASS_WARNING =         1,
335         MFI_EVT_CLASS_CRITICAL =        2,
336         MFI_EVT_CLASS_FATAL =           3,
337         MFI_EVT_CLASS_DEAD =            4
338 } mfi_evt_class_t;
339
340 typedef enum {
341         MFI_EVT_LOCALE_LD =             0x0001,
342         MFI_EVT_LOCALE_PD =             0x0002,
343         MFI_EVT_LOCALE_ENCL =           0x0004,
344         MFI_EVT_LOCALE_BBU =            0x0008,
345         MFI_EVT_LOCALE_SAS =            0x0010,
346         MFI_EVT_LOCALE_CTRL =           0x0020,
347         MFI_EVT_LOCALE_CONFIG =         0x0040,
348         MFI_EVT_LOCALE_CLUSTER =        0x0080,
349         MFI_EVT_LOCALE_ALL =            0xffff
350 } mfi_evt_locale_t;
351
352 typedef enum {
353         MR_EVT_ARGS_NONE =              0x00,
354         MR_EVT_ARGS_CDB_SENSE,
355         MR_EVT_ARGS_LD,
356         MR_EVT_ARGS_LD_COUNT,
357         MR_EVT_ARGS_LD_LBA,
358         MR_EVT_ARGS_LD_OWNER,
359         MR_EVT_ARGS_LD_LBA_PD_LBA,
360         MR_EVT_ARGS_LD_PROG,
361         MR_EVT_ARGS_LD_STATE,
362         MR_EVT_ARGS_LD_STRIP,
363         MR_EVT_ARGS_PD,
364         MR_EVT_ARGS_PD_ERR,
365         MR_EVT_ARGS_PD_LBA,
366         MR_EVT_ARGS_PD_LBA_LD,
367         MR_EVT_ARGS_PD_PROG,
368         MR_EVT_ARGS_PD_STATE,
369         MR_EVT_ARGS_PCI,
370         MR_EVT_ARGS_RATE,
371         MR_EVT_ARGS_STR,
372         MR_EVT_ARGS_TIME,
373         MR_EVT_ARGS_ECC
374 } mfi_evt_args;
375
376 typedef enum {
377         MR_LD_CACHE_WRITE_BACK =        0x01,
378         MR_LD_CACHE_WRITE_ADAPTIVE =    0x02,
379         MR_LD_CACHE_READ_AHEAD =        0x04,
380         MR_LD_CACHE_READ_ADAPTIVE =     0x08,
381         MR_LD_CACHE_WRITE_CACHE_BAD_BBU=0x10,
382         MR_LD_CACHE_ALLOW_WRITE_CACHE = 0x20,
383         MR_LD_CACHE_ALLOW_READ_CACHE =  0x40
384 } mfi_ld_cache;
385 #define MR_LD_CACHE_MASK        0x7f
386
387 #define MR_LD_CACHE_POLICY_READ_AHEAD_NONE              0
388 #define MR_LD_CACHE_POLICY_READ_AHEAD_ALWAYS            MR_LD_CACHE_READ_AHEAD
389 #define MR_LD_CACHE_POLICY_READ_AHEAD_ADAPTIVE          \
390         (MR_LD_CACHE_READ_AHEAD | MR_LD_CACHE_READ_ADAPTIVE)
391 #define MR_LD_CACHE_POLICY_WRITE_THROUGH                0
392 #define MR_LD_CACHE_POLICY_WRITE_BACK                   MR_LD_CACHE_WRITE_BACK
393 #define MR_LD_CACHE_POLICY_IO_CACHED                    \
394         (MR_LD_CACHE_ALLOW_WRITE_CACHE | MR_LD_CACHE_ALLOW_READ_CACHE)
395 #define MR_LD_CACHE_POLICY_IO_DIRECT                    0
396
397 typedef enum {
398         MR_PD_CACHE_UNCHANGED  =        0,
399         MR_PD_CACHE_ENABLE =            1,
400         MR_PD_CACHE_DISABLE =           2
401 } mfi_pd_cache;
402
403 typedef enum {
404         MR_PD_QUERY_TYPE_ALL =          0,
405         MR_PD_QUERY_TYPE_STATE =        1,
406         MR_PD_QUERY_TYPE_POWER_STATE =  2,
407         MR_PD_QUERY_TYPE_MEDIA_TYPE =   3,
408         MR_PD_QUERY_TYPE_SPEED =        4,
409         MR_PD_QUERY_TYPE_EXPOSED_TO_HOST =      5, /*query for system drives */
410 } mfi_pd_query_type;
411
412 /*
413  * Other propertities and definitions
414  */
415 #define MFI_MAX_PD_CHANNELS     2
416 #define MFI_MAX_LD_CHANNELS     2
417 #define MFI_MAX_CHANNELS        (MFI_MAX_PD_CHANNELS + MFI_MAX_LD_CHANNELS)
418 #define MFI_MAX_CHANNEL_DEVS    128
419 #define MFI_DEFAULT_ID          -1
420 #define MFI_MAX_LUN             8
421 #define MFI_MAX_LD              64
422 #define MFI_MAX_PD              256
423
424 #define MFI_FRAME_SIZE          64
425 #define MFI_MBOX_SIZE           12
426
427 /* Firmware flashing can take 40s */
428 #define MFI_POLL_TIMEOUT_SECS   50
429
430 /* Allow for speedier math calculations */
431 #define MFI_SECTOR_LEN          512
432
433 /* Scatter Gather elements */
434 struct mfi_sg32 {
435         uint32_t        addr;
436         uint32_t        len;
437 } __packed;
438
439 struct mfi_sg64 {
440         uint64_t        addr;
441         uint32_t        len;
442 } __packed;
443
444 struct mfi_sg_skinny {
445         uint64_t        addr;
446         uint32_t        len;
447         uint32_t        flag;
448 } __packed;
449
450 union mfi_sgl {
451         struct mfi_sg32 sg32[1];
452         struct mfi_sg64 sg64[1];
453         struct mfi_sg_skinny sg_skinny[1];
454 } __packed;
455
456 /* Message frames.  All messages have a common header */
457 struct mfi_frame_header {
458         uint8_t         cmd;
459         uint8_t         sense_len;
460         uint8_t         cmd_status;
461         uint8_t         scsi_status;
462         uint8_t         target_id;
463         uint8_t         lun_id;
464         uint8_t         cdb_len;
465         uint8_t         sg_count;
466         uint32_t        context;
467         /*
468          * pad0 is MSI Specific. Not used by Driver. Zero the value before
469          * sending the command to f/w
470          */
471         uint32_t        pad0;
472         uint16_t        flags;
473 #define MFI_FRAME_DATAOUT       0x08
474 #define MFI_FRAME_DATAIN        0x10
475         uint16_t        timeout;
476         uint32_t        data_len;
477 } __packed;
478
479 struct mfi_init_frame {
480         struct mfi_frame_header header;
481         uint32_t        qinfo_new_addr_lo;
482         uint32_t        qinfo_new_addr_hi;
483         uint32_t        qinfo_old_addr_lo;
484         uint32_t        qinfo_old_addr_hi;
485         uint32_t        reserved[6];
486 } __packed;
487
488 #define MFI_IO_FRAME_SIZE 40
489 struct mfi_io_frame {
490         struct mfi_frame_header header;
491         uint32_t        sense_addr_lo;
492         uint32_t        sense_addr_hi;
493         uint32_t        lba_lo;
494         uint32_t        lba_hi;
495         union mfi_sgl   sgl;
496 } __packed;
497
498 #define MFI_PASS_FRAME_SIZE 48
499 struct mfi_pass_frame {
500         struct mfi_frame_header header;
501         uint32_t        sense_addr_lo;
502         uint32_t        sense_addr_hi;
503         uint8_t         cdb[16];
504         union mfi_sgl   sgl;
505 } __packed;
506
507 #define MFI_DCMD_FRAME_SIZE 40
508 struct mfi_dcmd_frame {
509         struct mfi_frame_header header;
510         uint32_t        opcode;
511         uint8_t         mbox[MFI_MBOX_SIZE];
512         union mfi_sgl   sgl;
513 } __packed;
514
515 struct mfi_abort_frame {
516         struct mfi_frame_header header;
517         uint32_t        abort_context;
518         uint32_t        reserved0;
519         uint32_t        abort_mfi_addr_lo;
520         uint32_t        abort_mfi_addr_hi;
521         uint32_t        reserved1[6];
522 } __packed;
523
524 struct mfi_smp_frame {
525         struct mfi_frame_header header;
526         uint64_t        sas_addr;
527         union {
528                 struct mfi_sg32 sg32[2];
529                 struct mfi_sg64 sg64[2];
530         } sgl;
531 } __packed;
532
533 struct mfi_stp_frame {
534         struct mfi_frame_header header;
535         uint16_t        fis[10];
536         uint32_t        stp_flags;
537         union {
538                 struct mfi_sg32 sg32[2];
539                 struct mfi_sg64 sg64[2];
540         } sgl;
541 } __packed;
542
543 union mfi_frame {
544         struct mfi_frame_header header;
545         struct mfi_init_frame   init;
546         struct mfi_io_frame     io;
547         struct mfi_pass_frame   pass;
548         struct mfi_dcmd_frame   dcmd;
549         struct mfi_abort_frame  abort;
550         struct mfi_smp_frame    smp;
551         struct mfi_stp_frame    stp;
552         uint8_t                 bytes[MFI_FRAME_SIZE];
553 };
554
555 #define MFI_SENSE_LEN 128
556 struct mfi_sense {
557         uint8_t         data[MFI_SENSE_LEN];
558 };
559
560 /* The queue init structure that is passed with the init message */
561 struct mfi_init_qinfo {
562         uint32_t        flags;
563         uint32_t        rq_entries;
564         uint32_t        rq_addr_lo;
565         uint32_t        rq_addr_hi;
566         uint32_t        pi_addr_lo;
567         uint32_t        pi_addr_hi;
568         uint32_t        ci_addr_lo;
569         uint32_t        ci_addr_hi;
570 } __packed;
571
572 /* SAS (?) controller properties, part of mfi_ctrl_info */
573 struct mfi_ctrl_props {
574         uint16_t        seq_num;
575         uint16_t        pred_fail_poll_interval;
576         uint16_t        intr_throttle_cnt;
577         uint16_t        intr_throttle_timeout;
578         uint8_t         rebuild_rate;
579         uint8_t         patrol_read_rate;
580         uint8_t         bgi_rate;
581         uint8_t         cc_rate;
582         uint8_t         recon_rate;
583         uint8_t         cache_flush_interval;
584         uint8_t         spinup_drv_cnt;
585         uint8_t         spinup_delay;
586         uint8_t         cluster_enable;
587         uint8_t         coercion_mode;
588         uint8_t         alarm_enable;
589         uint8_t         disable_auto_rebuild;
590         uint8_t         disable_battery_warn;
591         uint8_t         ecc_bucket_size;
592         uint16_t        ecc_bucket_leak_rate;
593         uint8_t         restore_hotspare_on_insertion;
594         uint8_t         expose_encl_devices;
595         uint8_t         reserved[38];
596 } __packed;
597
598 /* PCI information about the card. */
599 struct mfi_info_pci {
600         uint16_t        vendor;
601         uint16_t        device;
602         uint16_t        subvendor;
603         uint16_t        subdevice;
604         uint8_t         reserved[24];
605 } __packed;
606
607 /* Host (front end) interface information */
608 struct mfi_info_host {
609         uint8_t         type;
610 #define MFI_INFO_HOST_PCIX      0x01
611 #define MFI_INFO_HOST_PCIE      0x02
612 #define MFI_INFO_HOST_ISCSI     0x04
613 #define MFI_INFO_HOST_SAS3G     0x08
614         uint8_t         reserved[6];
615         uint8_t         port_count;
616         uint64_t        port_addr[8];
617 } __packed;
618
619 /* Device (back end) interface information */
620 struct mfi_info_device {
621         uint8_t         type;
622 #define MFI_INFO_DEV_SPI        0x01
623 #define MFI_INFO_DEV_SAS3G      0x02
624 #define MFI_INFO_DEV_SATA1      0x04
625 #define MFI_INFO_DEV_SATA3G     0x08
626         uint8_t         reserved[6];
627         uint8_t         port_count;
628         uint64_t        port_addr[8];
629 } __packed;
630
631 /* Firmware component information */
632 struct mfi_info_component {
633         char             name[8];
634         char             version[32];
635         char             build_date[16];
636         char             build_time[16];
637 } __packed;
638
639 /* Controller default settings */
640 struct mfi_defaults {
641         uint64_t        sas_addr;
642         uint8_t         phy_polarity;
643         uint8_t         background_rate;
644         uint8_t         stripe_size;
645         uint8_t         flush_time;
646         uint8_t         write_back;
647         uint8_t         read_ahead;
648         uint8_t         cache_when_bbu_bad;
649         uint8_t         cached_io;
650         uint8_t         smart_mode;
651         uint8_t         alarm_disable;
652         uint8_t         coercion;
653         uint8_t         zrc_config;
654         uint8_t         dirty_led_shows_drive_activity;
655         uint8_t         bios_continue_on_error;
656         uint8_t         spindown_mode;
657         uint8_t         allowed_device_types;
658         uint8_t         allow_mix_in_enclosure;
659         uint8_t         allow_mix_in_ld;
660         uint8_t         allow_sata_in_cluster;
661         uint8_t         max_chained_enclosures;
662         uint8_t         disable_ctrl_r;
663         uint8_t         enabel_web_bios;
664         uint8_t         phy_polarity_split;
665         uint8_t         direct_pd_mapping;
666         uint8_t         bios_enumerate_lds;
667         uint8_t         restored_hot_spare_on_insertion;
668         uint8_t         expose_enclosure_devices;
669         uint8_t         maintain_pd_fail_history;
670         uint8_t         resv[28];
671 } __packed;
672
673 /* Controller default settings */
674 struct mfi_bios_data {
675         uint16_t        boot_target_id;
676         uint8_t         do_not_int_13;
677         uint8_t         continue_on_error;
678         uint8_t         verbose;
679         uint8_t         geometry;
680         uint8_t         expose_all_drives;
681         uint8_t         reserved[56];
682         uint8_t         check_sum;
683 } __packed;
684
685 /* SAS (?) controller info, returned from MFI_DCMD_CTRL_GETINFO. */
686 struct mfi_ctrl_info {
687         struct mfi_info_pci     pci;
688         struct mfi_info_host    host;
689         struct mfi_info_device  device;
690
691         /* Firmware components that are present and active. */
692         uint32_t                image_check_word;
693         uint32_t                image_component_count;
694         struct mfi_info_component image_component[8];
695
696         /* Firmware components that have been flashed but are inactive */
697         uint32_t                pending_image_component_count;
698         struct mfi_info_component pending_image_component[8];
699
700         uint8_t                 max_arms;
701         uint8_t                 max_spans;
702         uint8_t                 max_arrays;
703         uint8_t                 max_lds;
704         char                    product_name[80];
705         char                    serial_number[32];
706         uint32_t                hw_present;
707 #define MFI_INFO_HW_BBU         0x01
708 #define MFI_INFO_HW_ALARM       0x02
709 #define MFI_INFO_HW_NVRAM       0x04
710 #define MFI_INFO_HW_UART        0x08
711         uint32_t                current_fw_time;
712         uint16_t                max_cmds;
713         uint16_t                max_sg_elements;
714         uint32_t                max_request_size;
715         uint16_t                lds_present;
716         uint16_t                lds_degraded;
717         uint16_t                lds_offline;
718         uint16_t                pd_present;
719         uint16_t                pd_disks_present;
720         uint16_t                pd_disks_pred_failure;
721         uint16_t                pd_disks_failed;
722         uint16_t                nvram_size;
723         uint16_t                memory_size;
724         uint16_t                flash_size;
725         uint16_t                ram_correctable_errors;
726         uint16_t                ram_uncorrectable_errors;
727         uint8_t                 cluster_allowed;
728         uint8_t                 cluster_active;
729         uint16_t                max_strips_per_io;
730
731         uint32_t                raid_levels;
732 #define MFI_INFO_RAID_0         0x01
733 #define MFI_INFO_RAID_1         0x02
734 #define MFI_INFO_RAID_5         0x04
735 #define MFI_INFO_RAID_1E        0x08
736 #define MFI_INFO_RAID_6         0x10
737
738         uint32_t                adapter_ops;
739 #define MFI_INFO_AOPS_RBLD_RATE         0x0001
740 #define MFI_INFO_AOPS_CC_RATE           0x0002
741 #define MFI_INFO_AOPS_BGI_RATE          0x0004
742 #define MFI_INFO_AOPS_RECON_RATE        0x0008
743 #define MFI_INFO_AOPS_PATROL_RATE       0x0010
744 #define MFI_INFO_AOPS_ALARM_CONTROL     0x0020
745 #define MFI_INFO_AOPS_CLUSTER_SUPPORTED 0x0040
746 #define MFI_INFO_AOPS_BBU               0x0080
747 #define MFI_INFO_AOPS_SPANNING_ALLOWED  0x0100
748 #define MFI_INFO_AOPS_DEDICATED_SPARES  0x0200
749 #define MFI_INFO_AOPS_REVERTIBLE_SPARES 0x0400
750 #define MFI_INFO_AOPS_FOREIGN_IMPORT    0x0800
751 #define MFI_INFO_AOPS_SELF_DIAGNOSTIC   0x1000
752 #define MFI_INFO_AOPS_MIXED_ARRAY       0x2000
753 #define MFI_INFO_AOPS_GLOBAL_SPARES     0x4000
754
755         uint32_t                ld_ops;
756 #define MFI_INFO_LDOPS_READ_POLICY      0x01
757 #define MFI_INFO_LDOPS_WRITE_POLICY     0x02
758 #define MFI_INFO_LDOPS_IO_POLICY        0x04
759 #define MFI_INFO_LDOPS_ACCESS_POLICY    0x08
760 #define MFI_INFO_LDOPS_DISK_CACHE_POLICY 0x10
761
762         struct {
763                 uint8_t         min;
764                 uint8_t         max;
765                 uint8_t         reserved[2];
766         } __packed stripe_sz_ops;
767
768         uint32_t                pd_ops;
769 #define MFI_INFO_PDOPS_FORCE_ONLINE     0x01
770 #define MFI_INFO_PDOPS_FORCE_OFFLINE    0x02
771 #define MFI_INFO_PDOPS_FORCE_REBUILD    0x04
772
773         uint32_t                pd_mix_support;
774 #define MFI_INFO_PDMIX_SAS              0x01
775 #define MFI_INFO_PDMIX_SATA             0x02
776 #define MFI_INFO_PDMIX_ENCL             0x04
777 #define MFI_INFO_PDMIX_LD               0x08
778 #define MFI_INFO_PDMIX_SATA_CLUSTER     0x10
779
780         uint8_t                 ecc_bucket_count;
781         uint8_t                 reserved2[11];
782         struct mfi_ctrl_props   properties;
783         char                    package_version[0x60];
784         uint8_t                 pad[0x800 - 0x6a0];
785 } __packed;
786
787 /* keep track of an event. */
788 union mfi_evt {
789         struct {
790                 uint16_t        locale;
791                 uint8_t         reserved;
792                 int8_t          evt_class;
793         } members;
794         uint32_t                word;
795 } __packed;
796
797 /* event log state. */
798 struct mfi_evt_log_state {
799         uint32_t                newest_seq_num;
800         uint32_t                oldest_seq_num;
801         uint32_t                clear_seq_num;
802         uint32_t                shutdown_seq_num;
803         uint32_t                boot_seq_num;
804 } __packed;
805
806 struct mfi_progress {
807         uint16_t                progress;
808         uint16_t                elapsed_seconds;
809 } __packed;
810
811 struct mfi_evt_ld {
812         uint16_t                target_id;
813         uint8_t                 ld_index;
814         uint8_t                 reserved;
815 } __packed;
816
817 struct mfi_evt_pd {
818         uint16_t                device_id;
819         uint8_t                 enclosure_index;
820         uint8_t                 slot_number;
821 } __packed;
822
823 /* SAS (?) event detail, returned from MFI_DCMD_CTRL_EVENT_WAIT. */
824 struct mfi_evt_detail {
825         uint32_t                seq;
826         uint32_t                time;
827         uint32_t                code;
828         union mfi_evt           evt_class;
829         uint8_t                 arg_type;
830         uint8_t                 reserved1[15];
831
832         union {
833                 struct {
834                         struct mfi_evt_pd       pd;
835                         uint8_t                 cdb_len;
836                         uint8_t                 sense_len;
837                         uint8_t                 reserved[2];
838                         uint8_t                 cdb[16];
839                         uint8_t                 sense[64];
840                 } cdb_sense;
841
842                 struct mfi_evt_ld               ld;
843
844                 struct {
845                         struct mfi_evt_ld       ld;
846                         uint64_t                count;
847                 } ld_count;
848
849                 struct {
850                         uint64_t                lba;
851                         struct mfi_evt_ld       ld;
852                 } ld_lba;
853
854                 struct {
855                         struct mfi_evt_ld       ld;
856                         uint32_t                pre_owner;
857                         uint32_t                new_owner;
858                 } ld_owner;
859
860                 struct {
861                         uint64_t                ld_lba;
862                         uint64_t                pd_lba;
863                         struct mfi_evt_ld       ld;
864                         struct mfi_evt_pd       pd;
865                 } ld_lba_pd_lba;
866
867                 struct {
868                         struct mfi_evt_ld       ld;
869                         struct mfi_progress     prog;
870                 } ld_prog;
871
872                 struct {
873                         struct mfi_evt_ld       ld;
874                         uint32_t                prev_state;
875                         uint32_t                new_state;
876                 } ld_state;
877
878                 struct {
879                         uint64_t                strip;
880                         struct mfi_evt_ld       ld;
881                 } ld_strip;
882
883                 struct mfi_evt_pd               pd;
884
885                 struct {
886                         struct mfi_evt_pd       pd;
887                         uint32_t                err;
888                 } pd_err;
889
890                 struct {
891                         uint64_t                lba;
892                         struct mfi_evt_pd       pd;
893                 } pd_lba;
894
895                 struct {
896                         uint64_t                lba;
897                         struct mfi_evt_pd       pd;
898                         struct mfi_evt_ld       ld;
899                 } pd_lba_ld;
900
901                 struct {
902                         struct mfi_evt_pd       pd;
903                         struct mfi_progress     prog;
904                 } pd_prog;
905
906                 struct {
907                         struct mfi_evt_pd       ld;
908                         uint32_t                prev_state;
909                         uint32_t                new_state;
910                 } pd_state;
911
912                 struct {
913                         uint16_t                venderId;
914                         uint16_t                deviceId;
915                         uint16_t                subVenderId;
916                         uint16_t                subDeviceId;
917                 } pci;
918
919                 uint32_t                        rate;
920
921                 char                            str[96];
922
923                 struct {
924                         uint32_t                rtc;
925                         uint16_t                elapsedSeconds;
926                 } time;
927
928                 struct {
929                         uint32_t                ecar;
930                         uint32_t                elog;
931                         char                    str[64];
932                 } ecc;
933
934                 uint8_t         b[96];
935                 uint16_t        s[48];
936                 uint32_t        w[24];
937                 uint64_t        d[12];
938         } args;
939
940         char description[128];
941 } __packed;
942
943 struct mfi_evt_list {
944         uint32_t                count;
945         uint32_t                reserved;
946         struct mfi_evt_detail   event[1];
947 } __packed;
948
949 union mfi_pd_ref {
950         struct {
951                 uint16_t        device_id;
952                 uint16_t        seq_num;
953         } v;
954         uint32_t        ref;
955 } __packed;
956
957 union mfi_pd_ddf_type {
958         struct {
959                 union {
960                         struct {
961                                 uint16_t        forced_pd_guid  : 1;
962                                 uint16_t        in_vd           : 1;
963                                 uint16_t        is_global_spare : 1;
964                                 uint16_t        is_spare        : 1;
965                                 uint16_t        is_foreign      : 1;
966                                 uint16_t        reserved        : 7;
967                                 uint16_t        intf            : 4;
968                         } pd_type;
969                         uint16_t        type;
970                 } v;
971                 uint16_t                reserved;
972         } ddf;
973         struct {
974                 uint32_t                reserved;
975         } non_disk;
976         uint32_t                        type;
977 } __packed;
978
979 struct mfi_pd_progress {
980         uint32_t                        active;
981 #define MFI_PD_PROGRESS_REBUILD (1<<0)
982 #define MFI_PD_PROGRESS_PATROL  (1<<1)
983 #define MFI_PD_PROGRESS_CLEAR   (1<<2)
984         struct mfi_progress             rbld;
985         struct mfi_progress             patrol;
986         struct mfi_progress             clear;
987         struct mfi_progress             reserved[4];
988 } __packed;
989
990 struct mfi_pd_info {
991         union mfi_pd_ref                ref;
992         uint8_t                         inquiry_data[96];
993         uint8_t                         vpd_page83[64];
994         uint8_t                         not_supported;
995         uint8_t                         scsi_dev_type;
996         uint8_t                         connected_port_bitmap;
997         uint8_t                         device_speed;
998         uint32_t                        media_err_count;
999         uint32_t                        other_err_count;
1000         uint32_t                        pred_fail_count;
1001         uint32_t                        last_pred_fail_event_seq_num;
1002         uint16_t                        fw_state;       /* MFI_PD_STATE_* */
1003         uint8_t                         disabled_for_removal;
1004         uint8_t                         link_speed;
1005         union mfi_pd_ddf_type           state;
1006         struct {
1007                 uint8_t                 count;
1008                 uint8_t                 is_path_broken;
1009                 uint8_t                 reserved[6];
1010                 uint64_t                sas_addr[4];
1011         } path_info;
1012         uint64_t                        raw_size;
1013         uint64_t                        non_coerced_size;
1014         uint64_t                        coerced_size;
1015         uint16_t                        encl_device_id;
1016         uint8_t                         encl_index;
1017         uint8_t                         slot_number;
1018         struct mfi_pd_progress          prog_info;
1019         uint8_t                         bad_block_table_full;
1020         uint8_t                         unusable_in_current_config;
1021         uint8_t                         vpd_page83_ext[64];
1022         uint8_t                         reserved[512-358];
1023 } __packed;
1024
1025 struct mfi_pd_address {
1026         uint16_t                device_id;
1027         uint16_t                encl_device_id;
1028         uint8_t                 encl_index;
1029         uint8_t                 slot_number;
1030         uint8_t                 scsi_dev_type;  /* 0 = disk */
1031         uint8_t                 connect_port_bitmap;
1032         uint64_t                sas_addr[2];
1033 } __packed;
1034
1035 #define MAX_SYS_PDS 240
1036 struct mfi_pd_list {
1037         uint32_t                size;
1038         uint32_t                count;
1039         struct mfi_pd_address   addr[MAX_SYS_PDS];
1040 } __packed;
1041
1042 enum mfi_pd_state {
1043         MFI_PD_STATE_UNCONFIGURED_GOOD = 0x00,
1044         MFI_PD_STATE_UNCONFIGURED_BAD = 0x01,
1045         MFI_PD_STATE_HOT_SPARE = 0x02,
1046         MFI_PD_STATE_OFFLINE = 0x10,
1047         MFI_PD_STATE_FAILED = 0x11,
1048         MFI_PD_STATE_REBUILD = 0x14,
1049         MFI_PD_STATE_ONLINE = 0x18,
1050         MFI_PD_STATE_COPYBACK = 0x20,
1051         MFI_PD_STATE_SYSTEM = 0x40
1052 };
1053
1054 union mfi_ld_ref {
1055         struct {
1056                 uint8_t         target_id;
1057                 uint8_t         reserved;
1058                 uint16_t        seq;
1059         } v;
1060         uint32_t                ref;
1061 } __packed;
1062
1063 struct mfi_ld_list {
1064         uint32_t                ld_count;
1065         uint32_t                reserved1;
1066         struct {
1067                 union mfi_ld_ref        ld;
1068                 uint8_t         state;
1069                 uint8_t         reserved2[3];
1070                 uint64_t        size;
1071         } ld_list[MFI_MAX_LD];
1072 } __packed;
1073
1074 enum mfi_ld_access {
1075         MFI_LD_ACCESS_RW =      0,
1076         MFI_LD_ACCSSS_RO =      2,
1077         MFI_LD_ACCESS_BLOCKED = 3,
1078 };
1079 #define MFI_LD_ACCESS_MASK      3
1080
1081 enum mfi_ld_state {
1082         MFI_LD_STATE_OFFLINE =                  0,
1083         MFI_LD_STATE_PARTIALLY_DEGRADED =       1,
1084         MFI_LD_STATE_DEGRADED =                 2,
1085         MFI_LD_STATE_OPTIMAL =                  3
1086 };
1087
1088 struct mfi_ld_props {
1089         union mfi_ld_ref        ld;
1090         char                    name[16];
1091         uint8_t                 default_cache_policy;
1092         uint8_t                 access_policy;
1093         uint8_t                 disk_cache_policy;
1094         uint8_t                 current_cache_policy;
1095         uint8_t                 no_bgi;
1096         uint8_t                 reserved[7];
1097 } __packed;
1098
1099 struct mfi_ld_params {
1100         uint8_t                 primary_raid_level;
1101         uint8_t                 raid_level_qualifier;
1102         uint8_t                 secondary_raid_level;
1103         uint8_t                 stripe_size;
1104         uint8_t                 num_drives;
1105         uint8_t                 span_depth;
1106         uint8_t                 state;
1107         uint8_t                 init_state;
1108 #define MFI_LD_PARAMS_INIT_NO           0
1109 #define MFI_LD_PARAMS_INIT_QUICK        1
1110 #define MFI_LD_PARAMS_INIT_FULL         2
1111         uint8_t                 is_consistent;
1112         uint8_t                 reserved1[6];
1113         uint8_t                 isSSCD;
1114         uint8_t                 reserved2[16];
1115 } __packed;
1116
1117 struct mfi_ld_progress {
1118         uint32_t                active;
1119 #define MFI_LD_PROGRESS_CC      (1<<0)
1120 #define MFI_LD_PROGRESS_BGI     (1<<1)
1121 #define MFI_LD_PROGRESS_FGI     (1<<2)
1122 #define MFI_LD_PROGRESS_RECON   (1<<3)
1123         struct mfi_progress     cc;
1124         struct mfi_progress     bgi;
1125         struct mfi_progress     fgi;
1126         struct mfi_progress     recon;
1127         struct mfi_progress     reserved[4];
1128 } __packed;
1129
1130 struct mfi_span {
1131         uint64_t                start_block;
1132         uint64_t                num_blocks;
1133         uint16_t                array_ref;
1134         uint8_t                 reserved[6];
1135 } __packed;
1136
1137 #define MFI_MAX_SPAN_DEPTH      8
1138 struct mfi_ld_config {
1139         struct mfi_ld_props     properties;
1140         struct mfi_ld_params    params;
1141         struct mfi_span         span[MFI_MAX_SPAN_DEPTH];
1142 } __packed;
1143
1144 struct mfi_ld_info {
1145         struct mfi_ld_config    ld_config;
1146         uint64_t                size;
1147         struct mfi_ld_progress  progress;
1148         uint16_t                cluster_owner;
1149         uint8_t                 reconstruct_active;
1150         uint8_t                 reserved1[1];
1151         uint8_t                 vpd_page83[64];
1152         uint8_t                 reserved2[16];
1153 } __packed;
1154
1155 #define MAX_ARRAYS 16
1156 struct mfi_spare {
1157         union mfi_pd_ref        ref;
1158         uint8_t                 spare_type;
1159 #define MFI_SPARE_DEDICATED     (1 << 0)
1160 #define MFI_SPARE_REVERTIBLE    (1 << 1)
1161 #define MFI_SPARE_ENCL_AFFINITY (1 << 2)
1162         uint8_t                 reserved[2];
1163         uint8_t                 array_count;
1164         uint16_t                array_ref[MAX_ARRAYS];
1165 } __packed;
1166
1167 struct mfi_array {
1168         uint64_t                        size;
1169         uint8_t                         num_drives;
1170         uint8_t                         reserved;
1171         uint16_t                        array_ref;
1172         uint8_t                         pad[20];
1173         struct {
1174                 union mfi_pd_ref        ref;    /* 0xffff == missing drive */
1175                 uint16_t                fw_state;       /* MFI_PD_STATE_* */
1176                 struct {
1177                         uint8_t         pd;
1178                         uint8_t         slot;
1179                 } encl;
1180         } pd[0];
1181 } __packed;
1182
1183 struct mfi_config_data {
1184         uint32_t                size;
1185         uint16_t                array_count;
1186         uint16_t                array_size;
1187         uint16_t                log_drv_count;
1188         uint16_t                log_drv_size;
1189         uint16_t                spares_count;
1190         uint16_t                spares_size;
1191         uint8_t                 reserved[16];
1192         struct mfi_array        array[0];
1193         struct mfi_ld_config    ld[0];
1194         struct mfi_spare        spare[0];
1195 } __packed;
1196
1197 struct mfi_bbu_capacity_info {
1198         uint16_t                relative_charge;
1199         uint16_t                absolute_charge;
1200         uint16_t                remaining_capacity;
1201         uint16_t                full_charge_capacity;
1202         uint16_t                run_time_to_empty;
1203         uint16_t                average_time_to_empty;
1204         uint16_t                average_time_to_full;
1205         uint16_t                cycle_count;
1206         uint16_t                max_error;
1207         uint16_t                remaining_capacity_alarm;
1208         uint16_t                remaining_time_alarm;
1209         uint8_t                 reserved[26];
1210 } __packed;
1211
1212 struct mfi_bbu_design_info {
1213         uint32_t                mfg_date;
1214         uint16_t                design_capacity;
1215         uint16_t                design_voltage;
1216         uint16_t                spec_info;
1217         uint16_t                serial_number;
1218         uint16_t                pack_stat_config;
1219         uint8_t                 mfg_name[12];
1220         uint8_t                 device_name[8];
1221         uint8_t                 device_chemistry[8];
1222         uint8_t                 mfg_data[8];
1223         uint8_t                 reserved[17];
1224 } __packed;
1225
1226 struct mfi_ibbu_state {
1227         uint16_t                gas_guage_status;
1228         uint16_t                relative_charge;
1229         uint16_t                charger_system_state;
1230         uint16_t                charger_system_ctrl;
1231         uint16_t                charging_current;
1232         uint16_t                absolute_charge;
1233         uint16_t                max_error;
1234         uint8_t                 reserved[18];
1235 } __packed;
1236
1237 struct mfi_bbu_state {
1238         uint16_t                gas_guage_status;
1239         uint16_t                relative_charge;
1240         uint16_t                charger_status;
1241         uint16_t                remaining_capacity;
1242         uint16_t                full_charge_capacity;
1243         uint8_t                 is_SOH_good;
1244         uint8_t                 reserved[21];
1245 } __packed;
1246
1247 union mfi_bbu_status_detail {
1248         struct mfi_ibbu_state   ibbu;
1249         struct mfi_bbu_state    bbu;
1250 };
1251
1252 struct mfi_bbu_status {
1253         uint8_t                 battery_type;
1254 #define MFI_BBU_TYPE_NONE       0
1255 #define MFI_BBU_TYPE_IBBU       1
1256 #define MFI_BBU_TYPE_BBU        2
1257         uint8_t                 reserved;
1258         uint16_t                voltage;
1259         int16_t                 current;
1260         uint16_t                temperature;
1261         uint32_t                fw_status;
1262 #define MFI_BBU_STATE_PACK_MISSING      (1 << 0)
1263 #define MFI_BBU_STATE_VOLTAGE_LOW       (1 << 1)
1264 #define MFI_BBU_STATE_TEMPERATURE_HIGH  (1 << 2)
1265 #define MFI_BBU_STATE_CHARGE_ACTIVE     (1 << 0)
1266 #define MFI_BBU_STATE_DISCHARGE_ACTIVE  (1 << 0)
1267         uint8_t                 pad[20];
1268         union mfi_bbu_status_detail detail;
1269 } __packed;
1270
1271 enum mfi_pr_state {
1272         MFI_PR_STATE_STOPPED = 0,
1273         MFI_PR_STATE_READY = 1,
1274         MFI_PR_STATE_ACTIVE = 2,
1275         MFI_PR_STATE_ABORTED = 0xff
1276 };
1277
1278 struct mfi_pr_status {
1279         uint32_t                num_iteration;
1280         uint8_t                 state;
1281         uint8_t                 num_pd_done;
1282         uint8_t                 reserved[10];
1283 };
1284
1285 enum mfi_pr_opmode {
1286         MFI_PR_OPMODE_AUTO = 0,
1287         MFI_PR_OPMODE_MANUAL = 1,
1288         MFI_PR_OPMODE_DISABLED = 2
1289 };
1290
1291 struct mfi_pr_properties {
1292         uint8_t                 op_mode;
1293         uint8_t                 max_pd;
1294         uint8_t                 reserved;
1295         uint8_t                 exclude_ld_count;
1296         uint16_t                excluded_ld[MFI_MAX_LD];
1297         uint8_t                 cur_pd_map[MFI_MAX_PD / 8];
1298         uint8_t                 last_pd_map[MFI_MAX_PD / 8];
1299         uint32_t                next_exec;
1300         uint32_t                exec_freq;
1301         uint32_t                clear_freq;
1302 };
1303
1304 #define MFI_SCSI_MAX_TARGETS    128
1305 #define MFI_SCSI_MAX_LUNS       8
1306 #define MFI_SCSI_INITIATOR_ID   255
1307 #define MFI_SCSI_MAX_CMDS       8
1308 #define MFI_SCSI_MAX_CDB_LEN    16
1309
1310 #endif /* _MFIREG_H */