mfi.h 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249
  1. /*
  2. * NetBSD header file, copied from
  3. * http://gitorious.org/freebsd/freebsd/blobs/HEAD/sys/dev/mfi/mfireg.h
  4. */
  5. /*-
  6. * Copyright (c) 2006 IronPort Systems
  7. * Copyright (c) 2007 LSI Corp.
  8. * Copyright (c) 2007 Rajesh Prabhakaran.
  9. * All rights reserved.
  10. *
  11. * Redistribution and use in source and binary forms, with or without
  12. * modification, are permitted provided that the following conditions
  13. * are met:
  14. * 1. Redistributions of source code must retain the above copyright
  15. * notice, this list of conditions and the following disclaimer.
  16. * 2. Redistributions in binary form must reproduce the above copyright
  17. * notice, this list of conditions and the following disclaimer in the
  18. * documentation and/or other materials provided with the distribution.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  21. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  24. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  26. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30. * SUCH DAMAGE.
  31. */
  32. #ifndef MFI_REG_H
  33. #define MFI_REG_H
  34. /*
  35. * MegaRAID SAS MFI firmware definitions
  36. */
  37. /*
  38. * Start with the register set. All registers are 32 bits wide.
  39. * The usual Intel IOP style setup.
  40. */
  41. #define MFI_IMSG0 0x10 /* Inbound message 0 */
  42. #define MFI_IMSG1 0x14 /* Inbound message 1 */
  43. #define MFI_OMSG0 0x18 /* Outbound message 0 */
  44. #define MFI_OMSG1 0x1c /* Outbound message 1 */
  45. #define MFI_IDB 0x20 /* Inbound doorbell */
  46. #define MFI_ISTS 0x24 /* Inbound interrupt status */
  47. #define MFI_IMSK 0x28 /* Inbound interrupt mask */
  48. #define MFI_ODB 0x2c /* Outbound doorbell */
  49. #define MFI_OSTS 0x30 /* Outbound interrupt status */
  50. #define MFI_OMSK 0x34 /* Outbound interrupt mask */
  51. #define MFI_IQP 0x40 /* Inbound queue port */
  52. #define MFI_OQP 0x44 /* Outbound queue port */
  53. /*
  54. * 1078 specific related register
  55. */
  56. #define MFI_ODR0 0x9c /* outbound doorbell register0 */
  57. #define MFI_ODCR0 0xa0 /* outbound doorbell clear register0 */
  58. #define MFI_OSP0 0xb0 /* outbound scratch pad0 */
  59. #define MFI_IQPL 0xc0 /* Inbound queue port (low bytes) */
  60. #define MFI_IQPH 0xc4 /* Inbound queue port (high bytes) */
  61. #define MFI_DIAG 0xf8 /* Host diag */
  62. #define MFI_SEQ 0xfc /* Sequencer offset */
  63. #define MFI_1078_EIM 0x80000004 /* 1078 enable intrrupt mask */
  64. #define MFI_RMI 0x2 /* reply message interrupt */
  65. #define MFI_1078_RM 0x80000000 /* reply 1078 message interrupt */
  66. #define MFI_ODC 0x4 /* outbound doorbell change interrupt */
  67. /*
  68. * gen2 specific changes
  69. */
  70. #define MFI_GEN2_EIM 0x00000005 /* gen2 enable interrupt mask */
  71. #define MFI_GEN2_RM 0x00000001 /* reply gen2 message interrupt */
  72. /*
  73. * skinny specific changes
  74. */
  75. #define MFI_SKINNY_IDB 0x00 /* Inbound doorbell is at 0x00 for skinny */
  76. #define MFI_SKINNY_RM 0x00000001 /* reply skinny message interrupt */
  77. /* Bits for MFI_OSTS */
  78. #define MFI_OSTS_INTR_VALID 0x00000002
  79. /*
  80. * Firmware state values. Found in OMSG0 during initialization.
  81. */
  82. #define MFI_FWSTATE_MASK 0xf0000000
  83. #define MFI_FWSTATE_UNDEFINED 0x00000000
  84. #define MFI_FWSTATE_BB_INIT 0x10000000
  85. #define MFI_FWSTATE_FW_INIT 0x40000000
  86. #define MFI_FWSTATE_WAIT_HANDSHAKE 0x60000000
  87. #define MFI_FWSTATE_FW_INIT_2 0x70000000
  88. #define MFI_FWSTATE_DEVICE_SCAN 0x80000000
  89. #define MFI_FWSTATE_BOOT_MSG_PENDING 0x90000000
  90. #define MFI_FWSTATE_FLUSH_CACHE 0xa0000000
  91. #define MFI_FWSTATE_READY 0xb0000000
  92. #define MFI_FWSTATE_OPERATIONAL 0xc0000000
  93. #define MFI_FWSTATE_FAULT 0xf0000000
  94. #define MFI_FWSTATE_MAXSGL_MASK 0x00ff0000
  95. #define MFI_FWSTATE_MAXCMD_MASK 0x0000ffff
  96. #define MFI_FWSTATE_MSIX_SUPPORTED 0x04000000
  97. #define MFI_FWSTATE_HOSTMEMREQD_MASK 0x08000000
  98. /*
  99. * Control bits to drive the card to ready state. These go into the IDB
  100. * register.
  101. */
  102. #define MFI_FWINIT_ABORT 0x00000001 /* Abort all pending commands */
  103. #define MFI_FWINIT_READY 0x00000002 /* Move from operational to ready */
  104. #define MFI_FWINIT_MFIMODE 0x00000004 /* unknown */
  105. #define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */
  106. #define MFI_FWINIT_HOTPLUG 0x00000010
  107. #define MFI_FWINIT_STOP_ADP 0x00000020 /* Move to operational, stop */
  108. #define MFI_FWINIT_ADP_RESET 0x00000040 /* Reset ADP */
  109. /* MFI Commands */
  110. typedef enum {
  111. MFI_CMD_INIT = 0x00,
  112. MFI_CMD_LD_READ,
  113. MFI_CMD_LD_WRITE,
  114. MFI_CMD_LD_SCSI_IO,
  115. MFI_CMD_PD_SCSI_IO,
  116. MFI_CMD_DCMD,
  117. MFI_CMD_ABORT,
  118. MFI_CMD_SMP,
  119. MFI_CMD_STP
  120. } mfi_cmd_t;
  121. /* Direct commands */
  122. typedef enum {
  123. MFI_DCMD_CTRL_MFI_HOST_MEM_ALLOC = 0x0100e100,
  124. MFI_DCMD_CTRL_GET_INFO = 0x01010000,
  125. MFI_DCMD_CTRL_GET_PROPERTIES = 0x01020100,
  126. MFI_DCMD_CTRL_SET_PROPERTIES = 0x01020200,
  127. MFI_DCMD_CTRL_ALARM = 0x01030000,
  128. MFI_DCMD_CTRL_ALARM_GET = 0x01030100,
  129. MFI_DCMD_CTRL_ALARM_ENABLE = 0x01030200,
  130. MFI_DCMD_CTRL_ALARM_DISABLE = 0x01030300,
  131. MFI_DCMD_CTRL_ALARM_SILENCE = 0x01030400,
  132. MFI_DCMD_CTRL_ALARM_TEST = 0x01030500,
  133. MFI_DCMD_CTRL_EVENT_GETINFO = 0x01040100,
  134. MFI_DCMD_CTRL_EVENT_CLEAR = 0x01040200,
  135. MFI_DCMD_CTRL_EVENT_GET = 0x01040300,
  136. MFI_DCMD_CTRL_EVENT_COUNT = 0x01040400,
  137. MFI_DCMD_CTRL_EVENT_WAIT = 0x01040500,
  138. MFI_DCMD_CTRL_SHUTDOWN = 0x01050000,
  139. MFI_DCMD_HIBERNATE_STANDBY = 0x01060000,
  140. MFI_DCMD_CTRL_GET_TIME = 0x01080101,
  141. MFI_DCMD_CTRL_SET_TIME = 0x01080102,
  142. MFI_DCMD_CTRL_BIOS_DATA_GET = 0x010c0100,
  143. MFI_DCMD_CTRL_BIOS_DATA_SET = 0x010c0200,
  144. MFI_DCMD_CTRL_FACTORY_DEFAULTS = 0x010d0000,
  145. MFI_DCMD_CTRL_MFC_DEFAULTS_GET = 0x010e0201,
  146. MFI_DCMD_CTRL_MFC_DEFAULTS_SET = 0x010e0202,
  147. MFI_DCMD_CTRL_CACHE_FLUSH = 0x01101000,
  148. MFI_DCMD_PD_GET_LIST = 0x02010000,
  149. MFI_DCMD_PD_LIST_QUERY = 0x02010100,
  150. MFI_DCMD_PD_GET_INFO = 0x02020000,
  151. MFI_DCMD_PD_STATE_SET = 0x02030100,
  152. MFI_DCMD_PD_REBUILD = 0x02040100,
  153. MFI_DCMD_PD_BLINK = 0x02070100,
  154. MFI_DCMD_PD_UNBLINK = 0x02070200,
  155. MFI_DCMD_LD_GET_LIST = 0x03010000,
  156. MFI_DCMD_LD_GET_INFO = 0x03020000,
  157. MFI_DCMD_LD_GET_PROP = 0x03030000,
  158. MFI_DCMD_LD_SET_PROP = 0x03040000,
  159. MFI_DCMD_LD_DELETE = 0x03090000,
  160. MFI_DCMD_CFG_READ = 0x04010000,
  161. MFI_DCMD_CFG_ADD = 0x04020000,
  162. MFI_DCMD_CFG_CLEAR = 0x04030000,
  163. MFI_DCMD_CFG_FOREIGN_READ = 0x04060100,
  164. MFI_DCMD_CFG_FOREIGN_IMPORT = 0x04060400,
  165. MFI_DCMD_BBU_STATUS = 0x05010000,
  166. MFI_DCMD_BBU_CAPACITY_INFO = 0x05020000,
  167. MFI_DCMD_BBU_DESIGN_INFO = 0x05030000,
  168. MFI_DCMD_BBU_PROP_GET = 0x05050100,
  169. MFI_DCMD_CLUSTER = 0x08000000,
  170. MFI_DCMD_CLUSTER_RESET_ALL = 0x08010100,
  171. MFI_DCMD_CLUSTER_RESET_LD = 0x08010200
  172. } mfi_dcmd_t;
  173. /* Modifiers for MFI_DCMD_CTRL_FLUSHCACHE */
  174. #define MFI_FLUSHCACHE_CTRL 0x01
  175. #define MFI_FLUSHCACHE_DISK 0x02
  176. /* Modifiers for MFI_DCMD_CTRL_SHUTDOWN */
  177. #define MFI_SHUTDOWN_SPINDOWN 0x01
  178. /*
  179. * MFI Frame flags
  180. */
  181. typedef enum {
  182. MFI_FRAME_DONT_POST_IN_REPLY_QUEUE = 0x0001,
  183. MFI_FRAME_SGL64 = 0x0002,
  184. MFI_FRAME_SENSE64 = 0x0004,
  185. MFI_FRAME_DIR_WRITE = 0x0008,
  186. MFI_FRAME_DIR_READ = 0x0010,
  187. MFI_FRAME_IEEE_SGL = 0x0020,
  188. } mfi_frame_flags;
  189. /* MFI Status codes */
  190. typedef enum {
  191. MFI_STAT_OK = 0x00,
  192. MFI_STAT_INVALID_CMD,
  193. MFI_STAT_INVALID_DCMD,
  194. MFI_STAT_INVALID_PARAMETER,
  195. MFI_STAT_INVALID_SEQUENCE_NUMBER,
  196. MFI_STAT_ABORT_NOT_POSSIBLE,
  197. MFI_STAT_APP_HOST_CODE_NOT_FOUND,
  198. MFI_STAT_APP_IN_USE,
  199. MFI_STAT_APP_NOT_INITIALIZED,
  200. MFI_STAT_ARRAY_INDEX_INVALID,
  201. MFI_STAT_ARRAY_ROW_NOT_EMPTY,
  202. MFI_STAT_CONFIG_RESOURCE_CONFLICT,
  203. MFI_STAT_DEVICE_NOT_FOUND,
  204. MFI_STAT_DRIVE_TOO_SMALL,
  205. MFI_STAT_FLASH_ALLOC_FAIL,
  206. MFI_STAT_FLASH_BUSY,
  207. MFI_STAT_FLASH_ERROR = 0x10,
  208. MFI_STAT_FLASH_IMAGE_BAD,
  209. MFI_STAT_FLASH_IMAGE_INCOMPLETE,
  210. MFI_STAT_FLASH_NOT_OPEN,
  211. MFI_STAT_FLASH_NOT_STARTED,
  212. MFI_STAT_FLUSH_FAILED,
  213. MFI_STAT_HOST_CODE_NOT_FOUNT,
  214. MFI_STAT_LD_CC_IN_PROGRESS,
  215. MFI_STAT_LD_INIT_IN_PROGRESS,
  216. MFI_STAT_LD_LBA_OUT_OF_RANGE,
  217. MFI_STAT_LD_MAX_CONFIGURED,
  218. MFI_STAT_LD_NOT_OPTIMAL,
  219. MFI_STAT_LD_RBLD_IN_PROGRESS,
  220. MFI_STAT_LD_RECON_IN_PROGRESS,
  221. MFI_STAT_LD_WRONG_RAID_LEVEL,
  222. MFI_STAT_MAX_SPARES_EXCEEDED,
  223. MFI_STAT_MEMORY_NOT_AVAILABLE = 0x20,
  224. MFI_STAT_MFC_HW_ERROR,
  225. MFI_STAT_NO_HW_PRESENT,
  226. MFI_STAT_NOT_FOUND,
  227. MFI_STAT_NOT_IN_ENCL,
  228. MFI_STAT_PD_CLEAR_IN_PROGRESS,
  229. MFI_STAT_PD_TYPE_WRONG,
  230. MFI_STAT_PR_DISABLED,
  231. MFI_STAT_ROW_INDEX_INVALID,
  232. MFI_STAT_SAS_CONFIG_INVALID_ACTION,
  233. MFI_STAT_SAS_CONFIG_INVALID_DATA,
  234. MFI_STAT_SAS_CONFIG_INVALID_PAGE,
  235. MFI_STAT_SAS_CONFIG_INVALID_TYPE,
  236. MFI_STAT_SCSI_DONE_WITH_ERROR,
  237. MFI_STAT_SCSI_IO_FAILED,
  238. MFI_STAT_SCSI_RESERVATION_CONFLICT,
  239. MFI_STAT_SHUTDOWN_FAILED = 0x30,
  240. MFI_STAT_TIME_NOT_SET,
  241. MFI_STAT_WRONG_STATE,
  242. MFI_STAT_LD_OFFLINE,
  243. MFI_STAT_PEER_NOTIFICATION_REJECTED,
  244. MFI_STAT_PEER_NOTIFICATION_FAILED,
  245. MFI_STAT_RESERVATION_IN_PROGRESS,
  246. MFI_STAT_I2C_ERRORS_DETECTED,
  247. MFI_STAT_PCI_ERRORS_DETECTED,
  248. MFI_STAT_DIAG_FAILED,
  249. MFI_STAT_BOOT_MSG_PENDING,
  250. MFI_STAT_FOREIGN_CONFIG_INCOMPLETE,
  251. MFI_STAT_INVALID_SGL,
  252. MFI_STAT_UNSUPPORTED_HW,
  253. MFI_STAT_CC_SCHEDULE_DISABLED,
  254. MFI_STAT_PD_COPYBACK_IN_PROGRESS,
  255. MFI_STAT_MULTIPLE_PDS_IN_ARRAY = 0x40,
  256. MFI_STAT_FW_DOWNLOAD_ERROR,
  257. MFI_STAT_FEATURE_SECURITY_NOT_ENABLED,
  258. MFI_STAT_LOCK_KEY_ALREADY_EXISTS,
  259. MFI_STAT_LOCK_KEY_BACKUP_NOT_ALLOWED,
  260. MFI_STAT_LOCK_KEY_VERIFY_NOT_ALLOWED,
  261. MFI_STAT_LOCK_KEY_VERIFY_FAILED,
  262. MFI_STAT_LOCK_KEY_REKEY_NOT_ALLOWED,
  263. MFI_STAT_LOCK_KEY_INVALID,
  264. MFI_STAT_LOCK_KEY_ESCROW_INVALID,
  265. MFI_STAT_LOCK_KEY_BACKUP_REQUIRED,
  266. MFI_STAT_SECURE_LD_EXISTS,
  267. MFI_STAT_LD_SECURE_NOT_ALLOWED,
  268. MFI_STAT_REPROVISION_NOT_ALLOWED,
  269. MFI_STAT_PD_SECURITY_TYPE_WRONG,
  270. MFI_STAT_LD_ENCRYPTION_TYPE_INVALID,
  271. MFI_STAT_CONFIG_FDE_NON_FDE_MIX_NOT_ALLOWED = 0x50,
  272. MFI_STAT_CONFIG_LD_ENCRYPTION_TYPE_MIX_NOT_ALLOWED,
  273. MFI_STAT_SECRET_KEY_NOT_ALLOWED,
  274. MFI_STAT_PD_HW_ERRORS_DETECTED,
  275. MFI_STAT_LD_CACHE_PINNED,
  276. MFI_STAT_POWER_STATE_SET_IN_PROGRESS,
  277. MFI_STAT_POWER_STATE_SET_BUSY,
  278. MFI_STAT_POWER_STATE_WRONG,
  279. MFI_STAT_PR_NO_AVAILABLE_PD_FOUND,
  280. MFI_STAT_CTRL_RESET_REQUIRED,
  281. MFI_STAT_LOCK_KEY_EKM_NO_BOOT_AGENT,
  282. MFI_STAT_SNAP_NO_SPACE,
  283. MFI_STAT_SNAP_PARTIAL_FAILURE,
  284. MFI_STAT_UPGRADE_KEY_INCOMPATIBLE,
  285. MFI_STAT_PFK_INCOMPATIBLE,
  286. MFI_STAT_PD_MAX_UNCONFIGURED,
  287. MFI_STAT_IO_METRICS_DISABLED = 0x60,
  288. MFI_STAT_AEC_NOT_STOPPED,
  289. MFI_STAT_PI_TYPE_WRONG,
  290. MFI_STAT_LD_PD_PI_INCOMPATIBLE,
  291. MFI_STAT_PI_NOT_ENABLED,
  292. MFI_STAT_LD_BLOCK_SIZE_MISMATCH,
  293. MFI_STAT_INVALID_STATUS = 0xFF
  294. } mfi_status_t;
  295. /* Event classes */
  296. typedef enum {
  297. MFI_EVT_CLASS_DEBUG = -2,
  298. MFI_EVT_CLASS_PROGRESS = -1,
  299. MFI_EVT_CLASS_INFO = 0,
  300. MFI_EVT_CLASS_WARNING = 1,
  301. MFI_EVT_CLASS_CRITICAL = 2,
  302. MFI_EVT_CLASS_FATAL = 3,
  303. MFI_EVT_CLASS_DEAD = 4
  304. } mfi_evt_class_t;
  305. /* Event locales */
  306. typedef enum {
  307. MFI_EVT_LOCALE_LD = 0x0001,
  308. MFI_EVT_LOCALE_PD = 0x0002,
  309. MFI_EVT_LOCALE_ENCL = 0x0004,
  310. MFI_EVT_LOCALE_BBU = 0x0008,
  311. MFI_EVT_LOCALE_SAS = 0x0010,
  312. MFI_EVT_LOCALE_CTRL = 0x0020,
  313. MFI_EVT_LOCALE_CONFIG = 0x0040,
  314. MFI_EVT_LOCALE_CLUSTER = 0x0080,
  315. MFI_EVT_LOCALE_ALL = 0xffff
  316. } mfi_evt_locale_t;
  317. /* Event args */
  318. typedef enum {
  319. MR_EVT_ARGS_NONE = 0x00,
  320. MR_EVT_ARGS_CDB_SENSE,
  321. MR_EVT_ARGS_LD,
  322. MR_EVT_ARGS_LD_COUNT,
  323. MR_EVT_ARGS_LD_LBA,
  324. MR_EVT_ARGS_LD_OWNER,
  325. MR_EVT_ARGS_LD_LBA_PD_LBA,
  326. MR_EVT_ARGS_LD_PROG,
  327. MR_EVT_ARGS_LD_STATE,
  328. MR_EVT_ARGS_LD_STRIP,
  329. MR_EVT_ARGS_PD,
  330. MR_EVT_ARGS_PD_ERR,
  331. MR_EVT_ARGS_PD_LBA,
  332. MR_EVT_ARGS_PD_LBA_LD,
  333. MR_EVT_ARGS_PD_PROG,
  334. MR_EVT_ARGS_PD_STATE,
  335. MR_EVT_ARGS_PCI,
  336. MR_EVT_ARGS_RATE,
  337. MR_EVT_ARGS_STR,
  338. MR_EVT_ARGS_TIME,
  339. MR_EVT_ARGS_ECC,
  340. MR_EVT_ARGS_LD_PROP,
  341. MR_EVT_ARGS_PD_SPARE,
  342. MR_EVT_ARGS_PD_INDEX,
  343. MR_EVT_ARGS_DIAG_PASS,
  344. MR_EVT_ARGS_DIAG_FAIL,
  345. MR_EVT_ARGS_PD_LBA_LBA,
  346. MR_EVT_ARGS_PORT_PHY,
  347. MR_EVT_ARGS_PD_MISSING,
  348. MR_EVT_ARGS_PD_ADDRESS,
  349. MR_EVT_ARGS_BITMAP,
  350. MR_EVT_ARGS_CONNECTOR,
  351. MR_EVT_ARGS_PD_PD,
  352. MR_EVT_ARGS_PD_FRU,
  353. MR_EVT_ARGS_PD_PATHINFO,
  354. MR_EVT_ARGS_PD_POWER_STATE,
  355. MR_EVT_ARGS_GENERIC,
  356. } mfi_evt_args;
  357. /* Event codes */
  358. #define MR_EVT_CFG_CLEARED 0x0004
  359. #define MR_EVT_CTRL_SHUTDOWN 0x002a
  360. #define MR_EVT_LD_STATE_CHANGE 0x0051
  361. #define MR_EVT_PD_INSERTED 0x005b
  362. #define MR_EVT_PD_REMOVED 0x0070
  363. #define MR_EVT_PD_STATE_CHANGED 0x0072
  364. #define MR_EVT_LD_CREATED 0x008a
  365. #define MR_EVT_LD_DELETED 0x008b
  366. #define MR_EVT_FOREIGN_CFG_IMPORTED 0x00db
  367. #define MR_EVT_LD_OFFLINE 0x00fc
  368. #define MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED 0x0152
  369. typedef enum {
  370. MR_LD_CACHE_WRITE_BACK = 0x01,
  371. MR_LD_CACHE_WRITE_ADAPTIVE = 0x02,
  372. MR_LD_CACHE_READ_AHEAD = 0x04,
  373. MR_LD_CACHE_READ_ADAPTIVE = 0x08,
  374. MR_LD_CACHE_WRITE_CACHE_BAD_BBU = 0x10,
  375. MR_LD_CACHE_ALLOW_WRITE_CACHE = 0x20,
  376. MR_LD_CACHE_ALLOW_READ_CACHE = 0x40
  377. } mfi_ld_cache;
  378. typedef enum {
  379. MR_PD_CACHE_UNCHANGED = 0,
  380. MR_PD_CACHE_ENABLE = 1,
  381. MR_PD_CACHE_DISABLE = 2
  382. } mfi_pd_cache;
  383. typedef enum {
  384. MR_PD_QUERY_TYPE_ALL = 0,
  385. MR_PD_QUERY_TYPE_STATE = 1,
  386. MR_PD_QUERY_TYPE_POWER_STATE = 2,
  387. MR_PD_QUERY_TYPE_MEDIA_TYPE = 3,
  388. MR_PD_QUERY_TYPE_SPEED = 4,
  389. MR_PD_QUERY_TYPE_EXPOSED_TO_HOST = 5, /*query for system drives */
  390. } mfi_pd_query_type;
  391. /*
  392. * Other propertities and definitions
  393. */
  394. #define MFI_MAX_PD_CHANNELS 2
  395. #define MFI_MAX_LD_CHANNELS 2
  396. #define MFI_MAX_CHANNELS (MFI_MAX_PD_CHANNELS + MFI_MAX_LD_CHANNELS)
  397. #define MFI_MAX_CHANNEL_DEVS 128
  398. #define MFI_DEFAULT_ID -1
  399. #define MFI_MAX_LUN 8
  400. #define MFI_MAX_LD 64
  401. #define MFI_FRAME_SIZE 64
  402. #define MFI_MBOX_SIZE 12
  403. /* Firmware flashing can take 40s */
  404. #define MFI_POLL_TIMEOUT_SECS 50
  405. /* Allow for speedier math calculations */
  406. #define MFI_SECTOR_LEN 512
  407. /* Scatter Gather elements */
  408. struct mfi_sg32 {
  409. uint32_t addr;
  410. uint32_t len;
  411. } QEMU_PACKED;
  412. struct mfi_sg64 {
  413. uint64_t addr;
  414. uint32_t len;
  415. } QEMU_PACKED;
  416. struct mfi_sg_skinny {
  417. uint64_t addr;
  418. uint32_t len;
  419. uint32_t flag;
  420. } QEMU_PACKED;
  421. union mfi_sgl {
  422. struct mfi_sg32 sg32[1];
  423. struct mfi_sg64 sg64[1];
  424. struct mfi_sg_skinny sg_skinny[1];
  425. } QEMU_PACKED;
  426. /* Message frames. All messages have a common header */
  427. struct mfi_frame_header {
  428. uint8_t frame_cmd;
  429. uint8_t sense_len;
  430. uint8_t cmd_status;
  431. uint8_t scsi_status;
  432. uint8_t target_id;
  433. uint8_t lun_id;
  434. uint8_t cdb_len;
  435. uint8_t sge_count;
  436. uint64_t context;
  437. uint16_t flags;
  438. uint16_t timeout;
  439. uint32_t data_len;
  440. } QEMU_PACKED;
  441. struct mfi_init_frame {
  442. struct mfi_frame_header header;
  443. uint32_t qinfo_new_addr_lo;
  444. uint32_t qinfo_new_addr_hi;
  445. uint32_t qinfo_old_addr_lo;
  446. uint32_t qinfo_old_addr_hi;
  447. uint32_t reserved[6];
  448. };
  449. #define MFI_IO_FRAME_SIZE 40
  450. struct mfi_io_frame {
  451. struct mfi_frame_header header;
  452. uint32_t sense_addr_lo;
  453. uint32_t sense_addr_hi;
  454. uint32_t lba_lo;
  455. uint32_t lba_hi;
  456. union mfi_sgl sgl;
  457. } QEMU_PACKED;
  458. #define MFI_PASS_FRAME_SIZE 48
  459. struct mfi_pass_frame {
  460. struct mfi_frame_header header;
  461. uint32_t sense_addr_lo;
  462. uint32_t sense_addr_hi;
  463. uint8_t cdb[16];
  464. union mfi_sgl sgl;
  465. } QEMU_PACKED;
  466. #define MFI_DCMD_FRAME_SIZE 40
  467. struct mfi_dcmd_frame {
  468. struct mfi_frame_header header;
  469. uint32_t opcode;
  470. uint8_t mbox[MFI_MBOX_SIZE];
  471. union mfi_sgl sgl;
  472. } QEMU_PACKED;
  473. struct mfi_abort_frame {
  474. struct mfi_frame_header header;
  475. uint64_t abort_context;
  476. uint32_t abort_mfi_addr_lo;
  477. uint32_t abort_mfi_addr_hi;
  478. uint32_t reserved1[6];
  479. } QEMU_PACKED;
  480. struct mfi_smp_frame {
  481. struct mfi_frame_header header;
  482. uint64_t sas_addr;
  483. union {
  484. struct mfi_sg32 sg32[2];
  485. struct mfi_sg64 sg64[2];
  486. } sgl;
  487. } QEMU_PACKED;
  488. struct mfi_stp_frame {
  489. struct mfi_frame_header header;
  490. uint16_t fis[10];
  491. uint32_t stp_flags;
  492. union {
  493. struct mfi_sg32 sg32[2];
  494. struct mfi_sg64 sg64[2];
  495. } sgl;
  496. } QEMU_PACKED;
  497. union mfi_frame {
  498. struct mfi_frame_header header;
  499. struct mfi_init_frame init;
  500. struct mfi_io_frame io;
  501. struct mfi_pass_frame pass;
  502. struct mfi_dcmd_frame dcmd;
  503. struct mfi_abort_frame abort;
  504. struct mfi_smp_frame smp;
  505. struct mfi_stp_frame stp;
  506. uint64_t raw[8];
  507. uint8_t bytes[MFI_FRAME_SIZE];
  508. };
  509. #define MFI_SENSE_LEN 128
  510. struct mfi_sense {
  511. uint8_t data[MFI_SENSE_LEN];
  512. };
  513. #define MFI_QUEUE_FLAG_CONTEXT64 0x00000002
  514. /* The queue init structure that is passed with the init message */
  515. struct mfi_init_qinfo {
  516. uint32_t flags;
  517. uint32_t rq_entries;
  518. uint32_t rq_addr_lo;
  519. uint32_t rq_addr_hi;
  520. uint32_t pi_addr_lo;
  521. uint32_t pi_addr_hi;
  522. uint32_t ci_addr_lo;
  523. uint32_t ci_addr_hi;
  524. } QEMU_PACKED;
  525. /* Controller properties */
  526. struct mfi_ctrl_props {
  527. uint16_t seq_num;
  528. uint16_t pred_fail_poll_interval;
  529. uint16_t intr_throttle_cnt;
  530. uint16_t intr_throttle_timeout;
  531. uint8_t rebuild_rate;
  532. uint8_t patrol_read_rate;
  533. uint8_t bgi_rate;
  534. uint8_t cc_rate;
  535. uint8_t recon_rate;
  536. uint8_t cache_flush_interval;
  537. uint8_t spinup_drv_cnt;
  538. uint8_t spinup_delay;
  539. uint8_t cluster_enable;
  540. uint8_t coercion_mode;
  541. uint8_t alarm_enable;
  542. uint8_t disable_auto_rebuild;
  543. uint8_t disable_battery_warn;
  544. uint8_t ecc_bucket_size;
  545. uint16_t ecc_bucket_leak_rate;
  546. uint8_t restore_hotspare_on_insertion;
  547. uint8_t expose_encl_devices;
  548. uint8_t maintainPdFailHistory;
  549. uint8_t disallowHostRequestReordering;
  550. uint8_t abortCCOnError;
  551. uint8_t loadBalanceMode;
  552. uint8_t disableAutoDetectBackplane;
  553. uint8_t snapVDSpace;
  554. uint32_t OnOffProperties;
  555. /* set TRUE to disable copyBack (0=copyback enabled) */
  556. #define MFI_CTRL_PROP_CopyBackDisabled (1 << 0)
  557. #define MFI_CTRL_PROP_SMARTerEnabled (1 << 1)
  558. #define MFI_CTRL_PROP_PRCorrectUnconfiguredAreas (1 << 2)
  559. #define MFI_CTRL_PROP_UseFdeOnly (1 << 3)
  560. #define MFI_CTRL_PROP_DisableNCQ (1 << 4)
  561. #define MFI_CTRL_PROP_SSDSMARTerEnabled (1 << 5)
  562. #define MFI_CTRL_PROP_SSDPatrolReadEnabled (1 << 6)
  563. #define MFI_CTRL_PROP_EnableSpinDownUnconfigured (1 << 7)
  564. #define MFI_CTRL_PROP_AutoEnhancedImport (1 << 8)
  565. #define MFI_CTRL_PROP_EnableSecretKeyControl (1 << 9)
  566. #define MFI_CTRL_PROP_DisableOnlineCtrlReset (1 << 10)
  567. #define MFI_CTRL_PROP_AllowBootWithPinnedCache (1 << 11)
  568. #define MFI_CTRL_PROP_DisableSpinDownHS (1 << 12)
  569. #define MFI_CTRL_PROP_EnableJBOD (1 << 13)
  570. uint8_t autoSnapVDSpace; /* % of source LD to be
  571. * reserved for auto snapshot
  572. * in snapshot repository, for
  573. * metadata and user data
  574. * 1=5%, 2=10%, 3=15% and so on
  575. */
  576. uint8_t viewSpace; /* snapshot writeable VIEWs
  577. * capacity as a % of source LD
  578. * capacity. 0=READ only
  579. * 1=5%, 2=10%, 3=15% and so on
  580. */
  581. uint16_t spinDownTime; /* # of idle minutes before device
  582. * is spun down (0=use FW defaults)
  583. */
  584. uint8_t reserved[24];
  585. } QEMU_PACKED;
  586. /* PCI information about the card. */
  587. struct mfi_info_pci {
  588. uint16_t vendor;
  589. uint16_t device;
  590. uint16_t subvendor;
  591. uint16_t subdevice;
  592. uint8_t reserved[24];
  593. } QEMU_PACKED;
  594. /* Host (front end) interface information */
  595. struct mfi_info_host {
  596. uint8_t type;
  597. #define MFI_INFO_HOST_PCIX 0x01
  598. #define MFI_INFO_HOST_PCIE 0x02
  599. #define MFI_INFO_HOST_ISCSI 0x04
  600. #define MFI_INFO_HOST_SAS3G 0x08
  601. uint8_t reserved[6];
  602. uint8_t port_count;
  603. uint64_t port_addr[8];
  604. } QEMU_PACKED;
  605. /* Device (back end) interface information */
  606. struct mfi_info_device {
  607. uint8_t type;
  608. #define MFI_INFO_DEV_SPI 0x01
  609. #define MFI_INFO_DEV_SAS3G 0x02
  610. #define MFI_INFO_DEV_SATA1 0x04
  611. #define MFI_INFO_DEV_SATA3G 0x08
  612. #define MFI_INFO_DEV_PCIE 0x10
  613. uint8_t reserved[6];
  614. uint8_t port_count;
  615. uint64_t port_addr[8];
  616. } QEMU_PACKED;
  617. /* Firmware component information */
  618. struct mfi_info_component {
  619. char name[8];
  620. char version[32];
  621. char build_date[16];
  622. char build_time[16];
  623. } QEMU_PACKED;
  624. /* Controller default settings */
  625. struct mfi_defaults {
  626. uint64_t sas_addr;
  627. uint8_t phy_polarity;
  628. uint8_t background_rate;
  629. uint8_t stripe_size;
  630. uint8_t flush_time;
  631. uint8_t write_back;
  632. uint8_t read_ahead;
  633. uint8_t cache_when_bbu_bad;
  634. uint8_t cached_io;
  635. uint8_t smart_mode;
  636. uint8_t alarm_disable;
  637. uint8_t coercion;
  638. uint8_t zrc_config;
  639. uint8_t dirty_led_shows_drive_activity;
  640. uint8_t bios_continue_on_error;
  641. uint8_t spindown_mode;
  642. uint8_t allowed_device_types;
  643. uint8_t allow_mix_in_enclosure;
  644. uint8_t allow_mix_in_ld;
  645. uint8_t allow_sata_in_cluster;
  646. uint8_t max_chained_enclosures;
  647. uint8_t disable_ctrl_r;
  648. uint8_t enable_web_bios;
  649. uint8_t phy_polarity_split;
  650. uint8_t direct_pd_mapping;
  651. uint8_t bios_enumerate_lds;
  652. uint8_t restored_hot_spare_on_insertion;
  653. uint8_t expose_enclosure_devices;
  654. uint8_t maintain_pd_fail_history;
  655. uint8_t disable_puncture;
  656. uint8_t zero_based_enumeration;
  657. uint8_t disable_preboot_cli;
  658. uint8_t show_drive_led_on_activity;
  659. uint8_t cluster_disable;
  660. uint8_t sas_disable;
  661. uint8_t auto_detect_backplane;
  662. uint8_t fde_only;
  663. uint8_t delay_during_post;
  664. uint8_t resv[19];
  665. } QEMU_PACKED;
  666. /* Controller default settings */
  667. struct mfi_bios_data {
  668. uint16_t boot_target_id;
  669. uint8_t do_not_int_13;
  670. uint8_t continue_on_error;
  671. uint8_t verbose;
  672. uint8_t geometry;
  673. uint8_t expose_all_drives;
  674. uint8_t reserved[56];
  675. uint8_t check_sum;
  676. } QEMU_PACKED;
  677. /* SAS (?) controller info, returned from MFI_DCMD_CTRL_GETINFO. */
  678. struct mfi_ctrl_info {
  679. struct mfi_info_pci pci;
  680. struct mfi_info_host host;
  681. struct mfi_info_device device;
  682. /* Firmware components that are present and active. */
  683. uint32_t image_check_word;
  684. uint32_t image_component_count;
  685. struct mfi_info_component image_component[8];
  686. /* Firmware components that have been flashed but are inactive */
  687. uint32_t pending_image_component_count;
  688. struct mfi_info_component pending_image_component[8];
  689. uint8_t max_arms;
  690. uint8_t max_spans;
  691. uint8_t max_arrays;
  692. uint8_t max_lds;
  693. char product_name[80];
  694. char serial_number[32];
  695. uint32_t hw_present;
  696. #define MFI_INFO_HW_BBU 0x01
  697. #define MFI_INFO_HW_ALARM 0x02
  698. #define MFI_INFO_HW_NVRAM 0x04
  699. #define MFI_INFO_HW_UART 0x08
  700. #define MFI_INFO_HW_MEM 0x10
  701. #define MFI_INFO_HW_FLASH 0x20
  702. uint32_t current_fw_time;
  703. uint16_t max_cmds;
  704. uint16_t max_sg_elements;
  705. uint32_t max_request_size;
  706. uint16_t lds_present;
  707. uint16_t lds_degraded;
  708. uint16_t lds_offline;
  709. uint16_t pd_present;
  710. uint16_t pd_disks_present;
  711. uint16_t pd_disks_pred_failure;
  712. uint16_t pd_disks_failed;
  713. uint16_t nvram_size;
  714. uint16_t memory_size;
  715. uint16_t flash_size;
  716. uint16_t ram_correctable_errors;
  717. uint16_t ram_uncorrectable_errors;
  718. uint8_t cluster_allowed;
  719. uint8_t cluster_active;
  720. uint16_t max_strips_per_io;
  721. uint32_t raid_levels;
  722. #define MFI_INFO_RAID_0 0x01
  723. #define MFI_INFO_RAID_1 0x02
  724. #define MFI_INFO_RAID_5 0x04
  725. #define MFI_INFO_RAID_1E 0x08
  726. #define MFI_INFO_RAID_6 0x10
  727. uint32_t adapter_ops;
  728. #define MFI_INFO_AOPS_RBLD_RATE 0x0001
  729. #define MFI_INFO_AOPS_CC_RATE 0x0002
  730. #define MFI_INFO_AOPS_BGI_RATE 0x0004
  731. #define MFI_INFO_AOPS_RECON_RATE 0x0008
  732. #define MFI_INFO_AOPS_PATROL_RATE 0x0010
  733. #define MFI_INFO_AOPS_ALARM_CONTROL 0x0020
  734. #define MFI_INFO_AOPS_CLUSTER_SUPPORTED 0x0040
  735. #define MFI_INFO_AOPS_BBU 0x0080
  736. #define MFI_INFO_AOPS_SPANNING_ALLOWED 0x0100
  737. #define MFI_INFO_AOPS_DEDICATED_SPARES 0x0200
  738. #define MFI_INFO_AOPS_REVERTIBLE_SPARES 0x0400
  739. #define MFI_INFO_AOPS_FOREIGN_IMPORT 0x0800
  740. #define MFI_INFO_AOPS_SELF_DIAGNOSTIC 0x1000
  741. #define MFI_INFO_AOPS_MIXED_ARRAY 0x2000
  742. #define MFI_INFO_AOPS_GLOBAL_SPARES 0x4000
  743. uint32_t ld_ops;
  744. #define MFI_INFO_LDOPS_READ_POLICY 0x01
  745. #define MFI_INFO_LDOPS_WRITE_POLICY 0x02
  746. #define MFI_INFO_LDOPS_IO_POLICY 0x04
  747. #define MFI_INFO_LDOPS_ACCESS_POLICY 0x08
  748. #define MFI_INFO_LDOPS_DISK_CACHE_POLICY 0x10
  749. struct {
  750. uint8_t min;
  751. uint8_t max;
  752. uint8_t reserved[2];
  753. } QEMU_PACKED stripe_sz_ops;
  754. uint32_t pd_ops;
  755. #define MFI_INFO_PDOPS_FORCE_ONLINE 0x01
  756. #define MFI_INFO_PDOPS_FORCE_OFFLINE 0x02
  757. #define MFI_INFO_PDOPS_FORCE_REBUILD 0x04
  758. uint32_t pd_mix_support;
  759. #define MFI_INFO_PDMIX_SAS 0x01
  760. #define MFI_INFO_PDMIX_SATA 0x02
  761. #define MFI_INFO_PDMIX_ENCL 0x04
  762. #define MFI_INFO_PDMIX_LD 0x08
  763. #define MFI_INFO_PDMIX_SATA_CLUSTER 0x10
  764. uint8_t ecc_bucket_count;
  765. uint8_t reserved2[11];
  766. struct mfi_ctrl_props properties;
  767. char package_version[0x60];
  768. uint8_t pad[0x800 - 0x6a0];
  769. } QEMU_PACKED;
  770. /* keep track of an event. */
  771. union mfi_evt {
  772. struct {
  773. uint16_t locale;
  774. uint8_t reserved;
  775. int8_t class;
  776. } members;
  777. uint32_t word;
  778. } QEMU_PACKED;
  779. /* event log state. */
  780. struct mfi_evt_log_state {
  781. uint32_t newest_seq_num;
  782. uint32_t oldest_seq_num;
  783. uint32_t clear_seq_num;
  784. uint32_t shutdown_seq_num;
  785. uint32_t boot_seq_num;
  786. } QEMU_PACKED;
  787. struct mfi_progress {
  788. uint16_t progress;
  789. uint16_t elapsed_seconds;
  790. } QEMU_PACKED;
  791. struct mfi_evt_ld {
  792. uint16_t target_id;
  793. uint8_t ld_index;
  794. uint8_t reserved;
  795. } QEMU_PACKED;
  796. struct mfi_evt_pd {
  797. uint16_t device_id;
  798. uint8_t enclosure_index;
  799. uint8_t slot_number;
  800. } QEMU_PACKED;
  801. /* event detail, returned from MFI_DCMD_CTRL_EVENT_WAIT. */
  802. struct mfi_evt_detail {
  803. uint32_t seq;
  804. uint32_t time;
  805. uint32_t code;
  806. union mfi_evt class;
  807. uint8_t arg_type;
  808. uint8_t reserved1[15];
  809. union {
  810. struct {
  811. struct mfi_evt_pd pd;
  812. uint8_t cdb_len;
  813. uint8_t sense_len;
  814. uint8_t reserved[2];
  815. uint8_t cdb[16];
  816. uint8_t sense[64];
  817. } cdb_sense;
  818. struct mfi_evt_ld ld;
  819. struct {
  820. struct mfi_evt_ld ld;
  821. uint64_t count;
  822. } ld_count;
  823. struct {
  824. uint64_t lba;
  825. struct mfi_evt_ld ld;
  826. } ld_lba;
  827. struct {
  828. struct mfi_evt_ld ld;
  829. uint32_t pre_owner;
  830. uint32_t new_owner;
  831. } ld_owner;
  832. struct {
  833. uint64_t ld_lba;
  834. uint64_t pd_lba;
  835. struct mfi_evt_ld ld;
  836. struct mfi_evt_pd pd;
  837. } ld_lba_pd_lba;
  838. struct {
  839. struct mfi_evt_ld ld;
  840. struct mfi_progress prog;
  841. } ld_prog;
  842. struct {
  843. struct mfi_evt_ld ld;
  844. uint32_t prev_state;
  845. uint32_t new_state;
  846. } ld_state;
  847. struct {
  848. uint64_t strip;
  849. struct mfi_evt_ld ld;
  850. } ld_strip;
  851. struct mfi_evt_pd pd;
  852. struct {
  853. struct mfi_evt_pd pd;
  854. uint32_t err;
  855. } pd_err;
  856. struct {
  857. uint64_t lba;
  858. struct mfi_evt_pd pd;
  859. } pd_lba;
  860. struct {
  861. uint64_t lba;
  862. struct mfi_evt_pd pd;
  863. struct mfi_evt_ld ld;
  864. } pd_lba_ld;
  865. struct {
  866. struct mfi_evt_pd pd;
  867. struct mfi_progress prog;
  868. } pd_prog;
  869. struct {
  870. struct mfi_evt_pd ld;
  871. uint32_t prev_state;
  872. uint32_t new_state;
  873. } pd_state;
  874. struct {
  875. uint16_t venderId;
  876. uint16_t deviceId;
  877. uint16_t subVenderId;
  878. uint16_t subDeviceId;
  879. } pci;
  880. uint32_t rate;
  881. char str[96];
  882. struct {
  883. uint32_t rtc;
  884. uint16_t elapsedSeconds;
  885. } time;
  886. struct {
  887. uint32_t ecar;
  888. uint32_t elog;
  889. char str[64];
  890. } ecc;
  891. uint8_t b[96];
  892. uint16_t s[48];
  893. uint32_t w[24];
  894. uint64_t d[12];
  895. } args;
  896. char description[128];
  897. } QEMU_PACKED;
  898. struct mfi_evt_list {
  899. uint32_t count;
  900. uint32_t reserved;
  901. struct mfi_evt_detail event[1];
  902. } QEMU_PACKED;
  903. union mfi_pd_ref {
  904. struct {
  905. uint16_t device_id;
  906. uint16_t seq_num;
  907. } v;
  908. uint32_t ref;
  909. } QEMU_PACKED;
  910. union mfi_pd_ddf_type {
  911. struct {
  912. uint16_t pd_type;
  913. #define MFI_PD_DDF_TYPE_FORCED_PD_GUID (1 << 0)
  914. #define MFI_PD_DDF_TYPE_IN_VD (1 << 1)
  915. #define MFI_PD_DDF_TYPE_IS_GLOBAL_SPARE (1 << 2)
  916. #define MFI_PD_DDF_TYPE_IS_SPARE (1 << 3)
  917. #define MFI_PD_DDF_TYPE_IS_FOREIGN (1 << 4)
  918. #define MFI_PD_DDF_TYPE_INTF_SPI (1 << 12)
  919. #define MFI_PD_DDF_TYPE_INTF_SAS (1 << 13)
  920. #define MFI_PD_DDF_TYPE_INTF_SATA1 (1 << 14)
  921. #define MFI_PD_DDF_TYPE_INTF_SATA3G (1 << 15)
  922. uint16_t reserved;
  923. } ddf;
  924. struct {
  925. uint32_t reserved;
  926. } non_disk;
  927. uint32_t type;
  928. } QEMU_PACKED;
  929. struct mfi_pd_progress {
  930. uint32_t active;
  931. #define PD_PROGRESS_ACTIVE_REBUILD (1 << 0)
  932. #define PD_PROGRESS_ACTIVE_PATROL (1 << 1)
  933. #define PD_PROGRESS_ACTIVE_CLEAR (1 << 2)
  934. struct mfi_progress rbld;
  935. struct mfi_progress patrol;
  936. struct mfi_progress clear;
  937. struct mfi_progress reserved[4];
  938. } QEMU_PACKED;
  939. struct mfi_pd_info {
  940. union mfi_pd_ref ref;
  941. uint8_t inquiry_data[96];
  942. uint8_t vpd_page83[64];
  943. uint8_t not_supported;
  944. uint8_t scsi_dev_type;
  945. uint8_t connected_port_bitmap;
  946. uint8_t device_speed;
  947. uint32_t media_err_count;
  948. uint32_t other_err_count;
  949. uint32_t pred_fail_count;
  950. uint32_t last_pred_fail_event_seq_num;
  951. uint16_t fw_state;
  952. uint8_t disable_for_removal;
  953. uint8_t link_speed;
  954. union mfi_pd_ddf_type state;
  955. struct {
  956. uint8_t count;
  957. uint8_t is_path_broken;
  958. uint8_t reserved[6];
  959. uint64_t sas_addr[4];
  960. } path_info;
  961. uint64_t raw_size;
  962. uint64_t non_coerced_size;
  963. uint64_t coerced_size;
  964. uint16_t encl_device_id;
  965. uint8_t encl_index;
  966. uint8_t slot_number;
  967. struct mfi_pd_progress prog_info;
  968. uint8_t bad_block_table_full;
  969. uint8_t unusable_in_current_config;
  970. uint8_t vpd_page83_ext[64];
  971. uint8_t reserved[512-358];
  972. } QEMU_PACKED;
  973. struct mfi_pd_address {
  974. uint16_t device_id;
  975. uint16_t encl_device_id;
  976. uint8_t encl_index;
  977. uint8_t slot_number;
  978. uint8_t scsi_dev_type;
  979. uint8_t connect_port_bitmap;
  980. uint64_t sas_addr[2];
  981. } QEMU_PACKED;
  982. #define MFI_MAX_SYS_PDS 240
  983. struct mfi_pd_list {
  984. uint32_t size;
  985. uint32_t count;
  986. struct mfi_pd_address addr[MFI_MAX_SYS_PDS];
  987. } QEMU_PACKED;
  988. union mfi_ld_ref {
  989. struct {
  990. uint8_t target_id;
  991. uint8_t lun_id;
  992. uint16_t seq;
  993. } v;
  994. uint32_t ref;
  995. } QEMU_PACKED;
  996. struct mfi_ld_list {
  997. uint32_t ld_count;
  998. uint32_t reserved1;
  999. struct {
  1000. union mfi_ld_ref ld;
  1001. uint8_t state;
  1002. uint8_t reserved2[3];
  1003. uint64_t size;
  1004. } ld_list[MFI_MAX_LD];
  1005. } QEMU_PACKED;
  1006. enum mfi_ld_access {
  1007. MFI_LD_ACCESS_RW = 0,
  1008. MFI_LD_ACCSSS_RO = 2,
  1009. MFI_LD_ACCESS_BLOCKED = 3,
  1010. };
  1011. #define MFI_LD_ACCESS_MASK 3
  1012. enum mfi_ld_state {
  1013. MFI_LD_STATE_OFFLINE = 0,
  1014. MFI_LD_STATE_PARTIALLY_DEGRADED = 1,
  1015. MFI_LD_STATE_DEGRADED = 2,
  1016. MFI_LD_STATE_OPTIMAL = 3
  1017. };
  1018. enum mfi_syspd_state {
  1019. MFI_PD_STATE_UNCONFIGURED_GOOD = 0x00,
  1020. MFI_PD_STATE_UNCONFIGURED_BAD = 0x01,
  1021. MFI_PD_STATE_HOT_SPARE = 0x02,
  1022. MFI_PD_STATE_OFFLINE = 0x10,
  1023. MFI_PD_STATE_FAILED = 0x11,
  1024. MFI_PD_STATE_REBUILD = 0x14,
  1025. MFI_PD_STATE_ONLINE = 0x18,
  1026. MFI_PD_STATE_COPYBACK = 0x20,
  1027. MFI_PD_STATE_SYSTEM = 0x40
  1028. };
  1029. struct mfi_ld_props {
  1030. union mfi_ld_ref ld;
  1031. char name[16];
  1032. uint8_t default_cache_policy;
  1033. uint8_t access_policy;
  1034. uint8_t disk_cache_policy;
  1035. uint8_t current_cache_policy;
  1036. uint8_t no_bgi;
  1037. uint8_t reserved[7];
  1038. } QEMU_PACKED;
  1039. struct mfi_ld_params {
  1040. uint8_t primary_raid_level;
  1041. uint8_t raid_level_qualifier;
  1042. uint8_t secondary_raid_level;
  1043. uint8_t stripe_size;
  1044. uint8_t num_drives;
  1045. uint8_t span_depth;
  1046. uint8_t state;
  1047. uint8_t init_state;
  1048. uint8_t is_consistent;
  1049. uint8_t reserved[23];
  1050. } QEMU_PACKED;
  1051. struct mfi_ld_progress {
  1052. uint32_t active;
  1053. #define MFI_LD_PROGRESS_CC (1<<0)
  1054. #define MFI_LD_PROGRESS_BGI (1<<1)
  1055. #define MFI_LD_PROGRESS_FGI (1<<2)
  1056. #define MFI_LD_PORGRESS_RECON (1<<3)
  1057. struct mfi_progress cc;
  1058. struct mfi_progress bgi;
  1059. struct mfi_progress fgi;
  1060. struct mfi_progress recon;
  1061. struct mfi_progress reserved[4];
  1062. } QEMU_PACKED;
  1063. struct mfi_span {
  1064. uint64_t start_block;
  1065. uint64_t num_blocks;
  1066. uint16_t array_ref;
  1067. uint8_t reserved[6];
  1068. } QEMU_PACKED;
  1069. #define MFI_MAX_SPAN_DEPTH 8
  1070. struct mfi_ld_config {
  1071. struct mfi_ld_props properties;
  1072. struct mfi_ld_params params;
  1073. struct mfi_span span[MFI_MAX_SPAN_DEPTH];
  1074. } QEMU_PACKED;
  1075. struct mfi_ld_info {
  1076. struct mfi_ld_config ld_config;
  1077. uint64_t size;
  1078. struct mfi_ld_progress progress;
  1079. uint16_t cluster_owner;
  1080. uint8_t reconstruct_active;
  1081. uint8_t reserved1[1];
  1082. uint8_t vpd_page83[64];
  1083. uint8_t reserved2[16];
  1084. } QEMU_PACKED;
  1085. union mfi_spare_type {
  1086. uint8_t flags;
  1087. #define MFI_SPARE_IS_DEDICATED (1 << 0)
  1088. #define MFI_SPARE_IS_REVERTABLE (1 << 1)
  1089. #define MFI_SPARE_IS_ENCL_AFFINITY (1 << 2)
  1090. uint8_t type;
  1091. } QEMU_PACKED;
  1092. #define MFI_MAX_ARRAYS 16
  1093. struct mfi_spare {
  1094. union mfi_pd_ref ref;
  1095. union mfi_spare_type spare_type;
  1096. uint8_t reserved[2];
  1097. uint8_t array_count;
  1098. uint16_t array_refd[MFI_MAX_ARRAYS];
  1099. } QEMU_PACKED;
  1100. #define MFI_MAX_ROW_SIZE 32
  1101. struct mfi_array {
  1102. uint64_t size;
  1103. uint8_t num_drives;
  1104. uint8_t reserved;
  1105. uint16_t array_ref;
  1106. uint8_t pad[20];
  1107. struct {
  1108. union mfi_pd_ref ref;
  1109. uint16_t fw_state; /* enum mfi_syspd_state */
  1110. struct {
  1111. uint8_t pd;
  1112. uint8_t slot;
  1113. } encl;
  1114. } pd[MFI_MAX_ROW_SIZE];
  1115. } QEMU_PACKED;
  1116. struct mfi_config_data {
  1117. uint32_t size;
  1118. uint16_t array_count;
  1119. uint16_t array_size;
  1120. uint16_t log_drv_count;
  1121. uint16_t log_drv_size;
  1122. uint16_t spares_count;
  1123. uint16_t spares_size;
  1124. uint8_t reserved[16];
  1125. /*
  1126. struct mfi_array array[];
  1127. struct mfi_ld_config ld[];
  1128. struct mfi_spare spare[];
  1129. */
  1130. } QEMU_PACKED;
  1131. #define MFI_SCSI_MAX_TARGETS 128
  1132. #define MFI_SCSI_MAX_LUNS 8
  1133. #define MFI_SCSI_INITIATOR_ID 255
  1134. #define MFI_SCSI_MAX_CMDS 8
  1135. #define MFI_SCSI_MAX_CDB_LEN 16
  1136. #endif /* MFI_REG_H */