xref: /freebsd/sys/dev/mfi/mfireg.h (revision 5dbee633d22f727e8a10c16c24934646ed889bed)
12e21a3efSScott Long /*-
22e21a3efSScott Long  * Copyright (c) 2006 IronPort Systems
32e21a3efSScott Long  * All rights reserved.
42e21a3efSScott Long  *
52e21a3efSScott Long  * Redistribution and use in source and binary forms, with or without
62e21a3efSScott Long  * modification, are permitted provided that the following conditions
72e21a3efSScott Long  * are met:
82e21a3efSScott Long  * 1. Redistributions of source code must retain the above copyright
92e21a3efSScott Long  *    notice, this list of conditions and the following disclaimer.
102e21a3efSScott Long  * 2. Redistributions in binary form must reproduce the above copyright
112e21a3efSScott Long  *    notice, this list of conditions and the following disclaimer in the
122e21a3efSScott Long  *    documentation and/or other materials provided with the distribution.
132e21a3efSScott Long  *
142e21a3efSScott Long  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
152e21a3efSScott Long  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
162e21a3efSScott Long  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
172e21a3efSScott Long  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
182e21a3efSScott Long  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
192e21a3efSScott Long  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
202e21a3efSScott Long  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
212e21a3efSScott Long  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
222e21a3efSScott Long  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
232e21a3efSScott Long  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
242e21a3efSScott Long  * SUCH DAMAGE.
252e21a3efSScott Long  */
26610f2ef3SScott Long /*-
27610f2ef3SScott Long  * Copyright (c) 2007 LSI Corp.
28610f2ef3SScott Long  * Copyright (c) 2007 Rajesh Prabhakaran.
29610f2ef3SScott Long  * All rights reserved.
30610f2ef3SScott Long  *
31610f2ef3SScott Long  * Redistribution and use in source and binary forms, with or without
32610f2ef3SScott Long  * modification, are permitted provided that the following conditions
33610f2ef3SScott Long  * are met:
34610f2ef3SScott Long  * 1. Redistributions of source code must retain the above copyright
35610f2ef3SScott Long  *    notice, this list of conditions and the following disclaimer.
36610f2ef3SScott Long  * 2. Redistributions in binary form must reproduce the above copyright
37610f2ef3SScott Long  *    notice, this list of conditions and the following disclaimer in the
38610f2ef3SScott Long  *    documentation and/or other materials provided with the distribution.
39610f2ef3SScott Long  *
40610f2ef3SScott Long  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
41610f2ef3SScott Long  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42610f2ef3SScott Long  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43610f2ef3SScott Long  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44610f2ef3SScott Long  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45610f2ef3SScott Long  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46610f2ef3SScott Long  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47610f2ef3SScott Long  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48610f2ef3SScott Long  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49610f2ef3SScott Long  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50610f2ef3SScott Long  * SUCH DAMAGE.
51610f2ef3SScott Long  */
522e21a3efSScott Long 
532e21a3efSScott Long #ifndef _MFIREG_H
542e21a3efSScott Long #define _MFIREG_H
552e21a3efSScott Long 
562e21a3efSScott Long #include <sys/cdefs.h>
572e21a3efSScott Long __FBSDID("$FreeBSD$");
582e21a3efSScott Long 
592e21a3efSScott Long /*
602e21a3efSScott Long  * MegaRAID SAS MFI firmware definitions
612e21a3efSScott Long  *
622e21a3efSScott Long  * Calling this driver 'MegaRAID SAS' is a bit misleading.  It's a completely
632e21a3efSScott Long  * new firmware interface from the old AMI MegaRAID one, and there is no
642e21a3efSScott Long  * reason why this interface should be limited to just SAS.  In any case, LSI
652e21a3efSScott Long  * seems to also call this interface 'MFI', so that will be used here.
662e21a3efSScott Long  */
672e21a3efSScott Long 
682e21a3efSScott Long /*
692e21a3efSScott Long  * Start with the register set.  All registers are 32 bits wide.
702e21a3efSScott Long  * The usual Intel IOP style setup.
712e21a3efSScott Long  */
722e21a3efSScott Long #define MFI_IMSG0	0x10	/* Inbound message 0 */
732e21a3efSScott Long #define MFI_IMSG1	0x14	/* Inbound message 1 */
742e21a3efSScott Long #define MFI_OMSG0	0x18	/* Outbound message 0 */
752e21a3efSScott Long #define MFI_OMSG1	0x1c	/* Outbound message 1 */
762e21a3efSScott Long #define MFI_IDB		0x20	/* Inbound doorbell */
772e21a3efSScott Long #define MFI_ISTS	0x24	/* Inbound interrupt status */
782e21a3efSScott Long #define MFI_IMSK	0x28	/* Inbound interrupt mask */
792e21a3efSScott Long #define MFI_ODB		0x2c	/* Outbound doorbell */
802e21a3efSScott Long #define MFI_OSTS	0x30	/* Outbound interrupt status */
812e21a3efSScott Long #define MFI_OMSK	0x34	/* Outbound interrupt mask */
822e21a3efSScott Long #define MFI_IQP		0x40	/* Inbound queue port */
832e21a3efSScott Long #define MFI_OQP		0x44	/* Outbound queue port */
842e21a3efSScott Long 
85610f2ef3SScott Long /*
86610f2ef3SScott Long  * 1078 specific related register
87610f2ef3SScott Long  */
88610f2ef3SScott Long #define MFI_ODR0	0x9c 		/* outbound doorbell register0 */
89610f2ef3SScott Long #define MFI_ODCR0	0xa0 		/* outbound doorbell clear register0  */
90610f2ef3SScott Long #define MFI_OSP0	0xb0 		/* outbound scratch pad0  */
91610f2ef3SScott Long #define MFI_1078_EIM	0x80000004 	/* 1078 enable intrrupt mask  */
92610f2ef3SScott Long #define MFI_RMI		0x2 		/* reply message interrupt  */
93610f2ef3SScott Long #define MFI_1078_RM	0x80000000 	/* reply 1078 message interrupt  */
94610f2ef3SScott Long #define MFI_ODC		0x4 		/* outbound doorbell change interrupt */
95610f2ef3SScott Long 
96fa1e6ef4SDoug Ambrisko /*
97fa1e6ef4SDoug Ambrisko  * GEN2 specific changes
98fa1e6ef4SDoug Ambrisko  */
99fa1e6ef4SDoug Ambrisko #define MFI_GEN2_EIM	0x00000005	/* GEN2 enable interrupt mask */
100fa1e6ef4SDoug Ambrisko #define MFI_GEN2_RM	0x00000001	/* reply GEN2 message interrupt */
101fa1e6ef4SDoug Ambrisko 
1022e21a3efSScott Long /* Bits for MFI_OSTS */
1032e21a3efSScott Long #define MFI_OSTS_INTR_VALID	0x00000002
1042e21a3efSScott Long 
1052e21a3efSScott Long /*
1062e21a3efSScott Long  * Firmware state values.  Found in OMSG0 during initialization.
1072e21a3efSScott Long  */
1082e21a3efSScott Long #define MFI_FWSTATE_MASK		0xf0000000
1092e21a3efSScott Long #define MFI_FWSTATE_UNDEFINED		0x00000000
1102e21a3efSScott Long #define MFI_FWSTATE_BB_INIT		0x10000000
1112e21a3efSScott Long #define MFI_FWSTATE_FW_INIT		0x40000000
1122e21a3efSScott Long #define MFI_FWSTATE_WAIT_HANDSHAKE	0x60000000
1132e21a3efSScott Long #define MFI_FWSTATE_FW_INIT_2		0x70000000
1142e21a3efSScott Long #define MFI_FWSTATE_DEVICE_SCAN		0x80000000
115*5dbee633SJohn Baldwin #define MFI_FWSTATE_BOOT_MESSAGE_PENDING	0x90000000
1162e21a3efSScott Long #define MFI_FWSTATE_FLUSH_CACHE		0xa0000000
1172e21a3efSScott Long #define MFI_FWSTATE_READY		0xb0000000
1182e21a3efSScott Long #define MFI_FWSTATE_OPERATIONAL		0xc0000000
1192e21a3efSScott Long #define MFI_FWSTATE_FAULT		0xf0000000
1202e21a3efSScott Long #define MFI_FWSTATE_MAXSGL_MASK		0x00ff0000
1212e21a3efSScott Long #define MFI_FWSTATE_MAXCMD_MASK		0x0000ffff
1222e21a3efSScott Long 
1232e21a3efSScott Long /*
1242e21a3efSScott Long  * Control bits to drive the card to ready state.  These go into the IDB
1252e21a3efSScott Long  * register.
1262e21a3efSScott Long  */
1272e21a3efSScott Long #define MFI_FWINIT_ABORT	0x00000000 /* Abort all pending commands */
1282e21a3efSScott Long #define MFI_FWINIT_READY	0x00000002 /* Move from operational to ready */
1292e21a3efSScott Long #define MFI_FWINIT_MFIMODE	0x00000004 /* unknown */
1302e21a3efSScott Long #define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */
131*5dbee633SJohn Baldwin #define MFI_FWINIT_HOTPLUG	0x00000010
1322e21a3efSScott Long 
1332e21a3efSScott Long /* MFI Commands */
1342e21a3efSScott Long typedef enum {
1352e21a3efSScott Long 	MFI_CMD_INIT =		0x00,
1362e21a3efSScott Long 	MFI_CMD_LD_READ,
1372e21a3efSScott Long 	MFI_CMD_LD_WRITE,
1382e21a3efSScott Long 	MFI_CMD_LD_SCSI_IO,
1392e21a3efSScott Long 	MFI_CMD_PD_SCSI_IO,
1402e21a3efSScott Long 	MFI_CMD_DCMD,
1412e21a3efSScott Long 	MFI_CMD_ABORT,
1422e21a3efSScott Long 	MFI_CMD_SMP,
1432e21a3efSScott Long 	MFI_CMD_STP
1442e21a3efSScott Long } mfi_cmd_t;
1452e21a3efSScott Long 
1462e21a3efSScott Long /* Direct commands */
1472e21a3efSScott Long typedef enum {
1482e21a3efSScott Long 	MFI_DCMD_CTRL_GETINFO =		0x01010000,
149441f6d5dSScott Long 	MFI_DCMD_CTRL_MFC_DEFAULTS_GET =0x010e0201,
150441f6d5dSScott Long 	MFI_DCMD_CTRL_MFC_DEFAULTS_SET =0x010e0202,
1512e21a3efSScott Long 	MFI_DCMD_CTRL_FLUSHCACHE =	0x01101000,
1522e21a3efSScott Long 	MFI_DCMD_CTRL_SHUTDOWN =	0x01050000,
1532e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_GETINFO =	0x01040100,
1542e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_GET =	0x01040300,
1552e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_WAIT =	0x01040500,
156763fae79SScott Long 	MFI_DCMD_PR_GET_STATUS =	0x01070100,
157763fae79SScott Long 	MFI_DCMD_PR_GET_PROPERTIES =	0x01070200,
158763fae79SScott Long 	MFI_DCMD_PR_SET_PROPERTIES =	0x01070300,
159763fae79SScott Long 	MFI_DCMD_PR_START =		0x01070400,
160763fae79SScott Long 	MFI_DCMD_PR_STOP =		0x01070500,
161763fae79SScott Long 	MFI_DCMD_TIME_SECS_GET =	0x01080201,
162763fae79SScott Long 	MFI_DCMD_FLASH_FW_OPEN =	0x010f0100,
163763fae79SScott Long 	MFI_DCMD_FLASH_FW_DOWNLOAD =	0x010f0200,
164763fae79SScott Long 	MFI_DCMD_FLASH_FW_FLASH =	0x010f0300,
165763fae79SScott Long 	MFI_DCMD_FLASH_FW_CLOSE =	0x010f0400,
166763fae79SScott Long 	MFI_DCMD_PD_GET_LIST =		0x02010000,
167763fae79SScott Long 	MFI_DCMD_PD_GET_INFO = 		0x02020000,
168763fae79SScott Long 	MFI_DCMD_PD_STATE_SET =		0x02030100,
169763fae79SScott Long 	MFI_DCMD_PD_REBUILD_START =	0x02040100,
170763fae79SScott Long 	MFI_DCMD_PD_REBUILD_ABORT =	0x02040200,
171763fae79SScott Long 	MFI_DCMD_PD_CLEAR_START =	0x02050100,
172763fae79SScott Long 	MFI_DCMD_PD_CLEAR_ABORT =	0x02050200,
173763fae79SScott Long 	MFI_DCMD_PD_GET_PROGRESS =	0x02060000,
174763fae79SScott Long 	MFI_DCMD_PD_LOCATE_START =	0x02070100,
175763fae79SScott Long 	MFI_DCMD_PD_LOCATE_STOP =	0x02070200,
176c0b332d1SPaul Saab 	MFI_DCMD_LD_GET_LIST =		0x03010000,
177c0b332d1SPaul Saab 	MFI_DCMD_LD_GET_INFO =		0x03020000,
1782e21a3efSScott Long 	MFI_DCMD_LD_GET_PROP =		0x03030000,
179c0b332d1SPaul Saab 	MFI_DCMD_LD_SET_PROP =		0x03040000,
180763fae79SScott Long 	MFI_DCMD_LD_INIT_START =	0x03060100,
1818ec5c98bSJohn Baldwin 	MFI_DCMD_LD_DELETE =		0x03090000,
182441f6d5dSScott Long 	MFI_DCMD_CFG_READ =		0x04010000,
183441f6d5dSScott Long 	MFI_DCMD_CFG_ADD =		0x04020000,
184441f6d5dSScott Long 	MFI_DCMD_CFG_CLEAR =		0x04030000,
185763fae79SScott Long 	MFI_DCMD_CFG_MAKE_SPARE =	0x04040000,
186763fae79SScott Long 	MFI_DCMD_CFG_REMOVE_SPARE =	0x04050000,
187fa1e6ef4SDoug Ambrisko 	MFI_DCMD_CFG_FOREIGN_IMPORT =	0x04060400,
188763fae79SScott Long 	MFI_DCMD_BBU_GET_STATUS =	0x05010000,
189763fae79SScott Long 	MFI_DCMD_BBU_GET_CAPACITY_INFO =0x05020000,
190763fae79SScott Long 	MFI_DCMD_BBU_GET_DESIGN_INFO =	0x05030000,
1912e21a3efSScott Long 	MFI_DCMD_CLUSTER =		0x08000000,
1922e21a3efSScott Long 	MFI_DCMD_CLUSTER_RESET_ALL =	0x08010100,
1932e21a3efSScott Long 	MFI_DCMD_CLUSTER_RESET_LD =	0x08010200
1942e21a3efSScott Long } mfi_dcmd_t;
1952e21a3efSScott Long 
1962e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_FLUSHCACHE */
1972e21a3efSScott Long #define MFI_FLUSHCACHE_CTRL	0x01
1982e21a3efSScott Long #define MFI_FLUSHCACHE_DISK	0x02
1992e21a3efSScott Long 
2002e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_SHUTDOWN */
2012e21a3efSScott Long #define MFI_SHUTDOWN_SPINDOWN	0x01
2022e21a3efSScott Long 
2032e21a3efSScott Long /*
204741367d5SDoug Ambrisko  * MFI Frame flags
2052e21a3efSScott Long  */
2062e21a3efSScott Long #define MFI_FRAME_POST_IN_REPLY_QUEUE		0x0000
2072e21a3efSScott Long #define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE	0x0001
2082e21a3efSScott Long #define MFI_FRAME_SGL32				0x0000
2092e21a3efSScott Long #define MFI_FRAME_SGL64				0x0002
2102e21a3efSScott Long #define MFI_FRAME_SENSE32			0x0000
2112e21a3efSScott Long #define MFI_FRAME_SENSE64			0x0004
2122e21a3efSScott Long #define MFI_FRAME_DIR_NONE			0x0000
2132e21a3efSScott Long #define MFI_FRAME_DIR_WRITE			0x0008
2142e21a3efSScott Long #define MFI_FRAME_DIR_READ			0x0010
2152e21a3efSScott Long #define MFI_FRAME_DIR_BOTH			0x0018
2162e21a3efSScott Long 
2172e21a3efSScott Long /* MFI Status codes */
2182e21a3efSScott Long typedef enum {
2192e21a3efSScott Long 	MFI_STAT_OK =			0x00,
2202e21a3efSScott Long 	MFI_STAT_INVALID_CMD,
2212e21a3efSScott Long 	MFI_STAT_INVALID_DCMD,
2222e21a3efSScott Long 	MFI_STAT_INVALID_PARAMETER,
2232e21a3efSScott Long 	MFI_STAT_INVALID_SEQUENCE_NUMBER,
2242e21a3efSScott Long 	MFI_STAT_ABORT_NOT_POSSIBLE,
2252e21a3efSScott Long 	MFI_STAT_APP_HOST_CODE_NOT_FOUND,
2262e21a3efSScott Long 	MFI_STAT_APP_IN_USE,
2272e21a3efSScott Long 	MFI_STAT_APP_NOT_INITIALIZED,
2282e21a3efSScott Long 	MFI_STAT_ARRAY_INDEX_INVALID,
2292e21a3efSScott Long 	MFI_STAT_ARRAY_ROW_NOT_EMPTY,
2302e21a3efSScott Long 	MFI_STAT_CONFIG_RESOURCE_CONFLICT,
2312e21a3efSScott Long 	MFI_STAT_DEVICE_NOT_FOUND,
2322e21a3efSScott Long 	MFI_STAT_DRIVE_TOO_SMALL,
2332e21a3efSScott Long 	MFI_STAT_FLASH_ALLOC_FAIL,
2342e21a3efSScott Long 	MFI_STAT_FLASH_BUSY,
2352e21a3efSScott Long 	MFI_STAT_FLASH_ERROR =		0x10,
2362e21a3efSScott Long 	MFI_STAT_FLASH_IMAGE_BAD,
2372e21a3efSScott Long 	MFI_STAT_FLASH_IMAGE_INCOMPLETE,
2382e21a3efSScott Long 	MFI_STAT_FLASH_NOT_OPEN,
2392e21a3efSScott Long 	MFI_STAT_FLASH_NOT_STARTED,
2402e21a3efSScott Long 	MFI_STAT_FLUSH_FAILED,
2412e21a3efSScott Long 	MFI_STAT_HOST_CODE_NOT_FOUNT,
2422e21a3efSScott Long 	MFI_STAT_LD_CC_IN_PROGRESS,
2432e21a3efSScott Long 	MFI_STAT_LD_INIT_IN_PROGRESS,
2442e21a3efSScott Long 	MFI_STAT_LD_LBA_OUT_OF_RANGE,
2452e21a3efSScott Long 	MFI_STAT_LD_MAX_CONFIGURED,
2462e21a3efSScott Long 	MFI_STAT_LD_NOT_OPTIMAL,
2472e21a3efSScott Long 	MFI_STAT_LD_RBLD_IN_PROGRESS,
2482e21a3efSScott Long 	MFI_STAT_LD_RECON_IN_PROGRESS,
2492e21a3efSScott Long 	MFI_STAT_LD_WRONG_RAID_LEVEL,
2502e21a3efSScott Long 	MFI_STAT_MAX_SPARES_EXCEEDED,
2512e21a3efSScott Long 	MFI_STAT_MEMORY_NOT_AVAILABLE =	0x20,
2522e21a3efSScott Long 	MFI_STAT_MFC_HW_ERROR,
2532e21a3efSScott Long 	MFI_STAT_NO_HW_PRESENT,
2542e21a3efSScott Long 	MFI_STAT_NOT_FOUND,
2552e21a3efSScott Long 	MFI_STAT_NOT_IN_ENCL,
2562e21a3efSScott Long 	MFI_STAT_PD_CLEAR_IN_PROGRESS,
2572e21a3efSScott Long 	MFI_STAT_PD_TYPE_WRONG,
2582e21a3efSScott Long 	MFI_STAT_PR_DISABLED,
2592e21a3efSScott Long 	MFI_STAT_ROW_INDEX_INVALID,
2602e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_ACTION,
2612e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_DATA,
2622e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_PAGE,
2632e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_TYPE,
2642e21a3efSScott Long 	MFI_STAT_SCSI_DONE_WITH_ERROR,
2652e21a3efSScott Long 	MFI_STAT_SCSI_IO_FAILED,
2662e21a3efSScott Long 	MFI_STAT_SCSI_RESERVATION_CONFLICT,
2672e21a3efSScott Long 	MFI_STAT_SHUTDOWN_FAILED =	0x30,
2682e21a3efSScott Long 	MFI_STAT_TIME_NOT_SET,
2692e21a3efSScott Long 	MFI_STAT_WRONG_STATE,
2702e21a3efSScott Long 	MFI_STAT_LD_OFFLINE,
2712e21a3efSScott Long 	MFI_STAT_PEER_NOTIFICATION_REJECTED,
2722e21a3efSScott Long 	MFI_STAT_PEER_NOTIFICATION_FAILED,
2732e21a3efSScott Long 	MFI_STAT_RESERVATION_IN_PROGRESS,
2742e21a3efSScott Long 	MFI_STAT_I2C_ERRORS_DETECTED,
2752e21a3efSScott Long 	MFI_STAT_PCI_ERRORS_DETECTED,
276763fae79SScott Long 	MFI_STAT_DIAG_FAILED,
277763fae79SScott Long 	MFI_STAT_BOOT_MSG_PENDING,
278763fae79SScott Long 	MFI_STAT_FOREIGN_CONFIG_INCOMPLETE,
2792e21a3efSScott Long 	MFI_STAT_INVALID_STATUS =	0xFF
2802e21a3efSScott Long } mfi_status_t;
2812e21a3efSScott Long 
2822e21a3efSScott Long typedef enum {
2832e21a3efSScott Long 	MFI_EVT_CLASS_DEBUG =		-2,
2842e21a3efSScott Long 	MFI_EVT_CLASS_PROGRESS =	-1,
2852e21a3efSScott Long 	MFI_EVT_CLASS_INFO =		0,
2862e21a3efSScott Long 	MFI_EVT_CLASS_WARNING =		1,
2872e21a3efSScott Long 	MFI_EVT_CLASS_CRITICAL =	2,
2882e21a3efSScott Long 	MFI_EVT_CLASS_FATAL =		3,
2892e21a3efSScott Long 	MFI_EVT_CLASS_DEAD =		4
2902e21a3efSScott Long } mfi_evt_class_t;
2912e21a3efSScott Long 
2922e21a3efSScott Long typedef enum {
2932e21a3efSScott Long 	MFI_EVT_LOCALE_LD =		0x0001,
2942e21a3efSScott Long 	MFI_EVT_LOCALE_PD =		0x0002,
2952e21a3efSScott Long 	MFI_EVT_LOCALE_ENCL =		0x0004,
2962e21a3efSScott Long 	MFI_EVT_LOCALE_BBU =		0x0008,
2972e21a3efSScott Long 	MFI_EVT_LOCALE_SAS =		0x0010,
2982e21a3efSScott Long 	MFI_EVT_LOCALE_CTRL =		0x0020,
2992e21a3efSScott Long 	MFI_EVT_LOCALE_CONFIG =		0x0040,
3002e21a3efSScott Long 	MFI_EVT_LOCALE_CLUSTER =	0x0080,
3012e21a3efSScott Long 	MFI_EVT_LOCALE_ALL =		0xffff
3022e21a3efSScott Long } mfi_evt_locale_t;
3032e21a3efSScott Long 
3042e21a3efSScott Long typedef enum {
3052e21a3efSScott Long 	MR_EVT_ARGS_NONE =		0x00,
3062e21a3efSScott Long 	MR_EVT_ARGS_CDB_SENSE,
3072e21a3efSScott Long 	MR_EVT_ARGS_LD,
3082e21a3efSScott Long 	MR_EVT_ARGS_LD_COUNT,
3092e21a3efSScott Long 	MR_EVT_ARGS_LD_LBA,
3102e21a3efSScott Long 	MR_EVT_ARGS_LD_OWNER,
3112e21a3efSScott Long 	MR_EVT_ARGS_LD_LBA_PD_LBA,
3122e21a3efSScott Long 	MR_EVT_ARGS_LD_PROG,
3132e21a3efSScott Long 	MR_EVT_ARGS_LD_STATE,
3142e21a3efSScott Long 	MR_EVT_ARGS_LD_STRIP,
3152e21a3efSScott Long 	MR_EVT_ARGS_PD,
3162e21a3efSScott Long 	MR_EVT_ARGS_PD_ERR,
3172e21a3efSScott Long 	MR_EVT_ARGS_PD_LBA,
3182e21a3efSScott Long 	MR_EVT_ARGS_PD_LBA_LD,
3192e21a3efSScott Long 	MR_EVT_ARGS_PD_PROG,
3202e21a3efSScott Long 	MR_EVT_ARGS_PD_STATE,
3212e21a3efSScott Long 	MR_EVT_ARGS_PCI,
3222e21a3efSScott Long 	MR_EVT_ARGS_RATE,
3232e21a3efSScott Long 	MR_EVT_ARGS_STR,
3242e21a3efSScott Long 	MR_EVT_ARGS_TIME,
3252e21a3efSScott Long 	MR_EVT_ARGS_ECC
3262e21a3efSScott Long } mfi_evt_args;
3272e21a3efSScott Long 
328441f6d5dSScott Long typedef enum {
329441f6d5dSScott Long 	MR_LD_CACHE_WRITE_BACK =	0x01,
330441f6d5dSScott Long 	MR_LD_CACHE_WRITE_ADAPTIVE =	0x02,
331441f6d5dSScott Long 	MR_LD_CACHE_READ_AHEAD =	0x04,
332441f6d5dSScott Long 	MR_LD_CACHE_READ_ADAPTIVE =	0x08,
333441f6d5dSScott Long 	MR_LD_CACHE_WRITE_CACHE_BAD_BBU=0x10,
334441f6d5dSScott Long 	MR_LD_CACHE_ALLOW_WRITE_CACHE =	0x20,
335441f6d5dSScott Long 	MR_LD_CACHE_ALLOW_READ_CACHE =	0x40
336441f6d5dSScott Long } mfi_ld_cache;
337763fae79SScott Long #define	MR_LD_CACHE_MASK	0x7f
338763fae79SScott Long 
339763fae79SScott Long #define	MR_LD_CACHE_POLICY_READ_AHEAD_NONE		0
340763fae79SScott Long #define	MR_LD_CACHE_POLICY_READ_AHEAD_ALWAYS		MR_LD_CACHE_READ_AHEAD
341763fae79SScott Long #define	MR_LD_CACHE_POLICY_READ_AHEAD_ADAPTIVE		\
342763fae79SScott Long 	(MR_LD_CACHE_READ_AHEAD | MR_LD_CACHE_READ_ADAPTIVE)
343763fae79SScott Long #define	MR_LD_CACHE_POLICY_WRITE_THROUGH		0
344763fae79SScott Long #define	MR_LD_CACHE_POLICY_WRITE_BACK			MR_LD_CACHE_WRITE_BACK
345763fae79SScott Long #define	MR_LD_CACHE_POLICY_IO_CACHED			\
346763fae79SScott Long 	(MR_LD_CACHE_ALLOW_WRITE_CACHE | MR_LD_CACHE_ALLOW_READ_CACHE)
347763fae79SScott Long #define	MR_LD_CACHE_POLICY_IO_DIRECT			0
348441f6d5dSScott Long 
349441f6d5dSScott Long typedef enum {
350441f6d5dSScott Long 	MR_PD_CACHE_UNCHANGED  =	0,
351441f6d5dSScott Long 	MR_PD_CACHE_ENABLE =		1,
352441f6d5dSScott Long 	MR_PD_CACHE_DISABLE =		2
353441f6d5dSScott Long } mfi_pd_cache;
354441f6d5dSScott Long 
3552e21a3efSScott Long /*
3562e21a3efSScott Long  * Other propertities and definitions
3572e21a3efSScott Long  */
3582e21a3efSScott Long #define MFI_MAX_PD_CHANNELS	2
3592e21a3efSScott Long #define MFI_MAX_LD_CHANNELS	2
3602e21a3efSScott Long #define MFI_MAX_CHANNELS	(MFI_MAX_PD_CHANNELS + MFI_MAX_LD_CHANNELS)
3612e21a3efSScott Long #define MFI_MAX_CHANNEL_DEVS	128
3622e21a3efSScott Long #define MFI_DEFAULT_ID		-1
3632e21a3efSScott Long #define MFI_MAX_LUN		8
3642e21a3efSScott Long #define MFI_MAX_LD		64
365763fae79SScott Long #define	MFI_MAX_PD		256
3662e21a3efSScott Long 
3672e21a3efSScott Long #define MFI_FRAME_SIZE		64
3682e21a3efSScott Long #define MFI_MBOX_SIZE		12
3692e21a3efSScott Long 
370812819c7SDoug Ambrisko /* Firmware flashing can take 40s */
371812819c7SDoug Ambrisko #define MFI_POLL_TIMEOUT_SECS	50
3722e21a3efSScott Long 
3732e21a3efSScott Long /* Allow for speedier math calculations */
3742e21a3efSScott Long #define MFI_SECTOR_LEN		512
3752e21a3efSScott Long 
3762e21a3efSScott Long /* Scatter Gather elements */
3772e21a3efSScott Long struct mfi_sg32 {
3782e21a3efSScott Long 	uint32_t	addr;
3792e21a3efSScott Long 	uint32_t	len;
3802e21a3efSScott Long } __packed;
3812e21a3efSScott Long 
3822e21a3efSScott Long struct mfi_sg64 {
3832e21a3efSScott Long 	uint64_t	addr;
3842e21a3efSScott Long 	uint32_t	len;
3852e21a3efSScott Long } __packed;
3862e21a3efSScott Long 
3872e21a3efSScott Long union mfi_sgl {
3882e21a3efSScott Long 	struct mfi_sg32	sg32[1];
3892e21a3efSScott Long 	struct mfi_sg64	sg64[1];
3902e21a3efSScott Long } __packed;
3912e21a3efSScott Long 
3922e21a3efSScott Long /* Message frames.  All messages have a common header */
3932e21a3efSScott Long struct mfi_frame_header {
3942e21a3efSScott Long 	uint8_t		cmd;
3952e21a3efSScott Long 	uint8_t		sense_len;
3962e21a3efSScott Long 	uint8_t		cmd_status;
3972e21a3efSScott Long 	uint8_t		scsi_status;
3982e21a3efSScott Long 	uint8_t		target_id;
3992e21a3efSScott Long 	uint8_t		lun_id;
4002e21a3efSScott Long 	uint8_t		cdb_len;
4012e21a3efSScott Long 	uint8_t		sg_count;
4022e21a3efSScott Long 	uint32_t	context;
4032e21a3efSScott Long 	uint32_t	pad0;
4042e21a3efSScott Long 	uint16_t	flags;
40504697de9SDoug Ambrisko #define MFI_FRAME_DATAOUT	0x08
40604697de9SDoug Ambrisko #define MFI_FRAME_DATAIN	0x10
4072e21a3efSScott Long 	uint16_t	timeout;
4082e21a3efSScott Long 	uint32_t	data_len;
4092e21a3efSScott Long } __packed;
4102e21a3efSScott Long 
4112e21a3efSScott Long struct mfi_init_frame {
4122e21a3efSScott Long 	struct mfi_frame_header	header;
4132e21a3efSScott Long 	uint32_t	qinfo_new_addr_lo;
4142e21a3efSScott Long 	uint32_t	qinfo_new_addr_hi;
4152e21a3efSScott Long 	uint32_t	qinfo_old_addr_lo;
4162e21a3efSScott Long 	uint32_t	qinfo_old_addr_hi;
4172e21a3efSScott Long 	uint32_t	reserved[6];
4182e21a3efSScott Long } __packed;
4192e21a3efSScott Long 
4202e21a3efSScott Long #define MFI_IO_FRAME_SIZE 40
4212e21a3efSScott Long struct mfi_io_frame {
4222e21a3efSScott Long 	struct mfi_frame_header	header;
4232e21a3efSScott Long 	uint32_t	sense_addr_lo;
4242e21a3efSScott Long 	uint32_t	sense_addr_hi;
4252e21a3efSScott Long 	uint32_t	lba_lo;
4262e21a3efSScott Long 	uint32_t	lba_hi;
4272e21a3efSScott Long 	union mfi_sgl	sgl;
4282e21a3efSScott Long } __packed;
4292e21a3efSScott Long 
4302e21a3efSScott Long #define MFI_PASS_FRAME_SIZE 48
4312e21a3efSScott Long struct mfi_pass_frame {
4322e21a3efSScott Long 	struct mfi_frame_header header;
4332e21a3efSScott Long 	uint32_t	sense_addr_lo;
4342e21a3efSScott Long 	uint32_t	sense_addr_hi;
4352e21a3efSScott Long 	uint8_t		cdb[16];
4362e21a3efSScott Long 	union mfi_sgl	sgl;
4372e21a3efSScott Long } __packed;
4382e21a3efSScott Long 
4392e21a3efSScott Long #define MFI_DCMD_FRAME_SIZE 40
4402e21a3efSScott Long struct mfi_dcmd_frame {
4412e21a3efSScott Long 	struct mfi_frame_header header;
4422e21a3efSScott Long 	uint32_t	opcode;
4432e21a3efSScott Long 	uint8_t		mbox[MFI_MBOX_SIZE];
4442e21a3efSScott Long 	union mfi_sgl	sgl;
4452e21a3efSScott Long } __packed;
4462e21a3efSScott Long 
4472e21a3efSScott Long struct mfi_abort_frame {
4482e21a3efSScott Long 	struct mfi_frame_header header;
4492e21a3efSScott Long 	uint32_t	abort_context;
4502e21a3efSScott Long 	uint32_t	pad;
4512e21a3efSScott Long 	uint32_t	abort_mfi_addr_lo;
4522e21a3efSScott Long 	uint32_t	abort_mfi_addr_hi;
4532e21a3efSScott Long 	uint32_t	reserved[6];
4542e21a3efSScott Long } __packed;
4552e21a3efSScott Long 
4562e21a3efSScott Long struct mfi_smp_frame {
4572e21a3efSScott Long 	struct mfi_frame_header header;
4582e21a3efSScott Long 	uint64_t	sas_addr;
4592e21a3efSScott Long 	union {
4602e21a3efSScott Long 		struct mfi_sg32 sg32[2];
4612e21a3efSScott Long 		struct mfi_sg64 sg64[2];
4622e21a3efSScott Long 	} sgl;
4632e21a3efSScott Long } __packed;
4642e21a3efSScott Long 
4652e21a3efSScott Long struct mfi_stp_frame {
4662e21a3efSScott Long 	struct mfi_frame_header header;
4672e21a3efSScott Long 	uint16_t	fis[10];
4682e21a3efSScott Long 	uint32_t	stp_flags;
4692e21a3efSScott Long 	union {
4702e21a3efSScott Long 		struct mfi_sg32 sg32[2];
4712e21a3efSScott Long 		struct mfi_sg64 sg64[2];
4722e21a3efSScott Long 	} sgl;
4732e21a3efSScott Long } __packed;
4742e21a3efSScott Long 
4752e21a3efSScott Long union mfi_frame {
4762e21a3efSScott Long 	struct mfi_frame_header header;
4772e21a3efSScott Long 	struct mfi_init_frame	init;
4782e21a3efSScott Long 	struct mfi_io_frame	io;
4792e21a3efSScott Long 	struct mfi_pass_frame	pass;
4802e21a3efSScott Long 	struct mfi_dcmd_frame	dcmd;
4812e21a3efSScott Long 	struct mfi_abort_frame	abort;
4822e21a3efSScott Long 	struct mfi_smp_frame	smp;
4832e21a3efSScott Long 	struct mfi_stp_frame	stp;
4842e21a3efSScott Long 	uint8_t			bytes[MFI_FRAME_SIZE];
4852e21a3efSScott Long };
4862e21a3efSScott Long 
4872e21a3efSScott Long #define MFI_SENSE_LEN 128
4882e21a3efSScott Long struct mfi_sense {
4892e21a3efSScott Long 	uint8_t		data[MFI_SENSE_LEN];
4902e21a3efSScott Long };
4912e21a3efSScott Long 
4922e21a3efSScott Long /* The queue init structure that is passed with the init message */
4932e21a3efSScott Long struct mfi_init_qinfo {
4942e21a3efSScott Long 	uint32_t	flags;
4952e21a3efSScott Long 	uint32_t	rq_entries;
4962e21a3efSScott Long 	uint32_t	rq_addr_lo;
4972e21a3efSScott Long 	uint32_t	rq_addr_hi;
4982e21a3efSScott Long 	uint32_t	pi_addr_lo;
4992e21a3efSScott Long 	uint32_t	pi_addr_hi;
5002e21a3efSScott Long 	uint32_t	ci_addr_lo;
5012e21a3efSScott Long 	uint32_t	ci_addr_hi;
5022e21a3efSScott Long } __packed;
5032e21a3efSScott Long 
5042e21a3efSScott Long /* SAS (?) controller properties, part of mfi_ctrl_info */
5052e21a3efSScott Long struct mfi_ctrl_props {
5062e21a3efSScott Long 	uint16_t	seq_num;
5072e21a3efSScott Long 	uint16_t	pred_fail_poll_interval;
5082e21a3efSScott Long 	uint16_t	intr_throttle_cnt;
5092e21a3efSScott Long 	uint16_t	intr_throttle_timeout;
5102e21a3efSScott Long 	uint8_t		rebuild_rate;
5112e21a3efSScott Long 	uint8_t		patrol_read_rate;
5122e21a3efSScott Long 	uint8_t		bgi_rate;
5132e21a3efSScott Long 	uint8_t		cc_rate;
5142e21a3efSScott Long 	uint8_t		recon_rate;
5152e21a3efSScott Long 	uint8_t		cache_flush_interval;
5162e21a3efSScott Long 	uint8_t		spinup_drv_cnt;
5172e21a3efSScott Long 	uint8_t		spinup_delay;
5182e21a3efSScott Long 	uint8_t		cluster_enable;
5192e21a3efSScott Long 	uint8_t		coercion_mode;
5202e21a3efSScott Long 	uint8_t		alarm_enable;
5212e21a3efSScott Long 	uint8_t		disable_auto_rebuild;
5222e21a3efSScott Long 	uint8_t		disable_battery_warn;
5232e21a3efSScott Long 	uint8_t		ecc_bucket_size;
5242e21a3efSScott Long 	uint16_t	ecc_bucket_leak_rate;
5252e21a3efSScott Long 	uint8_t		restore_hotspare_on_insertion;
5262e21a3efSScott Long 	uint8_t		expose_encl_devices;
5272e21a3efSScott Long 	uint8_t		reserved[38];
5282e21a3efSScott Long } __packed;
5292e21a3efSScott Long 
5302e21a3efSScott Long /* PCI information about the card. */
5312e21a3efSScott Long struct mfi_info_pci {
5322e21a3efSScott Long 	uint16_t	vendor;
5332e21a3efSScott Long 	uint16_t	device;
5342e21a3efSScott Long 	uint16_t	subvendor;
5352e21a3efSScott Long 	uint16_t	subdevice;
5362e21a3efSScott Long 	uint8_t		reserved[24];
5372e21a3efSScott Long } __packed;
5382e21a3efSScott Long 
5392e21a3efSScott Long /* Host (front end) interface information */
5402e21a3efSScott Long struct mfi_info_host {
5412e21a3efSScott Long 	uint8_t		type;
5422e21a3efSScott Long #define MFI_INFO_HOST_PCIX	0x01
5432e21a3efSScott Long #define MFI_INFO_HOST_PCIE	0x02
5442e21a3efSScott Long #define MFI_INFO_HOST_ISCSI	0x04
5452e21a3efSScott Long #define MFI_INFO_HOST_SAS3G	0x08
5462e21a3efSScott Long 	uint8_t		reserved[6];
5472e21a3efSScott Long 	uint8_t		port_count;
5482e21a3efSScott Long 	uint64_t	port_addr[8];
5492e21a3efSScott Long } __packed;
5502e21a3efSScott Long 
5512e21a3efSScott Long /* Device (back end) interface information */
5522e21a3efSScott Long struct mfi_info_device {
5532e21a3efSScott Long 	uint8_t		type;
5542e21a3efSScott Long #define MFI_INFO_DEV_SPI	0x01
5552e21a3efSScott Long #define MFI_INFO_DEV_SAS3G	0x02
5562e21a3efSScott Long #define MFI_INFO_DEV_SATA1	0x04
5572e21a3efSScott Long #define MFI_INFO_DEV_SATA3G	0x08
5582e21a3efSScott Long 	uint8_t		reserved[6];
5592e21a3efSScott Long 	uint8_t		port_count;
5602e21a3efSScott Long 	uint64_t	port_addr[8];
5612e21a3efSScott Long } __packed;
5622e21a3efSScott Long 
5632e21a3efSScott Long /* Firmware component information */
5642e21a3efSScott Long struct mfi_info_component {
5652e21a3efSScott Long 	char		 name[8];
5662e21a3efSScott Long 	char		 version[32];
5672e21a3efSScott Long 	char		 build_date[16];
5682e21a3efSScott Long 	char		 build_time[16];
5692e21a3efSScott Long } __packed;
5702e21a3efSScott Long 
571441f6d5dSScott Long /* Controller default settings */
572441f6d5dSScott Long struct mfi_defaults {
573441f6d5dSScott Long 	uint64_t	sas_addr;
574441f6d5dSScott Long 	uint8_t		phy_polarity;
575441f6d5dSScott Long 	uint8_t		background_rate;
576441f6d5dSScott Long 	uint8_t		stripe_size;
577441f6d5dSScott Long 	uint8_t		flush_time;
578441f6d5dSScott Long 	uint8_t		write_back;
579441f6d5dSScott Long 	uint8_t		read_ahead;
580441f6d5dSScott Long 	uint8_t		cache_when_bbu_bad;
581441f6d5dSScott Long 	uint8_t		cached_io;
582441f6d5dSScott Long 	uint8_t		smart_mode;
583441f6d5dSScott Long 	uint8_t		alarm_disable;
584441f6d5dSScott Long 	uint8_t		coercion;
585441f6d5dSScott Long 	uint8_t		zrc_config;
586441f6d5dSScott Long 	uint8_t		dirty_led_shows_drive_activity;
587441f6d5dSScott Long 	uint8_t		bios_continue_on_error;
588441f6d5dSScott Long 	uint8_t		spindown_mode;
589441f6d5dSScott Long 	uint8_t		allowed_device_types;
590441f6d5dSScott Long 	uint8_t		allow_mix_in_enclosure;
591441f6d5dSScott Long 	uint8_t		allow_mix_in_ld;
592441f6d5dSScott Long 	uint8_t		allow_sata_in_cluster;
593441f6d5dSScott Long 	uint8_t		max_chained_enclosures;
594441f6d5dSScott Long 	uint8_t		disable_ctrl_r;
595441f6d5dSScott Long 	uint8_t		enabel_web_bios;
596441f6d5dSScott Long 	uint8_t		phy_polarity_split;
597441f6d5dSScott Long 	uint8_t		direct_pd_mapping;
598441f6d5dSScott Long 	uint8_t		bios_enumerate_lds;
599441f6d5dSScott Long 	uint8_t		restored_hot_spare_on_insertion;
600441f6d5dSScott Long 	uint8_t		expose_enclosure_devices;
601441f6d5dSScott Long 	uint8_t		maintain_pd_fail_history;
602441f6d5dSScott Long 	uint8_t		resv[28];
603441f6d5dSScott Long } __packed;
604441f6d5dSScott Long 
605441f6d5dSScott Long /* Controller default settings */
606441f6d5dSScott Long struct mfi_bios_data {
607441f6d5dSScott Long 	uint16_t	boot_target_id;
608441f6d5dSScott Long 	uint8_t		do_not_int_13;
609441f6d5dSScott Long 	uint8_t		continue_on_error;
610441f6d5dSScott Long 	uint8_t		verbose;
611441f6d5dSScott Long 	uint8_t		geometry;
612441f6d5dSScott Long 	uint8_t		expose_all_drives;
613441f6d5dSScott Long 	uint8_t		reserved[56];
614441f6d5dSScott Long 	uint8_t		check_sum;
615441f6d5dSScott Long } __packed;
6162e21a3efSScott Long 
6172e21a3efSScott Long /* SAS (?) controller info, returned from MFI_DCMD_CTRL_GETINFO. */
6182e21a3efSScott Long struct mfi_ctrl_info {
6192e21a3efSScott Long 	struct mfi_info_pci	pci;
6202e21a3efSScott Long 	struct mfi_info_host	host;
6212e21a3efSScott Long 	struct mfi_info_device	device;
6222e21a3efSScott Long 
6232e21a3efSScott Long 	/* Firmware components that are present and active. */
6242e21a3efSScott Long 	uint32_t		image_check_word;
6252e21a3efSScott Long 	uint32_t		image_component_count;
6262e21a3efSScott Long 	struct mfi_info_component image_component[8];
6272e21a3efSScott Long 
6282e21a3efSScott Long 	/* Firmware components that have been flashed but are inactive */
6292e21a3efSScott Long 	uint32_t		pending_image_component_count;
6302e21a3efSScott Long 	struct mfi_info_component pending_image_component[8];
6312e21a3efSScott Long 
6322e21a3efSScott Long 	uint8_t			max_arms;
6332e21a3efSScott Long 	uint8_t			max_spans;
6342e21a3efSScott Long 	uint8_t			max_arrays;
6352e21a3efSScott Long 	uint8_t			max_lds;
6362e21a3efSScott Long 	char			product_name[80];
6372e21a3efSScott Long 	char			serial_number[32];
6382e21a3efSScott Long 	uint32_t		hw_present;
6392e21a3efSScott Long #define MFI_INFO_HW_BBU		0x01
6402e21a3efSScott Long #define MFI_INFO_HW_ALARM	0x02
6412e21a3efSScott Long #define MFI_INFO_HW_NVRAM	0x04
6422e21a3efSScott Long #define MFI_INFO_HW_UART	0x08
6432e21a3efSScott Long 	uint32_t		current_fw_time;
6442e21a3efSScott Long 	uint16_t		max_cmds;
6452e21a3efSScott Long 	uint16_t		max_sg_elements;
6462e21a3efSScott Long 	uint32_t		max_request_size;
6472e21a3efSScott Long 	uint16_t		lds_present;
6482e21a3efSScott Long 	uint16_t		lds_degraded;
6492e21a3efSScott Long 	uint16_t		lds_offline;
6502e21a3efSScott Long 	uint16_t		pd_present;
6512e21a3efSScott Long 	uint16_t		pd_disks_present;
6522e21a3efSScott Long 	uint16_t		pd_disks_pred_failure;
6532e21a3efSScott Long 	uint16_t		pd_disks_failed;
6542e21a3efSScott Long 	uint16_t		nvram_size;
6552e21a3efSScott Long 	uint16_t		memory_size;
6562e21a3efSScott Long 	uint16_t		flash_size;
6572e21a3efSScott Long 	uint16_t		ram_correctable_errors;
6582e21a3efSScott Long 	uint16_t		ram_uncorrectable_errors;
6592e21a3efSScott Long 	uint8_t			cluster_allowed;
6602e21a3efSScott Long 	uint8_t			cluster_active;
6612e21a3efSScott Long 	uint16_t		max_strips_per_io;
6622e21a3efSScott Long 
6632e21a3efSScott Long 	uint32_t		raid_levels;
6642e21a3efSScott Long #define MFI_INFO_RAID_0		0x01
6652e21a3efSScott Long #define MFI_INFO_RAID_1		0x02
6662e21a3efSScott Long #define MFI_INFO_RAID_5		0x04
6672e21a3efSScott Long #define MFI_INFO_RAID_1E	0x08
6682e21a3efSScott Long #define MFI_INFO_RAID_6		0x10
6692e21a3efSScott Long 
6702e21a3efSScott Long 	uint32_t		adapter_ops;
6712e21a3efSScott Long #define MFI_INFO_AOPS_RBLD_RATE		0x0001
6722e21a3efSScott Long #define MFI_INFO_AOPS_CC_RATE		0x0002
6732e21a3efSScott Long #define MFI_INFO_AOPS_BGI_RATE		0x0004
6742e21a3efSScott Long #define MFI_INFO_AOPS_RECON_RATE	0x0008
6752e21a3efSScott Long #define MFI_INFO_AOPS_PATROL_RATE	0x0010
6762e21a3efSScott Long #define MFI_INFO_AOPS_ALARM_CONTROL	0x0020
6772e21a3efSScott Long #define MFI_INFO_AOPS_CLUSTER_SUPPORTED	0x0040
6782e21a3efSScott Long #define MFI_INFO_AOPS_BBU		0x0080
6792e21a3efSScott Long #define MFI_INFO_AOPS_SPANNING_ALLOWED	0x0100
6802e21a3efSScott Long #define MFI_INFO_AOPS_DEDICATED_SPARES	0x0200
6812e21a3efSScott Long #define MFI_INFO_AOPS_REVERTIBLE_SPARES	0x0400
6822e21a3efSScott Long #define MFI_INFO_AOPS_FOREIGN_IMPORT	0x0800
6832e21a3efSScott Long #define MFI_INFO_AOPS_SELF_DIAGNOSTIC	0x1000
6842e21a3efSScott Long #define MFI_INFO_AOPS_MIXED_ARRAY	0x2000
6852e21a3efSScott Long #define MFI_INFO_AOPS_GLOBAL_SPARES	0x4000
6862e21a3efSScott Long 
6872e21a3efSScott Long 	uint32_t		ld_ops;
6882e21a3efSScott Long #define MFI_INFO_LDOPS_READ_POLICY	0x01
6892e21a3efSScott Long #define MFI_INFO_LDOPS_WRITE_POLICY	0x02
6902e21a3efSScott Long #define MFI_INFO_LDOPS_IO_POLICY	0x04
6912e21a3efSScott Long #define MFI_INFO_LDOPS_ACCESS_POLICY	0x08
6922e21a3efSScott Long #define MFI_INFO_LDOPS_DISK_CACHE_POLICY 0x10
6932e21a3efSScott Long 
6942e21a3efSScott Long 	struct {
6952e21a3efSScott Long 		uint8_t		min;
6962e21a3efSScott Long 		uint8_t		max;
6972e21a3efSScott Long 		uint8_t		reserved[2];
6982e21a3efSScott Long 	} __packed stripe_sz_ops;
6992e21a3efSScott Long 
7002e21a3efSScott Long 	uint32_t		pd_ops;
7012e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_ONLINE	0x01
7022e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_OFFLINE	0x02
7032e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_REBUILD	0x04
7042e21a3efSScott Long 
7052e21a3efSScott Long 	uint32_t		pd_mix_support;
7062e21a3efSScott Long #define MFI_INFO_PDMIX_SAS		0x01
7072e21a3efSScott Long #define MFI_INFO_PDMIX_SATA		0x02
7082e21a3efSScott Long #define MFI_INFO_PDMIX_ENCL		0x04
7092e21a3efSScott Long #define MFI_INFO_PDMIX_LD		0x08
7102e21a3efSScott Long #define MFI_INFO_PDMIX_SATA_CLUSTER	0x10
7112e21a3efSScott Long 
7122e21a3efSScott Long 	uint8_t			ecc_bucket_count;
7132e21a3efSScott Long 	uint8_t			reserved2[11];
7142e21a3efSScott Long 	struct mfi_ctrl_props	properties;
7152e21a3efSScott Long 	char			package_version[0x60];
7162e21a3efSScott Long 	uint8_t			pad[0x800 - 0x6a0];
7172e21a3efSScott Long } __packed;
7182e21a3efSScott Long 
719741367d5SDoug Ambrisko /* keep track of an event. */
720741367d5SDoug Ambrisko union mfi_evt {
721741367d5SDoug Ambrisko 	struct {
722741367d5SDoug Ambrisko 		uint16_t	locale;
723741367d5SDoug Ambrisko 		uint8_t		reserved;
724aacea6e2SEd Maste 		int8_t		evt_class;
725741367d5SDoug Ambrisko 	} members;
726741367d5SDoug Ambrisko 	uint32_t		word;
727741367d5SDoug Ambrisko } __packed;
728741367d5SDoug Ambrisko 
729741367d5SDoug Ambrisko /* event log state. */
730741367d5SDoug Ambrisko struct mfi_evt_log_state {
731741367d5SDoug Ambrisko 	uint32_t		newest_seq_num;
732741367d5SDoug Ambrisko 	uint32_t		oldest_seq_num;
733741367d5SDoug Ambrisko 	uint32_t		clear_seq_num;
734741367d5SDoug Ambrisko 	uint32_t		shutdown_seq_num;
735741367d5SDoug Ambrisko 	uint32_t		boot_seq_num;
736741367d5SDoug Ambrisko } __packed;
737741367d5SDoug Ambrisko 
738741367d5SDoug Ambrisko struct mfi_progress {
739741367d5SDoug Ambrisko 	uint16_t		progress;
740741367d5SDoug Ambrisko 	uint16_t		elapsed_seconds;
741741367d5SDoug Ambrisko } __packed;
742741367d5SDoug Ambrisko 
743741367d5SDoug Ambrisko struct mfi_evt_ld {
744741367d5SDoug Ambrisko 	uint16_t		target_id;
745741367d5SDoug Ambrisko 	uint8_t			ld_index;
746741367d5SDoug Ambrisko 	uint8_t			reserved;
747741367d5SDoug Ambrisko } __packed;
748741367d5SDoug Ambrisko 
749741367d5SDoug Ambrisko struct mfi_evt_pd {
750741367d5SDoug Ambrisko 	uint16_t		device_id;
751741367d5SDoug Ambrisko 	uint8_t			enclosure_index;
752741367d5SDoug Ambrisko 	uint8_t			slot_number;
753741367d5SDoug Ambrisko } __packed;
754741367d5SDoug Ambrisko 
755741367d5SDoug Ambrisko /* SAS (?) event detail, returned from MFI_DCMD_CTRL_EVENT_WAIT. */
756741367d5SDoug Ambrisko struct mfi_evt_detail {
757741367d5SDoug Ambrisko 	uint32_t		seq;
758741367d5SDoug Ambrisko 	uint32_t		time;
759741367d5SDoug Ambrisko 	uint32_t		code;
760aacea6e2SEd Maste 	union mfi_evt		evt_class;
761741367d5SDoug Ambrisko 	uint8_t			arg_type;
762741367d5SDoug Ambrisko 	uint8_t			reserved1[15];
763741367d5SDoug Ambrisko 
764741367d5SDoug Ambrisko 	union {
765741367d5SDoug Ambrisko 		struct {
766741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
767741367d5SDoug Ambrisko 			uint8_t			cdb_len;
768741367d5SDoug Ambrisko 			uint8_t			sense_len;
769741367d5SDoug Ambrisko 			uint8_t			reserved[2];
770741367d5SDoug Ambrisko 			uint8_t			cdb[16];
771741367d5SDoug Ambrisko 			uint8_t			sense[64];
772741367d5SDoug Ambrisko 		} cdb_sense;
773741367d5SDoug Ambrisko 
774741367d5SDoug Ambrisko 		struct mfi_evt_ld		ld;
775741367d5SDoug Ambrisko 
776741367d5SDoug Ambrisko 		struct {
777741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
778741367d5SDoug Ambrisko 			uint64_t		count;
779741367d5SDoug Ambrisko 		} ld_count;
780741367d5SDoug Ambrisko 
781741367d5SDoug Ambrisko 		struct {
782741367d5SDoug Ambrisko 			uint64_t		lba;
783741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
784741367d5SDoug Ambrisko 		} ld_lba;
785741367d5SDoug Ambrisko 
786741367d5SDoug Ambrisko 		struct {
787741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
788741367d5SDoug Ambrisko 			uint32_t		pre_owner;
789741367d5SDoug Ambrisko 			uint32_t		new_owner;
790741367d5SDoug Ambrisko 		} ld_owner;
791741367d5SDoug Ambrisko 
792741367d5SDoug Ambrisko 		struct {
793741367d5SDoug Ambrisko 			uint64_t		ld_lba;
794741367d5SDoug Ambrisko 			uint64_t		pd_lba;
795741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
796741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
797741367d5SDoug Ambrisko 		} ld_lba_pd_lba;
798741367d5SDoug Ambrisko 
799741367d5SDoug Ambrisko 		struct {
800741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
801741367d5SDoug Ambrisko 			struct mfi_progress	prog;
802741367d5SDoug Ambrisko 		} ld_prog;
803741367d5SDoug Ambrisko 
804741367d5SDoug Ambrisko 		struct {
805741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
806741367d5SDoug Ambrisko 			uint32_t		prev_state;
807741367d5SDoug Ambrisko 			uint32_t		new_state;
808741367d5SDoug Ambrisko 		} ld_state;
809741367d5SDoug Ambrisko 
810741367d5SDoug Ambrisko 		struct {
811741367d5SDoug Ambrisko 			uint64_t		strip;
812741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
813741367d5SDoug Ambrisko 		} ld_strip;
814741367d5SDoug Ambrisko 
815741367d5SDoug Ambrisko 		struct mfi_evt_pd		pd;
816741367d5SDoug Ambrisko 
817741367d5SDoug Ambrisko 		struct {
818741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
819741367d5SDoug Ambrisko 			uint32_t		err;
820741367d5SDoug Ambrisko 		} pd_err;
821741367d5SDoug Ambrisko 
822741367d5SDoug Ambrisko 		struct {
823741367d5SDoug Ambrisko 			uint64_t		lba;
824741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
825741367d5SDoug Ambrisko 		} pd_lba;
826741367d5SDoug Ambrisko 
827741367d5SDoug Ambrisko 		struct {
828741367d5SDoug Ambrisko 			uint64_t		lba;
829741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
830741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
831741367d5SDoug Ambrisko 		} pd_lba_ld;
832741367d5SDoug Ambrisko 
833741367d5SDoug Ambrisko 		struct {
834741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
835741367d5SDoug Ambrisko 			struct mfi_progress	prog;
836741367d5SDoug Ambrisko 		} pd_prog;
837741367d5SDoug Ambrisko 
838741367d5SDoug Ambrisko 		struct {
839741367d5SDoug Ambrisko 			struct mfi_evt_pd	ld;
840741367d5SDoug Ambrisko 			uint32_t		prev_state;
841741367d5SDoug Ambrisko 			uint32_t		new_state;
842741367d5SDoug Ambrisko 		} pd_state;
843741367d5SDoug Ambrisko 
844741367d5SDoug Ambrisko 		struct {
845741367d5SDoug Ambrisko 			uint16_t		venderId;
846741367d5SDoug Ambrisko 			uint16_t		deviceId;
847741367d5SDoug Ambrisko 			uint16_t		subVenderId;
848741367d5SDoug Ambrisko 			uint16_t		subDeviceId;
849741367d5SDoug Ambrisko 		} pci;
850741367d5SDoug Ambrisko 
851741367d5SDoug Ambrisko 		uint32_t			rate;
852741367d5SDoug Ambrisko 
853741367d5SDoug Ambrisko 		char				str[96];
854741367d5SDoug Ambrisko 
855741367d5SDoug Ambrisko 		struct {
856741367d5SDoug Ambrisko 			uint32_t		rtc;
857741367d5SDoug Ambrisko 			uint16_t		elapsedSeconds;
858741367d5SDoug Ambrisko 		} time;
859741367d5SDoug Ambrisko 
860741367d5SDoug Ambrisko 		struct {
861741367d5SDoug Ambrisko 			uint32_t		ecar;
862741367d5SDoug Ambrisko 			uint32_t		elog;
863741367d5SDoug Ambrisko 			char			str[64];
864741367d5SDoug Ambrisko 		} ecc;
865741367d5SDoug Ambrisko 
866741367d5SDoug Ambrisko 		uint8_t		b[96];
867741367d5SDoug Ambrisko 		uint16_t	s[48];
868741367d5SDoug Ambrisko 		uint32_t	w[24];
869741367d5SDoug Ambrisko 		uint64_t	d[12];
870741367d5SDoug Ambrisko 	} args;
871741367d5SDoug Ambrisko 
872741367d5SDoug Ambrisko 	char description[128];
873741367d5SDoug Ambrisko } __packed;
874741367d5SDoug Ambrisko 
87547b470b9SDoug Ambrisko struct mfi_evt_list {
87647b470b9SDoug Ambrisko 	uint32_t		count;
87747b470b9SDoug Ambrisko 	uint32_t		reserved;
87847b470b9SDoug Ambrisko 	struct mfi_evt_detail	event[1];
879741367d5SDoug Ambrisko } __packed;
880741367d5SDoug Ambrisko 
881441f6d5dSScott Long union mfi_pd_ref {
882441f6d5dSScott Long 	struct {
883441f6d5dSScott Long 		uint16_t	device_id;
884441f6d5dSScott Long 		uint16_t	seq_num;
885441f6d5dSScott Long 	} v;
886441f6d5dSScott Long 	uint32_t	ref;
887441f6d5dSScott Long } __packed;
888441f6d5dSScott Long 
889441f6d5dSScott Long union mfi_pd_ddf_type {
890441f6d5dSScott Long 	struct {
891441f6d5dSScott Long 		union {
892441f6d5dSScott Long 			struct {
893441f6d5dSScott Long 				uint16_t	forced_pd_guid	: 1;
894441f6d5dSScott Long 				uint16_t	in_vd		: 1;
895441f6d5dSScott Long 				uint16_t	is_global_spare	: 1;
896441f6d5dSScott Long 				uint16_t	is_spare	: 1;
897441f6d5dSScott Long 				uint16_t	is_foreign	: 1;
898441f6d5dSScott Long 				uint16_t	reserved	: 7;
899441f6d5dSScott Long 				uint16_t	intf		: 4;
900441f6d5dSScott Long 			} pd_type;
901441f6d5dSScott Long 			uint16_t	type;
902441f6d5dSScott Long 		} v;
903441f6d5dSScott Long 		uint16_t		reserved;
904441f6d5dSScott Long 	} ddf;
905441f6d5dSScott Long 	struct {
906441f6d5dSScott Long 		uint32_t		reserved;
907441f6d5dSScott Long 	} non_disk;
908441f6d5dSScott Long 	uint32_t			type;
909441f6d5dSScott Long } __packed;
910441f6d5dSScott Long 
911441f6d5dSScott Long struct mfi_pd_progress {
912763fae79SScott Long 	uint32_t			active;
913763fae79SScott Long #define	MFI_PD_PROGRESS_REBUILD	(1<<0)
914763fae79SScott Long #define	MFI_PD_PROGRESS_PATROL	(1<<1)
915763fae79SScott Long #define	MFI_PD_PROGRESS_CLEAR	(1<<2)
916441f6d5dSScott Long 	struct mfi_progress		rbld;
917441f6d5dSScott Long 	struct mfi_progress		patrol;
918441f6d5dSScott Long 	struct mfi_progress		clear;
919441f6d5dSScott Long 	struct mfi_progress		reserved[4];
920441f6d5dSScott Long } __packed;
921441f6d5dSScott Long 
922441f6d5dSScott Long struct mfi_pd_info {
923441f6d5dSScott Long 	union mfi_pd_ref		ref;
924441f6d5dSScott Long 	uint8_t				inquiry_data[96];
925441f6d5dSScott Long 	uint8_t				vpd_page83[64];
926441f6d5dSScott Long 	uint8_t				not_supported;
927441f6d5dSScott Long 	uint8_t				scsi_dev_type;
928441f6d5dSScott Long 	uint8_t				connected_port_bitmap;
929441f6d5dSScott Long 	uint8_t				device_speed;
930441f6d5dSScott Long 	uint32_t			media_err_count;
931441f6d5dSScott Long 	uint32_t			other_err_count;
932441f6d5dSScott Long 	uint32_t			pred_fail_count;
933441f6d5dSScott Long 	uint32_t			last_pred_fail_event_seq_num;
934763fae79SScott Long 	uint16_t			fw_state;	/* MFI_PD_STATE_* */
935763fae79SScott Long 	uint8_t				disabled_for_removal;
936441f6d5dSScott Long 	uint8_t				link_speed;
937441f6d5dSScott Long 	union mfi_pd_ddf_type		state;
938441f6d5dSScott Long 	struct {
939441f6d5dSScott Long 		uint8_t			count;
940441f6d5dSScott Long 		uint8_t			is_path_broken;
941441f6d5dSScott Long 		uint8_t			reserved[6];
942441f6d5dSScott Long 		uint64_t		sas_addr[4];
943441f6d5dSScott Long 	} path_info;
944441f6d5dSScott Long 	uint64_t			raw_size;
945441f6d5dSScott Long 	uint64_t			non_coerced_size;
946441f6d5dSScott Long 	uint64_t			coerced_size;
947441f6d5dSScott Long 	uint16_t			encl_device_id;
948441f6d5dSScott Long 	uint8_t				encl_index;
949441f6d5dSScott Long 	uint8_t				slot_number;
950441f6d5dSScott Long 	struct mfi_pd_progress		prog_info;
951441f6d5dSScott Long 	uint8_t				bad_block_table_full;
952441f6d5dSScott Long 	uint8_t				unusable_in_current_config;
953441f6d5dSScott Long 	uint8_t				vpd_page83_ext[64];
954441f6d5dSScott Long 	uint8_t				reserved[512-358];
955441f6d5dSScott Long } __packed;
956441f6d5dSScott Long 
957441f6d5dSScott Long struct mfi_pd_address {
958441f6d5dSScott Long 	uint16_t		device_id;
959441f6d5dSScott Long 	uint16_t		encl_device_id;
960441f6d5dSScott Long 	uint8_t			encl_index;
961441f6d5dSScott Long 	uint8_t			slot_number;
962763fae79SScott Long 	uint8_t			scsi_dev_type;	/* 0 = disk */
963441f6d5dSScott Long 	uint8_t			connect_port_bitmap;
964441f6d5dSScott Long 	uint64_t		sas_addr[2];
965441f6d5dSScott Long } __packed;
966441f6d5dSScott Long 
967441f6d5dSScott Long struct mfi_pd_list {
968441f6d5dSScott Long 	uint32_t		size;
969441f6d5dSScott Long 	uint32_t		count;
970763fae79SScott Long 	struct mfi_pd_address	addr[0];
971441f6d5dSScott Long } __packed;
972441f6d5dSScott Long 
973763fae79SScott Long enum mfi_pd_state {
974763fae79SScott Long 	MFI_PD_STATE_UNCONFIGURED_GOOD = 0x00,
975763fae79SScott Long 	MFI_PD_STATE_UNCONFIGURED_BAD = 0x01,
976763fae79SScott Long 	MFI_PD_STATE_HOT_SPARE = 0x02,
977763fae79SScott Long 	MFI_PD_STATE_OFFLINE = 0x10,
978763fae79SScott Long 	MFI_PD_STATE_FAILED = 0x11,
979763fae79SScott Long 	MFI_PD_STATE_REBUILD = 0x14,
980d63e9da3SSergey Kandaurov 	MFI_PD_STATE_ONLINE = 0x18,
981d63e9da3SSergey Kandaurov 	MFI_PD_STATE_COPYBACK = 0x20,
982d63e9da3SSergey Kandaurov 	MFI_PD_STATE_SYSTEM = 0x40
983763fae79SScott Long };
984763fae79SScott Long 
985441f6d5dSScott Long union mfi_ld_ref {
986441f6d5dSScott Long 	struct {
987c0b332d1SPaul Saab 		uint8_t		target_id;
988c0b332d1SPaul Saab 		uint8_t		reserved;
989c0b332d1SPaul Saab 		uint16_t	seq;
990441f6d5dSScott Long 	} v;
991441f6d5dSScott Long 	uint32_t		ref;
992c0b332d1SPaul Saab } __packed;
993c0b332d1SPaul Saab 
994c0b332d1SPaul Saab struct mfi_ld_list {
995c0b332d1SPaul Saab 	uint32_t		ld_count;
996c0b332d1SPaul Saab 	uint32_t		reserved1;
997c0b332d1SPaul Saab 	struct {
998441f6d5dSScott Long 		union mfi_ld_ref	ld;
999c0b332d1SPaul Saab 		uint8_t		state;
1000c0b332d1SPaul Saab 		uint8_t		reserved2[3];
1001c0b332d1SPaul Saab 		uint64_t	size;
1002c0b332d1SPaul Saab 	} ld_list[MFI_MAX_LD];
1003c0b332d1SPaul Saab } __packed;
1004c0b332d1SPaul Saab 
1005c0b332d1SPaul Saab enum mfi_ld_access {
1006c0b332d1SPaul Saab 	MFI_LD_ACCESS_RW =	0,
1007c0b332d1SPaul Saab 	MFI_LD_ACCSSS_RO = 	2,
1008c0b332d1SPaul Saab 	MFI_LD_ACCESS_BLOCKED =	3,
1009c0b332d1SPaul Saab };
1010c0b332d1SPaul Saab #define MFI_LD_ACCESS_MASK	3
1011c0b332d1SPaul Saab 
1012c0b332d1SPaul Saab enum mfi_ld_state {
1013c0b332d1SPaul Saab 	MFI_LD_STATE_OFFLINE =			0,
1014c0b332d1SPaul Saab 	MFI_LD_STATE_PARTIALLY_DEGRADED =	1,
1015c0b332d1SPaul Saab 	MFI_LD_STATE_DEGRADED =			2,
1016c0b332d1SPaul Saab 	MFI_LD_STATE_OPTIMAL =			3
1017c0b332d1SPaul Saab };
1018c0b332d1SPaul Saab 
1019c0b332d1SPaul Saab struct mfi_ld_props {
1020441f6d5dSScott Long 	union mfi_ld_ref	ld;
1021c0b332d1SPaul Saab 	char			name[16];
1022c0b332d1SPaul Saab 	uint8_t			default_cache_policy;
1023c0b332d1SPaul Saab 	uint8_t			access_policy;
1024c0b332d1SPaul Saab 	uint8_t			disk_cache_policy;
1025c0b332d1SPaul Saab 	uint8_t			current_cache_policy;
1026c0b332d1SPaul Saab 	uint8_t			no_bgi;
1027c0b332d1SPaul Saab 	uint8_t			reserved[7];
1028c0b332d1SPaul Saab } __packed;
1029c0b332d1SPaul Saab 
1030c0b332d1SPaul Saab struct mfi_ld_params {
1031c0b332d1SPaul Saab 	uint8_t			primary_raid_level;
1032c0b332d1SPaul Saab 	uint8_t			raid_level_qualifier;
1033c0b332d1SPaul Saab 	uint8_t			secondary_raid_level;
1034c0b332d1SPaul Saab 	uint8_t			stripe_size;
1035c0b332d1SPaul Saab 	uint8_t			num_drives;
1036c0b332d1SPaul Saab 	uint8_t			span_depth;
1037c0b332d1SPaul Saab 	uint8_t			state;
1038c0b332d1SPaul Saab 	uint8_t			init_state;
1039763fae79SScott Long #define	MFI_LD_PARAMS_INIT_NO		0
1040763fae79SScott Long #define	MFI_LD_PARAMS_INIT_QUICK	1
1041763fae79SScott Long #define	MFI_LD_PARAMS_INIT_FULL		2
1042c0b332d1SPaul Saab 	uint8_t			is_consistent;
1043c0b332d1SPaul Saab 	uint8_t			reserved[23];
1044c0b332d1SPaul Saab } __packed;
1045c0b332d1SPaul Saab 
1046c0b332d1SPaul Saab struct mfi_ld_progress {
1047c0b332d1SPaul Saab 	uint32_t		active;
1048c0b332d1SPaul Saab #define	MFI_LD_PROGRESS_CC	(1<<0)
1049c0b332d1SPaul Saab #define	MFI_LD_PROGRESS_BGI	(1<<1)
1050c0b332d1SPaul Saab #define	MFI_LD_PROGRESS_FGI	(1<<2)
1051763fae79SScott Long #define	MFI_LD_PROGRESS_RECON	(1<<3)
1052c0b332d1SPaul Saab 	struct mfi_progress	cc;
1053c0b332d1SPaul Saab 	struct mfi_progress	bgi;
1054c0b332d1SPaul Saab 	struct mfi_progress	fgi;
1055c0b332d1SPaul Saab 	struct mfi_progress	recon;
1056c0b332d1SPaul Saab 	struct mfi_progress	reserved[4];
1057c0b332d1SPaul Saab } __packed;
1058c0b332d1SPaul Saab 
1059c0b332d1SPaul Saab struct mfi_span {
1060c0b332d1SPaul Saab 	uint64_t		start_block;
1061c0b332d1SPaul Saab 	uint64_t		num_blocks;
1062c0b332d1SPaul Saab 	uint16_t		array_ref;
1063c0b332d1SPaul Saab 	uint8_t			reserved[6];
1064c0b332d1SPaul Saab } __packed;
1065c0b332d1SPaul Saab 
1066c0b332d1SPaul Saab #define	MFI_MAX_SPAN_DEPTH	8
1067c0b332d1SPaul Saab struct mfi_ld_config {
1068c0b332d1SPaul Saab 	struct mfi_ld_props	properties;
1069c0b332d1SPaul Saab 	struct mfi_ld_params	params;
1070c0b332d1SPaul Saab 	struct mfi_span		span[MFI_MAX_SPAN_DEPTH];
1071c0b332d1SPaul Saab } __packed;
1072c0b332d1SPaul Saab 
1073c0b332d1SPaul Saab struct mfi_ld_info {
1074c0b332d1SPaul Saab 	struct mfi_ld_config	ld_config;
1075c0b332d1SPaul Saab 	uint64_t		size;
1076c0b332d1SPaul Saab 	struct mfi_ld_progress	progress;
1077c0b332d1SPaul Saab 	uint16_t		cluster_owner;
1078c0b332d1SPaul Saab 	uint8_t			reconstruct_active;
1079c0b332d1SPaul Saab 	uint8_t			reserved1[1];
1080c0b332d1SPaul Saab 	uint8_t			vpd_page83[64];
1081c0b332d1SPaul Saab 	uint8_t			reserved2[16];
1082c0b332d1SPaul Saab } __packed;
1083c0b332d1SPaul Saab 
1084441f6d5dSScott Long #define MAX_ARRAYS 16
1085441f6d5dSScott Long struct mfi_spare {
1086441f6d5dSScott Long 	union mfi_pd_ref	ref;
1087763fae79SScott Long 	uint8_t			spare_type;
1088763fae79SScott Long #define	MFI_SPARE_DEDICATED	(1 << 0)
1089763fae79SScott Long #define	MFI_SPARE_REVERTIBLE	(1 << 1)
1090763fae79SScott Long #define	MFI_SPARE_ENCL_AFFINITY	(1 << 2)
1091441f6d5dSScott Long 	uint8_t			reserved[2];
1092441f6d5dSScott Long 	uint8_t			array_count;
1093763fae79SScott Long 	uint16_t		array_ref[MAX_ARRAYS];
1094441f6d5dSScott Long } __packed;
1095441f6d5dSScott Long 
1096441f6d5dSScott Long struct mfi_array {
1097441f6d5dSScott Long 	uint64_t			size;
1098441f6d5dSScott Long 	uint8_t				num_drives;
1099441f6d5dSScott Long 	uint8_t				reserved;
1100441f6d5dSScott Long 	uint16_t			array_ref;
1101441f6d5dSScott Long 	uint8_t				pad[20];
1102441f6d5dSScott Long 	struct {
1103763fae79SScott Long 		union mfi_pd_ref	ref;	/* 0xffff == missing drive */
1104763fae79SScott Long 		uint16_t		fw_state;	/* MFI_PD_STATE_* */
1105441f6d5dSScott Long 		struct {
1106441f6d5dSScott Long 			uint8_t		pd;
1107441f6d5dSScott Long 			uint8_t		slot;
1108441f6d5dSScott Long 		} encl;
1109763fae79SScott Long 	} pd[0];
1110441f6d5dSScott Long } __packed;
1111441f6d5dSScott Long 
1112441f6d5dSScott Long struct mfi_config_data {
1113441f6d5dSScott Long 	uint32_t		size;
1114441f6d5dSScott Long 	uint16_t		array_count;
1115441f6d5dSScott Long 	uint16_t		array_size;
1116441f6d5dSScott Long 	uint16_t		log_drv_count;
1117441f6d5dSScott Long 	uint16_t		log_drv_size;
1118441f6d5dSScott Long 	uint16_t		spares_count;
1119441f6d5dSScott Long 	uint16_t		spares_size;
1120441f6d5dSScott Long 	uint8_t			reserved[16];
1121763fae79SScott Long 	struct mfi_array	array[0];
1122763fae79SScott Long 	struct mfi_ld_config	ld[0];
1123763fae79SScott Long 	struct mfi_spare	spare[0];
1124441f6d5dSScott Long } __packed;
1125441f6d5dSScott Long 
1126763fae79SScott Long struct mfi_bbu_capacity_info {
1127763fae79SScott Long 	uint16_t		relative_charge;
1128763fae79SScott Long 	uint16_t		absolute_charge;
1129763fae79SScott Long 	uint16_t		remaining_capacity;
1130763fae79SScott Long 	uint16_t		full_charge_capacity;
1131763fae79SScott Long 	uint16_t		run_time_to_empty;
1132763fae79SScott Long 	uint16_t		average_time_to_empty;
1133763fae79SScott Long 	uint16_t		average_time_to_full;
1134763fae79SScott Long 	uint16_t		cycle_count;
1135763fae79SScott Long 	uint16_t		max_error;
1136763fae79SScott Long 	uint16_t		remaining_capacity_alarm;
1137763fae79SScott Long 	uint16_t		remaining_time_alarm;
1138763fae79SScott Long 	uint8_t			reserved[26];
1139763fae79SScott Long } __packed;
1140763fae79SScott Long 
1141763fae79SScott Long struct mfi_bbu_design_info {
1142763fae79SScott Long 	uint32_t		mfg_date;
1143763fae79SScott Long 	uint16_t		design_capacity;
1144763fae79SScott Long 	uint16_t		design_voltage;
1145763fae79SScott Long 	uint16_t		spec_info;
1146763fae79SScott Long 	uint16_t		serial_number;
1147763fae79SScott Long 	uint16_t		pack_stat_config;
1148763fae79SScott Long 	uint8_t			mfg_name[12];
1149763fae79SScott Long 	uint8_t			device_name[8];
1150763fae79SScott Long 	uint8_t			device_chemistry[8];
1151763fae79SScott Long 	uint8_t			mfg_data[8];
1152763fae79SScott Long 	uint8_t			reserved[17];
1153763fae79SScott Long } __packed;
1154763fae79SScott Long 
1155763fae79SScott Long struct mfi_ibbu_state {
1156763fae79SScott Long 	uint16_t		gas_guage_status;
1157763fae79SScott Long 	uint16_t		relative_charge;
1158763fae79SScott Long 	uint16_t		charger_system_state;
1159763fae79SScott Long 	uint16_t		charger_system_ctrl;
1160763fae79SScott Long 	uint16_t		charging_current;
1161763fae79SScott Long 	uint16_t		absolute_charge;
1162763fae79SScott Long 	uint16_t		max_error;
1163763fae79SScott Long 	uint8_t			reserved[18];
1164763fae79SScott Long } __packed;
1165763fae79SScott Long 
1166763fae79SScott Long struct mfi_bbu_state {
1167763fae79SScott Long 	uint16_t		gas_guage_status;
1168763fae79SScott Long 	uint16_t		relative_charge;
1169763fae79SScott Long 	uint16_t		charger_status;
1170763fae79SScott Long 	uint16_t		remaining_capacity;
1171763fae79SScott Long 	uint16_t		full_charge_capacity;
1172763fae79SScott Long 	uint8_t			is_SOH_good;
1173763fae79SScott Long 	uint8_t			reserved[21];
1174763fae79SScott Long } __packed;
1175763fae79SScott Long 
1176763fae79SScott Long union mfi_bbu_status_detail {
1177763fae79SScott Long 	struct mfi_ibbu_state	ibbu;
1178763fae79SScott Long 	struct mfi_bbu_state	bbu;
1179763fae79SScott Long };
1180763fae79SScott Long 
1181763fae79SScott Long struct mfi_bbu_status {
1182763fae79SScott Long 	uint8_t			battery_type;
1183763fae79SScott Long #define	MFI_BBU_TYPE_NONE	0
1184763fae79SScott Long #define	MFI_BBU_TYPE_IBBU	1
1185763fae79SScott Long #define	MFI_BBU_TYPE_BBU	2
1186763fae79SScott Long 	uint8_t			reserved;
1187763fae79SScott Long 	uint16_t		voltage;
1188763fae79SScott Long 	int16_t			current;
1189763fae79SScott Long 	uint16_t		temperature;
1190763fae79SScott Long 	uint32_t		fw_status;
1191763fae79SScott Long #define	MFI_BBU_STATE_PACK_MISSING	(1 << 0)
1192763fae79SScott Long #define	MFI_BBU_STATE_VOLTAGE_LOW	(1 << 1)
1193763fae79SScott Long #define	MFI_BBU_STATE_TEMPERATURE_HIGH	(1 << 2)
1194763fae79SScott Long #define	MFI_BBU_STATE_CHARGE_ACTIVE	(1 << 0)
1195763fae79SScott Long #define	MFI_BBU_STATE_DISCHARGE_ACTIVE	(1 << 0)
1196763fae79SScott Long 	uint8_t			pad[20];
1197763fae79SScott Long 	union mfi_bbu_status_detail detail;
1198763fae79SScott Long } __packed;
1199763fae79SScott Long 
1200763fae79SScott Long enum mfi_pr_state {
1201763fae79SScott Long 	MFI_PR_STATE_STOPPED = 0,
1202763fae79SScott Long 	MFI_PR_STATE_READY = 1,
1203763fae79SScott Long 	MFI_PR_STATE_ACTIVE = 2,
1204763fae79SScott Long 	MFI_PR_STATE_ABORTED = 0xff
1205763fae79SScott Long };
1206763fae79SScott Long 
1207763fae79SScott Long struct mfi_pr_status {
1208763fae79SScott Long 	uint32_t		num_iteration;
1209763fae79SScott Long 	uint8_t			state;
1210763fae79SScott Long 	uint8_t			num_pd_done;
1211763fae79SScott Long 	uint8_t			reserved[10];
1212763fae79SScott Long };
1213763fae79SScott Long 
1214763fae79SScott Long enum mfi_pr_opmode {
1215763fae79SScott Long 	MFI_PR_OPMODE_AUTO = 0,
1216763fae79SScott Long 	MFI_PR_OPMODE_MANUAL = 1,
1217763fae79SScott Long 	MFI_PR_OPMODE_DISABLED = 2
1218763fae79SScott Long };
1219763fae79SScott Long 
1220763fae79SScott Long struct mfi_pr_properties {
1221763fae79SScott Long 	uint8_t			op_mode;
1222763fae79SScott Long 	uint8_t			max_pd;
1223763fae79SScott Long 	uint8_t			reserved;
1224763fae79SScott Long 	uint8_t			exclude_ld_count;
1225763fae79SScott Long 	uint16_t		excluded_ld[MFI_MAX_LD];
1226763fae79SScott Long 	uint8_t			cur_pd_map[MFI_MAX_PD / 8];
1227763fae79SScott Long 	uint8_t			last_pd_map[MFI_MAX_PD / 8];
1228763fae79SScott Long 	uint32_t		next_exec;
1229763fae79SScott Long 	uint32_t		exec_freq;
1230763fae79SScott Long 	uint32_t		clear_freq;
1231763fae79SScott Long };
1232763fae79SScott Long 
123335ef86f2SScott Long #define MFI_SCSI_MAX_TARGETS	128
123435ef86f2SScott Long #define MFI_SCSI_MAX_LUNS	8
123535ef86f2SScott Long #define MFI_SCSI_INITIATOR_ID	255
123635ef86f2SScott Long #define MFI_SCSI_MAX_CMDS	8
123735ef86f2SScott Long #define MFI_SCSI_MAX_CDB_LEN	16
123835ef86f2SScott Long 
12392e21a3efSScott Long #endif /* _MFIREG_H */
1240