mptsas.c 45 KB

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