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