mfi.h 37 KB

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