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