megasas.c 80 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548
  1. /*
  2. * QEMU MegaRAID SAS 8708EM2 Host Bus Adapter emulation
  3. * Based on the linux driver code at drivers/scsi/megaraid
  4. *
  5. * Copyright (c) 2009-2012 Hannes Reinecke, SUSE Labs
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2 of the License, or (at your option) any later version.
  11. *
  12. * This library is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  19. */
  20. #include "qemu/osdep.h"
  21. #include "qemu-common.h"
  22. #include "hw/pci/pci.h"
  23. #include "hw/qdev-properties.h"
  24. #include "sysemu/dma.h"
  25. #include "sysemu/block-backend.h"
  26. #include "hw/pci/msi.h"
  27. #include "hw/pci/msix.h"
  28. #include "qemu/iov.h"
  29. #include "qemu/module.h"
  30. #include "hw/scsi/scsi.h"
  31. #include "scsi/constants.h"
  32. #include "trace.h"
  33. #include "qapi/error.h"
  34. #include "mfi.h"
  35. #include "migration/vmstate.h"
  36. #define MEGASAS_VERSION_GEN1 "1.70"
  37. #define MEGASAS_VERSION_GEN2 "1.80"
  38. #define MEGASAS_MAX_FRAMES 2048 /* Firmware limit at 65535 */
  39. #define MEGASAS_DEFAULT_FRAMES 1000 /* Windows requires this */
  40. #define MEGASAS_GEN2_DEFAULT_FRAMES 1008 /* Windows requires this */
  41. #define MEGASAS_MAX_SGE 128 /* Firmware limit */
  42. #define MEGASAS_DEFAULT_SGE 80
  43. #define MEGASAS_MAX_SECTORS 0xFFFF /* No real limit */
  44. #define MEGASAS_MAX_ARRAYS 128
  45. #define MEGASAS_HBA_SERIAL "QEMU123456"
  46. #define NAA_LOCALLY_ASSIGNED_ID 0x3ULL
  47. #define IEEE_COMPANY_LOCALLY_ASSIGNED 0x525400
  48. #define MEGASAS_FLAG_USE_JBOD 0
  49. #define MEGASAS_MASK_USE_JBOD (1 << MEGASAS_FLAG_USE_JBOD)
  50. #define MEGASAS_FLAG_USE_QUEUE64 1
  51. #define MEGASAS_MASK_USE_QUEUE64 (1 << MEGASAS_FLAG_USE_QUEUE64)
  52. static const char *mfi_frame_desc[] = {
  53. "MFI init", "LD Read", "LD Write", "LD SCSI", "PD SCSI",
  54. "MFI Doorbell", "MFI Abort", "MFI SMP", "MFI Stop"};
  55. typedef struct MegasasCmd {
  56. uint32_t index;
  57. uint16_t flags;
  58. uint16_t count;
  59. uint64_t context;
  60. hwaddr pa;
  61. hwaddr pa_size;
  62. uint32_t dcmd_opcode;
  63. union mfi_frame *frame;
  64. SCSIRequest *req;
  65. QEMUSGList qsg;
  66. void *iov_buf;
  67. size_t iov_size;
  68. size_t iov_offset;
  69. struct MegasasState *state;
  70. } MegasasCmd;
  71. typedef struct MegasasState {
  72. /*< private >*/
  73. PCIDevice parent_obj;
  74. /*< public >*/
  75. MemoryRegion mmio_io;
  76. MemoryRegion port_io;
  77. MemoryRegion queue_io;
  78. uint32_t frame_hi;
  79. int fw_state;
  80. uint32_t fw_sge;
  81. uint32_t fw_cmds;
  82. uint32_t flags;
  83. int fw_luns;
  84. int intr_mask;
  85. int doorbell;
  86. int busy;
  87. int diag;
  88. int adp_reset;
  89. OnOffAuto msi;
  90. OnOffAuto msix;
  91. MegasasCmd *event_cmd;
  92. int event_locale;
  93. int event_class;
  94. int event_count;
  95. int shutdown_event;
  96. int boot_event;
  97. uint64_t sas_addr;
  98. char *hba_serial;
  99. uint64_t reply_queue_pa;
  100. void *reply_queue;
  101. int reply_queue_len;
  102. int reply_queue_head;
  103. int reply_queue_tail;
  104. uint64_t consumer_pa;
  105. uint64_t producer_pa;
  106. MegasasCmd frames[MEGASAS_MAX_FRAMES];
  107. DECLARE_BITMAP(frame_map, MEGASAS_MAX_FRAMES);
  108. SCSIBus bus;
  109. } MegasasState;
  110. typedef struct MegasasBaseClass {
  111. PCIDeviceClass parent_class;
  112. const char *product_name;
  113. const char *product_version;
  114. int mmio_bar;
  115. int ioport_bar;
  116. int osts;
  117. } MegasasBaseClass;
  118. #define TYPE_MEGASAS_BASE "megasas-base"
  119. #define TYPE_MEGASAS_GEN1 "megasas"
  120. #define TYPE_MEGASAS_GEN2 "megasas-gen2"
  121. #define MEGASAS(obj) \
  122. OBJECT_CHECK(MegasasState, (obj), TYPE_MEGASAS_BASE)
  123. #define MEGASAS_DEVICE_CLASS(oc) \
  124. OBJECT_CLASS_CHECK(MegasasBaseClass, (oc), TYPE_MEGASAS_BASE)
  125. #define MEGASAS_DEVICE_GET_CLASS(oc) \
  126. OBJECT_GET_CLASS(MegasasBaseClass, (oc), TYPE_MEGASAS_BASE)
  127. #define MEGASAS_INTR_DISABLED_MASK 0xFFFFFFFF
  128. static bool megasas_intr_enabled(MegasasState *s)
  129. {
  130. if ((s->intr_mask & MEGASAS_INTR_DISABLED_MASK) !=
  131. MEGASAS_INTR_DISABLED_MASK) {
  132. return true;
  133. }
  134. return false;
  135. }
  136. static bool megasas_use_queue64(MegasasState *s)
  137. {
  138. return s->flags & MEGASAS_MASK_USE_QUEUE64;
  139. }
  140. static bool megasas_use_msix(MegasasState *s)
  141. {
  142. return s->msix != ON_OFF_AUTO_OFF;
  143. }
  144. static bool megasas_is_jbod(MegasasState *s)
  145. {
  146. return s->flags & MEGASAS_MASK_USE_JBOD;
  147. }
  148. static void megasas_frame_set_cmd_status(MegasasState *s,
  149. unsigned long frame, uint8_t v)
  150. {
  151. PCIDevice *pci = &s->parent_obj;
  152. stb_pci_dma(pci, frame + offsetof(struct mfi_frame_header, cmd_status), v);
  153. }
  154. static void megasas_frame_set_scsi_status(MegasasState *s,
  155. unsigned long frame, uint8_t v)
  156. {
  157. PCIDevice *pci = &s->parent_obj;
  158. stb_pci_dma(pci, frame + offsetof(struct mfi_frame_header, scsi_status), v);
  159. }
  160. /*
  161. * Context is considered opaque, but the HBA firmware is running
  162. * in little endian mode. So convert it to little endian, too.
  163. */
  164. static uint64_t megasas_frame_get_context(MegasasState *s,
  165. unsigned long frame)
  166. {
  167. PCIDevice *pci = &s->parent_obj;
  168. return ldq_le_pci_dma(pci, frame + offsetof(struct mfi_frame_header, context));
  169. }
  170. static bool megasas_frame_is_ieee_sgl(MegasasCmd *cmd)
  171. {
  172. return cmd->flags & MFI_FRAME_IEEE_SGL;
  173. }
  174. static bool megasas_frame_is_sgl64(MegasasCmd *cmd)
  175. {
  176. return cmd->flags & MFI_FRAME_SGL64;
  177. }
  178. static bool megasas_frame_is_sense64(MegasasCmd *cmd)
  179. {
  180. return cmd->flags & MFI_FRAME_SENSE64;
  181. }
  182. static uint64_t megasas_sgl_get_addr(MegasasCmd *cmd,
  183. union mfi_sgl *sgl)
  184. {
  185. uint64_t addr;
  186. if (megasas_frame_is_ieee_sgl(cmd)) {
  187. addr = le64_to_cpu(sgl->sg_skinny->addr);
  188. } else if (megasas_frame_is_sgl64(cmd)) {
  189. addr = le64_to_cpu(sgl->sg64->addr);
  190. } else {
  191. addr = le32_to_cpu(sgl->sg32->addr);
  192. }
  193. return addr;
  194. }
  195. static uint32_t megasas_sgl_get_len(MegasasCmd *cmd,
  196. union mfi_sgl *sgl)
  197. {
  198. uint32_t len;
  199. if (megasas_frame_is_ieee_sgl(cmd)) {
  200. len = le32_to_cpu(sgl->sg_skinny->len);
  201. } else if (megasas_frame_is_sgl64(cmd)) {
  202. len = le32_to_cpu(sgl->sg64->len);
  203. } else {
  204. len = le32_to_cpu(sgl->sg32->len);
  205. }
  206. return len;
  207. }
  208. static union mfi_sgl *megasas_sgl_next(MegasasCmd *cmd,
  209. union mfi_sgl *sgl)
  210. {
  211. uint8_t *next = (uint8_t *)sgl;
  212. if (megasas_frame_is_ieee_sgl(cmd)) {
  213. next += sizeof(struct mfi_sg_skinny);
  214. } else if (megasas_frame_is_sgl64(cmd)) {
  215. next += sizeof(struct mfi_sg64);
  216. } else {
  217. next += sizeof(struct mfi_sg32);
  218. }
  219. if (next >= (uint8_t *)cmd->frame + cmd->pa_size) {
  220. return NULL;
  221. }
  222. return (union mfi_sgl *)next;
  223. }
  224. static void megasas_soft_reset(MegasasState *s);
  225. static int megasas_map_sgl(MegasasState *s, MegasasCmd *cmd, union mfi_sgl *sgl)
  226. {
  227. int i;
  228. int iov_count = 0;
  229. size_t iov_size = 0;
  230. cmd->flags = le16_to_cpu(cmd->frame->header.flags);
  231. iov_count = cmd->frame->header.sge_count;
  232. if (iov_count > MEGASAS_MAX_SGE) {
  233. trace_megasas_iovec_sgl_overflow(cmd->index, iov_count,
  234. MEGASAS_MAX_SGE);
  235. return iov_count;
  236. }
  237. pci_dma_sglist_init(&cmd->qsg, PCI_DEVICE(s), iov_count);
  238. for (i = 0; i < iov_count; i++) {
  239. dma_addr_t iov_pa, iov_size_p;
  240. if (!sgl) {
  241. trace_megasas_iovec_sgl_underflow(cmd->index, i);
  242. goto unmap;
  243. }
  244. iov_pa = megasas_sgl_get_addr(cmd, sgl);
  245. iov_size_p = megasas_sgl_get_len(cmd, sgl);
  246. if (!iov_pa || !iov_size_p) {
  247. trace_megasas_iovec_sgl_invalid(cmd->index, i,
  248. iov_pa, iov_size_p);
  249. goto unmap;
  250. }
  251. qemu_sglist_add(&cmd->qsg, iov_pa, iov_size_p);
  252. sgl = megasas_sgl_next(cmd, sgl);
  253. iov_size += (size_t)iov_size_p;
  254. }
  255. if (cmd->iov_size > iov_size) {
  256. trace_megasas_iovec_overflow(cmd->index, iov_size, cmd->iov_size);
  257. } else if (cmd->iov_size < iov_size) {
  258. trace_megasas_iovec_underflow(cmd->index, iov_size, cmd->iov_size);
  259. }
  260. cmd->iov_offset = 0;
  261. return 0;
  262. unmap:
  263. qemu_sglist_destroy(&cmd->qsg);
  264. return iov_count - i;
  265. }
  266. /*
  267. * passthrough sense and io sense are at the same offset
  268. */
  269. static int megasas_build_sense(MegasasCmd *cmd, uint8_t *sense_ptr,
  270. uint8_t sense_len)
  271. {
  272. PCIDevice *pcid = PCI_DEVICE(cmd->state);
  273. uint32_t pa_hi = 0, pa_lo;
  274. hwaddr pa;
  275. int frame_sense_len;
  276. frame_sense_len = cmd->frame->header.sense_len;
  277. if (sense_len > frame_sense_len) {
  278. sense_len = frame_sense_len;
  279. }
  280. if (sense_len) {
  281. pa_lo = le32_to_cpu(cmd->frame->pass.sense_addr_lo);
  282. if (megasas_frame_is_sense64(cmd)) {
  283. pa_hi = le32_to_cpu(cmd->frame->pass.sense_addr_hi);
  284. }
  285. pa = ((uint64_t) pa_hi << 32) | pa_lo;
  286. pci_dma_write(pcid, pa, sense_ptr, sense_len);
  287. cmd->frame->header.sense_len = sense_len;
  288. }
  289. return sense_len;
  290. }
  291. static void megasas_write_sense(MegasasCmd *cmd, SCSISense sense)
  292. {
  293. uint8_t sense_buf[SCSI_SENSE_BUF_SIZE];
  294. uint8_t sense_len = 18;
  295. memset(sense_buf, 0, sense_len);
  296. sense_buf[0] = 0xf0;
  297. sense_buf[2] = sense.key;
  298. sense_buf[7] = 10;
  299. sense_buf[12] = sense.asc;
  300. sense_buf[13] = sense.ascq;
  301. megasas_build_sense(cmd, sense_buf, sense_len);
  302. }
  303. static void megasas_copy_sense(MegasasCmd *cmd)
  304. {
  305. uint8_t sense_buf[SCSI_SENSE_BUF_SIZE];
  306. uint8_t sense_len;
  307. sense_len = scsi_req_get_sense(cmd->req, sense_buf,
  308. SCSI_SENSE_BUF_SIZE);
  309. megasas_build_sense(cmd, sense_buf, sense_len);
  310. }
  311. /*
  312. * Format an INQUIRY CDB
  313. */
  314. static int megasas_setup_inquiry(uint8_t *cdb, int pg, int len)
  315. {
  316. memset(cdb, 0, 6);
  317. cdb[0] = INQUIRY;
  318. if (pg > 0) {
  319. cdb[1] = 0x1;
  320. cdb[2] = pg;
  321. }
  322. cdb[3] = (len >> 8) & 0xff;
  323. cdb[4] = (len & 0xff);
  324. return len;
  325. }
  326. /*
  327. * Encode lba and len into a READ_16/WRITE_16 CDB
  328. */
  329. static void megasas_encode_lba(uint8_t *cdb, uint64_t lba,
  330. uint32_t len, bool is_write)
  331. {
  332. memset(cdb, 0x0, 16);
  333. if (is_write) {
  334. cdb[0] = WRITE_16;
  335. } else {
  336. cdb[0] = READ_16;
  337. }
  338. cdb[2] = (lba >> 56) & 0xff;
  339. cdb[3] = (lba >> 48) & 0xff;
  340. cdb[4] = (lba >> 40) & 0xff;
  341. cdb[5] = (lba >> 32) & 0xff;
  342. cdb[6] = (lba >> 24) & 0xff;
  343. cdb[7] = (lba >> 16) & 0xff;
  344. cdb[8] = (lba >> 8) & 0xff;
  345. cdb[9] = (lba) & 0xff;
  346. cdb[10] = (len >> 24) & 0xff;
  347. cdb[11] = (len >> 16) & 0xff;
  348. cdb[12] = (len >> 8) & 0xff;
  349. cdb[13] = (len) & 0xff;
  350. }
  351. /*
  352. * Utility functions
  353. */
  354. static uint64_t megasas_fw_time(void)
  355. {
  356. struct tm curtime;
  357. qemu_get_timedate(&curtime, 0);
  358. return ((uint64_t)curtime.tm_sec & 0xff) << 48 |
  359. ((uint64_t)curtime.tm_min & 0xff) << 40 |
  360. ((uint64_t)curtime.tm_hour & 0xff) << 32 |
  361. ((uint64_t)curtime.tm_mday & 0xff) << 24 |
  362. ((uint64_t)curtime.tm_mon & 0xff) << 16 |
  363. ((uint64_t)(curtime.tm_year + 1900) & 0xffff);
  364. }
  365. /*
  366. * Default disk sata address
  367. * 0x1221 is the magic number as
  368. * present in real hardware,
  369. * so use it here, too.
  370. */
  371. static uint64_t megasas_get_sata_addr(uint16_t id)
  372. {
  373. uint64_t addr = (0x1221ULL << 48);
  374. return addr | ((uint64_t)id << 24);
  375. }
  376. /*
  377. * Frame handling
  378. */
  379. static int megasas_next_index(MegasasState *s, int index, int limit)
  380. {
  381. index++;
  382. if (index == limit) {
  383. index = 0;
  384. }
  385. return index;
  386. }
  387. static MegasasCmd *megasas_lookup_frame(MegasasState *s,
  388. hwaddr frame)
  389. {
  390. MegasasCmd *cmd = NULL;
  391. int num = 0, index;
  392. index = s->reply_queue_head;
  393. while (num < s->fw_cmds) {
  394. if (s->frames[index].pa && s->frames[index].pa == frame) {
  395. cmd = &s->frames[index];
  396. break;
  397. }
  398. index = megasas_next_index(s, index, s->fw_cmds);
  399. num++;
  400. }
  401. return cmd;
  402. }
  403. static void megasas_unmap_frame(MegasasState *s, MegasasCmd *cmd)
  404. {
  405. PCIDevice *p = PCI_DEVICE(s);
  406. if (cmd->pa_size) {
  407. pci_dma_unmap(p, cmd->frame, cmd->pa_size, 0, 0);
  408. }
  409. cmd->frame = NULL;
  410. cmd->pa = 0;
  411. cmd->pa_size = 0;
  412. qemu_sglist_destroy(&cmd->qsg);
  413. clear_bit(cmd->index, s->frame_map);
  414. }
  415. /*
  416. * This absolutely needs to be locked if
  417. * qemu ever goes multithreaded.
  418. */
  419. static MegasasCmd *megasas_enqueue_frame(MegasasState *s,
  420. hwaddr frame, uint64_t context, int count)
  421. {
  422. PCIDevice *pcid = PCI_DEVICE(s);
  423. MegasasCmd *cmd = NULL;
  424. int frame_size = MEGASAS_MAX_SGE * sizeof(union mfi_sgl);
  425. hwaddr frame_size_p = frame_size;
  426. unsigned long index;
  427. index = 0;
  428. while (index < s->fw_cmds) {
  429. index = find_next_zero_bit(s->frame_map, s->fw_cmds, index);
  430. if (!s->frames[index].pa)
  431. break;
  432. /* Busy frame found */
  433. trace_megasas_qf_mapped(index);
  434. }
  435. if (index >= s->fw_cmds) {
  436. /* All frames busy */
  437. trace_megasas_qf_busy(frame);
  438. return NULL;
  439. }
  440. cmd = &s->frames[index];
  441. set_bit(index, s->frame_map);
  442. trace_megasas_qf_new(index, frame);
  443. cmd->pa = frame;
  444. /* Map all possible frames */
  445. cmd->frame = pci_dma_map(pcid, frame, &frame_size_p, 0);
  446. if (frame_size_p != frame_size) {
  447. trace_megasas_qf_map_failed(cmd->index, (unsigned long)frame);
  448. if (cmd->frame) {
  449. megasas_unmap_frame(s, cmd);
  450. }
  451. s->event_count++;
  452. return NULL;
  453. }
  454. cmd->pa_size = frame_size_p;
  455. cmd->context = context;
  456. if (!megasas_use_queue64(s)) {
  457. cmd->context &= (uint64_t)0xFFFFFFFF;
  458. }
  459. cmd->count = count;
  460. cmd->dcmd_opcode = -1;
  461. s->busy++;
  462. if (s->consumer_pa) {
  463. s->reply_queue_tail = ldl_le_pci_dma(pcid, s->consumer_pa);
  464. }
  465. trace_megasas_qf_enqueue(cmd->index, cmd->count, cmd->context,
  466. s->reply_queue_head, s->reply_queue_tail, s->busy);
  467. return cmd;
  468. }
  469. static void megasas_complete_frame(MegasasState *s, uint64_t context)
  470. {
  471. PCIDevice *pci_dev = PCI_DEVICE(s);
  472. int tail, queue_offset;
  473. /* Decrement busy count */
  474. s->busy--;
  475. if (s->reply_queue_pa) {
  476. /*
  477. * Put command on the reply queue.
  478. * Context is opaque, but emulation is running in
  479. * little endian. So convert it.
  480. */
  481. if (megasas_use_queue64(s)) {
  482. queue_offset = s->reply_queue_head * sizeof(uint64_t);
  483. stq_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset, context);
  484. } else {
  485. queue_offset = s->reply_queue_head * sizeof(uint32_t);
  486. stl_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset, context);
  487. }
  488. s->reply_queue_tail = ldl_le_pci_dma(pci_dev, s->consumer_pa);
  489. trace_megasas_qf_complete(context, s->reply_queue_head,
  490. s->reply_queue_tail, s->busy);
  491. }
  492. if (megasas_intr_enabled(s)) {
  493. /* Update reply queue pointer */
  494. s->reply_queue_tail = ldl_le_pci_dma(pci_dev, s->consumer_pa);
  495. tail = s->reply_queue_head;
  496. s->reply_queue_head = megasas_next_index(s, tail, s->fw_cmds);
  497. trace_megasas_qf_update(s->reply_queue_head, s->reply_queue_tail,
  498. s->busy);
  499. stl_le_pci_dma(pci_dev, s->producer_pa, s->reply_queue_head);
  500. /* Notify HBA */
  501. if (msix_enabled(pci_dev)) {
  502. trace_megasas_msix_raise(0);
  503. msix_notify(pci_dev, 0);
  504. } else if (msi_enabled(pci_dev)) {
  505. trace_megasas_msi_raise(0);
  506. msi_notify(pci_dev, 0);
  507. } else {
  508. s->doorbell++;
  509. if (s->doorbell == 1) {
  510. trace_megasas_irq_raise();
  511. pci_irq_assert(pci_dev);
  512. }
  513. }
  514. } else {
  515. trace_megasas_qf_complete_noirq(context);
  516. }
  517. }
  518. static void megasas_complete_command(MegasasCmd *cmd)
  519. {
  520. cmd->iov_size = 0;
  521. cmd->iov_offset = 0;
  522. cmd->req->hba_private = NULL;
  523. scsi_req_unref(cmd->req);
  524. cmd->req = NULL;
  525. megasas_unmap_frame(cmd->state, cmd);
  526. megasas_complete_frame(cmd->state, cmd->context);
  527. }
  528. static void megasas_reset_frames(MegasasState *s)
  529. {
  530. int i;
  531. MegasasCmd *cmd;
  532. for (i = 0; i < s->fw_cmds; i++) {
  533. cmd = &s->frames[i];
  534. if (cmd->pa) {
  535. megasas_unmap_frame(s, cmd);
  536. }
  537. }
  538. bitmap_zero(s->frame_map, MEGASAS_MAX_FRAMES);
  539. }
  540. static void megasas_abort_command(MegasasCmd *cmd)
  541. {
  542. /* Never abort internal commands. */
  543. if (cmd->dcmd_opcode != -1) {
  544. return;
  545. }
  546. if (cmd->req != NULL) {
  547. scsi_req_cancel(cmd->req);
  548. }
  549. }
  550. static int megasas_init_firmware(MegasasState *s, MegasasCmd *cmd)
  551. {
  552. PCIDevice *pcid = PCI_DEVICE(s);
  553. uint32_t pa_hi, pa_lo;
  554. hwaddr iq_pa, initq_size = sizeof(struct mfi_init_qinfo);
  555. struct mfi_init_qinfo *initq = NULL;
  556. uint32_t flags;
  557. int ret = MFI_STAT_OK;
  558. if (s->reply_queue_pa) {
  559. trace_megasas_initq_mapped(s->reply_queue_pa);
  560. goto out;
  561. }
  562. pa_lo = le32_to_cpu(cmd->frame->init.qinfo_new_addr_lo);
  563. pa_hi = le32_to_cpu(cmd->frame->init.qinfo_new_addr_hi);
  564. iq_pa = (((uint64_t) pa_hi << 32) | pa_lo);
  565. trace_megasas_init_firmware((uint64_t)iq_pa);
  566. initq = pci_dma_map(pcid, iq_pa, &initq_size, 0);
  567. if (!initq || initq_size != sizeof(*initq)) {
  568. trace_megasas_initq_map_failed(cmd->index);
  569. s->event_count++;
  570. ret = MFI_STAT_MEMORY_NOT_AVAILABLE;
  571. goto out;
  572. }
  573. s->reply_queue_len = le32_to_cpu(initq->rq_entries) & 0xFFFF;
  574. if (s->reply_queue_len > s->fw_cmds) {
  575. trace_megasas_initq_mismatch(s->reply_queue_len, s->fw_cmds);
  576. s->event_count++;
  577. ret = MFI_STAT_INVALID_PARAMETER;
  578. goto out;
  579. }
  580. pa_lo = le32_to_cpu(initq->rq_addr_lo);
  581. pa_hi = le32_to_cpu(initq->rq_addr_hi);
  582. s->reply_queue_pa = ((uint64_t) pa_hi << 32) | pa_lo;
  583. pa_lo = le32_to_cpu(initq->ci_addr_lo);
  584. pa_hi = le32_to_cpu(initq->ci_addr_hi);
  585. s->consumer_pa = ((uint64_t) pa_hi << 32) | pa_lo;
  586. pa_lo = le32_to_cpu(initq->pi_addr_lo);
  587. pa_hi = le32_to_cpu(initq->pi_addr_hi);
  588. s->producer_pa = ((uint64_t) pa_hi << 32) | pa_lo;
  589. s->reply_queue_head = ldl_le_pci_dma(pcid, s->producer_pa);
  590. s->reply_queue_head %= MEGASAS_MAX_FRAMES;
  591. s->reply_queue_tail = ldl_le_pci_dma(pcid, s->consumer_pa);
  592. s->reply_queue_tail %= MEGASAS_MAX_FRAMES;
  593. flags = le32_to_cpu(initq->flags);
  594. if (flags & MFI_QUEUE_FLAG_CONTEXT64) {
  595. s->flags |= MEGASAS_MASK_USE_QUEUE64;
  596. }
  597. trace_megasas_init_queue((unsigned long)s->reply_queue_pa,
  598. s->reply_queue_len, s->reply_queue_head,
  599. s->reply_queue_tail, flags);
  600. megasas_reset_frames(s);
  601. s->fw_state = MFI_FWSTATE_OPERATIONAL;
  602. out:
  603. if (initq) {
  604. pci_dma_unmap(pcid, initq, initq_size, 0, 0);
  605. }
  606. return ret;
  607. }
  608. static int megasas_map_dcmd(MegasasState *s, MegasasCmd *cmd)
  609. {
  610. dma_addr_t iov_pa, iov_size;
  611. int iov_count;
  612. cmd->flags = le16_to_cpu(cmd->frame->header.flags);
  613. iov_count = cmd->frame->header.sge_count;
  614. if (!iov_count) {
  615. trace_megasas_dcmd_zero_sge(cmd->index);
  616. cmd->iov_size = 0;
  617. return 0;
  618. } else if (iov_count > 1) {
  619. trace_megasas_dcmd_invalid_sge(cmd->index, iov_count);
  620. cmd->iov_size = 0;
  621. return -EINVAL;
  622. }
  623. iov_pa = megasas_sgl_get_addr(cmd, &cmd->frame->dcmd.sgl);
  624. iov_size = megasas_sgl_get_len(cmd, &cmd->frame->dcmd.sgl);
  625. pci_dma_sglist_init(&cmd->qsg, PCI_DEVICE(s), 1);
  626. qemu_sglist_add(&cmd->qsg, iov_pa, iov_size);
  627. cmd->iov_size = iov_size;
  628. return 0;
  629. }
  630. static void megasas_finish_dcmd(MegasasCmd *cmd, uint32_t iov_size)
  631. {
  632. trace_megasas_finish_dcmd(cmd->index, iov_size);
  633. if (iov_size > cmd->iov_size) {
  634. if (megasas_frame_is_ieee_sgl(cmd)) {
  635. cmd->frame->dcmd.sgl.sg_skinny->len = cpu_to_le32(iov_size);
  636. } else if (megasas_frame_is_sgl64(cmd)) {
  637. cmd->frame->dcmd.sgl.sg64->len = cpu_to_le32(iov_size);
  638. } else {
  639. cmd->frame->dcmd.sgl.sg32->len = cpu_to_le32(iov_size);
  640. }
  641. }
  642. }
  643. static int megasas_ctrl_get_info(MegasasState *s, MegasasCmd *cmd)
  644. {
  645. PCIDevice *pci_dev = PCI_DEVICE(s);
  646. PCIDeviceClass *pci_class = PCI_DEVICE_GET_CLASS(pci_dev);
  647. MegasasBaseClass *base_class = MEGASAS_DEVICE_GET_CLASS(s);
  648. struct mfi_ctrl_info info;
  649. size_t dcmd_size = sizeof(info);
  650. BusChild *kid;
  651. int num_pd_disks = 0;
  652. memset(&info, 0x0, dcmd_size);
  653. if (cmd->iov_size < dcmd_size) {
  654. trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
  655. dcmd_size);
  656. return MFI_STAT_INVALID_PARAMETER;
  657. }
  658. info.pci.vendor = cpu_to_le16(pci_class->vendor_id);
  659. info.pci.device = cpu_to_le16(pci_class->device_id);
  660. info.pci.subvendor = cpu_to_le16(pci_class->subsystem_vendor_id);
  661. info.pci.subdevice = cpu_to_le16(pci_class->subsystem_id);
  662. /*
  663. * For some reason the firmware supports
  664. * only up to 8 device ports.
  665. * Despite supporting a far larger number
  666. * of devices for the physical devices.
  667. * So just display the first 8 devices
  668. * in the device port list, independent
  669. * of how many logical devices are actually
  670. * present.
  671. */
  672. info.host.type = MFI_INFO_HOST_PCIE;
  673. info.device.type = MFI_INFO_DEV_SAS3G;
  674. info.device.port_count = 8;
  675. QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
  676. SCSIDevice *sdev = SCSI_DEVICE(kid->child);
  677. uint16_t pd_id;
  678. if (num_pd_disks < 8) {
  679. pd_id = ((sdev->id & 0xFF) << 8) | (sdev->lun & 0xFF);
  680. info.device.port_addr[num_pd_disks] =
  681. cpu_to_le64(megasas_get_sata_addr(pd_id));
  682. }
  683. num_pd_disks++;
  684. }
  685. memcpy(info.product_name, base_class->product_name, 24);
  686. snprintf(info.serial_number, 32, "%s", s->hba_serial);
  687. snprintf(info.package_version, 0x60, "%s-QEMU", qemu_hw_version());
  688. memcpy(info.image_component[0].name, "APP", 3);
  689. snprintf(info.image_component[0].version, 10, "%s-QEMU",
  690. base_class->product_version);
  691. memcpy(info.image_component[0].build_date, "Apr 1 2014", 11);
  692. memcpy(info.image_component[0].build_time, "12:34:56", 8);
  693. info.image_component_count = 1;
  694. if (pci_dev->has_rom) {
  695. uint8_t biosver[32];
  696. uint8_t *ptr;
  697. ptr = memory_region_get_ram_ptr(&pci_dev->rom);
  698. memcpy(biosver, ptr + 0x41, 31);
  699. biosver[31] = 0;
  700. memcpy(info.image_component[1].name, "BIOS", 4);
  701. memcpy(info.image_component[1].version, biosver,
  702. strlen((const char *)biosver));
  703. info.image_component_count++;
  704. }
  705. info.current_fw_time = cpu_to_le32(megasas_fw_time());
  706. info.max_arms = 32;
  707. info.max_spans = 8;
  708. info.max_arrays = MEGASAS_MAX_ARRAYS;
  709. info.max_lds = MFI_MAX_LD;
  710. info.max_cmds = cpu_to_le16(s->fw_cmds);
  711. info.max_sg_elements = cpu_to_le16(s->fw_sge);
  712. info.max_request_size = cpu_to_le32(MEGASAS_MAX_SECTORS);
  713. if (!megasas_is_jbod(s))
  714. info.lds_present = cpu_to_le16(num_pd_disks);
  715. info.pd_present = cpu_to_le16(num_pd_disks);
  716. info.pd_disks_present = cpu_to_le16(num_pd_disks);
  717. info.hw_present = cpu_to_le32(MFI_INFO_HW_NVRAM |
  718. MFI_INFO_HW_MEM |
  719. MFI_INFO_HW_FLASH);
  720. info.memory_size = cpu_to_le16(512);
  721. info.nvram_size = cpu_to_le16(32);
  722. info.flash_size = cpu_to_le16(16);
  723. info.raid_levels = cpu_to_le32(MFI_INFO_RAID_0);
  724. info.adapter_ops = cpu_to_le32(MFI_INFO_AOPS_RBLD_RATE |
  725. MFI_INFO_AOPS_SELF_DIAGNOSTIC |
  726. MFI_INFO_AOPS_MIXED_ARRAY);
  727. info.ld_ops = cpu_to_le32(MFI_INFO_LDOPS_DISK_CACHE_POLICY |
  728. MFI_INFO_LDOPS_ACCESS_POLICY |
  729. MFI_INFO_LDOPS_IO_POLICY |
  730. MFI_INFO_LDOPS_WRITE_POLICY |
  731. MFI_INFO_LDOPS_READ_POLICY);
  732. info.max_strips_per_io = cpu_to_le16(s->fw_sge);
  733. info.stripe_sz_ops.min = 3;
  734. info.stripe_sz_ops.max = ctz32(MEGASAS_MAX_SECTORS + 1);
  735. info.properties.pred_fail_poll_interval = cpu_to_le16(300);
  736. info.properties.intr_throttle_cnt = cpu_to_le16(16);
  737. info.properties.intr_throttle_timeout = cpu_to_le16(50);
  738. info.properties.rebuild_rate = 30;
  739. info.properties.patrol_read_rate = 30;
  740. info.properties.bgi_rate = 30;
  741. info.properties.cc_rate = 30;
  742. info.properties.recon_rate = 30;
  743. info.properties.cache_flush_interval = 4;
  744. info.properties.spinup_drv_cnt = 2;
  745. info.properties.spinup_delay = 6;
  746. info.properties.ecc_bucket_size = 15;
  747. info.properties.ecc_bucket_leak_rate = cpu_to_le16(1440);
  748. info.properties.expose_encl_devices = 1;
  749. info.properties.OnOffProperties = cpu_to_le32(MFI_CTRL_PROP_EnableJBOD);
  750. info.pd_ops = cpu_to_le32(MFI_INFO_PDOPS_FORCE_ONLINE |
  751. MFI_INFO_PDOPS_FORCE_OFFLINE);
  752. info.pd_mix_support = cpu_to_le32(MFI_INFO_PDMIX_SAS |
  753. MFI_INFO_PDMIX_SATA |
  754. MFI_INFO_PDMIX_LD);
  755. cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
  756. return MFI_STAT_OK;
  757. }
  758. static int megasas_mfc_get_defaults(MegasasState *s, MegasasCmd *cmd)
  759. {
  760. struct mfi_defaults info;
  761. size_t dcmd_size = sizeof(struct mfi_defaults);
  762. memset(&info, 0x0, dcmd_size);
  763. if (cmd->iov_size < dcmd_size) {
  764. trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
  765. dcmd_size);
  766. return MFI_STAT_INVALID_PARAMETER;
  767. }
  768. info.sas_addr = cpu_to_le64(s->sas_addr);
  769. info.stripe_size = 3;
  770. info.flush_time = 4;
  771. info.background_rate = 30;
  772. info.allow_mix_in_enclosure = 1;
  773. info.allow_mix_in_ld = 1;
  774. info.direct_pd_mapping = 1;
  775. /* Enable for BIOS support */
  776. info.bios_enumerate_lds = 1;
  777. info.disable_ctrl_r = 1;
  778. info.expose_enclosure_devices = 1;
  779. info.disable_preboot_cli = 1;
  780. info.cluster_disable = 1;
  781. cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
  782. return MFI_STAT_OK;
  783. }
  784. static int megasas_dcmd_get_bios_info(MegasasState *s, MegasasCmd *cmd)
  785. {
  786. struct mfi_bios_data info;
  787. size_t dcmd_size = sizeof(info);
  788. memset(&info, 0x0, dcmd_size);
  789. if (cmd->iov_size < dcmd_size) {
  790. trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
  791. dcmd_size);
  792. return MFI_STAT_INVALID_PARAMETER;
  793. }
  794. info.continue_on_error = 1;
  795. info.verbose = 1;
  796. if (megasas_is_jbod(s)) {
  797. info.expose_all_drives = 1;
  798. }
  799. cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
  800. return MFI_STAT_OK;
  801. }
  802. static int megasas_dcmd_get_fw_time(MegasasState *s, MegasasCmd *cmd)
  803. {
  804. uint64_t fw_time;
  805. size_t dcmd_size = sizeof(fw_time);
  806. fw_time = cpu_to_le64(megasas_fw_time());
  807. cmd->iov_size -= dma_buf_read((uint8_t *)&fw_time, dcmd_size, &cmd->qsg);
  808. return MFI_STAT_OK;
  809. }
  810. static int megasas_dcmd_set_fw_time(MegasasState *s, MegasasCmd *cmd)
  811. {
  812. uint64_t fw_time;
  813. /* This is a dummy; setting of firmware time is not allowed */
  814. memcpy(&fw_time, cmd->frame->dcmd.mbox, sizeof(fw_time));
  815. trace_megasas_dcmd_set_fw_time(cmd->index, fw_time);
  816. fw_time = cpu_to_le64(megasas_fw_time());
  817. return MFI_STAT_OK;
  818. }
  819. static int megasas_event_info(MegasasState *s, MegasasCmd *cmd)
  820. {
  821. struct mfi_evt_log_state info;
  822. size_t dcmd_size = sizeof(info);
  823. memset(&info, 0, dcmd_size);
  824. info.newest_seq_num = cpu_to_le32(s->event_count);
  825. info.shutdown_seq_num = cpu_to_le32(s->shutdown_event);
  826. info.boot_seq_num = cpu_to_le32(s->boot_event);
  827. cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
  828. return MFI_STAT_OK;
  829. }
  830. static int megasas_event_wait(MegasasState *s, MegasasCmd *cmd)
  831. {
  832. union mfi_evt event;
  833. if (cmd->iov_size < sizeof(struct mfi_evt_detail)) {
  834. trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
  835. sizeof(struct mfi_evt_detail));
  836. return MFI_STAT_INVALID_PARAMETER;
  837. }
  838. s->event_count = cpu_to_le32(cmd->frame->dcmd.mbox[0]);
  839. event.word = cpu_to_le32(cmd->frame->dcmd.mbox[4]);
  840. s->event_locale = event.members.locale;
  841. s->event_class = event.members.class;
  842. s->event_cmd = cmd;
  843. /* Decrease busy count; event frame doesn't count here */
  844. s->busy--;
  845. cmd->iov_size = sizeof(struct mfi_evt_detail);
  846. return MFI_STAT_INVALID_STATUS;
  847. }
  848. static int megasas_dcmd_pd_get_list(MegasasState *s, MegasasCmd *cmd)
  849. {
  850. struct mfi_pd_list info;
  851. size_t dcmd_size = sizeof(info);
  852. BusChild *kid;
  853. uint32_t offset, dcmd_limit, num_pd_disks = 0, max_pd_disks;
  854. memset(&info, 0, dcmd_size);
  855. offset = 8;
  856. dcmd_limit = offset + sizeof(struct mfi_pd_address);
  857. if (cmd->iov_size < dcmd_limit) {
  858. trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
  859. dcmd_limit);
  860. return MFI_STAT_INVALID_PARAMETER;
  861. }
  862. max_pd_disks = (cmd->iov_size - offset) / sizeof(struct mfi_pd_address);
  863. if (max_pd_disks > MFI_MAX_SYS_PDS) {
  864. max_pd_disks = MFI_MAX_SYS_PDS;
  865. }
  866. QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
  867. SCSIDevice *sdev = SCSI_DEVICE(kid->child);
  868. uint16_t pd_id;
  869. if (num_pd_disks >= max_pd_disks)
  870. break;
  871. pd_id = ((sdev->id & 0xFF) << 8) | (sdev->lun & 0xFF);
  872. info.addr[num_pd_disks].device_id = cpu_to_le16(pd_id);
  873. info.addr[num_pd_disks].encl_device_id = 0xFFFF;
  874. info.addr[num_pd_disks].encl_index = 0;
  875. info.addr[num_pd_disks].slot_number = sdev->id & 0xFF;
  876. info.addr[num_pd_disks].scsi_dev_type = sdev->type;
  877. info.addr[num_pd_disks].connect_port_bitmap = 0x1;
  878. info.addr[num_pd_disks].sas_addr[0] =
  879. cpu_to_le64(megasas_get_sata_addr(pd_id));
  880. num_pd_disks++;
  881. offset += sizeof(struct mfi_pd_address);
  882. }
  883. trace_megasas_dcmd_pd_get_list(cmd->index, num_pd_disks,
  884. max_pd_disks, offset);
  885. info.size = cpu_to_le32(offset);
  886. info.count = cpu_to_le32(num_pd_disks);
  887. cmd->iov_size -= dma_buf_read((uint8_t *)&info, offset, &cmd->qsg);
  888. return MFI_STAT_OK;
  889. }
  890. static int megasas_dcmd_pd_list_query(MegasasState *s, MegasasCmd *cmd)
  891. {
  892. uint16_t flags;
  893. /* mbox0 contains flags */
  894. flags = le16_to_cpu(cmd->frame->dcmd.mbox[0]);
  895. trace_megasas_dcmd_pd_list_query(cmd->index, flags);
  896. if (flags == MR_PD_QUERY_TYPE_ALL ||
  897. megasas_is_jbod(s)) {
  898. return megasas_dcmd_pd_get_list(s, cmd);
  899. }
  900. return MFI_STAT_OK;
  901. }
  902. static int megasas_pd_get_info_submit(SCSIDevice *sdev, int lun,
  903. MegasasCmd *cmd)
  904. {
  905. struct mfi_pd_info *info = cmd->iov_buf;
  906. size_t dcmd_size = sizeof(struct mfi_pd_info);
  907. uint64_t pd_size;
  908. uint16_t pd_id = ((sdev->id & 0xFF) << 8) | (lun & 0xFF);
  909. uint8_t cmdbuf[6];
  910. size_t len, resid;
  911. if (!cmd->iov_buf) {
  912. cmd->iov_buf = g_malloc0(dcmd_size);
  913. info = cmd->iov_buf;
  914. info->inquiry_data[0] = 0x7f; /* Force PQual 0x3, PType 0x1f */
  915. info->vpd_page83[0] = 0x7f;
  916. megasas_setup_inquiry(cmdbuf, 0, sizeof(info->inquiry_data));
  917. cmd->req = scsi_req_new(sdev, cmd->index, lun, cmdbuf, cmd);
  918. if (!cmd->req) {
  919. trace_megasas_dcmd_req_alloc_failed(cmd->index,
  920. "PD get info std inquiry");
  921. g_free(cmd->iov_buf);
  922. cmd->iov_buf = NULL;
  923. return MFI_STAT_FLASH_ALLOC_FAIL;
  924. }
  925. trace_megasas_dcmd_internal_submit(cmd->index,
  926. "PD get info std inquiry", lun);
  927. len = scsi_req_enqueue(cmd->req);
  928. if (len > 0) {
  929. cmd->iov_size = len;
  930. scsi_req_continue(cmd->req);
  931. }
  932. return MFI_STAT_INVALID_STATUS;
  933. } else if (info->inquiry_data[0] != 0x7f && info->vpd_page83[0] == 0x7f) {
  934. megasas_setup_inquiry(cmdbuf, 0x83, sizeof(info->vpd_page83));
  935. cmd->req = scsi_req_new(sdev, cmd->index, lun, cmdbuf, cmd);
  936. if (!cmd->req) {
  937. trace_megasas_dcmd_req_alloc_failed(cmd->index,
  938. "PD get info vpd inquiry");
  939. return MFI_STAT_FLASH_ALLOC_FAIL;
  940. }
  941. trace_megasas_dcmd_internal_submit(cmd->index,
  942. "PD get info vpd inquiry", lun);
  943. len = scsi_req_enqueue(cmd->req);
  944. if (len > 0) {
  945. cmd->iov_size = len;
  946. scsi_req_continue(cmd->req);
  947. }
  948. return MFI_STAT_INVALID_STATUS;
  949. }
  950. /* Finished, set FW state */
  951. if ((info->inquiry_data[0] >> 5) == 0) {
  952. if (megasas_is_jbod(cmd->state)) {
  953. info->fw_state = cpu_to_le16(MFI_PD_STATE_SYSTEM);
  954. } else {
  955. info->fw_state = cpu_to_le16(MFI_PD_STATE_ONLINE);
  956. }
  957. } else {
  958. info->fw_state = cpu_to_le16(MFI_PD_STATE_OFFLINE);
  959. }
  960. info->ref.v.device_id = cpu_to_le16(pd_id);
  961. info->state.ddf.pd_type = cpu_to_le16(MFI_PD_DDF_TYPE_IN_VD|
  962. MFI_PD_DDF_TYPE_INTF_SAS);
  963. blk_get_geometry(sdev->conf.blk, &pd_size);
  964. info->raw_size = cpu_to_le64(pd_size);
  965. info->non_coerced_size = cpu_to_le64(pd_size);
  966. info->coerced_size = cpu_to_le64(pd_size);
  967. info->encl_device_id = 0xFFFF;
  968. info->slot_number = (sdev->id & 0xFF);
  969. info->path_info.count = 1;
  970. info->path_info.sas_addr[0] =
  971. cpu_to_le64(megasas_get_sata_addr(pd_id));
  972. info->connected_port_bitmap = 0x1;
  973. info->device_speed = 1;
  974. info->link_speed = 1;
  975. resid = dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg);
  976. g_free(cmd->iov_buf);
  977. cmd->iov_size = dcmd_size - resid;
  978. cmd->iov_buf = NULL;
  979. return MFI_STAT_OK;
  980. }
  981. static int megasas_dcmd_pd_get_info(MegasasState *s, MegasasCmd *cmd)
  982. {
  983. size_t dcmd_size = sizeof(struct mfi_pd_info);
  984. uint16_t pd_id;
  985. uint8_t target_id, lun_id;
  986. SCSIDevice *sdev = NULL;
  987. int retval = MFI_STAT_DEVICE_NOT_FOUND;
  988. if (cmd->iov_size < dcmd_size) {
  989. return MFI_STAT_INVALID_PARAMETER;
  990. }
  991. /* mbox0 has the ID */
  992. pd_id = le16_to_cpu(cmd->frame->dcmd.mbox[0]);
  993. target_id = (pd_id >> 8) & 0xFF;
  994. lun_id = pd_id & 0xFF;
  995. sdev = scsi_device_find(&s->bus, 0, target_id, lun_id);
  996. trace_megasas_dcmd_pd_get_info(cmd->index, pd_id);
  997. if (sdev) {
  998. /* Submit inquiry */
  999. retval = megasas_pd_get_info_submit(sdev, pd_id, cmd);
  1000. }
  1001. return retval;
  1002. }
  1003. static int megasas_dcmd_ld_get_list(MegasasState *s, MegasasCmd *cmd)
  1004. {
  1005. struct mfi_ld_list info;
  1006. size_t dcmd_size = sizeof(info), resid;
  1007. uint32_t num_ld_disks = 0, max_ld_disks;
  1008. uint64_t ld_size;
  1009. BusChild *kid;
  1010. memset(&info, 0, dcmd_size);
  1011. if (cmd->iov_size > dcmd_size) {
  1012. trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
  1013. dcmd_size);
  1014. return MFI_STAT_INVALID_PARAMETER;
  1015. }
  1016. max_ld_disks = (cmd->iov_size - 8) / 16;
  1017. if (megasas_is_jbod(s)) {
  1018. max_ld_disks = 0;
  1019. }
  1020. if (max_ld_disks > MFI_MAX_LD) {
  1021. max_ld_disks = MFI_MAX_LD;
  1022. }
  1023. QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
  1024. SCSIDevice *sdev = SCSI_DEVICE(kid->child);
  1025. if (num_ld_disks >= max_ld_disks) {
  1026. break;
  1027. }
  1028. /* Logical device size is in blocks */
  1029. blk_get_geometry(sdev->conf.blk, &ld_size);
  1030. info.ld_list[num_ld_disks].ld.v.target_id = sdev->id;
  1031. info.ld_list[num_ld_disks].state = MFI_LD_STATE_OPTIMAL;
  1032. info.ld_list[num_ld_disks].size = cpu_to_le64(ld_size);
  1033. num_ld_disks++;
  1034. }
  1035. info.ld_count = cpu_to_le32(num_ld_disks);
  1036. trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks);
  1037. resid = dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
  1038. cmd->iov_size = dcmd_size - resid;
  1039. return MFI_STAT_OK;
  1040. }
  1041. static int megasas_dcmd_ld_list_query(MegasasState *s, MegasasCmd *cmd)
  1042. {
  1043. uint16_t flags;
  1044. struct mfi_ld_targetid_list info;
  1045. size_t dcmd_size = sizeof(info), resid;
  1046. uint32_t num_ld_disks = 0, max_ld_disks = s->fw_luns;
  1047. BusChild *kid;
  1048. /* mbox0 contains flags */
  1049. flags = le16_to_cpu(cmd->frame->dcmd.mbox[0]);
  1050. trace_megasas_dcmd_ld_list_query(cmd->index, flags);
  1051. if (flags != MR_LD_QUERY_TYPE_ALL &&
  1052. flags != MR_LD_QUERY_TYPE_EXPOSED_TO_HOST) {
  1053. max_ld_disks = 0;
  1054. }
  1055. memset(&info, 0, dcmd_size);
  1056. if (cmd->iov_size < 12) {
  1057. trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
  1058. dcmd_size);
  1059. return MFI_STAT_INVALID_PARAMETER;
  1060. }
  1061. dcmd_size = sizeof(uint32_t) * 2 + 3;
  1062. max_ld_disks = cmd->iov_size - dcmd_size;
  1063. if (megasas_is_jbod(s)) {
  1064. max_ld_disks = 0;
  1065. }
  1066. if (max_ld_disks > MFI_MAX_LD) {
  1067. max_ld_disks = MFI_MAX_LD;
  1068. }
  1069. QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
  1070. SCSIDevice *sdev = SCSI_DEVICE(kid->child);
  1071. if (num_ld_disks >= max_ld_disks) {
  1072. break;
  1073. }
  1074. info.targetid[num_ld_disks] = sdev->lun;
  1075. num_ld_disks++;
  1076. dcmd_size++;
  1077. }
  1078. info.ld_count = cpu_to_le32(num_ld_disks);
  1079. info.size = dcmd_size;
  1080. trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks);
  1081. resid = dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
  1082. cmd->iov_size = dcmd_size - resid;
  1083. return MFI_STAT_OK;
  1084. }
  1085. static int megasas_ld_get_info_submit(SCSIDevice *sdev, int lun,
  1086. MegasasCmd *cmd)
  1087. {
  1088. struct mfi_ld_info *info = cmd->iov_buf;
  1089. size_t dcmd_size = sizeof(struct mfi_ld_info);
  1090. uint8_t cdb[6];
  1091. ssize_t len, resid;
  1092. uint16_t sdev_id = ((sdev->id & 0xFF) << 8) | (lun & 0xFF);
  1093. uint64_t ld_size;
  1094. if (!cmd->iov_buf) {
  1095. cmd->iov_buf = g_malloc0(dcmd_size);
  1096. info = cmd->iov_buf;
  1097. megasas_setup_inquiry(cdb, 0x83, sizeof(info->vpd_page83));
  1098. cmd->req = scsi_req_new(sdev, cmd->index, lun, cdb, cmd);
  1099. if (!cmd->req) {
  1100. trace_megasas_dcmd_req_alloc_failed(cmd->index,
  1101. "LD get info vpd inquiry");
  1102. g_free(cmd->iov_buf);
  1103. cmd->iov_buf = NULL;
  1104. return MFI_STAT_FLASH_ALLOC_FAIL;
  1105. }
  1106. trace_megasas_dcmd_internal_submit(cmd->index,
  1107. "LD get info vpd inquiry", lun);
  1108. len = scsi_req_enqueue(cmd->req);
  1109. if (len > 0) {
  1110. cmd->iov_size = len;
  1111. scsi_req_continue(cmd->req);
  1112. }
  1113. return MFI_STAT_INVALID_STATUS;
  1114. }
  1115. info->ld_config.params.state = MFI_LD_STATE_OPTIMAL;
  1116. info->ld_config.properties.ld.v.target_id = lun;
  1117. info->ld_config.params.stripe_size = 3;
  1118. info->ld_config.params.num_drives = 1;
  1119. info->ld_config.params.is_consistent = 1;
  1120. /* Logical device size is in blocks */
  1121. blk_get_geometry(sdev->conf.blk, &ld_size);
  1122. info->size = cpu_to_le64(ld_size);
  1123. memset(info->ld_config.span, 0, sizeof(info->ld_config.span));
  1124. info->ld_config.span[0].start_block = 0;
  1125. info->ld_config.span[0].num_blocks = info->size;
  1126. info->ld_config.span[0].array_ref = cpu_to_le16(sdev_id);
  1127. resid = dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg);
  1128. g_free(cmd->iov_buf);
  1129. cmd->iov_size = dcmd_size - resid;
  1130. cmd->iov_buf = NULL;
  1131. return MFI_STAT_OK;
  1132. }
  1133. static int megasas_dcmd_ld_get_info(MegasasState *s, MegasasCmd *cmd)
  1134. {
  1135. struct mfi_ld_info info;
  1136. size_t dcmd_size = sizeof(info);
  1137. uint16_t ld_id;
  1138. uint32_t max_ld_disks = s->fw_luns;
  1139. SCSIDevice *sdev = NULL;
  1140. int retval = MFI_STAT_DEVICE_NOT_FOUND;
  1141. if (cmd->iov_size < dcmd_size) {
  1142. return MFI_STAT_INVALID_PARAMETER;
  1143. }
  1144. /* mbox0 has the ID */
  1145. ld_id = le16_to_cpu(cmd->frame->dcmd.mbox[0]);
  1146. trace_megasas_dcmd_ld_get_info(cmd->index, ld_id);
  1147. if (megasas_is_jbod(s)) {
  1148. return MFI_STAT_DEVICE_NOT_FOUND;
  1149. }
  1150. if (ld_id < max_ld_disks) {
  1151. sdev = scsi_device_find(&s->bus, 0, ld_id, 0);
  1152. }
  1153. if (sdev) {
  1154. retval = megasas_ld_get_info_submit(sdev, ld_id, cmd);
  1155. }
  1156. return retval;
  1157. }
  1158. static int megasas_dcmd_cfg_read(MegasasState *s, MegasasCmd *cmd)
  1159. {
  1160. uint8_t data[4096] = { 0 };
  1161. struct mfi_config_data *info;
  1162. int num_pd_disks = 0, array_offset, ld_offset;
  1163. BusChild *kid;
  1164. if (cmd->iov_size > 4096) {
  1165. return MFI_STAT_INVALID_PARAMETER;
  1166. }
  1167. QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
  1168. num_pd_disks++;
  1169. }
  1170. info = (struct mfi_config_data *)&data;
  1171. /*
  1172. * Array mapping:
  1173. * - One array per SCSI device
  1174. * - One logical drive per SCSI device
  1175. * spanning the entire device
  1176. */
  1177. info->array_count = num_pd_disks;
  1178. info->array_size = sizeof(struct mfi_array) * num_pd_disks;
  1179. info->log_drv_count = num_pd_disks;
  1180. info->log_drv_size = sizeof(struct mfi_ld_config) * num_pd_disks;
  1181. info->spares_count = 0;
  1182. info->spares_size = sizeof(struct mfi_spare);
  1183. info->size = sizeof(struct mfi_config_data) + info->array_size +
  1184. info->log_drv_size;
  1185. if (info->size > 4096) {
  1186. return MFI_STAT_INVALID_PARAMETER;
  1187. }
  1188. array_offset = sizeof(struct mfi_config_data);
  1189. ld_offset = array_offset + sizeof(struct mfi_array) * num_pd_disks;
  1190. QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
  1191. SCSIDevice *sdev = SCSI_DEVICE(kid->child);
  1192. uint16_t sdev_id = ((sdev->id & 0xFF) << 8) | (sdev->lun & 0xFF);
  1193. struct mfi_array *array;
  1194. struct mfi_ld_config *ld;
  1195. uint64_t pd_size;
  1196. int i;
  1197. array = (struct mfi_array *)(data + array_offset);
  1198. blk_get_geometry(sdev->conf.blk, &pd_size);
  1199. array->size = cpu_to_le64(pd_size);
  1200. array->num_drives = 1;
  1201. array->array_ref = cpu_to_le16(sdev_id);
  1202. array->pd[0].ref.v.device_id = cpu_to_le16(sdev_id);
  1203. array->pd[0].ref.v.seq_num = 0;
  1204. array->pd[0].fw_state = MFI_PD_STATE_ONLINE;
  1205. array->pd[0].encl.pd = 0xFF;
  1206. array->pd[0].encl.slot = (sdev->id & 0xFF);
  1207. for (i = 1; i < MFI_MAX_ROW_SIZE; i++) {
  1208. array->pd[i].ref.v.device_id = 0xFFFF;
  1209. array->pd[i].ref.v.seq_num = 0;
  1210. array->pd[i].fw_state = MFI_PD_STATE_UNCONFIGURED_GOOD;
  1211. array->pd[i].encl.pd = 0xFF;
  1212. array->pd[i].encl.slot = 0xFF;
  1213. }
  1214. array_offset += sizeof(struct mfi_array);
  1215. ld = (struct mfi_ld_config *)(data + ld_offset);
  1216. memset(ld, 0, sizeof(struct mfi_ld_config));
  1217. ld->properties.ld.v.target_id = sdev->id;
  1218. ld->properties.default_cache_policy = MR_LD_CACHE_READ_AHEAD |
  1219. MR_LD_CACHE_READ_ADAPTIVE;
  1220. ld->properties.current_cache_policy = MR_LD_CACHE_READ_AHEAD |
  1221. MR_LD_CACHE_READ_ADAPTIVE;
  1222. ld->params.state = MFI_LD_STATE_OPTIMAL;
  1223. ld->params.stripe_size = 3;
  1224. ld->params.num_drives = 1;
  1225. ld->params.span_depth = 1;
  1226. ld->params.is_consistent = 1;
  1227. ld->span[0].start_block = 0;
  1228. ld->span[0].num_blocks = cpu_to_le64(pd_size);
  1229. ld->span[0].array_ref = cpu_to_le16(sdev_id);
  1230. ld_offset += sizeof(struct mfi_ld_config);
  1231. }
  1232. cmd->iov_size -= dma_buf_read((uint8_t *)data, info->size, &cmd->qsg);
  1233. return MFI_STAT_OK;
  1234. }
  1235. static int megasas_dcmd_get_properties(MegasasState *s, MegasasCmd *cmd)
  1236. {
  1237. struct mfi_ctrl_props info;
  1238. size_t dcmd_size = sizeof(info);
  1239. memset(&info, 0x0, dcmd_size);
  1240. if (cmd->iov_size < dcmd_size) {
  1241. trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
  1242. dcmd_size);
  1243. return MFI_STAT_INVALID_PARAMETER;
  1244. }
  1245. info.pred_fail_poll_interval = cpu_to_le16(300);
  1246. info.intr_throttle_cnt = cpu_to_le16(16);
  1247. info.intr_throttle_timeout = cpu_to_le16(50);
  1248. info.rebuild_rate = 30;
  1249. info.patrol_read_rate = 30;
  1250. info.bgi_rate = 30;
  1251. info.cc_rate = 30;
  1252. info.recon_rate = 30;
  1253. info.cache_flush_interval = 4;
  1254. info.spinup_drv_cnt = 2;
  1255. info.spinup_delay = 6;
  1256. info.ecc_bucket_size = 15;
  1257. info.ecc_bucket_leak_rate = cpu_to_le16(1440);
  1258. info.expose_encl_devices = 1;
  1259. cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
  1260. return MFI_STAT_OK;
  1261. }
  1262. static int megasas_cache_flush(MegasasState *s, MegasasCmd *cmd)
  1263. {
  1264. blk_drain_all();
  1265. return MFI_STAT_OK;
  1266. }
  1267. static int megasas_ctrl_shutdown(MegasasState *s, MegasasCmd *cmd)
  1268. {
  1269. s->fw_state = MFI_FWSTATE_READY;
  1270. return MFI_STAT_OK;
  1271. }
  1272. /* Some implementations use CLUSTER RESET LD to simulate a device reset */
  1273. static int megasas_cluster_reset_ld(MegasasState *s, MegasasCmd *cmd)
  1274. {
  1275. uint16_t target_id;
  1276. int i;
  1277. /* mbox0 contains the device index */
  1278. target_id = le16_to_cpu(cmd->frame->dcmd.mbox[0]);
  1279. trace_megasas_dcmd_reset_ld(cmd->index, target_id);
  1280. for (i = 0; i < s->fw_cmds; i++) {
  1281. MegasasCmd *tmp_cmd = &s->frames[i];
  1282. if (tmp_cmd->req && tmp_cmd->req->dev->id == target_id) {
  1283. SCSIDevice *d = tmp_cmd->req->dev;
  1284. qdev_reset_all(&d->qdev);
  1285. }
  1286. }
  1287. return MFI_STAT_OK;
  1288. }
  1289. static int megasas_dcmd_set_properties(MegasasState *s, MegasasCmd *cmd)
  1290. {
  1291. struct mfi_ctrl_props info;
  1292. size_t dcmd_size = sizeof(info);
  1293. if (cmd->iov_size < dcmd_size) {
  1294. trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
  1295. dcmd_size);
  1296. return MFI_STAT_INVALID_PARAMETER;
  1297. }
  1298. dma_buf_write((uint8_t *)&info, dcmd_size, &cmd->qsg);
  1299. trace_megasas_dcmd_unsupported(cmd->index, cmd->iov_size);
  1300. return MFI_STAT_OK;
  1301. }
  1302. static int megasas_dcmd_dummy(MegasasState *s, MegasasCmd *cmd)
  1303. {
  1304. trace_megasas_dcmd_dummy(cmd->index, cmd->iov_size);
  1305. return MFI_STAT_OK;
  1306. }
  1307. static const struct dcmd_cmd_tbl_t {
  1308. int opcode;
  1309. const char *desc;
  1310. int (*func)(MegasasState *s, MegasasCmd *cmd);
  1311. } dcmd_cmd_tbl[] = {
  1312. { MFI_DCMD_CTRL_MFI_HOST_MEM_ALLOC, "CTRL_HOST_MEM_ALLOC",
  1313. megasas_dcmd_dummy },
  1314. { MFI_DCMD_CTRL_GET_INFO, "CTRL_GET_INFO",
  1315. megasas_ctrl_get_info },
  1316. { MFI_DCMD_CTRL_GET_PROPERTIES, "CTRL_GET_PROPERTIES",
  1317. megasas_dcmd_get_properties },
  1318. { MFI_DCMD_CTRL_SET_PROPERTIES, "CTRL_SET_PROPERTIES",
  1319. megasas_dcmd_set_properties },
  1320. { MFI_DCMD_CTRL_ALARM_GET, "CTRL_ALARM_GET",
  1321. megasas_dcmd_dummy },
  1322. { MFI_DCMD_CTRL_ALARM_ENABLE, "CTRL_ALARM_ENABLE",
  1323. megasas_dcmd_dummy },
  1324. { MFI_DCMD_CTRL_ALARM_DISABLE, "CTRL_ALARM_DISABLE",
  1325. megasas_dcmd_dummy },
  1326. { MFI_DCMD_CTRL_ALARM_SILENCE, "CTRL_ALARM_SILENCE",
  1327. megasas_dcmd_dummy },
  1328. { MFI_DCMD_CTRL_ALARM_TEST, "CTRL_ALARM_TEST",
  1329. megasas_dcmd_dummy },
  1330. { MFI_DCMD_CTRL_EVENT_GETINFO, "CTRL_EVENT_GETINFO",
  1331. megasas_event_info },
  1332. { MFI_DCMD_CTRL_EVENT_GET, "CTRL_EVENT_GET",
  1333. megasas_dcmd_dummy },
  1334. { MFI_DCMD_CTRL_EVENT_WAIT, "CTRL_EVENT_WAIT",
  1335. megasas_event_wait },
  1336. { MFI_DCMD_CTRL_SHUTDOWN, "CTRL_SHUTDOWN",
  1337. megasas_ctrl_shutdown },
  1338. { MFI_DCMD_HIBERNATE_STANDBY, "CTRL_STANDBY",
  1339. megasas_dcmd_dummy },
  1340. { MFI_DCMD_CTRL_GET_TIME, "CTRL_GET_TIME",
  1341. megasas_dcmd_get_fw_time },
  1342. { MFI_DCMD_CTRL_SET_TIME, "CTRL_SET_TIME",
  1343. megasas_dcmd_set_fw_time },
  1344. { MFI_DCMD_CTRL_BIOS_DATA_GET, "CTRL_BIOS_DATA_GET",
  1345. megasas_dcmd_get_bios_info },
  1346. { MFI_DCMD_CTRL_FACTORY_DEFAULTS, "CTRL_FACTORY_DEFAULTS",
  1347. megasas_dcmd_dummy },
  1348. { MFI_DCMD_CTRL_MFC_DEFAULTS_GET, "CTRL_MFC_DEFAULTS_GET",
  1349. megasas_mfc_get_defaults },
  1350. { MFI_DCMD_CTRL_MFC_DEFAULTS_SET, "CTRL_MFC_DEFAULTS_SET",
  1351. megasas_dcmd_dummy },
  1352. { MFI_DCMD_CTRL_CACHE_FLUSH, "CTRL_CACHE_FLUSH",
  1353. megasas_cache_flush },
  1354. { MFI_DCMD_PD_GET_LIST, "PD_GET_LIST",
  1355. megasas_dcmd_pd_get_list },
  1356. { MFI_DCMD_PD_LIST_QUERY, "PD_LIST_QUERY",
  1357. megasas_dcmd_pd_list_query },
  1358. { MFI_DCMD_PD_GET_INFO, "PD_GET_INFO",
  1359. megasas_dcmd_pd_get_info },
  1360. { MFI_DCMD_PD_STATE_SET, "PD_STATE_SET",
  1361. megasas_dcmd_dummy },
  1362. { MFI_DCMD_PD_REBUILD, "PD_REBUILD",
  1363. megasas_dcmd_dummy },
  1364. { MFI_DCMD_PD_BLINK, "PD_BLINK",
  1365. megasas_dcmd_dummy },
  1366. { MFI_DCMD_PD_UNBLINK, "PD_UNBLINK",
  1367. megasas_dcmd_dummy },
  1368. { MFI_DCMD_LD_GET_LIST, "LD_GET_LIST",
  1369. megasas_dcmd_ld_get_list},
  1370. { MFI_DCMD_LD_LIST_QUERY, "LD_LIST_QUERY",
  1371. megasas_dcmd_ld_list_query },
  1372. { MFI_DCMD_LD_GET_INFO, "LD_GET_INFO",
  1373. megasas_dcmd_ld_get_info },
  1374. { MFI_DCMD_LD_GET_PROP, "LD_GET_PROP",
  1375. megasas_dcmd_dummy },
  1376. { MFI_DCMD_LD_SET_PROP, "LD_SET_PROP",
  1377. megasas_dcmd_dummy },
  1378. { MFI_DCMD_LD_DELETE, "LD_DELETE",
  1379. megasas_dcmd_dummy },
  1380. { MFI_DCMD_CFG_READ, "CFG_READ",
  1381. megasas_dcmd_cfg_read },
  1382. { MFI_DCMD_CFG_ADD, "CFG_ADD",
  1383. megasas_dcmd_dummy },
  1384. { MFI_DCMD_CFG_CLEAR, "CFG_CLEAR",
  1385. megasas_dcmd_dummy },
  1386. { MFI_DCMD_CFG_FOREIGN_READ, "CFG_FOREIGN_READ",
  1387. megasas_dcmd_dummy },
  1388. { MFI_DCMD_CFG_FOREIGN_IMPORT, "CFG_FOREIGN_IMPORT",
  1389. megasas_dcmd_dummy },
  1390. { MFI_DCMD_BBU_STATUS, "BBU_STATUS",
  1391. megasas_dcmd_dummy },
  1392. { MFI_DCMD_BBU_CAPACITY_INFO, "BBU_CAPACITY_INFO",
  1393. megasas_dcmd_dummy },
  1394. { MFI_DCMD_BBU_DESIGN_INFO, "BBU_DESIGN_INFO",
  1395. megasas_dcmd_dummy },
  1396. { MFI_DCMD_BBU_PROP_GET, "BBU_PROP_GET",
  1397. megasas_dcmd_dummy },
  1398. { MFI_DCMD_CLUSTER, "CLUSTER",
  1399. megasas_dcmd_dummy },
  1400. { MFI_DCMD_CLUSTER_RESET_ALL, "CLUSTER_RESET_ALL",
  1401. megasas_dcmd_dummy },
  1402. { MFI_DCMD_CLUSTER_RESET_LD, "CLUSTER_RESET_LD",
  1403. megasas_cluster_reset_ld },
  1404. { -1, NULL, NULL }
  1405. };
  1406. static int megasas_handle_dcmd(MegasasState *s, MegasasCmd *cmd)
  1407. {
  1408. int retval = 0;
  1409. size_t len;
  1410. const struct dcmd_cmd_tbl_t *cmdptr = dcmd_cmd_tbl;
  1411. cmd->dcmd_opcode = le32_to_cpu(cmd->frame->dcmd.opcode);
  1412. trace_megasas_handle_dcmd(cmd->index, cmd->dcmd_opcode);
  1413. if (megasas_map_dcmd(s, cmd) < 0) {
  1414. return MFI_STAT_MEMORY_NOT_AVAILABLE;
  1415. }
  1416. while (cmdptr->opcode != -1 && cmdptr->opcode != cmd->dcmd_opcode) {
  1417. cmdptr++;
  1418. }
  1419. len = cmd->iov_size;
  1420. if (cmdptr->opcode == -1) {
  1421. trace_megasas_dcmd_unhandled(cmd->index, cmd->dcmd_opcode, len);
  1422. retval = megasas_dcmd_dummy(s, cmd);
  1423. } else {
  1424. trace_megasas_dcmd_enter(cmd->index, cmdptr->desc, len);
  1425. retval = cmdptr->func(s, cmd);
  1426. }
  1427. if (retval != MFI_STAT_INVALID_STATUS) {
  1428. megasas_finish_dcmd(cmd, len);
  1429. }
  1430. return retval;
  1431. }
  1432. static int megasas_finish_internal_dcmd(MegasasCmd *cmd,
  1433. SCSIRequest *req, size_t resid)
  1434. {
  1435. int retval = MFI_STAT_OK;
  1436. int lun = req->lun;
  1437. trace_megasas_dcmd_internal_finish(cmd->index, cmd->dcmd_opcode, lun);
  1438. cmd->iov_size -= resid;
  1439. switch (cmd->dcmd_opcode) {
  1440. case MFI_DCMD_PD_GET_INFO:
  1441. retval = megasas_pd_get_info_submit(req->dev, lun, cmd);
  1442. break;
  1443. case MFI_DCMD_LD_GET_INFO:
  1444. retval = megasas_ld_get_info_submit(req->dev, lun, cmd);
  1445. break;
  1446. default:
  1447. trace_megasas_dcmd_internal_invalid(cmd->index, cmd->dcmd_opcode);
  1448. retval = MFI_STAT_INVALID_DCMD;
  1449. break;
  1450. }
  1451. if (retval != MFI_STAT_INVALID_STATUS) {
  1452. megasas_finish_dcmd(cmd, cmd->iov_size);
  1453. }
  1454. return retval;
  1455. }
  1456. static int megasas_enqueue_req(MegasasCmd *cmd, bool is_write)
  1457. {
  1458. int len;
  1459. len = scsi_req_enqueue(cmd->req);
  1460. if (len < 0) {
  1461. len = -len;
  1462. }
  1463. if (len > 0) {
  1464. if (len > cmd->iov_size) {
  1465. if (is_write) {
  1466. trace_megasas_iov_write_overflow(cmd->index, len,
  1467. cmd->iov_size);
  1468. } else {
  1469. trace_megasas_iov_read_overflow(cmd->index, len,
  1470. cmd->iov_size);
  1471. }
  1472. }
  1473. if (len < cmd->iov_size) {
  1474. if (is_write) {
  1475. trace_megasas_iov_write_underflow(cmd->index, len,
  1476. cmd->iov_size);
  1477. } else {
  1478. trace_megasas_iov_read_underflow(cmd->index, len,
  1479. cmd->iov_size);
  1480. }
  1481. cmd->iov_size = len;
  1482. }
  1483. scsi_req_continue(cmd->req);
  1484. }
  1485. return len;
  1486. }
  1487. static int megasas_handle_scsi(MegasasState *s, MegasasCmd *cmd,
  1488. int frame_cmd)
  1489. {
  1490. uint8_t *cdb;
  1491. int target_id, lun_id, cdb_len;
  1492. bool is_write;
  1493. struct SCSIDevice *sdev = NULL;
  1494. bool is_logical = (frame_cmd == MFI_CMD_LD_SCSI_IO);
  1495. cdb = cmd->frame->pass.cdb;
  1496. target_id = cmd->frame->header.target_id;
  1497. lun_id = cmd->frame->header.lun_id;
  1498. cdb_len = cmd->frame->header.cdb_len;
  1499. if (is_logical) {
  1500. if (target_id >= MFI_MAX_LD || lun_id != 0) {
  1501. trace_megasas_scsi_target_not_present(
  1502. mfi_frame_desc[frame_cmd], is_logical, target_id, lun_id);
  1503. return MFI_STAT_DEVICE_NOT_FOUND;
  1504. }
  1505. }
  1506. sdev = scsi_device_find(&s->bus, 0, target_id, lun_id);
  1507. cmd->iov_size = le32_to_cpu(cmd->frame->header.data_len);
  1508. trace_megasas_handle_scsi(mfi_frame_desc[frame_cmd], is_logical,
  1509. target_id, lun_id, sdev, cmd->iov_size);
  1510. if (!sdev || (megasas_is_jbod(s) && is_logical)) {
  1511. trace_megasas_scsi_target_not_present(
  1512. mfi_frame_desc[frame_cmd], is_logical, target_id, lun_id);
  1513. return MFI_STAT_DEVICE_NOT_FOUND;
  1514. }
  1515. if (cdb_len > 16) {
  1516. trace_megasas_scsi_invalid_cdb_len(
  1517. mfi_frame_desc[frame_cmd], is_logical,
  1518. target_id, lun_id, cdb_len);
  1519. megasas_write_sense(cmd, SENSE_CODE(INVALID_OPCODE));
  1520. cmd->frame->header.scsi_status = CHECK_CONDITION;
  1521. s->event_count++;
  1522. return MFI_STAT_SCSI_DONE_WITH_ERROR;
  1523. }
  1524. if (megasas_map_sgl(s, cmd, &cmd->frame->pass.sgl)) {
  1525. megasas_write_sense(cmd, SENSE_CODE(TARGET_FAILURE));
  1526. cmd->frame->header.scsi_status = CHECK_CONDITION;
  1527. s->event_count++;
  1528. return MFI_STAT_SCSI_DONE_WITH_ERROR;
  1529. }
  1530. cmd->req = scsi_req_new(sdev, cmd->index, lun_id, cdb, cmd);
  1531. if (!cmd->req) {
  1532. trace_megasas_scsi_req_alloc_failed(
  1533. mfi_frame_desc[frame_cmd], target_id, lun_id);
  1534. megasas_write_sense(cmd, SENSE_CODE(NO_SENSE));
  1535. cmd->frame->header.scsi_status = BUSY;
  1536. s->event_count++;
  1537. return MFI_STAT_SCSI_DONE_WITH_ERROR;
  1538. }
  1539. is_write = (cmd->req->cmd.mode == SCSI_XFER_TO_DEV);
  1540. if (cmd->iov_size) {
  1541. if (is_write) {
  1542. trace_megasas_scsi_write_start(cmd->index, cmd->iov_size);
  1543. } else {
  1544. trace_megasas_scsi_read_start(cmd->index, cmd->iov_size);
  1545. }
  1546. } else {
  1547. trace_megasas_scsi_nodata(cmd->index);
  1548. }
  1549. megasas_enqueue_req(cmd, is_write);
  1550. return MFI_STAT_INVALID_STATUS;
  1551. }
  1552. static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd)
  1553. {
  1554. uint32_t lba_count, lba_start_hi, lba_start_lo;
  1555. uint64_t lba_start;
  1556. bool is_write = (frame_cmd == MFI_CMD_LD_WRITE);
  1557. uint8_t cdb[16];
  1558. int len;
  1559. struct SCSIDevice *sdev = NULL;
  1560. int target_id, lun_id, cdb_len;
  1561. lba_count = le32_to_cpu(cmd->frame->io.header.data_len);
  1562. lba_start_lo = le32_to_cpu(cmd->frame->io.lba_lo);
  1563. lba_start_hi = le32_to_cpu(cmd->frame->io.lba_hi);
  1564. lba_start = ((uint64_t)lba_start_hi << 32) | lba_start_lo;
  1565. target_id = cmd->frame->header.target_id;
  1566. lun_id = cmd->frame->header.lun_id;
  1567. cdb_len = cmd->frame->header.cdb_len;
  1568. if (target_id < MFI_MAX_LD && lun_id == 0) {
  1569. sdev = scsi_device_find(&s->bus, 0, target_id, lun_id);
  1570. }
  1571. trace_megasas_handle_io(cmd->index,
  1572. mfi_frame_desc[frame_cmd], target_id, lun_id,
  1573. (unsigned long)lba_start, (unsigned long)lba_count);
  1574. if (!sdev) {
  1575. trace_megasas_io_target_not_present(cmd->index,
  1576. mfi_frame_desc[frame_cmd], target_id, lun_id);
  1577. return MFI_STAT_DEVICE_NOT_FOUND;
  1578. }
  1579. if (cdb_len > 16) {
  1580. trace_megasas_scsi_invalid_cdb_len(
  1581. mfi_frame_desc[frame_cmd], 1, target_id, lun_id, cdb_len);
  1582. megasas_write_sense(cmd, SENSE_CODE(INVALID_OPCODE));
  1583. cmd->frame->header.scsi_status = CHECK_CONDITION;
  1584. s->event_count++;
  1585. return MFI_STAT_SCSI_DONE_WITH_ERROR;
  1586. }
  1587. cmd->iov_size = lba_count * sdev->blocksize;
  1588. if (megasas_map_sgl(s, cmd, &cmd->frame->io.sgl)) {
  1589. megasas_write_sense(cmd, SENSE_CODE(TARGET_FAILURE));
  1590. cmd->frame->header.scsi_status = CHECK_CONDITION;
  1591. s->event_count++;
  1592. return MFI_STAT_SCSI_DONE_WITH_ERROR;
  1593. }
  1594. megasas_encode_lba(cdb, lba_start, lba_count, is_write);
  1595. cmd->req = scsi_req_new(sdev, cmd->index,
  1596. lun_id, cdb, cmd);
  1597. if (!cmd->req) {
  1598. trace_megasas_scsi_req_alloc_failed(
  1599. mfi_frame_desc[frame_cmd], target_id, lun_id);
  1600. megasas_write_sense(cmd, SENSE_CODE(NO_SENSE));
  1601. cmd->frame->header.scsi_status = BUSY;
  1602. s->event_count++;
  1603. return MFI_STAT_SCSI_DONE_WITH_ERROR;
  1604. }
  1605. len = megasas_enqueue_req(cmd, is_write);
  1606. if (len > 0) {
  1607. if (is_write) {
  1608. trace_megasas_io_write_start(cmd->index, lba_start, lba_count, len);
  1609. } else {
  1610. trace_megasas_io_read_start(cmd->index, lba_start, lba_count, len);
  1611. }
  1612. }
  1613. return MFI_STAT_INVALID_STATUS;
  1614. }
  1615. static QEMUSGList *megasas_get_sg_list(SCSIRequest *req)
  1616. {
  1617. MegasasCmd *cmd = req->hba_private;
  1618. if (cmd->dcmd_opcode != -1) {
  1619. return NULL;
  1620. } else {
  1621. return &cmd->qsg;
  1622. }
  1623. }
  1624. static void megasas_xfer_complete(SCSIRequest *req, uint32_t len)
  1625. {
  1626. MegasasCmd *cmd = req->hba_private;
  1627. uint8_t *buf;
  1628. trace_megasas_io_complete(cmd->index, len);
  1629. if (cmd->dcmd_opcode != -1) {
  1630. scsi_req_continue(req);
  1631. return;
  1632. }
  1633. buf = scsi_req_get_buf(req);
  1634. if (cmd->dcmd_opcode == MFI_DCMD_PD_GET_INFO && cmd->iov_buf) {
  1635. struct mfi_pd_info *info = cmd->iov_buf;
  1636. if (info->inquiry_data[0] == 0x7f) {
  1637. memset(info->inquiry_data, 0, sizeof(info->inquiry_data));
  1638. memcpy(info->inquiry_data, buf, len);
  1639. } else if (info->vpd_page83[0] == 0x7f) {
  1640. memset(info->vpd_page83, 0, sizeof(info->vpd_page83));
  1641. memcpy(info->vpd_page83, buf, len);
  1642. }
  1643. scsi_req_continue(req);
  1644. } else if (cmd->dcmd_opcode == MFI_DCMD_LD_GET_INFO) {
  1645. struct mfi_ld_info *info = cmd->iov_buf;
  1646. if (cmd->iov_buf) {
  1647. memcpy(info->vpd_page83, buf, sizeof(info->vpd_page83));
  1648. scsi_req_continue(req);
  1649. }
  1650. }
  1651. }
  1652. static void megasas_command_complete(SCSIRequest *req, uint32_t status,
  1653. size_t resid)
  1654. {
  1655. MegasasCmd *cmd = req->hba_private;
  1656. uint8_t cmd_status = MFI_STAT_OK;
  1657. trace_megasas_command_complete(cmd->index, status, resid);
  1658. if (req->io_canceled) {
  1659. return;
  1660. }
  1661. if (cmd->dcmd_opcode != -1) {
  1662. /*
  1663. * Internal command complete
  1664. */
  1665. cmd_status = megasas_finish_internal_dcmd(cmd, req, resid);
  1666. if (cmd_status == MFI_STAT_INVALID_STATUS) {
  1667. return;
  1668. }
  1669. } else {
  1670. req->status = status;
  1671. trace_megasas_scsi_complete(cmd->index, req->status,
  1672. cmd->iov_size, req->cmd.xfer);
  1673. if (req->status != GOOD) {
  1674. cmd_status = MFI_STAT_SCSI_DONE_WITH_ERROR;
  1675. }
  1676. if (req->status == CHECK_CONDITION) {
  1677. megasas_copy_sense(cmd);
  1678. }
  1679. cmd->frame->header.scsi_status = req->status;
  1680. }
  1681. cmd->frame->header.cmd_status = cmd_status;
  1682. megasas_complete_command(cmd);
  1683. }
  1684. static void megasas_command_cancelled(SCSIRequest *req)
  1685. {
  1686. MegasasCmd *cmd = req->hba_private;
  1687. if (!cmd) {
  1688. return;
  1689. }
  1690. cmd->frame->header.cmd_status = MFI_STAT_SCSI_IO_FAILED;
  1691. megasas_complete_command(cmd);
  1692. }
  1693. static int megasas_handle_abort(MegasasState *s, MegasasCmd *cmd)
  1694. {
  1695. uint64_t abort_ctx = le64_to_cpu(cmd->frame->abort.abort_context);
  1696. hwaddr abort_addr, addr_hi, addr_lo;
  1697. MegasasCmd *abort_cmd;
  1698. addr_hi = le32_to_cpu(cmd->frame->abort.abort_mfi_addr_hi);
  1699. addr_lo = le32_to_cpu(cmd->frame->abort.abort_mfi_addr_lo);
  1700. abort_addr = ((uint64_t)addr_hi << 32) | addr_lo;
  1701. abort_cmd = megasas_lookup_frame(s, abort_addr);
  1702. if (!abort_cmd) {
  1703. trace_megasas_abort_no_cmd(cmd->index, abort_ctx);
  1704. s->event_count++;
  1705. return MFI_STAT_OK;
  1706. }
  1707. if (!megasas_use_queue64(s)) {
  1708. abort_ctx &= (uint64_t)0xFFFFFFFF;
  1709. }
  1710. if (abort_cmd->context != abort_ctx) {
  1711. trace_megasas_abort_invalid_context(cmd->index, abort_cmd->context,
  1712. abort_cmd->index);
  1713. s->event_count++;
  1714. return MFI_STAT_ABORT_NOT_POSSIBLE;
  1715. }
  1716. trace_megasas_abort_frame(cmd->index, abort_cmd->index);
  1717. megasas_abort_command(abort_cmd);
  1718. if (!s->event_cmd || abort_cmd != s->event_cmd) {
  1719. s->event_cmd = NULL;
  1720. }
  1721. s->event_count++;
  1722. return MFI_STAT_OK;
  1723. }
  1724. static void megasas_handle_frame(MegasasState *s, uint64_t frame_addr,
  1725. uint32_t frame_count)
  1726. {
  1727. uint8_t frame_status = MFI_STAT_INVALID_CMD;
  1728. uint64_t frame_context;
  1729. int frame_cmd;
  1730. MegasasCmd *cmd;
  1731. /*
  1732. * Always read 64bit context, top bits will be
  1733. * masked out if required in megasas_enqueue_frame()
  1734. */
  1735. frame_context = megasas_frame_get_context(s, frame_addr);
  1736. cmd = megasas_enqueue_frame(s, frame_addr, frame_context, frame_count);
  1737. if (!cmd) {
  1738. /* reply queue full */
  1739. trace_megasas_frame_busy(frame_addr);
  1740. megasas_frame_set_scsi_status(s, frame_addr, BUSY);
  1741. megasas_frame_set_cmd_status(s, frame_addr, MFI_STAT_SCSI_DONE_WITH_ERROR);
  1742. megasas_complete_frame(s, frame_context);
  1743. s->event_count++;
  1744. return;
  1745. }
  1746. frame_cmd = cmd->frame->header.frame_cmd;
  1747. switch (frame_cmd) {
  1748. case MFI_CMD_INIT:
  1749. frame_status = megasas_init_firmware(s, cmd);
  1750. break;
  1751. case MFI_CMD_DCMD:
  1752. frame_status = megasas_handle_dcmd(s, cmd);
  1753. break;
  1754. case MFI_CMD_ABORT:
  1755. frame_status = megasas_handle_abort(s, cmd);
  1756. break;
  1757. case MFI_CMD_PD_SCSI_IO:
  1758. case MFI_CMD_LD_SCSI_IO:
  1759. frame_status = megasas_handle_scsi(s, cmd, frame_cmd);
  1760. break;
  1761. case MFI_CMD_LD_READ:
  1762. case MFI_CMD_LD_WRITE:
  1763. frame_status = megasas_handle_io(s, cmd, frame_cmd);
  1764. break;
  1765. default:
  1766. trace_megasas_unhandled_frame_cmd(cmd->index, frame_cmd);
  1767. s->event_count++;
  1768. break;
  1769. }
  1770. if (frame_status != MFI_STAT_INVALID_STATUS) {
  1771. if (cmd->frame) {
  1772. cmd->frame->header.cmd_status = frame_status;
  1773. } else {
  1774. megasas_frame_set_cmd_status(s, frame_addr, frame_status);
  1775. }
  1776. megasas_unmap_frame(s, cmd);
  1777. megasas_complete_frame(s, cmd->context);
  1778. }
  1779. }
  1780. static uint64_t megasas_mmio_read(void *opaque, hwaddr addr,
  1781. unsigned size)
  1782. {
  1783. MegasasState *s = opaque;
  1784. PCIDevice *pci_dev = PCI_DEVICE(s);
  1785. MegasasBaseClass *base_class = MEGASAS_DEVICE_GET_CLASS(s);
  1786. uint32_t retval = 0;
  1787. switch (addr) {
  1788. case MFI_IDB:
  1789. retval = 0;
  1790. trace_megasas_mmio_readl("MFI_IDB", retval);
  1791. break;
  1792. case MFI_OMSG0:
  1793. case MFI_OSP0:
  1794. retval = (msix_present(pci_dev) ? MFI_FWSTATE_MSIX_SUPPORTED : 0) |
  1795. (s->fw_state & MFI_FWSTATE_MASK) |
  1796. ((s->fw_sge & 0xff) << 16) |
  1797. (s->fw_cmds & 0xFFFF);
  1798. trace_megasas_mmio_readl(addr == MFI_OMSG0 ? "MFI_OMSG0" : "MFI_OSP0",
  1799. retval);
  1800. break;
  1801. case MFI_OSTS:
  1802. if (megasas_intr_enabled(s) && s->doorbell) {
  1803. retval = base_class->osts;
  1804. }
  1805. trace_megasas_mmio_readl("MFI_OSTS", retval);
  1806. break;
  1807. case MFI_OMSK:
  1808. retval = s->intr_mask;
  1809. trace_megasas_mmio_readl("MFI_OMSK", retval);
  1810. break;
  1811. case MFI_ODCR0:
  1812. retval = s->doorbell ? 1 : 0;
  1813. trace_megasas_mmio_readl("MFI_ODCR0", retval);
  1814. break;
  1815. case MFI_DIAG:
  1816. retval = s->diag;
  1817. trace_megasas_mmio_readl("MFI_DIAG", retval);
  1818. break;
  1819. case MFI_OSP1:
  1820. retval = 15;
  1821. trace_megasas_mmio_readl("MFI_OSP1", retval);
  1822. break;
  1823. default:
  1824. trace_megasas_mmio_invalid_readl(addr);
  1825. break;
  1826. }
  1827. return retval;
  1828. }
  1829. static int adp_reset_seq[] = {0x00, 0x04, 0x0b, 0x02, 0x07, 0x0d};
  1830. static void megasas_mmio_write(void *opaque, hwaddr addr,
  1831. uint64_t val, unsigned size)
  1832. {
  1833. MegasasState *s = opaque;
  1834. PCIDevice *pci_dev = PCI_DEVICE(s);
  1835. uint64_t frame_addr;
  1836. uint32_t frame_count;
  1837. int i;
  1838. switch (addr) {
  1839. case MFI_IDB:
  1840. trace_megasas_mmio_writel("MFI_IDB", val);
  1841. if (val & MFI_FWINIT_ABORT) {
  1842. /* Abort all pending cmds */
  1843. for (i = 0; i < s->fw_cmds; i++) {
  1844. megasas_abort_command(&s->frames[i]);
  1845. }
  1846. }
  1847. if (val & MFI_FWINIT_READY) {
  1848. /* move to FW READY */
  1849. megasas_soft_reset(s);
  1850. }
  1851. if (val & MFI_FWINIT_MFIMODE) {
  1852. /* discard MFIs */
  1853. }
  1854. if (val & MFI_FWINIT_STOP_ADP) {
  1855. /* Terminal error, stop processing */
  1856. s->fw_state = MFI_FWSTATE_FAULT;
  1857. }
  1858. break;
  1859. case MFI_OMSK:
  1860. trace_megasas_mmio_writel("MFI_OMSK", val);
  1861. s->intr_mask = val;
  1862. if (!megasas_intr_enabled(s) &&
  1863. !msi_enabled(pci_dev) &&
  1864. !msix_enabled(pci_dev)) {
  1865. trace_megasas_irq_lower();
  1866. pci_irq_deassert(pci_dev);
  1867. }
  1868. if (megasas_intr_enabled(s)) {
  1869. if (msix_enabled(pci_dev)) {
  1870. trace_megasas_msix_enabled(0);
  1871. } else if (msi_enabled(pci_dev)) {
  1872. trace_megasas_msi_enabled(0);
  1873. } else {
  1874. trace_megasas_intr_enabled();
  1875. }
  1876. } else {
  1877. trace_megasas_intr_disabled();
  1878. megasas_soft_reset(s);
  1879. }
  1880. break;
  1881. case MFI_ODCR0:
  1882. trace_megasas_mmio_writel("MFI_ODCR0", val);
  1883. s->doorbell = 0;
  1884. if (megasas_intr_enabled(s)) {
  1885. if (!msix_enabled(pci_dev) && !msi_enabled(pci_dev)) {
  1886. trace_megasas_irq_lower();
  1887. pci_irq_deassert(pci_dev);
  1888. }
  1889. }
  1890. break;
  1891. case MFI_IQPH:
  1892. trace_megasas_mmio_writel("MFI_IQPH", val);
  1893. /* Received high 32 bits of a 64 bit MFI frame address */
  1894. s->frame_hi = val;
  1895. break;
  1896. case MFI_IQPL:
  1897. trace_megasas_mmio_writel("MFI_IQPL", val);
  1898. /* Received low 32 bits of a 64 bit MFI frame address */
  1899. /* Fallthrough */
  1900. case MFI_IQP:
  1901. if (addr == MFI_IQP) {
  1902. trace_megasas_mmio_writel("MFI_IQP", val);
  1903. /* Received 64 bit MFI frame address */
  1904. s->frame_hi = 0;
  1905. }
  1906. frame_addr = (val & ~0x1F);
  1907. /* Add possible 64 bit offset */
  1908. frame_addr |= ((uint64_t)s->frame_hi << 32);
  1909. s->frame_hi = 0;
  1910. frame_count = (val >> 1) & 0xF;
  1911. megasas_handle_frame(s, frame_addr, frame_count);
  1912. break;
  1913. case MFI_SEQ:
  1914. trace_megasas_mmio_writel("MFI_SEQ", val);
  1915. /* Magic sequence to start ADP reset */
  1916. if (adp_reset_seq[s->adp_reset++] == val) {
  1917. if (s->adp_reset == 6) {
  1918. s->adp_reset = 0;
  1919. s->diag = MFI_DIAG_WRITE_ENABLE;
  1920. }
  1921. } else {
  1922. s->adp_reset = 0;
  1923. s->diag = 0;
  1924. }
  1925. break;
  1926. case MFI_DIAG:
  1927. trace_megasas_mmio_writel("MFI_DIAG", val);
  1928. /* ADP reset */
  1929. if ((s->diag & MFI_DIAG_WRITE_ENABLE) &&
  1930. (val & MFI_DIAG_RESET_ADP)) {
  1931. s->diag |= MFI_DIAG_RESET_ADP;
  1932. megasas_soft_reset(s);
  1933. s->adp_reset = 0;
  1934. s->diag = 0;
  1935. }
  1936. break;
  1937. default:
  1938. trace_megasas_mmio_invalid_writel(addr, val);
  1939. break;
  1940. }
  1941. }
  1942. static const MemoryRegionOps megasas_mmio_ops = {
  1943. .read = megasas_mmio_read,
  1944. .write = megasas_mmio_write,
  1945. .endianness = DEVICE_LITTLE_ENDIAN,
  1946. .impl = {
  1947. .min_access_size = 8,
  1948. .max_access_size = 8,
  1949. }
  1950. };
  1951. static uint64_t megasas_port_read(void *opaque, hwaddr addr,
  1952. unsigned size)
  1953. {
  1954. return megasas_mmio_read(opaque, addr & 0xff, size);
  1955. }
  1956. static void megasas_port_write(void *opaque, hwaddr addr,
  1957. uint64_t val, unsigned size)
  1958. {
  1959. megasas_mmio_write(opaque, addr & 0xff, val, size);
  1960. }
  1961. static const MemoryRegionOps megasas_port_ops = {
  1962. .read = megasas_port_read,
  1963. .write = megasas_port_write,
  1964. .endianness = DEVICE_LITTLE_ENDIAN,
  1965. .impl = {
  1966. .min_access_size = 4,
  1967. .max_access_size = 4,
  1968. }
  1969. };
  1970. static uint64_t megasas_queue_read(void *opaque, hwaddr addr,
  1971. unsigned size)
  1972. {
  1973. return 0;
  1974. }
  1975. static void megasas_queue_write(void *opaque, hwaddr addr,
  1976. uint64_t val, unsigned size)
  1977. {
  1978. return;
  1979. }
  1980. static const MemoryRegionOps megasas_queue_ops = {
  1981. .read = megasas_queue_read,
  1982. .write = megasas_queue_write,
  1983. .endianness = DEVICE_LITTLE_ENDIAN,
  1984. .impl = {
  1985. .min_access_size = 8,
  1986. .max_access_size = 8,
  1987. }
  1988. };
  1989. static void megasas_soft_reset(MegasasState *s)
  1990. {
  1991. int i;
  1992. MegasasCmd *cmd;
  1993. trace_megasas_reset(s->fw_state);
  1994. for (i = 0; i < s->fw_cmds; i++) {
  1995. cmd = &s->frames[i];
  1996. megasas_abort_command(cmd);
  1997. }
  1998. if (s->fw_state == MFI_FWSTATE_READY) {
  1999. BusChild *kid;
  2000. /*
  2001. * The EFI firmware doesn't handle UA,
  2002. * so we need to clear the Power On/Reset UA
  2003. * after the initial reset.
  2004. */
  2005. QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
  2006. SCSIDevice *sdev = SCSI_DEVICE(kid->child);
  2007. sdev->unit_attention = SENSE_CODE(NO_SENSE);
  2008. scsi_device_unit_attention_reported(sdev);
  2009. }
  2010. }
  2011. megasas_reset_frames(s);
  2012. s->reply_queue_len = s->fw_cmds;
  2013. s->reply_queue_pa = 0;
  2014. s->consumer_pa = 0;
  2015. s->producer_pa = 0;
  2016. s->fw_state = MFI_FWSTATE_READY;
  2017. s->doorbell = 0;
  2018. s->intr_mask = MEGASAS_INTR_DISABLED_MASK;
  2019. s->frame_hi = 0;
  2020. s->flags &= ~MEGASAS_MASK_USE_QUEUE64;
  2021. s->event_count++;
  2022. s->boot_event = s->event_count;
  2023. }
  2024. static void megasas_scsi_reset(DeviceState *dev)
  2025. {
  2026. MegasasState *s = MEGASAS(dev);
  2027. megasas_soft_reset(s);
  2028. }
  2029. static const VMStateDescription vmstate_megasas_gen1 = {
  2030. .name = "megasas",
  2031. .version_id = 0,
  2032. .minimum_version_id = 0,
  2033. .fields = (VMStateField[]) {
  2034. VMSTATE_PCI_DEVICE(parent_obj, MegasasState),
  2035. VMSTATE_MSIX(parent_obj, MegasasState),
  2036. VMSTATE_INT32(fw_state, MegasasState),
  2037. VMSTATE_INT32(intr_mask, MegasasState),
  2038. VMSTATE_INT32(doorbell, MegasasState),
  2039. VMSTATE_UINT64(reply_queue_pa, MegasasState),
  2040. VMSTATE_UINT64(consumer_pa, MegasasState),
  2041. VMSTATE_UINT64(producer_pa, MegasasState),
  2042. VMSTATE_END_OF_LIST()
  2043. }
  2044. };
  2045. static const VMStateDescription vmstate_megasas_gen2 = {
  2046. .name = "megasas-gen2",
  2047. .version_id = 0,
  2048. .minimum_version_id = 0,
  2049. .minimum_version_id_old = 0,
  2050. .fields = (VMStateField[]) {
  2051. VMSTATE_PCI_DEVICE(parent_obj, MegasasState),
  2052. VMSTATE_MSIX(parent_obj, MegasasState),
  2053. VMSTATE_INT32(fw_state, MegasasState),
  2054. VMSTATE_INT32(intr_mask, MegasasState),
  2055. VMSTATE_INT32(doorbell, MegasasState),
  2056. VMSTATE_UINT64(reply_queue_pa, MegasasState),
  2057. VMSTATE_UINT64(consumer_pa, MegasasState),
  2058. VMSTATE_UINT64(producer_pa, MegasasState),
  2059. VMSTATE_END_OF_LIST()
  2060. }
  2061. };
  2062. static void megasas_scsi_uninit(PCIDevice *d)
  2063. {
  2064. MegasasState *s = MEGASAS(d);
  2065. if (megasas_use_msix(s)) {
  2066. msix_uninit(d, &s->mmio_io, &s->mmio_io);
  2067. }
  2068. msi_uninit(d);
  2069. }
  2070. static const struct SCSIBusInfo megasas_scsi_info = {
  2071. .tcq = true,
  2072. .max_target = MFI_MAX_LD,
  2073. .max_lun = 255,
  2074. .transfer_data = megasas_xfer_complete,
  2075. .get_sg_list = megasas_get_sg_list,
  2076. .complete = megasas_command_complete,
  2077. .cancel = megasas_command_cancelled,
  2078. };
  2079. static void megasas_scsi_realize(PCIDevice *dev, Error **errp)
  2080. {
  2081. MegasasState *s = MEGASAS(dev);
  2082. MegasasBaseClass *b = MEGASAS_DEVICE_GET_CLASS(s);
  2083. uint8_t *pci_conf;
  2084. int i, bar_type;
  2085. Error *err = NULL;
  2086. int ret;
  2087. pci_conf = dev->config;
  2088. /* PCI latency timer = 0 */
  2089. pci_conf[PCI_LATENCY_TIMER] = 0;
  2090. /* Interrupt pin 1 */
  2091. pci_conf[PCI_INTERRUPT_PIN] = 0x01;
  2092. if (s->msi != ON_OFF_AUTO_OFF) {
  2093. ret = msi_init(dev, 0x50, 1, true, false, &err);
  2094. /* Any error other than -ENOTSUP(board's MSI support is broken)
  2095. * is a programming error */
  2096. assert(!ret || ret == -ENOTSUP);
  2097. if (ret && s->msi == ON_OFF_AUTO_ON) {
  2098. /* Can't satisfy user's explicit msi=on request, fail */
  2099. error_append_hint(&err, "You have to use msi=auto (default) or "
  2100. "msi=off with this machine type.\n");
  2101. error_propagate(errp, err);
  2102. return;
  2103. } else if (ret) {
  2104. /* With msi=auto, we fall back to MSI off silently */
  2105. s->msi = ON_OFF_AUTO_OFF;
  2106. error_free(err);
  2107. }
  2108. }
  2109. memory_region_init_io(&s->mmio_io, OBJECT(s), &megasas_mmio_ops, s,
  2110. "megasas-mmio", 0x4000);
  2111. memory_region_init_io(&s->port_io, OBJECT(s), &megasas_port_ops, s,
  2112. "megasas-io", 256);
  2113. memory_region_init_io(&s->queue_io, OBJECT(s), &megasas_queue_ops, s,
  2114. "megasas-queue", 0x40000);
  2115. if (megasas_use_msix(s) &&
  2116. msix_init(dev, 15, &s->mmio_io, b->mmio_bar, 0x2000,
  2117. &s->mmio_io, b->mmio_bar, 0x3800, 0x68, NULL)) {
  2118. /* TODO: check msix_init's error, and should fail on msix=on */
  2119. s->msix = ON_OFF_AUTO_OFF;
  2120. }
  2121. if (pci_is_express(dev)) {
  2122. pcie_endpoint_cap_init(dev, 0xa0);
  2123. }
  2124. bar_type = PCI_BASE_ADDRESS_SPACE_MEMORY | PCI_BASE_ADDRESS_MEM_TYPE_64;
  2125. pci_register_bar(dev, b->ioport_bar,
  2126. PCI_BASE_ADDRESS_SPACE_IO, &s->port_io);
  2127. pci_register_bar(dev, b->mmio_bar, bar_type, &s->mmio_io);
  2128. pci_register_bar(dev, 3, bar_type, &s->queue_io);
  2129. if (megasas_use_msix(s)) {
  2130. msix_vector_use(dev, 0);
  2131. }
  2132. s->fw_state = MFI_FWSTATE_READY;
  2133. if (!s->sas_addr) {
  2134. s->sas_addr = ((NAA_LOCALLY_ASSIGNED_ID << 24) |
  2135. IEEE_COMPANY_LOCALLY_ASSIGNED) << 36;
  2136. s->sas_addr |= (pci_dev_bus_num(dev) << 16);
  2137. s->sas_addr |= (PCI_SLOT(dev->devfn) << 8);
  2138. s->sas_addr |= PCI_FUNC(dev->devfn);
  2139. }
  2140. if (!s->hba_serial) {
  2141. s->hba_serial = g_strdup(MEGASAS_HBA_SERIAL);
  2142. }
  2143. if (s->fw_sge >= MEGASAS_MAX_SGE - MFI_PASS_FRAME_SIZE) {
  2144. s->fw_sge = MEGASAS_MAX_SGE - MFI_PASS_FRAME_SIZE;
  2145. } else if (s->fw_sge >= 128 - MFI_PASS_FRAME_SIZE) {
  2146. s->fw_sge = 128 - MFI_PASS_FRAME_SIZE;
  2147. } else {
  2148. s->fw_sge = 64 - MFI_PASS_FRAME_SIZE;
  2149. }
  2150. if (s->fw_cmds > MEGASAS_MAX_FRAMES) {
  2151. s->fw_cmds = MEGASAS_MAX_FRAMES;
  2152. }
  2153. trace_megasas_init(s->fw_sge, s->fw_cmds,
  2154. megasas_is_jbod(s) ? "jbod" : "raid");
  2155. if (megasas_is_jbod(s)) {
  2156. s->fw_luns = MFI_MAX_SYS_PDS;
  2157. } else {
  2158. s->fw_luns = MFI_MAX_LD;
  2159. }
  2160. s->producer_pa = 0;
  2161. s->consumer_pa = 0;
  2162. for (i = 0; i < s->fw_cmds; i++) {
  2163. s->frames[i].index = i;
  2164. s->frames[i].context = -1;
  2165. s->frames[i].pa = 0;
  2166. s->frames[i].state = s;
  2167. }
  2168. scsi_bus_new(&s->bus, sizeof(s->bus), DEVICE(dev),
  2169. &megasas_scsi_info, NULL);
  2170. }
  2171. static Property megasas_properties_gen1[] = {
  2172. DEFINE_PROP_UINT32("max_sge", MegasasState, fw_sge,
  2173. MEGASAS_DEFAULT_SGE),
  2174. DEFINE_PROP_UINT32("max_cmds", MegasasState, fw_cmds,
  2175. MEGASAS_DEFAULT_FRAMES),
  2176. DEFINE_PROP_STRING("hba_serial", MegasasState, hba_serial),
  2177. DEFINE_PROP_UINT64("sas_address", MegasasState, sas_addr, 0),
  2178. DEFINE_PROP_ON_OFF_AUTO("msi", MegasasState, msi, ON_OFF_AUTO_AUTO),
  2179. DEFINE_PROP_ON_OFF_AUTO("msix", MegasasState, msix, ON_OFF_AUTO_AUTO),
  2180. DEFINE_PROP_BIT("use_jbod", MegasasState, flags,
  2181. MEGASAS_FLAG_USE_JBOD, false),
  2182. DEFINE_PROP_END_OF_LIST(),
  2183. };
  2184. static Property megasas_properties_gen2[] = {
  2185. DEFINE_PROP_UINT32("max_sge", MegasasState, fw_sge,
  2186. MEGASAS_DEFAULT_SGE),
  2187. DEFINE_PROP_UINT32("max_cmds", MegasasState, fw_cmds,
  2188. MEGASAS_GEN2_DEFAULT_FRAMES),
  2189. DEFINE_PROP_STRING("hba_serial", MegasasState, hba_serial),
  2190. DEFINE_PROP_UINT64("sas_address", MegasasState, sas_addr, 0),
  2191. DEFINE_PROP_ON_OFF_AUTO("msi", MegasasState, msi, ON_OFF_AUTO_AUTO),
  2192. DEFINE_PROP_ON_OFF_AUTO("msix", MegasasState, msix, ON_OFF_AUTO_AUTO),
  2193. DEFINE_PROP_BIT("use_jbod", MegasasState, flags,
  2194. MEGASAS_FLAG_USE_JBOD, false),
  2195. DEFINE_PROP_END_OF_LIST(),
  2196. };
  2197. typedef struct MegasasInfo {
  2198. const char *name;
  2199. const char *desc;
  2200. const char *product_name;
  2201. const char *product_version;
  2202. uint16_t device_id;
  2203. uint16_t subsystem_id;
  2204. int ioport_bar;
  2205. int mmio_bar;
  2206. int osts;
  2207. const VMStateDescription *vmsd;
  2208. Property *props;
  2209. InterfaceInfo *interfaces;
  2210. } MegasasInfo;
  2211. static struct MegasasInfo megasas_devices[] = {
  2212. {
  2213. .name = TYPE_MEGASAS_GEN1,
  2214. .desc = "LSI MegaRAID SAS 1078",
  2215. .product_name = "LSI MegaRAID SAS 8708EM2",
  2216. .product_version = MEGASAS_VERSION_GEN1,
  2217. .device_id = PCI_DEVICE_ID_LSI_SAS1078,
  2218. .subsystem_id = 0x1013,
  2219. .ioport_bar = 2,
  2220. .mmio_bar = 0,
  2221. .osts = MFI_1078_RM | 1,
  2222. .vmsd = &vmstate_megasas_gen1,
  2223. .props = megasas_properties_gen1,
  2224. .interfaces = (InterfaceInfo[]) {
  2225. { INTERFACE_CONVENTIONAL_PCI_DEVICE },
  2226. { },
  2227. },
  2228. },{
  2229. .name = TYPE_MEGASAS_GEN2,
  2230. .desc = "LSI MegaRAID SAS 2108",
  2231. .product_name = "LSI MegaRAID SAS 9260-8i",
  2232. .product_version = MEGASAS_VERSION_GEN2,
  2233. .device_id = PCI_DEVICE_ID_LSI_SAS0079,
  2234. .subsystem_id = 0x9261,
  2235. .ioport_bar = 0,
  2236. .mmio_bar = 1,
  2237. .osts = MFI_GEN2_RM,
  2238. .vmsd = &vmstate_megasas_gen2,
  2239. .props = megasas_properties_gen2,
  2240. .interfaces = (InterfaceInfo[]) {
  2241. { INTERFACE_PCIE_DEVICE },
  2242. { }
  2243. },
  2244. }
  2245. };
  2246. static void megasas_class_init(ObjectClass *oc, void *data)
  2247. {
  2248. DeviceClass *dc = DEVICE_CLASS(oc);
  2249. PCIDeviceClass *pc = PCI_DEVICE_CLASS(oc);
  2250. MegasasBaseClass *e = MEGASAS_DEVICE_CLASS(oc);
  2251. const MegasasInfo *info = data;
  2252. pc->realize = megasas_scsi_realize;
  2253. pc->exit = megasas_scsi_uninit;
  2254. pc->vendor_id = PCI_VENDOR_ID_LSI_LOGIC;
  2255. pc->device_id = info->device_id;
  2256. pc->subsystem_vendor_id = PCI_VENDOR_ID_LSI_LOGIC;
  2257. pc->subsystem_id = info->subsystem_id;
  2258. pc->class_id = PCI_CLASS_STORAGE_RAID;
  2259. e->mmio_bar = info->mmio_bar;
  2260. e->ioport_bar = info->ioport_bar;
  2261. e->osts = info->osts;
  2262. e->product_name = info->product_name;
  2263. e->product_version = info->product_version;
  2264. dc->props = info->props;
  2265. dc->reset = megasas_scsi_reset;
  2266. dc->vmsd = info->vmsd;
  2267. set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
  2268. dc->desc = info->desc;
  2269. }
  2270. static const TypeInfo megasas_info = {
  2271. .name = TYPE_MEGASAS_BASE,
  2272. .parent = TYPE_PCI_DEVICE,
  2273. .instance_size = sizeof(MegasasState),
  2274. .class_size = sizeof(MegasasBaseClass),
  2275. .abstract = true,
  2276. };
  2277. static void megasas_register_types(void)
  2278. {
  2279. int i;
  2280. type_register_static(&megasas_info);
  2281. for (i = 0; i < ARRAY_SIZE(megasas_devices); i++) {
  2282. const MegasasInfo *info = &megasas_devices[i];
  2283. TypeInfo type_info = {};
  2284. type_info.name = info->name;
  2285. type_info.parent = TYPE_MEGASAS_BASE;
  2286. type_info.class_data = (void *)info;
  2287. type_info.class_init = megasas_class_init;
  2288. type_info.interfaces = info->interfaces;
  2289. type_register(&type_info);
  2290. }
  2291. }
  2292. type_init(megasas_register_types)