xref: /freebsd/sys/dev/mfi/mfireg.h (revision 35ef86f28512bfc7722e79bf164ca4782a262178)
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  */
262e21a3efSScott Long 
272e21a3efSScott Long #ifndef _MFIREG_H
282e21a3efSScott Long #define _MFIREG_H
292e21a3efSScott Long 
302e21a3efSScott Long #include <sys/cdefs.h>
312e21a3efSScott Long __FBSDID("$FreeBSD$");
322e21a3efSScott Long 
332e21a3efSScott Long /*
342e21a3efSScott Long  * MegaRAID SAS MFI firmware definitions
352e21a3efSScott Long  *
362e21a3efSScott Long  * Calling this driver 'MegaRAID SAS' is a bit misleading.  It's a completely
372e21a3efSScott Long  * new firmware interface from the old AMI MegaRAID one, and there is no
382e21a3efSScott Long  * reason why this interface should be limited to just SAS.  In any case, LSI
392e21a3efSScott Long  * seems to also call this interface 'MFI', so that will be used here.
402e21a3efSScott Long  */
412e21a3efSScott Long 
422e21a3efSScott Long /*
432e21a3efSScott Long  * Start with the register set.  All registers are 32 bits wide.
442e21a3efSScott Long  * The usual Intel IOP style setup.
452e21a3efSScott Long  */
462e21a3efSScott Long #define MFI_IMSG0	0x10	/* Inbound message 0 */
472e21a3efSScott Long #define MFI_IMSG1	0x14	/* Inbound message 1 */
482e21a3efSScott Long #define MFI_OMSG0	0x18	/* Outbound message 0 */
492e21a3efSScott Long #define MFI_OMSG1	0x1c	/* Outbound message 1 */
502e21a3efSScott Long #define MFI_IDB		0x20	/* Inbound doorbell */
512e21a3efSScott Long #define MFI_ISTS	0x24	/* Inbound interrupt status */
522e21a3efSScott Long #define MFI_IMSK	0x28	/* Inbound interrupt mask */
532e21a3efSScott Long #define MFI_ODB		0x2c	/* Outbound doorbell */
542e21a3efSScott Long #define MFI_OSTS	0x30	/* Outbound interrupt status */
552e21a3efSScott Long #define MFI_OMSK	0x34	/* Outbound interrupt mask */
562e21a3efSScott Long #define MFI_IQP		0x40	/* Inbound queue port */
572e21a3efSScott Long #define MFI_OQP		0x44	/* Outbound queue port */
582e21a3efSScott Long 
592e21a3efSScott Long /* Bits for MFI_OSTS */
602e21a3efSScott Long #define MFI_OSTS_INTR_VALID	0x00000002
612e21a3efSScott Long 
622e21a3efSScott Long /*
632e21a3efSScott Long  * Firmware state values.  Found in OMSG0 during initialization.
642e21a3efSScott Long  */
652e21a3efSScott Long #define MFI_FWSTATE_MASK		0xf0000000
662e21a3efSScott Long #define MFI_FWSTATE_UNDEFINED		0x00000000
672e21a3efSScott Long #define MFI_FWSTATE_BB_INIT		0x10000000
682e21a3efSScott Long #define MFI_FWSTATE_FW_INIT		0x40000000
692e21a3efSScott Long #define MFI_FWSTATE_WAIT_HANDSHAKE	0x60000000
702e21a3efSScott Long #define MFI_FWSTATE_FW_INIT_2		0x70000000
712e21a3efSScott Long #define MFI_FWSTATE_DEVICE_SCAN		0x80000000
722e21a3efSScott Long #define MFI_FWSTATE_FLUSH_CACHE		0xa0000000
732e21a3efSScott Long #define MFI_FWSTATE_READY		0xb0000000
742e21a3efSScott Long #define MFI_FWSTATE_OPERATIONAL		0xc0000000
752e21a3efSScott Long #define MFI_FWSTATE_FAULT		0xf0000000
762e21a3efSScott Long #define MFI_FWSTATE_MAXSGL_MASK		0x00ff0000
772e21a3efSScott Long #define MFI_FWSTATE_MAXCMD_MASK		0x0000ffff
782e21a3efSScott Long 
792e21a3efSScott Long /*
802e21a3efSScott Long  * Control bits to drive the card to ready state.  These go into the IDB
812e21a3efSScott Long  * register.
822e21a3efSScott Long  */
832e21a3efSScott Long #define MFI_FWINIT_ABORT	0x00000000 /* Abort all pending commands */
842e21a3efSScott Long #define MFI_FWINIT_READY	0x00000002 /* Move from operational to ready */
852e21a3efSScott Long #define MFI_FWINIT_MFIMODE	0x00000004 /* unknown */
862e21a3efSScott Long #define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */
872e21a3efSScott Long 
882e21a3efSScott Long /* MFI Commands */
892e21a3efSScott Long typedef enum {
902e21a3efSScott Long 	MFI_CMD_INIT =		0x00,
912e21a3efSScott Long 	MFI_CMD_LD_READ,
922e21a3efSScott Long 	MFI_CMD_LD_WRITE,
932e21a3efSScott Long 	MFI_CMD_LD_SCSI_IO,
942e21a3efSScott Long 	MFI_CMD_PD_SCSI_IO,
952e21a3efSScott Long 	MFI_CMD_DCMD,
962e21a3efSScott Long 	MFI_CMD_ABORT,
972e21a3efSScott Long 	MFI_CMD_SMP,
982e21a3efSScott Long 	MFI_CMD_STP
992e21a3efSScott Long } mfi_cmd_t;
1002e21a3efSScott Long 
1012e21a3efSScott Long /* Direct commands */
1022e21a3efSScott Long typedef enum {
1032e21a3efSScott Long 	MFI_DCMD_CTRL_GETINFO =		0x01010000,
104441f6d5dSScott Long 	MFI_DCMD_CTRL_MFC_DEFAULTS_GET =0x010e0201,
105441f6d5dSScott Long 	MFI_DCMD_CTRL_MFC_DEFAULTS_SET =0x010e0202,
1062e21a3efSScott Long 	MFI_DCMD_CTRL_FLUSHCACHE =	0x01101000,
1072e21a3efSScott Long 	MFI_DCMD_CTRL_SHUTDOWN =	0x01050000,
1082e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_GETINFO =	0x01040100,
1092e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_GET =	0x01040300,
1102e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_WAIT =	0x01040500,
111c0b332d1SPaul Saab 	MFI_DCMD_LD_GET_LIST =		0x03010000,
112c0b332d1SPaul Saab 	MFI_DCMD_LD_GET_INFO =		0x03020000,
1132e21a3efSScott Long 	MFI_DCMD_LD_GET_PROP =		0x03030000,
114c0b332d1SPaul Saab 	MFI_DCMD_LD_SET_PROP =		0x03040000,
115441f6d5dSScott Long 	MFI_DCMD_CFG_READ =		0x04010000,
116441f6d5dSScott Long 	MFI_DCMD_CFG_ADD =		0x04020000,
117441f6d5dSScott Long 	MFI_DCMD_CFG_CLEAR =		0x04030000,
1182e21a3efSScott Long 	MFI_DCMD_CLUSTER =		0x08000000,
1192e21a3efSScott Long 	MFI_DCMD_CLUSTER_RESET_ALL =	0x08010100,
1202e21a3efSScott Long 	MFI_DCMD_CLUSTER_RESET_LD =	0x08010200
1212e21a3efSScott Long } mfi_dcmd_t;
1222e21a3efSScott Long 
1232e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_FLUSHCACHE */
1242e21a3efSScott Long #define MFI_FLUSHCACHE_CTRL	0x01
1252e21a3efSScott Long #define MFI_FLUSHCACHE_DISK	0x02
1262e21a3efSScott Long 
1272e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_SHUTDOWN */
1282e21a3efSScott Long #define MFI_SHUTDOWN_SPINDOWN	0x01
1292e21a3efSScott Long 
1302e21a3efSScott Long /*
131741367d5SDoug Ambrisko  * MFI Frame flags
1322e21a3efSScott Long  */
1332e21a3efSScott Long #define MFI_FRAME_POST_IN_REPLY_QUEUE		0x0000
1342e21a3efSScott Long #define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE	0x0001
1352e21a3efSScott Long #define MFI_FRAME_SGL32				0x0000
1362e21a3efSScott Long #define MFI_FRAME_SGL64				0x0002
1372e21a3efSScott Long #define MFI_FRAME_SENSE32			0x0000
1382e21a3efSScott Long #define MFI_FRAME_SENSE64			0x0004
1392e21a3efSScott Long #define MFI_FRAME_DIR_NONE			0x0000
1402e21a3efSScott Long #define MFI_FRAME_DIR_WRITE			0x0008
1412e21a3efSScott Long #define MFI_FRAME_DIR_READ			0x0010
1422e21a3efSScott Long #define MFI_FRAME_DIR_BOTH			0x0018
1432e21a3efSScott Long 
1442e21a3efSScott Long /* MFI Status codes */
1452e21a3efSScott Long typedef enum {
1462e21a3efSScott Long 	MFI_STAT_OK =			0x00,
1472e21a3efSScott Long 	MFI_STAT_INVALID_CMD,
1482e21a3efSScott Long 	MFI_STAT_INVALID_DCMD,
1492e21a3efSScott Long 	MFI_STAT_INVALID_PARAMETER,
1502e21a3efSScott Long 	MFI_STAT_INVALID_SEQUENCE_NUMBER,
1512e21a3efSScott Long 	MFI_STAT_ABORT_NOT_POSSIBLE,
1522e21a3efSScott Long 	MFI_STAT_APP_HOST_CODE_NOT_FOUND,
1532e21a3efSScott Long 	MFI_STAT_APP_IN_USE,
1542e21a3efSScott Long 	MFI_STAT_APP_NOT_INITIALIZED,
1552e21a3efSScott Long 	MFI_STAT_ARRAY_INDEX_INVALID,
1562e21a3efSScott Long 	MFI_STAT_ARRAY_ROW_NOT_EMPTY,
1572e21a3efSScott Long 	MFI_STAT_CONFIG_RESOURCE_CONFLICT,
1582e21a3efSScott Long 	MFI_STAT_DEVICE_NOT_FOUND,
1592e21a3efSScott Long 	MFI_STAT_DRIVE_TOO_SMALL,
1602e21a3efSScott Long 	MFI_STAT_FLASH_ALLOC_FAIL,
1612e21a3efSScott Long 	MFI_STAT_FLASH_BUSY,
1622e21a3efSScott Long 	MFI_STAT_FLASH_ERROR =		0x10,
1632e21a3efSScott Long 	MFI_STAT_FLASH_IMAGE_BAD,
1642e21a3efSScott Long 	MFI_STAT_FLASH_IMAGE_INCOMPLETE,
1652e21a3efSScott Long 	MFI_STAT_FLASH_NOT_OPEN,
1662e21a3efSScott Long 	MFI_STAT_FLASH_NOT_STARTED,
1672e21a3efSScott Long 	MFI_STAT_FLUSH_FAILED,
1682e21a3efSScott Long 	MFI_STAT_HOST_CODE_NOT_FOUNT,
1692e21a3efSScott Long 	MFI_STAT_LD_CC_IN_PROGRESS,
1702e21a3efSScott Long 	MFI_STAT_LD_INIT_IN_PROGRESS,
1712e21a3efSScott Long 	MFI_STAT_LD_LBA_OUT_OF_RANGE,
1722e21a3efSScott Long 	MFI_STAT_LD_MAX_CONFIGURED,
1732e21a3efSScott Long 	MFI_STAT_LD_NOT_OPTIMAL,
1742e21a3efSScott Long 	MFI_STAT_LD_RBLD_IN_PROGRESS,
1752e21a3efSScott Long 	MFI_STAT_LD_RECON_IN_PROGRESS,
1762e21a3efSScott Long 	MFI_STAT_LD_WRONG_RAID_LEVEL,
1772e21a3efSScott Long 	MFI_STAT_MAX_SPARES_EXCEEDED,
1782e21a3efSScott Long 	MFI_STAT_MEMORY_NOT_AVAILABLE =	0x20,
1792e21a3efSScott Long 	MFI_STAT_MFC_HW_ERROR,
1802e21a3efSScott Long 	MFI_STAT_NO_HW_PRESENT,
1812e21a3efSScott Long 	MFI_STAT_NOT_FOUND,
1822e21a3efSScott Long 	MFI_STAT_NOT_IN_ENCL,
1832e21a3efSScott Long 	MFI_STAT_PD_CLEAR_IN_PROGRESS,
1842e21a3efSScott Long 	MFI_STAT_PD_TYPE_WRONG,
1852e21a3efSScott Long 	MFI_STAT_PR_DISABLED,
1862e21a3efSScott Long 	MFI_STAT_ROW_INDEX_INVALID,
1872e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_ACTION,
1882e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_DATA,
1892e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_PAGE,
1902e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_TYPE,
1912e21a3efSScott Long 	MFI_STAT_SCSI_DONE_WITH_ERROR,
1922e21a3efSScott Long 	MFI_STAT_SCSI_IO_FAILED,
1932e21a3efSScott Long 	MFI_STAT_SCSI_RESERVATION_CONFLICT,
1942e21a3efSScott Long 	MFI_STAT_SHUTDOWN_FAILED =	0x30,
1952e21a3efSScott Long 	MFI_STAT_TIME_NOT_SET,
1962e21a3efSScott Long 	MFI_STAT_WRONG_STATE,
1972e21a3efSScott Long 	MFI_STAT_LD_OFFLINE,
1982e21a3efSScott Long 	MFI_STAT_PEER_NOTIFICATION_REJECTED,
1992e21a3efSScott Long 	MFI_STAT_PEER_NOTIFICATION_FAILED,
2002e21a3efSScott Long 	MFI_STAT_RESERVATION_IN_PROGRESS,
2012e21a3efSScott Long 	MFI_STAT_I2C_ERRORS_DETECTED,
2022e21a3efSScott Long 	MFI_STAT_PCI_ERRORS_DETECTED,
2032e21a3efSScott Long 	MFI_STAT_INVALID_STATUS =	0xFF
2042e21a3efSScott Long } mfi_status_t;
2052e21a3efSScott Long 
2062e21a3efSScott Long typedef enum {
2072e21a3efSScott Long 	MFI_EVT_CLASS_DEBUG =		-2,
2082e21a3efSScott Long 	MFI_EVT_CLASS_PROGRESS =	-1,
2092e21a3efSScott Long 	MFI_EVT_CLASS_INFO =		0,
2102e21a3efSScott Long 	MFI_EVT_CLASS_WARNING =		1,
2112e21a3efSScott Long 	MFI_EVT_CLASS_CRITICAL =	2,
2122e21a3efSScott Long 	MFI_EVT_CLASS_FATAL =		3,
2132e21a3efSScott Long 	MFI_EVT_CLASS_DEAD =		4
2142e21a3efSScott Long } mfi_evt_class_t;
2152e21a3efSScott Long 
2162e21a3efSScott Long typedef enum {
2172e21a3efSScott Long 	MFI_EVT_LOCALE_LD =		0x0001,
2182e21a3efSScott Long 	MFI_EVT_LOCALE_PD =		0x0002,
2192e21a3efSScott Long 	MFI_EVT_LOCALE_ENCL =		0x0004,
2202e21a3efSScott Long 	MFI_EVT_LOCALE_BBU =		0x0008,
2212e21a3efSScott Long 	MFI_EVT_LOCALE_SAS =		0x0010,
2222e21a3efSScott Long 	MFI_EVT_LOCALE_CTRL =		0x0020,
2232e21a3efSScott Long 	MFI_EVT_LOCALE_CONFIG =		0x0040,
2242e21a3efSScott Long 	MFI_EVT_LOCALE_CLUSTER =	0x0080,
2252e21a3efSScott Long 	MFI_EVT_LOCALE_ALL =		0xffff
2262e21a3efSScott Long } mfi_evt_locale_t;
2272e21a3efSScott Long 
2282e21a3efSScott Long typedef enum {
2292e21a3efSScott Long 	MR_EVT_ARGS_NONE =		0x00,
2302e21a3efSScott Long 	MR_EVT_ARGS_CDB_SENSE,
2312e21a3efSScott Long 	MR_EVT_ARGS_LD,
2322e21a3efSScott Long 	MR_EVT_ARGS_LD_COUNT,
2332e21a3efSScott Long 	MR_EVT_ARGS_LD_LBA,
2342e21a3efSScott Long 	MR_EVT_ARGS_LD_OWNER,
2352e21a3efSScott Long 	MR_EVT_ARGS_LD_LBA_PD_LBA,
2362e21a3efSScott Long 	MR_EVT_ARGS_LD_PROG,
2372e21a3efSScott Long 	MR_EVT_ARGS_LD_STATE,
2382e21a3efSScott Long 	MR_EVT_ARGS_LD_STRIP,
2392e21a3efSScott Long 	MR_EVT_ARGS_PD,
2402e21a3efSScott Long 	MR_EVT_ARGS_PD_ERR,
2412e21a3efSScott Long 	MR_EVT_ARGS_PD_LBA,
2422e21a3efSScott Long 	MR_EVT_ARGS_PD_LBA_LD,
2432e21a3efSScott Long 	MR_EVT_ARGS_PD_PROG,
2442e21a3efSScott Long 	MR_EVT_ARGS_PD_STATE,
2452e21a3efSScott Long 	MR_EVT_ARGS_PCI,
2462e21a3efSScott Long 	MR_EVT_ARGS_RATE,
2472e21a3efSScott Long 	MR_EVT_ARGS_STR,
2482e21a3efSScott Long 	MR_EVT_ARGS_TIME,
2492e21a3efSScott Long 	MR_EVT_ARGS_ECC
2502e21a3efSScott Long } mfi_evt_args;
2512e21a3efSScott Long 
252441f6d5dSScott Long typedef enum {
253441f6d5dSScott Long 	MR_LD_CACHE_WRITE_BACK =	0x01,
254441f6d5dSScott Long 	MR_LD_CACHE_WRITE_ADAPTIVE =	0x02,
255441f6d5dSScott Long 	MR_LD_CACHE_READ_AHEAD =	0x04,
256441f6d5dSScott Long 	MR_LD_CACHE_READ_ADAPTIVE =	0x08,
257441f6d5dSScott Long 	MR_LD_CACHE_WRITE_CACHE_BAD_BBU=0x10,
258441f6d5dSScott Long 	MR_LD_CACHE_ALLOW_WRITE_CACHE =	0x20,
259441f6d5dSScott Long 	MR_LD_CACHE_ALLOW_READ_CACHE =	0x40
260441f6d5dSScott Long } mfi_ld_cache;
261441f6d5dSScott Long 
262441f6d5dSScott Long typedef enum {
263441f6d5dSScott Long 	MR_PD_CACHE_UNCHANGED  =	0,
264441f6d5dSScott Long 	MR_PD_CACHE_ENABLE =		1,
265441f6d5dSScott Long 	MR_PD_CACHE_DISABLE =		2
266441f6d5dSScott Long } mfi_pd_cache;
267441f6d5dSScott Long 
2682e21a3efSScott Long /*
2692e21a3efSScott Long  * Other propertities and definitions
2702e21a3efSScott Long  */
2712e21a3efSScott Long #define MFI_MAX_PD_CHANNELS	2
2722e21a3efSScott Long #define MFI_MAX_LD_CHANNELS	2
2732e21a3efSScott Long #define MFI_MAX_CHANNELS	(MFI_MAX_PD_CHANNELS + MFI_MAX_LD_CHANNELS)
2742e21a3efSScott Long #define MFI_MAX_CHANNEL_DEVS	128
2752e21a3efSScott Long #define MFI_DEFAULT_ID		-1
2762e21a3efSScott Long #define MFI_MAX_LUN		8
2772e21a3efSScott Long #define MFI_MAX_LD		64
2782e21a3efSScott Long 
2792e21a3efSScott Long #define MFI_FRAME_SIZE		64
2802e21a3efSScott Long #define MFI_MBOX_SIZE		12
2812e21a3efSScott Long 
282812819c7SDoug Ambrisko /* Firmware flashing can take 40s */
283812819c7SDoug Ambrisko #define MFI_POLL_TIMEOUT_SECS	50
2842e21a3efSScott Long 
2852e21a3efSScott Long /* Allow for speedier math calculations */
2862e21a3efSScott Long #define MFI_SECTOR_LEN		512
2872e21a3efSScott Long 
2882e21a3efSScott Long /* Scatter Gather elements */
2892e21a3efSScott Long struct mfi_sg32 {
2902e21a3efSScott Long 	uint32_t	addr;
2912e21a3efSScott Long 	uint32_t	len;
2922e21a3efSScott Long } __packed;
2932e21a3efSScott Long 
2942e21a3efSScott Long struct mfi_sg64 {
2952e21a3efSScott Long 	uint64_t	addr;
2962e21a3efSScott Long 	uint32_t	len;
2972e21a3efSScott Long } __packed;
2982e21a3efSScott Long 
2992e21a3efSScott Long union mfi_sgl {
3002e21a3efSScott Long 	struct mfi_sg32	sg32[1];
3012e21a3efSScott Long 	struct mfi_sg64	sg64[1];
3022e21a3efSScott Long } __packed;
3032e21a3efSScott Long 
3042e21a3efSScott Long /* Message frames.  All messages have a common header */
3052e21a3efSScott Long struct mfi_frame_header {
3062e21a3efSScott Long 	uint8_t		cmd;
3072e21a3efSScott Long 	uint8_t		sense_len;
3082e21a3efSScott Long 	uint8_t		cmd_status;
3092e21a3efSScott Long 	uint8_t		scsi_status;
3102e21a3efSScott Long 	uint8_t		target_id;
3112e21a3efSScott Long 	uint8_t		lun_id;
3122e21a3efSScott Long 	uint8_t		cdb_len;
3132e21a3efSScott Long 	uint8_t		sg_count;
3142e21a3efSScott Long 	uint32_t	context;
3152e21a3efSScott Long 	uint32_t	pad0;
3162e21a3efSScott Long 	uint16_t	flags;
3172e21a3efSScott Long 	uint16_t	timeout;
3182e21a3efSScott Long 	uint32_t	data_len;
3192e21a3efSScott Long } __packed;
3202e21a3efSScott Long 
3212e21a3efSScott Long struct mfi_init_frame {
3222e21a3efSScott Long 	struct mfi_frame_header	header;
3232e21a3efSScott Long 	uint32_t	qinfo_new_addr_lo;
3242e21a3efSScott Long 	uint32_t	qinfo_new_addr_hi;
3252e21a3efSScott Long 	uint32_t	qinfo_old_addr_lo;
3262e21a3efSScott Long 	uint32_t	qinfo_old_addr_hi;
3272e21a3efSScott Long 	uint32_t	reserved[6];
3282e21a3efSScott Long } __packed;
3292e21a3efSScott Long 
3302e21a3efSScott Long #define MFI_IO_FRAME_SIZE 40
3312e21a3efSScott Long struct mfi_io_frame {
3322e21a3efSScott Long 	struct mfi_frame_header	header;
3332e21a3efSScott Long 	uint32_t	sense_addr_lo;
3342e21a3efSScott Long 	uint32_t	sense_addr_hi;
3352e21a3efSScott Long 	uint32_t	lba_lo;
3362e21a3efSScott Long 	uint32_t	lba_hi;
3372e21a3efSScott Long 	union mfi_sgl	sgl;
3382e21a3efSScott Long } __packed;
3392e21a3efSScott Long 
3402e21a3efSScott Long #define MFI_PASS_FRAME_SIZE 48
3412e21a3efSScott Long struct mfi_pass_frame {
3422e21a3efSScott Long 	struct mfi_frame_header header;
3432e21a3efSScott Long 	uint32_t	sense_addr_lo;
3442e21a3efSScott Long 	uint32_t	sense_addr_hi;
3452e21a3efSScott Long 	uint8_t		cdb[16];
3462e21a3efSScott Long 	union mfi_sgl	sgl;
3472e21a3efSScott Long } __packed;
3482e21a3efSScott Long 
3492e21a3efSScott Long #define MFI_DCMD_FRAME_SIZE 40
3502e21a3efSScott Long struct mfi_dcmd_frame {
3512e21a3efSScott Long 	struct mfi_frame_header header;
3522e21a3efSScott Long 	uint32_t	opcode;
3532e21a3efSScott Long 	uint8_t		mbox[MFI_MBOX_SIZE];
3542e21a3efSScott Long 	union mfi_sgl	sgl;
3552e21a3efSScott Long } __packed;
3562e21a3efSScott Long 
3572e21a3efSScott Long struct mfi_abort_frame {
3582e21a3efSScott Long 	struct mfi_frame_header header;
3592e21a3efSScott Long 	uint32_t	abort_context;
3602e21a3efSScott Long 	uint32_t	pad;
3612e21a3efSScott Long 	uint32_t	abort_mfi_addr_lo;
3622e21a3efSScott Long 	uint32_t	abort_mfi_addr_hi;
3632e21a3efSScott Long 	uint32_t	reserved[6];
3642e21a3efSScott Long } __packed;
3652e21a3efSScott Long 
3662e21a3efSScott Long struct mfi_smp_frame {
3672e21a3efSScott Long 	struct mfi_frame_header header;
3682e21a3efSScott Long 	uint64_t	sas_addr;
3692e21a3efSScott Long 	union {
3702e21a3efSScott Long 		struct mfi_sg32 sg32[2];
3712e21a3efSScott Long 		struct mfi_sg64 sg64[2];
3722e21a3efSScott Long 	} sgl;
3732e21a3efSScott Long } __packed;
3742e21a3efSScott Long 
3752e21a3efSScott Long struct mfi_stp_frame {
3762e21a3efSScott Long 	struct mfi_frame_header header;
3772e21a3efSScott Long 	uint16_t	fis[10];
3782e21a3efSScott Long 	uint32_t	stp_flags;
3792e21a3efSScott Long 	union {
3802e21a3efSScott Long 		struct mfi_sg32 sg32[2];
3812e21a3efSScott Long 		struct mfi_sg64 sg64[2];
3822e21a3efSScott Long 	} sgl;
3832e21a3efSScott Long } __packed;
3842e21a3efSScott Long 
3852e21a3efSScott Long union mfi_frame {
3862e21a3efSScott Long 	struct mfi_frame_header header;
3872e21a3efSScott Long 	struct mfi_init_frame	init;
3882e21a3efSScott Long 	struct mfi_io_frame	io;
3892e21a3efSScott Long 	struct mfi_pass_frame	pass;
3902e21a3efSScott Long 	struct mfi_dcmd_frame	dcmd;
3912e21a3efSScott Long 	struct mfi_abort_frame	abort;
3922e21a3efSScott Long 	struct mfi_smp_frame	smp;
3932e21a3efSScott Long 	struct mfi_stp_frame	stp;
3942e21a3efSScott Long 	uint8_t			bytes[MFI_FRAME_SIZE];
3952e21a3efSScott Long };
3962e21a3efSScott Long 
3972e21a3efSScott Long #define MFI_SENSE_LEN 128
3982e21a3efSScott Long struct mfi_sense {
3992e21a3efSScott Long 	uint8_t		data[MFI_SENSE_LEN];
4002e21a3efSScott Long };
4012e21a3efSScott Long 
4022e21a3efSScott Long /* The queue init structure that is passed with the init message */
4032e21a3efSScott Long struct mfi_init_qinfo {
4042e21a3efSScott Long 	uint32_t	flags;
4052e21a3efSScott Long 	uint32_t	rq_entries;
4062e21a3efSScott Long 	uint32_t	rq_addr_lo;
4072e21a3efSScott Long 	uint32_t	rq_addr_hi;
4082e21a3efSScott Long 	uint32_t	pi_addr_lo;
4092e21a3efSScott Long 	uint32_t	pi_addr_hi;
4102e21a3efSScott Long 	uint32_t	ci_addr_lo;
4112e21a3efSScott Long 	uint32_t	ci_addr_hi;
4122e21a3efSScott Long } __packed;
4132e21a3efSScott Long 
4142e21a3efSScott Long /* SAS (?) controller properties, part of mfi_ctrl_info */
4152e21a3efSScott Long struct mfi_ctrl_props {
4162e21a3efSScott Long 	uint16_t	seq_num;
4172e21a3efSScott Long 	uint16_t	pred_fail_poll_interval;
4182e21a3efSScott Long 	uint16_t	intr_throttle_cnt;
4192e21a3efSScott Long 	uint16_t	intr_throttle_timeout;
4202e21a3efSScott Long 	uint8_t		rebuild_rate;
4212e21a3efSScott Long 	uint8_t		patrol_read_rate;
4222e21a3efSScott Long 	uint8_t		bgi_rate;
4232e21a3efSScott Long 	uint8_t		cc_rate;
4242e21a3efSScott Long 	uint8_t		recon_rate;
4252e21a3efSScott Long 	uint8_t		cache_flush_interval;
4262e21a3efSScott Long 	uint8_t		spinup_drv_cnt;
4272e21a3efSScott Long 	uint8_t		spinup_delay;
4282e21a3efSScott Long 	uint8_t		cluster_enable;
4292e21a3efSScott Long 	uint8_t		coercion_mode;
4302e21a3efSScott Long 	uint8_t		alarm_enable;
4312e21a3efSScott Long 	uint8_t		disable_auto_rebuild;
4322e21a3efSScott Long 	uint8_t		disable_battery_warn;
4332e21a3efSScott Long 	uint8_t		ecc_bucket_size;
4342e21a3efSScott Long 	uint16_t	ecc_bucket_leak_rate;
4352e21a3efSScott Long 	uint8_t		restore_hotspare_on_insertion;
4362e21a3efSScott Long 	uint8_t		expose_encl_devices;
4372e21a3efSScott Long 	uint8_t		reserved[38];
4382e21a3efSScott Long } __packed;
4392e21a3efSScott Long 
4402e21a3efSScott Long /* PCI information about the card. */
4412e21a3efSScott Long struct mfi_info_pci {
4422e21a3efSScott Long 	uint16_t	vendor;
4432e21a3efSScott Long 	uint16_t	device;
4442e21a3efSScott Long 	uint16_t	subvendor;
4452e21a3efSScott Long 	uint16_t	subdevice;
4462e21a3efSScott Long 	uint8_t		reserved[24];
4472e21a3efSScott Long } __packed;
4482e21a3efSScott Long 
4492e21a3efSScott Long /* Host (front end) interface information */
4502e21a3efSScott Long struct mfi_info_host {
4512e21a3efSScott Long 	uint8_t		type;
4522e21a3efSScott Long #define MFI_INFO_HOST_PCIX	0x01
4532e21a3efSScott Long #define MFI_INFO_HOST_PCIE	0x02
4542e21a3efSScott Long #define MFI_INFO_HOST_ISCSI	0x04
4552e21a3efSScott Long #define MFI_INFO_HOST_SAS3G	0x08
4562e21a3efSScott Long 	uint8_t		reserved[6];
4572e21a3efSScott Long 	uint8_t		port_count;
4582e21a3efSScott Long 	uint64_t	port_addr[8];
4592e21a3efSScott Long } __packed;
4602e21a3efSScott Long 
4612e21a3efSScott Long /* Device (back end) interface information */
4622e21a3efSScott Long struct mfi_info_device {
4632e21a3efSScott Long 	uint8_t		type;
4642e21a3efSScott Long #define MFI_INFO_DEV_SPI	0x01
4652e21a3efSScott Long #define MFI_INFO_DEV_SAS3G	0x02
4662e21a3efSScott Long #define MFI_INFO_DEV_SATA1	0x04
4672e21a3efSScott Long #define MFI_INFO_DEV_SATA3G	0x08
4682e21a3efSScott Long 	uint8_t		reserved[6];
4692e21a3efSScott Long 	uint8_t		port_count;
4702e21a3efSScott Long 	uint64_t	port_addr[8];
4712e21a3efSScott Long } __packed;
4722e21a3efSScott Long 
4732e21a3efSScott Long /* Firmware component information */
4742e21a3efSScott Long struct mfi_info_component {
4752e21a3efSScott Long 	char		 name[8];
4762e21a3efSScott Long 	char		 version[32];
4772e21a3efSScott Long 	char		 build_date[16];
4782e21a3efSScott Long 	char		 build_time[16];
4792e21a3efSScott Long } __packed;
4802e21a3efSScott Long 
481441f6d5dSScott Long /* Controller default settings */
482441f6d5dSScott Long struct mfi_defaults {
483441f6d5dSScott Long 	uint64_t	sas_addr;
484441f6d5dSScott Long 	uint8_t		phy_polarity;
485441f6d5dSScott Long 	uint8_t		background_rate;
486441f6d5dSScott Long 	uint8_t		stripe_size;
487441f6d5dSScott Long 	uint8_t		flush_time;
488441f6d5dSScott Long 	uint8_t		write_back;
489441f6d5dSScott Long 	uint8_t		read_ahead;
490441f6d5dSScott Long 	uint8_t		cache_when_bbu_bad;
491441f6d5dSScott Long 	uint8_t		cached_io;
492441f6d5dSScott Long 	uint8_t		smart_mode;
493441f6d5dSScott Long 	uint8_t		alarm_disable;
494441f6d5dSScott Long 	uint8_t		coercion;
495441f6d5dSScott Long 	uint8_t		zrc_config;
496441f6d5dSScott Long 	uint8_t		dirty_led_shows_drive_activity;
497441f6d5dSScott Long 	uint8_t		bios_continue_on_error;
498441f6d5dSScott Long 	uint8_t		spindown_mode;
499441f6d5dSScott Long 	uint8_t		allowed_device_types;
500441f6d5dSScott Long 	uint8_t		allow_mix_in_enclosure;
501441f6d5dSScott Long 	uint8_t		allow_mix_in_ld;
502441f6d5dSScott Long 	uint8_t		allow_sata_in_cluster;
503441f6d5dSScott Long 	uint8_t		max_chained_enclosures;
504441f6d5dSScott Long 	uint8_t		disable_ctrl_r;
505441f6d5dSScott Long 	uint8_t		enabel_web_bios;
506441f6d5dSScott Long 	uint8_t		phy_polarity_split;
507441f6d5dSScott Long 	uint8_t		direct_pd_mapping;
508441f6d5dSScott Long 	uint8_t		bios_enumerate_lds;
509441f6d5dSScott Long 	uint8_t		restored_hot_spare_on_insertion;
510441f6d5dSScott Long 	uint8_t		expose_enclosure_devices;
511441f6d5dSScott Long 	uint8_t		maintain_pd_fail_history;
512441f6d5dSScott Long 	uint8_t		resv[28];
513441f6d5dSScott Long } __packed;
514441f6d5dSScott Long 
515441f6d5dSScott Long /* Controller default settings */
516441f6d5dSScott Long struct mfi_bios_data {
517441f6d5dSScott Long 	uint16_t	boot_target_id;
518441f6d5dSScott Long 	uint8_t		do_not_int_13;
519441f6d5dSScott Long 	uint8_t		continue_on_error;
520441f6d5dSScott Long 	uint8_t		verbose;
521441f6d5dSScott Long 	uint8_t		geometry;
522441f6d5dSScott Long 	uint8_t		expose_all_drives;
523441f6d5dSScott Long 	uint8_t		reserved[56];
524441f6d5dSScott Long 	uint8_t		check_sum;
525441f6d5dSScott Long } __packed;
5262e21a3efSScott Long 
5272e21a3efSScott Long /* SAS (?) controller info, returned from MFI_DCMD_CTRL_GETINFO. */
5282e21a3efSScott Long struct mfi_ctrl_info {
5292e21a3efSScott Long 	struct mfi_info_pci	pci;
5302e21a3efSScott Long 	struct mfi_info_host	host;
5312e21a3efSScott Long 	struct mfi_info_device	device;
5322e21a3efSScott Long 
5332e21a3efSScott Long 	/* Firmware components that are present and active. */
5342e21a3efSScott Long 	uint32_t		image_check_word;
5352e21a3efSScott Long 	uint32_t		image_component_count;
5362e21a3efSScott Long 	struct mfi_info_component image_component[8];
5372e21a3efSScott Long 
5382e21a3efSScott Long 	/* Firmware components that have been flashed but are inactive */
5392e21a3efSScott Long 	uint32_t		pending_image_component_count;
5402e21a3efSScott Long 	struct mfi_info_component pending_image_component[8];
5412e21a3efSScott Long 
5422e21a3efSScott Long 	uint8_t			max_arms;
5432e21a3efSScott Long 	uint8_t			max_spans;
5442e21a3efSScott Long 	uint8_t			max_arrays;
5452e21a3efSScott Long 	uint8_t			max_lds;
5462e21a3efSScott Long 	char			product_name[80];
5472e21a3efSScott Long 	char			serial_number[32];
5482e21a3efSScott Long 	uint32_t		hw_present;
5492e21a3efSScott Long #define MFI_INFO_HW_BBU		0x01
5502e21a3efSScott Long #define MFI_INFO_HW_ALARM	0x02
5512e21a3efSScott Long #define MFI_INFO_HW_NVRAM	0x04
5522e21a3efSScott Long #define MFI_INFO_HW_UART	0x08
5532e21a3efSScott Long 	uint32_t		current_fw_time;
5542e21a3efSScott Long 	uint16_t		max_cmds;
5552e21a3efSScott Long 	uint16_t		max_sg_elements;
5562e21a3efSScott Long 	uint32_t		max_request_size;
5572e21a3efSScott Long 	uint16_t		lds_present;
5582e21a3efSScott Long 	uint16_t		lds_degraded;
5592e21a3efSScott Long 	uint16_t		lds_offline;
5602e21a3efSScott Long 	uint16_t		pd_present;
5612e21a3efSScott Long 	uint16_t		pd_disks_present;
5622e21a3efSScott Long 	uint16_t		pd_disks_pred_failure;
5632e21a3efSScott Long 	uint16_t		pd_disks_failed;
5642e21a3efSScott Long 	uint16_t		nvram_size;
5652e21a3efSScott Long 	uint16_t		memory_size;
5662e21a3efSScott Long 	uint16_t		flash_size;
5672e21a3efSScott Long 	uint16_t		ram_correctable_errors;
5682e21a3efSScott Long 	uint16_t		ram_uncorrectable_errors;
5692e21a3efSScott Long 	uint8_t			cluster_allowed;
5702e21a3efSScott Long 	uint8_t			cluster_active;
5712e21a3efSScott Long 	uint16_t		max_strips_per_io;
5722e21a3efSScott Long 
5732e21a3efSScott Long 	uint32_t		raid_levels;
5742e21a3efSScott Long #define MFI_INFO_RAID_0		0x01
5752e21a3efSScott Long #define MFI_INFO_RAID_1		0x02
5762e21a3efSScott Long #define MFI_INFO_RAID_5		0x04
5772e21a3efSScott Long #define MFI_INFO_RAID_1E	0x08
5782e21a3efSScott Long #define MFI_INFO_RAID_6		0x10
5792e21a3efSScott Long 
5802e21a3efSScott Long 	uint32_t		adapter_ops;
5812e21a3efSScott Long #define MFI_INFO_AOPS_RBLD_RATE		0x0001
5822e21a3efSScott Long #define MFI_INFO_AOPS_CC_RATE		0x0002
5832e21a3efSScott Long #define MFI_INFO_AOPS_BGI_RATE		0x0004
5842e21a3efSScott Long #define MFI_INFO_AOPS_RECON_RATE	0x0008
5852e21a3efSScott Long #define MFI_INFO_AOPS_PATROL_RATE	0x0010
5862e21a3efSScott Long #define MFI_INFO_AOPS_ALARM_CONTROL	0x0020
5872e21a3efSScott Long #define MFI_INFO_AOPS_CLUSTER_SUPPORTED	0x0040
5882e21a3efSScott Long #define MFI_INFO_AOPS_BBU		0x0080
5892e21a3efSScott Long #define MFI_INFO_AOPS_SPANNING_ALLOWED	0x0100
5902e21a3efSScott Long #define MFI_INFO_AOPS_DEDICATED_SPARES	0x0200
5912e21a3efSScott Long #define MFI_INFO_AOPS_REVERTIBLE_SPARES	0x0400
5922e21a3efSScott Long #define MFI_INFO_AOPS_FOREIGN_IMPORT	0x0800
5932e21a3efSScott Long #define MFI_INFO_AOPS_SELF_DIAGNOSTIC	0x1000
5942e21a3efSScott Long #define MFI_INFO_AOPS_MIXED_ARRAY	0x2000
5952e21a3efSScott Long #define MFI_INFO_AOPS_GLOBAL_SPARES	0x4000
5962e21a3efSScott Long 
5972e21a3efSScott Long 	uint32_t		ld_ops;
5982e21a3efSScott Long #define MFI_INFO_LDOPS_READ_POLICY	0x01
5992e21a3efSScott Long #define MFI_INFO_LDOPS_WRITE_POLICY	0x02
6002e21a3efSScott Long #define MFI_INFO_LDOPS_IO_POLICY	0x04
6012e21a3efSScott Long #define MFI_INFO_LDOPS_ACCESS_POLICY	0x08
6022e21a3efSScott Long #define MFI_INFO_LDOPS_DISK_CACHE_POLICY 0x10
6032e21a3efSScott Long 
6042e21a3efSScott Long 	struct {
6052e21a3efSScott Long 		uint8_t		min;
6062e21a3efSScott Long 		uint8_t		max;
6072e21a3efSScott Long 		uint8_t		reserved[2];
6082e21a3efSScott Long 	} __packed stripe_sz_ops;
6092e21a3efSScott Long 
6102e21a3efSScott Long 	uint32_t		pd_ops;
6112e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_ONLINE	0x01
6122e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_OFFLINE	0x02
6132e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_REBUILD	0x04
6142e21a3efSScott Long 
6152e21a3efSScott Long 	uint32_t		pd_mix_support;
6162e21a3efSScott Long #define MFI_INFO_PDMIX_SAS		0x01
6172e21a3efSScott Long #define MFI_INFO_PDMIX_SATA		0x02
6182e21a3efSScott Long #define MFI_INFO_PDMIX_ENCL		0x04
6192e21a3efSScott Long #define MFI_INFO_PDMIX_LD		0x08
6202e21a3efSScott Long #define MFI_INFO_PDMIX_SATA_CLUSTER	0x10
6212e21a3efSScott Long 
6222e21a3efSScott Long 	uint8_t			ecc_bucket_count;
6232e21a3efSScott Long 	uint8_t			reserved2[11];
6242e21a3efSScott Long 	struct mfi_ctrl_props	properties;
6252e21a3efSScott Long 	char			package_version[0x60];
6262e21a3efSScott Long 	uint8_t			pad[0x800 - 0x6a0];
6272e21a3efSScott Long } __packed;
6282e21a3efSScott Long 
629741367d5SDoug Ambrisko /* keep track of an event. */
630741367d5SDoug Ambrisko union mfi_evt {
631741367d5SDoug Ambrisko 	struct {
632741367d5SDoug Ambrisko 		uint16_t	locale;
633741367d5SDoug Ambrisko 		uint8_t		reserved;
634765ca1d3SDoug Ambrisko 		int8_t		class;
635741367d5SDoug Ambrisko 	} members;
636741367d5SDoug Ambrisko 	uint32_t		word;
637741367d5SDoug Ambrisko } __packed;
638741367d5SDoug Ambrisko 
639741367d5SDoug Ambrisko /* event log state. */
640741367d5SDoug Ambrisko struct mfi_evt_log_state {
641741367d5SDoug Ambrisko 	uint32_t		newest_seq_num;
642741367d5SDoug Ambrisko 	uint32_t		oldest_seq_num;
643741367d5SDoug Ambrisko 	uint32_t		clear_seq_num;
644741367d5SDoug Ambrisko 	uint32_t		shutdown_seq_num;
645741367d5SDoug Ambrisko 	uint32_t		boot_seq_num;
646741367d5SDoug Ambrisko } __packed;
647741367d5SDoug Ambrisko 
648741367d5SDoug Ambrisko struct mfi_progress {
649741367d5SDoug Ambrisko 	uint16_t		progress;
650741367d5SDoug Ambrisko 	uint16_t		elapsed_seconds;
651741367d5SDoug Ambrisko } __packed;
652741367d5SDoug Ambrisko 
653741367d5SDoug Ambrisko struct mfi_evt_ld {
654741367d5SDoug Ambrisko 	uint16_t		target_id;
655741367d5SDoug Ambrisko 	uint8_t			ld_index;
656741367d5SDoug Ambrisko 	uint8_t			reserved;
657741367d5SDoug Ambrisko } __packed;
658741367d5SDoug Ambrisko 
659741367d5SDoug Ambrisko struct mfi_evt_pd {
660741367d5SDoug Ambrisko 	uint16_t		device_id;
661741367d5SDoug Ambrisko 	uint8_t			enclosure_index;
662741367d5SDoug Ambrisko 	uint8_t			slot_number;
663741367d5SDoug Ambrisko } __packed;
664741367d5SDoug Ambrisko 
665741367d5SDoug Ambrisko /* SAS (?) event detail, returned from MFI_DCMD_CTRL_EVENT_WAIT. */
666741367d5SDoug Ambrisko struct mfi_evt_detail {
667741367d5SDoug Ambrisko 	uint32_t		seq;
668741367d5SDoug Ambrisko 	uint32_t		time;
669741367d5SDoug Ambrisko 	uint32_t		code;
670741367d5SDoug Ambrisko 	union mfi_evt		class;
671741367d5SDoug Ambrisko 	uint8_t			arg_type;
672741367d5SDoug Ambrisko 	uint8_t			reserved1[15];
673741367d5SDoug Ambrisko 
674741367d5SDoug Ambrisko 	union {
675741367d5SDoug Ambrisko 		struct {
676741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
677741367d5SDoug Ambrisko 			uint8_t			cdb_len;
678741367d5SDoug Ambrisko 			uint8_t			sense_len;
679741367d5SDoug Ambrisko 			uint8_t			reserved[2];
680741367d5SDoug Ambrisko 			uint8_t			cdb[16];
681741367d5SDoug Ambrisko 			uint8_t			sense[64];
682741367d5SDoug Ambrisko 		} cdb_sense;
683741367d5SDoug Ambrisko 
684741367d5SDoug Ambrisko 		struct mfi_evt_ld		ld;
685741367d5SDoug Ambrisko 
686741367d5SDoug Ambrisko 		struct {
687741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
688741367d5SDoug Ambrisko 			uint64_t		count;
689741367d5SDoug Ambrisko 		} ld_count;
690741367d5SDoug Ambrisko 
691741367d5SDoug Ambrisko 		struct {
692741367d5SDoug Ambrisko 			uint64_t		lba;
693741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
694741367d5SDoug Ambrisko 		} ld_lba;
695741367d5SDoug Ambrisko 
696741367d5SDoug Ambrisko 		struct {
697741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
698741367d5SDoug Ambrisko 			uint32_t		pre_owner;
699741367d5SDoug Ambrisko 			uint32_t		new_owner;
700741367d5SDoug Ambrisko 		} ld_owner;
701741367d5SDoug Ambrisko 
702741367d5SDoug Ambrisko 		struct {
703741367d5SDoug Ambrisko 			uint64_t		ld_lba;
704741367d5SDoug Ambrisko 			uint64_t		pd_lba;
705741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
706741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
707741367d5SDoug Ambrisko 		} ld_lba_pd_lba;
708741367d5SDoug Ambrisko 
709741367d5SDoug Ambrisko 		struct {
710741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
711741367d5SDoug Ambrisko 			struct mfi_progress	prog;
712741367d5SDoug Ambrisko 		} ld_prog;
713741367d5SDoug Ambrisko 
714741367d5SDoug Ambrisko 		struct {
715741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
716741367d5SDoug Ambrisko 			uint32_t		prev_state;
717741367d5SDoug Ambrisko 			uint32_t		new_state;
718741367d5SDoug Ambrisko 		} ld_state;
719741367d5SDoug Ambrisko 
720741367d5SDoug Ambrisko 		struct {
721741367d5SDoug Ambrisko 			uint64_t		strip;
722741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
723741367d5SDoug Ambrisko 		} ld_strip;
724741367d5SDoug Ambrisko 
725741367d5SDoug Ambrisko 		struct mfi_evt_pd		pd;
726741367d5SDoug Ambrisko 
727741367d5SDoug Ambrisko 		struct {
728741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
729741367d5SDoug Ambrisko 			uint32_t		err;
730741367d5SDoug Ambrisko 		} pd_err;
731741367d5SDoug Ambrisko 
732741367d5SDoug Ambrisko 		struct {
733741367d5SDoug Ambrisko 			uint64_t		lba;
734741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
735741367d5SDoug Ambrisko 		} pd_lba;
736741367d5SDoug Ambrisko 
737741367d5SDoug Ambrisko 		struct {
738741367d5SDoug Ambrisko 			uint64_t		lba;
739741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
740741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
741741367d5SDoug Ambrisko 		} pd_lba_ld;
742741367d5SDoug Ambrisko 
743741367d5SDoug Ambrisko 		struct {
744741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
745741367d5SDoug Ambrisko 			struct mfi_progress	prog;
746741367d5SDoug Ambrisko 		} pd_prog;
747741367d5SDoug Ambrisko 
748741367d5SDoug Ambrisko 		struct {
749741367d5SDoug Ambrisko 			struct mfi_evt_pd	ld;
750741367d5SDoug Ambrisko 			uint32_t		prev_state;
751741367d5SDoug Ambrisko 			uint32_t		new_state;
752741367d5SDoug Ambrisko 		} pd_state;
753741367d5SDoug Ambrisko 
754741367d5SDoug Ambrisko 		struct {
755741367d5SDoug Ambrisko 			uint16_t		venderId;
756741367d5SDoug Ambrisko 			uint16_t		deviceId;
757741367d5SDoug Ambrisko 			uint16_t		subVenderId;
758741367d5SDoug Ambrisko 			uint16_t		subDeviceId;
759741367d5SDoug Ambrisko 		} pci;
760741367d5SDoug Ambrisko 
761741367d5SDoug Ambrisko 		uint32_t			rate;
762741367d5SDoug Ambrisko 
763741367d5SDoug Ambrisko 		char				str[96];
764741367d5SDoug Ambrisko 
765741367d5SDoug Ambrisko 		struct {
766741367d5SDoug Ambrisko 			uint32_t		rtc;
767741367d5SDoug Ambrisko 			uint16_t		elapsedSeconds;
768741367d5SDoug Ambrisko 		} time;
769741367d5SDoug Ambrisko 
770741367d5SDoug Ambrisko 		struct {
771741367d5SDoug Ambrisko 			uint32_t		ecar;
772741367d5SDoug Ambrisko 			uint32_t		elog;
773741367d5SDoug Ambrisko 			char			str[64];
774741367d5SDoug Ambrisko 		} ecc;
775741367d5SDoug Ambrisko 
776741367d5SDoug Ambrisko 		uint8_t		b[96];
777741367d5SDoug Ambrisko 		uint16_t	s[48];
778741367d5SDoug Ambrisko 		uint32_t	w[24];
779741367d5SDoug Ambrisko 		uint64_t	d[12];
780741367d5SDoug Ambrisko 	} args;
781741367d5SDoug Ambrisko 
782741367d5SDoug Ambrisko 	char description[128];
783741367d5SDoug Ambrisko } __packed;
784741367d5SDoug Ambrisko 
78547b470b9SDoug Ambrisko struct mfi_evt_list {
78647b470b9SDoug Ambrisko 	uint32_t		count;
78747b470b9SDoug Ambrisko 	uint32_t		reserved;
78847b470b9SDoug Ambrisko 	struct mfi_evt_detail	event[1];
789741367d5SDoug Ambrisko } __packed;
790741367d5SDoug Ambrisko 
791441f6d5dSScott Long union mfi_pd_ref {
792441f6d5dSScott Long 	struct {
793441f6d5dSScott Long 		uint16_t	device_id;
794441f6d5dSScott Long 		uint16_t	seq_num;
795441f6d5dSScott Long 	} v;
796441f6d5dSScott Long 	uint32_t	ref;
797441f6d5dSScott Long } __packed;
798441f6d5dSScott Long 
799441f6d5dSScott Long union mfi_pd_ddf_type {
800441f6d5dSScott Long 	struct {
801441f6d5dSScott Long 		union {
802441f6d5dSScott Long 			struct {
803441f6d5dSScott Long 				uint16_t	forced_pd_guid	: 1;
804441f6d5dSScott Long 				uint16_t	in_vd		: 1;
805441f6d5dSScott Long 				uint16_t	is_global_spare	: 1;
806441f6d5dSScott Long 				uint16_t	is_spare	: 1;
807441f6d5dSScott Long 				uint16_t	is_foreign	: 1;
808441f6d5dSScott Long 				uint16_t	reserved	: 7;
809441f6d5dSScott Long 				uint16_t	intf		: 4;
810441f6d5dSScott Long 			} pd_type;
811441f6d5dSScott Long 			uint16_t	type;
812441f6d5dSScott Long 		} v;
813441f6d5dSScott Long 		uint16_t		reserved;
814441f6d5dSScott Long 	} ddf;
815441f6d5dSScott Long 	struct {
816441f6d5dSScott Long 		uint32_t		reserved;
817441f6d5dSScott Long 	} non_disk;
818441f6d5dSScott Long 	uint32_t			type;
819441f6d5dSScott Long } __packed;
820441f6d5dSScott Long 
821441f6d5dSScott Long struct mfi_pd_progress {
822441f6d5dSScott Long 	struct {
823441f6d5dSScott Long 		uint32_t		rbld	: 1;
824441f6d5dSScott Long 		uint32_t		patrol	: 1;
825441f6d5dSScott Long 		uint32_t		clear	: 1;
826441f6d5dSScott Long 		uint32_t		reserved: 29;
827441f6d5dSScott Long 	} active;
828441f6d5dSScott Long 	struct mfi_progress		rbld;
829441f6d5dSScott Long 	struct mfi_progress		patrol;
830441f6d5dSScott Long 	struct mfi_progress		clear;
831441f6d5dSScott Long 	struct mfi_progress		reserved[4];
832441f6d5dSScott Long } __packed;
833441f6d5dSScott Long 
834441f6d5dSScott Long struct mfi_pd_info {
835441f6d5dSScott Long 	union mfi_pd_ref		ref;
836441f6d5dSScott Long 	uint8_t				inquiry_data[96];
837441f6d5dSScott Long 	uint8_t				vpd_page83[64];
838441f6d5dSScott Long 	uint8_t				not_supported;
839441f6d5dSScott Long 	uint8_t				scsi_dev_type;
840441f6d5dSScott Long 	uint8_t				connected_port_bitmap;
841441f6d5dSScott Long 	uint8_t				device_speed;
842441f6d5dSScott Long 	uint32_t			media_err_count;
843441f6d5dSScott Long 	uint32_t			other_err_count;
844441f6d5dSScott Long 	uint32_t			pred_fail_count;
845441f6d5dSScott Long 	uint32_t			last_pred_fail_event_seq_num;
846441f6d5dSScott Long 	uint16_t			fw_state;
847441f6d5dSScott Long 	uint8_t				disable_for_removal;
848441f6d5dSScott Long 	uint8_t				link_speed;
849441f6d5dSScott Long 	union mfi_pd_ddf_type		state;
850441f6d5dSScott Long 	struct {
851441f6d5dSScott Long 		uint8_t			count;
852441f6d5dSScott Long 		uint8_t			is_path_broken;
853441f6d5dSScott Long 		uint8_t			reserved[6];
854441f6d5dSScott Long 		uint64_t		sas_addr[4];
855441f6d5dSScott Long 	} path_info;
856441f6d5dSScott Long 	uint64_t			raw_size;
857441f6d5dSScott Long 	uint64_t			non_coerced_size;
858441f6d5dSScott Long 	uint64_t			coerced_size;
859441f6d5dSScott Long 	uint16_t			encl_device_id;
860441f6d5dSScott Long 	uint8_t				encl_index;
861441f6d5dSScott Long 	uint8_t				slot_number;
862441f6d5dSScott Long 	struct mfi_pd_progress		prog_info;
863441f6d5dSScott Long 	uint8_t				bad_block_table_full;
864441f6d5dSScott Long 	uint8_t				unusable_in_current_config;
865441f6d5dSScott Long 	uint8_t				vpd_page83_ext[64];
866441f6d5dSScott Long 	uint8_t				reserved[512-358];
867441f6d5dSScott Long } __packed;
868441f6d5dSScott Long 
869441f6d5dSScott Long struct mfi_pd_address {
870441f6d5dSScott Long 	uint16_t		device_id;
871441f6d5dSScott Long 	uint16_t		encl_device_id;
872441f6d5dSScott Long 	uint8_t			encl_index;
873441f6d5dSScott Long 	uint8_t			slot_number;
874441f6d5dSScott Long 	uint8_t			scsi_dev_type;
875441f6d5dSScott Long 	uint8_t			connect_port_bitmap;
876441f6d5dSScott Long 	uint64_t		sas_addr[2];
877441f6d5dSScott Long } __packed;
878441f6d5dSScott Long 
879441f6d5dSScott Long struct mfi_pd_list {
880441f6d5dSScott Long 	uint32_t		size;
881441f6d5dSScott Long 	uint32_t		count;
882441f6d5dSScott Long 	uint8_t			data;
883441f6d5dSScott Long 	/*
884441f6d5dSScott Long 	struct mfi_pd_address	addr[];
885441f6d5dSScott Long 	*/
886441f6d5dSScott Long } __packed;
887441f6d5dSScott Long 
888441f6d5dSScott Long union mfi_ld_ref {
889441f6d5dSScott Long 	struct {
890c0b332d1SPaul Saab 		uint8_t		target_id;
891c0b332d1SPaul Saab 		uint8_t		reserved;
892c0b332d1SPaul Saab 		uint16_t	seq;
893441f6d5dSScott Long 	} v;
894441f6d5dSScott Long 	uint32_t		ref;
895c0b332d1SPaul Saab } __packed;
896c0b332d1SPaul Saab 
897c0b332d1SPaul Saab struct mfi_ld_list {
898c0b332d1SPaul Saab 	uint32_t		ld_count;
899c0b332d1SPaul Saab 	uint32_t		reserved1;
900c0b332d1SPaul Saab 	struct {
901441f6d5dSScott Long 		union mfi_ld_ref	ld;
902c0b332d1SPaul Saab 		uint8_t		state;
903c0b332d1SPaul Saab 		uint8_t		reserved2[3];
904c0b332d1SPaul Saab 		uint64_t	size;
905c0b332d1SPaul Saab 	} ld_list[MFI_MAX_LD];
906c0b332d1SPaul Saab } __packed;
907c0b332d1SPaul Saab 
908c0b332d1SPaul Saab enum mfi_ld_access {
909c0b332d1SPaul Saab 	MFI_LD_ACCESS_RW =	0,
910c0b332d1SPaul Saab 	MFI_LD_ACCSSS_RO = 	2,
911c0b332d1SPaul Saab 	MFI_LD_ACCESS_BLOCKED =	3,
912c0b332d1SPaul Saab };
913c0b332d1SPaul Saab #define MFI_LD_ACCESS_MASK	3
914c0b332d1SPaul Saab 
915c0b332d1SPaul Saab enum mfi_ld_state {
916c0b332d1SPaul Saab 	MFI_LD_STATE_OFFLINE =			0,
917c0b332d1SPaul Saab 	MFI_LD_STATE_PARTIALLY_DEGRADED =	1,
918c0b332d1SPaul Saab 	MFI_LD_STATE_DEGRADED =			2,
919c0b332d1SPaul Saab 	MFI_LD_STATE_OPTIMAL =			3
920c0b332d1SPaul Saab };
921c0b332d1SPaul Saab 
922c0b332d1SPaul Saab struct mfi_ld_props {
923441f6d5dSScott Long 	union mfi_ld_ref	ld;
924c0b332d1SPaul Saab 	char			name[16];
925c0b332d1SPaul Saab 	uint8_t			default_cache_policy;
926c0b332d1SPaul Saab 	uint8_t			access_policy;
927c0b332d1SPaul Saab 	uint8_t			disk_cache_policy;
928c0b332d1SPaul Saab 	uint8_t			current_cache_policy;
929c0b332d1SPaul Saab 	uint8_t			no_bgi;
930c0b332d1SPaul Saab 	uint8_t			reserved[7];
931c0b332d1SPaul Saab } __packed;
932c0b332d1SPaul Saab 
933c0b332d1SPaul Saab struct mfi_ld_params {
934c0b332d1SPaul Saab 	uint8_t			primary_raid_level;
935c0b332d1SPaul Saab 	uint8_t			raid_level_qualifier;
936c0b332d1SPaul Saab 	uint8_t			secondary_raid_level;
937c0b332d1SPaul Saab 	uint8_t			stripe_size;
938c0b332d1SPaul Saab 	uint8_t			num_drives;
939c0b332d1SPaul Saab 	uint8_t			span_depth;
940c0b332d1SPaul Saab 	uint8_t			state;
941c0b332d1SPaul Saab 	uint8_t			init_state;
942c0b332d1SPaul Saab 	uint8_t			is_consistent;
943c0b332d1SPaul Saab 	uint8_t			reserved[23];
944c0b332d1SPaul Saab } __packed;
945c0b332d1SPaul Saab 
946c0b332d1SPaul Saab struct mfi_ld_progress {
947c0b332d1SPaul Saab 	uint32_t		active;
948c0b332d1SPaul Saab #define	MFI_LD_PROGRESS_CC	(1<<0)
949c0b332d1SPaul Saab #define	MFI_LD_PROGRESS_BGI	(1<<1)
950c0b332d1SPaul Saab #define	MFI_LD_PROGRESS_FGI	(1<<2)
951c0b332d1SPaul Saab #define	MFI_LD_PORGRESS_RECON	(1<<3)
952c0b332d1SPaul Saab 	struct mfi_progress	cc;
953c0b332d1SPaul Saab 	struct mfi_progress	bgi;
954c0b332d1SPaul Saab 	struct mfi_progress	fgi;
955c0b332d1SPaul Saab 	struct mfi_progress	recon;
956c0b332d1SPaul Saab 	struct mfi_progress	reserved[4];
957c0b332d1SPaul Saab } __packed;
958c0b332d1SPaul Saab 
959c0b332d1SPaul Saab struct mfi_span {
960c0b332d1SPaul Saab 	uint64_t		start_block;
961c0b332d1SPaul Saab 	uint64_t		num_blocks;
962c0b332d1SPaul Saab 	uint16_t		array_ref;
963c0b332d1SPaul Saab 	uint8_t			reserved[6];
964c0b332d1SPaul Saab } __packed;
965c0b332d1SPaul Saab 
966c0b332d1SPaul Saab #define	MFI_MAX_SPAN_DEPTH	8
967c0b332d1SPaul Saab struct mfi_ld_config {
968c0b332d1SPaul Saab 	struct mfi_ld_props	properties;
969c0b332d1SPaul Saab 	struct mfi_ld_params	params;
970c0b332d1SPaul Saab 	struct mfi_span		span[MFI_MAX_SPAN_DEPTH];
971c0b332d1SPaul Saab } __packed;
972c0b332d1SPaul Saab 
973c0b332d1SPaul Saab struct mfi_ld_info {
974c0b332d1SPaul Saab 	struct mfi_ld_config	ld_config;
975c0b332d1SPaul Saab 	uint64_t		size;
976c0b332d1SPaul Saab 	struct mfi_ld_progress	progress;
977c0b332d1SPaul Saab 	uint16_t		cluster_owner;
978c0b332d1SPaul Saab 	uint8_t			reconstruct_active;
979c0b332d1SPaul Saab 	uint8_t			reserved1[1];
980c0b332d1SPaul Saab 	uint8_t			vpd_page83[64];
981c0b332d1SPaul Saab 	uint8_t			reserved2[16];
982c0b332d1SPaul Saab } __packed;
983c0b332d1SPaul Saab 
984441f6d5dSScott Long union mfi_spare_type {
985441f6d5dSScott Long 	struct {
986441f6d5dSScott Long 		uint8_t		is_dedicate		:1;
987441f6d5dSScott Long 		uint8_t		is_revertable		:1;
988441f6d5dSScott Long 		uint8_t		is_encl_affinity	:1;
989441f6d5dSScott Long 		uint8_t		reserved		:5;
990441f6d5dSScott Long 	} v;
991441f6d5dSScott Long 	uint8_t		type;
992441f6d5dSScott Long } __packed;
993441f6d5dSScott Long 
994441f6d5dSScott Long #define MAX_ARRAYS 16
995441f6d5dSScott Long struct mfi_spare {
996441f6d5dSScott Long 	union mfi_pd_ref	ref;
997441f6d5dSScott Long 	union mfi_spare_type	spare_type;
998441f6d5dSScott Long 	uint8_t			reserved[2];
999441f6d5dSScott Long 	uint8_t			array_count;
1000441f6d5dSScott Long 	uint16_t		array_refd[MAX_ARRAYS];
1001441f6d5dSScott Long } __packed;
1002441f6d5dSScott Long 
1003441f6d5dSScott Long #define MAX_ROW_SIZE 32
1004441f6d5dSScott Long struct mfi_array {
1005441f6d5dSScott Long 	uint64_t			size;
1006441f6d5dSScott Long 	uint8_t				num_drives;
1007441f6d5dSScott Long 	uint8_t				reserved;
1008441f6d5dSScott Long 	uint16_t			array_ref;
1009441f6d5dSScott Long 	uint8_t				pad[20];
1010441f6d5dSScott Long 	struct {
1011441f6d5dSScott Long 		union mfi_pd_ref	ref;
1012441f6d5dSScott Long 		uint16_t		fw_state;
1013441f6d5dSScott Long 		struct {
1014441f6d5dSScott Long 			uint8_t		pd;
1015441f6d5dSScott Long 			uint8_t		slot;
1016441f6d5dSScott Long 		} encl;
1017441f6d5dSScott Long 	} pd[MAX_ROW_SIZE];
1018441f6d5dSScott Long } __packed;
1019441f6d5dSScott Long 
1020441f6d5dSScott Long struct mfi_config_data {
1021441f6d5dSScott Long 	uint32_t		size;
1022441f6d5dSScott Long 	uint16_t		array_count;
1023441f6d5dSScott Long 	uint16_t		array_size;
1024441f6d5dSScott Long 	uint16_t		log_drv_count;
1025441f6d5dSScott Long 	uint16_t		log_drv_size;
1026441f6d5dSScott Long 	uint16_t		spares_count;
1027441f6d5dSScott Long 	uint16_t		spares_size;
1028441f6d5dSScott Long 	uint8_t			reserved[16];
1029441f6d5dSScott Long 	uint8_t			data;
1030441f6d5dSScott Long 	/*
1031441f6d5dSScott Long 	struct mfi_array	array[];
1032441f6d5dSScott Long 	struct mfi_ld_config	ld[];
1033441f6d5dSScott Long 	struct mfi_spare	spare[];
1034441f6d5dSScott Long 	*/
1035441f6d5dSScott Long } __packed;
1036441f6d5dSScott Long 
103735ef86f2SScott Long #define MFI_SCSI_MAX_TARGETS	128
103835ef86f2SScott Long #define MFI_SCSI_MAX_LUNS	8
103935ef86f2SScott Long #define MFI_SCSI_INITIATOR_ID	255
104035ef86f2SScott Long #define MFI_SCSI_MAX_CMDS	8
104135ef86f2SScott Long #define MFI_SCSI_MAX_CDB_LEN	16
104235ef86f2SScott Long 
10432e21a3efSScott Long #endif /* _MFIREG_H */
1044