12e21a3efSScott Long /*- 22e21a3efSScott Long * Copyright (c) 2006 IronPort Systems 32e21a3efSScott Long * All rights reserved. 42e21a3efSScott Long * 52e21a3efSScott Long * Redistribution and use in source and binary forms, with or without 62e21a3efSScott Long * modification, are permitted provided that the following conditions 72e21a3efSScott Long * are met: 82e21a3efSScott Long * 1. Redistributions of source code must retain the above copyright 92e21a3efSScott Long * notice, this list of conditions and the following disclaimer. 102e21a3efSScott Long * 2. Redistributions in binary form must reproduce the above copyright 112e21a3efSScott Long * notice, this list of conditions and the following disclaimer in the 122e21a3efSScott Long * documentation and/or other materials provided with the distribution. 132e21a3efSScott Long * 142e21a3efSScott Long * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 152e21a3efSScott Long * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 162e21a3efSScott Long * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 172e21a3efSScott Long * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 182e21a3efSScott Long * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 192e21a3efSScott Long * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 202e21a3efSScott Long * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 212e21a3efSScott Long * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 222e21a3efSScott Long * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 232e21a3efSScott Long * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 242e21a3efSScott Long * SUCH DAMAGE. 252e21a3efSScott Long */ 262e21a3efSScott Long 272e21a3efSScott Long #ifndef _MFIREG_H 282e21a3efSScott Long #define _MFIREG_H 292e21a3efSScott Long 302e21a3efSScott Long #include <sys/cdefs.h> 312e21a3efSScott Long __FBSDID("$FreeBSD$"); 322e21a3efSScott Long 332e21a3efSScott Long /* 342e21a3efSScott Long * MegaRAID SAS MFI firmware definitions 352e21a3efSScott Long * 362e21a3efSScott Long * Calling this driver 'MegaRAID SAS' is a bit misleading. It's a completely 372e21a3efSScott Long * new firmware interface from the old AMI MegaRAID one, and there is no 382e21a3efSScott Long * reason why this interface should be limited to just SAS. In any case, LSI 392e21a3efSScott Long * seems to also call this interface 'MFI', so that will be used here. 402e21a3efSScott Long */ 412e21a3efSScott Long 422e21a3efSScott Long /* 432e21a3efSScott Long * Start with the register set. All registers are 32 bits wide. 442e21a3efSScott Long * The usual Intel IOP style setup. 452e21a3efSScott Long */ 462e21a3efSScott Long #define MFI_IMSG0 0x10 /* Inbound message 0 */ 472e21a3efSScott Long #define MFI_IMSG1 0x14 /* Inbound message 1 */ 482e21a3efSScott Long #define MFI_OMSG0 0x18 /* Outbound message 0 */ 492e21a3efSScott Long #define MFI_OMSG1 0x1c /* Outbound message 1 */ 502e21a3efSScott Long #define MFI_IDB 0x20 /* Inbound doorbell */ 512e21a3efSScott Long #define MFI_ISTS 0x24 /* Inbound interrupt status */ 522e21a3efSScott Long #define MFI_IMSK 0x28 /* Inbound interrupt mask */ 532e21a3efSScott Long #define MFI_ODB 0x2c /* Outbound doorbell */ 542e21a3efSScott Long #define MFI_OSTS 0x30 /* Outbound interrupt status */ 552e21a3efSScott Long #define MFI_OMSK 0x34 /* Outbound interrupt mask */ 562e21a3efSScott Long #define MFI_IQP 0x40 /* Inbound queue port */ 572e21a3efSScott Long #define MFI_OQP 0x44 /* Outbound queue port */ 582e21a3efSScott Long 592e21a3efSScott Long /* Bits for MFI_OSTS */ 602e21a3efSScott Long #define MFI_OSTS_INTR_VALID 0x00000002 612e21a3efSScott Long 622e21a3efSScott Long /* 632e21a3efSScott Long * Firmware state values. Found in OMSG0 during initialization. 642e21a3efSScott Long */ 652e21a3efSScott Long #define MFI_FWSTATE_MASK 0xf0000000 662e21a3efSScott Long #define MFI_FWSTATE_UNDEFINED 0x00000000 672e21a3efSScott Long #define MFI_FWSTATE_BB_INIT 0x10000000 682e21a3efSScott Long #define MFI_FWSTATE_FW_INIT 0x40000000 692e21a3efSScott Long #define MFI_FWSTATE_WAIT_HANDSHAKE 0x60000000 702e21a3efSScott Long #define MFI_FWSTATE_FW_INIT_2 0x70000000 712e21a3efSScott Long #define MFI_FWSTATE_DEVICE_SCAN 0x80000000 722e21a3efSScott Long #define MFI_FWSTATE_FLUSH_CACHE 0xa0000000 732e21a3efSScott Long #define MFI_FWSTATE_READY 0xb0000000 742e21a3efSScott Long #define MFI_FWSTATE_OPERATIONAL 0xc0000000 752e21a3efSScott Long #define MFI_FWSTATE_FAULT 0xf0000000 762e21a3efSScott Long #define MFI_FWSTATE_MAXSGL_MASK 0x00ff0000 772e21a3efSScott Long #define MFI_FWSTATE_MAXCMD_MASK 0x0000ffff 782e21a3efSScott Long 792e21a3efSScott Long /* 802e21a3efSScott Long * Control bits to drive the card to ready state. These go into the IDB 812e21a3efSScott Long * register. 822e21a3efSScott Long */ 832e21a3efSScott Long #define MFI_FWINIT_ABORT 0x00000000 /* Abort all pending commands */ 842e21a3efSScott Long #define MFI_FWINIT_READY 0x00000002 /* Move from operational to ready */ 852e21a3efSScott Long #define MFI_FWINIT_MFIMODE 0x00000004 /* unknown */ 862e21a3efSScott Long #define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */ 872e21a3efSScott Long 882e21a3efSScott Long /* MFI Commands */ 892e21a3efSScott Long typedef enum { 902e21a3efSScott Long MFI_CMD_INIT = 0x00, 912e21a3efSScott Long MFI_CMD_LD_READ, 922e21a3efSScott Long MFI_CMD_LD_WRITE, 932e21a3efSScott Long MFI_CMD_LD_SCSI_IO, 942e21a3efSScott Long MFI_CMD_PD_SCSI_IO, 952e21a3efSScott Long MFI_CMD_DCMD, 962e21a3efSScott Long MFI_CMD_ABORT, 972e21a3efSScott Long MFI_CMD_SMP, 982e21a3efSScott Long MFI_CMD_STP 992e21a3efSScott Long } mfi_cmd_t; 1002e21a3efSScott Long 1012e21a3efSScott Long /* Direct commands */ 1022e21a3efSScott Long typedef enum { 1032e21a3efSScott Long MFI_DCMD_CTRL_GETINFO = 0x01010000, 1042e21a3efSScott Long MFI_DCMD_CTRL_FLUSHCACHE = 0x01101000, 1052e21a3efSScott Long MFI_DCMD_CTRL_SHUTDOWN = 0x01050000, 1062e21a3efSScott Long MFI_DCMD_CTRL_EVENT_GETINFO = 0x01040100, 1072e21a3efSScott Long MFI_DCMD_CTRL_EVENT_GET = 0x01040300, 1082e21a3efSScott Long MFI_DCMD_CTRL_EVENT_WAIT = 0x01040500, 109c0b332d1SPaul Saab MFI_DCMD_LD_GET_LIST = 0x03010000, 110c0b332d1SPaul Saab MFI_DCMD_LD_GET_INFO = 0x03020000, 1112e21a3efSScott Long MFI_DCMD_LD_GET_PROP = 0x03030000, 112c0b332d1SPaul Saab MFI_DCMD_LD_SET_PROP = 0x03040000, 1132e21a3efSScott Long MFI_DCMD_CLUSTER = 0x08000000, 1142e21a3efSScott Long MFI_DCMD_CLUSTER_RESET_ALL = 0x08010100, 1152e21a3efSScott Long MFI_DCMD_CLUSTER_RESET_LD = 0x08010200 1162e21a3efSScott Long } mfi_dcmd_t; 1172e21a3efSScott Long 1182e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_FLUSHCACHE */ 1192e21a3efSScott Long #define MFI_FLUSHCACHE_CTRL 0x01 1202e21a3efSScott Long #define MFI_FLUSHCACHE_DISK 0x02 1212e21a3efSScott Long 1222e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_SHUTDOWN */ 1232e21a3efSScott Long #define MFI_SHUTDOWN_SPINDOWN 0x01 1242e21a3efSScott Long 1252e21a3efSScott Long /* 126741367d5SDoug Ambrisko * MFI Frame flags 1272e21a3efSScott Long */ 1282e21a3efSScott Long #define MFI_FRAME_POST_IN_REPLY_QUEUE 0x0000 1292e21a3efSScott Long #define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE 0x0001 1302e21a3efSScott Long #define MFI_FRAME_SGL32 0x0000 1312e21a3efSScott Long #define MFI_FRAME_SGL64 0x0002 1322e21a3efSScott Long #define MFI_FRAME_SENSE32 0x0000 1332e21a3efSScott Long #define MFI_FRAME_SENSE64 0x0004 1342e21a3efSScott Long #define MFI_FRAME_DIR_NONE 0x0000 1352e21a3efSScott Long #define MFI_FRAME_DIR_WRITE 0x0008 1362e21a3efSScott Long #define MFI_FRAME_DIR_READ 0x0010 1372e21a3efSScott Long #define MFI_FRAME_DIR_BOTH 0x0018 1382e21a3efSScott Long 1392e21a3efSScott Long /* MFI Status codes */ 1402e21a3efSScott Long typedef enum { 1412e21a3efSScott Long MFI_STAT_OK = 0x00, 1422e21a3efSScott Long MFI_STAT_INVALID_CMD, 1432e21a3efSScott Long MFI_STAT_INVALID_DCMD, 1442e21a3efSScott Long MFI_STAT_INVALID_PARAMETER, 1452e21a3efSScott Long MFI_STAT_INVALID_SEQUENCE_NUMBER, 1462e21a3efSScott Long MFI_STAT_ABORT_NOT_POSSIBLE, 1472e21a3efSScott Long MFI_STAT_APP_HOST_CODE_NOT_FOUND, 1482e21a3efSScott Long MFI_STAT_APP_IN_USE, 1492e21a3efSScott Long MFI_STAT_APP_NOT_INITIALIZED, 1502e21a3efSScott Long MFI_STAT_ARRAY_INDEX_INVALID, 1512e21a3efSScott Long MFI_STAT_ARRAY_ROW_NOT_EMPTY, 1522e21a3efSScott Long MFI_STAT_CONFIG_RESOURCE_CONFLICT, 1532e21a3efSScott Long MFI_STAT_DEVICE_NOT_FOUND, 1542e21a3efSScott Long MFI_STAT_DRIVE_TOO_SMALL, 1552e21a3efSScott Long MFI_STAT_FLASH_ALLOC_FAIL, 1562e21a3efSScott Long MFI_STAT_FLASH_BUSY, 1572e21a3efSScott Long MFI_STAT_FLASH_ERROR = 0x10, 1582e21a3efSScott Long MFI_STAT_FLASH_IMAGE_BAD, 1592e21a3efSScott Long MFI_STAT_FLASH_IMAGE_INCOMPLETE, 1602e21a3efSScott Long MFI_STAT_FLASH_NOT_OPEN, 1612e21a3efSScott Long MFI_STAT_FLASH_NOT_STARTED, 1622e21a3efSScott Long MFI_STAT_FLUSH_FAILED, 1632e21a3efSScott Long MFI_STAT_HOST_CODE_NOT_FOUNT, 1642e21a3efSScott Long MFI_STAT_LD_CC_IN_PROGRESS, 1652e21a3efSScott Long MFI_STAT_LD_INIT_IN_PROGRESS, 1662e21a3efSScott Long MFI_STAT_LD_LBA_OUT_OF_RANGE, 1672e21a3efSScott Long MFI_STAT_LD_MAX_CONFIGURED, 1682e21a3efSScott Long MFI_STAT_LD_NOT_OPTIMAL, 1692e21a3efSScott Long MFI_STAT_LD_RBLD_IN_PROGRESS, 1702e21a3efSScott Long MFI_STAT_LD_RECON_IN_PROGRESS, 1712e21a3efSScott Long MFI_STAT_LD_WRONG_RAID_LEVEL, 1722e21a3efSScott Long MFI_STAT_MAX_SPARES_EXCEEDED, 1732e21a3efSScott Long MFI_STAT_MEMORY_NOT_AVAILABLE = 0x20, 1742e21a3efSScott Long MFI_STAT_MFC_HW_ERROR, 1752e21a3efSScott Long MFI_STAT_NO_HW_PRESENT, 1762e21a3efSScott Long MFI_STAT_NOT_FOUND, 1772e21a3efSScott Long MFI_STAT_NOT_IN_ENCL, 1782e21a3efSScott Long MFI_STAT_PD_CLEAR_IN_PROGRESS, 1792e21a3efSScott Long MFI_STAT_PD_TYPE_WRONG, 1802e21a3efSScott Long MFI_STAT_PR_DISABLED, 1812e21a3efSScott Long MFI_STAT_ROW_INDEX_INVALID, 1822e21a3efSScott Long MFI_STAT_SAS_CONFIG_INVALID_ACTION, 1832e21a3efSScott Long MFI_STAT_SAS_CONFIG_INVALID_DATA, 1842e21a3efSScott Long MFI_STAT_SAS_CONFIG_INVALID_PAGE, 1852e21a3efSScott Long MFI_STAT_SAS_CONFIG_INVALID_TYPE, 1862e21a3efSScott Long MFI_STAT_SCSI_DONE_WITH_ERROR, 1872e21a3efSScott Long MFI_STAT_SCSI_IO_FAILED, 1882e21a3efSScott Long MFI_STAT_SCSI_RESERVATION_CONFLICT, 1892e21a3efSScott Long MFI_STAT_SHUTDOWN_FAILED = 0x30, 1902e21a3efSScott Long MFI_STAT_TIME_NOT_SET, 1912e21a3efSScott Long MFI_STAT_WRONG_STATE, 1922e21a3efSScott Long MFI_STAT_LD_OFFLINE, 1932e21a3efSScott Long MFI_STAT_PEER_NOTIFICATION_REJECTED, 1942e21a3efSScott Long MFI_STAT_PEER_NOTIFICATION_FAILED, 1952e21a3efSScott Long MFI_STAT_RESERVATION_IN_PROGRESS, 1962e21a3efSScott Long MFI_STAT_I2C_ERRORS_DETECTED, 1972e21a3efSScott Long MFI_STAT_PCI_ERRORS_DETECTED, 1982e21a3efSScott Long MFI_STAT_INVALID_STATUS = 0xFF 1992e21a3efSScott Long } mfi_status_t; 2002e21a3efSScott Long 2012e21a3efSScott Long typedef enum { 2022e21a3efSScott Long MFI_EVT_CLASS_DEBUG = -2, 2032e21a3efSScott Long MFI_EVT_CLASS_PROGRESS = -1, 2042e21a3efSScott Long MFI_EVT_CLASS_INFO = 0, 2052e21a3efSScott Long MFI_EVT_CLASS_WARNING = 1, 2062e21a3efSScott Long MFI_EVT_CLASS_CRITICAL = 2, 2072e21a3efSScott Long MFI_EVT_CLASS_FATAL = 3, 2082e21a3efSScott Long MFI_EVT_CLASS_DEAD = 4 2092e21a3efSScott Long } mfi_evt_class_t; 2102e21a3efSScott Long 2112e21a3efSScott Long typedef enum { 2122e21a3efSScott Long MFI_EVT_LOCALE_LD = 0x0001, 2132e21a3efSScott Long MFI_EVT_LOCALE_PD = 0x0002, 2142e21a3efSScott Long MFI_EVT_LOCALE_ENCL = 0x0004, 2152e21a3efSScott Long MFI_EVT_LOCALE_BBU = 0x0008, 2162e21a3efSScott Long MFI_EVT_LOCALE_SAS = 0x0010, 2172e21a3efSScott Long MFI_EVT_LOCALE_CTRL = 0x0020, 2182e21a3efSScott Long MFI_EVT_LOCALE_CONFIG = 0x0040, 2192e21a3efSScott Long MFI_EVT_LOCALE_CLUSTER = 0x0080, 2202e21a3efSScott Long MFI_EVT_LOCALE_ALL = 0xffff 2212e21a3efSScott Long } mfi_evt_locale_t; 2222e21a3efSScott Long 2232e21a3efSScott Long typedef enum { 2242e21a3efSScott Long MR_EVT_ARGS_NONE = 0x00, 2252e21a3efSScott Long MR_EVT_ARGS_CDB_SENSE, 2262e21a3efSScott Long MR_EVT_ARGS_LD, 2272e21a3efSScott Long MR_EVT_ARGS_LD_COUNT, 2282e21a3efSScott Long MR_EVT_ARGS_LD_LBA, 2292e21a3efSScott Long MR_EVT_ARGS_LD_OWNER, 2302e21a3efSScott Long MR_EVT_ARGS_LD_LBA_PD_LBA, 2312e21a3efSScott Long MR_EVT_ARGS_LD_PROG, 2322e21a3efSScott Long MR_EVT_ARGS_LD_STATE, 2332e21a3efSScott Long MR_EVT_ARGS_LD_STRIP, 2342e21a3efSScott Long MR_EVT_ARGS_PD, 2352e21a3efSScott Long MR_EVT_ARGS_PD_ERR, 2362e21a3efSScott Long MR_EVT_ARGS_PD_LBA, 2372e21a3efSScott Long MR_EVT_ARGS_PD_LBA_LD, 2382e21a3efSScott Long MR_EVT_ARGS_PD_PROG, 2392e21a3efSScott Long MR_EVT_ARGS_PD_STATE, 2402e21a3efSScott Long MR_EVT_ARGS_PCI, 2412e21a3efSScott Long MR_EVT_ARGS_RATE, 2422e21a3efSScott Long MR_EVT_ARGS_STR, 2432e21a3efSScott Long MR_EVT_ARGS_TIME, 2442e21a3efSScott Long MR_EVT_ARGS_ECC 2452e21a3efSScott Long } mfi_evt_args; 2462e21a3efSScott Long 2472e21a3efSScott Long /* 2482e21a3efSScott Long * Other propertities and definitions 2492e21a3efSScott Long */ 2502e21a3efSScott Long #define MFI_MAX_PD_CHANNELS 2 2512e21a3efSScott Long #define MFI_MAX_LD_CHANNELS 2 2522e21a3efSScott Long #define MFI_MAX_CHANNELS (MFI_MAX_PD_CHANNELS + MFI_MAX_LD_CHANNELS) 2532e21a3efSScott Long #define MFI_MAX_CHANNEL_DEVS 128 2542e21a3efSScott Long #define MFI_DEFAULT_ID -1 2552e21a3efSScott Long #define MFI_MAX_LUN 8 2562e21a3efSScott Long #define MFI_MAX_LD 64 2572e21a3efSScott Long 2582e21a3efSScott Long #define MFI_FRAME_SIZE 64 2592e21a3efSScott Long #define MFI_MBOX_SIZE 12 2602e21a3efSScott Long 2612e21a3efSScott Long #define MFI_POLL_TIMEOUT_SECS 10 2622e21a3efSScott Long 2632e21a3efSScott Long /* Allow for speedier math calculations */ 2642e21a3efSScott Long #define MFI_SECTOR_LEN 512 2652e21a3efSScott Long 2662e21a3efSScott Long /* Scatter Gather elements */ 2672e21a3efSScott Long struct mfi_sg32 { 2682e21a3efSScott Long uint32_t addr; 2692e21a3efSScott Long uint32_t len; 2702e21a3efSScott Long } __packed; 2712e21a3efSScott Long 2722e21a3efSScott Long struct mfi_sg64 { 2732e21a3efSScott Long uint64_t addr; 2742e21a3efSScott Long uint32_t len; 2752e21a3efSScott Long } __packed; 2762e21a3efSScott Long 2772e21a3efSScott Long union mfi_sgl { 2782e21a3efSScott Long struct mfi_sg32 sg32[1]; 2792e21a3efSScott Long struct mfi_sg64 sg64[1]; 2802e21a3efSScott Long } __packed; 2812e21a3efSScott Long 2822e21a3efSScott Long /* Message frames. All messages have a common header */ 2832e21a3efSScott Long struct mfi_frame_header { 2842e21a3efSScott Long uint8_t cmd; 2852e21a3efSScott Long uint8_t sense_len; 2862e21a3efSScott Long uint8_t cmd_status; 2872e21a3efSScott Long uint8_t scsi_status; 2882e21a3efSScott Long uint8_t target_id; 2892e21a3efSScott Long uint8_t lun_id; 2902e21a3efSScott Long uint8_t cdb_len; 2912e21a3efSScott Long uint8_t sg_count; 2922e21a3efSScott Long uint32_t context; 2932e21a3efSScott Long uint32_t pad0; 2942e21a3efSScott Long uint16_t flags; 2952e21a3efSScott Long uint16_t timeout; 2962e21a3efSScott Long uint32_t data_len; 2972e21a3efSScott Long } __packed; 2982e21a3efSScott Long 2992e21a3efSScott Long struct mfi_init_frame { 3002e21a3efSScott Long struct mfi_frame_header header; 3012e21a3efSScott Long uint32_t qinfo_new_addr_lo; 3022e21a3efSScott Long uint32_t qinfo_new_addr_hi; 3032e21a3efSScott Long uint32_t qinfo_old_addr_lo; 3042e21a3efSScott Long uint32_t qinfo_old_addr_hi; 3052e21a3efSScott Long uint32_t reserved[6]; 3062e21a3efSScott Long } __packed; 3072e21a3efSScott Long 3082e21a3efSScott Long #define MFI_IO_FRAME_SIZE 40 3092e21a3efSScott Long struct mfi_io_frame { 3102e21a3efSScott Long struct mfi_frame_header header; 3112e21a3efSScott Long uint32_t sense_addr_lo; 3122e21a3efSScott Long uint32_t sense_addr_hi; 3132e21a3efSScott Long uint32_t lba_lo; 3142e21a3efSScott Long uint32_t lba_hi; 3152e21a3efSScott Long union mfi_sgl sgl; 3162e21a3efSScott Long } __packed; 3172e21a3efSScott Long 3182e21a3efSScott Long #define MFI_PASS_FRAME_SIZE 48 3192e21a3efSScott Long struct mfi_pass_frame { 3202e21a3efSScott Long struct mfi_frame_header header; 3212e21a3efSScott Long uint32_t sense_addr_lo; 3222e21a3efSScott Long uint32_t sense_addr_hi; 3232e21a3efSScott Long uint8_t cdb[16]; 3242e21a3efSScott Long union mfi_sgl sgl; 3252e21a3efSScott Long } __packed; 3262e21a3efSScott Long 3272e21a3efSScott Long #define MFI_DCMD_FRAME_SIZE 40 3282e21a3efSScott Long struct mfi_dcmd_frame { 3292e21a3efSScott Long struct mfi_frame_header header; 3302e21a3efSScott Long uint32_t opcode; 3312e21a3efSScott Long uint8_t mbox[MFI_MBOX_SIZE]; 3322e21a3efSScott Long union mfi_sgl sgl; 3332e21a3efSScott Long } __packed; 3342e21a3efSScott Long 3352e21a3efSScott Long struct mfi_abort_frame { 3362e21a3efSScott Long struct mfi_frame_header header; 3372e21a3efSScott Long uint32_t abort_context; 3382e21a3efSScott Long uint32_t pad; 3392e21a3efSScott Long uint32_t abort_mfi_addr_lo; 3402e21a3efSScott Long uint32_t abort_mfi_addr_hi; 3412e21a3efSScott Long uint32_t reserved[6]; 3422e21a3efSScott Long } __packed; 3432e21a3efSScott Long 3442e21a3efSScott Long struct mfi_smp_frame { 3452e21a3efSScott Long struct mfi_frame_header header; 3462e21a3efSScott Long uint64_t sas_addr; 3472e21a3efSScott Long union { 3482e21a3efSScott Long struct mfi_sg32 sg32[2]; 3492e21a3efSScott Long struct mfi_sg64 sg64[2]; 3502e21a3efSScott Long } sgl; 3512e21a3efSScott Long } __packed; 3522e21a3efSScott Long 3532e21a3efSScott Long struct mfi_stp_frame { 3542e21a3efSScott Long struct mfi_frame_header header; 3552e21a3efSScott Long uint16_t fis[10]; 3562e21a3efSScott Long uint32_t stp_flags; 3572e21a3efSScott Long union { 3582e21a3efSScott Long struct mfi_sg32 sg32[2]; 3592e21a3efSScott Long struct mfi_sg64 sg64[2]; 3602e21a3efSScott Long } sgl; 3612e21a3efSScott Long } __packed; 3622e21a3efSScott Long 3632e21a3efSScott Long union mfi_frame { 3642e21a3efSScott Long struct mfi_frame_header header; 3652e21a3efSScott Long struct mfi_init_frame init; 3662e21a3efSScott Long struct mfi_io_frame io; 3672e21a3efSScott Long struct mfi_pass_frame pass; 3682e21a3efSScott Long struct mfi_dcmd_frame dcmd; 3692e21a3efSScott Long struct mfi_abort_frame abort; 3702e21a3efSScott Long struct mfi_smp_frame smp; 3712e21a3efSScott Long struct mfi_stp_frame stp; 3722e21a3efSScott Long uint8_t bytes[MFI_FRAME_SIZE]; 3732e21a3efSScott Long }; 3742e21a3efSScott Long 3752e21a3efSScott Long #define MFI_SENSE_LEN 128 3762e21a3efSScott Long struct mfi_sense { 3772e21a3efSScott Long uint8_t data[MFI_SENSE_LEN]; 3782e21a3efSScott Long }; 3792e21a3efSScott Long 3802e21a3efSScott Long /* The queue init structure that is passed with the init message */ 3812e21a3efSScott Long struct mfi_init_qinfo { 3822e21a3efSScott Long uint32_t flags; 3832e21a3efSScott Long uint32_t rq_entries; 3842e21a3efSScott Long uint32_t rq_addr_lo; 3852e21a3efSScott Long uint32_t rq_addr_hi; 3862e21a3efSScott Long uint32_t pi_addr_lo; 3872e21a3efSScott Long uint32_t pi_addr_hi; 3882e21a3efSScott Long uint32_t ci_addr_lo; 3892e21a3efSScott Long uint32_t ci_addr_hi; 3902e21a3efSScott Long } __packed; 3912e21a3efSScott Long 3922e21a3efSScott Long /* SAS (?) controller properties, part of mfi_ctrl_info */ 3932e21a3efSScott Long struct mfi_ctrl_props { 3942e21a3efSScott Long uint16_t seq_num; 3952e21a3efSScott Long uint16_t pred_fail_poll_interval; 3962e21a3efSScott Long uint16_t intr_throttle_cnt; 3972e21a3efSScott Long uint16_t intr_throttle_timeout; 3982e21a3efSScott Long uint8_t rebuild_rate; 3992e21a3efSScott Long uint8_t patrol_read_rate; 4002e21a3efSScott Long uint8_t bgi_rate; 4012e21a3efSScott Long uint8_t cc_rate; 4022e21a3efSScott Long uint8_t recon_rate; 4032e21a3efSScott Long uint8_t cache_flush_interval; 4042e21a3efSScott Long uint8_t spinup_drv_cnt; 4052e21a3efSScott Long uint8_t spinup_delay; 4062e21a3efSScott Long uint8_t cluster_enable; 4072e21a3efSScott Long uint8_t coercion_mode; 4082e21a3efSScott Long uint8_t alarm_enable; 4092e21a3efSScott Long uint8_t disable_auto_rebuild; 4102e21a3efSScott Long uint8_t disable_battery_warn; 4112e21a3efSScott Long uint8_t ecc_bucket_size; 4122e21a3efSScott Long uint16_t ecc_bucket_leak_rate; 4132e21a3efSScott Long uint8_t restore_hotspare_on_insertion; 4142e21a3efSScott Long uint8_t expose_encl_devices; 4152e21a3efSScott Long uint8_t reserved[38]; 4162e21a3efSScott Long } __packed; 4172e21a3efSScott Long 4182e21a3efSScott Long /* PCI information about the card. */ 4192e21a3efSScott Long struct mfi_info_pci { 4202e21a3efSScott Long uint16_t vendor; 4212e21a3efSScott Long uint16_t device; 4222e21a3efSScott Long uint16_t subvendor; 4232e21a3efSScott Long uint16_t subdevice; 4242e21a3efSScott Long uint8_t reserved[24]; 4252e21a3efSScott Long } __packed; 4262e21a3efSScott Long 4272e21a3efSScott Long /* Host (front end) interface information */ 4282e21a3efSScott Long struct mfi_info_host { 4292e21a3efSScott Long uint8_t type; 4302e21a3efSScott Long #define MFI_INFO_HOST_PCIX 0x01 4312e21a3efSScott Long #define MFI_INFO_HOST_PCIE 0x02 4322e21a3efSScott Long #define MFI_INFO_HOST_ISCSI 0x04 4332e21a3efSScott Long #define MFI_INFO_HOST_SAS3G 0x08 4342e21a3efSScott Long uint8_t reserved[6]; 4352e21a3efSScott Long uint8_t port_count; 4362e21a3efSScott Long uint64_t port_addr[8]; 4372e21a3efSScott Long } __packed; 4382e21a3efSScott Long 4392e21a3efSScott Long /* Device (back end) interface information */ 4402e21a3efSScott Long struct mfi_info_device { 4412e21a3efSScott Long uint8_t type; 4422e21a3efSScott Long #define MFI_INFO_DEV_SPI 0x01 4432e21a3efSScott Long #define MFI_INFO_DEV_SAS3G 0x02 4442e21a3efSScott Long #define MFI_INFO_DEV_SATA1 0x04 4452e21a3efSScott Long #define MFI_INFO_DEV_SATA3G 0x08 4462e21a3efSScott Long uint8_t reserved[6]; 4472e21a3efSScott Long uint8_t port_count; 4482e21a3efSScott Long uint64_t port_addr[8]; 4492e21a3efSScott Long } __packed; 4502e21a3efSScott Long 4512e21a3efSScott Long /* Firmware component information */ 4522e21a3efSScott Long struct mfi_info_component { 4532e21a3efSScott Long char name[8]; 4542e21a3efSScott Long char version[32]; 4552e21a3efSScott Long char build_date[16]; 4562e21a3efSScott Long char build_time[16]; 4572e21a3efSScott Long } __packed; 4582e21a3efSScott Long 4592e21a3efSScott Long 4602e21a3efSScott Long /* SAS (?) controller info, returned from MFI_DCMD_CTRL_GETINFO. */ 4612e21a3efSScott Long struct mfi_ctrl_info { 4622e21a3efSScott Long struct mfi_info_pci pci; 4632e21a3efSScott Long struct mfi_info_host host; 4642e21a3efSScott Long struct mfi_info_device device; 4652e21a3efSScott Long 4662e21a3efSScott Long /* Firmware components that are present and active. */ 4672e21a3efSScott Long uint32_t image_check_word; 4682e21a3efSScott Long uint32_t image_component_count; 4692e21a3efSScott Long struct mfi_info_component image_component[8]; 4702e21a3efSScott Long 4712e21a3efSScott Long /* Firmware components that have been flashed but are inactive */ 4722e21a3efSScott Long uint32_t pending_image_component_count; 4732e21a3efSScott Long struct mfi_info_component pending_image_component[8]; 4742e21a3efSScott Long 4752e21a3efSScott Long uint8_t max_arms; 4762e21a3efSScott Long uint8_t max_spans; 4772e21a3efSScott Long uint8_t max_arrays; 4782e21a3efSScott Long uint8_t max_lds; 4792e21a3efSScott Long char product_name[80]; 4802e21a3efSScott Long char serial_number[32]; 4812e21a3efSScott Long uint32_t hw_present; 4822e21a3efSScott Long #define MFI_INFO_HW_BBU 0x01 4832e21a3efSScott Long #define MFI_INFO_HW_ALARM 0x02 4842e21a3efSScott Long #define MFI_INFO_HW_NVRAM 0x04 4852e21a3efSScott Long #define MFI_INFO_HW_UART 0x08 4862e21a3efSScott Long uint32_t current_fw_time; 4872e21a3efSScott Long uint16_t max_cmds; 4882e21a3efSScott Long uint16_t max_sg_elements; 4892e21a3efSScott Long uint32_t max_request_size; 4902e21a3efSScott Long uint16_t lds_present; 4912e21a3efSScott Long uint16_t lds_degraded; 4922e21a3efSScott Long uint16_t lds_offline; 4932e21a3efSScott Long uint16_t pd_present; 4942e21a3efSScott Long uint16_t pd_disks_present; 4952e21a3efSScott Long uint16_t pd_disks_pred_failure; 4962e21a3efSScott Long uint16_t pd_disks_failed; 4972e21a3efSScott Long uint16_t nvram_size; 4982e21a3efSScott Long uint16_t memory_size; 4992e21a3efSScott Long uint16_t flash_size; 5002e21a3efSScott Long uint16_t ram_correctable_errors; 5012e21a3efSScott Long uint16_t ram_uncorrectable_errors; 5022e21a3efSScott Long uint8_t cluster_allowed; 5032e21a3efSScott Long uint8_t cluster_active; 5042e21a3efSScott Long uint16_t max_strips_per_io; 5052e21a3efSScott Long 5062e21a3efSScott Long uint32_t raid_levels; 5072e21a3efSScott Long #define MFI_INFO_RAID_0 0x01 5082e21a3efSScott Long #define MFI_INFO_RAID_1 0x02 5092e21a3efSScott Long #define MFI_INFO_RAID_5 0x04 5102e21a3efSScott Long #define MFI_INFO_RAID_1E 0x08 5112e21a3efSScott Long #define MFI_INFO_RAID_6 0x10 5122e21a3efSScott Long 5132e21a3efSScott Long uint32_t adapter_ops; 5142e21a3efSScott Long #define MFI_INFO_AOPS_RBLD_RATE 0x0001 5152e21a3efSScott Long #define MFI_INFO_AOPS_CC_RATE 0x0002 5162e21a3efSScott Long #define MFI_INFO_AOPS_BGI_RATE 0x0004 5172e21a3efSScott Long #define MFI_INFO_AOPS_RECON_RATE 0x0008 5182e21a3efSScott Long #define MFI_INFO_AOPS_PATROL_RATE 0x0010 5192e21a3efSScott Long #define MFI_INFO_AOPS_ALARM_CONTROL 0x0020 5202e21a3efSScott Long #define MFI_INFO_AOPS_CLUSTER_SUPPORTED 0x0040 5212e21a3efSScott Long #define MFI_INFO_AOPS_BBU 0x0080 5222e21a3efSScott Long #define MFI_INFO_AOPS_SPANNING_ALLOWED 0x0100 5232e21a3efSScott Long #define MFI_INFO_AOPS_DEDICATED_SPARES 0x0200 5242e21a3efSScott Long #define MFI_INFO_AOPS_REVERTIBLE_SPARES 0x0400 5252e21a3efSScott Long #define MFI_INFO_AOPS_FOREIGN_IMPORT 0x0800 5262e21a3efSScott Long #define MFI_INFO_AOPS_SELF_DIAGNOSTIC 0x1000 5272e21a3efSScott Long #define MFI_INFO_AOPS_MIXED_ARRAY 0x2000 5282e21a3efSScott Long #define MFI_INFO_AOPS_GLOBAL_SPARES 0x4000 5292e21a3efSScott Long 5302e21a3efSScott Long uint32_t ld_ops; 5312e21a3efSScott Long #define MFI_INFO_LDOPS_READ_POLICY 0x01 5322e21a3efSScott Long #define MFI_INFO_LDOPS_WRITE_POLICY 0x02 5332e21a3efSScott Long #define MFI_INFO_LDOPS_IO_POLICY 0x04 5342e21a3efSScott Long #define MFI_INFO_LDOPS_ACCESS_POLICY 0x08 5352e21a3efSScott Long #define MFI_INFO_LDOPS_DISK_CACHE_POLICY 0x10 5362e21a3efSScott Long 5372e21a3efSScott Long struct { 5382e21a3efSScott Long uint8_t min; 5392e21a3efSScott Long uint8_t max; 5402e21a3efSScott Long uint8_t reserved[2]; 5412e21a3efSScott Long } __packed stripe_sz_ops; 5422e21a3efSScott Long 5432e21a3efSScott Long uint32_t pd_ops; 5442e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_ONLINE 0x01 5452e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_OFFLINE 0x02 5462e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_REBUILD 0x04 5472e21a3efSScott Long 5482e21a3efSScott Long uint32_t pd_mix_support; 5492e21a3efSScott Long #define MFI_INFO_PDMIX_SAS 0x01 5502e21a3efSScott Long #define MFI_INFO_PDMIX_SATA 0x02 5512e21a3efSScott Long #define MFI_INFO_PDMIX_ENCL 0x04 5522e21a3efSScott Long #define MFI_INFO_PDMIX_LD 0x08 5532e21a3efSScott Long #define MFI_INFO_PDMIX_SATA_CLUSTER 0x10 5542e21a3efSScott Long 5552e21a3efSScott Long uint8_t ecc_bucket_count; 5562e21a3efSScott Long uint8_t reserved2[11]; 5572e21a3efSScott Long struct mfi_ctrl_props properties; 5582e21a3efSScott Long char package_version[0x60]; 5592e21a3efSScott Long uint8_t pad[0x800 - 0x6a0]; 5602e21a3efSScott Long } __packed; 5612e21a3efSScott Long 562741367d5SDoug Ambrisko /* keep track of an event. */ 563741367d5SDoug Ambrisko union mfi_evt { 564741367d5SDoug Ambrisko struct { 565741367d5SDoug Ambrisko uint16_t locale; 566741367d5SDoug Ambrisko uint8_t reserved; 567741367d5SDoug Ambrisko uint8_t class; 568741367d5SDoug Ambrisko } members; 569741367d5SDoug Ambrisko uint32_t word; 570741367d5SDoug Ambrisko } __packed; 571741367d5SDoug Ambrisko 572741367d5SDoug Ambrisko /* event log state. */ 573741367d5SDoug Ambrisko struct mfi_evt_log_state { 574741367d5SDoug Ambrisko uint32_t newest_seq_num; 575741367d5SDoug Ambrisko uint32_t oldest_seq_num; 576741367d5SDoug Ambrisko uint32_t clear_seq_num; 577741367d5SDoug Ambrisko uint32_t shutdown_seq_num; 578741367d5SDoug Ambrisko uint32_t boot_seq_num; 579741367d5SDoug Ambrisko } __packed; 580741367d5SDoug Ambrisko 581741367d5SDoug Ambrisko struct mfi_progress { 582741367d5SDoug Ambrisko uint16_t progress; 583741367d5SDoug Ambrisko uint16_t elapsed_seconds; 584741367d5SDoug Ambrisko } __packed; 585741367d5SDoug Ambrisko 586741367d5SDoug Ambrisko struct mfi_evt_ld { 587741367d5SDoug Ambrisko uint16_t target_id; 588741367d5SDoug Ambrisko uint8_t ld_index; 589741367d5SDoug Ambrisko uint8_t reserved; 590741367d5SDoug Ambrisko } __packed; 591741367d5SDoug Ambrisko 592741367d5SDoug Ambrisko struct mfi_evt_pd { 593741367d5SDoug Ambrisko uint16_t device_id; 594741367d5SDoug Ambrisko uint8_t enclosure_index; 595741367d5SDoug Ambrisko uint8_t slot_number; 596741367d5SDoug Ambrisko } __packed; 597741367d5SDoug Ambrisko 598741367d5SDoug Ambrisko /* SAS (?) event detail, returned from MFI_DCMD_CTRL_EVENT_WAIT. */ 599741367d5SDoug Ambrisko struct mfi_evt_detail { 600741367d5SDoug Ambrisko uint32_t seq; 601741367d5SDoug Ambrisko uint32_t time; 602741367d5SDoug Ambrisko uint32_t code; 603741367d5SDoug Ambrisko union mfi_evt class; 604741367d5SDoug Ambrisko uint8_t arg_type; 605741367d5SDoug Ambrisko uint8_t reserved1[15]; 606741367d5SDoug Ambrisko 607741367d5SDoug Ambrisko union { 608741367d5SDoug Ambrisko struct { 609741367d5SDoug Ambrisko struct mfi_evt_pd pd; 610741367d5SDoug Ambrisko uint8_t cdb_len; 611741367d5SDoug Ambrisko uint8_t sense_len; 612741367d5SDoug Ambrisko uint8_t reserved[2]; 613741367d5SDoug Ambrisko uint8_t cdb[16]; 614741367d5SDoug Ambrisko uint8_t sense[64]; 615741367d5SDoug Ambrisko } cdb_sense; 616741367d5SDoug Ambrisko 617741367d5SDoug Ambrisko struct mfi_evt_ld ld; 618741367d5SDoug Ambrisko 619741367d5SDoug Ambrisko struct { 620741367d5SDoug Ambrisko struct mfi_evt_ld ld; 621741367d5SDoug Ambrisko uint64_t count; 622741367d5SDoug Ambrisko } ld_count; 623741367d5SDoug Ambrisko 624741367d5SDoug Ambrisko struct { 625741367d5SDoug Ambrisko uint64_t lba; 626741367d5SDoug Ambrisko struct mfi_evt_ld ld; 627741367d5SDoug Ambrisko } ld_lba; 628741367d5SDoug Ambrisko 629741367d5SDoug Ambrisko struct { 630741367d5SDoug Ambrisko struct mfi_evt_ld ld; 631741367d5SDoug Ambrisko uint32_t pre_owner; 632741367d5SDoug Ambrisko uint32_t new_owner; 633741367d5SDoug Ambrisko } ld_owner; 634741367d5SDoug Ambrisko 635741367d5SDoug Ambrisko struct { 636741367d5SDoug Ambrisko uint64_t ld_lba; 637741367d5SDoug Ambrisko uint64_t pd_lba; 638741367d5SDoug Ambrisko struct mfi_evt_ld ld; 639741367d5SDoug Ambrisko struct mfi_evt_pd pd; 640741367d5SDoug Ambrisko } ld_lba_pd_lba; 641741367d5SDoug Ambrisko 642741367d5SDoug Ambrisko struct { 643741367d5SDoug Ambrisko struct mfi_evt_ld ld; 644741367d5SDoug Ambrisko struct mfi_progress prog; 645741367d5SDoug Ambrisko } ld_prog; 646741367d5SDoug Ambrisko 647741367d5SDoug Ambrisko struct { 648741367d5SDoug Ambrisko struct mfi_evt_ld ld; 649741367d5SDoug Ambrisko uint32_t prev_state; 650741367d5SDoug Ambrisko uint32_t new_state; 651741367d5SDoug Ambrisko } ld_state; 652741367d5SDoug Ambrisko 653741367d5SDoug Ambrisko struct { 654741367d5SDoug Ambrisko uint64_t strip; 655741367d5SDoug Ambrisko struct mfi_evt_ld ld; 656741367d5SDoug Ambrisko } ld_strip; 657741367d5SDoug Ambrisko 658741367d5SDoug Ambrisko struct mfi_evt_pd pd; 659741367d5SDoug Ambrisko 660741367d5SDoug Ambrisko struct { 661741367d5SDoug Ambrisko struct mfi_evt_pd pd; 662741367d5SDoug Ambrisko uint32_t err; 663741367d5SDoug Ambrisko } pd_err; 664741367d5SDoug Ambrisko 665741367d5SDoug Ambrisko struct { 666741367d5SDoug Ambrisko uint64_t lba; 667741367d5SDoug Ambrisko struct mfi_evt_pd pd; 668741367d5SDoug Ambrisko } pd_lba; 669741367d5SDoug Ambrisko 670741367d5SDoug Ambrisko struct { 671741367d5SDoug Ambrisko uint64_t lba; 672741367d5SDoug Ambrisko struct mfi_evt_pd pd; 673741367d5SDoug Ambrisko struct mfi_evt_ld ld; 674741367d5SDoug Ambrisko } pd_lba_ld; 675741367d5SDoug Ambrisko 676741367d5SDoug Ambrisko struct { 677741367d5SDoug Ambrisko struct mfi_evt_pd pd; 678741367d5SDoug Ambrisko struct mfi_progress prog; 679741367d5SDoug Ambrisko } pd_prog; 680741367d5SDoug Ambrisko 681741367d5SDoug Ambrisko struct { 682741367d5SDoug Ambrisko struct mfi_evt_pd ld; 683741367d5SDoug Ambrisko uint32_t prev_state; 684741367d5SDoug Ambrisko uint32_t new_state; 685741367d5SDoug Ambrisko } pd_state; 686741367d5SDoug Ambrisko 687741367d5SDoug Ambrisko struct { 688741367d5SDoug Ambrisko uint16_t venderId; 689741367d5SDoug Ambrisko uint16_t deviceId; 690741367d5SDoug Ambrisko uint16_t subVenderId; 691741367d5SDoug Ambrisko uint16_t subDeviceId; 692741367d5SDoug Ambrisko } pci; 693741367d5SDoug Ambrisko 694741367d5SDoug Ambrisko uint32_t rate; 695741367d5SDoug Ambrisko 696741367d5SDoug Ambrisko char str[96]; 697741367d5SDoug Ambrisko 698741367d5SDoug Ambrisko struct { 699741367d5SDoug Ambrisko uint32_t rtc; 700741367d5SDoug Ambrisko uint16_t elapsedSeconds; 701741367d5SDoug Ambrisko } time; 702741367d5SDoug Ambrisko 703741367d5SDoug Ambrisko struct { 704741367d5SDoug Ambrisko uint32_t ecar; 705741367d5SDoug Ambrisko uint32_t elog; 706741367d5SDoug Ambrisko char str[64]; 707741367d5SDoug Ambrisko } ecc; 708741367d5SDoug Ambrisko 709741367d5SDoug Ambrisko uint8_t b[96]; 710741367d5SDoug Ambrisko uint16_t s[48]; 711741367d5SDoug Ambrisko uint32_t w[24]; 712741367d5SDoug Ambrisko uint64_t d[12]; 713741367d5SDoug Ambrisko } args; 714741367d5SDoug Ambrisko 715741367d5SDoug Ambrisko char description[128]; 716741367d5SDoug Ambrisko } __packed; 717741367d5SDoug Ambrisko 718741367d5SDoug Ambrisko /* SAS log detail guessed at */ 719741367d5SDoug Ambrisko struct mfi_log_detail { 720741367d5SDoug Ambrisko uint32_t something1; 721741367d5SDoug Ambrisko uint32_t something2; 722741367d5SDoug Ambrisko uint32_t seq; 723741367d5SDoug Ambrisko uint32_t something3; 724741367d5SDoug Ambrisko uint32_t arg_type; 725741367d5SDoug Ambrisko uint8_t reserved1[15]; 726741367d5SDoug Ambrisko 727741367d5SDoug Ambrisko union { 728741367d5SDoug Ambrisko uint8_t b[96]; 729741367d5SDoug Ambrisko } args; 730741367d5SDoug Ambrisko char description[128]; 731741367d5SDoug Ambrisko } __packed; 732741367d5SDoug Ambrisko 733c0b332d1SPaul Saab struct mfi_ldref { 734c0b332d1SPaul Saab uint8_t target_id; 735c0b332d1SPaul Saab uint8_t reserved; 736c0b332d1SPaul Saab uint16_t seq; 737c0b332d1SPaul Saab } __packed; 738c0b332d1SPaul Saab 739c0b332d1SPaul Saab struct mfi_ld_list { 740c0b332d1SPaul Saab uint32_t ld_count; 741c0b332d1SPaul Saab uint32_t reserved1; 742c0b332d1SPaul Saab struct { 743c0b332d1SPaul Saab struct mfi_ldref ld; 744c0b332d1SPaul Saab uint8_t state; 745c0b332d1SPaul Saab uint8_t reserved2[3]; 746c0b332d1SPaul Saab uint64_t size; 747c0b332d1SPaul Saab } ld_list[MFI_MAX_LD]; 748c0b332d1SPaul Saab } __packed; 749c0b332d1SPaul Saab 750c0b332d1SPaul Saab enum mfi_ld_access { 751c0b332d1SPaul Saab MFI_LD_ACCESS_RW = 0, 752c0b332d1SPaul Saab MFI_LD_ACCSSS_RO = 2, 753c0b332d1SPaul Saab MFI_LD_ACCESS_BLOCKED = 3, 754c0b332d1SPaul Saab }; 755c0b332d1SPaul Saab #define MFI_LD_ACCESS_MASK 3 756c0b332d1SPaul Saab 757c0b332d1SPaul Saab enum mfi_ld_state { 758c0b332d1SPaul Saab MFI_LD_STATE_OFFLINE = 0, 759c0b332d1SPaul Saab MFI_LD_STATE_PARTIALLY_DEGRADED = 1, 760c0b332d1SPaul Saab MFI_LD_STATE_DEGRADED = 2, 761c0b332d1SPaul Saab MFI_LD_STATE_OPTIMAL = 3 762c0b332d1SPaul Saab }; 763c0b332d1SPaul Saab 764c0b332d1SPaul Saab struct mfi_ld_props { 765c0b332d1SPaul Saab struct mfi_ldref ld; 766c0b332d1SPaul Saab char name[16]; 767c0b332d1SPaul Saab uint8_t default_cache_policy; 768c0b332d1SPaul Saab uint8_t access_policy; 769c0b332d1SPaul Saab uint8_t disk_cache_policy; 770c0b332d1SPaul Saab uint8_t current_cache_policy; 771c0b332d1SPaul Saab uint8_t no_bgi; 772c0b332d1SPaul Saab uint8_t reserved[7]; 773c0b332d1SPaul Saab } __packed; 774c0b332d1SPaul Saab 775c0b332d1SPaul Saab struct mfi_ld_params { 776c0b332d1SPaul Saab uint8_t primary_raid_level; 777c0b332d1SPaul Saab uint8_t raid_level_qualifier; 778c0b332d1SPaul Saab uint8_t secondary_raid_level; 779c0b332d1SPaul Saab uint8_t stripe_size; 780c0b332d1SPaul Saab uint8_t num_drives; 781c0b332d1SPaul Saab uint8_t span_depth; 782c0b332d1SPaul Saab uint8_t state; 783c0b332d1SPaul Saab uint8_t init_state; 784c0b332d1SPaul Saab uint8_t is_consistent; 785c0b332d1SPaul Saab uint8_t reserved[23]; 786c0b332d1SPaul Saab } __packed; 787c0b332d1SPaul Saab 788c0b332d1SPaul Saab struct mfi_ld_progress { 789c0b332d1SPaul Saab uint32_t active; 790c0b332d1SPaul Saab #define MFI_LD_PROGRESS_CC (1<<0) 791c0b332d1SPaul Saab #define MFI_LD_PROGRESS_BGI (1<<1) 792c0b332d1SPaul Saab #define MFI_LD_PROGRESS_FGI (1<<2) 793c0b332d1SPaul Saab #define MFI_LD_PORGRESS_RECON (1<<3) 794c0b332d1SPaul Saab struct mfi_progress cc; 795c0b332d1SPaul Saab struct mfi_progress bgi; 796c0b332d1SPaul Saab struct mfi_progress fgi; 797c0b332d1SPaul Saab struct mfi_progress recon; 798c0b332d1SPaul Saab struct mfi_progress reserved[4]; 799c0b332d1SPaul Saab } __packed; 800c0b332d1SPaul Saab 801c0b332d1SPaul Saab struct mfi_span { 802c0b332d1SPaul Saab uint64_t start_block; 803c0b332d1SPaul Saab uint64_t num_blocks; 804c0b332d1SPaul Saab uint16_t array_ref; 805c0b332d1SPaul Saab uint8_t reserved[6]; 806c0b332d1SPaul Saab } __packed; 807c0b332d1SPaul Saab 808c0b332d1SPaul Saab #define MFI_MAX_SPAN_DEPTH 8 809c0b332d1SPaul Saab struct mfi_ld_config { 810c0b332d1SPaul Saab struct mfi_ld_props properties; 811c0b332d1SPaul Saab struct mfi_ld_params params; 812c0b332d1SPaul Saab struct mfi_span span[MFI_MAX_SPAN_DEPTH]; 813c0b332d1SPaul Saab } __packed; 814c0b332d1SPaul Saab 815c0b332d1SPaul Saab struct mfi_ld_info { 816c0b332d1SPaul Saab struct mfi_ld_config ld_config; 817c0b332d1SPaul Saab uint64_t size; 818c0b332d1SPaul Saab struct mfi_ld_progress progress; 819c0b332d1SPaul Saab uint16_t cluster_owner; 820c0b332d1SPaul Saab uint8_t reconstruct_active; 821c0b332d1SPaul Saab uint8_t reserved1[1]; 822c0b332d1SPaul Saab uint8_t vpd_page83[64]; 823c0b332d1SPaul Saab uint8_t reserved2[16]; 824c0b332d1SPaul Saab } __packed; 825c0b332d1SPaul Saab 8262e21a3efSScott Long #endif /* _MFIREG_H */ 827