147b43a1fSPaolo Bonzini /* 247b43a1fSPaolo Bonzini * NetBSD header file, copied from 347b43a1fSPaolo Bonzini * http://gitorious.org/freebsd/freebsd/blobs/HEAD/sys/dev/mfi/mfireg.h 447b43a1fSPaolo Bonzini */ 547b43a1fSPaolo Bonzini /*- 647b43a1fSPaolo Bonzini * Copyright (c) 2006 IronPort Systems 747b43a1fSPaolo Bonzini * Copyright (c) 2007 LSI Corp. 847b43a1fSPaolo Bonzini * Copyright (c) 2007 Rajesh Prabhakaran. 947b43a1fSPaolo Bonzini * All rights reserved. 1047b43a1fSPaolo Bonzini * 1147b43a1fSPaolo Bonzini * Redistribution and use in source and binary forms, with or without 1247b43a1fSPaolo Bonzini * modification, are permitted provided that the following conditions 1347b43a1fSPaolo Bonzini * are met: 1447b43a1fSPaolo Bonzini * 1. Redistributions of source code must retain the above copyright 1547b43a1fSPaolo Bonzini * notice, this list of conditions and the following disclaimer. 1647b43a1fSPaolo Bonzini * 2. Redistributions in binary form must reproduce the above copyright 1747b43a1fSPaolo Bonzini * notice, this list of conditions and the following disclaimer in the 1847b43a1fSPaolo Bonzini * documentation and/or other materials provided with the distribution. 1947b43a1fSPaolo Bonzini * 2047b43a1fSPaolo Bonzini * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 2147b43a1fSPaolo Bonzini * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2247b43a1fSPaolo Bonzini * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2347b43a1fSPaolo Bonzini * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2447b43a1fSPaolo Bonzini * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2547b43a1fSPaolo Bonzini * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2647b43a1fSPaolo Bonzini * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2747b43a1fSPaolo Bonzini * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2847b43a1fSPaolo Bonzini * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2947b43a1fSPaolo Bonzini * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3047b43a1fSPaolo Bonzini * SUCH DAMAGE. 3147b43a1fSPaolo Bonzini */ 3247b43a1fSPaolo Bonzini 33121d0712SMarkus Armbruster #ifndef SCSI_MFI_H 34121d0712SMarkus Armbruster #define SCSI_MFI_H 3547b43a1fSPaolo Bonzini 3647b43a1fSPaolo Bonzini /* 3747b43a1fSPaolo Bonzini * MegaRAID SAS MFI firmware definitions 3847b43a1fSPaolo Bonzini */ 3947b43a1fSPaolo Bonzini 4047b43a1fSPaolo Bonzini /* 4147b43a1fSPaolo Bonzini * Start with the register set. All registers are 32 bits wide. 4247b43a1fSPaolo Bonzini * The usual Intel IOP style setup. 4347b43a1fSPaolo Bonzini */ 4447b43a1fSPaolo Bonzini #define MFI_IMSG0 0x10 /* Inbound message 0 */ 4547b43a1fSPaolo Bonzini #define MFI_IMSG1 0x14 /* Inbound message 1 */ 4647b43a1fSPaolo Bonzini #define MFI_OMSG0 0x18 /* Outbound message 0 */ 4747b43a1fSPaolo Bonzini #define MFI_OMSG1 0x1c /* Outbound message 1 */ 4847b43a1fSPaolo Bonzini #define MFI_IDB 0x20 /* Inbound doorbell */ 4947b43a1fSPaolo Bonzini #define MFI_ISTS 0x24 /* Inbound interrupt status */ 5047b43a1fSPaolo Bonzini #define MFI_IMSK 0x28 /* Inbound interrupt mask */ 5147b43a1fSPaolo Bonzini #define MFI_ODB 0x2c /* Outbound doorbell */ 5247b43a1fSPaolo Bonzini #define MFI_OSTS 0x30 /* Outbound interrupt status */ 5347b43a1fSPaolo Bonzini #define MFI_OMSK 0x34 /* Outbound interrupt mask */ 5447b43a1fSPaolo Bonzini #define MFI_IQP 0x40 /* Inbound queue port */ 5547b43a1fSPaolo Bonzini #define MFI_OQP 0x44 /* Outbound queue port */ 5647b43a1fSPaolo Bonzini 5747b43a1fSPaolo Bonzini /* 5847b43a1fSPaolo Bonzini * 1078 specific related register 5947b43a1fSPaolo Bonzini */ 6047b43a1fSPaolo Bonzini #define MFI_ODR0 0x9c /* outbound doorbell register0 */ 6147b43a1fSPaolo Bonzini #define MFI_ODCR0 0xa0 /* outbound doorbell clear register0 */ 6247b43a1fSPaolo Bonzini #define MFI_OSP0 0xb0 /* outbound scratch pad0 */ 63e23d0498SHannes Reinecke #define MFI_OSP1 0xb4 /* outbound scratch pad1 */ 6447b43a1fSPaolo Bonzini #define MFI_IQPL 0xc0 /* Inbound queue port (low bytes) */ 6547b43a1fSPaolo Bonzini #define MFI_IQPH 0xc4 /* Inbound queue port (high bytes) */ 6647b43a1fSPaolo Bonzini #define MFI_DIAG 0xf8 /* Host diag */ 6747b43a1fSPaolo Bonzini #define MFI_SEQ 0xfc /* Sequencer offset */ 68*9b4b4e51SMichael Tokarev #define MFI_1078_EIM 0x80000004 /* 1078 enable interrupt mask */ 6947b43a1fSPaolo Bonzini #define MFI_RMI 0x2 /* reply message interrupt */ 7047b43a1fSPaolo Bonzini #define MFI_1078_RM 0x80000000 /* reply 1078 message interrupt */ 7147b43a1fSPaolo Bonzini #define MFI_ODC 0x4 /* outbound doorbell change interrupt */ 7247b43a1fSPaolo Bonzini 7347b43a1fSPaolo Bonzini /* 7447b43a1fSPaolo Bonzini * gen2 specific changes 7547b43a1fSPaolo Bonzini */ 7647b43a1fSPaolo Bonzini #define MFI_GEN2_EIM 0x00000005 /* gen2 enable interrupt mask */ 7747b43a1fSPaolo Bonzini #define MFI_GEN2_RM 0x00000001 /* reply gen2 message interrupt */ 7847b43a1fSPaolo Bonzini 7947b43a1fSPaolo Bonzini /* 8047b43a1fSPaolo Bonzini * skinny specific changes 8147b43a1fSPaolo Bonzini */ 8247b43a1fSPaolo Bonzini #define MFI_SKINNY_IDB 0x00 /* Inbound doorbell is at 0x00 for skinny */ 8347b43a1fSPaolo Bonzini #define MFI_SKINNY_RM 0x00000001 /* reply skinny message interrupt */ 8447b43a1fSPaolo Bonzini 8547b43a1fSPaolo Bonzini /* Bits for MFI_OSTS */ 8647b43a1fSPaolo Bonzini #define MFI_OSTS_INTR_VALID 0x00000002 8747b43a1fSPaolo Bonzini 8847b43a1fSPaolo Bonzini /* 8947b43a1fSPaolo Bonzini * Firmware state values. Found in OMSG0 during initialization. 9047b43a1fSPaolo Bonzini */ 9147b43a1fSPaolo Bonzini #define MFI_FWSTATE_MASK 0xf0000000 9247b43a1fSPaolo Bonzini #define MFI_FWSTATE_UNDEFINED 0x00000000 9347b43a1fSPaolo Bonzini #define MFI_FWSTATE_BB_INIT 0x10000000 9447b43a1fSPaolo Bonzini #define MFI_FWSTATE_FW_INIT 0x40000000 9547b43a1fSPaolo Bonzini #define MFI_FWSTATE_WAIT_HANDSHAKE 0x60000000 9647b43a1fSPaolo Bonzini #define MFI_FWSTATE_FW_INIT_2 0x70000000 9747b43a1fSPaolo Bonzini #define MFI_FWSTATE_DEVICE_SCAN 0x80000000 9847b43a1fSPaolo Bonzini #define MFI_FWSTATE_BOOT_MSG_PENDING 0x90000000 9947b43a1fSPaolo Bonzini #define MFI_FWSTATE_FLUSH_CACHE 0xa0000000 10047b43a1fSPaolo Bonzini #define MFI_FWSTATE_READY 0xb0000000 10147b43a1fSPaolo Bonzini #define MFI_FWSTATE_OPERATIONAL 0xc0000000 10247b43a1fSPaolo Bonzini #define MFI_FWSTATE_FAULT 0xf0000000 10347b43a1fSPaolo Bonzini #define MFI_FWSTATE_MAXSGL_MASK 0x00ff0000 10447b43a1fSPaolo Bonzini #define MFI_FWSTATE_MAXCMD_MASK 0x0000ffff 10547b43a1fSPaolo Bonzini #define MFI_FWSTATE_MSIX_SUPPORTED 0x04000000 10647b43a1fSPaolo Bonzini #define MFI_FWSTATE_HOSTMEMREQD_MASK 0x08000000 10747b43a1fSPaolo Bonzini 10847b43a1fSPaolo Bonzini /* 10947b43a1fSPaolo Bonzini * Control bits to drive the card to ready state. These go into the IDB 11047b43a1fSPaolo Bonzini * register. 11147b43a1fSPaolo Bonzini */ 11247b43a1fSPaolo Bonzini #define MFI_FWINIT_ABORT 0x00000001 /* Abort all pending commands */ 11347b43a1fSPaolo Bonzini #define MFI_FWINIT_READY 0x00000002 /* Move from operational to ready */ 11447b43a1fSPaolo Bonzini #define MFI_FWINIT_MFIMODE 0x00000004 /* unknown */ 11547b43a1fSPaolo Bonzini #define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */ 11647b43a1fSPaolo Bonzini #define MFI_FWINIT_HOTPLUG 0x00000010 11747b43a1fSPaolo Bonzini #define MFI_FWINIT_STOP_ADP 0x00000020 /* Move to operational, stop */ 11847b43a1fSPaolo Bonzini #define MFI_FWINIT_ADP_RESET 0x00000040 /* Reset ADP */ 11947b43a1fSPaolo Bonzini 120e23d0498SHannes Reinecke /* 121e23d0498SHannes Reinecke * Control bits for the DIAG register 122e23d0498SHannes Reinecke */ 123e23d0498SHannes Reinecke #define MFI_DIAG_WRITE_ENABLE 0x00000080 124e23d0498SHannes Reinecke #define MFI_DIAG_RESET_ADP 0x00000004 125e23d0498SHannes Reinecke 12647b43a1fSPaolo Bonzini /* MFI Commands */ 12747b43a1fSPaolo Bonzini typedef enum { 12847b43a1fSPaolo Bonzini MFI_CMD_INIT = 0x00, 12947b43a1fSPaolo Bonzini MFI_CMD_LD_READ, 13047b43a1fSPaolo Bonzini MFI_CMD_LD_WRITE, 13147b43a1fSPaolo Bonzini MFI_CMD_LD_SCSI_IO, 13247b43a1fSPaolo Bonzini MFI_CMD_PD_SCSI_IO, 13347b43a1fSPaolo Bonzini MFI_CMD_DCMD, 13447b43a1fSPaolo Bonzini MFI_CMD_ABORT, 13547b43a1fSPaolo Bonzini MFI_CMD_SMP, 13647b43a1fSPaolo Bonzini MFI_CMD_STP 13747b43a1fSPaolo Bonzini } mfi_cmd_t; 13847b43a1fSPaolo Bonzini 13947b43a1fSPaolo Bonzini /* Direct commands */ 14047b43a1fSPaolo Bonzini typedef enum { 14147b43a1fSPaolo Bonzini MFI_DCMD_CTRL_MFI_HOST_MEM_ALLOC = 0x0100e100, 14247b43a1fSPaolo Bonzini MFI_DCMD_CTRL_GET_INFO = 0x01010000, 14347b43a1fSPaolo Bonzini MFI_DCMD_CTRL_GET_PROPERTIES = 0x01020100, 14447b43a1fSPaolo Bonzini MFI_DCMD_CTRL_SET_PROPERTIES = 0x01020200, 14547b43a1fSPaolo Bonzini MFI_DCMD_CTRL_ALARM = 0x01030000, 14647b43a1fSPaolo Bonzini MFI_DCMD_CTRL_ALARM_GET = 0x01030100, 14747b43a1fSPaolo Bonzini MFI_DCMD_CTRL_ALARM_ENABLE = 0x01030200, 14847b43a1fSPaolo Bonzini MFI_DCMD_CTRL_ALARM_DISABLE = 0x01030300, 14947b43a1fSPaolo Bonzini MFI_DCMD_CTRL_ALARM_SILENCE = 0x01030400, 15047b43a1fSPaolo Bonzini MFI_DCMD_CTRL_ALARM_TEST = 0x01030500, 15147b43a1fSPaolo Bonzini MFI_DCMD_CTRL_EVENT_GETINFO = 0x01040100, 15247b43a1fSPaolo Bonzini MFI_DCMD_CTRL_EVENT_CLEAR = 0x01040200, 15347b43a1fSPaolo Bonzini MFI_DCMD_CTRL_EVENT_GET = 0x01040300, 15447b43a1fSPaolo Bonzini MFI_DCMD_CTRL_EVENT_COUNT = 0x01040400, 15547b43a1fSPaolo Bonzini MFI_DCMD_CTRL_EVENT_WAIT = 0x01040500, 15647b43a1fSPaolo Bonzini MFI_DCMD_CTRL_SHUTDOWN = 0x01050000, 15747b43a1fSPaolo Bonzini MFI_DCMD_HIBERNATE_STANDBY = 0x01060000, 15847b43a1fSPaolo Bonzini MFI_DCMD_CTRL_GET_TIME = 0x01080101, 15947b43a1fSPaolo Bonzini MFI_DCMD_CTRL_SET_TIME = 0x01080102, 16047b43a1fSPaolo Bonzini MFI_DCMD_CTRL_BIOS_DATA_GET = 0x010c0100, 16147b43a1fSPaolo Bonzini MFI_DCMD_CTRL_BIOS_DATA_SET = 0x010c0200, 16247b43a1fSPaolo Bonzini MFI_DCMD_CTRL_FACTORY_DEFAULTS = 0x010d0000, 16347b43a1fSPaolo Bonzini MFI_DCMD_CTRL_MFC_DEFAULTS_GET = 0x010e0201, 16447b43a1fSPaolo Bonzini MFI_DCMD_CTRL_MFC_DEFAULTS_SET = 0x010e0202, 16547b43a1fSPaolo Bonzini MFI_DCMD_CTRL_CACHE_FLUSH = 0x01101000, 16647b43a1fSPaolo Bonzini MFI_DCMD_PD_GET_LIST = 0x02010000, 16747b43a1fSPaolo Bonzini MFI_DCMD_PD_LIST_QUERY = 0x02010100, 16847b43a1fSPaolo Bonzini MFI_DCMD_PD_GET_INFO = 0x02020000, 16947b43a1fSPaolo Bonzini MFI_DCMD_PD_STATE_SET = 0x02030100, 17047b43a1fSPaolo Bonzini MFI_DCMD_PD_REBUILD = 0x02040100, 17147b43a1fSPaolo Bonzini MFI_DCMD_PD_BLINK = 0x02070100, 17247b43a1fSPaolo Bonzini MFI_DCMD_PD_UNBLINK = 0x02070200, 17347b43a1fSPaolo Bonzini MFI_DCMD_LD_GET_LIST = 0x03010000, 17434bb4d02SHannes Reinecke MFI_DCMD_LD_LIST_QUERY = 0x03010100, 17547b43a1fSPaolo Bonzini MFI_DCMD_LD_GET_INFO = 0x03020000, 17647b43a1fSPaolo Bonzini MFI_DCMD_LD_GET_PROP = 0x03030000, 17747b43a1fSPaolo Bonzini MFI_DCMD_LD_SET_PROP = 0x03040000, 17847b43a1fSPaolo Bonzini MFI_DCMD_LD_DELETE = 0x03090000, 17947b43a1fSPaolo Bonzini MFI_DCMD_CFG_READ = 0x04010000, 18047b43a1fSPaolo Bonzini MFI_DCMD_CFG_ADD = 0x04020000, 18147b43a1fSPaolo Bonzini MFI_DCMD_CFG_CLEAR = 0x04030000, 18247b43a1fSPaolo Bonzini MFI_DCMD_CFG_FOREIGN_READ = 0x04060100, 18347b43a1fSPaolo Bonzini MFI_DCMD_CFG_FOREIGN_IMPORT = 0x04060400, 18447b43a1fSPaolo Bonzini MFI_DCMD_BBU_STATUS = 0x05010000, 18547b43a1fSPaolo Bonzini MFI_DCMD_BBU_CAPACITY_INFO = 0x05020000, 18647b43a1fSPaolo Bonzini MFI_DCMD_BBU_DESIGN_INFO = 0x05030000, 18747b43a1fSPaolo Bonzini MFI_DCMD_BBU_PROP_GET = 0x05050100, 18847b43a1fSPaolo Bonzini MFI_DCMD_CLUSTER = 0x08000000, 18947b43a1fSPaolo Bonzini MFI_DCMD_CLUSTER_RESET_ALL = 0x08010100, 19047b43a1fSPaolo Bonzini MFI_DCMD_CLUSTER_RESET_LD = 0x08010200 19147b43a1fSPaolo Bonzini } mfi_dcmd_t; 19247b43a1fSPaolo Bonzini 19347b43a1fSPaolo Bonzini /* Modifiers for MFI_DCMD_CTRL_FLUSHCACHE */ 19447b43a1fSPaolo Bonzini #define MFI_FLUSHCACHE_CTRL 0x01 19547b43a1fSPaolo Bonzini #define MFI_FLUSHCACHE_DISK 0x02 19647b43a1fSPaolo Bonzini 19747b43a1fSPaolo Bonzini /* Modifiers for MFI_DCMD_CTRL_SHUTDOWN */ 19847b43a1fSPaolo Bonzini #define MFI_SHUTDOWN_SPINDOWN 0x01 19947b43a1fSPaolo Bonzini 20047b43a1fSPaolo Bonzini /* 20147b43a1fSPaolo Bonzini * MFI Frame flags 20247b43a1fSPaolo Bonzini */ 20347b43a1fSPaolo Bonzini typedef enum { 20447b43a1fSPaolo Bonzini MFI_FRAME_DONT_POST_IN_REPLY_QUEUE = 0x0001, 20547b43a1fSPaolo Bonzini MFI_FRAME_SGL64 = 0x0002, 20647b43a1fSPaolo Bonzini MFI_FRAME_SENSE64 = 0x0004, 20747b43a1fSPaolo Bonzini MFI_FRAME_DIR_WRITE = 0x0008, 20847b43a1fSPaolo Bonzini MFI_FRAME_DIR_READ = 0x0010, 20947b43a1fSPaolo Bonzini MFI_FRAME_IEEE_SGL = 0x0020, 21047b43a1fSPaolo Bonzini } mfi_frame_flags; 21147b43a1fSPaolo Bonzini 21247b43a1fSPaolo Bonzini /* MFI Status codes */ 21347b43a1fSPaolo Bonzini typedef enum { 21447b43a1fSPaolo Bonzini MFI_STAT_OK = 0x00, 21547b43a1fSPaolo Bonzini MFI_STAT_INVALID_CMD, 21647b43a1fSPaolo Bonzini MFI_STAT_INVALID_DCMD, 21747b43a1fSPaolo Bonzini MFI_STAT_INVALID_PARAMETER, 21847b43a1fSPaolo Bonzini MFI_STAT_INVALID_SEQUENCE_NUMBER, 21947b43a1fSPaolo Bonzini MFI_STAT_ABORT_NOT_POSSIBLE, 22047b43a1fSPaolo Bonzini MFI_STAT_APP_HOST_CODE_NOT_FOUND, 22147b43a1fSPaolo Bonzini MFI_STAT_APP_IN_USE, 22247b43a1fSPaolo Bonzini MFI_STAT_APP_NOT_INITIALIZED, 22347b43a1fSPaolo Bonzini MFI_STAT_ARRAY_INDEX_INVALID, 22447b43a1fSPaolo Bonzini MFI_STAT_ARRAY_ROW_NOT_EMPTY, 22547b43a1fSPaolo Bonzini MFI_STAT_CONFIG_RESOURCE_CONFLICT, 22647b43a1fSPaolo Bonzini MFI_STAT_DEVICE_NOT_FOUND, 22747b43a1fSPaolo Bonzini MFI_STAT_DRIVE_TOO_SMALL, 22847b43a1fSPaolo Bonzini MFI_STAT_FLASH_ALLOC_FAIL, 22947b43a1fSPaolo Bonzini MFI_STAT_FLASH_BUSY, 23047b43a1fSPaolo Bonzini MFI_STAT_FLASH_ERROR = 0x10, 23147b43a1fSPaolo Bonzini MFI_STAT_FLASH_IMAGE_BAD, 23247b43a1fSPaolo Bonzini MFI_STAT_FLASH_IMAGE_INCOMPLETE, 23347b43a1fSPaolo Bonzini MFI_STAT_FLASH_NOT_OPEN, 23447b43a1fSPaolo Bonzini MFI_STAT_FLASH_NOT_STARTED, 23547b43a1fSPaolo Bonzini MFI_STAT_FLUSH_FAILED, 23647b43a1fSPaolo Bonzini MFI_STAT_HOST_CODE_NOT_FOUNT, 23747b43a1fSPaolo Bonzini MFI_STAT_LD_CC_IN_PROGRESS, 23847b43a1fSPaolo Bonzini MFI_STAT_LD_INIT_IN_PROGRESS, 23947b43a1fSPaolo Bonzini MFI_STAT_LD_LBA_OUT_OF_RANGE, 24047b43a1fSPaolo Bonzini MFI_STAT_LD_MAX_CONFIGURED, 24147b43a1fSPaolo Bonzini MFI_STAT_LD_NOT_OPTIMAL, 24247b43a1fSPaolo Bonzini MFI_STAT_LD_RBLD_IN_PROGRESS, 24347b43a1fSPaolo Bonzini MFI_STAT_LD_RECON_IN_PROGRESS, 24447b43a1fSPaolo Bonzini MFI_STAT_LD_WRONG_RAID_LEVEL, 24547b43a1fSPaolo Bonzini MFI_STAT_MAX_SPARES_EXCEEDED, 24647b43a1fSPaolo Bonzini MFI_STAT_MEMORY_NOT_AVAILABLE = 0x20, 24747b43a1fSPaolo Bonzini MFI_STAT_MFC_HW_ERROR, 24847b43a1fSPaolo Bonzini MFI_STAT_NO_HW_PRESENT, 24947b43a1fSPaolo Bonzini MFI_STAT_NOT_FOUND, 25047b43a1fSPaolo Bonzini MFI_STAT_NOT_IN_ENCL, 25147b43a1fSPaolo Bonzini MFI_STAT_PD_CLEAR_IN_PROGRESS, 25247b43a1fSPaolo Bonzini MFI_STAT_PD_TYPE_WRONG, 25347b43a1fSPaolo Bonzini MFI_STAT_PR_DISABLED, 25447b43a1fSPaolo Bonzini MFI_STAT_ROW_INDEX_INVALID, 25547b43a1fSPaolo Bonzini MFI_STAT_SAS_CONFIG_INVALID_ACTION, 25647b43a1fSPaolo Bonzini MFI_STAT_SAS_CONFIG_INVALID_DATA, 25747b43a1fSPaolo Bonzini MFI_STAT_SAS_CONFIG_INVALID_PAGE, 25847b43a1fSPaolo Bonzini MFI_STAT_SAS_CONFIG_INVALID_TYPE, 25947b43a1fSPaolo Bonzini MFI_STAT_SCSI_DONE_WITH_ERROR, 26047b43a1fSPaolo Bonzini MFI_STAT_SCSI_IO_FAILED, 26147b43a1fSPaolo Bonzini MFI_STAT_SCSI_RESERVATION_CONFLICT, 26247b43a1fSPaolo Bonzini MFI_STAT_SHUTDOWN_FAILED = 0x30, 26347b43a1fSPaolo Bonzini MFI_STAT_TIME_NOT_SET, 26447b43a1fSPaolo Bonzini MFI_STAT_WRONG_STATE, 26547b43a1fSPaolo Bonzini MFI_STAT_LD_OFFLINE, 26647b43a1fSPaolo Bonzini MFI_STAT_PEER_NOTIFICATION_REJECTED, 26747b43a1fSPaolo Bonzini MFI_STAT_PEER_NOTIFICATION_FAILED, 26847b43a1fSPaolo Bonzini MFI_STAT_RESERVATION_IN_PROGRESS, 26947b43a1fSPaolo Bonzini MFI_STAT_I2C_ERRORS_DETECTED, 27047b43a1fSPaolo Bonzini MFI_STAT_PCI_ERRORS_DETECTED, 27147b43a1fSPaolo Bonzini MFI_STAT_DIAG_FAILED, 27247b43a1fSPaolo Bonzini MFI_STAT_BOOT_MSG_PENDING, 27347b43a1fSPaolo Bonzini MFI_STAT_FOREIGN_CONFIG_INCOMPLETE, 27447b43a1fSPaolo Bonzini MFI_STAT_INVALID_SGL, 27547b43a1fSPaolo Bonzini MFI_STAT_UNSUPPORTED_HW, 27647b43a1fSPaolo Bonzini MFI_STAT_CC_SCHEDULE_DISABLED, 27747b43a1fSPaolo Bonzini MFI_STAT_PD_COPYBACK_IN_PROGRESS, 27847b43a1fSPaolo Bonzini MFI_STAT_MULTIPLE_PDS_IN_ARRAY = 0x40, 27947b43a1fSPaolo Bonzini MFI_STAT_FW_DOWNLOAD_ERROR, 28047b43a1fSPaolo Bonzini MFI_STAT_FEATURE_SECURITY_NOT_ENABLED, 28147b43a1fSPaolo Bonzini MFI_STAT_LOCK_KEY_ALREADY_EXISTS, 28247b43a1fSPaolo Bonzini MFI_STAT_LOCK_KEY_BACKUP_NOT_ALLOWED, 28347b43a1fSPaolo Bonzini MFI_STAT_LOCK_KEY_VERIFY_NOT_ALLOWED, 28447b43a1fSPaolo Bonzini MFI_STAT_LOCK_KEY_VERIFY_FAILED, 28547b43a1fSPaolo Bonzini MFI_STAT_LOCK_KEY_REKEY_NOT_ALLOWED, 28647b43a1fSPaolo Bonzini MFI_STAT_LOCK_KEY_INVALID, 28747b43a1fSPaolo Bonzini MFI_STAT_LOCK_KEY_ESCROW_INVALID, 28847b43a1fSPaolo Bonzini MFI_STAT_LOCK_KEY_BACKUP_REQUIRED, 28947b43a1fSPaolo Bonzini MFI_STAT_SECURE_LD_EXISTS, 29047b43a1fSPaolo Bonzini MFI_STAT_LD_SECURE_NOT_ALLOWED, 29147b43a1fSPaolo Bonzini MFI_STAT_REPROVISION_NOT_ALLOWED, 29247b43a1fSPaolo Bonzini MFI_STAT_PD_SECURITY_TYPE_WRONG, 29347b43a1fSPaolo Bonzini MFI_STAT_LD_ENCRYPTION_TYPE_INVALID, 29447b43a1fSPaolo Bonzini MFI_STAT_CONFIG_FDE_NON_FDE_MIX_NOT_ALLOWED = 0x50, 29547b43a1fSPaolo Bonzini MFI_STAT_CONFIG_LD_ENCRYPTION_TYPE_MIX_NOT_ALLOWED, 29647b43a1fSPaolo Bonzini MFI_STAT_SECRET_KEY_NOT_ALLOWED, 29747b43a1fSPaolo Bonzini MFI_STAT_PD_HW_ERRORS_DETECTED, 29847b43a1fSPaolo Bonzini MFI_STAT_LD_CACHE_PINNED, 29947b43a1fSPaolo Bonzini MFI_STAT_POWER_STATE_SET_IN_PROGRESS, 30047b43a1fSPaolo Bonzini MFI_STAT_POWER_STATE_SET_BUSY, 30147b43a1fSPaolo Bonzini MFI_STAT_POWER_STATE_WRONG, 30247b43a1fSPaolo Bonzini MFI_STAT_PR_NO_AVAILABLE_PD_FOUND, 30347b43a1fSPaolo Bonzini MFI_STAT_CTRL_RESET_REQUIRED, 30447b43a1fSPaolo Bonzini MFI_STAT_LOCK_KEY_EKM_NO_BOOT_AGENT, 30547b43a1fSPaolo Bonzini MFI_STAT_SNAP_NO_SPACE, 30647b43a1fSPaolo Bonzini MFI_STAT_SNAP_PARTIAL_FAILURE, 30747b43a1fSPaolo Bonzini MFI_STAT_UPGRADE_KEY_INCOMPATIBLE, 30847b43a1fSPaolo Bonzini MFI_STAT_PFK_INCOMPATIBLE, 30947b43a1fSPaolo Bonzini MFI_STAT_PD_MAX_UNCONFIGURED, 31047b43a1fSPaolo Bonzini MFI_STAT_IO_METRICS_DISABLED = 0x60, 31147b43a1fSPaolo Bonzini MFI_STAT_AEC_NOT_STOPPED, 31247b43a1fSPaolo Bonzini MFI_STAT_PI_TYPE_WRONG, 31347b43a1fSPaolo Bonzini MFI_STAT_LD_PD_PI_INCOMPATIBLE, 31447b43a1fSPaolo Bonzini MFI_STAT_PI_NOT_ENABLED, 31547b43a1fSPaolo Bonzini MFI_STAT_LD_BLOCK_SIZE_MISMATCH, 31647b43a1fSPaolo Bonzini MFI_STAT_INVALID_STATUS = 0xFF 31747b43a1fSPaolo Bonzini } mfi_status_t; 31847b43a1fSPaolo Bonzini 31947b43a1fSPaolo Bonzini /* Event classes */ 32047b43a1fSPaolo Bonzini typedef enum { 32147b43a1fSPaolo Bonzini MFI_EVT_CLASS_DEBUG = -2, 32247b43a1fSPaolo Bonzini MFI_EVT_CLASS_PROGRESS = -1, 32347b43a1fSPaolo Bonzini MFI_EVT_CLASS_INFO = 0, 32447b43a1fSPaolo Bonzini MFI_EVT_CLASS_WARNING = 1, 32547b43a1fSPaolo Bonzini MFI_EVT_CLASS_CRITICAL = 2, 32647b43a1fSPaolo Bonzini MFI_EVT_CLASS_FATAL = 3, 32747b43a1fSPaolo Bonzini MFI_EVT_CLASS_DEAD = 4 32847b43a1fSPaolo Bonzini } mfi_evt_class_t; 32947b43a1fSPaolo Bonzini 33047b43a1fSPaolo Bonzini /* Event locales */ 33147b43a1fSPaolo Bonzini typedef enum { 33247b43a1fSPaolo Bonzini MFI_EVT_LOCALE_LD = 0x0001, 33347b43a1fSPaolo Bonzini MFI_EVT_LOCALE_PD = 0x0002, 33447b43a1fSPaolo Bonzini MFI_EVT_LOCALE_ENCL = 0x0004, 33547b43a1fSPaolo Bonzini MFI_EVT_LOCALE_BBU = 0x0008, 33647b43a1fSPaolo Bonzini MFI_EVT_LOCALE_SAS = 0x0010, 33747b43a1fSPaolo Bonzini MFI_EVT_LOCALE_CTRL = 0x0020, 33847b43a1fSPaolo Bonzini MFI_EVT_LOCALE_CONFIG = 0x0040, 33947b43a1fSPaolo Bonzini MFI_EVT_LOCALE_CLUSTER = 0x0080, 34047b43a1fSPaolo Bonzini MFI_EVT_LOCALE_ALL = 0xffff 34147b43a1fSPaolo Bonzini } mfi_evt_locale_t; 34247b43a1fSPaolo Bonzini 34347b43a1fSPaolo Bonzini /* Event args */ 34447b43a1fSPaolo Bonzini typedef enum { 34547b43a1fSPaolo Bonzini MR_EVT_ARGS_NONE = 0x00, 34647b43a1fSPaolo Bonzini MR_EVT_ARGS_CDB_SENSE, 34747b43a1fSPaolo Bonzini MR_EVT_ARGS_LD, 34847b43a1fSPaolo Bonzini MR_EVT_ARGS_LD_COUNT, 34947b43a1fSPaolo Bonzini MR_EVT_ARGS_LD_LBA, 35047b43a1fSPaolo Bonzini MR_EVT_ARGS_LD_OWNER, 35147b43a1fSPaolo Bonzini MR_EVT_ARGS_LD_LBA_PD_LBA, 35247b43a1fSPaolo Bonzini MR_EVT_ARGS_LD_PROG, 35347b43a1fSPaolo Bonzini MR_EVT_ARGS_LD_STATE, 35447b43a1fSPaolo Bonzini MR_EVT_ARGS_LD_STRIP, 35547b43a1fSPaolo Bonzini MR_EVT_ARGS_PD, 35647b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_ERR, 35747b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_LBA, 35847b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_LBA_LD, 35947b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_PROG, 36047b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_STATE, 36147b43a1fSPaolo Bonzini MR_EVT_ARGS_PCI, 36247b43a1fSPaolo Bonzini MR_EVT_ARGS_RATE, 36347b43a1fSPaolo Bonzini MR_EVT_ARGS_STR, 36447b43a1fSPaolo Bonzini MR_EVT_ARGS_TIME, 36547b43a1fSPaolo Bonzini MR_EVT_ARGS_ECC, 36647b43a1fSPaolo Bonzini MR_EVT_ARGS_LD_PROP, 36747b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_SPARE, 36847b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_INDEX, 36947b43a1fSPaolo Bonzini MR_EVT_ARGS_DIAG_PASS, 37047b43a1fSPaolo Bonzini MR_EVT_ARGS_DIAG_FAIL, 37147b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_LBA_LBA, 37247b43a1fSPaolo Bonzini MR_EVT_ARGS_PORT_PHY, 37347b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_MISSING, 37447b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_ADDRESS, 37547b43a1fSPaolo Bonzini MR_EVT_ARGS_BITMAP, 37647b43a1fSPaolo Bonzini MR_EVT_ARGS_CONNECTOR, 37747b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_PD, 37847b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_FRU, 37947b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_PATHINFO, 38047b43a1fSPaolo Bonzini MR_EVT_ARGS_PD_POWER_STATE, 38147b43a1fSPaolo Bonzini MR_EVT_ARGS_GENERIC, 38247b43a1fSPaolo Bonzini } mfi_evt_args; 38347b43a1fSPaolo Bonzini 38447b43a1fSPaolo Bonzini /* Event codes */ 38547b43a1fSPaolo Bonzini #define MR_EVT_CFG_CLEARED 0x0004 38647b43a1fSPaolo Bonzini #define MR_EVT_CTRL_SHUTDOWN 0x002a 38747b43a1fSPaolo Bonzini #define MR_EVT_LD_STATE_CHANGE 0x0051 38847b43a1fSPaolo Bonzini #define MR_EVT_PD_INSERTED 0x005b 38947b43a1fSPaolo Bonzini #define MR_EVT_PD_REMOVED 0x0070 39047b43a1fSPaolo Bonzini #define MR_EVT_PD_STATE_CHANGED 0x0072 39147b43a1fSPaolo Bonzini #define MR_EVT_LD_CREATED 0x008a 39247b43a1fSPaolo Bonzini #define MR_EVT_LD_DELETED 0x008b 39347b43a1fSPaolo Bonzini #define MR_EVT_FOREIGN_CFG_IMPORTED 0x00db 39447b43a1fSPaolo Bonzini #define MR_EVT_LD_OFFLINE 0x00fc 39547b43a1fSPaolo Bonzini #define MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED 0x0152 39647b43a1fSPaolo Bonzini 39747b43a1fSPaolo Bonzini typedef enum { 39847b43a1fSPaolo Bonzini MR_LD_CACHE_WRITE_BACK = 0x01, 39947b43a1fSPaolo Bonzini MR_LD_CACHE_WRITE_ADAPTIVE = 0x02, 40047b43a1fSPaolo Bonzini MR_LD_CACHE_READ_AHEAD = 0x04, 40147b43a1fSPaolo Bonzini MR_LD_CACHE_READ_ADAPTIVE = 0x08, 40247b43a1fSPaolo Bonzini MR_LD_CACHE_WRITE_CACHE_BAD_BBU = 0x10, 40347b43a1fSPaolo Bonzini MR_LD_CACHE_ALLOW_WRITE_CACHE = 0x20, 40447b43a1fSPaolo Bonzini MR_LD_CACHE_ALLOW_READ_CACHE = 0x40 40547b43a1fSPaolo Bonzini } mfi_ld_cache; 40647b43a1fSPaolo Bonzini 40747b43a1fSPaolo Bonzini typedef enum { 40847b43a1fSPaolo Bonzini MR_PD_CACHE_UNCHANGED = 0, 40947b43a1fSPaolo Bonzini MR_PD_CACHE_ENABLE = 1, 41047b43a1fSPaolo Bonzini MR_PD_CACHE_DISABLE = 2 41147b43a1fSPaolo Bonzini } mfi_pd_cache; 41247b43a1fSPaolo Bonzini 41347b43a1fSPaolo Bonzini typedef enum { 41447b43a1fSPaolo Bonzini MR_PD_QUERY_TYPE_ALL = 0, 41547b43a1fSPaolo Bonzini MR_PD_QUERY_TYPE_STATE = 1, 41647b43a1fSPaolo Bonzini MR_PD_QUERY_TYPE_POWER_STATE = 2, 41747b43a1fSPaolo Bonzini MR_PD_QUERY_TYPE_MEDIA_TYPE = 3, 41847b43a1fSPaolo Bonzini MR_PD_QUERY_TYPE_SPEED = 4, 41947b43a1fSPaolo Bonzini MR_PD_QUERY_TYPE_EXPOSED_TO_HOST = 5, /*query for system drives */ 42047b43a1fSPaolo Bonzini } mfi_pd_query_type; 42147b43a1fSPaolo Bonzini 42234bb4d02SHannes Reinecke typedef enum { 42334bb4d02SHannes Reinecke MR_LD_QUERY_TYPE_ALL = 0, 42434bb4d02SHannes Reinecke MR_LD_QUERY_TYPE_EXPOSED_TO_HOST = 1, 42534bb4d02SHannes Reinecke MR_LD_QUERY_TYPE_USED_TGT_IDS = 2, 42634bb4d02SHannes Reinecke MR_LD_QUERY_TYPE_CLUSTER_ACCESS = 3, 42734bb4d02SHannes Reinecke MR_LD_QUERY_TYPE_CLUSTER_LOCALE = 4, 42834bb4d02SHannes Reinecke } mfi_ld_query_type; 42934bb4d02SHannes Reinecke 43047b43a1fSPaolo Bonzini /* 43147b43a1fSPaolo Bonzini * Other propertities and definitions 43247b43a1fSPaolo Bonzini */ 43347b43a1fSPaolo Bonzini #define MFI_MAX_PD_CHANNELS 2 43447b43a1fSPaolo Bonzini #define MFI_MAX_LD_CHANNELS 2 43547b43a1fSPaolo Bonzini #define MFI_MAX_CHANNELS (MFI_MAX_PD_CHANNELS + MFI_MAX_LD_CHANNELS) 43647b43a1fSPaolo Bonzini #define MFI_MAX_CHANNEL_DEVS 128 43747b43a1fSPaolo Bonzini #define MFI_DEFAULT_ID -1 43847b43a1fSPaolo Bonzini #define MFI_MAX_LUN 8 43947b43a1fSPaolo Bonzini #define MFI_MAX_LD 64 44047b43a1fSPaolo Bonzini 44147b43a1fSPaolo Bonzini #define MFI_FRAME_SIZE 64 44247b43a1fSPaolo Bonzini #define MFI_MBOX_SIZE 12 44347b43a1fSPaolo Bonzini 44447b43a1fSPaolo Bonzini /* Firmware flashing can take 40s */ 44547b43a1fSPaolo Bonzini #define MFI_POLL_TIMEOUT_SECS 50 44647b43a1fSPaolo Bonzini 44747b43a1fSPaolo Bonzini /* Allow for speedier math calculations */ 44847b43a1fSPaolo Bonzini #define MFI_SECTOR_LEN 512 44947b43a1fSPaolo Bonzini 45047b43a1fSPaolo Bonzini /* Scatter Gather elements */ 45147b43a1fSPaolo Bonzini struct mfi_sg32 { 45247b43a1fSPaolo Bonzini uint32_t addr; 45347b43a1fSPaolo Bonzini uint32_t len; 45447b43a1fSPaolo Bonzini } QEMU_PACKED; 45547b43a1fSPaolo Bonzini 45647b43a1fSPaolo Bonzini struct mfi_sg64 { 45747b43a1fSPaolo Bonzini uint64_t addr; 45847b43a1fSPaolo Bonzini uint32_t len; 45947b43a1fSPaolo Bonzini } QEMU_PACKED; 46047b43a1fSPaolo Bonzini 46147b43a1fSPaolo Bonzini struct mfi_sg_skinny { 46247b43a1fSPaolo Bonzini uint64_t addr; 46347b43a1fSPaolo Bonzini uint32_t len; 46447b43a1fSPaolo Bonzini uint32_t flag; 46547b43a1fSPaolo Bonzini } QEMU_PACKED; 46647b43a1fSPaolo Bonzini 46747b43a1fSPaolo Bonzini union mfi_sgl { 46847b43a1fSPaolo Bonzini struct mfi_sg32 sg32[1]; 46947b43a1fSPaolo Bonzini struct mfi_sg64 sg64[1]; 47047b43a1fSPaolo Bonzini struct mfi_sg_skinny sg_skinny[1]; 47147b43a1fSPaolo Bonzini } QEMU_PACKED; 47247b43a1fSPaolo Bonzini 47347b43a1fSPaolo Bonzini /* Message frames. All messages have a common header */ 47447b43a1fSPaolo Bonzini struct mfi_frame_header { 47547b43a1fSPaolo Bonzini uint8_t frame_cmd; 47647b43a1fSPaolo Bonzini uint8_t sense_len; 47747b43a1fSPaolo Bonzini uint8_t cmd_status; 47847b43a1fSPaolo Bonzini uint8_t scsi_status; 47947b43a1fSPaolo Bonzini uint8_t target_id; 48047b43a1fSPaolo Bonzini uint8_t lun_id; 48147b43a1fSPaolo Bonzini uint8_t cdb_len; 48247b43a1fSPaolo Bonzini uint8_t sge_count; 48347b43a1fSPaolo Bonzini uint64_t context; 48447b43a1fSPaolo Bonzini uint16_t flags; 48547b43a1fSPaolo Bonzini uint16_t timeout; 48647b43a1fSPaolo Bonzini uint32_t data_len; 48747b43a1fSPaolo Bonzini } QEMU_PACKED; 48847b43a1fSPaolo Bonzini 48947b43a1fSPaolo Bonzini struct mfi_init_frame { 49047b43a1fSPaolo Bonzini struct mfi_frame_header header; 49147b43a1fSPaolo Bonzini uint32_t qinfo_new_addr_lo; 49247b43a1fSPaolo Bonzini uint32_t qinfo_new_addr_hi; 49347b43a1fSPaolo Bonzini uint32_t qinfo_old_addr_lo; 49447b43a1fSPaolo Bonzini uint32_t qinfo_old_addr_hi; 49547b43a1fSPaolo Bonzini uint32_t reserved[6]; 49647b43a1fSPaolo Bonzini }; 49747b43a1fSPaolo Bonzini 49847b43a1fSPaolo Bonzini #define MFI_IO_FRAME_SIZE 40 49947b43a1fSPaolo Bonzini struct mfi_io_frame { 50047b43a1fSPaolo Bonzini struct mfi_frame_header header; 50147b43a1fSPaolo Bonzini uint32_t sense_addr_lo; 50247b43a1fSPaolo Bonzini uint32_t sense_addr_hi; 50347b43a1fSPaolo Bonzini uint32_t lba_lo; 50447b43a1fSPaolo Bonzini uint32_t lba_hi; 50547b43a1fSPaolo Bonzini union mfi_sgl sgl; 50647b43a1fSPaolo Bonzini } QEMU_PACKED; 50747b43a1fSPaolo Bonzini 50847b43a1fSPaolo Bonzini #define MFI_PASS_FRAME_SIZE 48 50947b43a1fSPaolo Bonzini struct mfi_pass_frame { 51047b43a1fSPaolo Bonzini struct mfi_frame_header header; 51147b43a1fSPaolo Bonzini uint32_t sense_addr_lo; 51247b43a1fSPaolo Bonzini uint32_t sense_addr_hi; 51347b43a1fSPaolo Bonzini uint8_t cdb[16]; 51447b43a1fSPaolo Bonzini union mfi_sgl sgl; 51547b43a1fSPaolo Bonzini } QEMU_PACKED; 51647b43a1fSPaolo Bonzini 51747b43a1fSPaolo Bonzini #define MFI_DCMD_FRAME_SIZE 40 51847b43a1fSPaolo Bonzini struct mfi_dcmd_frame { 51947b43a1fSPaolo Bonzini struct mfi_frame_header header; 52047b43a1fSPaolo Bonzini uint32_t opcode; 52147b43a1fSPaolo Bonzini uint8_t mbox[MFI_MBOX_SIZE]; 52247b43a1fSPaolo Bonzini union mfi_sgl sgl; 52347b43a1fSPaolo Bonzini } QEMU_PACKED; 52447b43a1fSPaolo Bonzini 52547b43a1fSPaolo Bonzini struct mfi_abort_frame { 52647b43a1fSPaolo Bonzini struct mfi_frame_header header; 52747b43a1fSPaolo Bonzini uint64_t abort_context; 52847b43a1fSPaolo Bonzini uint32_t abort_mfi_addr_lo; 52947b43a1fSPaolo Bonzini uint32_t abort_mfi_addr_hi; 53047b43a1fSPaolo Bonzini uint32_t reserved1[6]; 53147b43a1fSPaolo Bonzini } QEMU_PACKED; 53247b43a1fSPaolo Bonzini 53347b43a1fSPaolo Bonzini struct mfi_smp_frame { 53447b43a1fSPaolo Bonzini struct mfi_frame_header header; 53547b43a1fSPaolo Bonzini uint64_t sas_addr; 53647b43a1fSPaolo Bonzini union { 53747b43a1fSPaolo Bonzini struct mfi_sg32 sg32[2]; 53847b43a1fSPaolo Bonzini struct mfi_sg64 sg64[2]; 53947b43a1fSPaolo Bonzini } sgl; 54047b43a1fSPaolo Bonzini } QEMU_PACKED; 54147b43a1fSPaolo Bonzini 54247b43a1fSPaolo Bonzini struct mfi_stp_frame { 54347b43a1fSPaolo Bonzini struct mfi_frame_header header; 54447b43a1fSPaolo Bonzini uint16_t fis[10]; 54547b43a1fSPaolo Bonzini uint32_t stp_flags; 54647b43a1fSPaolo Bonzini union { 54747b43a1fSPaolo Bonzini struct mfi_sg32 sg32[2]; 54847b43a1fSPaolo Bonzini struct mfi_sg64 sg64[2]; 54947b43a1fSPaolo Bonzini } sgl; 55047b43a1fSPaolo Bonzini } QEMU_PACKED; 55147b43a1fSPaolo Bonzini 55247b43a1fSPaolo Bonzini union mfi_frame { 55347b43a1fSPaolo Bonzini struct mfi_frame_header header; 55447b43a1fSPaolo Bonzini struct mfi_init_frame init; 55547b43a1fSPaolo Bonzini struct mfi_io_frame io; 55647b43a1fSPaolo Bonzini struct mfi_pass_frame pass; 55747b43a1fSPaolo Bonzini struct mfi_dcmd_frame dcmd; 55847b43a1fSPaolo Bonzini struct mfi_abort_frame abort; 55947b43a1fSPaolo Bonzini struct mfi_smp_frame smp; 56047b43a1fSPaolo Bonzini struct mfi_stp_frame stp; 56147b43a1fSPaolo Bonzini uint64_t raw[8]; 56247b43a1fSPaolo Bonzini uint8_t bytes[MFI_FRAME_SIZE]; 56347b43a1fSPaolo Bonzini }; 56447b43a1fSPaolo Bonzini 56547b43a1fSPaolo Bonzini #define MFI_SENSE_LEN 128 56647b43a1fSPaolo Bonzini struct mfi_sense { 56747b43a1fSPaolo Bonzini uint8_t data[MFI_SENSE_LEN]; 56847b43a1fSPaolo Bonzini }; 56947b43a1fSPaolo Bonzini 57047b43a1fSPaolo Bonzini #define MFI_QUEUE_FLAG_CONTEXT64 0x00000002 57147b43a1fSPaolo Bonzini 57247b43a1fSPaolo Bonzini /* The queue init structure that is passed with the init message */ 57347b43a1fSPaolo Bonzini struct mfi_init_qinfo { 57447b43a1fSPaolo Bonzini uint32_t flags; 57547b43a1fSPaolo Bonzini uint32_t rq_entries; 57647b43a1fSPaolo Bonzini uint32_t rq_addr_lo; 57747b43a1fSPaolo Bonzini uint32_t rq_addr_hi; 57847b43a1fSPaolo Bonzini uint32_t pi_addr_lo; 57947b43a1fSPaolo Bonzini uint32_t pi_addr_hi; 58047b43a1fSPaolo Bonzini uint32_t ci_addr_lo; 58147b43a1fSPaolo Bonzini uint32_t ci_addr_hi; 58247b43a1fSPaolo Bonzini } QEMU_PACKED; 58347b43a1fSPaolo Bonzini 58447b43a1fSPaolo Bonzini /* Controller properties */ 58547b43a1fSPaolo Bonzini struct mfi_ctrl_props { 58647b43a1fSPaolo Bonzini uint16_t seq_num; 58747b43a1fSPaolo Bonzini uint16_t pred_fail_poll_interval; 58847b43a1fSPaolo Bonzini uint16_t intr_throttle_cnt; 58947b43a1fSPaolo Bonzini uint16_t intr_throttle_timeout; 59047b43a1fSPaolo Bonzini uint8_t rebuild_rate; 59147b43a1fSPaolo Bonzini uint8_t patrol_read_rate; 59247b43a1fSPaolo Bonzini uint8_t bgi_rate; 59347b43a1fSPaolo Bonzini uint8_t cc_rate; 59447b43a1fSPaolo Bonzini uint8_t recon_rate; 59547b43a1fSPaolo Bonzini uint8_t cache_flush_interval; 59647b43a1fSPaolo Bonzini uint8_t spinup_drv_cnt; 59747b43a1fSPaolo Bonzini uint8_t spinup_delay; 59847b43a1fSPaolo Bonzini uint8_t cluster_enable; 59947b43a1fSPaolo Bonzini uint8_t coercion_mode; 60047b43a1fSPaolo Bonzini uint8_t alarm_enable; 60147b43a1fSPaolo Bonzini uint8_t disable_auto_rebuild; 60247b43a1fSPaolo Bonzini uint8_t disable_battery_warn; 60347b43a1fSPaolo Bonzini uint8_t ecc_bucket_size; 60447b43a1fSPaolo Bonzini uint16_t ecc_bucket_leak_rate; 60547b43a1fSPaolo Bonzini uint8_t restore_hotspare_on_insertion; 60647b43a1fSPaolo Bonzini uint8_t expose_encl_devices; 60747b43a1fSPaolo Bonzini uint8_t maintainPdFailHistory; 60847b43a1fSPaolo Bonzini uint8_t disallowHostRequestReordering; 60947b43a1fSPaolo Bonzini uint8_t abortCCOnError; 61047b43a1fSPaolo Bonzini uint8_t loadBalanceMode; 61147b43a1fSPaolo Bonzini uint8_t disableAutoDetectBackplane; 61247b43a1fSPaolo Bonzini uint8_t snapVDSpace; 61347b43a1fSPaolo Bonzini uint32_t OnOffProperties; 61447b43a1fSPaolo Bonzini /* set TRUE to disable copyBack (0=copyback enabled) */ 61547b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_CopyBackDisabled (1 << 0) 61647b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_SMARTerEnabled (1 << 1) 61747b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_PRCorrectUnconfiguredAreas (1 << 2) 61847b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_UseFdeOnly (1 << 3) 61947b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_DisableNCQ (1 << 4) 62047b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_SSDSMARTerEnabled (1 << 5) 62147b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_SSDPatrolReadEnabled (1 << 6) 62247b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_EnableSpinDownUnconfigured (1 << 7) 62347b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_AutoEnhancedImport (1 << 8) 62447b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_EnableSecretKeyControl (1 << 9) 62547b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_DisableOnlineCtrlReset (1 << 10) 62647b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_AllowBootWithPinnedCache (1 << 11) 62747b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_DisableSpinDownHS (1 << 12) 62847b43a1fSPaolo Bonzini #define MFI_CTRL_PROP_EnableJBOD (1 << 13) 62947b43a1fSPaolo Bonzini 63047b43a1fSPaolo Bonzini uint8_t autoSnapVDSpace; /* % of source LD to be 63147b43a1fSPaolo Bonzini * reserved for auto snapshot 63247b43a1fSPaolo Bonzini * in snapshot repository, for 63347b43a1fSPaolo Bonzini * metadata and user data 63447b43a1fSPaolo Bonzini * 1=5%, 2=10%, 3=15% and so on 63547b43a1fSPaolo Bonzini */ 6369323e79fSPeter Maydell uint8_t viewSpace; /* snapshot writable VIEWs 63747b43a1fSPaolo Bonzini * capacity as a % of source LD 63847b43a1fSPaolo Bonzini * capacity. 0=READ only 63947b43a1fSPaolo Bonzini * 1=5%, 2=10%, 3=15% and so on 64047b43a1fSPaolo Bonzini */ 64147b43a1fSPaolo Bonzini uint16_t spinDownTime; /* # of idle minutes before device 64247b43a1fSPaolo Bonzini * is spun down (0=use FW defaults) 64347b43a1fSPaolo Bonzini */ 64447b43a1fSPaolo Bonzini uint8_t reserved[24]; 64547b43a1fSPaolo Bonzini } QEMU_PACKED; 64647b43a1fSPaolo Bonzini 64747b43a1fSPaolo Bonzini /* PCI information about the card. */ 64847b43a1fSPaolo Bonzini struct mfi_info_pci { 64947b43a1fSPaolo Bonzini uint16_t vendor; 65047b43a1fSPaolo Bonzini uint16_t device; 65147b43a1fSPaolo Bonzini uint16_t subvendor; 65247b43a1fSPaolo Bonzini uint16_t subdevice; 65347b43a1fSPaolo Bonzini uint8_t reserved[24]; 65447b43a1fSPaolo Bonzini } QEMU_PACKED; 65547b43a1fSPaolo Bonzini 65647b43a1fSPaolo Bonzini /* Host (front end) interface information */ 65747b43a1fSPaolo Bonzini struct mfi_info_host { 65847b43a1fSPaolo Bonzini uint8_t type; 65947b43a1fSPaolo Bonzini #define MFI_INFO_HOST_PCIX 0x01 66047b43a1fSPaolo Bonzini #define MFI_INFO_HOST_PCIE 0x02 66147b43a1fSPaolo Bonzini #define MFI_INFO_HOST_ISCSI 0x04 66247b43a1fSPaolo Bonzini #define MFI_INFO_HOST_SAS3G 0x08 66347b43a1fSPaolo Bonzini uint8_t reserved[6]; 66447b43a1fSPaolo Bonzini uint8_t port_count; 66547b43a1fSPaolo Bonzini uint64_t port_addr[8]; 66647b43a1fSPaolo Bonzini } QEMU_PACKED; 66747b43a1fSPaolo Bonzini 66847b43a1fSPaolo Bonzini /* Device (back end) interface information */ 66947b43a1fSPaolo Bonzini struct mfi_info_device { 67047b43a1fSPaolo Bonzini uint8_t type; 67147b43a1fSPaolo Bonzini #define MFI_INFO_DEV_SPI 0x01 67247b43a1fSPaolo Bonzini #define MFI_INFO_DEV_SAS3G 0x02 67347b43a1fSPaolo Bonzini #define MFI_INFO_DEV_SATA1 0x04 67447b43a1fSPaolo Bonzini #define MFI_INFO_DEV_SATA3G 0x08 67547b43a1fSPaolo Bonzini #define MFI_INFO_DEV_PCIE 0x10 67647b43a1fSPaolo Bonzini uint8_t reserved[6]; 67747b43a1fSPaolo Bonzini uint8_t port_count; 67847b43a1fSPaolo Bonzini uint64_t port_addr[8]; 67947b43a1fSPaolo Bonzini } QEMU_PACKED; 68047b43a1fSPaolo Bonzini 68147b43a1fSPaolo Bonzini /* Firmware component information */ 68247b43a1fSPaolo Bonzini struct mfi_info_component { 68347b43a1fSPaolo Bonzini char name[8]; 68447b43a1fSPaolo Bonzini char version[32]; 68547b43a1fSPaolo Bonzini char build_date[16]; 68647b43a1fSPaolo Bonzini char build_time[16]; 68747b43a1fSPaolo Bonzini } QEMU_PACKED; 68847b43a1fSPaolo Bonzini 68947b43a1fSPaolo Bonzini /* Controller default settings */ 69047b43a1fSPaolo Bonzini struct mfi_defaults { 69147b43a1fSPaolo Bonzini uint64_t sas_addr; 69247b43a1fSPaolo Bonzini uint8_t phy_polarity; 69347b43a1fSPaolo Bonzini uint8_t background_rate; 69447b43a1fSPaolo Bonzini uint8_t stripe_size; 69547b43a1fSPaolo Bonzini uint8_t flush_time; 69647b43a1fSPaolo Bonzini uint8_t write_back; 69747b43a1fSPaolo Bonzini uint8_t read_ahead; 69847b43a1fSPaolo Bonzini uint8_t cache_when_bbu_bad; 69947b43a1fSPaolo Bonzini uint8_t cached_io; 70047b43a1fSPaolo Bonzini uint8_t smart_mode; 70147b43a1fSPaolo Bonzini uint8_t alarm_disable; 70247b43a1fSPaolo Bonzini uint8_t coercion; 70347b43a1fSPaolo Bonzini uint8_t zrc_config; 70447b43a1fSPaolo Bonzini uint8_t dirty_led_shows_drive_activity; 70547b43a1fSPaolo Bonzini uint8_t bios_continue_on_error; 70647b43a1fSPaolo Bonzini uint8_t spindown_mode; 70747b43a1fSPaolo Bonzini uint8_t allowed_device_types; 70847b43a1fSPaolo Bonzini uint8_t allow_mix_in_enclosure; 70947b43a1fSPaolo Bonzini uint8_t allow_mix_in_ld; 71047b43a1fSPaolo Bonzini uint8_t allow_sata_in_cluster; 71147b43a1fSPaolo Bonzini uint8_t max_chained_enclosures; 71247b43a1fSPaolo Bonzini uint8_t disable_ctrl_r; 71347b43a1fSPaolo Bonzini uint8_t enable_web_bios; 71447b43a1fSPaolo Bonzini uint8_t phy_polarity_split; 71547b43a1fSPaolo Bonzini uint8_t direct_pd_mapping; 71647b43a1fSPaolo Bonzini uint8_t bios_enumerate_lds; 71747b43a1fSPaolo Bonzini uint8_t restored_hot_spare_on_insertion; 71847b43a1fSPaolo Bonzini uint8_t expose_enclosure_devices; 71947b43a1fSPaolo Bonzini uint8_t maintain_pd_fail_history; 72047b43a1fSPaolo Bonzini uint8_t disable_puncture; 72147b43a1fSPaolo Bonzini uint8_t zero_based_enumeration; 72247b43a1fSPaolo Bonzini uint8_t disable_preboot_cli; 72347b43a1fSPaolo Bonzini uint8_t show_drive_led_on_activity; 72447b43a1fSPaolo Bonzini uint8_t cluster_disable; 72547b43a1fSPaolo Bonzini uint8_t sas_disable; 72647b43a1fSPaolo Bonzini uint8_t auto_detect_backplane; 72747b43a1fSPaolo Bonzini uint8_t fde_only; 72847b43a1fSPaolo Bonzini uint8_t delay_during_post; 72947b43a1fSPaolo Bonzini uint8_t resv[19]; 73047b43a1fSPaolo Bonzini } QEMU_PACKED; 73147b43a1fSPaolo Bonzini 73247b43a1fSPaolo Bonzini /* Controller default settings */ 73347b43a1fSPaolo Bonzini struct mfi_bios_data { 73447b43a1fSPaolo Bonzini uint16_t boot_target_id; 73547b43a1fSPaolo Bonzini uint8_t do_not_int_13; 73647b43a1fSPaolo Bonzini uint8_t continue_on_error; 73747b43a1fSPaolo Bonzini uint8_t verbose; 73847b43a1fSPaolo Bonzini uint8_t geometry; 73947b43a1fSPaolo Bonzini uint8_t expose_all_drives; 74047b43a1fSPaolo Bonzini uint8_t reserved[56]; 74147b43a1fSPaolo Bonzini uint8_t check_sum; 74247b43a1fSPaolo Bonzini } QEMU_PACKED; 74347b43a1fSPaolo Bonzini 74447b43a1fSPaolo Bonzini /* SAS (?) controller info, returned from MFI_DCMD_CTRL_GETINFO. */ 74547b43a1fSPaolo Bonzini struct mfi_ctrl_info { 74647b43a1fSPaolo Bonzini struct mfi_info_pci pci; 74747b43a1fSPaolo Bonzini struct mfi_info_host host; 74847b43a1fSPaolo Bonzini struct mfi_info_device device; 74947b43a1fSPaolo Bonzini 75047b43a1fSPaolo Bonzini /* Firmware components that are present and active. */ 75147b43a1fSPaolo Bonzini uint32_t image_check_word; 75247b43a1fSPaolo Bonzini uint32_t image_component_count; 75347b43a1fSPaolo Bonzini struct mfi_info_component image_component[8]; 75447b43a1fSPaolo Bonzini 75547b43a1fSPaolo Bonzini /* Firmware components that have been flashed but are inactive */ 75647b43a1fSPaolo Bonzini uint32_t pending_image_component_count; 75747b43a1fSPaolo Bonzini struct mfi_info_component pending_image_component[8]; 75847b43a1fSPaolo Bonzini 75947b43a1fSPaolo Bonzini uint8_t max_arms; 76047b43a1fSPaolo Bonzini uint8_t max_spans; 76147b43a1fSPaolo Bonzini uint8_t max_arrays; 76247b43a1fSPaolo Bonzini uint8_t max_lds; 76347b43a1fSPaolo Bonzini char product_name[80]; 76447b43a1fSPaolo Bonzini char serial_number[32]; 76547b43a1fSPaolo Bonzini uint32_t hw_present; 76647b43a1fSPaolo Bonzini #define MFI_INFO_HW_BBU 0x01 76747b43a1fSPaolo Bonzini #define MFI_INFO_HW_ALARM 0x02 76847b43a1fSPaolo Bonzini #define MFI_INFO_HW_NVRAM 0x04 76947b43a1fSPaolo Bonzini #define MFI_INFO_HW_UART 0x08 77047b43a1fSPaolo Bonzini #define MFI_INFO_HW_MEM 0x10 77147b43a1fSPaolo Bonzini #define MFI_INFO_HW_FLASH 0x20 77247b43a1fSPaolo Bonzini uint32_t current_fw_time; 77347b43a1fSPaolo Bonzini uint16_t max_cmds; 77447b43a1fSPaolo Bonzini uint16_t max_sg_elements; 77547b43a1fSPaolo Bonzini uint32_t max_request_size; 77647b43a1fSPaolo Bonzini uint16_t lds_present; 77747b43a1fSPaolo Bonzini uint16_t lds_degraded; 77847b43a1fSPaolo Bonzini uint16_t lds_offline; 77947b43a1fSPaolo Bonzini uint16_t pd_present; 78047b43a1fSPaolo Bonzini uint16_t pd_disks_present; 78147b43a1fSPaolo Bonzini uint16_t pd_disks_pred_failure; 78247b43a1fSPaolo Bonzini uint16_t pd_disks_failed; 78347b43a1fSPaolo Bonzini uint16_t nvram_size; 78447b43a1fSPaolo Bonzini uint16_t memory_size; 78547b43a1fSPaolo Bonzini uint16_t flash_size; 78647b43a1fSPaolo Bonzini uint16_t ram_correctable_errors; 78747b43a1fSPaolo Bonzini uint16_t ram_uncorrectable_errors; 78847b43a1fSPaolo Bonzini uint8_t cluster_allowed; 78947b43a1fSPaolo Bonzini uint8_t cluster_active; 79047b43a1fSPaolo Bonzini uint16_t max_strips_per_io; 79147b43a1fSPaolo Bonzini 79247b43a1fSPaolo Bonzini uint32_t raid_levels; 79347b43a1fSPaolo Bonzini #define MFI_INFO_RAID_0 0x01 79447b43a1fSPaolo Bonzini #define MFI_INFO_RAID_1 0x02 79547b43a1fSPaolo Bonzini #define MFI_INFO_RAID_5 0x04 79647b43a1fSPaolo Bonzini #define MFI_INFO_RAID_1E 0x08 79747b43a1fSPaolo Bonzini #define MFI_INFO_RAID_6 0x10 79847b43a1fSPaolo Bonzini 79947b43a1fSPaolo Bonzini uint32_t adapter_ops; 80047b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_RBLD_RATE 0x0001 80147b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_CC_RATE 0x0002 80247b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_BGI_RATE 0x0004 80347b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_RECON_RATE 0x0008 80447b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_PATROL_RATE 0x0010 80547b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_ALARM_CONTROL 0x0020 80647b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_CLUSTER_SUPPORTED 0x0040 80747b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_BBU 0x0080 80847b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_SPANNING_ALLOWED 0x0100 80947b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_DEDICATED_SPARES 0x0200 81047b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_REVERTIBLE_SPARES 0x0400 81147b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_FOREIGN_IMPORT 0x0800 81247b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_SELF_DIAGNOSTIC 0x1000 81347b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_MIXED_ARRAY 0x2000 81447b43a1fSPaolo Bonzini #define MFI_INFO_AOPS_GLOBAL_SPARES 0x4000 81547b43a1fSPaolo Bonzini 81647b43a1fSPaolo Bonzini uint32_t ld_ops; 81747b43a1fSPaolo Bonzini #define MFI_INFO_LDOPS_READ_POLICY 0x01 81847b43a1fSPaolo Bonzini #define MFI_INFO_LDOPS_WRITE_POLICY 0x02 81947b43a1fSPaolo Bonzini #define MFI_INFO_LDOPS_IO_POLICY 0x04 82047b43a1fSPaolo Bonzini #define MFI_INFO_LDOPS_ACCESS_POLICY 0x08 82147b43a1fSPaolo Bonzini #define MFI_INFO_LDOPS_DISK_CACHE_POLICY 0x10 82247b43a1fSPaolo Bonzini 82347b43a1fSPaolo Bonzini struct { 82447b43a1fSPaolo Bonzini uint8_t min; 82547b43a1fSPaolo Bonzini uint8_t max; 82647b43a1fSPaolo Bonzini uint8_t reserved[2]; 82747b43a1fSPaolo Bonzini } QEMU_PACKED stripe_sz_ops; 82847b43a1fSPaolo Bonzini 82947b43a1fSPaolo Bonzini uint32_t pd_ops; 83047b43a1fSPaolo Bonzini #define MFI_INFO_PDOPS_FORCE_ONLINE 0x01 83147b43a1fSPaolo Bonzini #define MFI_INFO_PDOPS_FORCE_OFFLINE 0x02 83247b43a1fSPaolo Bonzini #define MFI_INFO_PDOPS_FORCE_REBUILD 0x04 83347b43a1fSPaolo Bonzini 83447b43a1fSPaolo Bonzini uint32_t pd_mix_support; 83547b43a1fSPaolo Bonzini #define MFI_INFO_PDMIX_SAS 0x01 83647b43a1fSPaolo Bonzini #define MFI_INFO_PDMIX_SATA 0x02 83747b43a1fSPaolo Bonzini #define MFI_INFO_PDMIX_ENCL 0x04 83847b43a1fSPaolo Bonzini #define MFI_INFO_PDMIX_LD 0x08 83947b43a1fSPaolo Bonzini #define MFI_INFO_PDMIX_SATA_CLUSTER 0x10 84047b43a1fSPaolo Bonzini 84147b43a1fSPaolo Bonzini uint8_t ecc_bucket_count; 84247b43a1fSPaolo Bonzini uint8_t reserved2[11]; 84347b43a1fSPaolo Bonzini struct mfi_ctrl_props properties; 84447b43a1fSPaolo Bonzini char package_version[0x60]; 84547b43a1fSPaolo Bonzini uint8_t pad[0x800 - 0x6a0]; 84647b43a1fSPaolo Bonzini } QEMU_PACKED; 84747b43a1fSPaolo Bonzini 84847b43a1fSPaolo Bonzini /* keep track of an event. */ 84947b43a1fSPaolo Bonzini union mfi_evt { 85047b43a1fSPaolo Bonzini struct { 85147b43a1fSPaolo Bonzini uint16_t locale; 85247b43a1fSPaolo Bonzini uint8_t reserved; 85347b43a1fSPaolo Bonzini int8_t class; 85447b43a1fSPaolo Bonzini } members; 85547b43a1fSPaolo Bonzini uint32_t word; 85647b43a1fSPaolo Bonzini } QEMU_PACKED; 85747b43a1fSPaolo Bonzini 85847b43a1fSPaolo Bonzini /* event log state. */ 85947b43a1fSPaolo Bonzini struct mfi_evt_log_state { 86047b43a1fSPaolo Bonzini uint32_t newest_seq_num; 86147b43a1fSPaolo Bonzini uint32_t oldest_seq_num; 86247b43a1fSPaolo Bonzini uint32_t clear_seq_num; 86347b43a1fSPaolo Bonzini uint32_t shutdown_seq_num; 86447b43a1fSPaolo Bonzini uint32_t boot_seq_num; 86547b43a1fSPaolo Bonzini } QEMU_PACKED; 86647b43a1fSPaolo Bonzini 86747b43a1fSPaolo Bonzini struct mfi_progress { 86847b43a1fSPaolo Bonzini uint16_t progress; 86947b43a1fSPaolo Bonzini uint16_t elapsed_seconds; 87047b43a1fSPaolo Bonzini } QEMU_PACKED; 87147b43a1fSPaolo Bonzini 87247b43a1fSPaolo Bonzini struct mfi_evt_ld { 87347b43a1fSPaolo Bonzini uint16_t target_id; 87447b43a1fSPaolo Bonzini uint8_t ld_index; 87547b43a1fSPaolo Bonzini uint8_t reserved; 87647b43a1fSPaolo Bonzini } QEMU_PACKED; 87747b43a1fSPaolo Bonzini 87847b43a1fSPaolo Bonzini struct mfi_evt_pd { 87947b43a1fSPaolo Bonzini uint16_t device_id; 88047b43a1fSPaolo Bonzini uint8_t enclosure_index; 88147b43a1fSPaolo Bonzini uint8_t slot_number; 88247b43a1fSPaolo Bonzini } QEMU_PACKED; 88347b43a1fSPaolo Bonzini 88447b43a1fSPaolo Bonzini /* event detail, returned from MFI_DCMD_CTRL_EVENT_WAIT. */ 88547b43a1fSPaolo Bonzini struct mfi_evt_detail { 88647b43a1fSPaolo Bonzini uint32_t seq; 88747b43a1fSPaolo Bonzini uint32_t time; 88847b43a1fSPaolo Bonzini uint32_t code; 88947b43a1fSPaolo Bonzini union mfi_evt class; 89047b43a1fSPaolo Bonzini uint8_t arg_type; 89147b43a1fSPaolo Bonzini uint8_t reserved1[15]; 89247b43a1fSPaolo Bonzini 89347b43a1fSPaolo Bonzini union { 89447b43a1fSPaolo Bonzini struct { 89547b43a1fSPaolo Bonzini struct mfi_evt_pd pd; 89647b43a1fSPaolo Bonzini uint8_t cdb_len; 89747b43a1fSPaolo Bonzini uint8_t sense_len; 89847b43a1fSPaolo Bonzini uint8_t reserved[2]; 89947b43a1fSPaolo Bonzini uint8_t cdb[16]; 90047b43a1fSPaolo Bonzini uint8_t sense[64]; 90147b43a1fSPaolo Bonzini } cdb_sense; 90247b43a1fSPaolo Bonzini 90347b43a1fSPaolo Bonzini struct mfi_evt_ld ld; 90447b43a1fSPaolo Bonzini 90547b43a1fSPaolo Bonzini struct { 90647b43a1fSPaolo Bonzini struct mfi_evt_ld ld; 90747b43a1fSPaolo Bonzini uint64_t count; 90847b43a1fSPaolo Bonzini } ld_count; 90947b43a1fSPaolo Bonzini 91047b43a1fSPaolo Bonzini struct { 91147b43a1fSPaolo Bonzini uint64_t lba; 91247b43a1fSPaolo Bonzini struct mfi_evt_ld ld; 91347b43a1fSPaolo Bonzini } ld_lba; 91447b43a1fSPaolo Bonzini 91547b43a1fSPaolo Bonzini struct { 91647b43a1fSPaolo Bonzini struct mfi_evt_ld ld; 91747b43a1fSPaolo Bonzini uint32_t pre_owner; 91847b43a1fSPaolo Bonzini uint32_t new_owner; 91947b43a1fSPaolo Bonzini } ld_owner; 92047b43a1fSPaolo Bonzini 92147b43a1fSPaolo Bonzini struct { 92247b43a1fSPaolo Bonzini uint64_t ld_lba; 92347b43a1fSPaolo Bonzini uint64_t pd_lba; 92447b43a1fSPaolo Bonzini struct mfi_evt_ld ld; 92547b43a1fSPaolo Bonzini struct mfi_evt_pd pd; 92647b43a1fSPaolo Bonzini } ld_lba_pd_lba; 92747b43a1fSPaolo Bonzini 92847b43a1fSPaolo Bonzini struct { 92947b43a1fSPaolo Bonzini struct mfi_evt_ld ld; 93047b43a1fSPaolo Bonzini struct mfi_progress prog; 93147b43a1fSPaolo Bonzini } ld_prog; 93247b43a1fSPaolo Bonzini 93347b43a1fSPaolo Bonzini struct { 93447b43a1fSPaolo Bonzini struct mfi_evt_ld ld; 93547b43a1fSPaolo Bonzini uint32_t prev_state; 93647b43a1fSPaolo Bonzini uint32_t new_state; 93747b43a1fSPaolo Bonzini } ld_state; 93847b43a1fSPaolo Bonzini 93947b43a1fSPaolo Bonzini struct { 94047b43a1fSPaolo Bonzini uint64_t strip; 94147b43a1fSPaolo Bonzini struct mfi_evt_ld ld; 94247b43a1fSPaolo Bonzini } ld_strip; 94347b43a1fSPaolo Bonzini 94447b43a1fSPaolo Bonzini struct mfi_evt_pd pd; 94547b43a1fSPaolo Bonzini 94647b43a1fSPaolo Bonzini struct { 94747b43a1fSPaolo Bonzini struct mfi_evt_pd pd; 94847b43a1fSPaolo Bonzini uint32_t err; 94947b43a1fSPaolo Bonzini } pd_err; 95047b43a1fSPaolo Bonzini 95147b43a1fSPaolo Bonzini struct { 95247b43a1fSPaolo Bonzini uint64_t lba; 95347b43a1fSPaolo Bonzini struct mfi_evt_pd pd; 95447b43a1fSPaolo Bonzini } pd_lba; 95547b43a1fSPaolo Bonzini 95647b43a1fSPaolo Bonzini struct { 95747b43a1fSPaolo Bonzini uint64_t lba; 95847b43a1fSPaolo Bonzini struct mfi_evt_pd pd; 95947b43a1fSPaolo Bonzini struct mfi_evt_ld ld; 96047b43a1fSPaolo Bonzini } pd_lba_ld; 96147b43a1fSPaolo Bonzini 96247b43a1fSPaolo Bonzini struct { 96347b43a1fSPaolo Bonzini struct mfi_evt_pd pd; 96447b43a1fSPaolo Bonzini struct mfi_progress prog; 96547b43a1fSPaolo Bonzini } pd_prog; 96647b43a1fSPaolo Bonzini 96747b43a1fSPaolo Bonzini struct { 96847b43a1fSPaolo Bonzini struct mfi_evt_pd ld; 96947b43a1fSPaolo Bonzini uint32_t prev_state; 97047b43a1fSPaolo Bonzini uint32_t new_state; 97147b43a1fSPaolo Bonzini } pd_state; 97247b43a1fSPaolo Bonzini 97347b43a1fSPaolo Bonzini struct { 97447b43a1fSPaolo Bonzini uint16_t venderId; 97547b43a1fSPaolo Bonzini uint16_t deviceId; 97647b43a1fSPaolo Bonzini uint16_t subVenderId; 97747b43a1fSPaolo Bonzini uint16_t subDeviceId; 97847b43a1fSPaolo Bonzini } pci; 97947b43a1fSPaolo Bonzini 98047b43a1fSPaolo Bonzini uint32_t rate; 98147b43a1fSPaolo Bonzini 98247b43a1fSPaolo Bonzini char str[96]; 98347b43a1fSPaolo Bonzini 98447b43a1fSPaolo Bonzini struct { 98547b43a1fSPaolo Bonzini uint32_t rtc; 98647b43a1fSPaolo Bonzini uint16_t elapsedSeconds; 98747b43a1fSPaolo Bonzini } time; 98847b43a1fSPaolo Bonzini 98947b43a1fSPaolo Bonzini struct { 99047b43a1fSPaolo Bonzini uint32_t ecar; 99147b43a1fSPaolo Bonzini uint32_t elog; 99247b43a1fSPaolo Bonzini char str[64]; 99347b43a1fSPaolo Bonzini } ecc; 99447b43a1fSPaolo Bonzini 99547b43a1fSPaolo Bonzini uint8_t b[96]; 99647b43a1fSPaolo Bonzini uint16_t s[48]; 99747b43a1fSPaolo Bonzini uint32_t w[24]; 99847b43a1fSPaolo Bonzini uint64_t d[12]; 99947b43a1fSPaolo Bonzini } args; 100047b43a1fSPaolo Bonzini 100147b43a1fSPaolo Bonzini char description[128]; 100247b43a1fSPaolo Bonzini } QEMU_PACKED; 100347b43a1fSPaolo Bonzini 100447b43a1fSPaolo Bonzini struct mfi_evt_list { 100547b43a1fSPaolo Bonzini uint32_t count; 100647b43a1fSPaolo Bonzini uint32_t reserved; 100747b43a1fSPaolo Bonzini struct mfi_evt_detail event[1]; 100847b43a1fSPaolo Bonzini } QEMU_PACKED; 100947b43a1fSPaolo Bonzini 101047b43a1fSPaolo Bonzini union mfi_pd_ref { 101147b43a1fSPaolo Bonzini struct { 101247b43a1fSPaolo Bonzini uint16_t device_id; 101347b43a1fSPaolo Bonzini uint16_t seq_num; 101447b43a1fSPaolo Bonzini } v; 101547b43a1fSPaolo Bonzini uint32_t ref; 101647b43a1fSPaolo Bonzini } QEMU_PACKED; 101747b43a1fSPaolo Bonzini 101847b43a1fSPaolo Bonzini union mfi_pd_ddf_type { 101947b43a1fSPaolo Bonzini struct { 102047b43a1fSPaolo Bonzini uint16_t pd_type; 102147b43a1fSPaolo Bonzini #define MFI_PD_DDF_TYPE_FORCED_PD_GUID (1 << 0) 102247b43a1fSPaolo Bonzini #define MFI_PD_DDF_TYPE_IN_VD (1 << 1) 102347b43a1fSPaolo Bonzini #define MFI_PD_DDF_TYPE_IS_GLOBAL_SPARE (1 << 2) 102447b43a1fSPaolo Bonzini #define MFI_PD_DDF_TYPE_IS_SPARE (1 << 3) 102547b43a1fSPaolo Bonzini #define MFI_PD_DDF_TYPE_IS_FOREIGN (1 << 4) 102647b43a1fSPaolo Bonzini #define MFI_PD_DDF_TYPE_INTF_SPI (1 << 12) 102747b43a1fSPaolo Bonzini #define MFI_PD_DDF_TYPE_INTF_SAS (1 << 13) 102847b43a1fSPaolo Bonzini #define MFI_PD_DDF_TYPE_INTF_SATA1 (1 << 14) 102947b43a1fSPaolo Bonzini #define MFI_PD_DDF_TYPE_INTF_SATA3G (1 << 15) 103047b43a1fSPaolo Bonzini uint16_t reserved; 103147b43a1fSPaolo Bonzini } ddf; 103247b43a1fSPaolo Bonzini struct { 103347b43a1fSPaolo Bonzini uint32_t reserved; 103447b43a1fSPaolo Bonzini } non_disk; 103547b43a1fSPaolo Bonzini uint32_t type; 103647b43a1fSPaolo Bonzini } QEMU_PACKED; 103747b43a1fSPaolo Bonzini 103847b43a1fSPaolo Bonzini struct mfi_pd_progress { 103947b43a1fSPaolo Bonzini uint32_t active; 104047b43a1fSPaolo Bonzini #define PD_PROGRESS_ACTIVE_REBUILD (1 << 0) 104147b43a1fSPaolo Bonzini #define PD_PROGRESS_ACTIVE_PATROL (1 << 1) 104247b43a1fSPaolo Bonzini #define PD_PROGRESS_ACTIVE_CLEAR (1 << 2) 104347b43a1fSPaolo Bonzini struct mfi_progress rbld; 104447b43a1fSPaolo Bonzini struct mfi_progress patrol; 104547b43a1fSPaolo Bonzini struct mfi_progress clear; 104647b43a1fSPaolo Bonzini struct mfi_progress reserved[4]; 104747b43a1fSPaolo Bonzini } QEMU_PACKED; 104847b43a1fSPaolo Bonzini 104947b43a1fSPaolo Bonzini struct mfi_pd_info { 105047b43a1fSPaolo Bonzini union mfi_pd_ref ref; 105147b43a1fSPaolo Bonzini uint8_t inquiry_data[96]; 105247b43a1fSPaolo Bonzini uint8_t vpd_page83[64]; 105347b43a1fSPaolo Bonzini uint8_t not_supported; 105447b43a1fSPaolo Bonzini uint8_t scsi_dev_type; 105547b43a1fSPaolo Bonzini uint8_t connected_port_bitmap; 105647b43a1fSPaolo Bonzini uint8_t device_speed; 105747b43a1fSPaolo Bonzini uint32_t media_err_count; 105847b43a1fSPaolo Bonzini uint32_t other_err_count; 105947b43a1fSPaolo Bonzini uint32_t pred_fail_count; 106047b43a1fSPaolo Bonzini uint32_t last_pred_fail_event_seq_num; 106147b43a1fSPaolo Bonzini uint16_t fw_state; 106247b43a1fSPaolo Bonzini uint8_t disable_for_removal; 106347b43a1fSPaolo Bonzini uint8_t link_speed; 106447b43a1fSPaolo Bonzini union mfi_pd_ddf_type state; 106547b43a1fSPaolo Bonzini struct { 106647b43a1fSPaolo Bonzini uint8_t count; 106747b43a1fSPaolo Bonzini uint8_t is_path_broken; 106847b43a1fSPaolo Bonzini uint8_t reserved[6]; 106947b43a1fSPaolo Bonzini uint64_t sas_addr[4]; 107047b43a1fSPaolo Bonzini } path_info; 107147b43a1fSPaolo Bonzini uint64_t raw_size; 107247b43a1fSPaolo Bonzini uint64_t non_coerced_size; 107347b43a1fSPaolo Bonzini uint64_t coerced_size; 107447b43a1fSPaolo Bonzini uint16_t encl_device_id; 107547b43a1fSPaolo Bonzini uint8_t encl_index; 107647b43a1fSPaolo Bonzini uint8_t slot_number; 107747b43a1fSPaolo Bonzini struct mfi_pd_progress prog_info; 107847b43a1fSPaolo Bonzini uint8_t bad_block_table_full; 107947b43a1fSPaolo Bonzini uint8_t unusable_in_current_config; 108047b43a1fSPaolo Bonzini uint8_t vpd_page83_ext[64]; 108147b43a1fSPaolo Bonzini uint8_t reserved[512-358]; 108247b43a1fSPaolo Bonzini } QEMU_PACKED; 108347b43a1fSPaolo Bonzini 108447b43a1fSPaolo Bonzini struct mfi_pd_address { 108547b43a1fSPaolo Bonzini uint16_t device_id; 108647b43a1fSPaolo Bonzini uint16_t encl_device_id; 108747b43a1fSPaolo Bonzini uint8_t encl_index; 108847b43a1fSPaolo Bonzini uint8_t slot_number; 108947b43a1fSPaolo Bonzini uint8_t scsi_dev_type; 109047b43a1fSPaolo Bonzini uint8_t connect_port_bitmap; 109147b43a1fSPaolo Bonzini uint64_t sas_addr[2]; 109247b43a1fSPaolo Bonzini } QEMU_PACKED; 109347b43a1fSPaolo Bonzini 109447b43a1fSPaolo Bonzini #define MFI_MAX_SYS_PDS 240 109547b43a1fSPaolo Bonzini struct mfi_pd_list { 109647b43a1fSPaolo Bonzini uint32_t size; 109747b43a1fSPaolo Bonzini uint32_t count; 109847b43a1fSPaolo Bonzini struct mfi_pd_address addr[MFI_MAX_SYS_PDS]; 109947b43a1fSPaolo Bonzini } QEMU_PACKED; 110047b43a1fSPaolo Bonzini 110147b43a1fSPaolo Bonzini union mfi_ld_ref { 110247b43a1fSPaolo Bonzini struct { 110347b43a1fSPaolo Bonzini uint8_t target_id; 11043f2cd4ddSHannes Reinecke uint8_t reserved; 110547b43a1fSPaolo Bonzini uint16_t seq; 110647b43a1fSPaolo Bonzini } v; 110747b43a1fSPaolo Bonzini uint32_t ref; 110847b43a1fSPaolo Bonzini } QEMU_PACKED; 110947b43a1fSPaolo Bonzini 111047b43a1fSPaolo Bonzini struct mfi_ld_list { 111147b43a1fSPaolo Bonzini uint32_t ld_count; 111247b43a1fSPaolo Bonzini uint32_t reserved1; 111347b43a1fSPaolo Bonzini struct { 111447b43a1fSPaolo Bonzini union mfi_ld_ref ld; 111547b43a1fSPaolo Bonzini uint8_t state; 111647b43a1fSPaolo Bonzini uint8_t reserved2[3]; 111747b43a1fSPaolo Bonzini uint64_t size; 111847b43a1fSPaolo Bonzini } ld_list[MFI_MAX_LD]; 111947b43a1fSPaolo Bonzini } QEMU_PACKED; 112047b43a1fSPaolo Bonzini 1121d97ae368SHannes Reinecke struct mfi_ld_targetid_list { 1122d97ae368SHannes Reinecke uint32_t size; 1123d97ae368SHannes Reinecke uint32_t ld_count; 1124d97ae368SHannes Reinecke uint8_t pad[3]; 1125d97ae368SHannes Reinecke uint8_t targetid[MFI_MAX_LD]; 1126d97ae368SHannes Reinecke } QEMU_PACKED; 1127d97ae368SHannes Reinecke 112847b43a1fSPaolo Bonzini enum mfi_ld_access { 112947b43a1fSPaolo Bonzini MFI_LD_ACCESS_RW = 0, 113047b43a1fSPaolo Bonzini MFI_LD_ACCSSS_RO = 2, 113147b43a1fSPaolo Bonzini MFI_LD_ACCESS_BLOCKED = 3, 113247b43a1fSPaolo Bonzini }; 113347b43a1fSPaolo Bonzini #define MFI_LD_ACCESS_MASK 3 113447b43a1fSPaolo Bonzini 113547b43a1fSPaolo Bonzini enum mfi_ld_state { 113647b43a1fSPaolo Bonzini MFI_LD_STATE_OFFLINE = 0, 113747b43a1fSPaolo Bonzini MFI_LD_STATE_PARTIALLY_DEGRADED = 1, 113847b43a1fSPaolo Bonzini MFI_LD_STATE_DEGRADED = 2, 113947b43a1fSPaolo Bonzini MFI_LD_STATE_OPTIMAL = 3 114047b43a1fSPaolo Bonzini }; 114147b43a1fSPaolo Bonzini 114247b43a1fSPaolo Bonzini enum mfi_syspd_state { 114347b43a1fSPaolo Bonzini MFI_PD_STATE_UNCONFIGURED_GOOD = 0x00, 114447b43a1fSPaolo Bonzini MFI_PD_STATE_UNCONFIGURED_BAD = 0x01, 114547b43a1fSPaolo Bonzini MFI_PD_STATE_HOT_SPARE = 0x02, 114647b43a1fSPaolo Bonzini MFI_PD_STATE_OFFLINE = 0x10, 114747b43a1fSPaolo Bonzini MFI_PD_STATE_FAILED = 0x11, 114847b43a1fSPaolo Bonzini MFI_PD_STATE_REBUILD = 0x14, 114947b43a1fSPaolo Bonzini MFI_PD_STATE_ONLINE = 0x18, 115047b43a1fSPaolo Bonzini MFI_PD_STATE_COPYBACK = 0x20, 115147b43a1fSPaolo Bonzini MFI_PD_STATE_SYSTEM = 0x40 115247b43a1fSPaolo Bonzini }; 115347b43a1fSPaolo Bonzini 115447b43a1fSPaolo Bonzini struct mfi_ld_props { 115547b43a1fSPaolo Bonzini union mfi_ld_ref ld; 115647b43a1fSPaolo Bonzini char name[16]; 115747b43a1fSPaolo Bonzini uint8_t default_cache_policy; 115847b43a1fSPaolo Bonzini uint8_t access_policy; 115947b43a1fSPaolo Bonzini uint8_t disk_cache_policy; 116047b43a1fSPaolo Bonzini uint8_t current_cache_policy; 116147b43a1fSPaolo Bonzini uint8_t no_bgi; 116247b43a1fSPaolo Bonzini uint8_t reserved[7]; 116347b43a1fSPaolo Bonzini } QEMU_PACKED; 116447b43a1fSPaolo Bonzini 116547b43a1fSPaolo Bonzini struct mfi_ld_params { 116647b43a1fSPaolo Bonzini uint8_t primary_raid_level; 116747b43a1fSPaolo Bonzini uint8_t raid_level_qualifier; 116847b43a1fSPaolo Bonzini uint8_t secondary_raid_level; 116947b43a1fSPaolo Bonzini uint8_t stripe_size; 117047b43a1fSPaolo Bonzini uint8_t num_drives; 117147b43a1fSPaolo Bonzini uint8_t span_depth; 117247b43a1fSPaolo Bonzini uint8_t state; 117347b43a1fSPaolo Bonzini uint8_t init_state; 117447b43a1fSPaolo Bonzini uint8_t is_consistent; 117547b43a1fSPaolo Bonzini uint8_t reserved[23]; 117647b43a1fSPaolo Bonzini } QEMU_PACKED; 117747b43a1fSPaolo Bonzini 117847b43a1fSPaolo Bonzini struct mfi_ld_progress { 117947b43a1fSPaolo Bonzini uint32_t active; 118047b43a1fSPaolo Bonzini #define MFI_LD_PROGRESS_CC (1<<0) 118147b43a1fSPaolo Bonzini #define MFI_LD_PROGRESS_BGI (1<<1) 118247b43a1fSPaolo Bonzini #define MFI_LD_PROGRESS_FGI (1<<2) 118347b43a1fSPaolo Bonzini #define MFI_LD_PORGRESS_RECON (1<<3) 118447b43a1fSPaolo Bonzini struct mfi_progress cc; 118547b43a1fSPaolo Bonzini struct mfi_progress bgi; 118647b43a1fSPaolo Bonzini struct mfi_progress fgi; 118747b43a1fSPaolo Bonzini struct mfi_progress recon; 118847b43a1fSPaolo Bonzini struct mfi_progress reserved[4]; 118947b43a1fSPaolo Bonzini } QEMU_PACKED; 119047b43a1fSPaolo Bonzini 119147b43a1fSPaolo Bonzini struct mfi_span { 119247b43a1fSPaolo Bonzini uint64_t start_block; 119347b43a1fSPaolo Bonzini uint64_t num_blocks; 119447b43a1fSPaolo Bonzini uint16_t array_ref; 119547b43a1fSPaolo Bonzini uint8_t reserved[6]; 119647b43a1fSPaolo Bonzini } QEMU_PACKED; 119747b43a1fSPaolo Bonzini 119847b43a1fSPaolo Bonzini #define MFI_MAX_SPAN_DEPTH 8 119947b43a1fSPaolo Bonzini struct mfi_ld_config { 120047b43a1fSPaolo Bonzini struct mfi_ld_props properties; 120147b43a1fSPaolo Bonzini struct mfi_ld_params params; 120247b43a1fSPaolo Bonzini struct mfi_span span[MFI_MAX_SPAN_DEPTH]; 120347b43a1fSPaolo Bonzini } QEMU_PACKED; 120447b43a1fSPaolo Bonzini 120547b43a1fSPaolo Bonzini struct mfi_ld_info { 120647b43a1fSPaolo Bonzini struct mfi_ld_config ld_config; 120747b43a1fSPaolo Bonzini uint64_t size; 120847b43a1fSPaolo Bonzini struct mfi_ld_progress progress; 120947b43a1fSPaolo Bonzini uint16_t cluster_owner; 121047b43a1fSPaolo Bonzini uint8_t reconstruct_active; 121147b43a1fSPaolo Bonzini uint8_t reserved1[1]; 121247b43a1fSPaolo Bonzini uint8_t vpd_page83[64]; 121347b43a1fSPaolo Bonzini uint8_t reserved2[16]; 121447b43a1fSPaolo Bonzini } QEMU_PACKED; 121547b43a1fSPaolo Bonzini 121647b43a1fSPaolo Bonzini union mfi_spare_type { 121747b43a1fSPaolo Bonzini uint8_t flags; 121847b43a1fSPaolo Bonzini #define MFI_SPARE_IS_DEDICATED (1 << 0) 121947b43a1fSPaolo Bonzini #define MFI_SPARE_IS_REVERTABLE (1 << 1) 122047b43a1fSPaolo Bonzini #define MFI_SPARE_IS_ENCL_AFFINITY (1 << 2) 122147b43a1fSPaolo Bonzini uint8_t type; 122247b43a1fSPaolo Bonzini } QEMU_PACKED; 122347b43a1fSPaolo Bonzini 122447b43a1fSPaolo Bonzini #define MFI_MAX_ARRAYS 16 122547b43a1fSPaolo Bonzini struct mfi_spare { 122647b43a1fSPaolo Bonzini union mfi_pd_ref ref; 122747b43a1fSPaolo Bonzini union mfi_spare_type spare_type; 122847b43a1fSPaolo Bonzini uint8_t reserved[2]; 122947b43a1fSPaolo Bonzini uint8_t array_count; 123047b43a1fSPaolo Bonzini uint16_t array_refd[MFI_MAX_ARRAYS]; 123147b43a1fSPaolo Bonzini } QEMU_PACKED; 123247b43a1fSPaolo Bonzini 123347b43a1fSPaolo Bonzini #define MFI_MAX_ROW_SIZE 32 123447b43a1fSPaolo Bonzini struct mfi_array { 123547b43a1fSPaolo Bonzini uint64_t size; 123647b43a1fSPaolo Bonzini uint8_t num_drives; 123747b43a1fSPaolo Bonzini uint8_t reserved; 123847b43a1fSPaolo Bonzini uint16_t array_ref; 123947b43a1fSPaolo Bonzini uint8_t pad[20]; 124047b43a1fSPaolo Bonzini struct { 124147b43a1fSPaolo Bonzini union mfi_pd_ref ref; 124247b43a1fSPaolo Bonzini uint16_t fw_state; /* enum mfi_syspd_state */ 124347b43a1fSPaolo Bonzini struct { 124447b43a1fSPaolo Bonzini uint8_t pd; 124547b43a1fSPaolo Bonzini uint8_t slot; 124647b43a1fSPaolo Bonzini } encl; 124747b43a1fSPaolo Bonzini } pd[MFI_MAX_ROW_SIZE]; 124847b43a1fSPaolo Bonzini } QEMU_PACKED; 124947b43a1fSPaolo Bonzini 125047b43a1fSPaolo Bonzini struct mfi_config_data { 125147b43a1fSPaolo Bonzini uint32_t size; 125247b43a1fSPaolo Bonzini uint16_t array_count; 125347b43a1fSPaolo Bonzini uint16_t array_size; 125447b43a1fSPaolo Bonzini uint16_t log_drv_count; 125547b43a1fSPaolo Bonzini uint16_t log_drv_size; 125647b43a1fSPaolo Bonzini uint16_t spares_count; 125747b43a1fSPaolo Bonzini uint16_t spares_size; 125847b43a1fSPaolo Bonzini uint8_t reserved[16]; 125947b43a1fSPaolo Bonzini /* 126047b43a1fSPaolo Bonzini struct mfi_array array[]; 126147b43a1fSPaolo Bonzini struct mfi_ld_config ld[]; 126247b43a1fSPaolo Bonzini struct mfi_spare spare[]; 126347b43a1fSPaolo Bonzini */ 126447b43a1fSPaolo Bonzini } QEMU_PACKED; 126547b43a1fSPaolo Bonzini 126647b43a1fSPaolo Bonzini #define MFI_SCSI_MAX_TARGETS 128 126747b43a1fSPaolo Bonzini #define MFI_SCSI_MAX_LUNS 8 126847b43a1fSPaolo Bonzini #define MFI_SCSI_INITIATOR_ID 255 126947b43a1fSPaolo Bonzini #define MFI_SCSI_MAX_CMDS 8 127047b43a1fSPaolo Bonzini #define MFI_SCSI_MAX_CDB_LEN 16 127147b43a1fSPaolo Bonzini 1272121d0712SMarkus Armbruster #endif /* SCSI_MFI_H */ 1273