xref: /freebsd/sys/dev/mfi/mfireg.h (revision eebd9d53665e1b691ffada910b940b37b6f62cc4)
12e21a3efSScott Long /*-
2*eebd9d53SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni  *
42e21a3efSScott Long  * Copyright (c) 2006 IronPort Systems
52e21a3efSScott Long  * All rights reserved.
62e21a3efSScott Long  *
72e21a3efSScott Long  * Redistribution and use in source and binary forms, with or without
82e21a3efSScott Long  * modification, are permitted provided that the following conditions
92e21a3efSScott Long  * are met:
102e21a3efSScott Long  * 1. Redistributions of source code must retain the above copyright
112e21a3efSScott Long  *    notice, this list of conditions and the following disclaimer.
122e21a3efSScott Long  * 2. Redistributions in binary form must reproduce the above copyright
132e21a3efSScott Long  *    notice, this list of conditions and the following disclaimer in the
142e21a3efSScott Long  *    documentation and/or other materials provided with the distribution.
152e21a3efSScott Long  *
162e21a3efSScott Long  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
172e21a3efSScott Long  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
182e21a3efSScott Long  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
192e21a3efSScott Long  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
202e21a3efSScott Long  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
212e21a3efSScott Long  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
222e21a3efSScott Long  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
232e21a3efSScott Long  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
242e21a3efSScott Long  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
252e21a3efSScott Long  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
262e21a3efSScott Long  * SUCH DAMAGE.
272e21a3efSScott Long  */
28610f2ef3SScott Long /*-
29610f2ef3SScott Long  * Copyright (c) 2007 LSI Corp.
30610f2ef3SScott Long  * Copyright (c) 2007 Rajesh Prabhakaran.
31610f2ef3SScott Long  * All rights reserved.
32610f2ef3SScott Long  *
33610f2ef3SScott Long  * Redistribution and use in source and binary forms, with or without
34610f2ef3SScott Long  * modification, are permitted provided that the following conditions
35610f2ef3SScott Long  * are met:
36610f2ef3SScott Long  * 1. Redistributions of source code must retain the above copyright
37610f2ef3SScott Long  *    notice, this list of conditions and the following disclaimer.
38610f2ef3SScott Long  * 2. Redistributions in binary form must reproduce the above copyright
39610f2ef3SScott Long  *    notice, this list of conditions and the following disclaimer in the
40610f2ef3SScott Long  *    documentation and/or other materials provided with the distribution.
41610f2ef3SScott Long  *
42610f2ef3SScott Long  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
43610f2ef3SScott Long  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44610f2ef3SScott Long  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45610f2ef3SScott Long  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
46610f2ef3SScott Long  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47610f2ef3SScott Long  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48610f2ef3SScott Long  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49610f2ef3SScott Long  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50610f2ef3SScott Long  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51610f2ef3SScott Long  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52610f2ef3SScott Long  * SUCH DAMAGE.
53610f2ef3SScott Long  */
542e21a3efSScott Long 
552e21a3efSScott Long #ifndef _MFIREG_H
562e21a3efSScott Long #define _MFIREG_H
572e21a3efSScott Long 
582e21a3efSScott Long #include <sys/cdefs.h>
592e21a3efSScott Long __FBSDID("$FreeBSD$");
602e21a3efSScott Long 
612e21a3efSScott Long /*
622e21a3efSScott Long  * MegaRAID SAS MFI firmware definitions
632e21a3efSScott Long  *
642e21a3efSScott Long  * Calling this driver 'MegaRAID SAS' is a bit misleading.  It's a completely
652e21a3efSScott Long  * new firmware interface from the old AMI MegaRAID one, and there is no
662e21a3efSScott Long  * reason why this interface should be limited to just SAS.  In any case, LSI
672e21a3efSScott Long  * seems to also call this interface 'MFI', so that will be used here.
682e21a3efSScott Long  */
690d9a4ef3SDoug Ambrisko #define MEGAMFI_FRAME_SIZE              64
702e21a3efSScott Long /*
712e21a3efSScott Long  * Start with the register set.  All registers are 32 bits wide.
722e21a3efSScott Long  * The usual Intel IOP style setup.
732e21a3efSScott Long  */
742e21a3efSScott Long #define MFI_IMSG0	0x10	/* Inbound message 0 */
752e21a3efSScott Long #define MFI_IMSG1	0x14	/* Inbound message 1 */
762e21a3efSScott Long #define MFI_OMSG0	0x18	/* Outbound message 0 */
772e21a3efSScott Long #define MFI_OMSG1	0x1c	/* Outbound message 1 */
782e21a3efSScott Long #define MFI_IDB		0x20	/* Inbound doorbell */
792e21a3efSScott Long #define MFI_ISTS	0x24	/* Inbound interrupt status */
802e21a3efSScott Long #define MFI_IMSK	0x28	/* Inbound interrupt mask */
812e21a3efSScott Long #define MFI_ODB		0x2c	/* Outbound doorbell */
822e21a3efSScott Long #define MFI_OSTS	0x30	/* Outbound interrupt status */
832e21a3efSScott Long #define MFI_OMSK	0x34	/* Outbound interrupt mask */
842e21a3efSScott Long #define MFI_IQP		0x40	/* Inbound queue port */
852e21a3efSScott Long #define MFI_OQP		0x44	/* Outbound queue port */
862e21a3efSScott Long 
87610f2ef3SScott Long /*
880d9a4ef3SDoug Ambrisko *  ThunderBolt specific Register
890d9a4ef3SDoug Ambrisko */
900d9a4ef3SDoug Ambrisko 
9108c89430SSteven Hartland #define MFI_RFPI	0x48 		/* reply_free_post_host_index */
920d9a4ef3SDoug Ambrisko #define MFI_RPI		0x6c 		/* reply_post_host_index */
930d9a4ef3SDoug Ambrisko #define MFI_ILQP 	0xc0		/* inbound_low_queue_port */
940d9a4ef3SDoug Ambrisko #define MFI_IHQP 	0xc4		/* inbound_high_queue_port */
950d9a4ef3SDoug Ambrisko 
960d9a4ef3SDoug Ambrisko /*
97610f2ef3SScott Long  * 1078 specific related register
98610f2ef3SScott Long  */
99610f2ef3SScott Long #define MFI_ODR0	0x9c 		/* outbound doorbell register0 */
100610f2ef3SScott Long #define MFI_ODCR0	0xa0 		/* outbound doorbell clear register0  */
101610f2ef3SScott Long #define MFI_OSP0	0xb0 		/* outbound scratch pad0  */
10298b610b5SGordon Bergling #define MFI_1078_EIM	0x80000004 	/* 1078 enable interrupt mask  */
103610f2ef3SScott Long #define MFI_RMI		0x2 		/* reply message interrupt  */
104610f2ef3SScott Long #define MFI_1078_RM	0x80000000 	/* reply 1078 message interrupt  */
105610f2ef3SScott Long #define MFI_ODC		0x4 		/* outbound doorbell change interrupt */
106610f2ef3SScott Long 
1070d9a4ef3SDoug Ambrisko /* OCR registers */
1080d9a4ef3SDoug Ambrisko #define MFI_WSR		0x004		/* write sequence register */
1090d9a4ef3SDoug Ambrisko #define MFI_HDR		0x008		/* host diagnostic register */
1100d9a4ef3SDoug Ambrisko #define MFI_RSR		0x3c3		/* Reset Status Register */
1110d9a4ef3SDoug Ambrisko 
112fa1e6ef4SDoug Ambrisko /*
113fa1e6ef4SDoug Ambrisko  * GEN2 specific changes
114fa1e6ef4SDoug Ambrisko  */
115fa1e6ef4SDoug Ambrisko #define MFI_GEN2_EIM	0x00000005	/* GEN2 enable interrupt mask */
116fa1e6ef4SDoug Ambrisko #define MFI_GEN2_RM	0x00000001	/* reply GEN2 message interrupt */
117fa1e6ef4SDoug Ambrisko 
1180d9a4ef3SDoug Ambrisko /*
1190d9a4ef3SDoug Ambrisko  * skinny specific changes
1200d9a4ef3SDoug Ambrisko  */
1210d9a4ef3SDoug Ambrisko #define MFI_SKINNY_IDB	0x00	/* Inbound doorbell is at 0x00 for skinny */
1220d9a4ef3SDoug Ambrisko #define MFI_IQPL	0x000000c0
1230d9a4ef3SDoug Ambrisko #define MFI_IQPH	0x000000c4
1240d9a4ef3SDoug Ambrisko #define MFI_SKINNY_RM	0x00000001	/* reply skinny message interrupt */
1250d9a4ef3SDoug Ambrisko 
1262e21a3efSScott Long /* Bits for MFI_OSTS */
1272e21a3efSScott Long #define MFI_OSTS_INTR_VALID	0x00000002
1282e21a3efSScott Long 
1290d9a4ef3SDoug Ambrisko /* OCR specific flags */
1300d9a4ef3SDoug Ambrisko #define MFI_FIRMWARE_STATE_CHANGE	0x00000002
1310d9a4ef3SDoug Ambrisko #define MFI_STATE_CHANGE_INTERRUPT	0x00000004  /* MFI state change interrrupt */
1320d9a4ef3SDoug Ambrisko 
1332e21a3efSScott Long /*
1342e21a3efSScott Long  * Firmware state values.  Found in OMSG0 during initialization.
1352e21a3efSScott Long  */
1362e21a3efSScott Long #define MFI_FWSTATE_MASK		0xf0000000
1372e21a3efSScott Long #define MFI_FWSTATE_UNDEFINED		0x00000000
1382e21a3efSScott Long #define MFI_FWSTATE_BB_INIT		0x10000000
1392e21a3efSScott Long #define MFI_FWSTATE_FW_INIT		0x40000000
1402e21a3efSScott Long #define MFI_FWSTATE_WAIT_HANDSHAKE	0x60000000
1412e21a3efSScott Long #define MFI_FWSTATE_FW_INIT_2		0x70000000
1422e21a3efSScott Long #define MFI_FWSTATE_DEVICE_SCAN		0x80000000
1435dbee633SJohn Baldwin #define MFI_FWSTATE_BOOT_MESSAGE_PENDING	0x90000000
1442e21a3efSScott Long #define MFI_FWSTATE_FLUSH_CACHE		0xa0000000
1452e21a3efSScott Long #define MFI_FWSTATE_READY		0xb0000000
1462e21a3efSScott Long #define MFI_FWSTATE_OPERATIONAL		0xc0000000
1472e21a3efSScott Long #define MFI_FWSTATE_FAULT		0xf0000000
1482e21a3efSScott Long #define MFI_FWSTATE_MAXSGL_MASK		0x00ff0000
1492e21a3efSScott Long #define MFI_FWSTATE_MAXCMD_MASK		0x0000ffff
1500d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_HOSTMEMREQD_MASK	0x08000000
1510d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_BOOT_MESSAGE_PENDING	0x90000000
1520d9a4ef3SDoug Ambrisko #define MFI_RESET_REQUIRED		0x00000001
1532e21a3efSScott Long 
154a6ba0fd6SDoug Ambrisko /* ThunderBolt Support */
1550d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_TB_MASK		0xf0000000
1560d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_TB_RESET		0x00000000
1570d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_TB_READY		0x10000000
1580d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_TB_OPERATIONAL	0x20000000
1590d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_TB_FAULT		0x40000000
1602e21a3efSScott Long 
1612e21a3efSScott Long /*
1622e21a3efSScott Long  * Control bits to drive the card to ready state.  These go into the IDB
1632e21a3efSScott Long  * register.
1642e21a3efSScott Long  */
1652e21a3efSScott Long #define MFI_FWINIT_ABORT	0x00000000 /* Abort all pending commands */
1662e21a3efSScott Long #define MFI_FWINIT_READY	0x00000002 /* Move from operational to ready */
1672e21a3efSScott Long #define MFI_FWINIT_MFIMODE	0x00000004 /* unknown */
1682e21a3efSScott Long #define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */
1695dbee633SJohn Baldwin #define MFI_FWINIT_HOTPLUG	0x00000010
1702e21a3efSScott Long 
1710d9a4ef3SDoug Ambrisko /* ADP reset flags */
1720d9a4ef3SDoug Ambrisko #define MFI_STOP_ADP		0x00000020
1730d9a4ef3SDoug Ambrisko #define MFI_ADP_RESET		0x00000040
1740d9a4ef3SDoug Ambrisko #define DIAG_WRITE_ENABLE	0x00000080
1750d9a4ef3SDoug Ambrisko #define DIAG_RESET_ADAPTER	0x00000004
1760d9a4ef3SDoug Ambrisko 
1772e21a3efSScott Long /* MFI Commands */
1782e21a3efSScott Long typedef enum {
1792e21a3efSScott Long 	MFI_CMD_INIT =		0x00,
1802e21a3efSScott Long 	MFI_CMD_LD_READ,
1812e21a3efSScott Long 	MFI_CMD_LD_WRITE,
1822e21a3efSScott Long 	MFI_CMD_LD_SCSI_IO,
1832e21a3efSScott Long 	MFI_CMD_PD_SCSI_IO,
1842e21a3efSScott Long 	MFI_CMD_DCMD,
1852e21a3efSScott Long 	MFI_CMD_ABORT,
1862e21a3efSScott Long 	MFI_CMD_SMP,
1872e21a3efSScott Long 	MFI_CMD_STP
1882e21a3efSScott Long } mfi_cmd_t;
1892e21a3efSScott Long 
1902e21a3efSScott Long /* Direct commands */
1912e21a3efSScott Long typedef enum {
1922e21a3efSScott Long 	MFI_DCMD_CTRL_GETINFO =		0x01010000,
1930d9a4ef3SDoug Ambrisko 	MFI_DCMD_CTRL_MFI_HOST_MEM_ALLOC =0x0100e100,
194441f6d5dSScott Long 	MFI_DCMD_CTRL_MFC_DEFAULTS_GET =0x010e0201,
195441f6d5dSScott Long 	MFI_DCMD_CTRL_MFC_DEFAULTS_SET =0x010e0202,
1962e21a3efSScott Long 	MFI_DCMD_CTRL_FLUSHCACHE =	0x01101000,
197c22a9c36SSean Bruno 	MFI_DCMD_CTRL_GET_PROPS =       0x01020100,
198c22a9c36SSean Bruno 	MFI_DCMD_CTRL_SET_PROPS =       0x01020200,
1992e21a3efSScott Long 	MFI_DCMD_CTRL_SHUTDOWN =	0x01050000,
2002e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_GETINFO =	0x01040100,
2012e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_GET =	0x01040300,
2022e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_WAIT =	0x01040500,
203763fae79SScott Long 	MFI_DCMD_PR_GET_STATUS =	0x01070100,
204763fae79SScott Long 	MFI_DCMD_PR_GET_PROPERTIES =	0x01070200,
205763fae79SScott Long 	MFI_DCMD_PR_SET_PROPERTIES =	0x01070300,
206763fae79SScott Long 	MFI_DCMD_PR_START =		0x01070400,
207763fae79SScott Long 	MFI_DCMD_PR_STOP =		0x01070500,
208763fae79SScott Long 	MFI_DCMD_TIME_SECS_GET =	0x01080201,
209763fae79SScott Long 	MFI_DCMD_FLASH_FW_OPEN =	0x010f0100,
210763fae79SScott Long 	MFI_DCMD_FLASH_FW_DOWNLOAD =	0x010f0200,
211763fae79SScott Long 	MFI_DCMD_FLASH_FW_FLASH =	0x010f0300,
212763fae79SScott Long 	MFI_DCMD_FLASH_FW_CLOSE =	0x010f0400,
213763fae79SScott Long 	MFI_DCMD_PD_GET_LIST =		0x02010000,
2140d9a4ef3SDoug Ambrisko 	MFI_DCMD_PD_LIST_QUERY =	0x02010100,
215763fae79SScott Long 	MFI_DCMD_PD_GET_INFO = 		0x02020000,
216763fae79SScott Long 	MFI_DCMD_PD_STATE_SET =		0x02030100,
217763fae79SScott Long 	MFI_DCMD_PD_REBUILD_START =	0x02040100,
218763fae79SScott Long 	MFI_DCMD_PD_REBUILD_ABORT =	0x02040200,
219763fae79SScott Long 	MFI_DCMD_PD_CLEAR_START =	0x02050100,
220763fae79SScott Long 	MFI_DCMD_PD_CLEAR_ABORT =	0x02050200,
221763fae79SScott Long 	MFI_DCMD_PD_GET_PROGRESS =	0x02060000,
222763fae79SScott Long 	MFI_DCMD_PD_LOCATE_START =	0x02070100,
223763fae79SScott Long 	MFI_DCMD_PD_LOCATE_STOP =	0x02070200,
2240d9a4ef3SDoug Ambrisko 	MFI_DCMD_LD_MAP_GET_INFO =	0x0300e101,
2250d9a4ef3SDoug Ambrisko 	MFI_DCMD_LD_SYNC =		0x0300e102,
226c0b332d1SPaul Saab 	MFI_DCMD_LD_GET_LIST =		0x03010000,
227c0b332d1SPaul Saab 	MFI_DCMD_LD_GET_INFO =		0x03020000,
2282e21a3efSScott Long 	MFI_DCMD_LD_GET_PROP =		0x03030000,
229c0b332d1SPaul Saab 	MFI_DCMD_LD_SET_PROP =		0x03040000,
230763fae79SScott Long 	MFI_DCMD_LD_INIT_START =	0x03060100,
2318ec5c98bSJohn Baldwin 	MFI_DCMD_LD_DELETE =		0x03090000,
232441f6d5dSScott Long 	MFI_DCMD_CFG_READ =		0x04010000,
233441f6d5dSScott Long 	MFI_DCMD_CFG_ADD =		0x04020000,
234441f6d5dSScott Long 	MFI_DCMD_CFG_CLEAR =		0x04030000,
235763fae79SScott Long 	MFI_DCMD_CFG_MAKE_SPARE =	0x04040000,
236763fae79SScott Long 	MFI_DCMD_CFG_REMOVE_SPARE =	0x04050000,
23706f1884fSSean Bruno 	MFI_DCMD_CFG_FOREIGN_SCAN =     0x04060100,
23806f1884fSSean Bruno 	MFI_DCMD_CFG_FOREIGN_DISPLAY =  0x04060200,
23906f1884fSSean Bruno 	MFI_DCMD_CFG_FOREIGN_PREVIEW =  0x04060300,
240fa1e6ef4SDoug Ambrisko 	MFI_DCMD_CFG_FOREIGN_IMPORT =	0x04060400,
24106f1884fSSean Bruno 	MFI_DCMD_CFG_FOREIGN_CLEAR =    0x04060500,
242763fae79SScott Long 	MFI_DCMD_BBU_GET_STATUS =	0x05010000,
243763fae79SScott Long 	MFI_DCMD_BBU_GET_CAPACITY_INFO =0x05020000,
244763fae79SScott Long 	MFI_DCMD_BBU_GET_DESIGN_INFO =	0x05030000,
245dee3e845SMark Johnston 	MFI_DCMD_BBU_START_LEARN =	0x05040000,
246dee3e845SMark Johnston 	MFI_DCMD_BBU_GET_PROP =		0x05050100,
247dee3e845SMark Johnston 	MFI_DCMD_BBU_SET_PROP =		0x05050200,
2482e21a3efSScott Long 	MFI_DCMD_CLUSTER =		0x08000000,
2492e21a3efSScott Long 	MFI_DCMD_CLUSTER_RESET_ALL =	0x08010100,
2502e21a3efSScott Long 	MFI_DCMD_CLUSTER_RESET_LD =	0x08010200
2512e21a3efSScott Long } mfi_dcmd_t;
2522e21a3efSScott Long 
2532e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_FLUSHCACHE */
2542e21a3efSScott Long #define MFI_FLUSHCACHE_CTRL	0x01
2552e21a3efSScott Long #define MFI_FLUSHCACHE_DISK	0x02
2562e21a3efSScott Long 
2572e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_SHUTDOWN */
2582e21a3efSScott Long #define MFI_SHUTDOWN_SPINDOWN	0x01
2592e21a3efSScott Long 
2602e21a3efSScott Long /*
261741367d5SDoug Ambrisko  * MFI Frame flags
2622e21a3efSScott Long  */
2632e21a3efSScott Long #define MFI_FRAME_POST_IN_REPLY_QUEUE		0x0000
2642e21a3efSScott Long #define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE	0x0001
2652e21a3efSScott Long #define MFI_FRAME_SGL32				0x0000
2662e21a3efSScott Long #define MFI_FRAME_SGL64				0x0002
2672e21a3efSScott Long #define MFI_FRAME_SENSE32			0x0000
2682e21a3efSScott Long #define MFI_FRAME_SENSE64			0x0004
2692e21a3efSScott Long #define MFI_FRAME_DIR_NONE			0x0000
2702e21a3efSScott Long #define MFI_FRAME_DIR_WRITE			0x0008
2712e21a3efSScott Long #define MFI_FRAME_DIR_READ			0x0010
2722e21a3efSScott Long #define MFI_FRAME_DIR_BOTH			0x0018
2730d9a4ef3SDoug Ambrisko #define MFI_FRAME_IEEE_SGL			0x0020
27408c89430SSteven Hartland #define MFI_FRAME_FMT "\20" \
27508c89430SSteven Hartland     "\1NOPOST" \
27608c89430SSteven Hartland     "\2SGL64" \
27708c89430SSteven Hartland     "\3SENSE64" \
27808c89430SSteven Hartland     "\4WRITE" \
27908c89430SSteven Hartland     "\5READ" \
28008c89430SSteven Hartland     "\6IEEESGL"
2810d9a4ef3SDoug Ambrisko 
2820d9a4ef3SDoug Ambrisko /* ThunderBolt Specific */
2830d9a4ef3SDoug Ambrisko 
284a6ba0fd6SDoug Ambrisko /*
285a6ba0fd6SDoug Ambrisko  * Pre-TB command size and TB command size.
286a6ba0fd6SDoug Ambrisko  * We will be checking it at the load time for the time being
287a6ba0fd6SDoug Ambrisko  */
288a6ba0fd6SDoug Ambrisko #define MR_COMMAND_SIZE (MFI_FRAME_SIZE*20) /* 1280 bytes */
2890d9a4ef3SDoug Ambrisko 
2900d9a4ef3SDoug Ambrisko #define MEGASAS_THUNDERBOLT_MSG_ALLIGNMENT  256
291a6ba0fd6SDoug Ambrisko /*
292a6ba0fd6SDoug Ambrisko  * We are defining only 128 byte message to reduce memory move over head
293a6ba0fd6SDoug Ambrisko  * and also it will reduce the SRB extension size by 128byte compared with
294a6ba0fd6SDoug Ambrisko  * 256 message size
295a6ba0fd6SDoug Ambrisko  */
2960d9a4ef3SDoug Ambrisko #define MEGASAS_THUNDERBOLT_NEW_MSG_SIZE	256
2970d9a4ef3SDoug Ambrisko #define MEGASAS_THUNDERBOLT_MAX_COMMANDS	1024
2980d9a4ef3SDoug Ambrisko #define MEGASAS_THUNDERBOLT_MAX_REPLY_COUNT	1024
2990d9a4ef3SDoug Ambrisko #define MEGASAS_THUNDERBOLT_REPLY_SIZE		8
3000d9a4ef3SDoug Ambrisko #define MEGASAS_THUNDERBOLT_MAX_CHAIN_COUNT	1
3010d9a4ef3SDoug Ambrisko #define MEGASAS_MAX_SZ_CHAIN_FRAME		1024
3020d9a4ef3SDoug Ambrisko 
3030d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_PASSTHRU_IO_REQUEST       0xF0
3040d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_LD_IO_REQUEST             0xF1
3050d9a4ef3SDoug Ambrisko 
3060d9a4ef3SDoug Ambrisko #define MR_INTERNAL_MFI_FRAMES_SMID             1
3070d9a4ef3SDoug Ambrisko #define MR_CTRL_EVENT_WAIT_SMID                 2
3080d9a4ef3SDoug Ambrisko #define MR_INTERNAL_DRIVER_RESET_SMID           3
3090d9a4ef3SDoug Ambrisko 
3102e21a3efSScott Long /* MFI Status codes */
3112e21a3efSScott Long typedef enum {
3122e21a3efSScott Long 	MFI_STAT_OK =			0x00,
3132e21a3efSScott Long 	MFI_STAT_INVALID_CMD,
3142e21a3efSScott Long 	MFI_STAT_INVALID_DCMD,
3152e21a3efSScott Long 	MFI_STAT_INVALID_PARAMETER,
3162e21a3efSScott Long 	MFI_STAT_INVALID_SEQUENCE_NUMBER,
3172e21a3efSScott Long 	MFI_STAT_ABORT_NOT_POSSIBLE,
3182e21a3efSScott Long 	MFI_STAT_APP_HOST_CODE_NOT_FOUND,
3192e21a3efSScott Long 	MFI_STAT_APP_IN_USE,
3202e21a3efSScott Long 	MFI_STAT_APP_NOT_INITIALIZED,
3212e21a3efSScott Long 	MFI_STAT_ARRAY_INDEX_INVALID,
3222e21a3efSScott Long 	MFI_STAT_ARRAY_ROW_NOT_EMPTY,
3232e21a3efSScott Long 	MFI_STAT_CONFIG_RESOURCE_CONFLICT,
3242e21a3efSScott Long 	MFI_STAT_DEVICE_NOT_FOUND,
3252e21a3efSScott Long 	MFI_STAT_DRIVE_TOO_SMALL,
3262e21a3efSScott Long 	MFI_STAT_FLASH_ALLOC_FAIL,
3272e21a3efSScott Long 	MFI_STAT_FLASH_BUSY,
3282e21a3efSScott Long 	MFI_STAT_FLASH_ERROR =		0x10,
3292e21a3efSScott Long 	MFI_STAT_FLASH_IMAGE_BAD,
3302e21a3efSScott Long 	MFI_STAT_FLASH_IMAGE_INCOMPLETE,
3312e21a3efSScott Long 	MFI_STAT_FLASH_NOT_OPEN,
3322e21a3efSScott Long 	MFI_STAT_FLASH_NOT_STARTED,
3332e21a3efSScott Long 	MFI_STAT_FLUSH_FAILED,
3342e21a3efSScott Long 	MFI_STAT_HOST_CODE_NOT_FOUNT,
3352e21a3efSScott Long 	MFI_STAT_LD_CC_IN_PROGRESS,
3362e21a3efSScott Long 	MFI_STAT_LD_INIT_IN_PROGRESS,
3372e21a3efSScott Long 	MFI_STAT_LD_LBA_OUT_OF_RANGE,
3382e21a3efSScott Long 	MFI_STAT_LD_MAX_CONFIGURED,
3392e21a3efSScott Long 	MFI_STAT_LD_NOT_OPTIMAL,
3402e21a3efSScott Long 	MFI_STAT_LD_RBLD_IN_PROGRESS,
3412e21a3efSScott Long 	MFI_STAT_LD_RECON_IN_PROGRESS,
3422e21a3efSScott Long 	MFI_STAT_LD_WRONG_RAID_LEVEL,
3432e21a3efSScott Long 	MFI_STAT_MAX_SPARES_EXCEEDED,
3442e21a3efSScott Long 	MFI_STAT_MEMORY_NOT_AVAILABLE =	0x20,
3452e21a3efSScott Long 	MFI_STAT_MFC_HW_ERROR,
3462e21a3efSScott Long 	MFI_STAT_NO_HW_PRESENT,
3472e21a3efSScott Long 	MFI_STAT_NOT_FOUND,
3482e21a3efSScott Long 	MFI_STAT_NOT_IN_ENCL,
3492e21a3efSScott Long 	MFI_STAT_PD_CLEAR_IN_PROGRESS,
3502e21a3efSScott Long 	MFI_STAT_PD_TYPE_WRONG,
3512e21a3efSScott Long 	MFI_STAT_PR_DISABLED,
3522e21a3efSScott Long 	MFI_STAT_ROW_INDEX_INVALID,
3532e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_ACTION,
3542e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_DATA,
3552e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_PAGE,
3562e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_TYPE,
3572e21a3efSScott Long 	MFI_STAT_SCSI_DONE_WITH_ERROR,
3582e21a3efSScott Long 	MFI_STAT_SCSI_IO_FAILED,
3592e21a3efSScott Long 	MFI_STAT_SCSI_RESERVATION_CONFLICT,
3602e21a3efSScott Long 	MFI_STAT_SHUTDOWN_FAILED =	0x30,
3612e21a3efSScott Long 	MFI_STAT_TIME_NOT_SET,
3622e21a3efSScott Long 	MFI_STAT_WRONG_STATE,
3632e21a3efSScott Long 	MFI_STAT_LD_OFFLINE,
3642e21a3efSScott Long 	MFI_STAT_PEER_NOTIFICATION_REJECTED,
3652e21a3efSScott Long 	MFI_STAT_PEER_NOTIFICATION_FAILED,
3662e21a3efSScott Long 	MFI_STAT_RESERVATION_IN_PROGRESS,
3672e21a3efSScott Long 	MFI_STAT_I2C_ERRORS_DETECTED,
3682e21a3efSScott Long 	MFI_STAT_PCI_ERRORS_DETECTED,
369763fae79SScott Long 	MFI_STAT_DIAG_FAILED,
370763fae79SScott Long 	MFI_STAT_BOOT_MSG_PENDING,
371763fae79SScott Long 	MFI_STAT_FOREIGN_CONFIG_INCOMPLETE,
3722e21a3efSScott Long 	MFI_STAT_INVALID_STATUS =	0xFF
3732e21a3efSScott Long } mfi_status_t;
3742e21a3efSScott Long 
3752e21a3efSScott Long typedef enum {
3762e21a3efSScott Long 	MFI_EVT_CLASS_DEBUG =		-2,
3772e21a3efSScott Long 	MFI_EVT_CLASS_PROGRESS =	-1,
3782e21a3efSScott Long 	MFI_EVT_CLASS_INFO =		0,
3792e21a3efSScott Long 	MFI_EVT_CLASS_WARNING =		1,
3802e21a3efSScott Long 	MFI_EVT_CLASS_CRITICAL =	2,
3812e21a3efSScott Long 	MFI_EVT_CLASS_FATAL =		3,
3822e21a3efSScott Long 	MFI_EVT_CLASS_DEAD =		4
3832e21a3efSScott Long } mfi_evt_class_t;
3842e21a3efSScott Long 
3852e21a3efSScott Long typedef enum {
3862e21a3efSScott Long 	MFI_EVT_LOCALE_LD =		0x0001,
3872e21a3efSScott Long 	MFI_EVT_LOCALE_PD =		0x0002,
3882e21a3efSScott Long 	MFI_EVT_LOCALE_ENCL =		0x0004,
3892e21a3efSScott Long 	MFI_EVT_LOCALE_BBU =		0x0008,
3902e21a3efSScott Long 	MFI_EVT_LOCALE_SAS =		0x0010,
3912e21a3efSScott Long 	MFI_EVT_LOCALE_CTRL =		0x0020,
3922e21a3efSScott Long 	MFI_EVT_LOCALE_CONFIG =		0x0040,
3932e21a3efSScott Long 	MFI_EVT_LOCALE_CLUSTER =	0x0080,
3942e21a3efSScott Long 	MFI_EVT_LOCALE_ALL =		0xffff
3952e21a3efSScott Long } mfi_evt_locale_t;
3962e21a3efSScott Long 
3972e21a3efSScott Long typedef enum {
3982e21a3efSScott Long 	MR_EVT_ARGS_NONE =		0x00,
3992e21a3efSScott Long 	MR_EVT_ARGS_CDB_SENSE,
4002e21a3efSScott Long 	MR_EVT_ARGS_LD,
4012e21a3efSScott Long 	MR_EVT_ARGS_LD_COUNT,
4022e21a3efSScott Long 	MR_EVT_ARGS_LD_LBA,
4032e21a3efSScott Long 	MR_EVT_ARGS_LD_OWNER,
4042e21a3efSScott Long 	MR_EVT_ARGS_LD_LBA_PD_LBA,
4052e21a3efSScott Long 	MR_EVT_ARGS_LD_PROG,
4062e21a3efSScott Long 	MR_EVT_ARGS_LD_STATE,
4072e21a3efSScott Long 	MR_EVT_ARGS_LD_STRIP,
4082e21a3efSScott Long 	MR_EVT_ARGS_PD,
4092e21a3efSScott Long 	MR_EVT_ARGS_PD_ERR,
4102e21a3efSScott Long 	MR_EVT_ARGS_PD_LBA,
4112e21a3efSScott Long 	MR_EVT_ARGS_PD_LBA_LD,
4122e21a3efSScott Long 	MR_EVT_ARGS_PD_PROG,
4132e21a3efSScott Long 	MR_EVT_ARGS_PD_STATE,
4142e21a3efSScott Long 	MR_EVT_ARGS_PCI,
4152e21a3efSScott Long 	MR_EVT_ARGS_RATE,
4162e21a3efSScott Long 	MR_EVT_ARGS_STR,
4172e21a3efSScott Long 	MR_EVT_ARGS_TIME,
4182e21a3efSScott Long 	MR_EVT_ARGS_ECC
4192e21a3efSScott Long } mfi_evt_args;
4202e21a3efSScott Long 
421a6ba0fd6SDoug Ambrisko #define MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED	0x0152
422a6ba0fd6SDoug Ambrisko #define MR_EVT_PD_REMOVED			0x0070
423a6ba0fd6SDoug Ambrisko #define MR_EVT_PD_INSERTED			0x005b
424ddbffe7fSDoug Ambrisko #define MR_EVT_LD_CHANGE			0x0051
425a6ba0fd6SDoug Ambrisko 
426441f6d5dSScott Long typedef enum {
427441f6d5dSScott Long 	MR_LD_CACHE_WRITE_BACK =	0x01,
428441f6d5dSScott Long 	MR_LD_CACHE_WRITE_ADAPTIVE =	0x02,
429441f6d5dSScott Long 	MR_LD_CACHE_READ_AHEAD =	0x04,
430441f6d5dSScott Long 	MR_LD_CACHE_READ_ADAPTIVE =	0x08,
431441f6d5dSScott Long 	MR_LD_CACHE_WRITE_CACHE_BAD_BBU=0x10,
432441f6d5dSScott Long 	MR_LD_CACHE_ALLOW_WRITE_CACHE =	0x20,
433441f6d5dSScott Long 	MR_LD_CACHE_ALLOW_READ_CACHE =	0x40
434441f6d5dSScott Long } mfi_ld_cache;
435763fae79SScott Long #define	MR_LD_CACHE_MASK	0x7f
436763fae79SScott Long 
437763fae79SScott Long #define	MR_LD_CACHE_POLICY_READ_AHEAD_NONE		0
438763fae79SScott Long #define	MR_LD_CACHE_POLICY_READ_AHEAD_ALWAYS		MR_LD_CACHE_READ_AHEAD
439763fae79SScott Long #define	MR_LD_CACHE_POLICY_READ_AHEAD_ADAPTIVE		\
440763fae79SScott Long 	(MR_LD_CACHE_READ_AHEAD | MR_LD_CACHE_READ_ADAPTIVE)
441763fae79SScott Long #define	MR_LD_CACHE_POLICY_WRITE_THROUGH		0
442763fae79SScott Long #define	MR_LD_CACHE_POLICY_WRITE_BACK			MR_LD_CACHE_WRITE_BACK
443763fae79SScott Long #define	MR_LD_CACHE_POLICY_IO_CACHED			\
444763fae79SScott Long 	(MR_LD_CACHE_ALLOW_WRITE_CACHE | MR_LD_CACHE_ALLOW_READ_CACHE)
445763fae79SScott Long #define	MR_LD_CACHE_POLICY_IO_DIRECT			0
446441f6d5dSScott Long 
447441f6d5dSScott Long typedef enum {
448441f6d5dSScott Long 	MR_PD_CACHE_UNCHANGED  =	0,
449441f6d5dSScott Long 	MR_PD_CACHE_ENABLE =		1,
450441f6d5dSScott Long 	MR_PD_CACHE_DISABLE =		2
451441f6d5dSScott Long } mfi_pd_cache;
452441f6d5dSScott Long 
4530d9a4ef3SDoug Ambrisko typedef enum {
4540d9a4ef3SDoug Ambrisko 	MR_PD_QUERY_TYPE_ALL =		0,
4550d9a4ef3SDoug Ambrisko 	MR_PD_QUERY_TYPE_STATE =	1,
4560d9a4ef3SDoug Ambrisko 	MR_PD_QUERY_TYPE_POWER_STATE =	2,
4570d9a4ef3SDoug Ambrisko 	MR_PD_QUERY_TYPE_MEDIA_TYPE =	3,
4580d9a4ef3SDoug Ambrisko 	MR_PD_QUERY_TYPE_SPEED =	4,
459a6ba0fd6SDoug Ambrisko 	MR_PD_QUERY_TYPE_EXPOSED_TO_HOST = 5 /*query for system drives */
4600d9a4ef3SDoug Ambrisko } mfi_pd_query_type;
4610d9a4ef3SDoug Ambrisko 
4622e21a3efSScott Long /*
4632e21a3efSScott Long  * Other propertities and definitions
4642e21a3efSScott Long  */
4652e21a3efSScott Long #define MFI_MAX_PD_CHANNELS	2
4662e21a3efSScott Long #define MFI_MAX_LD_CHANNELS	2
4672e21a3efSScott Long #define MFI_MAX_CHANNELS	(MFI_MAX_PD_CHANNELS + MFI_MAX_LD_CHANNELS)
4682e21a3efSScott Long #define MFI_MAX_CHANNEL_DEVS	128
4692e21a3efSScott Long #define MFI_DEFAULT_ID		-1
4702e21a3efSScott Long #define MFI_MAX_LUN		8
4712e21a3efSScott Long #define MFI_MAX_LD		64
472763fae79SScott Long #define	MFI_MAX_PD		256
4732e21a3efSScott Long 
4742e21a3efSScott Long #define MFI_FRAME_SIZE		64
4752e21a3efSScott Long #define MFI_MBOX_SIZE		12
4762e21a3efSScott Long 
47708c89430SSteven Hartland /* Firmware flashing can take 50+ seconds */
47808c89430SSteven Hartland #define MFI_POLL_TIMEOUT_SECS	60
4792e21a3efSScott Long 
4802e21a3efSScott Long /* Allow for speedier math calculations */
4812e21a3efSScott Long #define MFI_SECTOR_LEN		512
4822e21a3efSScott Long 
4832e21a3efSScott Long /* Scatter Gather elements */
4842e21a3efSScott Long struct mfi_sg32 {
4852e21a3efSScott Long 	uint32_t	addr;
4862e21a3efSScott Long 	uint32_t	len;
4872e21a3efSScott Long } __packed;
4882e21a3efSScott Long 
4892e21a3efSScott Long struct mfi_sg64 {
4902e21a3efSScott Long 	uint64_t	addr;
4912e21a3efSScott Long 	uint32_t	len;
4922e21a3efSScott Long } __packed;
4932e21a3efSScott Long 
4940d9a4ef3SDoug Ambrisko struct mfi_sg_skinny {
4950d9a4ef3SDoug Ambrisko 	uint64_t	addr;
4960d9a4ef3SDoug Ambrisko 	uint32_t	len;
4970d9a4ef3SDoug Ambrisko 	uint32_t	flag;
4980d9a4ef3SDoug Ambrisko } __packed;
4990d9a4ef3SDoug Ambrisko 
5002e21a3efSScott Long union mfi_sgl {
5012e21a3efSScott Long 	struct mfi_sg32		sg32[1];
5022e21a3efSScott Long 	struct mfi_sg64		sg64[1];
5030d9a4ef3SDoug Ambrisko 	struct mfi_sg_skinny	sg_skinny[1];
5042e21a3efSScott Long } __packed;
5052e21a3efSScott Long 
5062e21a3efSScott Long /* Message frames.  All messages have a common header */
5072e21a3efSScott Long struct mfi_frame_header {
5082e21a3efSScott Long 	uint8_t		cmd;
5092e21a3efSScott Long 	uint8_t		sense_len;
5102e21a3efSScott Long 	uint8_t		cmd_status;
5112e21a3efSScott Long 	uint8_t		scsi_status;
5122e21a3efSScott Long 	uint8_t		target_id;
5132e21a3efSScott Long 	uint8_t		lun_id;
5142e21a3efSScott Long 	uint8_t		cdb_len;
5152e21a3efSScott Long 	uint8_t		sg_count;
5162e21a3efSScott Long 	uint32_t	context;
5170d9a4ef3SDoug Ambrisko 	/*
5180d9a4ef3SDoug Ambrisko 	 * pad0 is MSI Specific. Not used by Driver. Zero the value before
519a6ba0fd6SDoug Ambrisko 	 * sending the command to f/w.
5200d9a4ef3SDoug Ambrisko 	 */
5212e21a3efSScott Long 	uint32_t	pad0;
5222e21a3efSScott Long 	uint16_t	flags;
52304697de9SDoug Ambrisko #define MFI_FRAME_DATAOUT	0x08
52404697de9SDoug Ambrisko #define MFI_FRAME_DATAIN	0x10
5252e21a3efSScott Long 	uint16_t	timeout;
5262e21a3efSScott Long 	uint32_t	data_len;
5272e21a3efSScott Long } __packed;
5282e21a3efSScott Long 
5292e21a3efSScott Long struct mfi_init_frame {
5302e21a3efSScott Long 	struct mfi_frame_header	header;
5312e21a3efSScott Long 	uint32_t	qinfo_new_addr_lo;
5322e21a3efSScott Long 	uint32_t	qinfo_new_addr_hi;
5332e21a3efSScott Long 	uint32_t	qinfo_old_addr_lo;
5342e21a3efSScott Long 	uint32_t	qinfo_old_addr_hi;
5350d9a4ef3SDoug Ambrisko 	// Start LSIP200113393
5360d9a4ef3SDoug Ambrisko 	uint32_t	driver_ver_lo;      /*28h */
5370d9a4ef3SDoug Ambrisko 	uint32_t	driver_ver_hi;      /*2Ch */
5380d9a4ef3SDoug Ambrisko 
5390d9a4ef3SDoug Ambrisko 	uint32_t	reserved[4];
5400d9a4ef3SDoug Ambrisko 	// End LSIP200113393
5412e21a3efSScott Long } __packed;
5422e21a3efSScott Long 
5430d9a4ef3SDoug Ambrisko /*
544a6ba0fd6SDoug Ambrisko  * Define MFI Address Context union.
5450d9a4ef3SDoug Ambrisko  */
5460d9a4ef3SDoug Ambrisko #ifdef MFI_ADDRESS_IS_uint64_t
5470d9a4ef3SDoug Ambrisko     typedef uint64_t     MFI_ADDRESS;
5480d9a4ef3SDoug Ambrisko #else
5490d9a4ef3SDoug Ambrisko     typedef union _MFI_ADDRESS {
5500d9a4ef3SDoug Ambrisko         struct {
5510d9a4ef3SDoug Ambrisko             uint32_t     addressLow;
5520d9a4ef3SDoug Ambrisko             uint32_t     addressHigh;
5530d9a4ef3SDoug Ambrisko         } u;
5540d9a4ef3SDoug Ambrisko         uint64_t     address;
5550d9a4ef3SDoug Ambrisko     } MFI_ADDRESS, *PMFI_ADDRESS;
5560d9a4ef3SDoug Ambrisko #endif
5570d9a4ef3SDoug Ambrisko 
5582e21a3efSScott Long #define MFI_IO_FRAME_SIZE 40
5592e21a3efSScott Long struct mfi_io_frame {
5602e21a3efSScott Long 	struct mfi_frame_header	header;
5612e21a3efSScott Long 	uint32_t	sense_addr_lo;
5622e21a3efSScott Long 	uint32_t	sense_addr_hi;
5632e21a3efSScott Long 	uint32_t	lba_lo;
5642e21a3efSScott Long 	uint32_t	lba_hi;
5652e21a3efSScott Long 	union mfi_sgl	sgl;
5662e21a3efSScott Long } __packed;
5672e21a3efSScott Long 
5682e21a3efSScott Long #define MFI_PASS_FRAME_SIZE 48
5692e21a3efSScott Long struct mfi_pass_frame {
5702e21a3efSScott Long 	struct mfi_frame_header header;
5712e21a3efSScott Long 	uint32_t	sense_addr_lo;
5722e21a3efSScott Long 	uint32_t	sense_addr_hi;
5732e21a3efSScott Long 	uint8_t		cdb[16];
5742e21a3efSScott Long 	union mfi_sgl	sgl;
5752e21a3efSScott Long } __packed;
5762e21a3efSScott Long 
5772e21a3efSScott Long #define MFI_DCMD_FRAME_SIZE 40
5782e21a3efSScott Long struct mfi_dcmd_frame {
5792e21a3efSScott Long 	struct mfi_frame_header header;
5802e21a3efSScott Long 	uint32_t	opcode;
5812e21a3efSScott Long 	uint8_t		mbox[MFI_MBOX_SIZE];
5822e21a3efSScott Long 	union mfi_sgl	sgl;
5832e21a3efSScott Long } __packed;
5842e21a3efSScott Long 
5852e21a3efSScott Long struct mfi_abort_frame {
5862e21a3efSScott Long 	struct mfi_frame_header header;
5872e21a3efSScott Long 	uint32_t	abort_context;
5880d9a4ef3SDoug Ambrisko 	/* pad is changed to reserved.*/
5890d9a4ef3SDoug Ambrisko 	uint32_t	reserved0;
5902e21a3efSScott Long 	uint32_t	abort_mfi_addr_lo;
5912e21a3efSScott Long 	uint32_t	abort_mfi_addr_hi;
5920d9a4ef3SDoug Ambrisko 	uint32_t	reserved1[6];
5932e21a3efSScott Long } __packed;
5942e21a3efSScott Long 
5952e21a3efSScott Long struct mfi_smp_frame {
5962e21a3efSScott Long 	struct mfi_frame_header header;
5972e21a3efSScott Long 	uint64_t	sas_addr;
5982e21a3efSScott Long 	union {
5992e21a3efSScott Long 		struct mfi_sg32 sg32[2];
6002e21a3efSScott Long 		struct mfi_sg64 sg64[2];
6012e21a3efSScott Long 	} sgl;
6022e21a3efSScott Long } __packed;
6032e21a3efSScott Long 
6042e21a3efSScott Long struct mfi_stp_frame {
6052e21a3efSScott Long 	struct mfi_frame_header header;
6062e21a3efSScott Long 	uint16_t	fis[10];
6072e21a3efSScott Long 	uint32_t	stp_flags;
6082e21a3efSScott Long 	union {
6092e21a3efSScott Long 		struct mfi_sg32 sg32[2];
6102e21a3efSScott Long 		struct mfi_sg64 sg64[2];
6112e21a3efSScott Long 	} sgl;
6122e21a3efSScott Long } __packed;
6132e21a3efSScott Long 
6142e21a3efSScott Long union mfi_frame {
6152e21a3efSScott Long 	struct mfi_frame_header header;
6162e21a3efSScott Long 	struct mfi_init_frame	init;
6170d9a4ef3SDoug Ambrisko 	/* ThunderBolt Initialization */
6182e21a3efSScott Long 	struct mfi_io_frame	io;
6192e21a3efSScott Long 	struct mfi_pass_frame	pass;
6202e21a3efSScott Long 	struct mfi_dcmd_frame	dcmd;
6212e21a3efSScott Long 	struct mfi_abort_frame	abort;
6222e21a3efSScott Long 	struct mfi_smp_frame	smp;
6232e21a3efSScott Long 	struct mfi_stp_frame	stp;
6242e21a3efSScott Long 	uint8_t			bytes[MFI_FRAME_SIZE];
6252e21a3efSScott Long };
6262e21a3efSScott Long 
6272e21a3efSScott Long #define MFI_SENSE_LEN 128
6282e21a3efSScott Long struct mfi_sense {
6292e21a3efSScott Long 	uint8_t		data[MFI_SENSE_LEN];
6302e21a3efSScott Long };
6312e21a3efSScott Long 
6322e21a3efSScott Long /* The queue init structure that is passed with the init message */
6332e21a3efSScott Long struct mfi_init_qinfo {
6342e21a3efSScott Long 	uint32_t	flags;
6352e21a3efSScott Long 	uint32_t	rq_entries;
6362e21a3efSScott Long 	uint32_t	rq_addr_lo;
6372e21a3efSScott Long 	uint32_t	rq_addr_hi;
6382e21a3efSScott Long 	uint32_t	pi_addr_lo;
6392e21a3efSScott Long 	uint32_t	pi_addr_hi;
6402e21a3efSScott Long 	uint32_t	ci_addr_lo;
6412e21a3efSScott Long 	uint32_t	ci_addr_hi;
6422e21a3efSScott Long } __packed;
6432e21a3efSScott Long 
6442e21a3efSScott Long /* SAS (?) controller properties, part of mfi_ctrl_info */
6452e21a3efSScott Long struct mfi_ctrl_props {
6462e21a3efSScott Long 	uint16_t	seq_num;
6472e21a3efSScott Long 	uint16_t	pred_fail_poll_interval;
6482e21a3efSScott Long 	uint16_t	intr_throttle_cnt;
6492e21a3efSScott Long 	uint16_t	intr_throttle_timeout;
6502e21a3efSScott Long 	uint8_t		rebuild_rate;
6512e21a3efSScott Long 	uint8_t		patrol_read_rate;
6522e21a3efSScott Long 	uint8_t		bgi_rate;
6532e21a3efSScott Long 	uint8_t		cc_rate;
6542e21a3efSScott Long 	uint8_t		recon_rate;
6552e21a3efSScott Long 	uint8_t		cache_flush_interval;
6562e21a3efSScott Long 	uint8_t		spinup_drv_cnt;
6572e21a3efSScott Long 	uint8_t		spinup_delay;
6582e21a3efSScott Long 	uint8_t		cluster_enable;
6592e21a3efSScott Long 	uint8_t		coercion_mode;
6602e21a3efSScott Long 	uint8_t		alarm_enable;
6612e21a3efSScott Long 	uint8_t		disable_auto_rebuild;
6622e21a3efSScott Long 	uint8_t		disable_battery_warn;
6632e21a3efSScott Long 	uint8_t		ecc_bucket_size;
6642e21a3efSScott Long 	uint16_t	ecc_bucket_leak_rate;
6652e21a3efSScott Long 	uint8_t		restore_hotspare_on_insertion;
6662e21a3efSScott Long 	uint8_t		expose_encl_devices;
6670d9a4ef3SDoug Ambrisko 	uint8_t		maintainPdFailHistory;
6680d9a4ef3SDoug Ambrisko 	uint8_t		disallowHostRequestReordering;
669a6ba0fd6SDoug Ambrisko 	/* set TRUE to abort CC on detecting an inconsistency */
670a6ba0fd6SDoug Ambrisko 	uint8_t		abortCCOnError;
671a6ba0fd6SDoug Ambrisko 	/* load balance mode (MR_LOAD_BALANCE_MODE) */
672a6ba0fd6SDoug Ambrisko 	uint8_t		loadBalanceMode;
673a6ba0fd6SDoug Ambrisko 	/*
674a6ba0fd6SDoug Ambrisko 	 * 0 - use auto detect logic of backplanes like SGPIO, i2c SEP using
675a6ba0fd6SDoug Ambrisko 	 *     h/w mechansim like GPIO pins
676a6ba0fd6SDoug Ambrisko 	 * 1 - disable auto detect SGPIO,
677a6ba0fd6SDoug Ambrisko 	 * 2 - disable i2c SEP auto detect
678a6ba0fd6SDoug Ambrisko 	 * 3 - disable both auto detect
679a6ba0fd6SDoug Ambrisko 	 */
680a6ba0fd6SDoug Ambrisko 	uint8_t		disableAutoDetectBackplane;
681a6ba0fd6SDoug Ambrisko 	/*
682a6ba0fd6SDoug Ambrisko 	 * % of source LD to be reserved for a VDs snapshot in snapshot
683a6ba0fd6SDoug Ambrisko 	 * repository, for metadata and user data: 1=5%, 2=10%, 3=15% and so on
684a6ba0fd6SDoug Ambrisko 	 */
685a6ba0fd6SDoug Ambrisko 	uint8_t		snapVDSpace;
6860d9a4ef3SDoug Ambrisko 
6870d9a4ef3SDoug Ambrisko 	/*
688a6ba0fd6SDoug Ambrisko 	 * Add properties that can be controlled by a bit in the following
689a6ba0fd6SDoug Ambrisko 	 * structure.
6900d9a4ef3SDoug Ambrisko 	 */
6910d9a4ef3SDoug Ambrisko 	struct {
692a6ba0fd6SDoug Ambrisko 		/* set TRUE to disable copyBack (0=copback enabled) */
693a6ba0fd6SDoug Ambrisko 		uint32_t	copyBackDisabled		:1;
6940d9a4ef3SDoug Ambrisko 		uint32_t	SMARTerEnabled			:1;
6950d9a4ef3SDoug Ambrisko 		uint32_t	prCorrectUnconfiguredAreas	:1;
6960d9a4ef3SDoug Ambrisko 		uint32_t	useFdeOnly			:1;
6970d9a4ef3SDoug Ambrisko 		uint32_t	disableNCQ			:1;
6980d9a4ef3SDoug Ambrisko 		uint32_t	SSDSMARTerEnabled		:1;
6990d9a4ef3SDoug Ambrisko 		uint32_t	SSDPatrolReadEnabled		:1;
7000d9a4ef3SDoug Ambrisko 		uint32_t	enableSpinDownUnconfigured	:1;
7010d9a4ef3SDoug Ambrisko 		uint32_t	autoEnhancedImport		:1;
7020d9a4ef3SDoug Ambrisko 		uint32_t	enableSecretKeyControl		:1;
7030d9a4ef3SDoug Ambrisko 		uint32_t	disableOnlineCtrlReset		:1;
7040d9a4ef3SDoug Ambrisko 		uint32_t	allowBootWithPinnedCache	:1;
7050d9a4ef3SDoug Ambrisko 		uint32_t	disableSpinDownHS		:1;
7060d9a4ef3SDoug Ambrisko 		uint32_t	enableJBOD			:1;
7070d9a4ef3SDoug Ambrisko 		uint32_t	reserved			:18;
7080d9a4ef3SDoug Ambrisko 	} OnOffProperties;
709a6ba0fd6SDoug Ambrisko 	/*
710a6ba0fd6SDoug Ambrisko 	 * % of source LD to be reserved for auto snapshot in snapshot
711a6ba0fd6SDoug Ambrisko 	 * repository, for metadata and user data: 1=5%, 2=10%, 3=15% and so on.
712a6ba0fd6SDoug Ambrisko 	 */
713a6ba0fd6SDoug Ambrisko 	uint8_t		autoSnapVDSpace;
714a6ba0fd6SDoug Ambrisko 	/*
715a6ba0fd6SDoug Ambrisko 	 * Snapshot writeable VIEWs capacity as a % of source LD capacity:
716a6ba0fd6SDoug Ambrisko 	 * 0=READ only, 1=5%, 2=10%, 3=15% and so on.
717a6ba0fd6SDoug Ambrisko 	 */
718a6ba0fd6SDoug Ambrisko 	uint8_t		viewSpace;
719a6ba0fd6SDoug Ambrisko 	/* # of idle minutes before device is spun down (0=use FW defaults) */
720a6ba0fd6SDoug Ambrisko 	uint16_t	spinDownTime;
7210d9a4ef3SDoug Ambrisko 	uint8_t		reserved[24];
7222e21a3efSScott Long } __packed;
7232e21a3efSScott Long 
7242e21a3efSScott Long /* PCI information about the card. */
7252e21a3efSScott Long struct mfi_info_pci {
7262e21a3efSScott Long 	uint16_t	vendor;
7272e21a3efSScott Long 	uint16_t	device;
7282e21a3efSScott Long 	uint16_t	subvendor;
7292e21a3efSScott Long 	uint16_t	subdevice;
7302e21a3efSScott Long 	uint8_t		reserved[24];
7312e21a3efSScott Long } __packed;
7322e21a3efSScott Long 
7332e21a3efSScott Long /* Host (front end) interface information */
7342e21a3efSScott Long struct mfi_info_host {
7352e21a3efSScott Long 	uint8_t		type;
7362e21a3efSScott Long #define MFI_INFO_HOST_PCIX	0x01
7372e21a3efSScott Long #define MFI_INFO_HOST_PCIE	0x02
7382e21a3efSScott Long #define MFI_INFO_HOST_ISCSI	0x04
7392e21a3efSScott Long #define MFI_INFO_HOST_SAS3G	0x08
7402e21a3efSScott Long 	uint8_t		reserved[6];
7412e21a3efSScott Long 	uint8_t		port_count;
7422e21a3efSScott Long 	uint64_t	port_addr[8];
7432e21a3efSScott Long } __packed;
7442e21a3efSScott Long 
7452e21a3efSScott Long /* Device (back end) interface information */
7462e21a3efSScott Long struct mfi_info_device {
7472e21a3efSScott Long 	uint8_t		type;
7482e21a3efSScott Long #define MFI_INFO_DEV_SPI	0x01
7492e21a3efSScott Long #define MFI_INFO_DEV_SAS3G	0x02
7502e21a3efSScott Long #define MFI_INFO_DEV_SATA1	0x04
7512e21a3efSScott Long #define MFI_INFO_DEV_SATA3G	0x08
7522e21a3efSScott Long 	uint8_t		reserved[6];
7532e21a3efSScott Long 	uint8_t		port_count;
7542e21a3efSScott Long 	uint64_t	port_addr[8];
7552e21a3efSScott Long } __packed;
7562e21a3efSScott Long 
7572e21a3efSScott Long /* Firmware component information */
7582e21a3efSScott Long struct mfi_info_component {
7592e21a3efSScott Long 	char		 name[8];
7602e21a3efSScott Long 	char		 version[32];
7612e21a3efSScott Long 	char		 build_date[16];
7622e21a3efSScott Long 	char		 build_time[16];
7632e21a3efSScott Long } __packed;
7642e21a3efSScott Long 
765441f6d5dSScott Long /* Controller default settings */
766441f6d5dSScott Long struct mfi_defaults {
767441f6d5dSScott Long 	uint64_t	sas_addr;
768441f6d5dSScott Long 	uint8_t		phy_polarity;
769441f6d5dSScott Long 	uint8_t		background_rate;
770441f6d5dSScott Long 	uint8_t		stripe_size;
771441f6d5dSScott Long 	uint8_t		flush_time;
772441f6d5dSScott Long 	uint8_t		write_back;
773441f6d5dSScott Long 	uint8_t		read_ahead;
774441f6d5dSScott Long 	uint8_t		cache_when_bbu_bad;
775441f6d5dSScott Long 	uint8_t		cached_io;
776441f6d5dSScott Long 	uint8_t		smart_mode;
777441f6d5dSScott Long 	uint8_t		alarm_disable;
778441f6d5dSScott Long 	uint8_t		coercion;
779441f6d5dSScott Long 	uint8_t		zrc_config;
780441f6d5dSScott Long 	uint8_t		dirty_led_shows_drive_activity;
781441f6d5dSScott Long 	uint8_t		bios_continue_on_error;
782441f6d5dSScott Long 	uint8_t		spindown_mode;
783441f6d5dSScott Long 	uint8_t		allowed_device_types;
784441f6d5dSScott Long 	uint8_t		allow_mix_in_enclosure;
785441f6d5dSScott Long 	uint8_t		allow_mix_in_ld;
786441f6d5dSScott Long 	uint8_t		allow_sata_in_cluster;
787441f6d5dSScott Long 	uint8_t		max_chained_enclosures;
788441f6d5dSScott Long 	uint8_t		disable_ctrl_r;
789441f6d5dSScott Long 	uint8_t		enabel_web_bios;
790441f6d5dSScott Long 	uint8_t		phy_polarity_split;
791441f6d5dSScott Long 	uint8_t		direct_pd_mapping;
792441f6d5dSScott Long 	uint8_t		bios_enumerate_lds;
793441f6d5dSScott Long 	uint8_t		restored_hot_spare_on_insertion;
794441f6d5dSScott Long 	uint8_t		expose_enclosure_devices;
795441f6d5dSScott Long 	uint8_t		maintain_pd_fail_history;
796441f6d5dSScott Long 	uint8_t		resv[28];
797441f6d5dSScott Long } __packed;
798441f6d5dSScott Long 
799441f6d5dSScott Long /* Controller default settings */
800441f6d5dSScott Long struct mfi_bios_data {
801441f6d5dSScott Long 	uint16_t	boot_target_id;
802441f6d5dSScott Long 	uint8_t		do_not_int_13;
803441f6d5dSScott Long 	uint8_t		continue_on_error;
804441f6d5dSScott Long 	uint8_t		verbose;
805441f6d5dSScott Long 	uint8_t		geometry;
806441f6d5dSScott Long 	uint8_t		expose_all_drives;
807441f6d5dSScott Long 	uint8_t		reserved[56];
808441f6d5dSScott Long 	uint8_t		check_sum;
809441f6d5dSScott Long } __packed;
8102e21a3efSScott Long 
8112e21a3efSScott Long /* SAS (?) controller info, returned from MFI_DCMD_CTRL_GETINFO. */
8122e21a3efSScott Long struct mfi_ctrl_info {
8132e21a3efSScott Long 	struct mfi_info_pci	pci;
8142e21a3efSScott Long 	struct mfi_info_host	host;
8152e21a3efSScott Long 	struct mfi_info_device	device;
8162e21a3efSScott Long 
8172e21a3efSScott Long 	/* Firmware components that are present and active. */
8182e21a3efSScott Long 	uint32_t		image_check_word;
8192e21a3efSScott Long 	uint32_t		image_component_count;
8202e21a3efSScott Long 	struct mfi_info_component image_component[8];
8212e21a3efSScott Long 
8222e21a3efSScott Long 	/* Firmware components that have been flashed but are inactive */
8232e21a3efSScott Long 	uint32_t		pending_image_component_count;
8242e21a3efSScott Long 	struct mfi_info_component pending_image_component[8];
8252e21a3efSScott Long 
8262e21a3efSScott Long 	uint8_t			max_arms;
8272e21a3efSScott Long 	uint8_t			max_spans;
8282e21a3efSScott Long 	uint8_t			max_arrays;
8292e21a3efSScott Long 	uint8_t			max_lds;
8302e21a3efSScott Long 	char			product_name[80];
8312e21a3efSScott Long 	char			serial_number[32];
8322e21a3efSScott Long 	uint32_t		hw_present;
8332e21a3efSScott Long #define MFI_INFO_HW_BBU		0x01
8342e21a3efSScott Long #define MFI_INFO_HW_ALARM	0x02
8352e21a3efSScott Long #define MFI_INFO_HW_NVRAM	0x04
8362e21a3efSScott Long #define MFI_INFO_HW_UART	0x08
8372e21a3efSScott Long 	uint32_t		current_fw_time;
8382e21a3efSScott Long 	uint16_t		max_cmds;
8392e21a3efSScott Long 	uint16_t		max_sg_elements;
8402e21a3efSScott Long 	uint32_t		max_request_size;
8412e21a3efSScott Long 	uint16_t		lds_present;
8422e21a3efSScott Long 	uint16_t		lds_degraded;
8432e21a3efSScott Long 	uint16_t		lds_offline;
8442e21a3efSScott Long 	uint16_t		pd_present;
8452e21a3efSScott Long 	uint16_t		pd_disks_present;
8462e21a3efSScott Long 	uint16_t		pd_disks_pred_failure;
8472e21a3efSScott Long 	uint16_t		pd_disks_failed;
8482e21a3efSScott Long 	uint16_t		nvram_size;
8492e21a3efSScott Long 	uint16_t		memory_size;
8502e21a3efSScott Long 	uint16_t		flash_size;
8512e21a3efSScott Long 	uint16_t		ram_correctable_errors;
8522e21a3efSScott Long 	uint16_t		ram_uncorrectable_errors;
8532e21a3efSScott Long 	uint8_t			cluster_allowed;
8542e21a3efSScott Long 	uint8_t			cluster_active;
8552e21a3efSScott Long 	uint16_t		max_strips_per_io;
8562e21a3efSScott Long 
8572e21a3efSScott Long 	uint32_t		raid_levels;
8582e21a3efSScott Long #define MFI_INFO_RAID_0		0x01
8592e21a3efSScott Long #define MFI_INFO_RAID_1		0x02
8602e21a3efSScott Long #define MFI_INFO_RAID_5		0x04
8612e21a3efSScott Long #define MFI_INFO_RAID_1E	0x08
8622e21a3efSScott Long #define MFI_INFO_RAID_6		0x10
8632e21a3efSScott Long 
8642e21a3efSScott Long 	uint32_t		adapter_ops;
8652e21a3efSScott Long #define MFI_INFO_AOPS_RBLD_RATE		0x0001
8662e21a3efSScott Long #define MFI_INFO_AOPS_CC_RATE		0x0002
8672e21a3efSScott Long #define MFI_INFO_AOPS_BGI_RATE		0x0004
8682e21a3efSScott Long #define MFI_INFO_AOPS_RECON_RATE	0x0008
8692e21a3efSScott Long #define MFI_INFO_AOPS_PATROL_RATE	0x0010
8702e21a3efSScott Long #define MFI_INFO_AOPS_ALARM_CONTROL	0x0020
8712e21a3efSScott Long #define MFI_INFO_AOPS_CLUSTER_SUPPORTED	0x0040
8722e21a3efSScott Long #define MFI_INFO_AOPS_BBU		0x0080
8732e21a3efSScott Long #define MFI_INFO_AOPS_SPANNING_ALLOWED	0x0100
8742e21a3efSScott Long #define MFI_INFO_AOPS_DEDICATED_SPARES	0x0200
8752e21a3efSScott Long #define MFI_INFO_AOPS_REVERTIBLE_SPARES	0x0400
8762e21a3efSScott Long #define MFI_INFO_AOPS_FOREIGN_IMPORT	0x0800
8772e21a3efSScott Long #define MFI_INFO_AOPS_SELF_DIAGNOSTIC	0x1000
8782e21a3efSScott Long #define MFI_INFO_AOPS_MIXED_ARRAY	0x2000
8792e21a3efSScott Long #define MFI_INFO_AOPS_GLOBAL_SPARES	0x4000
8802e21a3efSScott Long 
8812e21a3efSScott Long 	uint32_t		ld_ops;
8822e21a3efSScott Long #define MFI_INFO_LDOPS_READ_POLICY	0x01
8832e21a3efSScott Long #define MFI_INFO_LDOPS_WRITE_POLICY	0x02
8842e21a3efSScott Long #define MFI_INFO_LDOPS_IO_POLICY	0x04
8852e21a3efSScott Long #define MFI_INFO_LDOPS_ACCESS_POLICY	0x08
8862e21a3efSScott Long #define MFI_INFO_LDOPS_DISK_CACHE_POLICY 0x10
8872e21a3efSScott Long 
8882e21a3efSScott Long 	struct {
8892e21a3efSScott Long 		uint8_t		min;
8902e21a3efSScott Long 		uint8_t		max;
8912e21a3efSScott Long 		uint8_t		reserved[2];
8922e21a3efSScott Long 	} __packed stripe_sz_ops;
8932e21a3efSScott Long 
8942e21a3efSScott Long 	uint32_t		pd_ops;
8952e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_ONLINE	0x01
8962e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_OFFLINE	0x02
8972e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_REBUILD	0x04
8982e21a3efSScott Long 
8992e21a3efSScott Long 	uint32_t		pd_mix_support;
9002e21a3efSScott Long #define MFI_INFO_PDMIX_SAS		0x01
9012e21a3efSScott Long #define MFI_INFO_PDMIX_SATA		0x02
9022e21a3efSScott Long #define MFI_INFO_PDMIX_ENCL		0x04
9032e21a3efSScott Long #define MFI_INFO_PDMIX_LD		0x08
9042e21a3efSScott Long #define MFI_INFO_PDMIX_SATA_CLUSTER	0x10
9052e21a3efSScott Long 
9062e21a3efSScott Long 	uint8_t			ecc_bucket_count;
9072e21a3efSScott Long 	uint8_t			reserved2[11];
9082e21a3efSScott Long 	struct mfi_ctrl_props	properties;
9092e21a3efSScott Long 	char			package_version[0x60];
9102e21a3efSScott Long 	uint8_t			pad[0x800 - 0x6a0];
9112e21a3efSScott Long } __packed;
9122e21a3efSScott Long 
913741367d5SDoug Ambrisko /* keep track of an event. */
914741367d5SDoug Ambrisko union mfi_evt {
915741367d5SDoug Ambrisko 	struct {
916741367d5SDoug Ambrisko 		uint16_t	locale;
917741367d5SDoug Ambrisko 		uint8_t		reserved;
918aacea6e2SEd Maste 		int8_t		evt_class;
919741367d5SDoug Ambrisko 	} members;
920741367d5SDoug Ambrisko 	uint32_t		word;
921741367d5SDoug Ambrisko } __packed;
922741367d5SDoug Ambrisko 
923741367d5SDoug Ambrisko /* event log state. */
924741367d5SDoug Ambrisko struct mfi_evt_log_state {
925741367d5SDoug Ambrisko 	uint32_t		newest_seq_num;
926741367d5SDoug Ambrisko 	uint32_t		oldest_seq_num;
927741367d5SDoug Ambrisko 	uint32_t		clear_seq_num;
928741367d5SDoug Ambrisko 	uint32_t		shutdown_seq_num;
929741367d5SDoug Ambrisko 	uint32_t		boot_seq_num;
930741367d5SDoug Ambrisko } __packed;
931741367d5SDoug Ambrisko 
932741367d5SDoug Ambrisko struct mfi_progress {
933741367d5SDoug Ambrisko 	uint16_t		progress;
934741367d5SDoug Ambrisko 	uint16_t		elapsed_seconds;
935741367d5SDoug Ambrisko } __packed;
936741367d5SDoug Ambrisko 
937741367d5SDoug Ambrisko struct mfi_evt_ld {
938741367d5SDoug Ambrisko 	uint16_t		target_id;
939741367d5SDoug Ambrisko 	uint8_t			ld_index;
940741367d5SDoug Ambrisko 	uint8_t			reserved;
941741367d5SDoug Ambrisko } __packed;
942741367d5SDoug Ambrisko 
943741367d5SDoug Ambrisko struct mfi_evt_pd {
944741367d5SDoug Ambrisko 	uint16_t		device_id;
945741367d5SDoug Ambrisko 	uint8_t			enclosure_index;
946741367d5SDoug Ambrisko 	uint8_t			slot_number;
947741367d5SDoug Ambrisko } __packed;
948741367d5SDoug Ambrisko 
949741367d5SDoug Ambrisko /* SAS (?) event detail, returned from MFI_DCMD_CTRL_EVENT_WAIT. */
950741367d5SDoug Ambrisko struct mfi_evt_detail {
951741367d5SDoug Ambrisko 	uint32_t		seq;
952741367d5SDoug Ambrisko 	uint32_t		time;
953741367d5SDoug Ambrisko 	uint32_t		code;
954aacea6e2SEd Maste 	union mfi_evt		evt_class;
955741367d5SDoug Ambrisko 	uint8_t			arg_type;
956741367d5SDoug Ambrisko 	uint8_t			reserved1[15];
957741367d5SDoug Ambrisko 
958741367d5SDoug Ambrisko 	union {
959741367d5SDoug Ambrisko 		struct {
960741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
961741367d5SDoug Ambrisko 			uint8_t			cdb_len;
962741367d5SDoug Ambrisko 			uint8_t			sense_len;
963741367d5SDoug Ambrisko 			uint8_t			reserved[2];
964741367d5SDoug Ambrisko 			uint8_t			cdb[16];
965741367d5SDoug Ambrisko 			uint8_t			sense[64];
966741367d5SDoug Ambrisko 		} cdb_sense;
967741367d5SDoug Ambrisko 
968741367d5SDoug Ambrisko 		struct mfi_evt_ld		ld;
969741367d5SDoug Ambrisko 
970741367d5SDoug Ambrisko 		struct {
971741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
972741367d5SDoug Ambrisko 			uint64_t		count;
973741367d5SDoug Ambrisko 		} ld_count;
974741367d5SDoug Ambrisko 
975741367d5SDoug Ambrisko 		struct {
976741367d5SDoug Ambrisko 			uint64_t		lba;
977741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
978741367d5SDoug Ambrisko 		} ld_lba;
979741367d5SDoug Ambrisko 
980741367d5SDoug Ambrisko 		struct {
981741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
982741367d5SDoug Ambrisko 			uint32_t		pre_owner;
983741367d5SDoug Ambrisko 			uint32_t		new_owner;
984741367d5SDoug Ambrisko 		} ld_owner;
985741367d5SDoug Ambrisko 
986741367d5SDoug Ambrisko 		struct {
987741367d5SDoug Ambrisko 			uint64_t		ld_lba;
988741367d5SDoug Ambrisko 			uint64_t		pd_lba;
989741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
990741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
991741367d5SDoug Ambrisko 		} ld_lba_pd_lba;
992741367d5SDoug Ambrisko 
993741367d5SDoug Ambrisko 		struct {
994741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
995741367d5SDoug Ambrisko 			struct mfi_progress	prog;
996741367d5SDoug Ambrisko 		} ld_prog;
997741367d5SDoug Ambrisko 
998741367d5SDoug Ambrisko 		struct {
999741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
1000741367d5SDoug Ambrisko 			uint32_t		prev_state;
1001741367d5SDoug Ambrisko 			uint32_t		new_state;
1002741367d5SDoug Ambrisko 		} ld_state;
1003741367d5SDoug Ambrisko 
1004741367d5SDoug Ambrisko 		struct {
1005741367d5SDoug Ambrisko 			uint64_t		strip;
1006741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
1007741367d5SDoug Ambrisko 		} ld_strip;
1008741367d5SDoug Ambrisko 
1009741367d5SDoug Ambrisko 		struct mfi_evt_pd		pd;
1010741367d5SDoug Ambrisko 
1011741367d5SDoug Ambrisko 		struct {
1012741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
1013741367d5SDoug Ambrisko 			uint32_t		err;
1014741367d5SDoug Ambrisko 		} pd_err;
1015741367d5SDoug Ambrisko 
1016741367d5SDoug Ambrisko 		struct {
1017741367d5SDoug Ambrisko 			uint64_t		lba;
1018741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
1019741367d5SDoug Ambrisko 		} pd_lba;
1020741367d5SDoug Ambrisko 
1021741367d5SDoug Ambrisko 		struct {
1022741367d5SDoug Ambrisko 			uint64_t		lba;
1023741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
1024741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
1025741367d5SDoug Ambrisko 		} pd_lba_ld;
1026741367d5SDoug Ambrisko 
1027741367d5SDoug Ambrisko 		struct {
1028741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
1029741367d5SDoug Ambrisko 			struct mfi_progress	prog;
1030741367d5SDoug Ambrisko 		} pd_prog;
1031741367d5SDoug Ambrisko 
1032741367d5SDoug Ambrisko 		struct {
1033741367d5SDoug Ambrisko 			struct mfi_evt_pd	ld;
1034741367d5SDoug Ambrisko 			uint32_t		prev_state;
1035741367d5SDoug Ambrisko 			uint32_t		new_state;
1036741367d5SDoug Ambrisko 		} pd_state;
1037741367d5SDoug Ambrisko 
1038741367d5SDoug Ambrisko 		struct {
1039741367d5SDoug Ambrisko 			uint16_t		venderId;
1040741367d5SDoug Ambrisko 			uint16_t		deviceId;
1041741367d5SDoug Ambrisko 			uint16_t		subVenderId;
1042741367d5SDoug Ambrisko 			uint16_t		subDeviceId;
1043741367d5SDoug Ambrisko 		} pci;
1044741367d5SDoug Ambrisko 
1045741367d5SDoug Ambrisko 		uint32_t			rate;
1046741367d5SDoug Ambrisko 
1047741367d5SDoug Ambrisko 		char				str[96];
1048741367d5SDoug Ambrisko 
1049741367d5SDoug Ambrisko 		struct {
1050741367d5SDoug Ambrisko 			uint32_t		rtc;
1051741367d5SDoug Ambrisko 			uint16_t		elapsedSeconds;
1052741367d5SDoug Ambrisko 		} time;
1053741367d5SDoug Ambrisko 
1054741367d5SDoug Ambrisko 		struct {
1055741367d5SDoug Ambrisko 			uint32_t		ecar;
1056741367d5SDoug Ambrisko 			uint32_t		elog;
1057741367d5SDoug Ambrisko 			char			str[64];
1058741367d5SDoug Ambrisko 		} ecc;
1059741367d5SDoug Ambrisko 
1060741367d5SDoug Ambrisko 		uint8_t		b[96];
1061741367d5SDoug Ambrisko 		uint16_t	s[48];
1062741367d5SDoug Ambrisko 		uint32_t	w[24];
1063741367d5SDoug Ambrisko 		uint64_t	d[12];
1064741367d5SDoug Ambrisko 	} args;
1065741367d5SDoug Ambrisko 
1066741367d5SDoug Ambrisko 	char description[128];
1067741367d5SDoug Ambrisko } __packed;
1068741367d5SDoug Ambrisko 
106947b470b9SDoug Ambrisko struct mfi_evt_list {
107047b470b9SDoug Ambrisko 	uint32_t		count;
107147b470b9SDoug Ambrisko 	uint32_t		reserved;
107247b470b9SDoug Ambrisko 	struct mfi_evt_detail	event[1];
1073741367d5SDoug Ambrisko } __packed;
1074741367d5SDoug Ambrisko 
1075441f6d5dSScott Long union mfi_pd_ref {
1076441f6d5dSScott Long 	struct {
1077441f6d5dSScott Long 		uint16_t	device_id;
1078441f6d5dSScott Long 		uint16_t	seq_num;
1079441f6d5dSScott Long 	} v;
1080441f6d5dSScott Long 	uint32_t	ref;
1081441f6d5dSScott Long } __packed;
1082441f6d5dSScott Long 
1083441f6d5dSScott Long union mfi_pd_ddf_type {
1084441f6d5dSScott Long 	struct {
1085441f6d5dSScott Long 		union {
1086441f6d5dSScott Long 			struct {
1087441f6d5dSScott Long 				uint16_t	forced_pd_guid	: 1;
1088441f6d5dSScott Long 				uint16_t	in_vd		: 1;
1089441f6d5dSScott Long 				uint16_t	is_global_spare	: 1;
1090441f6d5dSScott Long 				uint16_t	is_spare	: 1;
1091441f6d5dSScott Long 				uint16_t	is_foreign	: 1;
1092441f6d5dSScott Long 				uint16_t	reserved	: 7;
1093441f6d5dSScott Long 				uint16_t	intf		: 4;
1094441f6d5dSScott Long 			} pd_type;
1095441f6d5dSScott Long 			uint16_t	type;
1096441f6d5dSScott Long 		} v;
1097441f6d5dSScott Long 		uint16_t		reserved;
1098441f6d5dSScott Long 	} ddf;
1099441f6d5dSScott Long 	struct {
1100441f6d5dSScott Long 		uint32_t		reserved;
1101441f6d5dSScott Long 	} non_disk;
1102441f6d5dSScott Long 	uint32_t			type;
1103441f6d5dSScott Long } __packed;
1104441f6d5dSScott Long 
1105441f6d5dSScott Long struct mfi_pd_progress {
1106763fae79SScott Long 	uint32_t			active;
1107763fae79SScott Long #define	MFI_PD_PROGRESS_REBUILD	(1<<0)
1108763fae79SScott Long #define	MFI_PD_PROGRESS_PATROL	(1<<1)
1109763fae79SScott Long #define	MFI_PD_PROGRESS_CLEAR	(1<<2)
1110441f6d5dSScott Long 	struct mfi_progress		rbld;
1111441f6d5dSScott Long 	struct mfi_progress		patrol;
1112441f6d5dSScott Long 	struct mfi_progress		clear;
1113441f6d5dSScott Long 	struct mfi_progress		reserved[4];
1114441f6d5dSScott Long } __packed;
1115441f6d5dSScott Long 
1116441f6d5dSScott Long struct mfi_pd_info {
1117441f6d5dSScott Long 	union mfi_pd_ref		ref;
1118441f6d5dSScott Long 	uint8_t				inquiry_data[96];
1119441f6d5dSScott Long 	uint8_t				vpd_page83[64];
1120441f6d5dSScott Long 	uint8_t				not_supported;
1121441f6d5dSScott Long 	uint8_t				scsi_dev_type;
1122441f6d5dSScott Long 	uint8_t				connected_port_bitmap;
1123441f6d5dSScott Long 	uint8_t				device_speed;
1124441f6d5dSScott Long 	uint32_t			media_err_count;
1125441f6d5dSScott Long 	uint32_t			other_err_count;
1126441f6d5dSScott Long 	uint32_t			pred_fail_count;
1127441f6d5dSScott Long 	uint32_t			last_pred_fail_event_seq_num;
1128763fae79SScott Long 	uint16_t			fw_state;	/* MFI_PD_STATE_* */
1129763fae79SScott Long 	uint8_t				disabled_for_removal;
1130441f6d5dSScott Long 	uint8_t				link_speed;
1131441f6d5dSScott Long 	union mfi_pd_ddf_type		state;
1132441f6d5dSScott Long 	struct {
1133441f6d5dSScott Long 		uint8_t			count;
1134441f6d5dSScott Long 		uint8_t			is_path_broken;
1135441f6d5dSScott Long 		uint8_t			reserved[6];
1136441f6d5dSScott Long 		uint64_t		sas_addr[4];
1137441f6d5dSScott Long 	} path_info;
1138441f6d5dSScott Long 	uint64_t			raw_size;
1139441f6d5dSScott Long 	uint64_t			non_coerced_size;
1140441f6d5dSScott Long 	uint64_t			coerced_size;
1141441f6d5dSScott Long 	uint16_t			encl_device_id;
1142441f6d5dSScott Long 	uint8_t				encl_index;
1143441f6d5dSScott Long 	uint8_t				slot_number;
1144441f6d5dSScott Long 	struct mfi_pd_progress		prog_info;
1145441f6d5dSScott Long 	uint8_t				bad_block_table_full;
1146441f6d5dSScott Long 	uint8_t				unusable_in_current_config;
1147441f6d5dSScott Long 	uint8_t				vpd_page83_ext[64];
1148441f6d5dSScott Long 	uint8_t				reserved[512-358];
1149441f6d5dSScott Long } __packed;
1150441f6d5dSScott Long 
1151441f6d5dSScott Long struct mfi_pd_address {
1152441f6d5dSScott Long 	uint16_t		device_id;
1153441f6d5dSScott Long 	uint16_t		encl_device_id;
1154441f6d5dSScott Long 	uint8_t			encl_index;
1155441f6d5dSScott Long 	uint8_t			slot_number;
1156763fae79SScott Long 	uint8_t			scsi_dev_type;	/* 0 = disk */
1157441f6d5dSScott Long 	uint8_t			connect_port_bitmap;
1158441f6d5dSScott Long 	uint64_t		sas_addr[2];
1159441f6d5dSScott Long } __packed;
1160441f6d5dSScott Long 
11610d9a4ef3SDoug Ambrisko #define MAX_SYS_PDS 240
1162441f6d5dSScott Long struct mfi_pd_list {
1163441f6d5dSScott Long 	uint32_t		size;
1164441f6d5dSScott Long 	uint32_t		count;
11650d9a4ef3SDoug Ambrisko 	struct mfi_pd_address	addr[MAX_SYS_PDS];
1166441f6d5dSScott Long } __packed;
1167441f6d5dSScott Long 
1168763fae79SScott Long enum mfi_pd_state {
1169763fae79SScott Long 	MFI_PD_STATE_UNCONFIGURED_GOOD = 0x00,
1170763fae79SScott Long 	MFI_PD_STATE_UNCONFIGURED_BAD = 0x01,
1171763fae79SScott Long 	MFI_PD_STATE_HOT_SPARE = 0x02,
1172763fae79SScott Long 	MFI_PD_STATE_OFFLINE = 0x10,
1173763fae79SScott Long 	MFI_PD_STATE_FAILED = 0x11,
1174763fae79SScott Long 	MFI_PD_STATE_REBUILD = 0x14,
1175d63e9da3SSergey Kandaurov 	MFI_PD_STATE_ONLINE = 0x18,
1176d63e9da3SSergey Kandaurov 	MFI_PD_STATE_COPYBACK = 0x20,
1177d63e9da3SSergey Kandaurov 	MFI_PD_STATE_SYSTEM = 0x40
1178763fae79SScott Long };
1179763fae79SScott Long 
1180a6ba0fd6SDoug Ambrisko /*
1181a6ba0fd6SDoug Ambrisko  * "SYSTEM" disk appears to be "JBOD" support from the RAID controller.
1182a6ba0fd6SDoug Ambrisko  * Adding a #define to denote this.
1183a6ba0fd6SDoug Ambrisko  */
1184a6ba0fd6SDoug Ambrisko #define MFI_PD_STATE_JBOD MFI_PD_STATE_SYSTEM
1185a6ba0fd6SDoug Ambrisko 
1186441f6d5dSScott Long union mfi_ld_ref {
1187441f6d5dSScott Long 	struct {
1188c0b332d1SPaul Saab 		uint8_t		target_id;
1189c0b332d1SPaul Saab 		uint8_t		reserved;
1190c0b332d1SPaul Saab 		uint16_t	seq;
1191441f6d5dSScott Long 	} v;
1192441f6d5dSScott Long 	uint32_t		ref;
1193c0b332d1SPaul Saab } __packed;
1194c0b332d1SPaul Saab 
1195c0b332d1SPaul Saab struct mfi_ld_list {
1196c0b332d1SPaul Saab 	uint32_t		ld_count;
1197c0b332d1SPaul Saab 	uint32_t		reserved1;
1198c0b332d1SPaul Saab 	struct {
1199441f6d5dSScott Long 		union mfi_ld_ref	ld;
1200c0b332d1SPaul Saab 		uint8_t		state;
1201c0b332d1SPaul Saab 		uint8_t		reserved2[3];
1202c0b332d1SPaul Saab 		uint64_t	size;
1203c0b332d1SPaul Saab 	} ld_list[MFI_MAX_LD];
1204c0b332d1SPaul Saab } __packed;
1205c0b332d1SPaul Saab 
1206c0b332d1SPaul Saab enum mfi_ld_access {
1207c0b332d1SPaul Saab 	MFI_LD_ACCESS_RW =	0,
1208c0b332d1SPaul Saab 	MFI_LD_ACCSSS_RO = 	2,
1209c0b332d1SPaul Saab 	MFI_LD_ACCESS_BLOCKED =	3,
1210c0b332d1SPaul Saab };
1211c0b332d1SPaul Saab #define MFI_LD_ACCESS_MASK	3
1212c0b332d1SPaul Saab 
1213c0b332d1SPaul Saab enum mfi_ld_state {
1214c0b332d1SPaul Saab 	MFI_LD_STATE_OFFLINE =			0,
1215c0b332d1SPaul Saab 	MFI_LD_STATE_PARTIALLY_DEGRADED =	1,
1216c0b332d1SPaul Saab 	MFI_LD_STATE_DEGRADED =			2,
1217c0b332d1SPaul Saab 	MFI_LD_STATE_OPTIMAL =			3
1218c0b332d1SPaul Saab };
1219c0b332d1SPaul Saab 
1220c0b332d1SPaul Saab struct mfi_ld_props {
1221441f6d5dSScott Long 	union mfi_ld_ref	ld;
1222c0b332d1SPaul Saab 	char			name[16];
1223c0b332d1SPaul Saab 	uint8_t			default_cache_policy;
1224c0b332d1SPaul Saab 	uint8_t			access_policy;
1225c0b332d1SPaul Saab 	uint8_t			disk_cache_policy;
1226c0b332d1SPaul Saab 	uint8_t			current_cache_policy;
1227c0b332d1SPaul Saab 	uint8_t			no_bgi;
1228c0b332d1SPaul Saab 	uint8_t			reserved[7];
1229c0b332d1SPaul Saab } __packed;
1230c0b332d1SPaul Saab 
1231c0b332d1SPaul Saab struct mfi_ld_params {
1232c0b332d1SPaul Saab 	uint8_t			primary_raid_level;
1233c0b332d1SPaul Saab 	uint8_t			raid_level_qualifier;
1234c0b332d1SPaul Saab 	uint8_t			secondary_raid_level;
1235c0b332d1SPaul Saab 	uint8_t			stripe_size;
1236c0b332d1SPaul Saab 	uint8_t			num_drives;
1237c0b332d1SPaul Saab 	uint8_t			span_depth;
1238c0b332d1SPaul Saab 	uint8_t			state;
1239c0b332d1SPaul Saab 	uint8_t			init_state;
1240763fae79SScott Long #define	MFI_LD_PARAMS_INIT_NO		0
1241763fae79SScott Long #define	MFI_LD_PARAMS_INIT_QUICK	1
1242763fae79SScott Long #define	MFI_LD_PARAMS_INIT_FULL		2
1243c0b332d1SPaul Saab 	uint8_t			is_consistent;
12440d9a4ef3SDoug Ambrisko 	uint8_t			reserved1[6];
12450d9a4ef3SDoug Ambrisko 	uint8_t			isSSCD;
12460d9a4ef3SDoug Ambrisko 	uint8_t			reserved2[16];
1247c0b332d1SPaul Saab } __packed;
1248c0b332d1SPaul Saab 
1249c0b332d1SPaul Saab struct mfi_ld_progress {
1250c0b332d1SPaul Saab 	uint32_t		active;
1251c0b332d1SPaul Saab #define	MFI_LD_PROGRESS_CC	(1<<0)
1252c0b332d1SPaul Saab #define	MFI_LD_PROGRESS_BGI	(1<<1)
1253c0b332d1SPaul Saab #define	MFI_LD_PROGRESS_FGI	(1<<2)
1254763fae79SScott Long #define	MFI_LD_PROGRESS_RECON	(1<<3)
1255c0b332d1SPaul Saab 	struct mfi_progress	cc;
1256c0b332d1SPaul Saab 	struct mfi_progress	bgi;
1257c0b332d1SPaul Saab 	struct mfi_progress	fgi;
1258c0b332d1SPaul Saab 	struct mfi_progress	recon;
1259c0b332d1SPaul Saab 	struct mfi_progress	reserved[4];
1260c0b332d1SPaul Saab } __packed;
1261c0b332d1SPaul Saab 
1262c0b332d1SPaul Saab struct mfi_span {
1263c0b332d1SPaul Saab 	uint64_t		start_block;
1264c0b332d1SPaul Saab 	uint64_t		num_blocks;
1265c0b332d1SPaul Saab 	uint16_t		array_ref;
1266c0b332d1SPaul Saab 	uint8_t			reserved[6];
1267c0b332d1SPaul Saab } __packed;
1268c0b332d1SPaul Saab 
1269c0b332d1SPaul Saab #define	MFI_MAX_SPAN_DEPTH	8
1270c0b332d1SPaul Saab struct mfi_ld_config {
1271c0b332d1SPaul Saab 	struct mfi_ld_props	properties;
1272c0b332d1SPaul Saab 	struct mfi_ld_params	params;
1273c0b332d1SPaul Saab 	struct mfi_span		span[MFI_MAX_SPAN_DEPTH];
1274c0b332d1SPaul Saab } __packed;
1275c0b332d1SPaul Saab 
1276c0b332d1SPaul Saab struct mfi_ld_info {
1277c0b332d1SPaul Saab 	struct mfi_ld_config	ld_config;
1278c0b332d1SPaul Saab 	uint64_t		size;
1279c0b332d1SPaul Saab 	struct mfi_ld_progress	progress;
1280c0b332d1SPaul Saab 	uint16_t		cluster_owner;
1281c0b332d1SPaul Saab 	uint8_t			reconstruct_active;
1282c0b332d1SPaul Saab 	uint8_t			reserved1[1];
1283c0b332d1SPaul Saab 	uint8_t			vpd_page83[64];
1284c0b332d1SPaul Saab 	uint8_t			reserved2[16];
1285c0b332d1SPaul Saab } __packed;
1286c0b332d1SPaul Saab 
1287a6ba0fd6SDoug Ambrisko #define MFI_MAX_ARRAYS 16
1288441f6d5dSScott Long struct mfi_spare {
1289441f6d5dSScott Long 	union mfi_pd_ref	ref;
1290763fae79SScott Long 	uint8_t			spare_type;
1291763fae79SScott Long #define	MFI_SPARE_DEDICATED	(1 << 0)
1292763fae79SScott Long #define	MFI_SPARE_REVERTIBLE	(1 << 1)
1293763fae79SScott Long #define	MFI_SPARE_ENCL_AFFINITY	(1 << 2)
1294441f6d5dSScott Long 	uint8_t			reserved[2];
1295441f6d5dSScott Long 	uint8_t			array_count;
1296a6ba0fd6SDoug Ambrisko 	uint16_t		array_ref[MFI_MAX_ARRAYS];
1297441f6d5dSScott Long } __packed;
1298441f6d5dSScott Long 
1299a6ba0fd6SDoug Ambrisko #define MFI_MAX_ROW_SIZE 32
1300441f6d5dSScott Long struct mfi_array {
1301441f6d5dSScott Long 	uint64_t			size;
1302441f6d5dSScott Long 	uint8_t				num_drives;
1303441f6d5dSScott Long 	uint8_t				reserved;
1304441f6d5dSScott Long 	uint16_t			array_ref;
1305441f6d5dSScott Long 	uint8_t				pad[20];
1306441f6d5dSScott Long 	struct {
1307763fae79SScott Long 		union mfi_pd_ref	ref;	/* 0xffff == missing drive */
1308763fae79SScott Long 		uint16_t		fw_state;	/* MFI_PD_STATE_* */
1309441f6d5dSScott Long 		struct {
1310441f6d5dSScott Long 			uint8_t		pd;
1311441f6d5dSScott Long 			uint8_t		slot;
1312441f6d5dSScott Long 		} encl;
1313a6ba0fd6SDoug Ambrisko 	} pd[MFI_MAX_ROW_SIZE];
1314441f6d5dSScott Long } __packed;
1315441f6d5dSScott Long 
1316441f6d5dSScott Long struct mfi_config_data {
1317441f6d5dSScott Long 	uint32_t		size;
1318441f6d5dSScott Long 	uint16_t		array_count;
1319441f6d5dSScott Long 	uint16_t		array_size;
1320441f6d5dSScott Long 	uint16_t		log_drv_count;
1321441f6d5dSScott Long 	uint16_t		log_drv_size;
1322441f6d5dSScott Long 	uint16_t		spares_count;
1323441f6d5dSScott Long 	uint16_t		spares_size;
1324441f6d5dSScott Long 	uint8_t			reserved[16];
1325763fae79SScott Long 	struct mfi_array	array[0];
1326763fae79SScott Long 	struct mfi_ld_config	ld[0];
1327763fae79SScott Long 	struct mfi_spare	spare[0];
1328441f6d5dSScott Long } __packed;
1329441f6d5dSScott Long 
1330763fae79SScott Long struct mfi_bbu_capacity_info {
1331763fae79SScott Long 	uint16_t		relative_charge;
1332763fae79SScott Long 	uint16_t		absolute_charge;
1333763fae79SScott Long 	uint16_t		remaining_capacity;
1334763fae79SScott Long 	uint16_t		full_charge_capacity;
1335763fae79SScott Long 	uint16_t		run_time_to_empty;
1336763fae79SScott Long 	uint16_t		average_time_to_empty;
1337763fae79SScott Long 	uint16_t		average_time_to_full;
1338763fae79SScott Long 	uint16_t		cycle_count;
1339763fae79SScott Long 	uint16_t		max_error;
1340763fae79SScott Long 	uint16_t		remaining_capacity_alarm;
1341763fae79SScott Long 	uint16_t		remaining_time_alarm;
1342763fae79SScott Long 	uint8_t			reserved[26];
1343763fae79SScott Long } __packed;
1344763fae79SScott Long 
1345763fae79SScott Long struct mfi_bbu_design_info {
1346763fae79SScott Long 	uint32_t		mfg_date;
1347763fae79SScott Long 	uint16_t		design_capacity;
1348763fae79SScott Long 	uint16_t		design_voltage;
1349763fae79SScott Long 	uint16_t		spec_info;
1350763fae79SScott Long 	uint16_t		serial_number;
1351763fae79SScott Long 	uint16_t		pack_stat_config;
1352763fae79SScott Long 	uint8_t			mfg_name[12];
1353763fae79SScott Long 	uint8_t			device_name[8];
1354763fae79SScott Long 	uint8_t			device_chemistry[8];
1355763fae79SScott Long 	uint8_t			mfg_data[8];
1356763fae79SScott Long 	uint8_t			reserved[17];
1357763fae79SScott Long } __packed;
1358763fae79SScott Long 
1359763fae79SScott Long struct mfi_ibbu_state {
1360763fae79SScott Long 	uint16_t		gas_guage_status;
1361763fae79SScott Long 	uint16_t		relative_charge;
1362763fae79SScott Long 	uint16_t		charger_system_state;
1363763fae79SScott Long 	uint16_t		charger_system_ctrl;
1364763fae79SScott Long 	uint16_t		charging_current;
1365763fae79SScott Long 	uint16_t		absolute_charge;
1366763fae79SScott Long 	uint16_t		max_error;
1367763fae79SScott Long 	uint8_t			reserved[18];
1368763fae79SScott Long } __packed;
1369763fae79SScott Long 
1370763fae79SScott Long struct mfi_bbu_state {
1371763fae79SScott Long 	uint16_t		gas_guage_status;
1372763fae79SScott Long 	uint16_t		relative_charge;
1373763fae79SScott Long 	uint16_t		charger_status;
1374763fae79SScott Long 	uint16_t		remaining_capacity;
1375763fae79SScott Long 	uint16_t		full_charge_capacity;
1376763fae79SScott Long 	uint8_t			is_SOH_good;
1377763fae79SScott Long 	uint8_t			reserved[21];
1378763fae79SScott Long } __packed;
1379763fae79SScott Long 
1380dee3e845SMark Johnston struct mfi_bbu_properties {
1381dee3e845SMark Johnston 	uint32_t		auto_learn_period;
1382dee3e845SMark Johnston 	uint32_t		next_learn_time;
1383dee3e845SMark Johnston 	uint8_t			learn_delay_interval;
1384dee3e845SMark Johnston 	uint8_t			auto_learn_mode;
1385dee3e845SMark Johnston 	uint8_t			bbu_mode;
1386dee3e845SMark Johnston 	uint8_t			reserved[21];
1387dee3e845SMark Johnston } __packed;
1388dee3e845SMark Johnston 
1389763fae79SScott Long union mfi_bbu_status_detail {
1390763fae79SScott Long 	struct mfi_ibbu_state	ibbu;
1391763fae79SScott Long 	struct mfi_bbu_state	bbu;
1392763fae79SScott Long };
1393763fae79SScott Long 
1394763fae79SScott Long struct mfi_bbu_status {
1395763fae79SScott Long 	uint8_t			battery_type;
1396763fae79SScott Long #define	MFI_BBU_TYPE_NONE	0
1397763fae79SScott Long #define	MFI_BBU_TYPE_IBBU	1
1398763fae79SScott Long #define	MFI_BBU_TYPE_BBU	2
1399763fae79SScott Long 	uint8_t			reserved;
1400763fae79SScott Long 	uint16_t		voltage;
1401763fae79SScott Long 	int16_t			current;
1402763fae79SScott Long 	uint16_t		temperature;
1403763fae79SScott Long 	uint32_t		fw_status;
1404763fae79SScott Long #define	MFI_BBU_STATE_PACK_MISSING	(1 << 0)
1405763fae79SScott Long #define	MFI_BBU_STATE_VOLTAGE_LOW	(1 << 1)
1406763fae79SScott Long #define	MFI_BBU_STATE_TEMPERATURE_HIGH	(1 << 2)
1407c1def54fSSean Bruno #define	MFI_BBU_STATE_CHARGE_ACTIVE	(1 << 3)
1408c1def54fSSean Bruno #define	MFI_BBU_STATE_DISCHARGE_ACTIVE	(1 << 4)
1409c1def54fSSean Bruno #define	MFI_BBU_STATE_LEARN_CYC_REQ	(1 << 5)
1410c1def54fSSean Bruno #define	MFI_BBU_STATE_LEARN_CYC_ACTIVE	(1 << 6)
1411c1def54fSSean Bruno #define	MFI_BBU_STATE_LEARN_CYC_FAIL	(1 << 7)
1412c1def54fSSean Bruno #define	MFI_BBU_STATE_LEARN_CYC_TIMEOUT	(1 << 8)
1413c1def54fSSean Bruno #define	MFI_BBU_STATE_I2C_ERR_DETECT	(1 << 9)
1414763fae79SScott Long 	uint8_t			pad[20];
1415763fae79SScott Long 	union mfi_bbu_status_detail detail;
1416763fae79SScott Long } __packed;
1417763fae79SScott Long 
1418763fae79SScott Long enum mfi_pr_state {
1419763fae79SScott Long 	MFI_PR_STATE_STOPPED = 0,
1420763fae79SScott Long 	MFI_PR_STATE_READY = 1,
1421763fae79SScott Long 	MFI_PR_STATE_ACTIVE = 2,
1422763fae79SScott Long 	MFI_PR_STATE_ABORTED = 0xff
1423763fae79SScott Long };
1424763fae79SScott Long 
1425763fae79SScott Long struct mfi_pr_status {
1426763fae79SScott Long 	uint32_t		num_iteration;
1427763fae79SScott Long 	uint8_t			state;
1428763fae79SScott Long 	uint8_t			num_pd_done;
1429763fae79SScott Long 	uint8_t			reserved[10];
1430763fae79SScott Long };
1431763fae79SScott Long 
1432763fae79SScott Long enum mfi_pr_opmode {
1433763fae79SScott Long 	MFI_PR_OPMODE_AUTO = 0,
1434763fae79SScott Long 	MFI_PR_OPMODE_MANUAL = 1,
1435763fae79SScott Long 	MFI_PR_OPMODE_DISABLED = 2
1436763fae79SScott Long };
1437763fae79SScott Long 
1438763fae79SScott Long struct mfi_pr_properties {
1439763fae79SScott Long 	uint8_t			op_mode;
1440763fae79SScott Long 	uint8_t			max_pd;
1441763fae79SScott Long 	uint8_t			reserved;
1442763fae79SScott Long 	uint8_t			exclude_ld_count;
1443763fae79SScott Long 	uint16_t		excluded_ld[MFI_MAX_LD];
1444763fae79SScott Long 	uint8_t			cur_pd_map[MFI_MAX_PD / 8];
1445763fae79SScott Long 	uint8_t			last_pd_map[MFI_MAX_PD / 8];
1446763fae79SScott Long 	uint32_t		next_exec;
1447763fae79SScott Long 	uint32_t		exec_freq;
1448763fae79SScott Long 	uint32_t		clear_freq;
1449763fae79SScott Long };
1450763fae79SScott Long 
14510d9a4ef3SDoug Ambrisko /* ThunderBolt support */
14520d9a4ef3SDoug Ambrisko 
14530d9a4ef3SDoug Ambrisko /*
14540d9a4ef3SDoug Ambrisko  * Raid Context structure which describes MegaRAID specific IO Paramenters
14550d9a4ef3SDoug Ambrisko  * This resides at offset 0x60 where the SGL normally starts in MPT IO Frames
14560d9a4ef3SDoug Ambrisko  */
14570d9a4ef3SDoug Ambrisko typedef struct _MPI2_SCSI_IO_VENDOR_UNIQUE {
1458a6ba0fd6SDoug Ambrisko 	uint16_t	resvd0;		/* 0x00 - 0x01 */
1459a6ba0fd6SDoug Ambrisko 	uint16_t	timeoutValue;	/* 0x02 - 0x03 */
14600d9a4ef3SDoug Ambrisko 	uint8_t		regLockFlags;
14610d9a4ef3SDoug Ambrisko 	uint8_t		armId;
1462a6ba0fd6SDoug Ambrisko 	uint16_t	TargetID;	/* 0x06 - 0x07 */
14630d9a4ef3SDoug Ambrisko 
1464a6ba0fd6SDoug Ambrisko 	uint64_t	RegLockLBA;	/* 0x08 - 0x0F */
14650d9a4ef3SDoug Ambrisko 
1466a6ba0fd6SDoug Ambrisko 	uint32_t	RegLockLength;	/* 0x10 - 0x13 */
14670d9a4ef3SDoug Ambrisko 
1468a6ba0fd6SDoug Ambrisko 	uint16_t	SMID;		/* 0x14 - 0x15 nextLMId */
1469a6ba0fd6SDoug Ambrisko 	uint8_t		exStatus;	/* 0x16 */
1470a6ba0fd6SDoug Ambrisko 	uint8_t		Status;		/* 0x17 status */
14710d9a4ef3SDoug Ambrisko 
1472a6ba0fd6SDoug Ambrisko 	uint8_t		RAIDFlags;	/* 0x18 */
1473a6ba0fd6SDoug Ambrisko 	uint8_t		numSGE;		/* 0x19 numSge */
1474a6ba0fd6SDoug Ambrisko 	uint16_t	configSeqNum;	/* 0x1A - 0x1B */
1475a6ba0fd6SDoug Ambrisko 	uint8_t		spanArm;	/* 0x1C */
1476a6ba0fd6SDoug Ambrisko 	uint8_t		resvd2[3];	/* 0x1D - 0x1F */
14770d9a4ef3SDoug Ambrisko } MPI2_SCSI_IO_VENDOR_UNIQUE, MPI25_SCSI_IO_VENDOR_UNIQUE;
14780d9a4ef3SDoug Ambrisko 
14790d9a4ef3SDoug Ambrisko /*****************************************************************************
14800d9a4ef3SDoug Ambrisko *
14810d9a4ef3SDoug Ambrisko *        Message Functions
14820d9a4ef3SDoug Ambrisko *
14830d9a4ef3SDoug Ambrisko *****************************************************************************/
14840d9a4ef3SDoug Ambrisko 
14850d9a4ef3SDoug Ambrisko #define NA_MPI2_FUNCTION_SCSI_IO_REQUEST            (0x00) /* SCSI IO */
14860d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_SCSI_TASK_MGMT                (0x01) /* SCSI Task Management */
14870d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_IOC_INIT                      (0x02) /* IOC Init */
14880d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_IOC_FACTS                     (0x03) /* IOC Facts */
14890d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_CONFIG                        (0x04) /* Configuration */
14900d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_PORT_FACTS                    (0x05) /* Port Facts */
14910d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_PORT_ENABLE                   (0x06) /* Port Enable */
14920d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_EVENT_NOTIFICATION            (0x07) /* Event Notification */
14930d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_EVENT_ACK                     (0x08) /* Event Acknowledge */
14940d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_FW_DOWNLOAD                   (0x09) /* FW Download */
14950d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_TARGET_ASSIST                 (0x0B) /* Target Assist */
14960d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_TARGET_STATUS_SEND            (0x0C) /* Target Status Send */
14970d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_TARGET_MODE_ABORT             (0x0D) /* Target Mode Abort */
14980d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_FW_UPLOAD                     (0x12) /* FW Upload */
14990d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_RAID_ACTION                   (0x15) /* RAID Action */
15000d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH      (0x16) /* SCSI IO RAID Passthrough */
15010d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_TOOLBOX                       (0x17) /* Toolbox */
15020d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_SCSI_ENCLOSURE_PROCESSOR      (0x18) /* SCSI Enclosure Processor */
15030d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_SMP_PASSTHROUGH               (0x1A) /* SMP Passthrough */
15040d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_SAS_IO_UNIT_CONTROL           (0x1B) /* SAS IO Unit Control */
15050d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_SATA_PASSTHROUGH              (0x1C) /* SATA Passthrough */
15060d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_DIAG_BUFFER_POST              (0x1D) /* Diagnostic Buffer Post */
15070d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_DIAG_RELEASE                  (0x1E) /* Diagnostic Release */
15080d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_TARGET_CMD_BUF_BASE_POST      (0x24) /* Target Command Buffer Post Base */
15090d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_TARGET_CMD_BUF_LIST_POST      (0x25) /* Target Command Buffer Post List */
15100d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_RAID_ACCELERATOR              (0x2C) /* RAID Accelerator */
15110d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_HOST_BASED_DISCOVERY_ACTION   (0x2F) /* Host Based Discovery Action */
15120d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_PWR_MGMT_CONTROL              (0x30) /* Power Management Control */
15130d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_MIN_PRODUCT_SPECIFIC          (0xF0) /* beginning of product-specific range */
15140d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_MAX_PRODUCT_SPECIFIC          (0xFF) /* end of product-specific range */
15150d9a4ef3SDoug Ambrisko 
15160d9a4ef3SDoug Ambrisko /* Doorbell functions */
15170d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET        (0x40)
15180d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_HANDSHAKE                     (0x42)
15190d9a4ef3SDoug Ambrisko 
15200d9a4ef3SDoug Ambrisko /*****************************************************************************
15210d9a4ef3SDoug Ambrisko *
15220d9a4ef3SDoug Ambrisko *        MPI Version Definitions
15230d9a4ef3SDoug Ambrisko *
15240d9a4ef3SDoug Ambrisko *****************************************************************************/
15250d9a4ef3SDoug Ambrisko 
15260d9a4ef3SDoug Ambrisko #define MPI2_VERSION_MAJOR                  (0x02)
15270d9a4ef3SDoug Ambrisko #define MPI2_VERSION_MINOR                  (0x00)
15280d9a4ef3SDoug Ambrisko #define MPI2_VERSION_MAJOR_MASK             (0xFF00)
15290d9a4ef3SDoug Ambrisko #define MPI2_VERSION_MAJOR_SHIFT            (8)
15300d9a4ef3SDoug Ambrisko #define MPI2_VERSION_MINOR_MASK             (0x00FF)
15310d9a4ef3SDoug Ambrisko #define MPI2_VERSION_MINOR_SHIFT            (0)
15320d9a4ef3SDoug Ambrisko #define MPI2_VERSION ((MPI2_VERSION_MAJOR << MPI2_VERSION_MAJOR_SHIFT) |   \
15330d9a4ef3SDoug Ambrisko                                       MPI2_VERSION_MINOR)
15340d9a4ef3SDoug Ambrisko 
15350d9a4ef3SDoug Ambrisko #define MPI2_VERSION_02_00                  (0x0200)
15360d9a4ef3SDoug Ambrisko 
15370d9a4ef3SDoug Ambrisko /* versioning for this MPI header set */
15380d9a4ef3SDoug Ambrisko #define MPI2_HEADER_VERSION_UNIT            (0x10)
15390d9a4ef3SDoug Ambrisko #define MPI2_HEADER_VERSION_DEV             (0x00)
15400d9a4ef3SDoug Ambrisko #define MPI2_HEADER_VERSION_UNIT_MASK       (0xFF00)
15410d9a4ef3SDoug Ambrisko #define MPI2_HEADER_VERSION_UNIT_SHIFT      (8)
15420d9a4ef3SDoug Ambrisko #define MPI2_HEADER_VERSION_DEV_MASK        (0x00FF)
15430d9a4ef3SDoug Ambrisko #define MPI2_HEADER_VERSION_DEV_SHIFT       (0)
1544a6ba0fd6SDoug Ambrisko #define MPI2_HEADER_VERSION ((MPI2_HEADER_VERSION_UNIT << 8) |		\
1545a6ba0fd6SDoug Ambrisko 					MPI2_HEADER_VERSION_DEV)
15460d9a4ef3SDoug Ambrisko 
15470d9a4ef3SDoug Ambrisko /* IOCInit Request message */
1548a6ba0fd6SDoug Ambrisko struct MPI2_IOC_INIT_REQUEST {
15490d9a4ef3SDoug Ambrisko 	uint8_t		WhoInit;                        /* 0x00 */
15500d9a4ef3SDoug Ambrisko 	uint8_t		Reserved1;                      /* 0x01 */
15510d9a4ef3SDoug Ambrisko 	uint8_t		ChainOffset;                    /* 0x02 */
15520d9a4ef3SDoug Ambrisko 	uint8_t		Function;                       /* 0x03 */
15530d9a4ef3SDoug Ambrisko 	uint16_t	Reserved2;                      /* 0x04 */
15540d9a4ef3SDoug Ambrisko 	uint8_t		Reserved3;                      /* 0x06 */
15550d9a4ef3SDoug Ambrisko 	uint8_t		MsgFlags;                       /* 0x07 */
15560d9a4ef3SDoug Ambrisko 	uint8_t		VP_ID;                          /* 0x08 */
15570d9a4ef3SDoug Ambrisko 	uint8_t		VF_ID;                          /* 0x09 */
15580d9a4ef3SDoug Ambrisko 	uint16_t	Reserved4;                      /* 0x0A */
15590d9a4ef3SDoug Ambrisko 	uint16_t	MsgVersion;                     /* 0x0C */
15600d9a4ef3SDoug Ambrisko 	uint16_t	HeaderVersion;                  /* 0x0E */
15610d9a4ef3SDoug Ambrisko 	uint32_t	Reserved5;                      /* 0x10 */
15620d9a4ef3SDoug Ambrisko 	uint16_t	Reserved6;                      /* 0x14 */
15630d9a4ef3SDoug Ambrisko 	uint8_t		Reserved7;                      /* 0x16 */
15640d9a4ef3SDoug Ambrisko 	uint8_t		HostMSIxVectors;                /* 0x17 */
15650d9a4ef3SDoug Ambrisko 	uint16_t	Reserved8;                      /* 0x18 */
15660d9a4ef3SDoug Ambrisko 	uint16_t	SystemRequestFrameSize;         /* 0x1A */
15670d9a4ef3SDoug Ambrisko 	uint16_t	ReplyDescriptorPostQueueDepth;  /* 0x1C */
15680d9a4ef3SDoug Ambrisko 	uint16_t	ReplyFreeQueueDepth;            /* 0x1E */
15690d9a4ef3SDoug Ambrisko 	uint32_t	SenseBufferAddressHigh;         /* 0x20 */
15700d9a4ef3SDoug Ambrisko 	uint32_t	SystemReplyAddressHigh;         /* 0x24 */
15710d9a4ef3SDoug Ambrisko 	uint64_t	SystemRequestFrameBaseAddress;  /* 0x28 */
15720d9a4ef3SDoug Ambrisko 	uint64_t	ReplyDescriptorPostQueueAddress;/* 0x30 */
15730d9a4ef3SDoug Ambrisko 	uint64_t	ReplyFreeQueueAddress;          /* 0x38 */
15740d9a4ef3SDoug Ambrisko 	uint64_t	TimeStamp;                      /* 0x40 */
15750d9a4ef3SDoug Ambrisko };
15760d9a4ef3SDoug Ambrisko 
15770d9a4ef3SDoug Ambrisko /* WhoInit values */
15780d9a4ef3SDoug Ambrisko #define MPI2_WHOINIT_NOT_INITIALIZED            (0x00)
15790d9a4ef3SDoug Ambrisko #define MPI2_WHOINIT_SYSTEM_BIOS                (0x01)
15800d9a4ef3SDoug Ambrisko #define MPI2_WHOINIT_ROM_BIOS                   (0x02)
15810d9a4ef3SDoug Ambrisko #define MPI2_WHOINIT_PCI_PEER                   (0x03)
15820d9a4ef3SDoug Ambrisko #define MPI2_WHOINIT_HOST_DRIVER                (0x04)
15830d9a4ef3SDoug Ambrisko #define MPI2_WHOINIT_MANUFACTURER               (0x05)
15840d9a4ef3SDoug Ambrisko 
1585a6ba0fd6SDoug Ambrisko struct MPI2_SGE_CHAIN_UNION {
15860d9a4ef3SDoug Ambrisko 	uint16_t	Length;
15870d9a4ef3SDoug Ambrisko 	uint8_t		NextChainOffset;
15880d9a4ef3SDoug Ambrisko 	uint8_t		Flags;
1589a6ba0fd6SDoug Ambrisko 	union {
15900d9a4ef3SDoug Ambrisko 		uint32_t	Address32;
15910d9a4ef3SDoug Ambrisko 		uint64_t	Address64;
15920d9a4ef3SDoug Ambrisko 	} u;
15930d9a4ef3SDoug Ambrisko };
15940d9a4ef3SDoug Ambrisko 
1595a6ba0fd6SDoug Ambrisko struct MPI2_IEEE_SGE_SIMPLE32 {
15960d9a4ef3SDoug Ambrisko 	uint32_t	Address;
15970d9a4ef3SDoug Ambrisko 	uint32_t	FlagsLength;
15980d9a4ef3SDoug Ambrisko };
15990d9a4ef3SDoug Ambrisko 
1600a6ba0fd6SDoug Ambrisko struct MPI2_IEEE_SGE_SIMPLE64 {
16010d9a4ef3SDoug Ambrisko 	uint64_t	Address;
16020d9a4ef3SDoug Ambrisko 	uint32_t	Length;
16030d9a4ef3SDoug Ambrisko 	uint16_t	Reserved1;
16040d9a4ef3SDoug Ambrisko 	uint8_t		Reserved2;
16050d9a4ef3SDoug Ambrisko 	uint8_t		Flags;
16060d9a4ef3SDoug Ambrisko };
16070d9a4ef3SDoug Ambrisko 
1608a6ba0fd6SDoug Ambrisko typedef union _MPI2_IEEE_SGE_SIMPLE_UNION {
16090d9a4ef3SDoug Ambrisko 	struct MPI2_IEEE_SGE_SIMPLE32	Simple32;
16100d9a4ef3SDoug Ambrisko 	struct MPI2_IEEE_SGE_SIMPLE64	Simple64;
16110d9a4ef3SDoug Ambrisko } MPI2_IEEE_SGE_SIMPLE_UNION;
16120d9a4ef3SDoug Ambrisko 
1613a6ba0fd6SDoug Ambrisko typedef struct _MPI2_SGE_SIMPLE_UNION {
16140d9a4ef3SDoug Ambrisko 	uint32_t	FlagsLength;
1615a6ba0fd6SDoug Ambrisko 	union {
16160d9a4ef3SDoug Ambrisko 		uint32_t	Address32;
16170d9a4ef3SDoug Ambrisko 		uint64_t	Address64;
16180d9a4ef3SDoug Ambrisko 	} u;
16190d9a4ef3SDoug Ambrisko } MPI2_SGE_SIMPLE_UNION;
16200d9a4ef3SDoug Ambrisko 
16210d9a4ef3SDoug Ambrisko /****************************************************************************
16220d9a4ef3SDoug Ambrisko *  IEEE SGE field definitions and masks
16230d9a4ef3SDoug Ambrisko ****************************************************************************/
16240d9a4ef3SDoug Ambrisko 
16250d9a4ef3SDoug Ambrisko /* Flags field bit definitions */
16260d9a4ef3SDoug Ambrisko 
16270d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_ELEMENT_TYPE_MASK   (0x80)
16280d9a4ef3SDoug Ambrisko 
16290d9a4ef3SDoug Ambrisko #define MPI2_IEEE32_SGE_FLAGS_SHIFT             (24)
16300d9a4ef3SDoug Ambrisko 
16310d9a4ef3SDoug Ambrisko #define MPI2_IEEE32_SGE_LENGTH_MASK             (0x00FFFFFF)
16320d9a4ef3SDoug Ambrisko 
16330d9a4ef3SDoug Ambrisko /* Element Type */
16340d9a4ef3SDoug Ambrisko 
16350d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_SIMPLE_ELEMENT      (0x00)
16360d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_CHAIN_ELEMENT       (0x80)
16370d9a4ef3SDoug Ambrisko 
16380d9a4ef3SDoug Ambrisko /* Data Location Address Space */
16390d9a4ef3SDoug Ambrisko 
16400d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_ADDR_MASK           (0x03)
16410d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_SYSTEM_ADDR         (0x00)
16420d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_IOCDDR_ADDR         (0x01)
16430d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_IOCPLB_ADDR         (0x02)
16440d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR      (0x03)
16450d9a4ef3SDoug Ambrisko 
16460d9a4ef3SDoug Ambrisko /* Address Size */
16470d9a4ef3SDoug Ambrisko 
16480d9a4ef3SDoug Ambrisko #define MPI2_SGE_FLAGS_32_BIT_ADDRESSING        (0x00)
16490d9a4ef3SDoug Ambrisko #define MPI2_SGE_FLAGS_64_BIT_ADDRESSING        (0x02)
16500d9a4ef3SDoug Ambrisko 
16510d9a4ef3SDoug Ambrisko /*******************/
16520d9a4ef3SDoug Ambrisko /* SCSI IO Control bits */
16530d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_ADDCDBLEN_MASK      (0xFC000000)
16540d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_ADDCDBLEN_SHIFT     (26)
16550d9a4ef3SDoug Ambrisko 
16560d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_DATADIRECTION_MASK  (0x03000000)
16570d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_NODATATRANSFER      (0x00000000)
16580d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_WRITE               (0x01000000)
16590d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_READ                (0x02000000)
16600d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_BIDIRECTIONAL       (0x03000000)
16610d9a4ef3SDoug Ambrisko 
16620d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_TASKPRI_MASK        (0x00007800)
16630d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_TASKPRI_SHIFT       (11)
16640d9a4ef3SDoug Ambrisko 
16650d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_TASKATTRIBUTE_MASK  (0x00000700)
16660d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_SIMPLEQ             (0x00000000)
16670d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_HEADOFQ             (0x00000100)
16680d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_ORDEREDQ            (0x00000200)
16690d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_ACAQ                (0x00000400)
16700d9a4ef3SDoug Ambrisko 
16710d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_TLR_MASK            (0x000000C0)
16720d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_NO_TLR              (0x00000000)
16730d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_TLR_ON              (0x00000040)
16740d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_TLR_OFF             (0x00000080)
16750d9a4ef3SDoug Ambrisko 
16760d9a4ef3SDoug Ambrisko /*******************/
16770d9a4ef3SDoug Ambrisko 
1678a6ba0fd6SDoug Ambrisko typedef struct {
16790d9a4ef3SDoug Ambrisko 	uint8_t		CDB[20];                    /* 0x00 */
16800d9a4ef3SDoug Ambrisko 	uint32_t	PrimaryReferenceTag;        /* 0x14 */
16810d9a4ef3SDoug Ambrisko 	uint16_t	PrimaryApplicationTag;      /* 0x18 */
16820d9a4ef3SDoug Ambrisko 	uint16_t	PrimaryApplicationTagMask;  /* 0x1A */
16830d9a4ef3SDoug Ambrisko 	uint32_t	TransferLength;             /* 0x1C */
16840d9a4ef3SDoug Ambrisko } MPI2_SCSI_IO_CDB_EEDP32;
16850d9a4ef3SDoug Ambrisko 
1686a6ba0fd6SDoug Ambrisko typedef union _MPI2_IEEE_SGE_CHAIN_UNION {
16870d9a4ef3SDoug Ambrisko 	struct MPI2_IEEE_SGE_SIMPLE32	Chain32;
16880d9a4ef3SDoug Ambrisko 	struct MPI2_IEEE_SGE_SIMPLE64	Chain64;
16890d9a4ef3SDoug Ambrisko } MPI2_IEEE_SGE_CHAIN_UNION;
16900d9a4ef3SDoug Ambrisko 
1691a6ba0fd6SDoug Ambrisko typedef union _MPI2_SIMPLE_SGE_UNION {
16920d9a4ef3SDoug Ambrisko 	MPI2_SGE_SIMPLE_UNION		MpiSimple;
16930d9a4ef3SDoug Ambrisko 	MPI2_IEEE_SGE_SIMPLE_UNION	IeeeSimple;
16940d9a4ef3SDoug Ambrisko } MPI2_SIMPLE_SGE_UNION;
16950d9a4ef3SDoug Ambrisko 
1696a6ba0fd6SDoug Ambrisko typedef union _MPI2_SGE_IO_UNION {
16970d9a4ef3SDoug Ambrisko 	MPI2_SGE_SIMPLE_UNION		MpiSimple;
16980d9a4ef3SDoug Ambrisko 	struct MPI2_SGE_CHAIN_UNION	MpiChain;
16990d9a4ef3SDoug Ambrisko 	MPI2_IEEE_SGE_SIMPLE_UNION	IeeeSimple;
17000d9a4ef3SDoug Ambrisko 	MPI2_IEEE_SGE_CHAIN_UNION	IeeeChain;
17010d9a4ef3SDoug Ambrisko } MPI2_SGE_IO_UNION;
17020d9a4ef3SDoug Ambrisko 
1703a6ba0fd6SDoug Ambrisko typedef union {
17040d9a4ef3SDoug Ambrisko 	uint8_t			CDB32[32];
17050d9a4ef3SDoug Ambrisko 	MPI2_SCSI_IO_CDB_EEDP32	EEDP32;
17060d9a4ef3SDoug Ambrisko 	MPI2_SGE_SIMPLE_UNION	SGE;
17070d9a4ef3SDoug Ambrisko } MPI2_SCSI_IO_CDB_UNION;
17080d9a4ef3SDoug Ambrisko 
17090d9a4ef3SDoug Ambrisko /* MPI 2.5 SGLs */
17100d9a4ef3SDoug Ambrisko 
17110d9a4ef3SDoug Ambrisko #define MPI25_IEEE_SGE_FLAGS_END_OF_LIST        (0x40)
17120d9a4ef3SDoug Ambrisko 
1713a6ba0fd6SDoug Ambrisko typedef struct _MPI25_IEEE_SGE_CHAIN64 {
17140d9a4ef3SDoug Ambrisko 	uint64_t	Address;
17150d9a4ef3SDoug Ambrisko 	uint32_t	Length;
17160d9a4ef3SDoug Ambrisko 	uint16_t	Reserved1;
17170d9a4ef3SDoug Ambrisko 	uint8_t		NextChainOffset;
17180d9a4ef3SDoug Ambrisko 	uint8_t		Flags;
17190d9a4ef3SDoug Ambrisko } MPI25_IEEE_SGE_CHAIN64, *pMpi25IeeeSgeChain64_t;
17200d9a4ef3SDoug Ambrisko 
17210d9a4ef3SDoug Ambrisko /* use MPI2_IEEE_SGE_FLAGS_ defines for the Flags field */
17220d9a4ef3SDoug Ambrisko 
17230d9a4ef3SDoug Ambrisko /********/
17240d9a4ef3SDoug Ambrisko 
17250d9a4ef3SDoug Ambrisko /*
17260d9a4ef3SDoug Ambrisko  * RAID SCSI IO Request Message
17270d9a4ef3SDoug Ambrisko  * Total SGE count will be one less than  _MPI2_SCSI_IO_REQUEST
17280d9a4ef3SDoug Ambrisko  */
1729a6ba0fd6SDoug Ambrisko struct mfi_mpi2_request_raid_scsi_io {
17300d9a4ef3SDoug Ambrisko 	uint16_t		DevHandle;                      /* 0x00 */
17310d9a4ef3SDoug Ambrisko 	uint8_t			ChainOffset;                    /* 0x02 */
17320d9a4ef3SDoug Ambrisko 	uint8_t			Function;                       /* 0x03 */
17330d9a4ef3SDoug Ambrisko 	uint16_t		Reserved1;                      /* 0x04 */
17340d9a4ef3SDoug Ambrisko 	uint8_t			Reserved2;                      /* 0x06 */
17350d9a4ef3SDoug Ambrisko 	uint8_t			MsgFlags;                       /* 0x07 */
17360d9a4ef3SDoug Ambrisko 	uint8_t			VP_ID;                          /* 0x08 */
17370d9a4ef3SDoug Ambrisko 	uint8_t			VF_ID;                          /* 0x09 */
17380d9a4ef3SDoug Ambrisko 	uint16_t		Reserved3;                      /* 0x0A */
17390d9a4ef3SDoug Ambrisko 	uint32_t		SenseBufferLowAddress;          /* 0x0C */
17400d9a4ef3SDoug Ambrisko 	uint16_t		SGLFlags;                       /* 0x10 */
17410d9a4ef3SDoug Ambrisko 	uint8_t			SenseBufferLength;              /* 0x12 */
17420d9a4ef3SDoug Ambrisko 	uint8_t			Reserved4;                      /* 0x13 */
17430d9a4ef3SDoug Ambrisko 	uint8_t			SGLOffset0;                     /* 0x14 */
17440d9a4ef3SDoug Ambrisko 	uint8_t			SGLOffset1;                     /* 0x15 */
17450d9a4ef3SDoug Ambrisko 	uint8_t			SGLOffset2;                     /* 0x16 */
17460d9a4ef3SDoug Ambrisko 	uint8_t			SGLOffset3;                     /* 0x17 */
17470d9a4ef3SDoug Ambrisko 	uint32_t		SkipCount;                      /* 0x18 */
17480d9a4ef3SDoug Ambrisko 	uint32_t		DataLength;                     /* 0x1C */
17490d9a4ef3SDoug Ambrisko 	uint32_t		BidirectionalDataLength;        /* 0x20 */
17500d9a4ef3SDoug Ambrisko 	uint16_t		IoFlags;                        /* 0x24 */
17510d9a4ef3SDoug Ambrisko 	uint16_t		EEDPFlags;                      /* 0x26 */
17520d9a4ef3SDoug Ambrisko 	uint32_t		EEDPBlockSize;                  /* 0x28 */
17530d9a4ef3SDoug Ambrisko 	uint32_t		SecondaryReferenceTag;          /* 0x2C */
17540d9a4ef3SDoug Ambrisko 	uint16_t		SecondaryApplicationTag;        /* 0x30 */
17550d9a4ef3SDoug Ambrisko 	uint16_t		ApplicationTagTranslationMask;  /* 0x32 */
17560d9a4ef3SDoug Ambrisko 	uint8_t			LUN[8];                         /* 0x34 */
17570d9a4ef3SDoug Ambrisko 	uint32_t		Control;                        /* 0x3C */
17580d9a4ef3SDoug Ambrisko 	MPI2_SCSI_IO_CDB_UNION	CDB;                            /* 0x40 */
17590d9a4ef3SDoug Ambrisko 	MPI2_SCSI_IO_VENDOR_UNIQUE	RaidContext;              /* 0x60 */
17600d9a4ef3SDoug Ambrisko 	MPI2_SGE_IO_UNION	SGL;                            /* 0x80 */
17610d9a4ef3SDoug Ambrisko } __packed;
17620d9a4ef3SDoug Ambrisko 
17630d9a4ef3SDoug Ambrisko /*
17640d9a4ef3SDoug Ambrisko  * MPT RAID MFA IO Descriptor.
17650d9a4ef3SDoug Ambrisko  */
17660d9a4ef3SDoug Ambrisko typedef struct _MFI_RAID_MFA_IO_DESCRIPTOR {
17670d9a4ef3SDoug Ambrisko 	uint32_t	RequestFlags : 8;
17680d9a4ef3SDoug Ambrisko 	uint32_t	MessageAddress1 : 24; /* bits 31:8*/
17690d9a4ef3SDoug Ambrisko 	uint32_t	MessageAddress2;      /* bits 61:32 */
17700d9a4ef3SDoug Ambrisko } MFI_RAID_MFA_IO_REQUEST_DESCRIPTOR,*PMFI_RAID_MFA_IO_REQUEST_DESCRIPTOR;
17710d9a4ef3SDoug Ambrisko 
17720d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_header {
17730d9a4ef3SDoug Ambrisko 	uint8_t		RequestFlags;       /* 0x00 */
17740d9a4ef3SDoug Ambrisko 	uint8_t		MSIxIndex;          /* 0x01 */
17750d9a4ef3SDoug Ambrisko 	uint16_t	SMID;               /* 0x02 */
17760d9a4ef3SDoug Ambrisko 	uint16_t	LMID;               /* 0x04 */
17770d9a4ef3SDoug Ambrisko };
17780d9a4ef3SDoug Ambrisko 
17790d9a4ef3SDoug Ambrisko /* defines for the RequestFlags field */
17800d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_TYPE_MASK               (0x0E)
17810d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO                 (0x00)
17820d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_SCSI_TARGET             (0x02)
17830d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY           (0x06)
17840d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE            (0x08)
17850d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_RAID_ACCELERATOR        (0x0A)
17860d9a4ef3SDoug Ambrisko 
17870d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_IOC_FIFO_MARKER (0x01)
17880d9a4ef3SDoug Ambrisko 
17890d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_high_priority {
17900d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_request_header	header;
17910d9a4ef3SDoug Ambrisko 	uint16_t			reserved;
17920d9a4ef3SDoug Ambrisko };
17930d9a4ef3SDoug Ambrisko 
17940d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_scsi_io {
17950d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_request_header	header;
17960d9a4ef3SDoug Ambrisko 	uint16_t			scsi_io_dev_handle;
17970d9a4ef3SDoug Ambrisko };
17980d9a4ef3SDoug Ambrisko 
17990d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_scsi_target {
18000d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_request_header	header;
18010d9a4ef3SDoug Ambrisko 	uint16_t			scsi_target_io_index;
18020d9a4ef3SDoug Ambrisko };
18030d9a4ef3SDoug Ambrisko 
18040d9a4ef3SDoug Ambrisko /* Request Descriptors */
18050d9a4ef3SDoug Ambrisko union mfi_mpi2_request_descriptor {
18060d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_request_header		header;
18070d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_request_high_priority	high_priority;
18080d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_request_scsi_io		scsi_io;
18090d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_request_scsi_target	scsi_target;
18100d9a4ef3SDoug Ambrisko 	uint64_t				words;
18110d9a4ef3SDoug Ambrisko };
18120d9a4ef3SDoug Ambrisko 
18130d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_header {
18140d9a4ef3SDoug Ambrisko 	uint8_t		ReplyFlags;                 /* 0x00 */
18150d9a4ef3SDoug Ambrisko 	uint8_t		MSIxIndex;                  /* 0x01 */
18160d9a4ef3SDoug Ambrisko 	uint16_t	SMID;                       /* 0x02 */
18170d9a4ef3SDoug Ambrisko };
18180d9a4ef3SDoug Ambrisko 
18190d9a4ef3SDoug Ambrisko /* defines for the ReplyFlags field */
18200d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK                   (0x0F)
18210d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_SCSI_IO_SUCCESS             (0x00)
18220d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_ADDRESS_REPLY               (0x01)
18230d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_TARGETASSIST_SUCCESS        (0x02)
18240d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_TARGET_COMMAND_BUFFER       (0x03)
18250d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_RAID_ACCELERATOR_SUCCESS    (0x05)
18260d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_UNUSED                      (0x0F)
18270d9a4ef3SDoug Ambrisko 
18280d9a4ef3SDoug Ambrisko /* values for marking a reply descriptor as unused */
18290d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_UNUSED_WORD0_MARK             (0xFFFFFFFF)
18300d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_UNUSED_WORD1_MARK             (0xFFFFFFFF)
18310d9a4ef3SDoug Ambrisko 
18320d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_default {
18330d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_reply_header	header;
18340d9a4ef3SDoug Ambrisko 	uint32_t			DescriptorTypeDependent2;
18350d9a4ef3SDoug Ambrisko };
18360d9a4ef3SDoug Ambrisko 
18370d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_address {
18380d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_reply_header	header;
18390d9a4ef3SDoug Ambrisko 	uint32_t			ReplyFrameAddress;
18400d9a4ef3SDoug Ambrisko };
18410d9a4ef3SDoug Ambrisko 
18420d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_scsi_io {
18430d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_reply_header	header;
18440d9a4ef3SDoug Ambrisko 	uint16_t			TaskTag;		/* 0x04 */
18450d9a4ef3SDoug Ambrisko 	uint16_t			Reserved1;		/* 0x06 */
18460d9a4ef3SDoug Ambrisko };
18470d9a4ef3SDoug Ambrisko 
18480d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_target_assist {
18490d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_reply_header	header;
18500d9a4ef3SDoug Ambrisko 	uint8_t				SequenceNumber;		/* 0x04 */
18510d9a4ef3SDoug Ambrisko 	uint8_t				Reserved1;		/* 0x04 */
18520d9a4ef3SDoug Ambrisko 	uint16_t			IoIndex;		/* 0x06 */
18530d9a4ef3SDoug Ambrisko };
18540d9a4ef3SDoug Ambrisko 
18550d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_target_cmd_buffer {
18560d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_reply_header	header;
18570d9a4ef3SDoug Ambrisko 	uint8_t				SequenceNumber;		/* 0x04 */
18580d9a4ef3SDoug Ambrisko 	uint8_t				Flags;			/* 0x04 */
18590d9a4ef3SDoug Ambrisko 	uint16_t			InitiatorDevHandle;	/* 0x06 */
18600d9a4ef3SDoug Ambrisko 	uint16_t			IoIndex;		/* 0x06 */
18610d9a4ef3SDoug Ambrisko };
18620d9a4ef3SDoug Ambrisko 
18630d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_raid_accel {
18640d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_reply_header	header;
18650d9a4ef3SDoug Ambrisko 	uint8_t				SequenceNumber;		/* 0x04 */
18660d9a4ef3SDoug Ambrisko 	uint32_t			Reserved;		/* 0x04 */
18670d9a4ef3SDoug Ambrisko };
18680d9a4ef3SDoug Ambrisko 
18690d9a4ef3SDoug Ambrisko /* union of Reply Descriptors */
1870a6ba0fd6SDoug Ambrisko union mfi_mpi2_reply_descriptor {
18710d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_reply_header		header;
18720d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_reply_scsi_io		scsi_io;
18730d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_reply_target_assist	target_assist;
18740d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_reply_target_cmd_buffer	target_cmd;
18750d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_reply_raid_accel	raid_accel;
18760d9a4ef3SDoug Ambrisko 	struct mfi_mpi2_reply_default		reply_default;
18770d9a4ef3SDoug Ambrisko 	uint64_t				words;
18780d9a4ef3SDoug Ambrisko };
18790d9a4ef3SDoug Ambrisko 
18800d9a4ef3SDoug Ambrisko struct IO_REQUEST_INFO {
18810d9a4ef3SDoug Ambrisko 	uint64_t	ldStartBlock;
18820d9a4ef3SDoug Ambrisko 	uint32_t	numBlocks;
18830d9a4ef3SDoug Ambrisko 	uint16_t	ldTgtId;
18840d9a4ef3SDoug Ambrisko 	uint8_t		isRead;
18850d9a4ef3SDoug Ambrisko 	uint16_t	devHandle;
18860d9a4ef3SDoug Ambrisko 	uint64_t	pdBlock;
18870d9a4ef3SDoug Ambrisko 	uint8_t		fpOkForIo;
18880d9a4ef3SDoug Ambrisko };
18890d9a4ef3SDoug Ambrisko 
189035ef86f2SScott Long #define MFI_SCSI_MAX_TARGETS	128
189135ef86f2SScott Long #define MFI_SCSI_MAX_LUNS	8
189235ef86f2SScott Long #define MFI_SCSI_INITIATOR_ID	255
189335ef86f2SScott Long #define MFI_SCSI_MAX_CMDS	8
189435ef86f2SScott Long #define MFI_SCSI_MAX_CDB_LEN	16
189535ef86f2SScott Long 
18962e21a3efSScott Long #endif /* _MFIREG_H */
1897