2
0

mptsas.c 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455
  1. /*
  2. * QEMU LSI SAS1068 Host Bus Adapter emulation
  3. * Based on the QEMU Megaraid emulator
  4. *
  5. * Copyright (c) 2009-2012 Hannes Reinecke, SUSE Labs
  6. * Copyright (c) 2012 Verizon, Inc.
  7. * Copyright (c) 2016 Red Hat, Inc.
  8. *
  9. * Authors: Don Slutz, Paolo Bonzini
  10. *
  11. * This library is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU Lesser General Public
  13. * License as published by the Free Software Foundation; either
  14. * version 2.1 of the License, or (at your option) any later version.
  15. *
  16. * This library is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  19. * Lesser General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU Lesser General Public
  22. * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  23. */
  24. #include "qemu/osdep.h"
  25. #include "hw/pci/pci.h"
  26. #include "hw/qdev-properties.h"
  27. #include "system/dma.h"
  28. #include "hw/pci/msi.h"
  29. #include "qemu/iov.h"
  30. #include "qemu/main-loop.h"
  31. #include "qemu/module.h"
  32. #include "hw/scsi/scsi.h"
  33. #include "scsi/constants.h"
  34. #include "trace.h"
  35. #include "qapi/error.h"
  36. #include "mptsas.h"
  37. #include "migration/qemu-file-types.h"
  38. #include "migration/vmstate.h"
  39. #include "mpi.h"
  40. #define NAA_LOCALLY_ASSIGNED_ID 0x3ULL
  41. #define IEEE_COMPANY_LOCALLY_ASSIGNED 0x525400
  42. #define MPTSAS1068_PRODUCT_ID \
  43. (MPI_FW_HEADER_PID_FAMILY_1068_SAS | \
  44. MPI_FW_HEADER_PID_PROD_INITIATOR_SCSI | \
  45. MPI_FW_HEADER_PID_TYPE_SAS)
  46. struct MPTSASRequest {
  47. MPIMsgSCSIIORequest scsi_io;
  48. SCSIRequest *sreq;
  49. QEMUSGList qsg;
  50. MPTSASState *dev;
  51. QTAILQ_ENTRY(MPTSASRequest) next;
  52. };
  53. static void mptsas_update_interrupt(MPTSASState *s)
  54. {
  55. PCIDevice *pci = (PCIDevice *) s;
  56. uint32_t state = s->intr_status & ~(s->intr_mask | MPI_HIS_IOP_DOORBELL_STATUS);
  57. if (msi_enabled(pci)) {
  58. if (state) {
  59. trace_mptsas_irq_msi(s);
  60. msi_notify(pci, 0);
  61. }
  62. }
  63. trace_mptsas_irq_intx(s, !!state);
  64. pci_set_irq(pci, !!state);
  65. }
  66. static void mptsas_set_fault(MPTSASState *s, uint32_t code)
  67. {
  68. if ((s->state & MPI_IOC_STATE_FAULT) == 0) {
  69. s->state = MPI_IOC_STATE_FAULT | code;
  70. }
  71. }
  72. #define MPTSAS_FIFO_INVALID(s, name) \
  73. ((s)->name##_head > ARRAY_SIZE((s)->name) || \
  74. (s)->name##_tail > ARRAY_SIZE((s)->name))
  75. #define MPTSAS_FIFO_EMPTY(s, name) \
  76. ((s)->name##_head == (s)->name##_tail)
  77. #define MPTSAS_FIFO_FULL(s, name) \
  78. ((s)->name##_head == ((s)->name##_tail + 1) % ARRAY_SIZE((s)->name))
  79. #define MPTSAS_FIFO_GET(s, name) ({ \
  80. uint32_t _val = (s)->name[(s)->name##_head++]; \
  81. (s)->name##_head %= ARRAY_SIZE((s)->name); \
  82. _val; \
  83. })
  84. #define MPTSAS_FIFO_PUT(s, name, val) do { \
  85. (s)->name[(s)->name##_tail++] = (val); \
  86. (s)->name##_tail %= ARRAY_SIZE((s)->name); \
  87. } while(0)
  88. static void mptsas_post_reply(MPTSASState *s, MPIDefaultReply *reply)
  89. {
  90. PCIDevice *pci = (PCIDevice *) s;
  91. uint32_t addr_lo;
  92. if (MPTSAS_FIFO_EMPTY(s, reply_free) || MPTSAS_FIFO_FULL(s, reply_post)) {
  93. mptsas_set_fault(s, MPI_IOCSTATUS_INSUFFICIENT_RESOURCES);
  94. return;
  95. }
  96. addr_lo = MPTSAS_FIFO_GET(s, reply_free);
  97. pci_dma_write(pci, addr_lo | s->host_mfa_high_addr, reply,
  98. MIN(s->reply_frame_size, 4 * reply->MsgLength));
  99. MPTSAS_FIFO_PUT(s, reply_post, MPI_ADDRESS_REPLY_A_BIT | (addr_lo >> 1));
  100. s->intr_status |= MPI_HIS_REPLY_MESSAGE_INTERRUPT;
  101. if (s->doorbell_state == DOORBELL_WRITE) {
  102. s->doorbell_state = DOORBELL_NONE;
  103. s->intr_status |= MPI_HIS_DOORBELL_INTERRUPT;
  104. }
  105. mptsas_update_interrupt(s);
  106. }
  107. void mptsas_reply(MPTSASState *s, MPIDefaultReply *reply)
  108. {
  109. if (s->doorbell_state == DOORBELL_WRITE) {
  110. /* The reply is sent out in 16 bit chunks, while the size
  111. * in the reply is in 32 bit units.
  112. */
  113. s->doorbell_state = DOORBELL_READ;
  114. s->doorbell_reply_idx = 0;
  115. s->doorbell_reply_size = reply->MsgLength * 2;
  116. memcpy(s->doorbell_reply, reply, s->doorbell_reply_size * 2);
  117. s->intr_status |= MPI_HIS_DOORBELL_INTERRUPT;
  118. mptsas_update_interrupt(s);
  119. } else {
  120. mptsas_post_reply(s, reply);
  121. }
  122. }
  123. static void mptsas_turbo_reply(MPTSASState *s, uint32_t msgctx)
  124. {
  125. if (MPTSAS_FIFO_FULL(s, reply_post)) {
  126. mptsas_set_fault(s, MPI_IOCSTATUS_INSUFFICIENT_RESOURCES);
  127. return;
  128. }
  129. /* The reply is just the message context ID (bit 31 = clear). */
  130. MPTSAS_FIFO_PUT(s, reply_post, msgctx);
  131. s->intr_status |= MPI_HIS_REPLY_MESSAGE_INTERRUPT;
  132. mptsas_update_interrupt(s);
  133. }
  134. #define MPTSAS_MAX_REQUEST_SIZE 52
  135. static const int mpi_request_sizes[] = {
  136. [MPI_FUNCTION_SCSI_IO_REQUEST] = sizeof(MPIMsgSCSIIORequest),
  137. [MPI_FUNCTION_SCSI_TASK_MGMT] = sizeof(MPIMsgSCSITaskMgmt),
  138. [MPI_FUNCTION_IOC_INIT] = sizeof(MPIMsgIOCInit),
  139. [MPI_FUNCTION_IOC_FACTS] = sizeof(MPIMsgIOCFacts),
  140. [MPI_FUNCTION_CONFIG] = sizeof(MPIMsgConfig),
  141. [MPI_FUNCTION_PORT_FACTS] = sizeof(MPIMsgPortFacts),
  142. [MPI_FUNCTION_PORT_ENABLE] = sizeof(MPIMsgPortEnable),
  143. [MPI_FUNCTION_EVENT_NOTIFICATION] = sizeof(MPIMsgEventNotify),
  144. };
  145. static dma_addr_t mptsas_ld_sg_base(MPTSASState *s, uint32_t flags_and_length,
  146. dma_addr_t *sgaddr)
  147. {
  148. const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
  149. PCIDevice *pci = (PCIDevice *) s;
  150. dma_addr_t addr;
  151. if (flags_and_length & MPI_SGE_FLAGS_64_BIT_ADDRESSING) {
  152. uint64_t addr64;
  153. ldq_le_pci_dma(pci, *sgaddr + 4, &addr64, attrs);
  154. addr = addr64;
  155. *sgaddr += 12;
  156. } else {
  157. uint32_t addr32;
  158. ldl_le_pci_dma(pci, *sgaddr + 4, &addr32, attrs);
  159. addr = addr32;
  160. *sgaddr += 8;
  161. }
  162. return addr;
  163. }
  164. static int mptsas_build_sgl(MPTSASState *s, MPTSASRequest *req, hwaddr req_addr)
  165. {
  166. PCIDevice *pci = (PCIDevice *) s;
  167. hwaddr next_chain_addr;
  168. uint32_t left;
  169. hwaddr sgaddr;
  170. uint32_t chain_offset;
  171. chain_offset = req->scsi_io.ChainOffset;
  172. next_chain_addr = req_addr + chain_offset * sizeof(uint32_t);
  173. sgaddr = req_addr + sizeof(MPIMsgSCSIIORequest);
  174. pci_dma_sglist_init(&req->qsg, pci, 4);
  175. left = req->scsi_io.DataLength;
  176. for(;;) {
  177. dma_addr_t addr, len;
  178. uint32_t flags_and_length;
  179. ldl_le_pci_dma(pci, sgaddr, &flags_and_length, MEMTXATTRS_UNSPECIFIED);
  180. len = flags_and_length & MPI_SGE_LENGTH_MASK;
  181. if ((flags_and_length & MPI_SGE_FLAGS_ELEMENT_TYPE_MASK)
  182. != MPI_SGE_FLAGS_SIMPLE_ELEMENT ||
  183. (!len &&
  184. !(flags_and_length & MPI_SGE_FLAGS_END_OF_LIST) &&
  185. !(flags_and_length & MPI_SGE_FLAGS_END_OF_BUFFER))) {
  186. return MPI_IOCSTATUS_INVALID_SGL;
  187. }
  188. len = MIN(len, left);
  189. if (!len) {
  190. /* We reached the desired transfer length, ignore extra
  191. * elements of the s/g list.
  192. */
  193. break;
  194. }
  195. addr = mptsas_ld_sg_base(s, flags_and_length, &sgaddr);
  196. qemu_sglist_add(&req->qsg, addr, len);
  197. left -= len;
  198. if (flags_and_length & MPI_SGE_FLAGS_END_OF_LIST) {
  199. break;
  200. }
  201. if (flags_and_length & MPI_SGE_FLAGS_LAST_ELEMENT) {
  202. if (!chain_offset) {
  203. break;
  204. }
  205. ldl_le_pci_dma(pci, next_chain_addr, &flags_and_length,
  206. MEMTXATTRS_UNSPECIFIED);
  207. if ((flags_and_length & MPI_SGE_FLAGS_ELEMENT_TYPE_MASK)
  208. != MPI_SGE_FLAGS_CHAIN_ELEMENT) {
  209. return MPI_IOCSTATUS_INVALID_SGL;
  210. }
  211. sgaddr = mptsas_ld_sg_base(s, flags_and_length, &next_chain_addr);
  212. chain_offset =
  213. (flags_and_length & MPI_SGE_CHAIN_OFFSET_MASK) >> MPI_SGE_CHAIN_OFFSET_SHIFT;
  214. next_chain_addr = sgaddr + chain_offset * sizeof(uint32_t);
  215. }
  216. }
  217. return 0;
  218. }
  219. static void mptsas_free_request(MPTSASRequest *req)
  220. {
  221. if (req->sreq != NULL) {
  222. req->sreq->hba_private = NULL;
  223. scsi_req_unref(req->sreq);
  224. req->sreq = NULL;
  225. }
  226. qemu_sglist_destroy(&req->qsg);
  227. g_free(req);
  228. }
  229. static int mptsas_scsi_device_find(MPTSASState *s, int bus, int target,
  230. uint8_t *lun, SCSIDevice **sdev)
  231. {
  232. if (bus != 0) {
  233. return MPI_IOCSTATUS_SCSI_INVALID_BUS;
  234. }
  235. if (target >= s->max_devices) {
  236. return MPI_IOCSTATUS_SCSI_INVALID_TARGETID;
  237. }
  238. *sdev = scsi_device_find(&s->bus, bus, target, lun[1]);
  239. if (!*sdev) {
  240. return MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE;
  241. }
  242. return 0;
  243. }
  244. static int mptsas_process_scsi_io_request(MPTSASState *s,
  245. MPIMsgSCSIIORequest *scsi_io,
  246. hwaddr addr)
  247. {
  248. MPTSASRequest *req;
  249. MPIMsgSCSIIOReply reply;
  250. SCSIDevice *sdev;
  251. int status;
  252. mptsas_fix_scsi_io_endianness(scsi_io);
  253. trace_mptsas_process_scsi_io_request(s, scsi_io->Bus, scsi_io->TargetID,
  254. scsi_io->LUN[1], scsi_io->DataLength);
  255. status = mptsas_scsi_device_find(s, scsi_io->Bus, scsi_io->TargetID,
  256. scsi_io->LUN, &sdev);
  257. if (status) {
  258. goto bad;
  259. }
  260. req = g_new0(MPTSASRequest, 1);
  261. req->scsi_io = *scsi_io;
  262. req->dev = s;
  263. status = mptsas_build_sgl(s, req, addr);
  264. if (status) {
  265. goto free_bad;
  266. }
  267. if (req->qsg.size < scsi_io->DataLength) {
  268. trace_mptsas_sgl_overflow(s, scsi_io->MsgContext, scsi_io->DataLength,
  269. req->qsg.size);
  270. status = MPI_IOCSTATUS_INVALID_SGL;
  271. goto free_bad;
  272. }
  273. req->sreq = scsi_req_new(sdev, scsi_io->MsgContext,
  274. scsi_io->LUN[1], scsi_io->CDB,
  275. scsi_io->CDBLength, req);
  276. if (req->sreq->cmd.xfer > scsi_io->DataLength) {
  277. goto overrun;
  278. }
  279. switch (scsi_io->Control & MPI_SCSIIO_CONTROL_DATADIRECTION_MASK) {
  280. case MPI_SCSIIO_CONTROL_NODATATRANSFER:
  281. if (req->sreq->cmd.mode != SCSI_XFER_NONE) {
  282. goto overrun;
  283. }
  284. break;
  285. case MPI_SCSIIO_CONTROL_WRITE:
  286. if (req->sreq->cmd.mode != SCSI_XFER_TO_DEV) {
  287. goto overrun;
  288. }
  289. break;
  290. case MPI_SCSIIO_CONTROL_READ:
  291. if (req->sreq->cmd.mode != SCSI_XFER_FROM_DEV) {
  292. goto overrun;
  293. }
  294. break;
  295. }
  296. if (scsi_req_enqueue(req->sreq)) {
  297. scsi_req_continue(req->sreq);
  298. }
  299. return 0;
  300. overrun:
  301. trace_mptsas_scsi_overflow(s, scsi_io->MsgContext, req->sreq->cmd.xfer,
  302. scsi_io->DataLength);
  303. status = MPI_IOCSTATUS_SCSI_DATA_OVERRUN;
  304. free_bad:
  305. mptsas_free_request(req);
  306. bad:
  307. memset(&reply, 0, sizeof(reply));
  308. reply.TargetID = scsi_io->TargetID;
  309. reply.Bus = scsi_io->Bus;
  310. reply.MsgLength = sizeof(reply) / 4;
  311. reply.Function = scsi_io->Function;
  312. reply.CDBLength = scsi_io->CDBLength;
  313. reply.SenseBufferLength = scsi_io->SenseBufferLength;
  314. reply.MsgContext = scsi_io->MsgContext;
  315. reply.SCSIState = MPI_SCSI_STATE_NO_SCSI_STATUS;
  316. reply.IOCStatus = status;
  317. mptsas_fix_scsi_io_reply_endianness(&reply);
  318. mptsas_reply(s, (MPIDefaultReply *)&reply);
  319. return 0;
  320. }
  321. typedef struct {
  322. Notifier notifier;
  323. MPTSASState *s;
  324. MPIMsgSCSITaskMgmtReply *reply;
  325. } MPTSASCancelNotifier;
  326. static void mptsas_cancel_notify(Notifier *notifier, void *data)
  327. {
  328. MPTSASCancelNotifier *n = container_of(notifier,
  329. MPTSASCancelNotifier,
  330. notifier);
  331. /* Abusing IOCLogInfo to store the expected number of requests... */
  332. if (++n->reply->TerminationCount == n->reply->IOCLogInfo) {
  333. n->reply->IOCLogInfo = 0;
  334. mptsas_fix_scsi_task_mgmt_reply_endianness(n->reply);
  335. mptsas_post_reply(n->s, (MPIDefaultReply *)n->reply);
  336. g_free(n->reply);
  337. }
  338. g_free(n);
  339. }
  340. static void mptsas_process_scsi_task_mgmt(MPTSASState *s, MPIMsgSCSITaskMgmt *req)
  341. {
  342. MPIMsgSCSITaskMgmtReply reply;
  343. MPIMsgSCSITaskMgmtReply *reply_async;
  344. int status, count;
  345. SCSIDevice *sdev;
  346. SCSIRequest *r, *next;
  347. BusChild *kid;
  348. mptsas_fix_scsi_task_mgmt_endianness(req);
  349. QEMU_BUILD_BUG_ON(MPTSAS_MAX_REQUEST_SIZE < sizeof(*req));
  350. QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req));
  351. QEMU_BUILD_BUG_ON(sizeof(s->doorbell_reply) < sizeof(reply));
  352. memset(&reply, 0, sizeof(reply));
  353. reply.TargetID = req->TargetID;
  354. reply.Bus = req->Bus;
  355. reply.MsgLength = sizeof(reply) / 4;
  356. reply.Function = req->Function;
  357. reply.TaskType = req->TaskType;
  358. reply.MsgContext = req->MsgContext;
  359. switch (req->TaskType) {
  360. case MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK:
  361. case MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK:
  362. status = mptsas_scsi_device_find(s, req->Bus, req->TargetID,
  363. req->LUN, &sdev);
  364. if (status) {
  365. reply.IOCStatus = status;
  366. goto out;
  367. }
  368. if (sdev->lun != req->LUN[1]) {
  369. reply.ResponseCode = MPI_SCSITASKMGMT_RSP_TM_INVALID_LUN;
  370. goto out;
  371. }
  372. QTAILQ_FOREACH_SAFE(r, &sdev->requests, next, next) {
  373. MPTSASRequest *cmd_req = r->hba_private;
  374. if (cmd_req && cmd_req->scsi_io.MsgContext == req->TaskMsgContext) {
  375. break;
  376. }
  377. }
  378. if (r) {
  379. /*
  380. * Assert that the request has not been completed yet, we
  381. * check for it in the loop above.
  382. */
  383. assert(r->hba_private);
  384. if (req->TaskType == MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK) {
  385. /* "If the specified command is present in the task set, then
  386. * return a service response set to FUNCTION SUCCEEDED".
  387. */
  388. reply.ResponseCode = MPI_SCSITASKMGMT_RSP_TM_SUCCEEDED;
  389. } else {
  390. MPTSASCancelNotifier *notifier;
  391. reply_async = g_memdup(&reply, sizeof(MPIMsgSCSITaskMgmtReply));
  392. reply_async->IOCLogInfo = INT_MAX;
  393. count = 1;
  394. notifier = g_new(MPTSASCancelNotifier, 1);
  395. notifier->s = s;
  396. notifier->reply = reply_async;
  397. notifier->notifier.notify = mptsas_cancel_notify;
  398. scsi_req_cancel_async(r, &notifier->notifier);
  399. goto reply_maybe_async;
  400. }
  401. }
  402. break;
  403. case MPI_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET:
  404. case MPI_SCSITASKMGMT_TASKTYPE_CLEAR_TASK_SET:
  405. status = mptsas_scsi_device_find(s, req->Bus, req->TargetID,
  406. req->LUN, &sdev);
  407. if (status) {
  408. reply.IOCStatus = status;
  409. goto out;
  410. }
  411. if (sdev->lun != req->LUN[1]) {
  412. reply.ResponseCode = MPI_SCSITASKMGMT_RSP_TM_INVALID_LUN;
  413. goto out;
  414. }
  415. reply_async = g_memdup(&reply, sizeof(MPIMsgSCSITaskMgmtReply));
  416. reply_async->IOCLogInfo = INT_MAX;
  417. count = 0;
  418. QTAILQ_FOREACH_SAFE(r, &sdev->requests, next, next) {
  419. if (r->hba_private) {
  420. MPTSASCancelNotifier *notifier;
  421. count++;
  422. notifier = g_new(MPTSASCancelNotifier, 1);
  423. notifier->s = s;
  424. notifier->reply = reply_async;
  425. notifier->notifier.notify = mptsas_cancel_notify;
  426. scsi_req_cancel_async(r, &notifier->notifier);
  427. }
  428. }
  429. reply_maybe_async:
  430. if (reply_async->TerminationCount < count) {
  431. reply_async->IOCLogInfo = count;
  432. return;
  433. }
  434. g_free(reply_async);
  435. reply.TerminationCount = count;
  436. break;
  437. case MPI_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET:
  438. status = mptsas_scsi_device_find(s, req->Bus, req->TargetID,
  439. req->LUN, &sdev);
  440. if (status) {
  441. reply.IOCStatus = status;
  442. goto out;
  443. }
  444. if (sdev->lun != req->LUN[1]) {
  445. reply.ResponseCode = MPI_SCSITASKMGMT_RSP_TM_INVALID_LUN;
  446. goto out;
  447. }
  448. device_cold_reset(&sdev->qdev);
  449. break;
  450. case MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET:
  451. if (req->Bus != 0) {
  452. reply.IOCStatus = MPI_IOCSTATUS_SCSI_INVALID_BUS;
  453. goto out;
  454. }
  455. if (req->TargetID > s->max_devices) {
  456. reply.IOCStatus = MPI_IOCSTATUS_SCSI_INVALID_TARGETID;
  457. goto out;
  458. }
  459. QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
  460. sdev = SCSI_DEVICE(kid->child);
  461. if (sdev->channel == 0 && sdev->id == req->TargetID) {
  462. device_cold_reset(kid->child);
  463. }
  464. }
  465. break;
  466. case MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS:
  467. bus_cold_reset(BUS(&s->bus));
  468. break;
  469. default:
  470. reply.ResponseCode = MPI_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED;
  471. break;
  472. }
  473. out:
  474. mptsas_fix_scsi_task_mgmt_reply_endianness(&reply);
  475. mptsas_post_reply(s, (MPIDefaultReply *)&reply);
  476. }
  477. static void mptsas_process_ioc_init(MPTSASState *s, MPIMsgIOCInit *req)
  478. {
  479. MPIMsgIOCInitReply reply;
  480. mptsas_fix_ioc_init_endianness(req);
  481. QEMU_BUILD_BUG_ON(MPTSAS_MAX_REQUEST_SIZE < sizeof(*req));
  482. QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req));
  483. QEMU_BUILD_BUG_ON(sizeof(s->doorbell_reply) < sizeof(reply));
  484. s->who_init = req->WhoInit;
  485. s->reply_frame_size = req->ReplyFrameSize;
  486. s->max_buses = req->MaxBuses;
  487. s->max_devices = req->MaxDevices ? req->MaxDevices : 256;
  488. s->host_mfa_high_addr = (hwaddr)req->HostMfaHighAddr << 32;
  489. s->sense_buffer_high_addr = (hwaddr)req->SenseBufferHighAddr << 32;
  490. if (s->state == MPI_IOC_STATE_READY) {
  491. s->state = MPI_IOC_STATE_OPERATIONAL;
  492. }
  493. memset(&reply, 0, sizeof(reply));
  494. reply.WhoInit = s->who_init;
  495. reply.MsgLength = sizeof(reply) / 4;
  496. reply.Function = req->Function;
  497. reply.MaxDevices = s->max_devices;
  498. reply.MaxBuses = s->max_buses;
  499. reply.MsgContext = req->MsgContext;
  500. mptsas_fix_ioc_init_reply_endianness(&reply);
  501. mptsas_reply(s, (MPIDefaultReply *)&reply);
  502. }
  503. static void mptsas_process_ioc_facts(MPTSASState *s,
  504. MPIMsgIOCFacts *req)
  505. {
  506. MPIMsgIOCFactsReply reply;
  507. mptsas_fix_ioc_facts_endianness(req);
  508. QEMU_BUILD_BUG_ON(MPTSAS_MAX_REQUEST_SIZE < sizeof(*req));
  509. QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req));
  510. QEMU_BUILD_BUG_ON(sizeof(s->doorbell_reply) < sizeof(reply));
  511. memset(&reply, 0, sizeof(reply));
  512. reply.MsgVersion = 0x0105;
  513. reply.MsgLength = sizeof(reply) / 4;
  514. reply.Function = req->Function;
  515. reply.MsgContext = req->MsgContext;
  516. reply.MaxChainDepth = MPTSAS_MAXIMUM_CHAIN_DEPTH;
  517. reply.WhoInit = s->who_init;
  518. reply.BlockSize = MPTSAS_MAX_REQUEST_SIZE / sizeof(uint32_t);
  519. reply.ReplyQueueDepth = ARRAY_SIZE(s->reply_post) - 1;
  520. QEMU_BUILD_BUG_ON(ARRAY_SIZE(s->reply_post) != ARRAY_SIZE(s->reply_free));
  521. reply.RequestFrameSize = 128;
  522. reply.ProductID = MPTSAS1068_PRODUCT_ID;
  523. reply.CurrentHostMfaHighAddr = s->host_mfa_high_addr >> 32;
  524. reply.GlobalCredits = ARRAY_SIZE(s->request_post) - 1;
  525. reply.NumberOfPorts = MPTSAS_NUM_PORTS;
  526. reply.CurrentSenseBufferHighAddr = s->sense_buffer_high_addr >> 32;
  527. reply.CurReplyFrameSize = s->reply_frame_size;
  528. reply.MaxDevices = s->max_devices;
  529. reply.MaxBuses = s->max_buses;
  530. reply.FWVersionDev = 0;
  531. reply.FWVersionUnit = 0x92;
  532. reply.FWVersionMinor = 0x32;
  533. reply.FWVersionMajor = 0x1;
  534. mptsas_fix_ioc_facts_reply_endianness(&reply);
  535. mptsas_reply(s, (MPIDefaultReply *)&reply);
  536. }
  537. static void mptsas_process_port_facts(MPTSASState *s,
  538. MPIMsgPortFacts *req)
  539. {
  540. MPIMsgPortFactsReply reply;
  541. mptsas_fix_port_facts_endianness(req);
  542. QEMU_BUILD_BUG_ON(MPTSAS_MAX_REQUEST_SIZE < sizeof(*req));
  543. QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req));
  544. QEMU_BUILD_BUG_ON(sizeof(s->doorbell_reply) < sizeof(reply));
  545. memset(&reply, 0, sizeof(reply));
  546. reply.MsgLength = sizeof(reply) / 4;
  547. reply.Function = req->Function;
  548. reply.PortNumber = req->PortNumber;
  549. reply.MsgContext = req->MsgContext;
  550. if (req->PortNumber < MPTSAS_NUM_PORTS) {
  551. reply.PortType = MPI_PORTFACTS_PORTTYPE_SAS;
  552. reply.MaxDevices = MPTSAS_NUM_PORTS;
  553. reply.PortSCSIID = MPTSAS_NUM_PORTS;
  554. reply.ProtocolFlags = MPI_PORTFACTS_PROTOCOL_LOGBUSADDR | MPI_PORTFACTS_PROTOCOL_INITIATOR;
  555. }
  556. mptsas_fix_port_facts_reply_endianness(&reply);
  557. mptsas_reply(s, (MPIDefaultReply *)&reply);
  558. }
  559. static void mptsas_process_port_enable(MPTSASState *s,
  560. MPIMsgPortEnable *req)
  561. {
  562. MPIMsgPortEnableReply reply;
  563. mptsas_fix_port_enable_endianness(req);
  564. QEMU_BUILD_BUG_ON(MPTSAS_MAX_REQUEST_SIZE < sizeof(*req));
  565. QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req));
  566. QEMU_BUILD_BUG_ON(sizeof(s->doorbell_reply) < sizeof(reply));
  567. memset(&reply, 0, sizeof(reply));
  568. reply.MsgLength = sizeof(reply) / 4;
  569. reply.PortNumber = req->PortNumber;
  570. reply.Function = req->Function;
  571. reply.MsgContext = req->MsgContext;
  572. mptsas_fix_port_enable_reply_endianness(&reply);
  573. mptsas_reply(s, (MPIDefaultReply *)&reply);
  574. }
  575. static void mptsas_process_event_notification(MPTSASState *s,
  576. MPIMsgEventNotify *req)
  577. {
  578. MPIMsgEventNotifyReply reply;
  579. mptsas_fix_event_notification_endianness(req);
  580. QEMU_BUILD_BUG_ON(MPTSAS_MAX_REQUEST_SIZE < sizeof(*req));
  581. QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req));
  582. QEMU_BUILD_BUG_ON(sizeof(s->doorbell_reply) < sizeof(reply));
  583. /* Don't even bother storing whether event notification is enabled,
  584. * since it is not accessible.
  585. */
  586. memset(&reply, 0, sizeof(reply));
  587. reply.EventDataLength = sizeof(reply.Data) / 4;
  588. reply.MsgLength = sizeof(reply) / 4;
  589. reply.Function = req->Function;
  590. /* This is set because events are sent through the reply FIFOs. */
  591. reply.MsgFlags = MPI_MSGFLAGS_CONTINUATION_REPLY;
  592. reply.MsgContext = req->MsgContext;
  593. reply.Event = MPI_EVENT_EVENT_CHANGE;
  594. reply.Data[0] = !!req->Switch;
  595. mptsas_fix_event_notification_reply_endianness(&reply);
  596. mptsas_reply(s, (MPIDefaultReply *)&reply);
  597. }
  598. static void mptsas_process_message(MPTSASState *s, MPIRequestHeader *req)
  599. {
  600. trace_mptsas_process_message(s, req->Function, req->MsgContext);
  601. switch (req->Function) {
  602. case MPI_FUNCTION_SCSI_TASK_MGMT:
  603. mptsas_process_scsi_task_mgmt(s, (MPIMsgSCSITaskMgmt *)req);
  604. break;
  605. case MPI_FUNCTION_IOC_INIT:
  606. mptsas_process_ioc_init(s, (MPIMsgIOCInit *)req);
  607. break;
  608. case MPI_FUNCTION_IOC_FACTS:
  609. mptsas_process_ioc_facts(s, (MPIMsgIOCFacts *)req);
  610. break;
  611. case MPI_FUNCTION_PORT_FACTS:
  612. mptsas_process_port_facts(s, (MPIMsgPortFacts *)req);
  613. break;
  614. case MPI_FUNCTION_PORT_ENABLE:
  615. mptsas_process_port_enable(s, (MPIMsgPortEnable *)req);
  616. break;
  617. case MPI_FUNCTION_EVENT_NOTIFICATION:
  618. mptsas_process_event_notification(s, (MPIMsgEventNotify *)req);
  619. break;
  620. case MPI_FUNCTION_CONFIG:
  621. mptsas_process_config(s, (MPIMsgConfig *)req);
  622. break;
  623. default:
  624. trace_mptsas_unhandled_cmd(s, req->Function, 0);
  625. mptsas_set_fault(s, MPI_IOCSTATUS_INVALID_FUNCTION);
  626. break;
  627. }
  628. }
  629. static void mptsas_fetch_request(MPTSASState *s)
  630. {
  631. PCIDevice *pci = (PCIDevice *) s;
  632. char req[MPTSAS_MAX_REQUEST_SIZE];
  633. MPIRequestHeader *hdr = (MPIRequestHeader *)req;
  634. hwaddr addr;
  635. int size;
  636. /* Read the message header from the guest first. */
  637. addr = s->host_mfa_high_addr | MPTSAS_FIFO_GET(s, request_post);
  638. pci_dma_read(pci, addr, req, sizeof(*hdr));
  639. if (hdr->Function < ARRAY_SIZE(mpi_request_sizes) &&
  640. mpi_request_sizes[hdr->Function]) {
  641. /* Read the rest of the request based on the type. Do not
  642. * reread everything, as that could cause a TOC/TOU mismatch
  643. * and leak data from the QEMU stack.
  644. */
  645. size = mpi_request_sizes[hdr->Function];
  646. assert(size <= MPTSAS_MAX_REQUEST_SIZE);
  647. pci_dma_read(pci, addr + sizeof(*hdr), &req[sizeof(*hdr)],
  648. size - sizeof(*hdr));
  649. }
  650. if (hdr->Function == MPI_FUNCTION_SCSI_IO_REQUEST) {
  651. /* SCSI I/O requests are separate from mptsas_process_message
  652. * because they cannot be sent through the doorbell yet.
  653. */
  654. mptsas_process_scsi_io_request(s, (MPIMsgSCSIIORequest *)req, addr);
  655. } else {
  656. mptsas_process_message(s, (MPIRequestHeader *)req);
  657. }
  658. }
  659. static void mptsas_fetch_requests(void *opaque)
  660. {
  661. MPTSASState *s = opaque;
  662. if (s->state != MPI_IOC_STATE_OPERATIONAL) {
  663. mptsas_set_fault(s, MPI_IOCSTATUS_INVALID_STATE);
  664. return;
  665. }
  666. while (!MPTSAS_FIFO_EMPTY(s, request_post)) {
  667. mptsas_fetch_request(s);
  668. }
  669. }
  670. static void mptsas_soft_reset(MPTSASState *s)
  671. {
  672. uint32_t save_mask;
  673. trace_mptsas_reset(s);
  674. /* Temporarily disable interrupts */
  675. save_mask = s->intr_mask;
  676. s->intr_mask = MPI_HIM_DIM | MPI_HIM_RIM;
  677. mptsas_update_interrupt(s);
  678. bus_cold_reset(BUS(&s->bus));
  679. s->intr_status = 0;
  680. s->intr_mask = save_mask;
  681. s->reply_free_tail = 0;
  682. s->reply_free_head = 0;
  683. s->reply_post_tail = 0;
  684. s->reply_post_head = 0;
  685. s->request_post_tail = 0;
  686. s->request_post_head = 0;
  687. qemu_bh_cancel(s->request_bh);
  688. s->state = MPI_IOC_STATE_READY;
  689. }
  690. static uint32_t mptsas_doorbell_read(MPTSASState *s)
  691. {
  692. uint32_t ret;
  693. ret = (s->who_init << MPI_DOORBELL_WHO_INIT_SHIFT) & MPI_DOORBELL_WHO_INIT_MASK;
  694. ret |= s->state;
  695. switch (s->doorbell_state) {
  696. case DOORBELL_NONE:
  697. break;
  698. case DOORBELL_WRITE:
  699. ret |= MPI_DOORBELL_ACTIVE;
  700. break;
  701. case DOORBELL_READ:
  702. /* Get rid of the IOC fault code. */
  703. ret &= ~MPI_DOORBELL_DATA_MASK;
  704. assert(s->intr_status & MPI_HIS_DOORBELL_INTERRUPT);
  705. assert(s->doorbell_reply_idx <= s->doorbell_reply_size);
  706. ret |= MPI_DOORBELL_ACTIVE;
  707. if (s->doorbell_reply_idx < s->doorbell_reply_size) {
  708. /* For more information about this endian switch, see the
  709. * commit message for commit 36b62ae ("fw_cfg: fix endianness in
  710. * fw_cfg_data_mem_read() / _write()", 2015-01-16).
  711. */
  712. ret |= le16_to_cpu(s->doorbell_reply[s->doorbell_reply_idx++]);
  713. }
  714. break;
  715. default:
  716. abort();
  717. }
  718. return ret;
  719. }
  720. static void mptsas_doorbell_write(MPTSASState *s, uint32_t val)
  721. {
  722. if (s->doorbell_state == DOORBELL_WRITE) {
  723. if (s->doorbell_idx < s->doorbell_cnt) {
  724. /* For more information about this endian switch, see the
  725. * commit message for commit 36b62ae ("fw_cfg: fix endianness in
  726. * fw_cfg_data_mem_read() / _write()", 2015-01-16).
  727. */
  728. s->doorbell_msg[s->doorbell_idx++] = cpu_to_le32(val);
  729. if (s->doorbell_idx == s->doorbell_cnt) {
  730. mptsas_process_message(s, (MPIRequestHeader *)s->doorbell_msg);
  731. }
  732. }
  733. return;
  734. }
  735. switch ((val & MPI_DOORBELL_FUNCTION_MASK) >> MPI_DOORBELL_FUNCTION_SHIFT) {
  736. case MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET:
  737. mptsas_soft_reset(s);
  738. break;
  739. case MPI_FUNCTION_IO_UNIT_RESET:
  740. break;
  741. case MPI_FUNCTION_HANDSHAKE:
  742. s->doorbell_state = DOORBELL_WRITE;
  743. s->doorbell_idx = 0;
  744. s->doorbell_cnt = (val & MPI_DOORBELL_ADD_DWORDS_MASK)
  745. >> MPI_DOORBELL_ADD_DWORDS_SHIFT;
  746. s->intr_status |= MPI_HIS_DOORBELL_INTERRUPT;
  747. mptsas_update_interrupt(s);
  748. break;
  749. default:
  750. trace_mptsas_unhandled_doorbell_cmd(s, val);
  751. break;
  752. }
  753. }
  754. static void mptsas_write_sequence_write(MPTSASState *s, uint32_t val)
  755. {
  756. /* If the diagnostic register is enabled, any write to this register
  757. * will disable it. Otherwise, the guest has to do a magic five-write
  758. * sequence.
  759. */
  760. if (s->diagnostic & MPI_DIAG_DRWE) {
  761. goto disable;
  762. }
  763. switch (s->diagnostic_idx) {
  764. case 0:
  765. if ((val & MPI_WRSEQ_KEY_VALUE_MASK) != MPI_WRSEQ_1ST_KEY_VALUE) {
  766. goto disable;
  767. }
  768. break;
  769. case 1:
  770. if ((val & MPI_WRSEQ_KEY_VALUE_MASK) != MPI_WRSEQ_2ND_KEY_VALUE) {
  771. goto disable;
  772. }
  773. break;
  774. case 2:
  775. if ((val & MPI_WRSEQ_KEY_VALUE_MASK) != MPI_WRSEQ_3RD_KEY_VALUE) {
  776. goto disable;
  777. }
  778. break;
  779. case 3:
  780. if ((val & MPI_WRSEQ_KEY_VALUE_MASK) != MPI_WRSEQ_4TH_KEY_VALUE) {
  781. goto disable;
  782. }
  783. break;
  784. case 4:
  785. if ((val & MPI_WRSEQ_KEY_VALUE_MASK) != MPI_WRSEQ_5TH_KEY_VALUE) {
  786. goto disable;
  787. }
  788. /* Prepare Spaceball One for departure, and change the
  789. * combination on my luggage!
  790. */
  791. s->diagnostic |= MPI_DIAG_DRWE;
  792. break;
  793. }
  794. s->diagnostic_idx++;
  795. return;
  796. disable:
  797. s->diagnostic &= ~MPI_DIAG_DRWE;
  798. s->diagnostic_idx = 0;
  799. }
  800. static int mptsas_hard_reset(MPTSASState *s)
  801. {
  802. mptsas_soft_reset(s);
  803. s->intr_mask = MPI_HIM_DIM | MPI_HIM_RIM;
  804. s->host_mfa_high_addr = 0;
  805. s->sense_buffer_high_addr = 0;
  806. s->reply_frame_size = 0;
  807. s->max_devices = MPTSAS_NUM_PORTS;
  808. s->max_buses = 1;
  809. return 0;
  810. }
  811. static void mptsas_interrupt_status_write(MPTSASState *s)
  812. {
  813. switch (s->doorbell_state) {
  814. case DOORBELL_NONE:
  815. case DOORBELL_WRITE:
  816. s->intr_status &= ~MPI_HIS_DOORBELL_INTERRUPT;
  817. break;
  818. case DOORBELL_READ:
  819. /* The reply can be read continuously, so leave the interrupt up. */
  820. assert(s->intr_status & MPI_HIS_DOORBELL_INTERRUPT);
  821. if (s->doorbell_reply_idx == s->doorbell_reply_size) {
  822. s->doorbell_state = DOORBELL_NONE;
  823. }
  824. break;
  825. default:
  826. abort();
  827. }
  828. mptsas_update_interrupt(s);
  829. }
  830. static uint32_t mptsas_reply_post_read(MPTSASState *s)
  831. {
  832. uint32_t ret;
  833. if (!MPTSAS_FIFO_EMPTY(s, reply_post)) {
  834. ret = MPTSAS_FIFO_GET(s, reply_post);
  835. } else {
  836. ret = -1;
  837. s->intr_status &= ~MPI_HIS_REPLY_MESSAGE_INTERRUPT;
  838. mptsas_update_interrupt(s);
  839. }
  840. return ret;
  841. }
  842. static uint64_t mptsas_mmio_read(void *opaque, hwaddr addr,
  843. unsigned size)
  844. {
  845. MPTSASState *s = opaque;
  846. uint32_t ret = 0;
  847. switch (addr & ~3) {
  848. case MPI_DOORBELL_OFFSET:
  849. ret = mptsas_doorbell_read(s);
  850. break;
  851. case MPI_DIAGNOSTIC_OFFSET:
  852. ret = s->diagnostic;
  853. break;
  854. case MPI_HOST_INTERRUPT_STATUS_OFFSET:
  855. ret = s->intr_status;
  856. break;
  857. case MPI_HOST_INTERRUPT_MASK_OFFSET:
  858. ret = s->intr_mask;
  859. break;
  860. case MPI_REPLY_POST_FIFO_OFFSET:
  861. ret = mptsas_reply_post_read(s);
  862. break;
  863. default:
  864. trace_mptsas_mmio_unhandled_read(s, addr);
  865. break;
  866. }
  867. trace_mptsas_mmio_read(s, addr, ret);
  868. return ret;
  869. }
  870. static void mptsas_mmio_write(void *opaque, hwaddr addr,
  871. uint64_t val, unsigned size)
  872. {
  873. MPTSASState *s = opaque;
  874. trace_mptsas_mmio_write(s, addr, val);
  875. switch (addr) {
  876. case MPI_DOORBELL_OFFSET:
  877. mptsas_doorbell_write(s, val);
  878. break;
  879. case MPI_WRITE_SEQUENCE_OFFSET:
  880. mptsas_write_sequence_write(s, val);
  881. break;
  882. case MPI_DIAGNOSTIC_OFFSET:
  883. if (val & MPI_DIAG_RESET_ADAPTER) {
  884. mptsas_hard_reset(s);
  885. }
  886. break;
  887. case MPI_HOST_INTERRUPT_STATUS_OFFSET:
  888. mptsas_interrupt_status_write(s);
  889. break;
  890. case MPI_HOST_INTERRUPT_MASK_OFFSET:
  891. s->intr_mask = val & (MPI_HIM_RIM | MPI_HIM_DIM);
  892. mptsas_update_interrupt(s);
  893. break;
  894. case MPI_REQUEST_POST_FIFO_OFFSET:
  895. if (MPTSAS_FIFO_FULL(s, request_post)) {
  896. mptsas_set_fault(s, MPI_IOCSTATUS_INSUFFICIENT_RESOURCES);
  897. } else {
  898. MPTSAS_FIFO_PUT(s, request_post, val & ~0x03);
  899. qemu_bh_schedule(s->request_bh);
  900. }
  901. break;
  902. case MPI_REPLY_FREE_FIFO_OFFSET:
  903. if (MPTSAS_FIFO_FULL(s, reply_free)) {
  904. mptsas_set_fault(s, MPI_IOCSTATUS_INSUFFICIENT_RESOURCES);
  905. } else {
  906. MPTSAS_FIFO_PUT(s, reply_free, val);
  907. }
  908. break;
  909. default:
  910. trace_mptsas_mmio_unhandled_write(s, addr, val);
  911. break;
  912. }
  913. }
  914. static const MemoryRegionOps mptsas_mmio_ops = {
  915. .read = mptsas_mmio_read,
  916. .write = mptsas_mmio_write,
  917. .endianness = DEVICE_LITTLE_ENDIAN,
  918. .impl = {
  919. .min_access_size = 4,
  920. .max_access_size = 4,
  921. }
  922. };
  923. static const MemoryRegionOps mptsas_port_ops = {
  924. .read = mptsas_mmio_read,
  925. .write = mptsas_mmio_write,
  926. .endianness = DEVICE_LITTLE_ENDIAN,
  927. .impl = {
  928. .min_access_size = 4,
  929. .max_access_size = 4,
  930. }
  931. };
  932. static uint64_t mptsas_diag_read(void *opaque, hwaddr addr,
  933. unsigned size)
  934. {
  935. MPTSASState *s = opaque;
  936. trace_mptsas_diag_read(s, addr, 0);
  937. return 0;
  938. }
  939. static void mptsas_diag_write(void *opaque, hwaddr addr,
  940. uint64_t val, unsigned size)
  941. {
  942. MPTSASState *s = opaque;
  943. trace_mptsas_diag_write(s, addr, val);
  944. }
  945. static const MemoryRegionOps mptsas_diag_ops = {
  946. .read = mptsas_diag_read,
  947. .write = mptsas_diag_write,
  948. .endianness = DEVICE_LITTLE_ENDIAN,
  949. .impl = {
  950. .min_access_size = 4,
  951. .max_access_size = 4,
  952. }
  953. };
  954. static QEMUSGList *mptsas_get_sg_list(SCSIRequest *sreq)
  955. {
  956. MPTSASRequest *req = sreq->hba_private;
  957. return &req->qsg;
  958. }
  959. static void mptsas_command_complete(SCSIRequest *sreq,
  960. size_t resid)
  961. {
  962. MPTSASRequest *req = sreq->hba_private;
  963. MPTSASState *s = req->dev;
  964. uint8_t sense_buf[SCSI_SENSE_BUF_SIZE];
  965. uint8_t sense_len;
  966. hwaddr sense_buffer_addr = req->dev->sense_buffer_high_addr |
  967. req->scsi_io.SenseBufferLowAddr;
  968. trace_mptsas_command_complete(s, req->scsi_io.MsgContext,
  969. sreq->status, resid);
  970. sense_len = scsi_req_get_sense(sreq, sense_buf, SCSI_SENSE_BUF_SIZE);
  971. if (sense_len > 0) {
  972. pci_dma_write(PCI_DEVICE(s), sense_buffer_addr, sense_buf,
  973. MIN(req->scsi_io.SenseBufferLength, sense_len));
  974. }
  975. if (sreq->status != GOOD || resid ||
  976. req->dev->doorbell_state == DOORBELL_WRITE) {
  977. MPIMsgSCSIIOReply reply;
  978. memset(&reply, 0, sizeof(reply));
  979. reply.TargetID = req->scsi_io.TargetID;
  980. reply.Bus = req->scsi_io.Bus;
  981. reply.MsgLength = sizeof(reply) / 4;
  982. reply.Function = req->scsi_io.Function;
  983. reply.CDBLength = req->scsi_io.CDBLength;
  984. reply.SenseBufferLength = req->scsi_io.SenseBufferLength;
  985. reply.MsgFlags = req->scsi_io.MsgFlags;
  986. reply.MsgContext = req->scsi_io.MsgContext;
  987. reply.SCSIStatus = sreq->status;
  988. if (sreq->status == GOOD) {
  989. reply.TransferCount = req->scsi_io.DataLength - resid;
  990. if (resid) {
  991. reply.IOCStatus = MPI_IOCSTATUS_SCSI_DATA_UNDERRUN;
  992. }
  993. } else {
  994. reply.SCSIState = MPI_SCSI_STATE_AUTOSENSE_VALID;
  995. reply.SenseCount = sense_len;
  996. reply.IOCStatus = MPI_IOCSTATUS_SCSI_DATA_UNDERRUN;
  997. }
  998. mptsas_fix_scsi_io_reply_endianness(&reply);
  999. mptsas_post_reply(req->dev, (MPIDefaultReply *)&reply);
  1000. } else {
  1001. mptsas_turbo_reply(req->dev, req->scsi_io.MsgContext);
  1002. }
  1003. mptsas_free_request(req);
  1004. }
  1005. static void mptsas_request_cancelled(SCSIRequest *sreq)
  1006. {
  1007. MPTSASRequest *req = sreq->hba_private;
  1008. MPIMsgSCSIIOReply reply;
  1009. memset(&reply, 0, sizeof(reply));
  1010. reply.TargetID = req->scsi_io.TargetID;
  1011. reply.Bus = req->scsi_io.Bus;
  1012. reply.MsgLength = sizeof(reply) / 4;
  1013. reply.Function = req->scsi_io.Function;
  1014. reply.CDBLength = req->scsi_io.CDBLength;
  1015. reply.SenseBufferLength = req->scsi_io.SenseBufferLength;
  1016. reply.MsgFlags = req->scsi_io.MsgFlags;
  1017. reply.MsgContext = req->scsi_io.MsgContext;
  1018. reply.SCSIState = MPI_SCSI_STATE_NO_SCSI_STATUS;
  1019. reply.IOCStatus = MPI_IOCSTATUS_SCSI_TASK_TERMINATED;
  1020. mptsas_fix_scsi_io_reply_endianness(&reply);
  1021. mptsas_post_reply(req->dev, (MPIDefaultReply *)&reply);
  1022. mptsas_free_request(req);
  1023. }
  1024. static void mptsas_save_request(QEMUFile *f, SCSIRequest *sreq)
  1025. {
  1026. MPTSASRequest *req = sreq->hba_private;
  1027. int i;
  1028. qemu_put_buffer(f, (unsigned char *)&req->scsi_io, sizeof(req->scsi_io));
  1029. qemu_put_be32(f, req->qsg.nsg);
  1030. for (i = 0; i < req->qsg.nsg; i++) {
  1031. qemu_put_be64(f, req->qsg.sg[i].base);
  1032. qemu_put_be64(f, req->qsg.sg[i].len);
  1033. }
  1034. }
  1035. static void *mptsas_load_request(QEMUFile *f, SCSIRequest *sreq)
  1036. {
  1037. SCSIBus *bus = sreq->bus;
  1038. MPTSASState *s = container_of(bus, MPTSASState, bus);
  1039. PCIDevice *pci = PCI_DEVICE(s);
  1040. MPTSASRequest *req;
  1041. int i, n;
  1042. req = g_new(MPTSASRequest, 1);
  1043. qemu_get_buffer(f, (unsigned char *)&req->scsi_io, sizeof(req->scsi_io));
  1044. n = qemu_get_be32(f);
  1045. /* TODO: add a way for SCSIBusInfo's load_request to fail,
  1046. * and fail migration instead of asserting here.
  1047. * This is just one thing (there are probably more) that must be
  1048. * fixed before we can allow NDEBUG compilation.
  1049. */
  1050. assert(n >= 0);
  1051. pci_dma_sglist_init(&req->qsg, pci, n);
  1052. for (i = 0; i < n; i++) {
  1053. uint64_t base = qemu_get_be64(f);
  1054. uint64_t len = qemu_get_be64(f);
  1055. qemu_sglist_add(&req->qsg, base, len);
  1056. }
  1057. scsi_req_ref(sreq);
  1058. req->sreq = sreq;
  1059. req->dev = s;
  1060. return req;
  1061. }
  1062. static const struct SCSIBusInfo mptsas_scsi_info = {
  1063. .tcq = true,
  1064. .max_target = MPTSAS_NUM_PORTS,
  1065. .max_lun = 1,
  1066. .get_sg_list = mptsas_get_sg_list,
  1067. .complete = mptsas_command_complete,
  1068. .cancel = mptsas_request_cancelled,
  1069. .save_request = mptsas_save_request,
  1070. .load_request = mptsas_load_request,
  1071. };
  1072. static void mptsas_scsi_realize(PCIDevice *dev, Error **errp)
  1073. {
  1074. MPTSASState *s = MPT_SAS(dev);
  1075. Error *err = NULL;
  1076. int ret;
  1077. dev->config[PCI_LATENCY_TIMER] = 0;
  1078. dev->config[PCI_INTERRUPT_PIN] = 0x01;
  1079. if (s->msi != ON_OFF_AUTO_OFF) {
  1080. ret = msi_init(dev, 0, 1, true, false, &err);
  1081. /* Any error other than -ENOTSUP(board's MSI support is broken)
  1082. * is a programming error */
  1083. assert(!ret || ret == -ENOTSUP);
  1084. if (ret && s->msi == ON_OFF_AUTO_ON) {
  1085. /* Can't satisfy user's explicit msi=on request, fail */
  1086. error_append_hint(&err, "You have to use msi=auto (default) or "
  1087. "msi=off with this machine type.\n");
  1088. error_propagate(errp, err);
  1089. return;
  1090. }
  1091. assert(!err || s->msi == ON_OFF_AUTO_AUTO);
  1092. /* With msi=auto, we fall back to MSI off silently */
  1093. error_free(err);
  1094. /* Only used for migration. */
  1095. s->msi_in_use = (ret == 0);
  1096. }
  1097. memory_region_init_io(&s->mmio_io, OBJECT(s), &mptsas_mmio_ops, s,
  1098. "mptsas-mmio", 0x4000);
  1099. memory_region_init_io(&s->port_io, OBJECT(s), &mptsas_port_ops, s,
  1100. "mptsas-io", 256);
  1101. memory_region_init_io(&s->diag_io, OBJECT(s), &mptsas_diag_ops, s,
  1102. "mptsas-diag", 0x10000);
  1103. pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->port_io);
  1104. pci_register_bar(dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY |
  1105. PCI_BASE_ADDRESS_MEM_TYPE_32, &s->mmio_io);
  1106. pci_register_bar(dev, 2, PCI_BASE_ADDRESS_SPACE_MEMORY |
  1107. PCI_BASE_ADDRESS_MEM_TYPE_32, &s->diag_io);
  1108. if (!s->sas_addr) {
  1109. s->sas_addr = ((NAA_LOCALLY_ASSIGNED_ID << 24) |
  1110. IEEE_COMPANY_LOCALLY_ASSIGNED) << 36;
  1111. s->sas_addr |= (pci_dev_bus_num(dev) << 16);
  1112. s->sas_addr |= (PCI_SLOT(dev->devfn) << 8);
  1113. s->sas_addr |= PCI_FUNC(dev->devfn);
  1114. }
  1115. s->max_devices = MPTSAS_NUM_PORTS;
  1116. s->request_bh = qemu_bh_new_guarded(mptsas_fetch_requests, s,
  1117. &DEVICE(dev)->mem_reentrancy_guard);
  1118. scsi_bus_init(&s->bus, sizeof(s->bus), &dev->qdev, &mptsas_scsi_info);
  1119. }
  1120. static void mptsas_scsi_uninit(PCIDevice *dev)
  1121. {
  1122. MPTSASState *s = MPT_SAS(dev);
  1123. qemu_bh_delete(s->request_bh);
  1124. msi_uninit(dev);
  1125. }
  1126. static void mptsas_reset(DeviceState *dev)
  1127. {
  1128. MPTSASState *s = MPT_SAS(dev);
  1129. mptsas_hard_reset(s);
  1130. }
  1131. static int mptsas_post_load(void *opaque, int version_id)
  1132. {
  1133. MPTSASState *s = opaque;
  1134. if (s->doorbell_idx > s->doorbell_cnt ||
  1135. s->doorbell_cnt > ARRAY_SIZE(s->doorbell_msg) ||
  1136. s->doorbell_reply_idx > s->doorbell_reply_size ||
  1137. s->doorbell_reply_size > ARRAY_SIZE(s->doorbell_reply) ||
  1138. MPTSAS_FIFO_INVALID(s, request_post) ||
  1139. MPTSAS_FIFO_INVALID(s, reply_post) ||
  1140. MPTSAS_FIFO_INVALID(s, reply_free) ||
  1141. s->diagnostic_idx > 4) {
  1142. return -EINVAL;
  1143. }
  1144. return 0;
  1145. }
  1146. static const VMStateDescription vmstate_mptsas = {
  1147. .name = "mptsas",
  1148. .version_id = 0,
  1149. .minimum_version_id = 0,
  1150. .post_load = mptsas_post_load,
  1151. .fields = (const VMStateField[]) {
  1152. VMSTATE_PCI_DEVICE(dev, MPTSASState),
  1153. VMSTATE_BOOL(msi_in_use, MPTSASState),
  1154. VMSTATE_UINT32(state, MPTSASState),
  1155. VMSTATE_UINT8(who_init, MPTSASState),
  1156. VMSTATE_UINT8(doorbell_state, MPTSASState),
  1157. VMSTATE_UINT32_ARRAY(doorbell_msg, MPTSASState, 256),
  1158. VMSTATE_INT32(doorbell_idx, MPTSASState),
  1159. VMSTATE_INT32(doorbell_cnt, MPTSASState),
  1160. VMSTATE_UINT16_ARRAY(doorbell_reply, MPTSASState, 256),
  1161. VMSTATE_INT32(doorbell_reply_idx, MPTSASState),
  1162. VMSTATE_INT32(doorbell_reply_size, MPTSASState),
  1163. VMSTATE_UINT32(diagnostic, MPTSASState),
  1164. VMSTATE_UINT8(diagnostic_idx, MPTSASState),
  1165. VMSTATE_UINT32(intr_status, MPTSASState),
  1166. VMSTATE_UINT32(intr_mask, MPTSASState),
  1167. VMSTATE_UINT32_ARRAY(request_post, MPTSASState,
  1168. MPTSAS_REQUEST_QUEUE_DEPTH + 1),
  1169. VMSTATE_UINT16(request_post_head, MPTSASState),
  1170. VMSTATE_UINT16(request_post_tail, MPTSASState),
  1171. VMSTATE_UINT32_ARRAY(reply_post, MPTSASState,
  1172. MPTSAS_REPLY_QUEUE_DEPTH + 1),
  1173. VMSTATE_UINT16(reply_post_head, MPTSASState),
  1174. VMSTATE_UINT16(reply_post_tail, MPTSASState),
  1175. VMSTATE_UINT32_ARRAY(reply_free, MPTSASState,
  1176. MPTSAS_REPLY_QUEUE_DEPTH + 1),
  1177. VMSTATE_UINT16(reply_free_head, MPTSASState),
  1178. VMSTATE_UINT16(reply_free_tail, MPTSASState),
  1179. VMSTATE_UINT16(max_buses, MPTSASState),
  1180. VMSTATE_UINT16(max_devices, MPTSASState),
  1181. VMSTATE_UINT16(reply_frame_size, MPTSASState),
  1182. VMSTATE_UINT64(host_mfa_high_addr, MPTSASState),
  1183. VMSTATE_UINT64(sense_buffer_high_addr, MPTSASState),
  1184. VMSTATE_END_OF_LIST()
  1185. }
  1186. };
  1187. static const Property mptsas_properties[] = {
  1188. DEFINE_PROP_UINT64("sas_address", MPTSASState, sas_addr, 0),
  1189. /* TODO: test MSI support under Windows */
  1190. DEFINE_PROP_ON_OFF_AUTO("msi", MPTSASState, msi, ON_OFF_AUTO_AUTO),
  1191. };
  1192. static void mptsas1068_class_init(ObjectClass *oc, void *data)
  1193. {
  1194. DeviceClass *dc = DEVICE_CLASS(oc);
  1195. PCIDeviceClass *pc = PCI_DEVICE_CLASS(oc);
  1196. pc->realize = mptsas_scsi_realize;
  1197. pc->exit = mptsas_scsi_uninit;
  1198. pc->romfile = 0;
  1199. pc->vendor_id = PCI_VENDOR_ID_LSI_LOGIC;
  1200. pc->device_id = PCI_DEVICE_ID_LSI_SAS1068;
  1201. pc->subsystem_vendor_id = PCI_VENDOR_ID_LSI_LOGIC;
  1202. pc->subsystem_id = 0x8000;
  1203. pc->class_id = PCI_CLASS_STORAGE_SCSI;
  1204. device_class_set_props(dc, mptsas_properties);
  1205. device_class_set_legacy_reset(dc, mptsas_reset);
  1206. dc->vmsd = &vmstate_mptsas;
  1207. dc->desc = "LSI SAS 1068";
  1208. set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
  1209. }
  1210. static const TypeInfo mptsas_info = {
  1211. .name = TYPE_MPTSAS1068,
  1212. .parent = TYPE_PCI_DEVICE,
  1213. .instance_size = sizeof(MPTSASState),
  1214. .class_init = mptsas1068_class_init,
  1215. .interfaces = (InterfaceInfo[]) {
  1216. { INTERFACE_CONVENTIONAL_PCI_DEVICE },
  1217. { },
  1218. },
  1219. };
  1220. static void mptsas_register_types(void)
  1221. {
  1222. type_register_static(&mptsas_info);
  1223. }
  1224. type_init(mptsas_register_types)