12e21a3efSScott Long /*- 22e21a3efSScott Long * Copyright (c) 2006 IronPort Systems 32e21a3efSScott Long * All rights reserved. 42e21a3efSScott Long * 52e21a3efSScott Long * Redistribution and use in source and binary forms, with or without 62e21a3efSScott Long * modification, are permitted provided that the following conditions 72e21a3efSScott Long * are met: 82e21a3efSScott Long * 1. Redistributions of source code must retain the above copyright 92e21a3efSScott Long * notice, this list of conditions and the following disclaimer. 102e21a3efSScott Long * 2. Redistributions in binary form must reproduce the above copyright 112e21a3efSScott Long * notice, this list of conditions and the following disclaimer in the 122e21a3efSScott Long * documentation and/or other materials provided with the distribution. 132e21a3efSScott Long * 142e21a3efSScott Long * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 152e21a3efSScott Long * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 162e21a3efSScott Long * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 172e21a3efSScott Long * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 182e21a3efSScott Long * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 192e21a3efSScott Long * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 202e21a3efSScott Long * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 212e21a3efSScott Long * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 222e21a3efSScott Long * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 232e21a3efSScott Long * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 242e21a3efSScott Long * SUCH DAMAGE. 252e21a3efSScott Long */ 26610f2ef3SScott Long /*- 27610f2ef3SScott Long * Copyright (c) 2007 LSI Corp. 28610f2ef3SScott Long * Copyright (c) 2007 Rajesh Prabhakaran. 29610f2ef3SScott Long * All rights reserved. 30610f2ef3SScott Long * 31610f2ef3SScott Long * Redistribution and use in source and binary forms, with or without 32610f2ef3SScott Long * modification, are permitted provided that the following conditions 33610f2ef3SScott Long * are met: 34610f2ef3SScott Long * 1. Redistributions of source code must retain the above copyright 35610f2ef3SScott Long * notice, this list of conditions and the following disclaimer. 36610f2ef3SScott Long * 2. Redistributions in binary form must reproduce the above copyright 37610f2ef3SScott Long * notice, this list of conditions and the following disclaimer in the 38610f2ef3SScott Long * documentation and/or other materials provided with the distribution. 39610f2ef3SScott Long * 40610f2ef3SScott Long * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 41610f2ef3SScott Long * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42610f2ef3SScott Long * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43610f2ef3SScott Long * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 44610f2ef3SScott Long * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 45610f2ef3SScott Long * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 46610f2ef3SScott Long * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47610f2ef3SScott Long * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 48610f2ef3SScott Long * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 49610f2ef3SScott Long * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50610f2ef3SScott Long * SUCH DAMAGE. 51610f2ef3SScott Long */ 522e21a3efSScott Long 532e21a3efSScott Long #ifndef _MFIREG_H 542e21a3efSScott Long #define _MFIREG_H 552e21a3efSScott Long 562e21a3efSScott Long #include <sys/cdefs.h> 572e21a3efSScott Long __FBSDID("$FreeBSD$"); 582e21a3efSScott Long 592e21a3efSScott Long /* 602e21a3efSScott Long * MegaRAID SAS MFI firmware definitions 612e21a3efSScott Long * 622e21a3efSScott Long * Calling this driver 'MegaRAID SAS' is a bit misleading. It's a completely 632e21a3efSScott Long * new firmware interface from the old AMI MegaRAID one, and there is no 642e21a3efSScott Long * reason why this interface should be limited to just SAS. In any case, LSI 652e21a3efSScott Long * seems to also call this interface 'MFI', so that will be used here. 662e21a3efSScott Long */ 670d9a4ef3SDoug Ambrisko #define MEGAMFI_FRAME_SIZE 64 682e21a3efSScott Long /* 692e21a3efSScott Long * Start with the register set. All registers are 32 bits wide. 702e21a3efSScott Long * The usual Intel IOP style setup. 712e21a3efSScott Long */ 722e21a3efSScott Long #define MFI_IMSG0 0x10 /* Inbound message 0 */ 732e21a3efSScott Long #define MFI_IMSG1 0x14 /* Inbound message 1 */ 742e21a3efSScott Long #define MFI_OMSG0 0x18 /* Outbound message 0 */ 752e21a3efSScott Long #define MFI_OMSG1 0x1c /* Outbound message 1 */ 762e21a3efSScott Long #define MFI_IDB 0x20 /* Inbound doorbell */ 772e21a3efSScott Long #define MFI_ISTS 0x24 /* Inbound interrupt status */ 782e21a3efSScott Long #define MFI_IMSK 0x28 /* Inbound interrupt mask */ 792e21a3efSScott Long #define MFI_ODB 0x2c /* Outbound doorbell */ 802e21a3efSScott Long #define MFI_OSTS 0x30 /* Outbound interrupt status */ 812e21a3efSScott Long #define MFI_OMSK 0x34 /* Outbound interrupt mask */ 822e21a3efSScott Long #define MFI_IQP 0x40 /* Inbound queue port */ 832e21a3efSScott Long #define MFI_OQP 0x44 /* Outbound queue port */ 842e21a3efSScott Long 85610f2ef3SScott Long /* 860d9a4ef3SDoug Ambrisko * ThunderBolt specific Register 870d9a4ef3SDoug Ambrisko */ 880d9a4ef3SDoug Ambrisko 890d9a4ef3SDoug Ambrisko #define MFI_RPI 0x6c /* reply_post_host_index */ 900d9a4ef3SDoug Ambrisko #define MFI_ILQP 0xc0 /* inbound_low_queue_port */ 910d9a4ef3SDoug Ambrisko #define MFI_IHQP 0xc4 /* inbound_high_queue_port */ 920d9a4ef3SDoug Ambrisko 930d9a4ef3SDoug Ambrisko /* 94610f2ef3SScott Long * 1078 specific related register 95610f2ef3SScott Long */ 96610f2ef3SScott Long #define MFI_ODR0 0x9c /* outbound doorbell register0 */ 97610f2ef3SScott Long #define MFI_ODCR0 0xa0 /* outbound doorbell clear register0 */ 98610f2ef3SScott Long #define MFI_OSP0 0xb0 /* outbound scratch pad0 */ 99610f2ef3SScott Long #define MFI_1078_EIM 0x80000004 /* 1078 enable intrrupt mask */ 100610f2ef3SScott Long #define MFI_RMI 0x2 /* reply message interrupt */ 101610f2ef3SScott Long #define MFI_1078_RM 0x80000000 /* reply 1078 message interrupt */ 102610f2ef3SScott Long #define MFI_ODC 0x4 /* outbound doorbell change interrupt */ 103610f2ef3SScott Long 1040d9a4ef3SDoug Ambrisko /* OCR registers */ 1050d9a4ef3SDoug Ambrisko #define MFI_WSR 0x004 /* write sequence register */ 1060d9a4ef3SDoug Ambrisko #define MFI_HDR 0x008 /* host diagnostic register */ 1070d9a4ef3SDoug Ambrisko #define MFI_RSR 0x3c3 /* Reset Status Register */ 1080d9a4ef3SDoug Ambrisko 109fa1e6ef4SDoug Ambrisko /* 110fa1e6ef4SDoug Ambrisko * GEN2 specific changes 111fa1e6ef4SDoug Ambrisko */ 112fa1e6ef4SDoug Ambrisko #define MFI_GEN2_EIM 0x00000005 /* GEN2 enable interrupt mask */ 113fa1e6ef4SDoug Ambrisko #define MFI_GEN2_RM 0x00000001 /* reply GEN2 message interrupt */ 114fa1e6ef4SDoug Ambrisko 1150d9a4ef3SDoug Ambrisko /* 1160d9a4ef3SDoug Ambrisko * skinny specific changes 1170d9a4ef3SDoug Ambrisko */ 1180d9a4ef3SDoug Ambrisko #define MFI_SKINNY_IDB 0x00 /* Inbound doorbell is at 0x00 for skinny */ 1190d9a4ef3SDoug Ambrisko #define MFI_IQPL 0x000000c0 1200d9a4ef3SDoug Ambrisko #define MFI_IQPH 0x000000c4 1210d9a4ef3SDoug Ambrisko #define MFI_SKINNY_RM 0x00000001 /* reply skinny message interrupt */ 1220d9a4ef3SDoug Ambrisko 1232e21a3efSScott Long /* Bits for MFI_OSTS */ 1242e21a3efSScott Long #define MFI_OSTS_INTR_VALID 0x00000002 1252e21a3efSScott Long 1260d9a4ef3SDoug Ambrisko /* OCR specific flags */ 1270d9a4ef3SDoug Ambrisko #define MFI_FIRMWARE_STATE_CHANGE 0x00000002 1280d9a4ef3SDoug Ambrisko #define MFI_STATE_CHANGE_INTERRUPT 0x00000004 /* MFI state change interrrupt */ 1290d9a4ef3SDoug Ambrisko 1302e21a3efSScott Long /* 1312e21a3efSScott Long * Firmware state values. Found in OMSG0 during initialization. 1322e21a3efSScott Long */ 1332e21a3efSScott Long #define MFI_FWSTATE_MASK 0xf0000000 1342e21a3efSScott Long #define MFI_FWSTATE_UNDEFINED 0x00000000 1352e21a3efSScott Long #define MFI_FWSTATE_BB_INIT 0x10000000 1362e21a3efSScott Long #define MFI_FWSTATE_FW_INIT 0x40000000 1372e21a3efSScott Long #define MFI_FWSTATE_WAIT_HANDSHAKE 0x60000000 1382e21a3efSScott Long #define MFI_FWSTATE_FW_INIT_2 0x70000000 1392e21a3efSScott Long #define MFI_FWSTATE_DEVICE_SCAN 0x80000000 1405dbee633SJohn Baldwin #define MFI_FWSTATE_BOOT_MESSAGE_PENDING 0x90000000 1412e21a3efSScott Long #define MFI_FWSTATE_FLUSH_CACHE 0xa0000000 1422e21a3efSScott Long #define MFI_FWSTATE_READY 0xb0000000 1432e21a3efSScott Long #define MFI_FWSTATE_OPERATIONAL 0xc0000000 1442e21a3efSScott Long #define MFI_FWSTATE_FAULT 0xf0000000 1452e21a3efSScott Long #define MFI_FWSTATE_MAXSGL_MASK 0x00ff0000 1462e21a3efSScott Long #define MFI_FWSTATE_MAXCMD_MASK 0x0000ffff 1470d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_HOSTMEMREQD_MASK 0x08000000 1480d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_BOOT_MESSAGE_PENDING 0x90000000 1490d9a4ef3SDoug Ambrisko #define MFI_RESET_REQUIRED 0x00000001 1502e21a3efSScott Long 151a6ba0fd6SDoug Ambrisko /* ThunderBolt Support */ 1520d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_TB_MASK 0xf0000000 1530d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_TB_RESET 0x00000000 1540d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_TB_READY 0x10000000 1550d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_TB_OPERATIONAL 0x20000000 1560d9a4ef3SDoug Ambrisko #define MFI_FWSTATE_TB_FAULT 0x40000000 1572e21a3efSScott Long 1582e21a3efSScott Long /* 1592e21a3efSScott Long * Control bits to drive the card to ready state. These go into the IDB 1602e21a3efSScott Long * register. 1612e21a3efSScott Long */ 1622e21a3efSScott Long #define MFI_FWINIT_ABORT 0x00000000 /* Abort all pending commands */ 1632e21a3efSScott Long #define MFI_FWINIT_READY 0x00000002 /* Move from operational to ready */ 1642e21a3efSScott Long #define MFI_FWINIT_MFIMODE 0x00000004 /* unknown */ 1652e21a3efSScott Long #define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */ 1665dbee633SJohn Baldwin #define MFI_FWINIT_HOTPLUG 0x00000010 1672e21a3efSScott Long 1680d9a4ef3SDoug Ambrisko /* ADP reset flags */ 1690d9a4ef3SDoug Ambrisko #define MFI_STOP_ADP 0x00000020 1700d9a4ef3SDoug Ambrisko #define MFI_ADP_RESET 0x00000040 1710d9a4ef3SDoug Ambrisko #define DIAG_WRITE_ENABLE 0x00000080 1720d9a4ef3SDoug Ambrisko #define DIAG_RESET_ADAPTER 0x00000004 1730d9a4ef3SDoug Ambrisko 1742e21a3efSScott Long /* MFI Commands */ 1752e21a3efSScott Long typedef enum { 1762e21a3efSScott Long MFI_CMD_INIT = 0x00, 1772e21a3efSScott Long MFI_CMD_LD_READ, 1782e21a3efSScott Long MFI_CMD_LD_WRITE, 1792e21a3efSScott Long MFI_CMD_LD_SCSI_IO, 1802e21a3efSScott Long MFI_CMD_PD_SCSI_IO, 1812e21a3efSScott Long MFI_CMD_DCMD, 1822e21a3efSScott Long MFI_CMD_ABORT, 1832e21a3efSScott Long MFI_CMD_SMP, 1842e21a3efSScott Long MFI_CMD_STP 1852e21a3efSScott Long } mfi_cmd_t; 1862e21a3efSScott Long 1872e21a3efSScott Long /* Direct commands */ 1882e21a3efSScott Long typedef enum { 1892e21a3efSScott Long MFI_DCMD_CTRL_GETINFO = 0x01010000, 1900d9a4ef3SDoug Ambrisko MFI_DCMD_CTRL_MFI_HOST_MEM_ALLOC =0x0100e100, 191441f6d5dSScott Long MFI_DCMD_CTRL_MFC_DEFAULTS_GET =0x010e0201, 192441f6d5dSScott Long MFI_DCMD_CTRL_MFC_DEFAULTS_SET =0x010e0202, 1932e21a3efSScott Long MFI_DCMD_CTRL_FLUSHCACHE = 0x01101000, 1942e21a3efSScott Long MFI_DCMD_CTRL_SHUTDOWN = 0x01050000, 1952e21a3efSScott Long MFI_DCMD_CTRL_EVENT_GETINFO = 0x01040100, 1962e21a3efSScott Long MFI_DCMD_CTRL_EVENT_GET = 0x01040300, 1972e21a3efSScott Long MFI_DCMD_CTRL_EVENT_WAIT = 0x01040500, 198763fae79SScott Long MFI_DCMD_PR_GET_STATUS = 0x01070100, 199763fae79SScott Long MFI_DCMD_PR_GET_PROPERTIES = 0x01070200, 200763fae79SScott Long MFI_DCMD_PR_SET_PROPERTIES = 0x01070300, 201763fae79SScott Long MFI_DCMD_PR_START = 0x01070400, 202763fae79SScott Long MFI_DCMD_PR_STOP = 0x01070500, 203763fae79SScott Long MFI_DCMD_TIME_SECS_GET = 0x01080201, 204763fae79SScott Long MFI_DCMD_FLASH_FW_OPEN = 0x010f0100, 205763fae79SScott Long MFI_DCMD_FLASH_FW_DOWNLOAD = 0x010f0200, 206763fae79SScott Long MFI_DCMD_FLASH_FW_FLASH = 0x010f0300, 207763fae79SScott Long MFI_DCMD_FLASH_FW_CLOSE = 0x010f0400, 208763fae79SScott Long MFI_DCMD_PD_GET_LIST = 0x02010000, 2090d9a4ef3SDoug Ambrisko MFI_DCMD_PD_LIST_QUERY = 0x02010100, 210763fae79SScott Long MFI_DCMD_PD_GET_INFO = 0x02020000, 211763fae79SScott Long MFI_DCMD_PD_STATE_SET = 0x02030100, 212763fae79SScott Long MFI_DCMD_PD_REBUILD_START = 0x02040100, 213763fae79SScott Long MFI_DCMD_PD_REBUILD_ABORT = 0x02040200, 214763fae79SScott Long MFI_DCMD_PD_CLEAR_START = 0x02050100, 215763fae79SScott Long MFI_DCMD_PD_CLEAR_ABORT = 0x02050200, 216763fae79SScott Long MFI_DCMD_PD_GET_PROGRESS = 0x02060000, 217763fae79SScott Long MFI_DCMD_PD_LOCATE_START = 0x02070100, 218763fae79SScott Long MFI_DCMD_PD_LOCATE_STOP = 0x02070200, 2190d9a4ef3SDoug Ambrisko MFI_DCMD_LD_MAP_GET_INFO = 0x0300e101, 2200d9a4ef3SDoug Ambrisko MFI_DCMD_LD_SYNC = 0x0300e102, 221c0b332d1SPaul Saab MFI_DCMD_LD_GET_LIST = 0x03010000, 222c0b332d1SPaul Saab MFI_DCMD_LD_GET_INFO = 0x03020000, 2232e21a3efSScott Long MFI_DCMD_LD_GET_PROP = 0x03030000, 224c0b332d1SPaul Saab MFI_DCMD_LD_SET_PROP = 0x03040000, 225763fae79SScott Long MFI_DCMD_LD_INIT_START = 0x03060100, 2268ec5c98bSJohn Baldwin MFI_DCMD_LD_DELETE = 0x03090000, 227441f6d5dSScott Long MFI_DCMD_CFG_READ = 0x04010000, 228441f6d5dSScott Long MFI_DCMD_CFG_ADD = 0x04020000, 229441f6d5dSScott Long MFI_DCMD_CFG_CLEAR = 0x04030000, 230763fae79SScott Long MFI_DCMD_CFG_MAKE_SPARE = 0x04040000, 231763fae79SScott Long MFI_DCMD_CFG_REMOVE_SPARE = 0x04050000, 232fa1e6ef4SDoug Ambrisko MFI_DCMD_CFG_FOREIGN_IMPORT = 0x04060400, 233763fae79SScott Long MFI_DCMD_BBU_GET_STATUS = 0x05010000, 234763fae79SScott Long MFI_DCMD_BBU_GET_CAPACITY_INFO =0x05020000, 235763fae79SScott Long MFI_DCMD_BBU_GET_DESIGN_INFO = 0x05030000, 2362e21a3efSScott Long MFI_DCMD_CLUSTER = 0x08000000, 2372e21a3efSScott Long MFI_DCMD_CLUSTER_RESET_ALL = 0x08010100, 2382e21a3efSScott Long MFI_DCMD_CLUSTER_RESET_LD = 0x08010200 2392e21a3efSScott Long } mfi_dcmd_t; 2402e21a3efSScott Long 2412e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_FLUSHCACHE */ 2422e21a3efSScott Long #define MFI_FLUSHCACHE_CTRL 0x01 2432e21a3efSScott Long #define MFI_FLUSHCACHE_DISK 0x02 2442e21a3efSScott Long 2452e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_SHUTDOWN */ 2462e21a3efSScott Long #define MFI_SHUTDOWN_SPINDOWN 0x01 2472e21a3efSScott Long 2482e21a3efSScott Long /* 249741367d5SDoug Ambrisko * MFI Frame flags 2502e21a3efSScott Long */ 2512e21a3efSScott Long #define MFI_FRAME_POST_IN_REPLY_QUEUE 0x0000 2522e21a3efSScott Long #define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE 0x0001 2532e21a3efSScott Long #define MFI_FRAME_SGL32 0x0000 2542e21a3efSScott Long #define MFI_FRAME_SGL64 0x0002 2552e21a3efSScott Long #define MFI_FRAME_SENSE32 0x0000 2562e21a3efSScott Long #define MFI_FRAME_SENSE64 0x0004 2572e21a3efSScott Long #define MFI_FRAME_DIR_NONE 0x0000 2582e21a3efSScott Long #define MFI_FRAME_DIR_WRITE 0x0008 2592e21a3efSScott Long #define MFI_FRAME_DIR_READ 0x0010 2602e21a3efSScott Long #define MFI_FRAME_DIR_BOTH 0x0018 2610d9a4ef3SDoug Ambrisko #define MFI_FRAME_IEEE_SGL 0x0020 2620d9a4ef3SDoug Ambrisko 2630d9a4ef3SDoug Ambrisko /* ThunderBolt Specific */ 2640d9a4ef3SDoug Ambrisko 265a6ba0fd6SDoug Ambrisko /* 266a6ba0fd6SDoug Ambrisko * Pre-TB command size and TB command size. 267a6ba0fd6SDoug Ambrisko * We will be checking it at the load time for the time being 268a6ba0fd6SDoug Ambrisko */ 269a6ba0fd6SDoug Ambrisko #define MR_COMMAND_SIZE (MFI_FRAME_SIZE*20) /* 1280 bytes */ 2700d9a4ef3SDoug Ambrisko 2710d9a4ef3SDoug Ambrisko #define MEGASAS_THUNDERBOLT_MSG_ALLIGNMENT 256 272a6ba0fd6SDoug Ambrisko /* 273a6ba0fd6SDoug Ambrisko * We are defining only 128 byte message to reduce memory move over head 274a6ba0fd6SDoug Ambrisko * and also it will reduce the SRB extension size by 128byte compared with 275a6ba0fd6SDoug Ambrisko * 256 message size 276a6ba0fd6SDoug Ambrisko */ 2770d9a4ef3SDoug Ambrisko #define MEGASAS_THUNDERBOLT_NEW_MSG_SIZE 256 2780d9a4ef3SDoug Ambrisko #define MEGASAS_THUNDERBOLT_MAX_COMMANDS 1024 2790d9a4ef3SDoug Ambrisko #define MEGASAS_THUNDERBOLT_MAX_REPLY_COUNT 1024 2800d9a4ef3SDoug Ambrisko #define MEGASAS_THUNDERBOLT_REPLY_SIZE 8 2810d9a4ef3SDoug Ambrisko #define MEGASAS_THUNDERBOLT_MAX_CHAIN_COUNT 1 2820d9a4ef3SDoug Ambrisko #define MEGASAS_MAX_SZ_CHAIN_FRAME 1024 2830d9a4ef3SDoug Ambrisko 2840d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_PASSTHRU_IO_REQUEST 0xF0 2850d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_LD_IO_REQUEST 0xF1 2860d9a4ef3SDoug Ambrisko 2870d9a4ef3SDoug Ambrisko #define MR_INTERNAL_MFI_FRAMES_SMID 1 2880d9a4ef3SDoug Ambrisko #define MR_CTRL_EVENT_WAIT_SMID 2 2890d9a4ef3SDoug Ambrisko #define MR_INTERNAL_DRIVER_RESET_SMID 3 2900d9a4ef3SDoug Ambrisko 2912e21a3efSScott Long 2922e21a3efSScott Long /* MFI Status codes */ 2932e21a3efSScott Long typedef enum { 2942e21a3efSScott Long MFI_STAT_OK = 0x00, 2952e21a3efSScott Long MFI_STAT_INVALID_CMD, 2962e21a3efSScott Long MFI_STAT_INVALID_DCMD, 2972e21a3efSScott Long MFI_STAT_INVALID_PARAMETER, 2982e21a3efSScott Long MFI_STAT_INVALID_SEQUENCE_NUMBER, 2992e21a3efSScott Long MFI_STAT_ABORT_NOT_POSSIBLE, 3002e21a3efSScott Long MFI_STAT_APP_HOST_CODE_NOT_FOUND, 3012e21a3efSScott Long MFI_STAT_APP_IN_USE, 3022e21a3efSScott Long MFI_STAT_APP_NOT_INITIALIZED, 3032e21a3efSScott Long MFI_STAT_ARRAY_INDEX_INVALID, 3042e21a3efSScott Long MFI_STAT_ARRAY_ROW_NOT_EMPTY, 3052e21a3efSScott Long MFI_STAT_CONFIG_RESOURCE_CONFLICT, 3062e21a3efSScott Long MFI_STAT_DEVICE_NOT_FOUND, 3072e21a3efSScott Long MFI_STAT_DRIVE_TOO_SMALL, 3082e21a3efSScott Long MFI_STAT_FLASH_ALLOC_FAIL, 3092e21a3efSScott Long MFI_STAT_FLASH_BUSY, 3102e21a3efSScott Long MFI_STAT_FLASH_ERROR = 0x10, 3112e21a3efSScott Long MFI_STAT_FLASH_IMAGE_BAD, 3122e21a3efSScott Long MFI_STAT_FLASH_IMAGE_INCOMPLETE, 3132e21a3efSScott Long MFI_STAT_FLASH_NOT_OPEN, 3142e21a3efSScott Long MFI_STAT_FLASH_NOT_STARTED, 3152e21a3efSScott Long MFI_STAT_FLUSH_FAILED, 3162e21a3efSScott Long MFI_STAT_HOST_CODE_NOT_FOUNT, 3172e21a3efSScott Long MFI_STAT_LD_CC_IN_PROGRESS, 3182e21a3efSScott Long MFI_STAT_LD_INIT_IN_PROGRESS, 3192e21a3efSScott Long MFI_STAT_LD_LBA_OUT_OF_RANGE, 3202e21a3efSScott Long MFI_STAT_LD_MAX_CONFIGURED, 3212e21a3efSScott Long MFI_STAT_LD_NOT_OPTIMAL, 3222e21a3efSScott Long MFI_STAT_LD_RBLD_IN_PROGRESS, 3232e21a3efSScott Long MFI_STAT_LD_RECON_IN_PROGRESS, 3242e21a3efSScott Long MFI_STAT_LD_WRONG_RAID_LEVEL, 3252e21a3efSScott Long MFI_STAT_MAX_SPARES_EXCEEDED, 3262e21a3efSScott Long MFI_STAT_MEMORY_NOT_AVAILABLE = 0x20, 3272e21a3efSScott Long MFI_STAT_MFC_HW_ERROR, 3282e21a3efSScott Long MFI_STAT_NO_HW_PRESENT, 3292e21a3efSScott Long MFI_STAT_NOT_FOUND, 3302e21a3efSScott Long MFI_STAT_NOT_IN_ENCL, 3312e21a3efSScott Long MFI_STAT_PD_CLEAR_IN_PROGRESS, 3322e21a3efSScott Long MFI_STAT_PD_TYPE_WRONG, 3332e21a3efSScott Long MFI_STAT_PR_DISABLED, 3342e21a3efSScott Long MFI_STAT_ROW_INDEX_INVALID, 3352e21a3efSScott Long MFI_STAT_SAS_CONFIG_INVALID_ACTION, 3362e21a3efSScott Long MFI_STAT_SAS_CONFIG_INVALID_DATA, 3372e21a3efSScott Long MFI_STAT_SAS_CONFIG_INVALID_PAGE, 3382e21a3efSScott Long MFI_STAT_SAS_CONFIG_INVALID_TYPE, 3392e21a3efSScott Long MFI_STAT_SCSI_DONE_WITH_ERROR, 3402e21a3efSScott Long MFI_STAT_SCSI_IO_FAILED, 3412e21a3efSScott Long MFI_STAT_SCSI_RESERVATION_CONFLICT, 3422e21a3efSScott Long MFI_STAT_SHUTDOWN_FAILED = 0x30, 3432e21a3efSScott Long MFI_STAT_TIME_NOT_SET, 3442e21a3efSScott Long MFI_STAT_WRONG_STATE, 3452e21a3efSScott Long MFI_STAT_LD_OFFLINE, 3462e21a3efSScott Long MFI_STAT_PEER_NOTIFICATION_REJECTED, 3472e21a3efSScott Long MFI_STAT_PEER_NOTIFICATION_FAILED, 3482e21a3efSScott Long MFI_STAT_RESERVATION_IN_PROGRESS, 3492e21a3efSScott Long MFI_STAT_I2C_ERRORS_DETECTED, 3502e21a3efSScott Long MFI_STAT_PCI_ERRORS_DETECTED, 351763fae79SScott Long MFI_STAT_DIAG_FAILED, 352763fae79SScott Long MFI_STAT_BOOT_MSG_PENDING, 353763fae79SScott Long MFI_STAT_FOREIGN_CONFIG_INCOMPLETE, 3542e21a3efSScott Long MFI_STAT_INVALID_STATUS = 0xFF 3552e21a3efSScott Long } mfi_status_t; 3562e21a3efSScott Long 3572e21a3efSScott Long typedef enum { 3582e21a3efSScott Long MFI_EVT_CLASS_DEBUG = -2, 3592e21a3efSScott Long MFI_EVT_CLASS_PROGRESS = -1, 3602e21a3efSScott Long MFI_EVT_CLASS_INFO = 0, 3612e21a3efSScott Long MFI_EVT_CLASS_WARNING = 1, 3622e21a3efSScott Long MFI_EVT_CLASS_CRITICAL = 2, 3632e21a3efSScott Long MFI_EVT_CLASS_FATAL = 3, 3642e21a3efSScott Long MFI_EVT_CLASS_DEAD = 4 3652e21a3efSScott Long } mfi_evt_class_t; 3662e21a3efSScott Long 3672e21a3efSScott Long typedef enum { 3682e21a3efSScott Long MFI_EVT_LOCALE_LD = 0x0001, 3692e21a3efSScott Long MFI_EVT_LOCALE_PD = 0x0002, 3702e21a3efSScott Long MFI_EVT_LOCALE_ENCL = 0x0004, 3712e21a3efSScott Long MFI_EVT_LOCALE_BBU = 0x0008, 3722e21a3efSScott Long MFI_EVT_LOCALE_SAS = 0x0010, 3732e21a3efSScott Long MFI_EVT_LOCALE_CTRL = 0x0020, 3742e21a3efSScott Long MFI_EVT_LOCALE_CONFIG = 0x0040, 3752e21a3efSScott Long MFI_EVT_LOCALE_CLUSTER = 0x0080, 3762e21a3efSScott Long MFI_EVT_LOCALE_ALL = 0xffff 3772e21a3efSScott Long } mfi_evt_locale_t; 3782e21a3efSScott Long 3792e21a3efSScott Long typedef enum { 3802e21a3efSScott Long MR_EVT_ARGS_NONE = 0x00, 3812e21a3efSScott Long MR_EVT_ARGS_CDB_SENSE, 3822e21a3efSScott Long MR_EVT_ARGS_LD, 3832e21a3efSScott Long MR_EVT_ARGS_LD_COUNT, 3842e21a3efSScott Long MR_EVT_ARGS_LD_LBA, 3852e21a3efSScott Long MR_EVT_ARGS_LD_OWNER, 3862e21a3efSScott Long MR_EVT_ARGS_LD_LBA_PD_LBA, 3872e21a3efSScott Long MR_EVT_ARGS_LD_PROG, 3882e21a3efSScott Long MR_EVT_ARGS_LD_STATE, 3892e21a3efSScott Long MR_EVT_ARGS_LD_STRIP, 3902e21a3efSScott Long MR_EVT_ARGS_PD, 3912e21a3efSScott Long MR_EVT_ARGS_PD_ERR, 3922e21a3efSScott Long MR_EVT_ARGS_PD_LBA, 3932e21a3efSScott Long MR_EVT_ARGS_PD_LBA_LD, 3942e21a3efSScott Long MR_EVT_ARGS_PD_PROG, 3952e21a3efSScott Long MR_EVT_ARGS_PD_STATE, 3962e21a3efSScott Long MR_EVT_ARGS_PCI, 3972e21a3efSScott Long MR_EVT_ARGS_RATE, 3982e21a3efSScott Long MR_EVT_ARGS_STR, 3992e21a3efSScott Long MR_EVT_ARGS_TIME, 4002e21a3efSScott Long MR_EVT_ARGS_ECC 4012e21a3efSScott Long } mfi_evt_args; 4022e21a3efSScott Long 403a6ba0fd6SDoug Ambrisko #define MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED 0x0152 404a6ba0fd6SDoug Ambrisko #define MR_EVT_PD_REMOVED 0x0070 405a6ba0fd6SDoug Ambrisko #define MR_EVT_PD_INSERTED 0x005b 406*ddbffe7fSDoug Ambrisko #define MR_EVT_LD_CHANGE 0x0051 407a6ba0fd6SDoug Ambrisko 408441f6d5dSScott Long typedef enum { 409441f6d5dSScott Long MR_LD_CACHE_WRITE_BACK = 0x01, 410441f6d5dSScott Long MR_LD_CACHE_WRITE_ADAPTIVE = 0x02, 411441f6d5dSScott Long MR_LD_CACHE_READ_AHEAD = 0x04, 412441f6d5dSScott Long MR_LD_CACHE_READ_ADAPTIVE = 0x08, 413441f6d5dSScott Long MR_LD_CACHE_WRITE_CACHE_BAD_BBU=0x10, 414441f6d5dSScott Long MR_LD_CACHE_ALLOW_WRITE_CACHE = 0x20, 415441f6d5dSScott Long MR_LD_CACHE_ALLOW_READ_CACHE = 0x40 416441f6d5dSScott Long } mfi_ld_cache; 417763fae79SScott Long #define MR_LD_CACHE_MASK 0x7f 418763fae79SScott Long 419763fae79SScott Long #define MR_LD_CACHE_POLICY_READ_AHEAD_NONE 0 420763fae79SScott Long #define MR_LD_CACHE_POLICY_READ_AHEAD_ALWAYS MR_LD_CACHE_READ_AHEAD 421763fae79SScott Long #define MR_LD_CACHE_POLICY_READ_AHEAD_ADAPTIVE \ 422763fae79SScott Long (MR_LD_CACHE_READ_AHEAD | MR_LD_CACHE_READ_ADAPTIVE) 423763fae79SScott Long #define MR_LD_CACHE_POLICY_WRITE_THROUGH 0 424763fae79SScott Long #define MR_LD_CACHE_POLICY_WRITE_BACK MR_LD_CACHE_WRITE_BACK 425763fae79SScott Long #define MR_LD_CACHE_POLICY_IO_CACHED \ 426763fae79SScott Long (MR_LD_CACHE_ALLOW_WRITE_CACHE | MR_LD_CACHE_ALLOW_READ_CACHE) 427763fae79SScott Long #define MR_LD_CACHE_POLICY_IO_DIRECT 0 428441f6d5dSScott Long 429441f6d5dSScott Long typedef enum { 430441f6d5dSScott Long MR_PD_CACHE_UNCHANGED = 0, 431441f6d5dSScott Long MR_PD_CACHE_ENABLE = 1, 432441f6d5dSScott Long MR_PD_CACHE_DISABLE = 2 433441f6d5dSScott Long } mfi_pd_cache; 434441f6d5dSScott Long 4350d9a4ef3SDoug Ambrisko typedef enum { 4360d9a4ef3SDoug Ambrisko MR_PD_QUERY_TYPE_ALL = 0, 4370d9a4ef3SDoug Ambrisko MR_PD_QUERY_TYPE_STATE = 1, 4380d9a4ef3SDoug Ambrisko MR_PD_QUERY_TYPE_POWER_STATE = 2, 4390d9a4ef3SDoug Ambrisko MR_PD_QUERY_TYPE_MEDIA_TYPE = 3, 4400d9a4ef3SDoug Ambrisko MR_PD_QUERY_TYPE_SPEED = 4, 441a6ba0fd6SDoug Ambrisko MR_PD_QUERY_TYPE_EXPOSED_TO_HOST = 5 /*query for system drives */ 4420d9a4ef3SDoug Ambrisko } mfi_pd_query_type; 4430d9a4ef3SDoug Ambrisko 4442e21a3efSScott Long /* 4452e21a3efSScott Long * Other propertities and definitions 4462e21a3efSScott Long */ 4472e21a3efSScott Long #define MFI_MAX_PD_CHANNELS 2 4482e21a3efSScott Long #define MFI_MAX_LD_CHANNELS 2 4492e21a3efSScott Long #define MFI_MAX_CHANNELS (MFI_MAX_PD_CHANNELS + MFI_MAX_LD_CHANNELS) 4502e21a3efSScott Long #define MFI_MAX_CHANNEL_DEVS 128 4512e21a3efSScott Long #define MFI_DEFAULT_ID -1 4522e21a3efSScott Long #define MFI_MAX_LUN 8 4532e21a3efSScott Long #define MFI_MAX_LD 64 454763fae79SScott Long #define MFI_MAX_PD 256 4552e21a3efSScott Long 4562e21a3efSScott Long #define MFI_FRAME_SIZE 64 4572e21a3efSScott Long #define MFI_MBOX_SIZE 12 4582e21a3efSScott Long 459812819c7SDoug Ambrisko /* Firmware flashing can take 40s */ 460812819c7SDoug Ambrisko #define MFI_POLL_TIMEOUT_SECS 50 4612e21a3efSScott Long 4622e21a3efSScott Long /* Allow for speedier math calculations */ 4632e21a3efSScott Long #define MFI_SECTOR_LEN 512 4642e21a3efSScott Long 4652e21a3efSScott Long /* Scatter Gather elements */ 4662e21a3efSScott Long struct mfi_sg32 { 4672e21a3efSScott Long uint32_t addr; 4682e21a3efSScott Long uint32_t len; 4692e21a3efSScott Long } __packed; 4702e21a3efSScott Long 4712e21a3efSScott Long struct mfi_sg64 { 4722e21a3efSScott Long uint64_t addr; 4732e21a3efSScott Long uint32_t len; 4742e21a3efSScott Long } __packed; 4752e21a3efSScott Long 4760d9a4ef3SDoug Ambrisko struct mfi_sg_skinny { 4770d9a4ef3SDoug Ambrisko uint64_t addr; 4780d9a4ef3SDoug Ambrisko uint32_t len; 4790d9a4ef3SDoug Ambrisko uint32_t flag; 4800d9a4ef3SDoug Ambrisko } __packed; 4810d9a4ef3SDoug Ambrisko 4822e21a3efSScott Long union mfi_sgl { 4832e21a3efSScott Long struct mfi_sg32 sg32[1]; 4842e21a3efSScott Long struct mfi_sg64 sg64[1]; 4850d9a4ef3SDoug Ambrisko struct mfi_sg_skinny sg_skinny[1]; 4862e21a3efSScott Long } __packed; 4872e21a3efSScott Long 4882e21a3efSScott Long /* Message frames. All messages have a common header */ 4892e21a3efSScott Long struct mfi_frame_header { 4902e21a3efSScott Long uint8_t cmd; 4912e21a3efSScott Long uint8_t sense_len; 4922e21a3efSScott Long uint8_t cmd_status; 4932e21a3efSScott Long uint8_t scsi_status; 4942e21a3efSScott Long uint8_t target_id; 4952e21a3efSScott Long uint8_t lun_id; 4962e21a3efSScott Long uint8_t cdb_len; 4972e21a3efSScott Long uint8_t sg_count; 4982e21a3efSScott Long uint32_t context; 4990d9a4ef3SDoug Ambrisko /* 5000d9a4ef3SDoug Ambrisko * pad0 is MSI Specific. Not used by Driver. Zero the value before 501a6ba0fd6SDoug Ambrisko * sending the command to f/w. 5020d9a4ef3SDoug Ambrisko */ 5032e21a3efSScott Long uint32_t pad0; 5042e21a3efSScott Long uint16_t flags; 50504697de9SDoug Ambrisko #define MFI_FRAME_DATAOUT 0x08 50604697de9SDoug Ambrisko #define MFI_FRAME_DATAIN 0x10 5072e21a3efSScott Long uint16_t timeout; 5082e21a3efSScott Long uint32_t data_len; 5092e21a3efSScott Long } __packed; 5102e21a3efSScott Long 5112e21a3efSScott Long struct mfi_init_frame { 5122e21a3efSScott Long struct mfi_frame_header header; 5132e21a3efSScott Long uint32_t qinfo_new_addr_lo; 5142e21a3efSScott Long uint32_t qinfo_new_addr_hi; 5152e21a3efSScott Long uint32_t qinfo_old_addr_lo; 5162e21a3efSScott Long uint32_t qinfo_old_addr_hi; 5170d9a4ef3SDoug Ambrisko // Start LSIP200113393 5180d9a4ef3SDoug Ambrisko uint32_t driver_ver_lo; /*28h */ 5190d9a4ef3SDoug Ambrisko uint32_t driver_ver_hi; /*2Ch */ 5200d9a4ef3SDoug Ambrisko 5210d9a4ef3SDoug Ambrisko uint32_t reserved[4]; 5220d9a4ef3SDoug Ambrisko // End LSIP200113393 5232e21a3efSScott Long } __packed; 5242e21a3efSScott Long 5250d9a4ef3SDoug Ambrisko /* 526a6ba0fd6SDoug Ambrisko * Define MFI Address Context union. 5270d9a4ef3SDoug Ambrisko */ 5280d9a4ef3SDoug Ambrisko #ifdef MFI_ADDRESS_IS_uint64_t 5290d9a4ef3SDoug Ambrisko typedef uint64_t MFI_ADDRESS; 5300d9a4ef3SDoug Ambrisko #else 5310d9a4ef3SDoug Ambrisko typedef union _MFI_ADDRESS { 5320d9a4ef3SDoug Ambrisko struct { 5330d9a4ef3SDoug Ambrisko uint32_t addressLow; 5340d9a4ef3SDoug Ambrisko uint32_t addressHigh; 5350d9a4ef3SDoug Ambrisko } u; 5360d9a4ef3SDoug Ambrisko uint64_t address; 5370d9a4ef3SDoug Ambrisko } MFI_ADDRESS, *PMFI_ADDRESS; 5380d9a4ef3SDoug Ambrisko #endif 5390d9a4ef3SDoug Ambrisko 5402e21a3efSScott Long #define MFI_IO_FRAME_SIZE 40 5412e21a3efSScott Long struct mfi_io_frame { 5422e21a3efSScott Long struct mfi_frame_header header; 5432e21a3efSScott Long uint32_t sense_addr_lo; 5442e21a3efSScott Long uint32_t sense_addr_hi; 5452e21a3efSScott Long uint32_t lba_lo; 5462e21a3efSScott Long uint32_t lba_hi; 5472e21a3efSScott Long union mfi_sgl sgl; 5482e21a3efSScott Long } __packed; 5492e21a3efSScott Long 5502e21a3efSScott Long #define MFI_PASS_FRAME_SIZE 48 5512e21a3efSScott Long struct mfi_pass_frame { 5522e21a3efSScott Long struct mfi_frame_header header; 5532e21a3efSScott Long uint32_t sense_addr_lo; 5542e21a3efSScott Long uint32_t sense_addr_hi; 5552e21a3efSScott Long uint8_t cdb[16]; 5562e21a3efSScott Long union mfi_sgl sgl; 5572e21a3efSScott Long } __packed; 5582e21a3efSScott Long 5592e21a3efSScott Long #define MFI_DCMD_FRAME_SIZE 40 5602e21a3efSScott Long struct mfi_dcmd_frame { 5612e21a3efSScott Long struct mfi_frame_header header; 5622e21a3efSScott Long uint32_t opcode; 5632e21a3efSScott Long uint8_t mbox[MFI_MBOX_SIZE]; 5642e21a3efSScott Long union mfi_sgl sgl; 5652e21a3efSScott Long } __packed; 5662e21a3efSScott Long 5672e21a3efSScott Long struct mfi_abort_frame { 5682e21a3efSScott Long struct mfi_frame_header header; 5692e21a3efSScott Long uint32_t abort_context; 5700d9a4ef3SDoug Ambrisko /* pad is changed to reserved.*/ 5710d9a4ef3SDoug Ambrisko uint32_t reserved0; 5722e21a3efSScott Long uint32_t abort_mfi_addr_lo; 5732e21a3efSScott Long uint32_t abort_mfi_addr_hi; 5740d9a4ef3SDoug Ambrisko uint32_t reserved1[6]; 5752e21a3efSScott Long } __packed; 5762e21a3efSScott Long 5772e21a3efSScott Long struct mfi_smp_frame { 5782e21a3efSScott Long struct mfi_frame_header header; 5792e21a3efSScott Long uint64_t sas_addr; 5802e21a3efSScott Long union { 5812e21a3efSScott Long struct mfi_sg32 sg32[2]; 5822e21a3efSScott Long struct mfi_sg64 sg64[2]; 5832e21a3efSScott Long } sgl; 5842e21a3efSScott Long } __packed; 5852e21a3efSScott Long 5862e21a3efSScott Long struct mfi_stp_frame { 5872e21a3efSScott Long struct mfi_frame_header header; 5882e21a3efSScott Long uint16_t fis[10]; 5892e21a3efSScott Long uint32_t stp_flags; 5902e21a3efSScott Long union { 5912e21a3efSScott Long struct mfi_sg32 sg32[2]; 5922e21a3efSScott Long struct mfi_sg64 sg64[2]; 5932e21a3efSScott Long } sgl; 5942e21a3efSScott Long } __packed; 5952e21a3efSScott Long 5962e21a3efSScott Long union mfi_frame { 5972e21a3efSScott Long struct mfi_frame_header header; 5982e21a3efSScott Long struct mfi_init_frame init; 5990d9a4ef3SDoug Ambrisko /* ThunderBolt Initialization */ 6002e21a3efSScott Long struct mfi_io_frame io; 6012e21a3efSScott Long struct mfi_pass_frame pass; 6022e21a3efSScott Long struct mfi_dcmd_frame dcmd; 6032e21a3efSScott Long struct mfi_abort_frame abort; 6042e21a3efSScott Long struct mfi_smp_frame smp; 6052e21a3efSScott Long struct mfi_stp_frame stp; 6062e21a3efSScott Long uint8_t bytes[MFI_FRAME_SIZE]; 6072e21a3efSScott Long }; 6082e21a3efSScott Long 6092e21a3efSScott Long #define MFI_SENSE_LEN 128 6102e21a3efSScott Long struct mfi_sense { 6112e21a3efSScott Long uint8_t data[MFI_SENSE_LEN]; 6122e21a3efSScott Long }; 6132e21a3efSScott Long 6142e21a3efSScott Long /* The queue init structure that is passed with the init message */ 6152e21a3efSScott Long struct mfi_init_qinfo { 6162e21a3efSScott Long uint32_t flags; 6172e21a3efSScott Long uint32_t rq_entries; 6182e21a3efSScott Long uint32_t rq_addr_lo; 6192e21a3efSScott Long uint32_t rq_addr_hi; 6202e21a3efSScott Long uint32_t pi_addr_lo; 6212e21a3efSScott Long uint32_t pi_addr_hi; 6222e21a3efSScott Long uint32_t ci_addr_lo; 6232e21a3efSScott Long uint32_t ci_addr_hi; 6242e21a3efSScott Long } __packed; 6252e21a3efSScott Long 6262e21a3efSScott Long /* SAS (?) controller properties, part of mfi_ctrl_info */ 6272e21a3efSScott Long struct mfi_ctrl_props { 6282e21a3efSScott Long uint16_t seq_num; 6292e21a3efSScott Long uint16_t pred_fail_poll_interval; 6302e21a3efSScott Long uint16_t intr_throttle_cnt; 6312e21a3efSScott Long uint16_t intr_throttle_timeout; 6322e21a3efSScott Long uint8_t rebuild_rate; 6332e21a3efSScott Long uint8_t patrol_read_rate; 6342e21a3efSScott Long uint8_t bgi_rate; 6352e21a3efSScott Long uint8_t cc_rate; 6362e21a3efSScott Long uint8_t recon_rate; 6372e21a3efSScott Long uint8_t cache_flush_interval; 6382e21a3efSScott Long uint8_t spinup_drv_cnt; 6392e21a3efSScott Long uint8_t spinup_delay; 6402e21a3efSScott Long uint8_t cluster_enable; 6412e21a3efSScott Long uint8_t coercion_mode; 6422e21a3efSScott Long uint8_t alarm_enable; 6432e21a3efSScott Long uint8_t disable_auto_rebuild; 6442e21a3efSScott Long uint8_t disable_battery_warn; 6452e21a3efSScott Long uint8_t ecc_bucket_size; 6462e21a3efSScott Long uint16_t ecc_bucket_leak_rate; 6472e21a3efSScott Long uint8_t restore_hotspare_on_insertion; 6482e21a3efSScott Long uint8_t expose_encl_devices; 6490d9a4ef3SDoug Ambrisko uint8_t maintainPdFailHistory; 6500d9a4ef3SDoug Ambrisko uint8_t disallowHostRequestReordering; 651a6ba0fd6SDoug Ambrisko /* set TRUE to abort CC on detecting an inconsistency */ 652a6ba0fd6SDoug Ambrisko uint8_t abortCCOnError; 653a6ba0fd6SDoug Ambrisko /* load balance mode (MR_LOAD_BALANCE_MODE) */ 654a6ba0fd6SDoug Ambrisko uint8_t loadBalanceMode; 655a6ba0fd6SDoug Ambrisko /* 656a6ba0fd6SDoug Ambrisko * 0 - use auto detect logic of backplanes like SGPIO, i2c SEP using 657a6ba0fd6SDoug Ambrisko * h/w mechansim like GPIO pins 658a6ba0fd6SDoug Ambrisko * 1 - disable auto detect SGPIO, 659a6ba0fd6SDoug Ambrisko * 2 - disable i2c SEP auto detect 660a6ba0fd6SDoug Ambrisko * 3 - disable both auto detect 661a6ba0fd6SDoug Ambrisko */ 662a6ba0fd6SDoug Ambrisko uint8_t disableAutoDetectBackplane; 663a6ba0fd6SDoug Ambrisko /* 664a6ba0fd6SDoug Ambrisko * % of source LD to be reserved for a VDs snapshot in snapshot 665a6ba0fd6SDoug Ambrisko * repository, for metadata and user data: 1=5%, 2=10%, 3=15% and so on 666a6ba0fd6SDoug Ambrisko */ 667a6ba0fd6SDoug Ambrisko uint8_t snapVDSpace; 6680d9a4ef3SDoug Ambrisko 6690d9a4ef3SDoug Ambrisko /* 670a6ba0fd6SDoug Ambrisko * Add properties that can be controlled by a bit in the following 671a6ba0fd6SDoug Ambrisko * structure. 6720d9a4ef3SDoug Ambrisko */ 6730d9a4ef3SDoug Ambrisko struct { 674a6ba0fd6SDoug Ambrisko /* set TRUE to disable copyBack (0=copback enabled) */ 675a6ba0fd6SDoug Ambrisko uint32_t copyBackDisabled :1; 6760d9a4ef3SDoug Ambrisko uint32_t SMARTerEnabled :1; 6770d9a4ef3SDoug Ambrisko uint32_t prCorrectUnconfiguredAreas :1; 6780d9a4ef3SDoug Ambrisko uint32_t useFdeOnly :1; 6790d9a4ef3SDoug Ambrisko uint32_t disableNCQ :1; 6800d9a4ef3SDoug Ambrisko uint32_t SSDSMARTerEnabled :1; 6810d9a4ef3SDoug Ambrisko uint32_t SSDPatrolReadEnabled :1; 6820d9a4ef3SDoug Ambrisko uint32_t enableSpinDownUnconfigured :1; 6830d9a4ef3SDoug Ambrisko uint32_t autoEnhancedImport :1; 6840d9a4ef3SDoug Ambrisko uint32_t enableSecretKeyControl :1; 6850d9a4ef3SDoug Ambrisko uint32_t disableOnlineCtrlReset :1; 6860d9a4ef3SDoug Ambrisko uint32_t allowBootWithPinnedCache :1; 6870d9a4ef3SDoug Ambrisko uint32_t disableSpinDownHS :1; 6880d9a4ef3SDoug Ambrisko uint32_t enableJBOD :1; 6890d9a4ef3SDoug Ambrisko uint32_t reserved :18; 6900d9a4ef3SDoug Ambrisko } OnOffProperties; 691a6ba0fd6SDoug Ambrisko /* 692a6ba0fd6SDoug Ambrisko * % of source LD to be reserved for auto snapshot in snapshot 693a6ba0fd6SDoug Ambrisko * repository, for metadata and user data: 1=5%, 2=10%, 3=15% and so on. 694a6ba0fd6SDoug Ambrisko */ 695a6ba0fd6SDoug Ambrisko uint8_t autoSnapVDSpace; 696a6ba0fd6SDoug Ambrisko /* 697a6ba0fd6SDoug Ambrisko * Snapshot writeable VIEWs capacity as a % of source LD capacity: 698a6ba0fd6SDoug Ambrisko * 0=READ only, 1=5%, 2=10%, 3=15% and so on. 699a6ba0fd6SDoug Ambrisko */ 700a6ba0fd6SDoug Ambrisko uint8_t viewSpace; 701a6ba0fd6SDoug Ambrisko /* # of idle minutes before device is spun down (0=use FW defaults) */ 702a6ba0fd6SDoug Ambrisko uint16_t spinDownTime; 7030d9a4ef3SDoug Ambrisko uint8_t reserved[24]; 7042e21a3efSScott Long } __packed; 7052e21a3efSScott Long 7062e21a3efSScott Long /* PCI information about the card. */ 7072e21a3efSScott Long struct mfi_info_pci { 7082e21a3efSScott Long uint16_t vendor; 7092e21a3efSScott Long uint16_t device; 7102e21a3efSScott Long uint16_t subvendor; 7112e21a3efSScott Long uint16_t subdevice; 7122e21a3efSScott Long uint8_t reserved[24]; 7132e21a3efSScott Long } __packed; 7142e21a3efSScott Long 7152e21a3efSScott Long /* Host (front end) interface information */ 7162e21a3efSScott Long struct mfi_info_host { 7172e21a3efSScott Long uint8_t type; 7182e21a3efSScott Long #define MFI_INFO_HOST_PCIX 0x01 7192e21a3efSScott Long #define MFI_INFO_HOST_PCIE 0x02 7202e21a3efSScott Long #define MFI_INFO_HOST_ISCSI 0x04 7212e21a3efSScott Long #define MFI_INFO_HOST_SAS3G 0x08 7222e21a3efSScott Long uint8_t reserved[6]; 7232e21a3efSScott Long uint8_t port_count; 7242e21a3efSScott Long uint64_t port_addr[8]; 7252e21a3efSScott Long } __packed; 7262e21a3efSScott Long 7272e21a3efSScott Long /* Device (back end) interface information */ 7282e21a3efSScott Long struct mfi_info_device { 7292e21a3efSScott Long uint8_t type; 7302e21a3efSScott Long #define MFI_INFO_DEV_SPI 0x01 7312e21a3efSScott Long #define MFI_INFO_DEV_SAS3G 0x02 7322e21a3efSScott Long #define MFI_INFO_DEV_SATA1 0x04 7332e21a3efSScott Long #define MFI_INFO_DEV_SATA3G 0x08 7342e21a3efSScott Long uint8_t reserved[6]; 7352e21a3efSScott Long uint8_t port_count; 7362e21a3efSScott Long uint64_t port_addr[8]; 7372e21a3efSScott Long } __packed; 7382e21a3efSScott Long 7392e21a3efSScott Long /* Firmware component information */ 7402e21a3efSScott Long struct mfi_info_component { 7412e21a3efSScott Long char name[8]; 7422e21a3efSScott Long char version[32]; 7432e21a3efSScott Long char build_date[16]; 7442e21a3efSScott Long char build_time[16]; 7452e21a3efSScott Long } __packed; 7462e21a3efSScott Long 747441f6d5dSScott Long /* Controller default settings */ 748441f6d5dSScott Long struct mfi_defaults { 749441f6d5dSScott Long uint64_t sas_addr; 750441f6d5dSScott Long uint8_t phy_polarity; 751441f6d5dSScott Long uint8_t background_rate; 752441f6d5dSScott Long uint8_t stripe_size; 753441f6d5dSScott Long uint8_t flush_time; 754441f6d5dSScott Long uint8_t write_back; 755441f6d5dSScott Long uint8_t read_ahead; 756441f6d5dSScott Long uint8_t cache_when_bbu_bad; 757441f6d5dSScott Long uint8_t cached_io; 758441f6d5dSScott Long uint8_t smart_mode; 759441f6d5dSScott Long uint8_t alarm_disable; 760441f6d5dSScott Long uint8_t coercion; 761441f6d5dSScott Long uint8_t zrc_config; 762441f6d5dSScott Long uint8_t dirty_led_shows_drive_activity; 763441f6d5dSScott Long uint8_t bios_continue_on_error; 764441f6d5dSScott Long uint8_t spindown_mode; 765441f6d5dSScott Long uint8_t allowed_device_types; 766441f6d5dSScott Long uint8_t allow_mix_in_enclosure; 767441f6d5dSScott Long uint8_t allow_mix_in_ld; 768441f6d5dSScott Long uint8_t allow_sata_in_cluster; 769441f6d5dSScott Long uint8_t max_chained_enclosures; 770441f6d5dSScott Long uint8_t disable_ctrl_r; 771441f6d5dSScott Long uint8_t enabel_web_bios; 772441f6d5dSScott Long uint8_t phy_polarity_split; 773441f6d5dSScott Long uint8_t direct_pd_mapping; 774441f6d5dSScott Long uint8_t bios_enumerate_lds; 775441f6d5dSScott Long uint8_t restored_hot_spare_on_insertion; 776441f6d5dSScott Long uint8_t expose_enclosure_devices; 777441f6d5dSScott Long uint8_t maintain_pd_fail_history; 778441f6d5dSScott Long uint8_t resv[28]; 779441f6d5dSScott Long } __packed; 780441f6d5dSScott Long 781441f6d5dSScott Long /* Controller default settings */ 782441f6d5dSScott Long struct mfi_bios_data { 783441f6d5dSScott Long uint16_t boot_target_id; 784441f6d5dSScott Long uint8_t do_not_int_13; 785441f6d5dSScott Long uint8_t continue_on_error; 786441f6d5dSScott Long uint8_t verbose; 787441f6d5dSScott Long uint8_t geometry; 788441f6d5dSScott Long uint8_t expose_all_drives; 789441f6d5dSScott Long uint8_t reserved[56]; 790441f6d5dSScott Long uint8_t check_sum; 791441f6d5dSScott Long } __packed; 7922e21a3efSScott Long 7932e21a3efSScott Long /* SAS (?) controller info, returned from MFI_DCMD_CTRL_GETINFO. */ 7942e21a3efSScott Long struct mfi_ctrl_info { 7952e21a3efSScott Long struct mfi_info_pci pci; 7962e21a3efSScott Long struct mfi_info_host host; 7972e21a3efSScott Long struct mfi_info_device device; 7982e21a3efSScott Long 7992e21a3efSScott Long /* Firmware components that are present and active. */ 8002e21a3efSScott Long uint32_t image_check_word; 8012e21a3efSScott Long uint32_t image_component_count; 8022e21a3efSScott Long struct mfi_info_component image_component[8]; 8032e21a3efSScott Long 8042e21a3efSScott Long /* Firmware components that have been flashed but are inactive */ 8052e21a3efSScott Long uint32_t pending_image_component_count; 8062e21a3efSScott Long struct mfi_info_component pending_image_component[8]; 8072e21a3efSScott Long 8082e21a3efSScott Long uint8_t max_arms; 8092e21a3efSScott Long uint8_t max_spans; 8102e21a3efSScott Long uint8_t max_arrays; 8112e21a3efSScott Long uint8_t max_lds; 8122e21a3efSScott Long char product_name[80]; 8132e21a3efSScott Long char serial_number[32]; 8142e21a3efSScott Long uint32_t hw_present; 8152e21a3efSScott Long #define MFI_INFO_HW_BBU 0x01 8162e21a3efSScott Long #define MFI_INFO_HW_ALARM 0x02 8172e21a3efSScott Long #define MFI_INFO_HW_NVRAM 0x04 8182e21a3efSScott Long #define MFI_INFO_HW_UART 0x08 8192e21a3efSScott Long uint32_t current_fw_time; 8202e21a3efSScott Long uint16_t max_cmds; 8212e21a3efSScott Long uint16_t max_sg_elements; 8222e21a3efSScott Long uint32_t max_request_size; 8232e21a3efSScott Long uint16_t lds_present; 8242e21a3efSScott Long uint16_t lds_degraded; 8252e21a3efSScott Long uint16_t lds_offline; 8262e21a3efSScott Long uint16_t pd_present; 8272e21a3efSScott Long uint16_t pd_disks_present; 8282e21a3efSScott Long uint16_t pd_disks_pred_failure; 8292e21a3efSScott Long uint16_t pd_disks_failed; 8302e21a3efSScott Long uint16_t nvram_size; 8312e21a3efSScott Long uint16_t memory_size; 8322e21a3efSScott Long uint16_t flash_size; 8332e21a3efSScott Long uint16_t ram_correctable_errors; 8342e21a3efSScott Long uint16_t ram_uncorrectable_errors; 8352e21a3efSScott Long uint8_t cluster_allowed; 8362e21a3efSScott Long uint8_t cluster_active; 8372e21a3efSScott Long uint16_t max_strips_per_io; 8382e21a3efSScott Long 8392e21a3efSScott Long uint32_t raid_levels; 8402e21a3efSScott Long #define MFI_INFO_RAID_0 0x01 8412e21a3efSScott Long #define MFI_INFO_RAID_1 0x02 8422e21a3efSScott Long #define MFI_INFO_RAID_5 0x04 8432e21a3efSScott Long #define MFI_INFO_RAID_1E 0x08 8442e21a3efSScott Long #define MFI_INFO_RAID_6 0x10 8452e21a3efSScott Long 8462e21a3efSScott Long uint32_t adapter_ops; 8472e21a3efSScott Long #define MFI_INFO_AOPS_RBLD_RATE 0x0001 8482e21a3efSScott Long #define MFI_INFO_AOPS_CC_RATE 0x0002 8492e21a3efSScott Long #define MFI_INFO_AOPS_BGI_RATE 0x0004 8502e21a3efSScott Long #define MFI_INFO_AOPS_RECON_RATE 0x0008 8512e21a3efSScott Long #define MFI_INFO_AOPS_PATROL_RATE 0x0010 8522e21a3efSScott Long #define MFI_INFO_AOPS_ALARM_CONTROL 0x0020 8532e21a3efSScott Long #define MFI_INFO_AOPS_CLUSTER_SUPPORTED 0x0040 8542e21a3efSScott Long #define MFI_INFO_AOPS_BBU 0x0080 8552e21a3efSScott Long #define MFI_INFO_AOPS_SPANNING_ALLOWED 0x0100 8562e21a3efSScott Long #define MFI_INFO_AOPS_DEDICATED_SPARES 0x0200 8572e21a3efSScott Long #define MFI_INFO_AOPS_REVERTIBLE_SPARES 0x0400 8582e21a3efSScott Long #define MFI_INFO_AOPS_FOREIGN_IMPORT 0x0800 8592e21a3efSScott Long #define MFI_INFO_AOPS_SELF_DIAGNOSTIC 0x1000 8602e21a3efSScott Long #define MFI_INFO_AOPS_MIXED_ARRAY 0x2000 8612e21a3efSScott Long #define MFI_INFO_AOPS_GLOBAL_SPARES 0x4000 8622e21a3efSScott Long 8632e21a3efSScott Long uint32_t ld_ops; 8642e21a3efSScott Long #define MFI_INFO_LDOPS_READ_POLICY 0x01 8652e21a3efSScott Long #define MFI_INFO_LDOPS_WRITE_POLICY 0x02 8662e21a3efSScott Long #define MFI_INFO_LDOPS_IO_POLICY 0x04 8672e21a3efSScott Long #define MFI_INFO_LDOPS_ACCESS_POLICY 0x08 8682e21a3efSScott Long #define MFI_INFO_LDOPS_DISK_CACHE_POLICY 0x10 8692e21a3efSScott Long 8702e21a3efSScott Long struct { 8712e21a3efSScott Long uint8_t min; 8722e21a3efSScott Long uint8_t max; 8732e21a3efSScott Long uint8_t reserved[2]; 8742e21a3efSScott Long } __packed stripe_sz_ops; 8752e21a3efSScott Long 8762e21a3efSScott Long uint32_t pd_ops; 8772e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_ONLINE 0x01 8782e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_OFFLINE 0x02 8792e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_REBUILD 0x04 8802e21a3efSScott Long 8812e21a3efSScott Long uint32_t pd_mix_support; 8822e21a3efSScott Long #define MFI_INFO_PDMIX_SAS 0x01 8832e21a3efSScott Long #define MFI_INFO_PDMIX_SATA 0x02 8842e21a3efSScott Long #define MFI_INFO_PDMIX_ENCL 0x04 8852e21a3efSScott Long #define MFI_INFO_PDMIX_LD 0x08 8862e21a3efSScott Long #define MFI_INFO_PDMIX_SATA_CLUSTER 0x10 8872e21a3efSScott Long 8882e21a3efSScott Long uint8_t ecc_bucket_count; 8892e21a3efSScott Long uint8_t reserved2[11]; 8902e21a3efSScott Long struct mfi_ctrl_props properties; 8912e21a3efSScott Long char package_version[0x60]; 8922e21a3efSScott Long uint8_t pad[0x800 - 0x6a0]; 8932e21a3efSScott Long } __packed; 8942e21a3efSScott Long 895741367d5SDoug Ambrisko /* keep track of an event. */ 896741367d5SDoug Ambrisko union mfi_evt { 897741367d5SDoug Ambrisko struct { 898741367d5SDoug Ambrisko uint16_t locale; 899741367d5SDoug Ambrisko uint8_t reserved; 900aacea6e2SEd Maste int8_t evt_class; 901741367d5SDoug Ambrisko } members; 902741367d5SDoug Ambrisko uint32_t word; 903741367d5SDoug Ambrisko } __packed; 904741367d5SDoug Ambrisko 905741367d5SDoug Ambrisko /* event log state. */ 906741367d5SDoug Ambrisko struct mfi_evt_log_state { 907741367d5SDoug Ambrisko uint32_t newest_seq_num; 908741367d5SDoug Ambrisko uint32_t oldest_seq_num; 909741367d5SDoug Ambrisko uint32_t clear_seq_num; 910741367d5SDoug Ambrisko uint32_t shutdown_seq_num; 911741367d5SDoug Ambrisko uint32_t boot_seq_num; 912741367d5SDoug Ambrisko } __packed; 913741367d5SDoug Ambrisko 914741367d5SDoug Ambrisko struct mfi_progress { 915741367d5SDoug Ambrisko uint16_t progress; 916741367d5SDoug Ambrisko uint16_t elapsed_seconds; 917741367d5SDoug Ambrisko } __packed; 918741367d5SDoug Ambrisko 919741367d5SDoug Ambrisko struct mfi_evt_ld { 920741367d5SDoug Ambrisko uint16_t target_id; 921741367d5SDoug Ambrisko uint8_t ld_index; 922741367d5SDoug Ambrisko uint8_t reserved; 923741367d5SDoug Ambrisko } __packed; 924741367d5SDoug Ambrisko 925741367d5SDoug Ambrisko struct mfi_evt_pd { 926741367d5SDoug Ambrisko uint16_t device_id; 927741367d5SDoug Ambrisko uint8_t enclosure_index; 928741367d5SDoug Ambrisko uint8_t slot_number; 929741367d5SDoug Ambrisko } __packed; 930741367d5SDoug Ambrisko 931741367d5SDoug Ambrisko /* SAS (?) event detail, returned from MFI_DCMD_CTRL_EVENT_WAIT. */ 932741367d5SDoug Ambrisko struct mfi_evt_detail { 933741367d5SDoug Ambrisko uint32_t seq; 934741367d5SDoug Ambrisko uint32_t time; 935741367d5SDoug Ambrisko uint32_t code; 936aacea6e2SEd Maste union mfi_evt evt_class; 937741367d5SDoug Ambrisko uint8_t arg_type; 938741367d5SDoug Ambrisko uint8_t reserved1[15]; 939741367d5SDoug Ambrisko 940741367d5SDoug Ambrisko union { 941741367d5SDoug Ambrisko struct { 942741367d5SDoug Ambrisko struct mfi_evt_pd pd; 943741367d5SDoug Ambrisko uint8_t cdb_len; 944741367d5SDoug Ambrisko uint8_t sense_len; 945741367d5SDoug Ambrisko uint8_t reserved[2]; 946741367d5SDoug Ambrisko uint8_t cdb[16]; 947741367d5SDoug Ambrisko uint8_t sense[64]; 948741367d5SDoug Ambrisko } cdb_sense; 949741367d5SDoug Ambrisko 950741367d5SDoug Ambrisko struct mfi_evt_ld ld; 951741367d5SDoug Ambrisko 952741367d5SDoug Ambrisko struct { 953741367d5SDoug Ambrisko struct mfi_evt_ld ld; 954741367d5SDoug Ambrisko uint64_t count; 955741367d5SDoug Ambrisko } ld_count; 956741367d5SDoug Ambrisko 957741367d5SDoug Ambrisko struct { 958741367d5SDoug Ambrisko uint64_t lba; 959741367d5SDoug Ambrisko struct mfi_evt_ld ld; 960741367d5SDoug Ambrisko } ld_lba; 961741367d5SDoug Ambrisko 962741367d5SDoug Ambrisko struct { 963741367d5SDoug Ambrisko struct mfi_evt_ld ld; 964741367d5SDoug Ambrisko uint32_t pre_owner; 965741367d5SDoug Ambrisko uint32_t new_owner; 966741367d5SDoug Ambrisko } ld_owner; 967741367d5SDoug Ambrisko 968741367d5SDoug Ambrisko struct { 969741367d5SDoug Ambrisko uint64_t ld_lba; 970741367d5SDoug Ambrisko uint64_t pd_lba; 971741367d5SDoug Ambrisko struct mfi_evt_ld ld; 972741367d5SDoug Ambrisko struct mfi_evt_pd pd; 973741367d5SDoug Ambrisko } ld_lba_pd_lba; 974741367d5SDoug Ambrisko 975741367d5SDoug Ambrisko struct { 976741367d5SDoug Ambrisko struct mfi_evt_ld ld; 977741367d5SDoug Ambrisko struct mfi_progress prog; 978741367d5SDoug Ambrisko } ld_prog; 979741367d5SDoug Ambrisko 980741367d5SDoug Ambrisko struct { 981741367d5SDoug Ambrisko struct mfi_evt_ld ld; 982741367d5SDoug Ambrisko uint32_t prev_state; 983741367d5SDoug Ambrisko uint32_t new_state; 984741367d5SDoug Ambrisko } ld_state; 985741367d5SDoug Ambrisko 986741367d5SDoug Ambrisko struct { 987741367d5SDoug Ambrisko uint64_t strip; 988741367d5SDoug Ambrisko struct mfi_evt_ld ld; 989741367d5SDoug Ambrisko } ld_strip; 990741367d5SDoug Ambrisko 991741367d5SDoug Ambrisko struct mfi_evt_pd pd; 992741367d5SDoug Ambrisko 993741367d5SDoug Ambrisko struct { 994741367d5SDoug Ambrisko struct mfi_evt_pd pd; 995741367d5SDoug Ambrisko uint32_t err; 996741367d5SDoug Ambrisko } pd_err; 997741367d5SDoug Ambrisko 998741367d5SDoug Ambrisko struct { 999741367d5SDoug Ambrisko uint64_t lba; 1000741367d5SDoug Ambrisko struct mfi_evt_pd pd; 1001741367d5SDoug Ambrisko } pd_lba; 1002741367d5SDoug Ambrisko 1003741367d5SDoug Ambrisko struct { 1004741367d5SDoug Ambrisko uint64_t lba; 1005741367d5SDoug Ambrisko struct mfi_evt_pd pd; 1006741367d5SDoug Ambrisko struct mfi_evt_ld ld; 1007741367d5SDoug Ambrisko } pd_lba_ld; 1008741367d5SDoug Ambrisko 1009741367d5SDoug Ambrisko struct { 1010741367d5SDoug Ambrisko struct mfi_evt_pd pd; 1011741367d5SDoug Ambrisko struct mfi_progress prog; 1012741367d5SDoug Ambrisko } pd_prog; 1013741367d5SDoug Ambrisko 1014741367d5SDoug Ambrisko struct { 1015741367d5SDoug Ambrisko struct mfi_evt_pd ld; 1016741367d5SDoug Ambrisko uint32_t prev_state; 1017741367d5SDoug Ambrisko uint32_t new_state; 1018741367d5SDoug Ambrisko } pd_state; 1019741367d5SDoug Ambrisko 1020741367d5SDoug Ambrisko struct { 1021741367d5SDoug Ambrisko uint16_t venderId; 1022741367d5SDoug Ambrisko uint16_t deviceId; 1023741367d5SDoug Ambrisko uint16_t subVenderId; 1024741367d5SDoug Ambrisko uint16_t subDeviceId; 1025741367d5SDoug Ambrisko } pci; 1026741367d5SDoug Ambrisko 1027741367d5SDoug Ambrisko uint32_t rate; 1028741367d5SDoug Ambrisko 1029741367d5SDoug Ambrisko char str[96]; 1030741367d5SDoug Ambrisko 1031741367d5SDoug Ambrisko struct { 1032741367d5SDoug Ambrisko uint32_t rtc; 1033741367d5SDoug Ambrisko uint16_t elapsedSeconds; 1034741367d5SDoug Ambrisko } time; 1035741367d5SDoug Ambrisko 1036741367d5SDoug Ambrisko struct { 1037741367d5SDoug Ambrisko uint32_t ecar; 1038741367d5SDoug Ambrisko uint32_t elog; 1039741367d5SDoug Ambrisko char str[64]; 1040741367d5SDoug Ambrisko } ecc; 1041741367d5SDoug Ambrisko 1042741367d5SDoug Ambrisko uint8_t b[96]; 1043741367d5SDoug Ambrisko uint16_t s[48]; 1044741367d5SDoug Ambrisko uint32_t w[24]; 1045741367d5SDoug Ambrisko uint64_t d[12]; 1046741367d5SDoug Ambrisko } args; 1047741367d5SDoug Ambrisko 1048741367d5SDoug Ambrisko char description[128]; 1049741367d5SDoug Ambrisko } __packed; 1050741367d5SDoug Ambrisko 105147b470b9SDoug Ambrisko struct mfi_evt_list { 105247b470b9SDoug Ambrisko uint32_t count; 105347b470b9SDoug Ambrisko uint32_t reserved; 105447b470b9SDoug Ambrisko struct mfi_evt_detail event[1]; 1055741367d5SDoug Ambrisko } __packed; 1056741367d5SDoug Ambrisko 1057441f6d5dSScott Long union mfi_pd_ref { 1058441f6d5dSScott Long struct { 1059441f6d5dSScott Long uint16_t device_id; 1060441f6d5dSScott Long uint16_t seq_num; 1061441f6d5dSScott Long } v; 1062441f6d5dSScott Long uint32_t ref; 1063441f6d5dSScott Long } __packed; 1064441f6d5dSScott Long 1065441f6d5dSScott Long union mfi_pd_ddf_type { 1066441f6d5dSScott Long struct { 1067441f6d5dSScott Long union { 1068441f6d5dSScott Long struct { 1069441f6d5dSScott Long uint16_t forced_pd_guid : 1; 1070441f6d5dSScott Long uint16_t in_vd : 1; 1071441f6d5dSScott Long uint16_t is_global_spare : 1; 1072441f6d5dSScott Long uint16_t is_spare : 1; 1073441f6d5dSScott Long uint16_t is_foreign : 1; 1074441f6d5dSScott Long uint16_t reserved : 7; 1075441f6d5dSScott Long uint16_t intf : 4; 1076441f6d5dSScott Long } pd_type; 1077441f6d5dSScott Long uint16_t type; 1078441f6d5dSScott Long } v; 1079441f6d5dSScott Long uint16_t reserved; 1080441f6d5dSScott Long } ddf; 1081441f6d5dSScott Long struct { 1082441f6d5dSScott Long uint32_t reserved; 1083441f6d5dSScott Long } non_disk; 1084441f6d5dSScott Long uint32_t type; 1085441f6d5dSScott Long } __packed; 1086441f6d5dSScott Long 1087441f6d5dSScott Long struct mfi_pd_progress { 1088763fae79SScott Long uint32_t active; 1089763fae79SScott Long #define MFI_PD_PROGRESS_REBUILD (1<<0) 1090763fae79SScott Long #define MFI_PD_PROGRESS_PATROL (1<<1) 1091763fae79SScott Long #define MFI_PD_PROGRESS_CLEAR (1<<2) 1092441f6d5dSScott Long struct mfi_progress rbld; 1093441f6d5dSScott Long struct mfi_progress patrol; 1094441f6d5dSScott Long struct mfi_progress clear; 1095441f6d5dSScott Long struct mfi_progress reserved[4]; 1096441f6d5dSScott Long } __packed; 1097441f6d5dSScott Long 1098441f6d5dSScott Long struct mfi_pd_info { 1099441f6d5dSScott Long union mfi_pd_ref ref; 1100441f6d5dSScott Long uint8_t inquiry_data[96]; 1101441f6d5dSScott Long uint8_t vpd_page83[64]; 1102441f6d5dSScott Long uint8_t not_supported; 1103441f6d5dSScott Long uint8_t scsi_dev_type; 1104441f6d5dSScott Long uint8_t connected_port_bitmap; 1105441f6d5dSScott Long uint8_t device_speed; 1106441f6d5dSScott Long uint32_t media_err_count; 1107441f6d5dSScott Long uint32_t other_err_count; 1108441f6d5dSScott Long uint32_t pred_fail_count; 1109441f6d5dSScott Long uint32_t last_pred_fail_event_seq_num; 1110763fae79SScott Long uint16_t fw_state; /* MFI_PD_STATE_* */ 1111763fae79SScott Long uint8_t disabled_for_removal; 1112441f6d5dSScott Long uint8_t link_speed; 1113441f6d5dSScott Long union mfi_pd_ddf_type state; 1114441f6d5dSScott Long struct { 1115441f6d5dSScott Long uint8_t count; 1116441f6d5dSScott Long uint8_t is_path_broken; 1117441f6d5dSScott Long uint8_t reserved[6]; 1118441f6d5dSScott Long uint64_t sas_addr[4]; 1119441f6d5dSScott Long } path_info; 1120441f6d5dSScott Long uint64_t raw_size; 1121441f6d5dSScott Long uint64_t non_coerced_size; 1122441f6d5dSScott Long uint64_t coerced_size; 1123441f6d5dSScott Long uint16_t encl_device_id; 1124441f6d5dSScott Long uint8_t encl_index; 1125441f6d5dSScott Long uint8_t slot_number; 1126441f6d5dSScott Long struct mfi_pd_progress prog_info; 1127441f6d5dSScott Long uint8_t bad_block_table_full; 1128441f6d5dSScott Long uint8_t unusable_in_current_config; 1129441f6d5dSScott Long uint8_t vpd_page83_ext[64]; 1130441f6d5dSScott Long uint8_t reserved[512-358]; 1131441f6d5dSScott Long } __packed; 1132441f6d5dSScott Long 1133441f6d5dSScott Long struct mfi_pd_address { 1134441f6d5dSScott Long uint16_t device_id; 1135441f6d5dSScott Long uint16_t encl_device_id; 1136441f6d5dSScott Long uint8_t encl_index; 1137441f6d5dSScott Long uint8_t slot_number; 1138763fae79SScott Long uint8_t scsi_dev_type; /* 0 = disk */ 1139441f6d5dSScott Long uint8_t connect_port_bitmap; 1140441f6d5dSScott Long uint64_t sas_addr[2]; 1141441f6d5dSScott Long } __packed; 1142441f6d5dSScott Long 11430d9a4ef3SDoug Ambrisko #define MAX_SYS_PDS 240 1144441f6d5dSScott Long struct mfi_pd_list { 1145441f6d5dSScott Long uint32_t size; 1146441f6d5dSScott Long uint32_t count; 11470d9a4ef3SDoug Ambrisko struct mfi_pd_address addr[MAX_SYS_PDS]; 1148441f6d5dSScott Long } __packed; 1149441f6d5dSScott Long 1150763fae79SScott Long enum mfi_pd_state { 1151763fae79SScott Long MFI_PD_STATE_UNCONFIGURED_GOOD = 0x00, 1152763fae79SScott Long MFI_PD_STATE_UNCONFIGURED_BAD = 0x01, 1153763fae79SScott Long MFI_PD_STATE_HOT_SPARE = 0x02, 1154763fae79SScott Long MFI_PD_STATE_OFFLINE = 0x10, 1155763fae79SScott Long MFI_PD_STATE_FAILED = 0x11, 1156763fae79SScott Long MFI_PD_STATE_REBUILD = 0x14, 1157d63e9da3SSergey Kandaurov MFI_PD_STATE_ONLINE = 0x18, 1158d63e9da3SSergey Kandaurov MFI_PD_STATE_COPYBACK = 0x20, 1159d63e9da3SSergey Kandaurov MFI_PD_STATE_SYSTEM = 0x40 1160763fae79SScott Long }; 1161763fae79SScott Long 1162a6ba0fd6SDoug Ambrisko /* 1163a6ba0fd6SDoug Ambrisko * "SYSTEM" disk appears to be "JBOD" support from the RAID controller. 1164a6ba0fd6SDoug Ambrisko * Adding a #define to denote this. 1165a6ba0fd6SDoug Ambrisko */ 1166a6ba0fd6SDoug Ambrisko #define MFI_PD_STATE_JBOD MFI_PD_STATE_SYSTEM 1167a6ba0fd6SDoug Ambrisko 1168441f6d5dSScott Long union mfi_ld_ref { 1169441f6d5dSScott Long struct { 1170c0b332d1SPaul Saab uint8_t target_id; 1171c0b332d1SPaul Saab uint8_t reserved; 1172c0b332d1SPaul Saab uint16_t seq; 1173441f6d5dSScott Long } v; 1174441f6d5dSScott Long uint32_t ref; 1175c0b332d1SPaul Saab } __packed; 1176c0b332d1SPaul Saab 1177c0b332d1SPaul Saab struct mfi_ld_list { 1178c0b332d1SPaul Saab uint32_t ld_count; 1179c0b332d1SPaul Saab uint32_t reserved1; 1180c0b332d1SPaul Saab struct { 1181441f6d5dSScott Long union mfi_ld_ref ld; 1182c0b332d1SPaul Saab uint8_t state; 1183c0b332d1SPaul Saab uint8_t reserved2[3]; 1184c0b332d1SPaul Saab uint64_t size; 1185c0b332d1SPaul Saab } ld_list[MFI_MAX_LD]; 1186c0b332d1SPaul Saab } __packed; 1187c0b332d1SPaul Saab 1188c0b332d1SPaul Saab enum mfi_ld_access { 1189c0b332d1SPaul Saab MFI_LD_ACCESS_RW = 0, 1190c0b332d1SPaul Saab MFI_LD_ACCSSS_RO = 2, 1191c0b332d1SPaul Saab MFI_LD_ACCESS_BLOCKED = 3, 1192c0b332d1SPaul Saab }; 1193c0b332d1SPaul Saab #define MFI_LD_ACCESS_MASK 3 1194c0b332d1SPaul Saab 1195c0b332d1SPaul Saab enum mfi_ld_state { 1196c0b332d1SPaul Saab MFI_LD_STATE_OFFLINE = 0, 1197c0b332d1SPaul Saab MFI_LD_STATE_PARTIALLY_DEGRADED = 1, 1198c0b332d1SPaul Saab MFI_LD_STATE_DEGRADED = 2, 1199c0b332d1SPaul Saab MFI_LD_STATE_OPTIMAL = 3 1200c0b332d1SPaul Saab }; 1201c0b332d1SPaul Saab 1202c0b332d1SPaul Saab struct mfi_ld_props { 1203441f6d5dSScott Long union mfi_ld_ref ld; 1204c0b332d1SPaul Saab char name[16]; 1205c0b332d1SPaul Saab uint8_t default_cache_policy; 1206c0b332d1SPaul Saab uint8_t access_policy; 1207c0b332d1SPaul Saab uint8_t disk_cache_policy; 1208c0b332d1SPaul Saab uint8_t current_cache_policy; 1209c0b332d1SPaul Saab uint8_t no_bgi; 1210c0b332d1SPaul Saab uint8_t reserved[7]; 1211c0b332d1SPaul Saab } __packed; 1212c0b332d1SPaul Saab 1213c0b332d1SPaul Saab struct mfi_ld_params { 1214c0b332d1SPaul Saab uint8_t primary_raid_level; 1215c0b332d1SPaul Saab uint8_t raid_level_qualifier; 1216c0b332d1SPaul Saab uint8_t secondary_raid_level; 1217c0b332d1SPaul Saab uint8_t stripe_size; 1218c0b332d1SPaul Saab uint8_t num_drives; 1219c0b332d1SPaul Saab uint8_t span_depth; 1220c0b332d1SPaul Saab uint8_t state; 1221c0b332d1SPaul Saab uint8_t init_state; 1222763fae79SScott Long #define MFI_LD_PARAMS_INIT_NO 0 1223763fae79SScott Long #define MFI_LD_PARAMS_INIT_QUICK 1 1224763fae79SScott Long #define MFI_LD_PARAMS_INIT_FULL 2 1225c0b332d1SPaul Saab uint8_t is_consistent; 12260d9a4ef3SDoug Ambrisko uint8_t reserved1[6]; 12270d9a4ef3SDoug Ambrisko uint8_t isSSCD; 12280d9a4ef3SDoug Ambrisko uint8_t reserved2[16]; 1229c0b332d1SPaul Saab } __packed; 1230c0b332d1SPaul Saab 1231c0b332d1SPaul Saab struct mfi_ld_progress { 1232c0b332d1SPaul Saab uint32_t active; 1233c0b332d1SPaul Saab #define MFI_LD_PROGRESS_CC (1<<0) 1234c0b332d1SPaul Saab #define MFI_LD_PROGRESS_BGI (1<<1) 1235c0b332d1SPaul Saab #define MFI_LD_PROGRESS_FGI (1<<2) 1236763fae79SScott Long #define MFI_LD_PROGRESS_RECON (1<<3) 1237c0b332d1SPaul Saab struct mfi_progress cc; 1238c0b332d1SPaul Saab struct mfi_progress bgi; 1239c0b332d1SPaul Saab struct mfi_progress fgi; 1240c0b332d1SPaul Saab struct mfi_progress recon; 1241c0b332d1SPaul Saab struct mfi_progress reserved[4]; 1242c0b332d1SPaul Saab } __packed; 1243c0b332d1SPaul Saab 1244c0b332d1SPaul Saab struct mfi_span { 1245c0b332d1SPaul Saab uint64_t start_block; 1246c0b332d1SPaul Saab uint64_t num_blocks; 1247c0b332d1SPaul Saab uint16_t array_ref; 1248c0b332d1SPaul Saab uint8_t reserved[6]; 1249c0b332d1SPaul Saab } __packed; 1250c0b332d1SPaul Saab 1251c0b332d1SPaul Saab #define MFI_MAX_SPAN_DEPTH 8 1252c0b332d1SPaul Saab struct mfi_ld_config { 1253c0b332d1SPaul Saab struct mfi_ld_props properties; 1254c0b332d1SPaul Saab struct mfi_ld_params params; 1255c0b332d1SPaul Saab struct mfi_span span[MFI_MAX_SPAN_DEPTH]; 1256c0b332d1SPaul Saab } __packed; 1257c0b332d1SPaul Saab 1258c0b332d1SPaul Saab struct mfi_ld_info { 1259c0b332d1SPaul Saab struct mfi_ld_config ld_config; 1260c0b332d1SPaul Saab uint64_t size; 1261c0b332d1SPaul Saab struct mfi_ld_progress progress; 1262c0b332d1SPaul Saab uint16_t cluster_owner; 1263c0b332d1SPaul Saab uint8_t reconstruct_active; 1264c0b332d1SPaul Saab uint8_t reserved1[1]; 1265c0b332d1SPaul Saab uint8_t vpd_page83[64]; 1266c0b332d1SPaul Saab uint8_t reserved2[16]; 1267c0b332d1SPaul Saab } __packed; 1268c0b332d1SPaul Saab 1269a6ba0fd6SDoug Ambrisko #define MFI_MAX_ARRAYS 16 1270441f6d5dSScott Long struct mfi_spare { 1271441f6d5dSScott Long union mfi_pd_ref ref; 1272763fae79SScott Long uint8_t spare_type; 1273763fae79SScott Long #define MFI_SPARE_DEDICATED (1 << 0) 1274763fae79SScott Long #define MFI_SPARE_REVERTIBLE (1 << 1) 1275763fae79SScott Long #define MFI_SPARE_ENCL_AFFINITY (1 << 2) 1276441f6d5dSScott Long uint8_t reserved[2]; 1277441f6d5dSScott Long uint8_t array_count; 1278a6ba0fd6SDoug Ambrisko uint16_t array_ref[MFI_MAX_ARRAYS]; 1279441f6d5dSScott Long } __packed; 1280441f6d5dSScott Long 1281a6ba0fd6SDoug Ambrisko #define MFI_MAX_ROW_SIZE 32 1282441f6d5dSScott Long struct mfi_array { 1283441f6d5dSScott Long uint64_t size; 1284441f6d5dSScott Long uint8_t num_drives; 1285441f6d5dSScott Long uint8_t reserved; 1286441f6d5dSScott Long uint16_t array_ref; 1287441f6d5dSScott Long uint8_t pad[20]; 1288441f6d5dSScott Long struct { 1289763fae79SScott Long union mfi_pd_ref ref; /* 0xffff == missing drive */ 1290763fae79SScott Long uint16_t fw_state; /* MFI_PD_STATE_* */ 1291441f6d5dSScott Long struct { 1292441f6d5dSScott Long uint8_t pd; 1293441f6d5dSScott Long uint8_t slot; 1294441f6d5dSScott Long } encl; 1295a6ba0fd6SDoug Ambrisko } pd[MFI_MAX_ROW_SIZE]; 1296441f6d5dSScott Long } __packed; 1297441f6d5dSScott Long 1298441f6d5dSScott Long struct mfi_config_data { 1299441f6d5dSScott Long uint32_t size; 1300441f6d5dSScott Long uint16_t array_count; 1301441f6d5dSScott Long uint16_t array_size; 1302441f6d5dSScott Long uint16_t log_drv_count; 1303441f6d5dSScott Long uint16_t log_drv_size; 1304441f6d5dSScott Long uint16_t spares_count; 1305441f6d5dSScott Long uint16_t spares_size; 1306441f6d5dSScott Long uint8_t reserved[16]; 1307763fae79SScott Long struct mfi_array array[0]; 1308763fae79SScott Long struct mfi_ld_config ld[0]; 1309763fae79SScott Long struct mfi_spare spare[0]; 1310441f6d5dSScott Long } __packed; 1311441f6d5dSScott Long 1312763fae79SScott Long struct mfi_bbu_capacity_info { 1313763fae79SScott Long uint16_t relative_charge; 1314763fae79SScott Long uint16_t absolute_charge; 1315763fae79SScott Long uint16_t remaining_capacity; 1316763fae79SScott Long uint16_t full_charge_capacity; 1317763fae79SScott Long uint16_t run_time_to_empty; 1318763fae79SScott Long uint16_t average_time_to_empty; 1319763fae79SScott Long uint16_t average_time_to_full; 1320763fae79SScott Long uint16_t cycle_count; 1321763fae79SScott Long uint16_t max_error; 1322763fae79SScott Long uint16_t remaining_capacity_alarm; 1323763fae79SScott Long uint16_t remaining_time_alarm; 1324763fae79SScott Long uint8_t reserved[26]; 1325763fae79SScott Long } __packed; 1326763fae79SScott Long 1327763fae79SScott Long struct mfi_bbu_design_info { 1328763fae79SScott Long uint32_t mfg_date; 1329763fae79SScott Long uint16_t design_capacity; 1330763fae79SScott Long uint16_t design_voltage; 1331763fae79SScott Long uint16_t spec_info; 1332763fae79SScott Long uint16_t serial_number; 1333763fae79SScott Long uint16_t pack_stat_config; 1334763fae79SScott Long uint8_t mfg_name[12]; 1335763fae79SScott Long uint8_t device_name[8]; 1336763fae79SScott Long uint8_t device_chemistry[8]; 1337763fae79SScott Long uint8_t mfg_data[8]; 1338763fae79SScott Long uint8_t reserved[17]; 1339763fae79SScott Long } __packed; 1340763fae79SScott Long 1341763fae79SScott Long struct mfi_ibbu_state { 1342763fae79SScott Long uint16_t gas_guage_status; 1343763fae79SScott Long uint16_t relative_charge; 1344763fae79SScott Long uint16_t charger_system_state; 1345763fae79SScott Long uint16_t charger_system_ctrl; 1346763fae79SScott Long uint16_t charging_current; 1347763fae79SScott Long uint16_t absolute_charge; 1348763fae79SScott Long uint16_t max_error; 1349763fae79SScott Long uint8_t reserved[18]; 1350763fae79SScott Long } __packed; 1351763fae79SScott Long 1352763fae79SScott Long struct mfi_bbu_state { 1353763fae79SScott Long uint16_t gas_guage_status; 1354763fae79SScott Long uint16_t relative_charge; 1355763fae79SScott Long uint16_t charger_status; 1356763fae79SScott Long uint16_t remaining_capacity; 1357763fae79SScott Long uint16_t full_charge_capacity; 1358763fae79SScott Long uint8_t is_SOH_good; 1359763fae79SScott Long uint8_t reserved[21]; 1360763fae79SScott Long } __packed; 1361763fae79SScott Long 1362763fae79SScott Long union mfi_bbu_status_detail { 1363763fae79SScott Long struct mfi_ibbu_state ibbu; 1364763fae79SScott Long struct mfi_bbu_state bbu; 1365763fae79SScott Long }; 1366763fae79SScott Long 1367763fae79SScott Long struct mfi_bbu_status { 1368763fae79SScott Long uint8_t battery_type; 1369763fae79SScott Long #define MFI_BBU_TYPE_NONE 0 1370763fae79SScott Long #define MFI_BBU_TYPE_IBBU 1 1371763fae79SScott Long #define MFI_BBU_TYPE_BBU 2 1372763fae79SScott Long uint8_t reserved; 1373763fae79SScott Long uint16_t voltage; 1374763fae79SScott Long int16_t current; 1375763fae79SScott Long uint16_t temperature; 1376763fae79SScott Long uint32_t fw_status; 1377763fae79SScott Long #define MFI_BBU_STATE_PACK_MISSING (1 << 0) 1378763fae79SScott Long #define MFI_BBU_STATE_VOLTAGE_LOW (1 << 1) 1379763fae79SScott Long #define MFI_BBU_STATE_TEMPERATURE_HIGH (1 << 2) 1380763fae79SScott Long #define MFI_BBU_STATE_CHARGE_ACTIVE (1 << 0) 1381763fae79SScott Long #define MFI_BBU_STATE_DISCHARGE_ACTIVE (1 << 0) 1382763fae79SScott Long uint8_t pad[20]; 1383763fae79SScott Long union mfi_bbu_status_detail detail; 1384763fae79SScott Long } __packed; 1385763fae79SScott Long 1386763fae79SScott Long enum mfi_pr_state { 1387763fae79SScott Long MFI_PR_STATE_STOPPED = 0, 1388763fae79SScott Long MFI_PR_STATE_READY = 1, 1389763fae79SScott Long MFI_PR_STATE_ACTIVE = 2, 1390763fae79SScott Long MFI_PR_STATE_ABORTED = 0xff 1391763fae79SScott Long }; 1392763fae79SScott Long 1393763fae79SScott Long struct mfi_pr_status { 1394763fae79SScott Long uint32_t num_iteration; 1395763fae79SScott Long uint8_t state; 1396763fae79SScott Long uint8_t num_pd_done; 1397763fae79SScott Long uint8_t reserved[10]; 1398763fae79SScott Long }; 1399763fae79SScott Long 1400763fae79SScott Long enum mfi_pr_opmode { 1401763fae79SScott Long MFI_PR_OPMODE_AUTO = 0, 1402763fae79SScott Long MFI_PR_OPMODE_MANUAL = 1, 1403763fae79SScott Long MFI_PR_OPMODE_DISABLED = 2 1404763fae79SScott Long }; 1405763fae79SScott Long 1406763fae79SScott Long struct mfi_pr_properties { 1407763fae79SScott Long uint8_t op_mode; 1408763fae79SScott Long uint8_t max_pd; 1409763fae79SScott Long uint8_t reserved; 1410763fae79SScott Long uint8_t exclude_ld_count; 1411763fae79SScott Long uint16_t excluded_ld[MFI_MAX_LD]; 1412763fae79SScott Long uint8_t cur_pd_map[MFI_MAX_PD / 8]; 1413763fae79SScott Long uint8_t last_pd_map[MFI_MAX_PD / 8]; 1414763fae79SScott Long uint32_t next_exec; 1415763fae79SScott Long uint32_t exec_freq; 1416763fae79SScott Long uint32_t clear_freq; 1417763fae79SScott Long }; 1418763fae79SScott Long 14190d9a4ef3SDoug Ambrisko /* ThunderBolt support */ 14200d9a4ef3SDoug Ambrisko 14210d9a4ef3SDoug Ambrisko /* 14220d9a4ef3SDoug Ambrisko * Raid Context structure which describes MegaRAID specific IO Paramenters 14230d9a4ef3SDoug Ambrisko * This resides at offset 0x60 where the SGL normally starts in MPT IO Frames 14240d9a4ef3SDoug Ambrisko */ 14250d9a4ef3SDoug Ambrisko typedef struct _MPI2_SCSI_IO_VENDOR_UNIQUE { 1426a6ba0fd6SDoug Ambrisko uint16_t resvd0; /* 0x00 - 0x01 */ 1427a6ba0fd6SDoug Ambrisko uint16_t timeoutValue; /* 0x02 - 0x03 */ 14280d9a4ef3SDoug Ambrisko uint8_t regLockFlags; 14290d9a4ef3SDoug Ambrisko uint8_t armId; 1430a6ba0fd6SDoug Ambrisko uint16_t TargetID; /* 0x06 - 0x07 */ 14310d9a4ef3SDoug Ambrisko 1432a6ba0fd6SDoug Ambrisko uint64_t RegLockLBA; /* 0x08 - 0x0F */ 14330d9a4ef3SDoug Ambrisko 1434a6ba0fd6SDoug Ambrisko uint32_t RegLockLength; /* 0x10 - 0x13 */ 14350d9a4ef3SDoug Ambrisko 1436a6ba0fd6SDoug Ambrisko uint16_t SMID; /* 0x14 - 0x15 nextLMId */ 1437a6ba0fd6SDoug Ambrisko uint8_t exStatus; /* 0x16 */ 1438a6ba0fd6SDoug Ambrisko uint8_t Status; /* 0x17 status */ 14390d9a4ef3SDoug Ambrisko 1440a6ba0fd6SDoug Ambrisko uint8_t RAIDFlags; /* 0x18 */ 1441a6ba0fd6SDoug Ambrisko uint8_t numSGE; /* 0x19 numSge */ 1442a6ba0fd6SDoug Ambrisko uint16_t configSeqNum; /* 0x1A - 0x1B */ 1443a6ba0fd6SDoug Ambrisko uint8_t spanArm; /* 0x1C */ 1444a6ba0fd6SDoug Ambrisko uint8_t resvd2[3]; /* 0x1D - 0x1F */ 14450d9a4ef3SDoug Ambrisko } MPI2_SCSI_IO_VENDOR_UNIQUE, MPI25_SCSI_IO_VENDOR_UNIQUE; 14460d9a4ef3SDoug Ambrisko 14470d9a4ef3SDoug Ambrisko /***************************************************************************** 14480d9a4ef3SDoug Ambrisko * 14490d9a4ef3SDoug Ambrisko * Message Functions 14500d9a4ef3SDoug Ambrisko * 14510d9a4ef3SDoug Ambrisko *****************************************************************************/ 14520d9a4ef3SDoug Ambrisko 14530d9a4ef3SDoug Ambrisko #define NA_MPI2_FUNCTION_SCSI_IO_REQUEST (0x00) /* SCSI IO */ 14540d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_SCSI_TASK_MGMT (0x01) /* SCSI Task Management */ 14550d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_IOC_INIT (0x02) /* IOC Init */ 14560d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_IOC_FACTS (0x03) /* IOC Facts */ 14570d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_CONFIG (0x04) /* Configuration */ 14580d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_PORT_FACTS (0x05) /* Port Facts */ 14590d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_PORT_ENABLE (0x06) /* Port Enable */ 14600d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_EVENT_NOTIFICATION (0x07) /* Event Notification */ 14610d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_EVENT_ACK (0x08) /* Event Acknowledge */ 14620d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_FW_DOWNLOAD (0x09) /* FW Download */ 14630d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_TARGET_ASSIST (0x0B) /* Target Assist */ 14640d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_TARGET_STATUS_SEND (0x0C) /* Target Status Send */ 14650d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_TARGET_MODE_ABORT (0x0D) /* Target Mode Abort */ 14660d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_FW_UPLOAD (0x12) /* FW Upload */ 14670d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_RAID_ACTION (0x15) /* RAID Action */ 14680d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH (0x16) /* SCSI IO RAID Passthrough */ 14690d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_TOOLBOX (0x17) /* Toolbox */ 14700d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_SCSI_ENCLOSURE_PROCESSOR (0x18) /* SCSI Enclosure Processor */ 14710d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_SMP_PASSTHROUGH (0x1A) /* SMP Passthrough */ 14720d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_SAS_IO_UNIT_CONTROL (0x1B) /* SAS IO Unit Control */ 14730d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_SATA_PASSTHROUGH (0x1C) /* SATA Passthrough */ 14740d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_DIAG_BUFFER_POST (0x1D) /* Diagnostic Buffer Post */ 14750d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_DIAG_RELEASE (0x1E) /* Diagnostic Release */ 14760d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_TARGET_CMD_BUF_BASE_POST (0x24) /* Target Command Buffer Post Base */ 14770d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_TARGET_CMD_BUF_LIST_POST (0x25) /* Target Command Buffer Post List */ 14780d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_RAID_ACCELERATOR (0x2C) /* RAID Accelerator */ 14790d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_HOST_BASED_DISCOVERY_ACTION (0x2F) /* Host Based Discovery Action */ 14800d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_PWR_MGMT_CONTROL (0x30) /* Power Management Control */ 14810d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_MIN_PRODUCT_SPECIFIC (0xF0) /* beginning of product-specific range */ 14820d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_MAX_PRODUCT_SPECIFIC (0xFF) /* end of product-specific range */ 14830d9a4ef3SDoug Ambrisko 14840d9a4ef3SDoug Ambrisko /* Doorbell functions */ 14850d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET (0x40) 14860d9a4ef3SDoug Ambrisko #define MPI2_FUNCTION_HANDSHAKE (0x42) 14870d9a4ef3SDoug Ambrisko 14880d9a4ef3SDoug Ambrisko /***************************************************************************** 14890d9a4ef3SDoug Ambrisko * 14900d9a4ef3SDoug Ambrisko * MPI Version Definitions 14910d9a4ef3SDoug Ambrisko * 14920d9a4ef3SDoug Ambrisko *****************************************************************************/ 14930d9a4ef3SDoug Ambrisko 14940d9a4ef3SDoug Ambrisko #define MPI2_VERSION_MAJOR (0x02) 14950d9a4ef3SDoug Ambrisko #define MPI2_VERSION_MINOR (0x00) 14960d9a4ef3SDoug Ambrisko #define MPI2_VERSION_MAJOR_MASK (0xFF00) 14970d9a4ef3SDoug Ambrisko #define MPI2_VERSION_MAJOR_SHIFT (8) 14980d9a4ef3SDoug Ambrisko #define MPI2_VERSION_MINOR_MASK (0x00FF) 14990d9a4ef3SDoug Ambrisko #define MPI2_VERSION_MINOR_SHIFT (0) 15000d9a4ef3SDoug Ambrisko #define MPI2_VERSION ((MPI2_VERSION_MAJOR << MPI2_VERSION_MAJOR_SHIFT) | \ 15010d9a4ef3SDoug Ambrisko MPI2_VERSION_MINOR) 15020d9a4ef3SDoug Ambrisko 15030d9a4ef3SDoug Ambrisko #define MPI2_VERSION_02_00 (0x0200) 15040d9a4ef3SDoug Ambrisko 15050d9a4ef3SDoug Ambrisko /* versioning for this MPI header set */ 15060d9a4ef3SDoug Ambrisko #define MPI2_HEADER_VERSION_UNIT (0x10) 15070d9a4ef3SDoug Ambrisko #define MPI2_HEADER_VERSION_DEV (0x00) 15080d9a4ef3SDoug Ambrisko #define MPI2_HEADER_VERSION_UNIT_MASK (0xFF00) 15090d9a4ef3SDoug Ambrisko #define MPI2_HEADER_VERSION_UNIT_SHIFT (8) 15100d9a4ef3SDoug Ambrisko #define MPI2_HEADER_VERSION_DEV_MASK (0x00FF) 15110d9a4ef3SDoug Ambrisko #define MPI2_HEADER_VERSION_DEV_SHIFT (0) 1512a6ba0fd6SDoug Ambrisko #define MPI2_HEADER_VERSION ((MPI2_HEADER_VERSION_UNIT << 8) | \ 1513a6ba0fd6SDoug Ambrisko MPI2_HEADER_VERSION_DEV) 15140d9a4ef3SDoug Ambrisko 15150d9a4ef3SDoug Ambrisko 15160d9a4ef3SDoug Ambrisko /* IOCInit Request message */ 1517a6ba0fd6SDoug Ambrisko struct MPI2_IOC_INIT_REQUEST { 15180d9a4ef3SDoug Ambrisko uint8_t WhoInit; /* 0x00 */ 15190d9a4ef3SDoug Ambrisko uint8_t Reserved1; /* 0x01 */ 15200d9a4ef3SDoug Ambrisko uint8_t ChainOffset; /* 0x02 */ 15210d9a4ef3SDoug Ambrisko uint8_t Function; /* 0x03 */ 15220d9a4ef3SDoug Ambrisko uint16_t Reserved2; /* 0x04 */ 15230d9a4ef3SDoug Ambrisko uint8_t Reserved3; /* 0x06 */ 15240d9a4ef3SDoug Ambrisko uint8_t MsgFlags; /* 0x07 */ 15250d9a4ef3SDoug Ambrisko uint8_t VP_ID; /* 0x08 */ 15260d9a4ef3SDoug Ambrisko uint8_t VF_ID; /* 0x09 */ 15270d9a4ef3SDoug Ambrisko uint16_t Reserved4; /* 0x0A */ 15280d9a4ef3SDoug Ambrisko uint16_t MsgVersion; /* 0x0C */ 15290d9a4ef3SDoug Ambrisko uint16_t HeaderVersion; /* 0x0E */ 15300d9a4ef3SDoug Ambrisko uint32_t Reserved5; /* 0x10 */ 15310d9a4ef3SDoug Ambrisko uint16_t Reserved6; /* 0x14 */ 15320d9a4ef3SDoug Ambrisko uint8_t Reserved7; /* 0x16 */ 15330d9a4ef3SDoug Ambrisko uint8_t HostMSIxVectors; /* 0x17 */ 15340d9a4ef3SDoug Ambrisko uint16_t Reserved8; /* 0x18 */ 15350d9a4ef3SDoug Ambrisko uint16_t SystemRequestFrameSize; /* 0x1A */ 15360d9a4ef3SDoug Ambrisko uint16_t ReplyDescriptorPostQueueDepth; /* 0x1C */ 15370d9a4ef3SDoug Ambrisko uint16_t ReplyFreeQueueDepth; /* 0x1E */ 15380d9a4ef3SDoug Ambrisko uint32_t SenseBufferAddressHigh; /* 0x20 */ 15390d9a4ef3SDoug Ambrisko uint32_t SystemReplyAddressHigh; /* 0x24 */ 15400d9a4ef3SDoug Ambrisko uint64_t SystemRequestFrameBaseAddress; /* 0x28 */ 15410d9a4ef3SDoug Ambrisko uint64_t ReplyDescriptorPostQueueAddress;/* 0x30 */ 15420d9a4ef3SDoug Ambrisko uint64_t ReplyFreeQueueAddress; /* 0x38 */ 15430d9a4ef3SDoug Ambrisko uint64_t TimeStamp; /* 0x40 */ 15440d9a4ef3SDoug Ambrisko }; 15450d9a4ef3SDoug Ambrisko 15460d9a4ef3SDoug Ambrisko /* WhoInit values */ 15470d9a4ef3SDoug Ambrisko #define MPI2_WHOINIT_NOT_INITIALIZED (0x00) 15480d9a4ef3SDoug Ambrisko #define MPI2_WHOINIT_SYSTEM_BIOS (0x01) 15490d9a4ef3SDoug Ambrisko #define MPI2_WHOINIT_ROM_BIOS (0x02) 15500d9a4ef3SDoug Ambrisko #define MPI2_WHOINIT_PCI_PEER (0x03) 15510d9a4ef3SDoug Ambrisko #define MPI2_WHOINIT_HOST_DRIVER (0x04) 15520d9a4ef3SDoug Ambrisko #define MPI2_WHOINIT_MANUFACTURER (0x05) 15530d9a4ef3SDoug Ambrisko 1554a6ba0fd6SDoug Ambrisko struct MPI2_SGE_CHAIN_UNION { 15550d9a4ef3SDoug Ambrisko uint16_t Length; 15560d9a4ef3SDoug Ambrisko uint8_t NextChainOffset; 15570d9a4ef3SDoug Ambrisko uint8_t Flags; 1558a6ba0fd6SDoug Ambrisko union { 15590d9a4ef3SDoug Ambrisko uint32_t Address32; 15600d9a4ef3SDoug Ambrisko uint64_t Address64; 15610d9a4ef3SDoug Ambrisko } u; 15620d9a4ef3SDoug Ambrisko }; 15630d9a4ef3SDoug Ambrisko 1564a6ba0fd6SDoug Ambrisko struct MPI2_IEEE_SGE_SIMPLE32 { 15650d9a4ef3SDoug Ambrisko uint32_t Address; 15660d9a4ef3SDoug Ambrisko uint32_t FlagsLength; 15670d9a4ef3SDoug Ambrisko }; 15680d9a4ef3SDoug Ambrisko 1569a6ba0fd6SDoug Ambrisko struct MPI2_IEEE_SGE_SIMPLE64 { 15700d9a4ef3SDoug Ambrisko uint64_t Address; 15710d9a4ef3SDoug Ambrisko uint32_t Length; 15720d9a4ef3SDoug Ambrisko uint16_t Reserved1; 15730d9a4ef3SDoug Ambrisko uint8_t Reserved2; 15740d9a4ef3SDoug Ambrisko uint8_t Flags; 15750d9a4ef3SDoug Ambrisko }; 15760d9a4ef3SDoug Ambrisko 1577a6ba0fd6SDoug Ambrisko typedef union _MPI2_IEEE_SGE_SIMPLE_UNION { 15780d9a4ef3SDoug Ambrisko struct MPI2_IEEE_SGE_SIMPLE32 Simple32; 15790d9a4ef3SDoug Ambrisko struct MPI2_IEEE_SGE_SIMPLE64 Simple64; 15800d9a4ef3SDoug Ambrisko } MPI2_IEEE_SGE_SIMPLE_UNION; 15810d9a4ef3SDoug Ambrisko 1582a6ba0fd6SDoug Ambrisko typedef struct _MPI2_SGE_SIMPLE_UNION { 15830d9a4ef3SDoug Ambrisko uint32_t FlagsLength; 1584a6ba0fd6SDoug Ambrisko union { 15850d9a4ef3SDoug Ambrisko uint32_t Address32; 15860d9a4ef3SDoug Ambrisko uint64_t Address64; 15870d9a4ef3SDoug Ambrisko } u; 15880d9a4ef3SDoug Ambrisko } MPI2_SGE_SIMPLE_UNION; 15890d9a4ef3SDoug Ambrisko 15900d9a4ef3SDoug Ambrisko /**************************************************************************** 15910d9a4ef3SDoug Ambrisko * IEEE SGE field definitions and masks 15920d9a4ef3SDoug Ambrisko ****************************************************************************/ 15930d9a4ef3SDoug Ambrisko 15940d9a4ef3SDoug Ambrisko /* Flags field bit definitions */ 15950d9a4ef3SDoug Ambrisko 15960d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_ELEMENT_TYPE_MASK (0x80) 15970d9a4ef3SDoug Ambrisko 15980d9a4ef3SDoug Ambrisko #define MPI2_IEEE32_SGE_FLAGS_SHIFT (24) 15990d9a4ef3SDoug Ambrisko 16000d9a4ef3SDoug Ambrisko #define MPI2_IEEE32_SGE_LENGTH_MASK (0x00FFFFFF) 16010d9a4ef3SDoug Ambrisko 16020d9a4ef3SDoug Ambrisko /* Element Type */ 16030d9a4ef3SDoug Ambrisko 16040d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_SIMPLE_ELEMENT (0x00) 16050d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_CHAIN_ELEMENT (0x80) 16060d9a4ef3SDoug Ambrisko 16070d9a4ef3SDoug Ambrisko /* Data Location Address Space */ 16080d9a4ef3SDoug Ambrisko 16090d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_ADDR_MASK (0x03) 16100d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_SYSTEM_ADDR (0x00) 16110d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_IOCDDR_ADDR (0x01) 16120d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_IOCPLB_ADDR (0x02) 16130d9a4ef3SDoug Ambrisko #define MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR (0x03) 16140d9a4ef3SDoug Ambrisko 16150d9a4ef3SDoug Ambrisko /* Address Size */ 16160d9a4ef3SDoug Ambrisko 16170d9a4ef3SDoug Ambrisko #define MPI2_SGE_FLAGS_32_BIT_ADDRESSING (0x00) 16180d9a4ef3SDoug Ambrisko #define MPI2_SGE_FLAGS_64_BIT_ADDRESSING (0x02) 16190d9a4ef3SDoug Ambrisko 16200d9a4ef3SDoug Ambrisko /*******************/ 16210d9a4ef3SDoug Ambrisko /* SCSI IO Control bits */ 16220d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_ADDCDBLEN_MASK (0xFC000000) 16230d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_ADDCDBLEN_SHIFT (26) 16240d9a4ef3SDoug Ambrisko 16250d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_DATADIRECTION_MASK (0x03000000) 16260d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_NODATATRANSFER (0x00000000) 16270d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_WRITE (0x01000000) 16280d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_READ (0x02000000) 16290d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_BIDIRECTIONAL (0x03000000) 16300d9a4ef3SDoug Ambrisko 16310d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_TASKPRI_MASK (0x00007800) 16320d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_TASKPRI_SHIFT (11) 16330d9a4ef3SDoug Ambrisko 16340d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_TASKATTRIBUTE_MASK (0x00000700) 16350d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_SIMPLEQ (0x00000000) 16360d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_HEADOFQ (0x00000100) 16370d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_ORDEREDQ (0x00000200) 16380d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_ACAQ (0x00000400) 16390d9a4ef3SDoug Ambrisko 16400d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_TLR_MASK (0x000000C0) 16410d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_NO_TLR (0x00000000) 16420d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_TLR_ON (0x00000040) 16430d9a4ef3SDoug Ambrisko #define MPI2_SCSIIO_CONTROL_TLR_OFF (0x00000080) 16440d9a4ef3SDoug Ambrisko 16450d9a4ef3SDoug Ambrisko /*******************/ 16460d9a4ef3SDoug Ambrisko 1647a6ba0fd6SDoug Ambrisko typedef struct { 16480d9a4ef3SDoug Ambrisko uint8_t CDB[20]; /* 0x00 */ 16490d9a4ef3SDoug Ambrisko uint32_t PrimaryReferenceTag; /* 0x14 */ 16500d9a4ef3SDoug Ambrisko uint16_t PrimaryApplicationTag; /* 0x18 */ 16510d9a4ef3SDoug Ambrisko uint16_t PrimaryApplicationTagMask; /* 0x1A */ 16520d9a4ef3SDoug Ambrisko uint32_t TransferLength; /* 0x1C */ 16530d9a4ef3SDoug Ambrisko } MPI2_SCSI_IO_CDB_EEDP32; 16540d9a4ef3SDoug Ambrisko 16550d9a4ef3SDoug Ambrisko 1656a6ba0fd6SDoug Ambrisko typedef union _MPI2_IEEE_SGE_CHAIN_UNION { 16570d9a4ef3SDoug Ambrisko struct MPI2_IEEE_SGE_SIMPLE32 Chain32; 16580d9a4ef3SDoug Ambrisko struct MPI2_IEEE_SGE_SIMPLE64 Chain64; 16590d9a4ef3SDoug Ambrisko } MPI2_IEEE_SGE_CHAIN_UNION; 16600d9a4ef3SDoug Ambrisko 1661a6ba0fd6SDoug Ambrisko typedef union _MPI2_SIMPLE_SGE_UNION { 16620d9a4ef3SDoug Ambrisko MPI2_SGE_SIMPLE_UNION MpiSimple; 16630d9a4ef3SDoug Ambrisko MPI2_IEEE_SGE_SIMPLE_UNION IeeeSimple; 16640d9a4ef3SDoug Ambrisko } MPI2_SIMPLE_SGE_UNION; 16650d9a4ef3SDoug Ambrisko 1666a6ba0fd6SDoug Ambrisko typedef union _MPI2_SGE_IO_UNION { 16670d9a4ef3SDoug Ambrisko MPI2_SGE_SIMPLE_UNION MpiSimple; 16680d9a4ef3SDoug Ambrisko struct MPI2_SGE_CHAIN_UNION MpiChain; 16690d9a4ef3SDoug Ambrisko MPI2_IEEE_SGE_SIMPLE_UNION IeeeSimple; 16700d9a4ef3SDoug Ambrisko MPI2_IEEE_SGE_CHAIN_UNION IeeeChain; 16710d9a4ef3SDoug Ambrisko } MPI2_SGE_IO_UNION; 16720d9a4ef3SDoug Ambrisko 1673a6ba0fd6SDoug Ambrisko typedef union { 16740d9a4ef3SDoug Ambrisko uint8_t CDB32[32]; 16750d9a4ef3SDoug Ambrisko MPI2_SCSI_IO_CDB_EEDP32 EEDP32; 16760d9a4ef3SDoug Ambrisko MPI2_SGE_SIMPLE_UNION SGE; 16770d9a4ef3SDoug Ambrisko } MPI2_SCSI_IO_CDB_UNION; 16780d9a4ef3SDoug Ambrisko 16790d9a4ef3SDoug Ambrisko 16800d9a4ef3SDoug Ambrisko /* MPI 2.5 SGLs */ 16810d9a4ef3SDoug Ambrisko 16820d9a4ef3SDoug Ambrisko #define MPI25_IEEE_SGE_FLAGS_END_OF_LIST (0x40) 16830d9a4ef3SDoug Ambrisko 1684a6ba0fd6SDoug Ambrisko typedef struct _MPI25_IEEE_SGE_CHAIN64 { 16850d9a4ef3SDoug Ambrisko uint64_t Address; 16860d9a4ef3SDoug Ambrisko uint32_t Length; 16870d9a4ef3SDoug Ambrisko uint16_t Reserved1; 16880d9a4ef3SDoug Ambrisko uint8_t NextChainOffset; 16890d9a4ef3SDoug Ambrisko uint8_t Flags; 16900d9a4ef3SDoug Ambrisko } MPI25_IEEE_SGE_CHAIN64, *pMpi25IeeeSgeChain64_t; 16910d9a4ef3SDoug Ambrisko 16920d9a4ef3SDoug Ambrisko /* use MPI2_IEEE_SGE_FLAGS_ defines for the Flags field */ 16930d9a4ef3SDoug Ambrisko 16940d9a4ef3SDoug Ambrisko 16950d9a4ef3SDoug Ambrisko /********/ 16960d9a4ef3SDoug Ambrisko 16970d9a4ef3SDoug Ambrisko /* 16980d9a4ef3SDoug Ambrisko * RAID SCSI IO Request Message 16990d9a4ef3SDoug Ambrisko * Total SGE count will be one less than _MPI2_SCSI_IO_REQUEST 17000d9a4ef3SDoug Ambrisko */ 1701a6ba0fd6SDoug Ambrisko struct mfi_mpi2_request_raid_scsi_io { 17020d9a4ef3SDoug Ambrisko uint16_t DevHandle; /* 0x00 */ 17030d9a4ef3SDoug Ambrisko uint8_t ChainOffset; /* 0x02 */ 17040d9a4ef3SDoug Ambrisko uint8_t Function; /* 0x03 */ 17050d9a4ef3SDoug Ambrisko uint16_t Reserved1; /* 0x04 */ 17060d9a4ef3SDoug Ambrisko uint8_t Reserved2; /* 0x06 */ 17070d9a4ef3SDoug Ambrisko uint8_t MsgFlags; /* 0x07 */ 17080d9a4ef3SDoug Ambrisko uint8_t VP_ID; /* 0x08 */ 17090d9a4ef3SDoug Ambrisko uint8_t VF_ID; /* 0x09 */ 17100d9a4ef3SDoug Ambrisko uint16_t Reserved3; /* 0x0A */ 17110d9a4ef3SDoug Ambrisko uint32_t SenseBufferLowAddress; /* 0x0C */ 17120d9a4ef3SDoug Ambrisko uint16_t SGLFlags; /* 0x10 */ 17130d9a4ef3SDoug Ambrisko uint8_t SenseBufferLength; /* 0x12 */ 17140d9a4ef3SDoug Ambrisko uint8_t Reserved4; /* 0x13 */ 17150d9a4ef3SDoug Ambrisko uint8_t SGLOffset0; /* 0x14 */ 17160d9a4ef3SDoug Ambrisko uint8_t SGLOffset1; /* 0x15 */ 17170d9a4ef3SDoug Ambrisko uint8_t SGLOffset2; /* 0x16 */ 17180d9a4ef3SDoug Ambrisko uint8_t SGLOffset3; /* 0x17 */ 17190d9a4ef3SDoug Ambrisko uint32_t SkipCount; /* 0x18 */ 17200d9a4ef3SDoug Ambrisko uint32_t DataLength; /* 0x1C */ 17210d9a4ef3SDoug Ambrisko uint32_t BidirectionalDataLength; /* 0x20 */ 17220d9a4ef3SDoug Ambrisko uint16_t IoFlags; /* 0x24 */ 17230d9a4ef3SDoug Ambrisko uint16_t EEDPFlags; /* 0x26 */ 17240d9a4ef3SDoug Ambrisko uint32_t EEDPBlockSize; /* 0x28 */ 17250d9a4ef3SDoug Ambrisko uint32_t SecondaryReferenceTag; /* 0x2C */ 17260d9a4ef3SDoug Ambrisko uint16_t SecondaryApplicationTag; /* 0x30 */ 17270d9a4ef3SDoug Ambrisko uint16_t ApplicationTagTranslationMask; /* 0x32 */ 17280d9a4ef3SDoug Ambrisko uint8_t LUN[8]; /* 0x34 */ 17290d9a4ef3SDoug Ambrisko uint32_t Control; /* 0x3C */ 17300d9a4ef3SDoug Ambrisko MPI2_SCSI_IO_CDB_UNION CDB; /* 0x40 */ 17310d9a4ef3SDoug Ambrisko MPI2_SCSI_IO_VENDOR_UNIQUE RaidContext; /* 0x60 */ 17320d9a4ef3SDoug Ambrisko MPI2_SGE_IO_UNION SGL; /* 0x80 */ 17330d9a4ef3SDoug Ambrisko } __packed; 17340d9a4ef3SDoug Ambrisko 17350d9a4ef3SDoug Ambrisko /* 17360d9a4ef3SDoug Ambrisko * MPT RAID MFA IO Descriptor. 17370d9a4ef3SDoug Ambrisko */ 17380d9a4ef3SDoug Ambrisko typedef struct _MFI_RAID_MFA_IO_DESCRIPTOR { 17390d9a4ef3SDoug Ambrisko uint32_t RequestFlags : 8; 17400d9a4ef3SDoug Ambrisko uint32_t MessageAddress1 : 24; /* bits 31:8*/ 17410d9a4ef3SDoug Ambrisko uint32_t MessageAddress2; /* bits 61:32 */ 17420d9a4ef3SDoug Ambrisko } MFI_RAID_MFA_IO_REQUEST_DESCRIPTOR,*PMFI_RAID_MFA_IO_REQUEST_DESCRIPTOR; 17430d9a4ef3SDoug Ambrisko 17440d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_header { 17450d9a4ef3SDoug Ambrisko uint8_t RequestFlags; /* 0x00 */ 17460d9a4ef3SDoug Ambrisko uint8_t MSIxIndex; /* 0x01 */ 17470d9a4ef3SDoug Ambrisko uint16_t SMID; /* 0x02 */ 17480d9a4ef3SDoug Ambrisko uint16_t LMID; /* 0x04 */ 17490d9a4ef3SDoug Ambrisko }; 17500d9a4ef3SDoug Ambrisko 17510d9a4ef3SDoug Ambrisko /* defines for the RequestFlags field */ 17520d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_TYPE_MASK (0x0E) 17530d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO (0x00) 17540d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_SCSI_TARGET (0x02) 17550d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY (0x06) 17560d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE (0x08) 17570d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_RAID_ACCELERATOR (0x0A) 17580d9a4ef3SDoug Ambrisko 17590d9a4ef3SDoug Ambrisko #define MPI2_REQ_DESCRIPT_FLAGS_IOC_FIFO_MARKER (0x01) 17600d9a4ef3SDoug Ambrisko 17610d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_high_priority { 17620d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_header header; 17630d9a4ef3SDoug Ambrisko uint16_t reserved; 17640d9a4ef3SDoug Ambrisko }; 17650d9a4ef3SDoug Ambrisko 17660d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_scsi_io { 17670d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_header header; 17680d9a4ef3SDoug Ambrisko uint16_t scsi_io_dev_handle; 17690d9a4ef3SDoug Ambrisko }; 17700d9a4ef3SDoug Ambrisko 17710d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_scsi_target { 17720d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_header header; 17730d9a4ef3SDoug Ambrisko uint16_t scsi_target_io_index; 17740d9a4ef3SDoug Ambrisko }; 17750d9a4ef3SDoug Ambrisko 17760d9a4ef3SDoug Ambrisko /* Request Descriptors */ 17770d9a4ef3SDoug Ambrisko union mfi_mpi2_request_descriptor { 17780d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_header header; 17790d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_high_priority high_priority; 17800d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_scsi_io scsi_io; 17810d9a4ef3SDoug Ambrisko struct mfi_mpi2_request_scsi_target scsi_target; 17820d9a4ef3SDoug Ambrisko uint64_t words; 17830d9a4ef3SDoug Ambrisko }; 17840d9a4ef3SDoug Ambrisko 17850d9a4ef3SDoug Ambrisko 17860d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_header { 17870d9a4ef3SDoug Ambrisko uint8_t ReplyFlags; /* 0x00 */ 17880d9a4ef3SDoug Ambrisko uint8_t MSIxIndex; /* 0x01 */ 17890d9a4ef3SDoug Ambrisko uint16_t SMID; /* 0x02 */ 17900d9a4ef3SDoug Ambrisko }; 17910d9a4ef3SDoug Ambrisko 17920d9a4ef3SDoug Ambrisko /* defines for the ReplyFlags field */ 17930d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK (0x0F) 17940d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_SCSI_IO_SUCCESS (0x00) 17950d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_ADDRESS_REPLY (0x01) 17960d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_TARGETASSIST_SUCCESS (0x02) 17970d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_TARGET_COMMAND_BUFFER (0x03) 17980d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_RAID_ACCELERATOR_SUCCESS (0x05) 17990d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_FLAGS_UNUSED (0x0F) 18000d9a4ef3SDoug Ambrisko 18010d9a4ef3SDoug Ambrisko /* values for marking a reply descriptor as unused */ 18020d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_UNUSED_WORD0_MARK (0xFFFFFFFF) 18030d9a4ef3SDoug Ambrisko #define MPI2_RPY_DESCRIPT_UNUSED_WORD1_MARK (0xFFFFFFFF) 18040d9a4ef3SDoug Ambrisko 18050d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_default { 18060d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_header header; 18070d9a4ef3SDoug Ambrisko uint32_t DescriptorTypeDependent2; 18080d9a4ef3SDoug Ambrisko }; 18090d9a4ef3SDoug Ambrisko 18100d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_address { 18110d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_header header; 18120d9a4ef3SDoug Ambrisko uint32_t ReplyFrameAddress; 18130d9a4ef3SDoug Ambrisko }; 18140d9a4ef3SDoug Ambrisko 18150d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_scsi_io { 18160d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_header header; 18170d9a4ef3SDoug Ambrisko uint16_t TaskTag; /* 0x04 */ 18180d9a4ef3SDoug Ambrisko uint16_t Reserved1; /* 0x06 */ 18190d9a4ef3SDoug Ambrisko }; 18200d9a4ef3SDoug Ambrisko 18210d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_target_assist { 18220d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_header header; 18230d9a4ef3SDoug Ambrisko uint8_t SequenceNumber; /* 0x04 */ 18240d9a4ef3SDoug Ambrisko uint8_t Reserved1; /* 0x04 */ 18250d9a4ef3SDoug Ambrisko uint16_t IoIndex; /* 0x06 */ 18260d9a4ef3SDoug Ambrisko }; 18270d9a4ef3SDoug Ambrisko 18280d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_target_cmd_buffer { 18290d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_header header; 18300d9a4ef3SDoug Ambrisko uint8_t SequenceNumber; /* 0x04 */ 18310d9a4ef3SDoug Ambrisko uint8_t Flags; /* 0x04 */ 18320d9a4ef3SDoug Ambrisko uint16_t InitiatorDevHandle; /* 0x06 */ 18330d9a4ef3SDoug Ambrisko uint16_t IoIndex; /* 0x06 */ 18340d9a4ef3SDoug Ambrisko }; 18350d9a4ef3SDoug Ambrisko 18360d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_raid_accel { 18370d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_header header; 18380d9a4ef3SDoug Ambrisko uint8_t SequenceNumber; /* 0x04 */ 18390d9a4ef3SDoug Ambrisko uint32_t Reserved; /* 0x04 */ 18400d9a4ef3SDoug Ambrisko }; 18410d9a4ef3SDoug Ambrisko 18420d9a4ef3SDoug Ambrisko /* union of Reply Descriptors */ 1843a6ba0fd6SDoug Ambrisko union mfi_mpi2_reply_descriptor { 18440d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_header header; 18450d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_scsi_io scsi_io; 18460d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_target_assist target_assist; 18470d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_target_cmd_buffer target_cmd; 18480d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_raid_accel raid_accel; 18490d9a4ef3SDoug Ambrisko struct mfi_mpi2_reply_default reply_default; 18500d9a4ef3SDoug Ambrisko uint64_t words; 18510d9a4ef3SDoug Ambrisko }; 18520d9a4ef3SDoug Ambrisko 18530d9a4ef3SDoug Ambrisko struct IO_REQUEST_INFO { 18540d9a4ef3SDoug Ambrisko uint64_t ldStartBlock; 18550d9a4ef3SDoug Ambrisko uint32_t numBlocks; 18560d9a4ef3SDoug Ambrisko uint16_t ldTgtId; 18570d9a4ef3SDoug Ambrisko uint8_t isRead; 18580d9a4ef3SDoug Ambrisko uint16_t devHandle; 18590d9a4ef3SDoug Ambrisko uint64_t pdBlock; 18600d9a4ef3SDoug Ambrisko uint8_t fpOkForIo; 18610d9a4ef3SDoug Ambrisko }; 18620d9a4ef3SDoug Ambrisko 186335ef86f2SScott Long #define MFI_SCSI_MAX_TARGETS 128 186435ef86f2SScott Long #define MFI_SCSI_MAX_LUNS 8 186535ef86f2SScott Long #define MFI_SCSI_INITIATOR_ID 255 186635ef86f2SScott Long #define MFI_SCSI_MAX_CMDS 8 186735ef86f2SScott Long #define MFI_SCSI_MAX_CDB_LEN 16 186835ef86f2SScott Long 18692e21a3efSScott Long #endif /* _MFIREG_H */ 1870