xref: /freebsd/sys/dev/mfi/mfireg.h (revision c0b332d17abbabfa7188b4904fd7528b5b0ccb2e)
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,
1042e21a3efSScott Long 	MFI_DCMD_CTRL_FLUSHCACHE =	0x01101000,
1052e21a3efSScott Long 	MFI_DCMD_CTRL_SHUTDOWN =	0x01050000,
1062e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_GETINFO =	0x01040100,
1072e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_GET =	0x01040300,
1082e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_WAIT =	0x01040500,
109c0b332d1SPaul Saab 	MFI_DCMD_LD_GET_LIST =		0x03010000,
110c0b332d1SPaul Saab 	MFI_DCMD_LD_GET_INFO =		0x03020000,
1112e21a3efSScott Long 	MFI_DCMD_LD_GET_PROP =		0x03030000,
112c0b332d1SPaul Saab 	MFI_DCMD_LD_SET_PROP =		0x03040000,
1132e21a3efSScott Long 	MFI_DCMD_CLUSTER =		0x08000000,
1142e21a3efSScott Long 	MFI_DCMD_CLUSTER_RESET_ALL =	0x08010100,
1152e21a3efSScott Long 	MFI_DCMD_CLUSTER_RESET_LD =	0x08010200
1162e21a3efSScott Long } mfi_dcmd_t;
1172e21a3efSScott Long 
1182e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_FLUSHCACHE */
1192e21a3efSScott Long #define MFI_FLUSHCACHE_CTRL	0x01
1202e21a3efSScott Long #define MFI_FLUSHCACHE_DISK	0x02
1212e21a3efSScott Long 
1222e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_SHUTDOWN */
1232e21a3efSScott Long #define MFI_SHUTDOWN_SPINDOWN	0x01
1242e21a3efSScott Long 
1252e21a3efSScott Long /*
126741367d5SDoug Ambrisko  * MFI Frame flags
1272e21a3efSScott Long  */
1282e21a3efSScott Long #define MFI_FRAME_POST_IN_REPLY_QUEUE		0x0000
1292e21a3efSScott Long #define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE	0x0001
1302e21a3efSScott Long #define MFI_FRAME_SGL32				0x0000
1312e21a3efSScott Long #define MFI_FRAME_SGL64				0x0002
1322e21a3efSScott Long #define MFI_FRAME_SENSE32			0x0000
1332e21a3efSScott Long #define MFI_FRAME_SENSE64			0x0004
1342e21a3efSScott Long #define MFI_FRAME_DIR_NONE			0x0000
1352e21a3efSScott Long #define MFI_FRAME_DIR_WRITE			0x0008
1362e21a3efSScott Long #define MFI_FRAME_DIR_READ			0x0010
1372e21a3efSScott Long #define MFI_FRAME_DIR_BOTH			0x0018
1382e21a3efSScott Long 
1392e21a3efSScott Long /* MFI Status codes */
1402e21a3efSScott Long typedef enum {
1412e21a3efSScott Long 	MFI_STAT_OK =			0x00,
1422e21a3efSScott Long 	MFI_STAT_INVALID_CMD,
1432e21a3efSScott Long 	MFI_STAT_INVALID_DCMD,
1442e21a3efSScott Long 	MFI_STAT_INVALID_PARAMETER,
1452e21a3efSScott Long 	MFI_STAT_INVALID_SEQUENCE_NUMBER,
1462e21a3efSScott Long 	MFI_STAT_ABORT_NOT_POSSIBLE,
1472e21a3efSScott Long 	MFI_STAT_APP_HOST_CODE_NOT_FOUND,
1482e21a3efSScott Long 	MFI_STAT_APP_IN_USE,
1492e21a3efSScott Long 	MFI_STAT_APP_NOT_INITIALIZED,
1502e21a3efSScott Long 	MFI_STAT_ARRAY_INDEX_INVALID,
1512e21a3efSScott Long 	MFI_STAT_ARRAY_ROW_NOT_EMPTY,
1522e21a3efSScott Long 	MFI_STAT_CONFIG_RESOURCE_CONFLICT,
1532e21a3efSScott Long 	MFI_STAT_DEVICE_NOT_FOUND,
1542e21a3efSScott Long 	MFI_STAT_DRIVE_TOO_SMALL,
1552e21a3efSScott Long 	MFI_STAT_FLASH_ALLOC_FAIL,
1562e21a3efSScott Long 	MFI_STAT_FLASH_BUSY,
1572e21a3efSScott Long 	MFI_STAT_FLASH_ERROR =		0x10,
1582e21a3efSScott Long 	MFI_STAT_FLASH_IMAGE_BAD,
1592e21a3efSScott Long 	MFI_STAT_FLASH_IMAGE_INCOMPLETE,
1602e21a3efSScott Long 	MFI_STAT_FLASH_NOT_OPEN,
1612e21a3efSScott Long 	MFI_STAT_FLASH_NOT_STARTED,
1622e21a3efSScott Long 	MFI_STAT_FLUSH_FAILED,
1632e21a3efSScott Long 	MFI_STAT_HOST_CODE_NOT_FOUNT,
1642e21a3efSScott Long 	MFI_STAT_LD_CC_IN_PROGRESS,
1652e21a3efSScott Long 	MFI_STAT_LD_INIT_IN_PROGRESS,
1662e21a3efSScott Long 	MFI_STAT_LD_LBA_OUT_OF_RANGE,
1672e21a3efSScott Long 	MFI_STAT_LD_MAX_CONFIGURED,
1682e21a3efSScott Long 	MFI_STAT_LD_NOT_OPTIMAL,
1692e21a3efSScott Long 	MFI_STAT_LD_RBLD_IN_PROGRESS,
1702e21a3efSScott Long 	MFI_STAT_LD_RECON_IN_PROGRESS,
1712e21a3efSScott Long 	MFI_STAT_LD_WRONG_RAID_LEVEL,
1722e21a3efSScott Long 	MFI_STAT_MAX_SPARES_EXCEEDED,
1732e21a3efSScott Long 	MFI_STAT_MEMORY_NOT_AVAILABLE =	0x20,
1742e21a3efSScott Long 	MFI_STAT_MFC_HW_ERROR,
1752e21a3efSScott Long 	MFI_STAT_NO_HW_PRESENT,
1762e21a3efSScott Long 	MFI_STAT_NOT_FOUND,
1772e21a3efSScott Long 	MFI_STAT_NOT_IN_ENCL,
1782e21a3efSScott Long 	MFI_STAT_PD_CLEAR_IN_PROGRESS,
1792e21a3efSScott Long 	MFI_STAT_PD_TYPE_WRONG,
1802e21a3efSScott Long 	MFI_STAT_PR_DISABLED,
1812e21a3efSScott Long 	MFI_STAT_ROW_INDEX_INVALID,
1822e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_ACTION,
1832e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_DATA,
1842e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_PAGE,
1852e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_TYPE,
1862e21a3efSScott Long 	MFI_STAT_SCSI_DONE_WITH_ERROR,
1872e21a3efSScott Long 	MFI_STAT_SCSI_IO_FAILED,
1882e21a3efSScott Long 	MFI_STAT_SCSI_RESERVATION_CONFLICT,
1892e21a3efSScott Long 	MFI_STAT_SHUTDOWN_FAILED =	0x30,
1902e21a3efSScott Long 	MFI_STAT_TIME_NOT_SET,
1912e21a3efSScott Long 	MFI_STAT_WRONG_STATE,
1922e21a3efSScott Long 	MFI_STAT_LD_OFFLINE,
1932e21a3efSScott Long 	MFI_STAT_PEER_NOTIFICATION_REJECTED,
1942e21a3efSScott Long 	MFI_STAT_PEER_NOTIFICATION_FAILED,
1952e21a3efSScott Long 	MFI_STAT_RESERVATION_IN_PROGRESS,
1962e21a3efSScott Long 	MFI_STAT_I2C_ERRORS_DETECTED,
1972e21a3efSScott Long 	MFI_STAT_PCI_ERRORS_DETECTED,
1982e21a3efSScott Long 	MFI_STAT_INVALID_STATUS =	0xFF
1992e21a3efSScott Long } mfi_status_t;
2002e21a3efSScott Long 
2012e21a3efSScott Long typedef enum {
2022e21a3efSScott Long 	MFI_EVT_CLASS_DEBUG =		-2,
2032e21a3efSScott Long 	MFI_EVT_CLASS_PROGRESS =	-1,
2042e21a3efSScott Long 	MFI_EVT_CLASS_INFO =		0,
2052e21a3efSScott Long 	MFI_EVT_CLASS_WARNING =		1,
2062e21a3efSScott Long 	MFI_EVT_CLASS_CRITICAL =	2,
2072e21a3efSScott Long 	MFI_EVT_CLASS_FATAL =		3,
2082e21a3efSScott Long 	MFI_EVT_CLASS_DEAD =		4
2092e21a3efSScott Long } mfi_evt_class_t;
2102e21a3efSScott Long 
2112e21a3efSScott Long typedef enum {
2122e21a3efSScott Long 	MFI_EVT_LOCALE_LD =		0x0001,
2132e21a3efSScott Long 	MFI_EVT_LOCALE_PD =		0x0002,
2142e21a3efSScott Long 	MFI_EVT_LOCALE_ENCL =		0x0004,
2152e21a3efSScott Long 	MFI_EVT_LOCALE_BBU =		0x0008,
2162e21a3efSScott Long 	MFI_EVT_LOCALE_SAS =		0x0010,
2172e21a3efSScott Long 	MFI_EVT_LOCALE_CTRL =		0x0020,
2182e21a3efSScott Long 	MFI_EVT_LOCALE_CONFIG =		0x0040,
2192e21a3efSScott Long 	MFI_EVT_LOCALE_CLUSTER =	0x0080,
2202e21a3efSScott Long 	MFI_EVT_LOCALE_ALL =		0xffff
2212e21a3efSScott Long } mfi_evt_locale_t;
2222e21a3efSScott Long 
2232e21a3efSScott Long typedef enum {
2242e21a3efSScott Long 	MR_EVT_ARGS_NONE =		0x00,
2252e21a3efSScott Long 	MR_EVT_ARGS_CDB_SENSE,
2262e21a3efSScott Long 	MR_EVT_ARGS_LD,
2272e21a3efSScott Long 	MR_EVT_ARGS_LD_COUNT,
2282e21a3efSScott Long 	MR_EVT_ARGS_LD_LBA,
2292e21a3efSScott Long 	MR_EVT_ARGS_LD_OWNER,
2302e21a3efSScott Long 	MR_EVT_ARGS_LD_LBA_PD_LBA,
2312e21a3efSScott Long 	MR_EVT_ARGS_LD_PROG,
2322e21a3efSScott Long 	MR_EVT_ARGS_LD_STATE,
2332e21a3efSScott Long 	MR_EVT_ARGS_LD_STRIP,
2342e21a3efSScott Long 	MR_EVT_ARGS_PD,
2352e21a3efSScott Long 	MR_EVT_ARGS_PD_ERR,
2362e21a3efSScott Long 	MR_EVT_ARGS_PD_LBA,
2372e21a3efSScott Long 	MR_EVT_ARGS_PD_LBA_LD,
2382e21a3efSScott Long 	MR_EVT_ARGS_PD_PROG,
2392e21a3efSScott Long 	MR_EVT_ARGS_PD_STATE,
2402e21a3efSScott Long 	MR_EVT_ARGS_PCI,
2412e21a3efSScott Long 	MR_EVT_ARGS_RATE,
2422e21a3efSScott Long 	MR_EVT_ARGS_STR,
2432e21a3efSScott Long 	MR_EVT_ARGS_TIME,
2442e21a3efSScott Long 	MR_EVT_ARGS_ECC
2452e21a3efSScott Long } mfi_evt_args;
2462e21a3efSScott Long 
2472e21a3efSScott Long /*
2482e21a3efSScott Long  * Other propertities and definitions
2492e21a3efSScott Long  */
2502e21a3efSScott Long #define MFI_MAX_PD_CHANNELS	2
2512e21a3efSScott Long #define MFI_MAX_LD_CHANNELS	2
2522e21a3efSScott Long #define MFI_MAX_CHANNELS	(MFI_MAX_PD_CHANNELS + MFI_MAX_LD_CHANNELS)
2532e21a3efSScott Long #define MFI_MAX_CHANNEL_DEVS	128
2542e21a3efSScott Long #define MFI_DEFAULT_ID		-1
2552e21a3efSScott Long #define MFI_MAX_LUN		8
2562e21a3efSScott Long #define MFI_MAX_LD		64
2572e21a3efSScott Long 
2582e21a3efSScott Long #define MFI_FRAME_SIZE		64
2592e21a3efSScott Long #define MFI_MBOX_SIZE		12
2602e21a3efSScott Long 
2612e21a3efSScott Long #define MFI_POLL_TIMEOUT_SECS	10
2622e21a3efSScott Long 
2632e21a3efSScott Long /* Allow for speedier math calculations */
2642e21a3efSScott Long #define MFI_SECTOR_LEN		512
2652e21a3efSScott Long 
2662e21a3efSScott Long /* Scatter Gather elements */
2672e21a3efSScott Long struct mfi_sg32 {
2682e21a3efSScott Long 	uint32_t	addr;
2692e21a3efSScott Long 	uint32_t	len;
2702e21a3efSScott Long } __packed;
2712e21a3efSScott Long 
2722e21a3efSScott Long struct mfi_sg64 {
2732e21a3efSScott Long 	uint64_t	addr;
2742e21a3efSScott Long 	uint32_t	len;
2752e21a3efSScott Long } __packed;
2762e21a3efSScott Long 
2772e21a3efSScott Long union mfi_sgl {
2782e21a3efSScott Long 	struct mfi_sg32	sg32[1];
2792e21a3efSScott Long 	struct mfi_sg64	sg64[1];
2802e21a3efSScott Long } __packed;
2812e21a3efSScott Long 
2822e21a3efSScott Long /* Message frames.  All messages have a common header */
2832e21a3efSScott Long struct mfi_frame_header {
2842e21a3efSScott Long 	uint8_t		cmd;
2852e21a3efSScott Long 	uint8_t		sense_len;
2862e21a3efSScott Long 	uint8_t		cmd_status;
2872e21a3efSScott Long 	uint8_t		scsi_status;
2882e21a3efSScott Long 	uint8_t		target_id;
2892e21a3efSScott Long 	uint8_t		lun_id;
2902e21a3efSScott Long 	uint8_t		cdb_len;
2912e21a3efSScott Long 	uint8_t		sg_count;
2922e21a3efSScott Long 	uint32_t	context;
2932e21a3efSScott Long 	uint32_t	pad0;
2942e21a3efSScott Long 	uint16_t	flags;
2952e21a3efSScott Long 	uint16_t	timeout;
2962e21a3efSScott Long 	uint32_t	data_len;
2972e21a3efSScott Long } __packed;
2982e21a3efSScott Long 
2992e21a3efSScott Long struct mfi_init_frame {
3002e21a3efSScott Long 	struct mfi_frame_header	header;
3012e21a3efSScott Long 	uint32_t	qinfo_new_addr_lo;
3022e21a3efSScott Long 	uint32_t	qinfo_new_addr_hi;
3032e21a3efSScott Long 	uint32_t	qinfo_old_addr_lo;
3042e21a3efSScott Long 	uint32_t	qinfo_old_addr_hi;
3052e21a3efSScott Long 	uint32_t	reserved[6];
3062e21a3efSScott Long } __packed;
3072e21a3efSScott Long 
3082e21a3efSScott Long #define MFI_IO_FRAME_SIZE 40
3092e21a3efSScott Long struct mfi_io_frame {
3102e21a3efSScott Long 	struct mfi_frame_header	header;
3112e21a3efSScott Long 	uint32_t	sense_addr_lo;
3122e21a3efSScott Long 	uint32_t	sense_addr_hi;
3132e21a3efSScott Long 	uint32_t	lba_lo;
3142e21a3efSScott Long 	uint32_t	lba_hi;
3152e21a3efSScott Long 	union mfi_sgl	sgl;
3162e21a3efSScott Long } __packed;
3172e21a3efSScott Long 
3182e21a3efSScott Long #define MFI_PASS_FRAME_SIZE 48
3192e21a3efSScott Long struct mfi_pass_frame {
3202e21a3efSScott Long 	struct mfi_frame_header header;
3212e21a3efSScott Long 	uint32_t	sense_addr_lo;
3222e21a3efSScott Long 	uint32_t	sense_addr_hi;
3232e21a3efSScott Long 	uint8_t		cdb[16];
3242e21a3efSScott Long 	union mfi_sgl	sgl;
3252e21a3efSScott Long } __packed;
3262e21a3efSScott Long 
3272e21a3efSScott Long #define MFI_DCMD_FRAME_SIZE 40
3282e21a3efSScott Long struct mfi_dcmd_frame {
3292e21a3efSScott Long 	struct mfi_frame_header header;
3302e21a3efSScott Long 	uint32_t	opcode;
3312e21a3efSScott Long 	uint8_t		mbox[MFI_MBOX_SIZE];
3322e21a3efSScott Long 	union mfi_sgl	sgl;
3332e21a3efSScott Long } __packed;
3342e21a3efSScott Long 
3352e21a3efSScott Long struct mfi_abort_frame {
3362e21a3efSScott Long 	struct mfi_frame_header header;
3372e21a3efSScott Long 	uint32_t	abort_context;
3382e21a3efSScott Long 	uint32_t	pad;
3392e21a3efSScott Long 	uint32_t	abort_mfi_addr_lo;
3402e21a3efSScott Long 	uint32_t	abort_mfi_addr_hi;
3412e21a3efSScott Long 	uint32_t	reserved[6];
3422e21a3efSScott Long } __packed;
3432e21a3efSScott Long 
3442e21a3efSScott Long struct mfi_smp_frame {
3452e21a3efSScott Long 	struct mfi_frame_header header;
3462e21a3efSScott Long 	uint64_t	sas_addr;
3472e21a3efSScott Long 	union {
3482e21a3efSScott Long 		struct mfi_sg32 sg32[2];
3492e21a3efSScott Long 		struct mfi_sg64 sg64[2];
3502e21a3efSScott Long 	} sgl;
3512e21a3efSScott Long } __packed;
3522e21a3efSScott Long 
3532e21a3efSScott Long struct mfi_stp_frame {
3542e21a3efSScott Long 	struct mfi_frame_header header;
3552e21a3efSScott Long 	uint16_t	fis[10];
3562e21a3efSScott Long 	uint32_t	stp_flags;
3572e21a3efSScott Long 	union {
3582e21a3efSScott Long 		struct mfi_sg32 sg32[2];
3592e21a3efSScott Long 		struct mfi_sg64 sg64[2];
3602e21a3efSScott Long 	} sgl;
3612e21a3efSScott Long } __packed;
3622e21a3efSScott Long 
3632e21a3efSScott Long union mfi_frame {
3642e21a3efSScott Long 	struct mfi_frame_header header;
3652e21a3efSScott Long 	struct mfi_init_frame	init;
3662e21a3efSScott Long 	struct mfi_io_frame	io;
3672e21a3efSScott Long 	struct mfi_pass_frame	pass;
3682e21a3efSScott Long 	struct mfi_dcmd_frame	dcmd;
3692e21a3efSScott Long 	struct mfi_abort_frame	abort;
3702e21a3efSScott Long 	struct mfi_smp_frame	smp;
3712e21a3efSScott Long 	struct mfi_stp_frame	stp;
3722e21a3efSScott Long 	uint8_t			bytes[MFI_FRAME_SIZE];
3732e21a3efSScott Long };
3742e21a3efSScott Long 
3752e21a3efSScott Long #define MFI_SENSE_LEN 128
3762e21a3efSScott Long struct mfi_sense {
3772e21a3efSScott Long 	uint8_t		data[MFI_SENSE_LEN];
3782e21a3efSScott Long };
3792e21a3efSScott Long 
3802e21a3efSScott Long /* The queue init structure that is passed with the init message */
3812e21a3efSScott Long struct mfi_init_qinfo {
3822e21a3efSScott Long 	uint32_t	flags;
3832e21a3efSScott Long 	uint32_t	rq_entries;
3842e21a3efSScott Long 	uint32_t	rq_addr_lo;
3852e21a3efSScott Long 	uint32_t	rq_addr_hi;
3862e21a3efSScott Long 	uint32_t	pi_addr_lo;
3872e21a3efSScott Long 	uint32_t	pi_addr_hi;
3882e21a3efSScott Long 	uint32_t	ci_addr_lo;
3892e21a3efSScott Long 	uint32_t	ci_addr_hi;
3902e21a3efSScott Long } __packed;
3912e21a3efSScott Long 
3922e21a3efSScott Long /* SAS (?) controller properties, part of mfi_ctrl_info */
3932e21a3efSScott Long struct mfi_ctrl_props {
3942e21a3efSScott Long 	uint16_t	seq_num;
3952e21a3efSScott Long 	uint16_t	pred_fail_poll_interval;
3962e21a3efSScott Long 	uint16_t	intr_throttle_cnt;
3972e21a3efSScott Long 	uint16_t	intr_throttle_timeout;
3982e21a3efSScott Long 	uint8_t		rebuild_rate;
3992e21a3efSScott Long 	uint8_t		patrol_read_rate;
4002e21a3efSScott Long 	uint8_t		bgi_rate;
4012e21a3efSScott Long 	uint8_t		cc_rate;
4022e21a3efSScott Long 	uint8_t		recon_rate;
4032e21a3efSScott Long 	uint8_t		cache_flush_interval;
4042e21a3efSScott Long 	uint8_t		spinup_drv_cnt;
4052e21a3efSScott Long 	uint8_t		spinup_delay;
4062e21a3efSScott Long 	uint8_t		cluster_enable;
4072e21a3efSScott Long 	uint8_t		coercion_mode;
4082e21a3efSScott Long 	uint8_t		alarm_enable;
4092e21a3efSScott Long 	uint8_t		disable_auto_rebuild;
4102e21a3efSScott Long 	uint8_t		disable_battery_warn;
4112e21a3efSScott Long 	uint8_t		ecc_bucket_size;
4122e21a3efSScott Long 	uint16_t	ecc_bucket_leak_rate;
4132e21a3efSScott Long 	uint8_t		restore_hotspare_on_insertion;
4142e21a3efSScott Long 	uint8_t		expose_encl_devices;
4152e21a3efSScott Long 	uint8_t		reserved[38];
4162e21a3efSScott Long } __packed;
4172e21a3efSScott Long 
4182e21a3efSScott Long /* PCI information about the card. */
4192e21a3efSScott Long struct mfi_info_pci {
4202e21a3efSScott Long 	uint16_t	vendor;
4212e21a3efSScott Long 	uint16_t	device;
4222e21a3efSScott Long 	uint16_t	subvendor;
4232e21a3efSScott Long 	uint16_t	subdevice;
4242e21a3efSScott Long 	uint8_t		reserved[24];
4252e21a3efSScott Long } __packed;
4262e21a3efSScott Long 
4272e21a3efSScott Long /* Host (front end) interface information */
4282e21a3efSScott Long struct mfi_info_host {
4292e21a3efSScott Long 	uint8_t		type;
4302e21a3efSScott Long #define MFI_INFO_HOST_PCIX	0x01
4312e21a3efSScott Long #define MFI_INFO_HOST_PCIE	0x02
4322e21a3efSScott Long #define MFI_INFO_HOST_ISCSI	0x04
4332e21a3efSScott Long #define MFI_INFO_HOST_SAS3G	0x08
4342e21a3efSScott Long 	uint8_t		reserved[6];
4352e21a3efSScott Long 	uint8_t		port_count;
4362e21a3efSScott Long 	uint64_t	port_addr[8];
4372e21a3efSScott Long } __packed;
4382e21a3efSScott Long 
4392e21a3efSScott Long /* Device (back end) interface information */
4402e21a3efSScott Long struct mfi_info_device {
4412e21a3efSScott Long 	uint8_t		type;
4422e21a3efSScott Long #define MFI_INFO_DEV_SPI	0x01
4432e21a3efSScott Long #define MFI_INFO_DEV_SAS3G	0x02
4442e21a3efSScott Long #define MFI_INFO_DEV_SATA1	0x04
4452e21a3efSScott Long #define MFI_INFO_DEV_SATA3G	0x08
4462e21a3efSScott Long 	uint8_t		reserved[6];
4472e21a3efSScott Long 	uint8_t		port_count;
4482e21a3efSScott Long 	uint64_t	port_addr[8];
4492e21a3efSScott Long } __packed;
4502e21a3efSScott Long 
4512e21a3efSScott Long /* Firmware component information */
4522e21a3efSScott Long struct mfi_info_component {
4532e21a3efSScott Long 	char		 name[8];
4542e21a3efSScott Long 	char		 version[32];
4552e21a3efSScott Long 	char		 build_date[16];
4562e21a3efSScott Long 	char		 build_time[16];
4572e21a3efSScott Long } __packed;
4582e21a3efSScott Long 
4592e21a3efSScott Long 
4602e21a3efSScott Long /* SAS (?) controller info, returned from MFI_DCMD_CTRL_GETINFO. */
4612e21a3efSScott Long struct mfi_ctrl_info {
4622e21a3efSScott Long 	struct mfi_info_pci	pci;
4632e21a3efSScott Long 	struct mfi_info_host	host;
4642e21a3efSScott Long 	struct mfi_info_device	device;
4652e21a3efSScott Long 
4662e21a3efSScott Long 	/* Firmware components that are present and active. */
4672e21a3efSScott Long 	uint32_t		image_check_word;
4682e21a3efSScott Long 	uint32_t		image_component_count;
4692e21a3efSScott Long 	struct mfi_info_component image_component[8];
4702e21a3efSScott Long 
4712e21a3efSScott Long 	/* Firmware components that have been flashed but are inactive */
4722e21a3efSScott Long 	uint32_t		pending_image_component_count;
4732e21a3efSScott Long 	struct mfi_info_component pending_image_component[8];
4742e21a3efSScott Long 
4752e21a3efSScott Long 	uint8_t			max_arms;
4762e21a3efSScott Long 	uint8_t			max_spans;
4772e21a3efSScott Long 	uint8_t			max_arrays;
4782e21a3efSScott Long 	uint8_t			max_lds;
4792e21a3efSScott Long 	char			product_name[80];
4802e21a3efSScott Long 	char			serial_number[32];
4812e21a3efSScott Long 	uint32_t		hw_present;
4822e21a3efSScott Long #define MFI_INFO_HW_BBU		0x01
4832e21a3efSScott Long #define MFI_INFO_HW_ALARM	0x02
4842e21a3efSScott Long #define MFI_INFO_HW_NVRAM	0x04
4852e21a3efSScott Long #define MFI_INFO_HW_UART	0x08
4862e21a3efSScott Long 	uint32_t		current_fw_time;
4872e21a3efSScott Long 	uint16_t		max_cmds;
4882e21a3efSScott Long 	uint16_t		max_sg_elements;
4892e21a3efSScott Long 	uint32_t		max_request_size;
4902e21a3efSScott Long 	uint16_t		lds_present;
4912e21a3efSScott Long 	uint16_t		lds_degraded;
4922e21a3efSScott Long 	uint16_t		lds_offline;
4932e21a3efSScott Long 	uint16_t		pd_present;
4942e21a3efSScott Long 	uint16_t		pd_disks_present;
4952e21a3efSScott Long 	uint16_t		pd_disks_pred_failure;
4962e21a3efSScott Long 	uint16_t		pd_disks_failed;
4972e21a3efSScott Long 	uint16_t		nvram_size;
4982e21a3efSScott Long 	uint16_t		memory_size;
4992e21a3efSScott Long 	uint16_t		flash_size;
5002e21a3efSScott Long 	uint16_t		ram_correctable_errors;
5012e21a3efSScott Long 	uint16_t		ram_uncorrectable_errors;
5022e21a3efSScott Long 	uint8_t			cluster_allowed;
5032e21a3efSScott Long 	uint8_t			cluster_active;
5042e21a3efSScott Long 	uint16_t		max_strips_per_io;
5052e21a3efSScott Long 
5062e21a3efSScott Long 	uint32_t		raid_levels;
5072e21a3efSScott Long #define MFI_INFO_RAID_0		0x01
5082e21a3efSScott Long #define MFI_INFO_RAID_1		0x02
5092e21a3efSScott Long #define MFI_INFO_RAID_5		0x04
5102e21a3efSScott Long #define MFI_INFO_RAID_1E	0x08
5112e21a3efSScott Long #define MFI_INFO_RAID_6		0x10
5122e21a3efSScott Long 
5132e21a3efSScott Long 	uint32_t		adapter_ops;
5142e21a3efSScott Long #define MFI_INFO_AOPS_RBLD_RATE		0x0001
5152e21a3efSScott Long #define MFI_INFO_AOPS_CC_RATE		0x0002
5162e21a3efSScott Long #define MFI_INFO_AOPS_BGI_RATE		0x0004
5172e21a3efSScott Long #define MFI_INFO_AOPS_RECON_RATE	0x0008
5182e21a3efSScott Long #define MFI_INFO_AOPS_PATROL_RATE	0x0010
5192e21a3efSScott Long #define MFI_INFO_AOPS_ALARM_CONTROL	0x0020
5202e21a3efSScott Long #define MFI_INFO_AOPS_CLUSTER_SUPPORTED	0x0040
5212e21a3efSScott Long #define MFI_INFO_AOPS_BBU		0x0080
5222e21a3efSScott Long #define MFI_INFO_AOPS_SPANNING_ALLOWED	0x0100
5232e21a3efSScott Long #define MFI_INFO_AOPS_DEDICATED_SPARES	0x0200
5242e21a3efSScott Long #define MFI_INFO_AOPS_REVERTIBLE_SPARES	0x0400
5252e21a3efSScott Long #define MFI_INFO_AOPS_FOREIGN_IMPORT	0x0800
5262e21a3efSScott Long #define MFI_INFO_AOPS_SELF_DIAGNOSTIC	0x1000
5272e21a3efSScott Long #define MFI_INFO_AOPS_MIXED_ARRAY	0x2000
5282e21a3efSScott Long #define MFI_INFO_AOPS_GLOBAL_SPARES	0x4000
5292e21a3efSScott Long 
5302e21a3efSScott Long 	uint32_t		ld_ops;
5312e21a3efSScott Long #define MFI_INFO_LDOPS_READ_POLICY	0x01
5322e21a3efSScott Long #define MFI_INFO_LDOPS_WRITE_POLICY	0x02
5332e21a3efSScott Long #define MFI_INFO_LDOPS_IO_POLICY	0x04
5342e21a3efSScott Long #define MFI_INFO_LDOPS_ACCESS_POLICY	0x08
5352e21a3efSScott Long #define MFI_INFO_LDOPS_DISK_CACHE_POLICY 0x10
5362e21a3efSScott Long 
5372e21a3efSScott Long 	struct {
5382e21a3efSScott Long 		uint8_t		min;
5392e21a3efSScott Long 		uint8_t		max;
5402e21a3efSScott Long 		uint8_t		reserved[2];
5412e21a3efSScott Long 	} __packed stripe_sz_ops;
5422e21a3efSScott Long 
5432e21a3efSScott Long 	uint32_t		pd_ops;
5442e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_ONLINE	0x01
5452e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_OFFLINE	0x02
5462e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_REBUILD	0x04
5472e21a3efSScott Long 
5482e21a3efSScott Long 	uint32_t		pd_mix_support;
5492e21a3efSScott Long #define MFI_INFO_PDMIX_SAS		0x01
5502e21a3efSScott Long #define MFI_INFO_PDMIX_SATA		0x02
5512e21a3efSScott Long #define MFI_INFO_PDMIX_ENCL		0x04
5522e21a3efSScott Long #define MFI_INFO_PDMIX_LD		0x08
5532e21a3efSScott Long #define MFI_INFO_PDMIX_SATA_CLUSTER	0x10
5542e21a3efSScott Long 
5552e21a3efSScott Long 	uint8_t			ecc_bucket_count;
5562e21a3efSScott Long 	uint8_t			reserved2[11];
5572e21a3efSScott Long 	struct mfi_ctrl_props	properties;
5582e21a3efSScott Long 	char			package_version[0x60];
5592e21a3efSScott Long 	uint8_t			pad[0x800 - 0x6a0];
5602e21a3efSScott Long } __packed;
5612e21a3efSScott Long 
562741367d5SDoug Ambrisko /* keep track of an event. */
563741367d5SDoug Ambrisko union mfi_evt {
564741367d5SDoug Ambrisko 	struct {
565741367d5SDoug Ambrisko 		uint16_t	locale;
566741367d5SDoug Ambrisko 		uint8_t		reserved;
567741367d5SDoug Ambrisko 		uint8_t		class;
568741367d5SDoug Ambrisko 	} members;
569741367d5SDoug Ambrisko 	uint32_t		word;
570741367d5SDoug Ambrisko } __packed;
571741367d5SDoug Ambrisko 
572741367d5SDoug Ambrisko /* event log state. */
573741367d5SDoug Ambrisko struct mfi_evt_log_state {
574741367d5SDoug Ambrisko 	uint32_t		newest_seq_num;
575741367d5SDoug Ambrisko 	uint32_t		oldest_seq_num;
576741367d5SDoug Ambrisko 	uint32_t		clear_seq_num;
577741367d5SDoug Ambrisko 	uint32_t		shutdown_seq_num;
578741367d5SDoug Ambrisko 	uint32_t		boot_seq_num;
579741367d5SDoug Ambrisko } __packed;
580741367d5SDoug Ambrisko 
581741367d5SDoug Ambrisko struct mfi_progress {
582741367d5SDoug Ambrisko 	uint16_t		progress;
583741367d5SDoug Ambrisko 	uint16_t		elapsed_seconds;
584741367d5SDoug Ambrisko } __packed;
585741367d5SDoug Ambrisko 
586741367d5SDoug Ambrisko struct mfi_evt_ld {
587741367d5SDoug Ambrisko 	uint16_t		target_id;
588741367d5SDoug Ambrisko 	uint8_t			ld_index;
589741367d5SDoug Ambrisko 	uint8_t			reserved;
590741367d5SDoug Ambrisko } __packed;
591741367d5SDoug Ambrisko 
592741367d5SDoug Ambrisko struct mfi_evt_pd {
593741367d5SDoug Ambrisko 	uint16_t		device_id;
594741367d5SDoug Ambrisko 	uint8_t			enclosure_index;
595741367d5SDoug Ambrisko 	uint8_t			slot_number;
596741367d5SDoug Ambrisko } __packed;
597741367d5SDoug Ambrisko 
598741367d5SDoug Ambrisko /* SAS (?) event detail, returned from MFI_DCMD_CTRL_EVENT_WAIT. */
599741367d5SDoug Ambrisko struct mfi_evt_detail {
600741367d5SDoug Ambrisko 	uint32_t		seq;
601741367d5SDoug Ambrisko 	uint32_t		time;
602741367d5SDoug Ambrisko 	uint32_t		code;
603741367d5SDoug Ambrisko 	union mfi_evt		class;
604741367d5SDoug Ambrisko 	uint8_t			arg_type;
605741367d5SDoug Ambrisko 	uint8_t			reserved1[15];
606741367d5SDoug Ambrisko 
607741367d5SDoug Ambrisko 	union {
608741367d5SDoug Ambrisko 		struct {
609741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
610741367d5SDoug Ambrisko 			uint8_t			cdb_len;
611741367d5SDoug Ambrisko 			uint8_t			sense_len;
612741367d5SDoug Ambrisko 			uint8_t			reserved[2];
613741367d5SDoug Ambrisko 			uint8_t			cdb[16];
614741367d5SDoug Ambrisko 			uint8_t			sense[64];
615741367d5SDoug Ambrisko 		} cdb_sense;
616741367d5SDoug Ambrisko 
617741367d5SDoug Ambrisko 		struct mfi_evt_ld		ld;
618741367d5SDoug Ambrisko 
619741367d5SDoug Ambrisko 		struct {
620741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
621741367d5SDoug Ambrisko 			uint64_t		count;
622741367d5SDoug Ambrisko 		} ld_count;
623741367d5SDoug Ambrisko 
624741367d5SDoug Ambrisko 		struct {
625741367d5SDoug Ambrisko 			uint64_t		lba;
626741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
627741367d5SDoug Ambrisko 		} ld_lba;
628741367d5SDoug Ambrisko 
629741367d5SDoug Ambrisko 		struct {
630741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
631741367d5SDoug Ambrisko 			uint32_t		pre_owner;
632741367d5SDoug Ambrisko 			uint32_t		new_owner;
633741367d5SDoug Ambrisko 		} ld_owner;
634741367d5SDoug Ambrisko 
635741367d5SDoug Ambrisko 		struct {
636741367d5SDoug Ambrisko 			uint64_t		ld_lba;
637741367d5SDoug Ambrisko 			uint64_t		pd_lba;
638741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
639741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
640741367d5SDoug Ambrisko 		} ld_lba_pd_lba;
641741367d5SDoug Ambrisko 
642741367d5SDoug Ambrisko 		struct {
643741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
644741367d5SDoug Ambrisko 			struct mfi_progress	prog;
645741367d5SDoug Ambrisko 		} ld_prog;
646741367d5SDoug Ambrisko 
647741367d5SDoug Ambrisko 		struct {
648741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
649741367d5SDoug Ambrisko 			uint32_t		prev_state;
650741367d5SDoug Ambrisko 			uint32_t		new_state;
651741367d5SDoug Ambrisko 		} ld_state;
652741367d5SDoug Ambrisko 
653741367d5SDoug Ambrisko 		struct {
654741367d5SDoug Ambrisko 			uint64_t		strip;
655741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
656741367d5SDoug Ambrisko 		} ld_strip;
657741367d5SDoug Ambrisko 
658741367d5SDoug Ambrisko 		struct mfi_evt_pd		pd;
659741367d5SDoug Ambrisko 
660741367d5SDoug Ambrisko 		struct {
661741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
662741367d5SDoug Ambrisko 			uint32_t		err;
663741367d5SDoug Ambrisko 		} pd_err;
664741367d5SDoug Ambrisko 
665741367d5SDoug Ambrisko 		struct {
666741367d5SDoug Ambrisko 			uint64_t		lba;
667741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
668741367d5SDoug Ambrisko 		} pd_lba;
669741367d5SDoug Ambrisko 
670741367d5SDoug Ambrisko 		struct {
671741367d5SDoug Ambrisko 			uint64_t		lba;
672741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
673741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
674741367d5SDoug Ambrisko 		} pd_lba_ld;
675741367d5SDoug Ambrisko 
676741367d5SDoug Ambrisko 		struct {
677741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
678741367d5SDoug Ambrisko 			struct mfi_progress	prog;
679741367d5SDoug Ambrisko 		} pd_prog;
680741367d5SDoug Ambrisko 
681741367d5SDoug Ambrisko 		struct {
682741367d5SDoug Ambrisko 			struct mfi_evt_pd	ld;
683741367d5SDoug Ambrisko 			uint32_t		prev_state;
684741367d5SDoug Ambrisko 			uint32_t		new_state;
685741367d5SDoug Ambrisko 		} pd_state;
686741367d5SDoug Ambrisko 
687741367d5SDoug Ambrisko 		struct {
688741367d5SDoug Ambrisko 			uint16_t		venderId;
689741367d5SDoug Ambrisko 			uint16_t		deviceId;
690741367d5SDoug Ambrisko 			uint16_t		subVenderId;
691741367d5SDoug Ambrisko 			uint16_t		subDeviceId;
692741367d5SDoug Ambrisko 		} pci;
693741367d5SDoug Ambrisko 
694741367d5SDoug Ambrisko 		uint32_t			rate;
695741367d5SDoug Ambrisko 
696741367d5SDoug Ambrisko 		char				str[96];
697741367d5SDoug Ambrisko 
698741367d5SDoug Ambrisko 		struct {
699741367d5SDoug Ambrisko 			uint32_t		rtc;
700741367d5SDoug Ambrisko 			uint16_t		elapsedSeconds;
701741367d5SDoug Ambrisko 		} time;
702741367d5SDoug Ambrisko 
703741367d5SDoug Ambrisko 		struct {
704741367d5SDoug Ambrisko 			uint32_t		ecar;
705741367d5SDoug Ambrisko 			uint32_t		elog;
706741367d5SDoug Ambrisko 			char			str[64];
707741367d5SDoug Ambrisko 		} ecc;
708741367d5SDoug Ambrisko 
709741367d5SDoug Ambrisko 		uint8_t		b[96];
710741367d5SDoug Ambrisko 		uint16_t	s[48];
711741367d5SDoug Ambrisko 		uint32_t	w[24];
712741367d5SDoug Ambrisko 		uint64_t	d[12];
713741367d5SDoug Ambrisko 	} args;
714741367d5SDoug Ambrisko 
715741367d5SDoug Ambrisko 	char description[128];
716741367d5SDoug Ambrisko } __packed;
717741367d5SDoug Ambrisko 
718741367d5SDoug Ambrisko /* SAS log detail guessed at */
719741367d5SDoug Ambrisko struct mfi_log_detail {
720741367d5SDoug Ambrisko 	uint32_t		something1;
721741367d5SDoug Ambrisko 	uint32_t		something2;
722741367d5SDoug Ambrisko 	uint32_t		seq;
723741367d5SDoug Ambrisko 	uint32_t		something3;
724741367d5SDoug Ambrisko 	uint32_t		arg_type;
725741367d5SDoug Ambrisko 	uint8_t			reserved1[15];
726741367d5SDoug Ambrisko 
727741367d5SDoug Ambrisko 	union {
728741367d5SDoug Ambrisko 		uint8_t		b[96];
729741367d5SDoug Ambrisko 	} args;
730741367d5SDoug Ambrisko 	char description[128];
731741367d5SDoug Ambrisko } __packed;
732741367d5SDoug Ambrisko 
733c0b332d1SPaul Saab struct mfi_ldref {
734c0b332d1SPaul Saab 	uint8_t		target_id;
735c0b332d1SPaul Saab 	uint8_t		reserved;
736c0b332d1SPaul Saab 	uint16_t	seq;
737c0b332d1SPaul Saab } __packed;
738c0b332d1SPaul Saab 
739c0b332d1SPaul Saab struct mfi_ld_list {
740c0b332d1SPaul Saab 	uint32_t		ld_count;
741c0b332d1SPaul Saab 	uint32_t		reserved1;
742c0b332d1SPaul Saab 	struct {
743c0b332d1SPaul Saab 		struct mfi_ldref	ld;
744c0b332d1SPaul Saab 		uint8_t		state;
745c0b332d1SPaul Saab 		uint8_t		reserved2[3];
746c0b332d1SPaul Saab 		uint64_t	size;
747c0b332d1SPaul Saab 	} ld_list[MFI_MAX_LD];
748c0b332d1SPaul Saab } __packed;
749c0b332d1SPaul Saab 
750c0b332d1SPaul Saab enum mfi_ld_access {
751c0b332d1SPaul Saab 	MFI_LD_ACCESS_RW =	0,
752c0b332d1SPaul Saab 	MFI_LD_ACCSSS_RO = 	2,
753c0b332d1SPaul Saab 	MFI_LD_ACCESS_BLOCKED =	3,
754c0b332d1SPaul Saab };
755c0b332d1SPaul Saab #define MFI_LD_ACCESS_MASK	3
756c0b332d1SPaul Saab 
757c0b332d1SPaul Saab enum mfi_ld_state {
758c0b332d1SPaul Saab 	MFI_LD_STATE_OFFLINE =			0,
759c0b332d1SPaul Saab 	MFI_LD_STATE_PARTIALLY_DEGRADED =	1,
760c0b332d1SPaul Saab 	MFI_LD_STATE_DEGRADED =			2,
761c0b332d1SPaul Saab 	MFI_LD_STATE_OPTIMAL =			3
762c0b332d1SPaul Saab };
763c0b332d1SPaul Saab 
764c0b332d1SPaul Saab struct mfi_ld_props {
765c0b332d1SPaul Saab 	struct mfi_ldref	ld;
766c0b332d1SPaul Saab 	char			name[16];
767c0b332d1SPaul Saab 	uint8_t			default_cache_policy;
768c0b332d1SPaul Saab 	uint8_t			access_policy;
769c0b332d1SPaul Saab 	uint8_t			disk_cache_policy;
770c0b332d1SPaul Saab 	uint8_t			current_cache_policy;
771c0b332d1SPaul Saab 	uint8_t			no_bgi;
772c0b332d1SPaul Saab 	uint8_t			reserved[7];
773c0b332d1SPaul Saab } __packed;
774c0b332d1SPaul Saab 
775c0b332d1SPaul Saab struct mfi_ld_params {
776c0b332d1SPaul Saab 	uint8_t			primary_raid_level;
777c0b332d1SPaul Saab 	uint8_t			raid_level_qualifier;
778c0b332d1SPaul Saab 	uint8_t			secondary_raid_level;
779c0b332d1SPaul Saab 	uint8_t			stripe_size;
780c0b332d1SPaul Saab 	uint8_t			num_drives;
781c0b332d1SPaul Saab 	uint8_t			span_depth;
782c0b332d1SPaul Saab 	uint8_t			state;
783c0b332d1SPaul Saab 	uint8_t			init_state;
784c0b332d1SPaul Saab 	uint8_t			is_consistent;
785c0b332d1SPaul Saab 	uint8_t			reserved[23];
786c0b332d1SPaul Saab } __packed;
787c0b332d1SPaul Saab 
788c0b332d1SPaul Saab struct mfi_ld_progress {
789c0b332d1SPaul Saab 	uint32_t		active;
790c0b332d1SPaul Saab #define	MFI_LD_PROGRESS_CC	(1<<0)
791c0b332d1SPaul Saab #define	MFI_LD_PROGRESS_BGI	(1<<1)
792c0b332d1SPaul Saab #define	MFI_LD_PROGRESS_FGI	(1<<2)
793c0b332d1SPaul Saab #define	MFI_LD_PORGRESS_RECON	(1<<3)
794c0b332d1SPaul Saab 	struct mfi_progress	cc;
795c0b332d1SPaul Saab 	struct mfi_progress	bgi;
796c0b332d1SPaul Saab 	struct mfi_progress	fgi;
797c0b332d1SPaul Saab 	struct mfi_progress	recon;
798c0b332d1SPaul Saab 	struct mfi_progress	reserved[4];
799c0b332d1SPaul Saab } __packed;
800c0b332d1SPaul Saab 
801c0b332d1SPaul Saab struct mfi_span {
802c0b332d1SPaul Saab 	uint64_t		start_block;
803c0b332d1SPaul Saab 	uint64_t		num_blocks;
804c0b332d1SPaul Saab 	uint16_t		array_ref;
805c0b332d1SPaul Saab 	uint8_t			reserved[6];
806c0b332d1SPaul Saab } __packed;
807c0b332d1SPaul Saab 
808c0b332d1SPaul Saab #define	MFI_MAX_SPAN_DEPTH	8
809c0b332d1SPaul Saab struct mfi_ld_config {
810c0b332d1SPaul Saab 	struct mfi_ld_props	properties;
811c0b332d1SPaul Saab 	struct mfi_ld_params	params;
812c0b332d1SPaul Saab 	struct mfi_span		span[MFI_MAX_SPAN_DEPTH];
813c0b332d1SPaul Saab } __packed;
814c0b332d1SPaul Saab 
815c0b332d1SPaul Saab struct mfi_ld_info {
816c0b332d1SPaul Saab 	struct mfi_ld_config	ld_config;
817c0b332d1SPaul Saab 	uint64_t		size;
818c0b332d1SPaul Saab 	struct mfi_ld_progress	progress;
819c0b332d1SPaul Saab 	uint16_t		cluster_owner;
820c0b332d1SPaul Saab 	uint8_t			reconstruct_active;
821c0b332d1SPaul Saab 	uint8_t			reserved1[1];
822c0b332d1SPaul Saab 	uint8_t			vpd_page83[64];
823c0b332d1SPaul Saab 	uint8_t			reserved2[16];
824c0b332d1SPaul Saab } __packed;
825c0b332d1SPaul Saab 
8262e21a3efSScott Long #endif /* _MFIREG_H */
827