2
0

esp.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  1. /*
  2. * QEMU ESP/NCR53C9x emulation
  3. *
  4. * Copyright (c) 2005-2006 Fabrice Bellard
  5. * Copyright (c) 2012 Herve Poussineau
  6. *
  7. * Permission is hereby granted, free of charge, to any person obtaining a copy
  8. * of this software and associated documentation files (the "Software"), to deal
  9. * in the Software without restriction, including without limitation the rights
  10. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. * copies of the Software, and to permit persons to whom the Software is
  12. * furnished to do so, subject to the following conditions:
  13. *
  14. * The above copyright notice and this permission notice shall be included in
  15. * all copies or substantial portions of the Software.
  16. *
  17. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  20. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23. * THE SOFTWARE.
  24. */
  25. #include "sysbus.h"
  26. #include "esp.h"
  27. #include "trace.h"
  28. #include "qemu/log.h"
  29. /*
  30. * On Sparc32, this is the ESP (NCR53C90) part of chip STP2000 (Master I/O),
  31. * also produced as NCR89C100. See
  32. * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C100.txt
  33. * and
  34. * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR53C9X.txt
  35. */
  36. static void esp_raise_irq(ESPState *s)
  37. {
  38. if (!(s->rregs[ESP_RSTAT] & STAT_INT)) {
  39. s->rregs[ESP_RSTAT] |= STAT_INT;
  40. qemu_irq_raise(s->irq);
  41. trace_esp_raise_irq();
  42. }
  43. }
  44. static void esp_lower_irq(ESPState *s)
  45. {
  46. if (s->rregs[ESP_RSTAT] & STAT_INT) {
  47. s->rregs[ESP_RSTAT] &= ~STAT_INT;
  48. qemu_irq_lower(s->irq);
  49. trace_esp_lower_irq();
  50. }
  51. }
  52. void esp_dma_enable(ESPState *s, int irq, int level)
  53. {
  54. if (level) {
  55. s->dma_enabled = 1;
  56. trace_esp_dma_enable();
  57. if (s->dma_cb) {
  58. s->dma_cb(s);
  59. s->dma_cb = NULL;
  60. }
  61. } else {
  62. trace_esp_dma_disable();
  63. s->dma_enabled = 0;
  64. }
  65. }
  66. void esp_request_cancelled(SCSIRequest *req)
  67. {
  68. ESPState *s = req->hba_private;
  69. if (req == s->current_req) {
  70. scsi_req_unref(s->current_req);
  71. s->current_req = NULL;
  72. s->current_dev = NULL;
  73. }
  74. }
  75. static uint32_t get_cmd(ESPState *s, uint8_t *buf)
  76. {
  77. uint32_t dmalen;
  78. int target;
  79. target = s->wregs[ESP_WBUSID] & BUSID_DID;
  80. if (s->dma) {
  81. dmalen = s->rregs[ESP_TCLO];
  82. dmalen |= s->rregs[ESP_TCMID] << 8;
  83. dmalen |= s->rregs[ESP_TCHI] << 16;
  84. s->dma_memory_read(s->dma_opaque, buf, dmalen);
  85. } else {
  86. dmalen = s->ti_size;
  87. memcpy(buf, s->ti_buf, dmalen);
  88. buf[0] = buf[2] >> 5;
  89. }
  90. trace_esp_get_cmd(dmalen, target);
  91. s->ti_size = 0;
  92. s->ti_rptr = 0;
  93. s->ti_wptr = 0;
  94. if (s->current_req) {
  95. /* Started a new command before the old one finished. Cancel it. */
  96. scsi_req_cancel(s->current_req);
  97. s->async_len = 0;
  98. }
  99. s->current_dev = scsi_device_find(&s->bus, 0, target, 0);
  100. if (!s->current_dev) {
  101. // No such drive
  102. s->rregs[ESP_RSTAT] = 0;
  103. s->rregs[ESP_RINTR] = INTR_DC;
  104. s->rregs[ESP_RSEQ] = SEQ_0;
  105. esp_raise_irq(s);
  106. return 0;
  107. }
  108. return dmalen;
  109. }
  110. static void do_busid_cmd(ESPState *s, uint8_t *buf, uint8_t busid)
  111. {
  112. int32_t datalen;
  113. int lun;
  114. SCSIDevice *current_lun;
  115. trace_esp_do_busid_cmd(busid);
  116. lun = busid & 7;
  117. current_lun = scsi_device_find(&s->bus, 0, s->current_dev->id, lun);
  118. s->current_req = scsi_req_new(current_lun, 0, lun, buf, s);
  119. datalen = scsi_req_enqueue(s->current_req);
  120. s->ti_size = datalen;
  121. if (datalen != 0) {
  122. s->rregs[ESP_RSTAT] = STAT_TC;
  123. s->dma_left = 0;
  124. s->dma_counter = 0;
  125. if (datalen > 0) {
  126. s->rregs[ESP_RSTAT] |= STAT_DI;
  127. } else {
  128. s->rregs[ESP_RSTAT] |= STAT_DO;
  129. }
  130. scsi_req_continue(s->current_req);
  131. }
  132. s->rregs[ESP_RINTR] = INTR_BS | INTR_FC;
  133. s->rregs[ESP_RSEQ] = SEQ_CD;
  134. esp_raise_irq(s);
  135. }
  136. static void do_cmd(ESPState *s, uint8_t *buf)
  137. {
  138. uint8_t busid = buf[0];
  139. do_busid_cmd(s, &buf[1], busid);
  140. }
  141. static void handle_satn(ESPState *s)
  142. {
  143. uint8_t buf[32];
  144. int len;
  145. if (s->dma && !s->dma_enabled) {
  146. s->dma_cb = handle_satn;
  147. return;
  148. }
  149. len = get_cmd(s, buf);
  150. if (len)
  151. do_cmd(s, buf);
  152. }
  153. static void handle_s_without_atn(ESPState *s)
  154. {
  155. uint8_t buf[32];
  156. int len;
  157. if (s->dma && !s->dma_enabled) {
  158. s->dma_cb = handle_s_without_atn;
  159. return;
  160. }
  161. len = get_cmd(s, buf);
  162. if (len) {
  163. do_busid_cmd(s, buf, 0);
  164. }
  165. }
  166. static void handle_satn_stop(ESPState *s)
  167. {
  168. if (s->dma && !s->dma_enabled) {
  169. s->dma_cb = handle_satn_stop;
  170. return;
  171. }
  172. s->cmdlen = get_cmd(s, s->cmdbuf);
  173. if (s->cmdlen) {
  174. trace_esp_handle_satn_stop(s->cmdlen);
  175. s->do_cmd = 1;
  176. s->rregs[ESP_RSTAT] = STAT_TC | STAT_CD;
  177. s->rregs[ESP_RINTR] = INTR_BS | INTR_FC;
  178. s->rregs[ESP_RSEQ] = SEQ_CD;
  179. esp_raise_irq(s);
  180. }
  181. }
  182. static void write_response(ESPState *s)
  183. {
  184. trace_esp_write_response(s->status);
  185. s->ti_buf[0] = s->status;
  186. s->ti_buf[1] = 0;
  187. if (s->dma) {
  188. s->dma_memory_write(s->dma_opaque, s->ti_buf, 2);
  189. s->rregs[ESP_RSTAT] = STAT_TC | STAT_ST;
  190. s->rregs[ESP_RINTR] = INTR_BS | INTR_FC;
  191. s->rregs[ESP_RSEQ] = SEQ_CD;
  192. } else {
  193. s->ti_size = 2;
  194. s->ti_rptr = 0;
  195. s->ti_wptr = 0;
  196. s->rregs[ESP_RFLAGS] = 2;
  197. }
  198. esp_raise_irq(s);
  199. }
  200. static void esp_dma_done(ESPState *s)
  201. {
  202. s->rregs[ESP_RSTAT] |= STAT_TC;
  203. s->rregs[ESP_RINTR] = INTR_BS;
  204. s->rregs[ESP_RSEQ] = 0;
  205. s->rregs[ESP_RFLAGS] = 0;
  206. s->rregs[ESP_TCLO] = 0;
  207. s->rregs[ESP_TCMID] = 0;
  208. s->rregs[ESP_TCHI] = 0;
  209. esp_raise_irq(s);
  210. }
  211. static void esp_do_dma(ESPState *s)
  212. {
  213. uint32_t len;
  214. int to_device;
  215. to_device = (s->ti_size < 0);
  216. len = s->dma_left;
  217. if (s->do_cmd) {
  218. trace_esp_do_dma(s->cmdlen, len);
  219. s->dma_memory_read(s->dma_opaque, &s->cmdbuf[s->cmdlen], len);
  220. s->ti_size = 0;
  221. s->cmdlen = 0;
  222. s->do_cmd = 0;
  223. do_cmd(s, s->cmdbuf);
  224. return;
  225. }
  226. if (s->async_len == 0) {
  227. /* Defer until data is available. */
  228. return;
  229. }
  230. if (len > s->async_len) {
  231. len = s->async_len;
  232. }
  233. if (to_device) {
  234. s->dma_memory_read(s->dma_opaque, s->async_buf, len);
  235. } else {
  236. s->dma_memory_write(s->dma_opaque, s->async_buf, len);
  237. }
  238. s->dma_left -= len;
  239. s->async_buf += len;
  240. s->async_len -= len;
  241. if (to_device)
  242. s->ti_size += len;
  243. else
  244. s->ti_size -= len;
  245. if (s->async_len == 0) {
  246. scsi_req_continue(s->current_req);
  247. /* If there is still data to be read from the device then
  248. complete the DMA operation immediately. Otherwise defer
  249. until the scsi layer has completed. */
  250. if (to_device || s->dma_left != 0 || s->ti_size == 0) {
  251. return;
  252. }
  253. }
  254. /* Partially filled a scsi buffer. Complete immediately. */
  255. esp_dma_done(s);
  256. }
  257. void esp_command_complete(SCSIRequest *req, uint32_t status,
  258. size_t resid)
  259. {
  260. ESPState *s = req->hba_private;
  261. trace_esp_command_complete();
  262. if (s->ti_size != 0) {
  263. trace_esp_command_complete_unexpected();
  264. }
  265. s->ti_size = 0;
  266. s->dma_left = 0;
  267. s->async_len = 0;
  268. if (status) {
  269. trace_esp_command_complete_fail();
  270. }
  271. s->status = status;
  272. s->rregs[ESP_RSTAT] = STAT_ST;
  273. esp_dma_done(s);
  274. if (s->current_req) {
  275. scsi_req_unref(s->current_req);
  276. s->current_req = NULL;
  277. s->current_dev = NULL;
  278. }
  279. }
  280. void esp_transfer_data(SCSIRequest *req, uint32_t len)
  281. {
  282. ESPState *s = req->hba_private;
  283. trace_esp_transfer_data(s->dma_left, s->ti_size);
  284. s->async_len = len;
  285. s->async_buf = scsi_req_get_buf(req);
  286. if (s->dma_left) {
  287. esp_do_dma(s);
  288. } else if (s->dma_counter != 0 && s->ti_size <= 0) {
  289. /* If this was the last part of a DMA transfer then the
  290. completion interrupt is deferred to here. */
  291. esp_dma_done(s);
  292. }
  293. }
  294. static void handle_ti(ESPState *s)
  295. {
  296. uint32_t dmalen, minlen;
  297. if (s->dma && !s->dma_enabled) {
  298. s->dma_cb = handle_ti;
  299. return;
  300. }
  301. dmalen = s->rregs[ESP_TCLO];
  302. dmalen |= s->rregs[ESP_TCMID] << 8;
  303. dmalen |= s->rregs[ESP_TCHI] << 16;
  304. if (dmalen==0) {
  305. dmalen=0x10000;
  306. }
  307. s->dma_counter = dmalen;
  308. if (s->do_cmd)
  309. minlen = (dmalen < 32) ? dmalen : 32;
  310. else if (s->ti_size < 0)
  311. minlen = (dmalen < -s->ti_size) ? dmalen : -s->ti_size;
  312. else
  313. minlen = (dmalen < s->ti_size) ? dmalen : s->ti_size;
  314. trace_esp_handle_ti(minlen);
  315. if (s->dma) {
  316. s->dma_left = minlen;
  317. s->rregs[ESP_RSTAT] &= ~STAT_TC;
  318. esp_do_dma(s);
  319. } else if (s->do_cmd) {
  320. trace_esp_handle_ti_cmd(s->cmdlen);
  321. s->ti_size = 0;
  322. s->cmdlen = 0;
  323. s->do_cmd = 0;
  324. do_cmd(s, s->cmdbuf);
  325. return;
  326. }
  327. }
  328. void esp_hard_reset(ESPState *s)
  329. {
  330. memset(s->rregs, 0, ESP_REGS);
  331. memset(s->wregs, 0, ESP_REGS);
  332. s->rregs[ESP_TCHI] = s->chip_id;
  333. s->ti_size = 0;
  334. s->ti_rptr = 0;
  335. s->ti_wptr = 0;
  336. s->dma = 0;
  337. s->do_cmd = 0;
  338. s->dma_cb = NULL;
  339. s->rregs[ESP_CFG1] = 7;
  340. }
  341. static void esp_soft_reset(ESPState *s)
  342. {
  343. qemu_irq_lower(s->irq);
  344. esp_hard_reset(s);
  345. }
  346. static void parent_esp_reset(ESPState *s, int irq, int level)
  347. {
  348. if (level) {
  349. esp_soft_reset(s);
  350. }
  351. }
  352. uint64_t esp_reg_read(ESPState *s, uint32_t saddr)
  353. {
  354. uint32_t old_val;
  355. trace_esp_mem_readb(saddr, s->rregs[saddr]);
  356. switch (saddr) {
  357. case ESP_FIFO:
  358. if (s->ti_size > 0) {
  359. s->ti_size--;
  360. if ((s->rregs[ESP_RSTAT] & STAT_PIO_MASK) == 0) {
  361. /* Data out. */
  362. qemu_log_mask(LOG_UNIMP,
  363. "esp: PIO data read not implemented\n");
  364. s->rregs[ESP_FIFO] = 0;
  365. } else {
  366. s->rregs[ESP_FIFO] = s->ti_buf[s->ti_rptr++];
  367. }
  368. esp_raise_irq(s);
  369. }
  370. if (s->ti_size == 0) {
  371. s->ti_rptr = 0;
  372. s->ti_wptr = 0;
  373. }
  374. break;
  375. case ESP_RINTR:
  376. /* Clear sequence step, interrupt register and all status bits
  377. except TC */
  378. old_val = s->rregs[ESP_RINTR];
  379. s->rregs[ESP_RINTR] = 0;
  380. s->rregs[ESP_RSTAT] &= ~STAT_TC;
  381. s->rregs[ESP_RSEQ] = SEQ_CD;
  382. esp_lower_irq(s);
  383. return old_val;
  384. default:
  385. break;
  386. }
  387. return s->rregs[saddr];
  388. }
  389. void esp_reg_write(ESPState *s, uint32_t saddr, uint64_t val)
  390. {
  391. trace_esp_mem_writeb(saddr, s->wregs[saddr], val);
  392. switch (saddr) {
  393. case ESP_TCLO:
  394. case ESP_TCMID:
  395. case ESP_TCHI:
  396. s->rregs[ESP_RSTAT] &= ~STAT_TC;
  397. break;
  398. case ESP_FIFO:
  399. if (s->do_cmd) {
  400. s->cmdbuf[s->cmdlen++] = val & 0xff;
  401. } else if (s->ti_size == TI_BUFSZ - 1) {
  402. trace_esp_error_fifo_overrun();
  403. } else {
  404. s->ti_size++;
  405. s->ti_buf[s->ti_wptr++] = val & 0xff;
  406. }
  407. break;
  408. case ESP_CMD:
  409. s->rregs[saddr] = val;
  410. if (val & CMD_DMA) {
  411. s->dma = 1;
  412. /* Reload DMA counter. */
  413. s->rregs[ESP_TCLO] = s->wregs[ESP_TCLO];
  414. s->rregs[ESP_TCMID] = s->wregs[ESP_TCMID];
  415. s->rregs[ESP_TCHI] = s->wregs[ESP_TCHI];
  416. } else {
  417. s->dma = 0;
  418. }
  419. switch(val & CMD_CMD) {
  420. case CMD_NOP:
  421. trace_esp_mem_writeb_cmd_nop(val);
  422. break;
  423. case CMD_FLUSH:
  424. trace_esp_mem_writeb_cmd_flush(val);
  425. //s->ti_size = 0;
  426. s->rregs[ESP_RINTR] = INTR_FC;
  427. s->rregs[ESP_RSEQ] = 0;
  428. s->rregs[ESP_RFLAGS] = 0;
  429. break;
  430. case CMD_RESET:
  431. trace_esp_mem_writeb_cmd_reset(val);
  432. esp_soft_reset(s);
  433. break;
  434. case CMD_BUSRESET:
  435. trace_esp_mem_writeb_cmd_bus_reset(val);
  436. s->rregs[ESP_RINTR] = INTR_RST;
  437. if (!(s->wregs[ESP_CFG1] & CFG1_RESREPT)) {
  438. esp_raise_irq(s);
  439. }
  440. break;
  441. case CMD_TI:
  442. handle_ti(s);
  443. break;
  444. case CMD_ICCS:
  445. trace_esp_mem_writeb_cmd_iccs(val);
  446. write_response(s);
  447. s->rregs[ESP_RINTR] = INTR_FC;
  448. s->rregs[ESP_RSTAT] |= STAT_MI;
  449. break;
  450. case CMD_MSGACC:
  451. trace_esp_mem_writeb_cmd_msgacc(val);
  452. s->rregs[ESP_RINTR] = INTR_DC;
  453. s->rregs[ESP_RSEQ] = 0;
  454. s->rregs[ESP_RFLAGS] = 0;
  455. esp_raise_irq(s);
  456. break;
  457. case CMD_PAD:
  458. trace_esp_mem_writeb_cmd_pad(val);
  459. s->rregs[ESP_RSTAT] = STAT_TC;
  460. s->rregs[ESP_RINTR] = INTR_FC;
  461. s->rregs[ESP_RSEQ] = 0;
  462. break;
  463. case CMD_SATN:
  464. trace_esp_mem_writeb_cmd_satn(val);
  465. break;
  466. case CMD_RSTATN:
  467. trace_esp_mem_writeb_cmd_rstatn(val);
  468. break;
  469. case CMD_SEL:
  470. trace_esp_mem_writeb_cmd_sel(val);
  471. handle_s_without_atn(s);
  472. break;
  473. case CMD_SELATN:
  474. trace_esp_mem_writeb_cmd_selatn(val);
  475. handle_satn(s);
  476. break;
  477. case CMD_SELATNS:
  478. trace_esp_mem_writeb_cmd_selatns(val);
  479. handle_satn_stop(s);
  480. break;
  481. case CMD_ENSEL:
  482. trace_esp_mem_writeb_cmd_ensel(val);
  483. s->rregs[ESP_RINTR] = 0;
  484. break;
  485. case CMD_DISSEL:
  486. trace_esp_mem_writeb_cmd_dissel(val);
  487. s->rregs[ESP_RINTR] = 0;
  488. esp_raise_irq(s);
  489. break;
  490. default:
  491. trace_esp_error_unhandled_command(val);
  492. break;
  493. }
  494. break;
  495. case ESP_WBUSID ... ESP_WSYNO:
  496. break;
  497. case ESP_CFG1:
  498. case ESP_CFG2: case ESP_CFG3:
  499. case ESP_RES3: case ESP_RES4:
  500. s->rregs[saddr] = val;
  501. break;
  502. case ESP_WCCF ... ESP_WTEST:
  503. break;
  504. default:
  505. trace_esp_error_invalid_write(val, saddr);
  506. return;
  507. }
  508. s->wregs[saddr] = val;
  509. }
  510. static bool esp_mem_accepts(void *opaque, hwaddr addr,
  511. unsigned size, bool is_write)
  512. {
  513. return (size == 1) || (is_write && size == 4);
  514. }
  515. const VMStateDescription vmstate_esp = {
  516. .name ="esp",
  517. .version_id = 3,
  518. .minimum_version_id = 3,
  519. .minimum_version_id_old = 3,
  520. .fields = (VMStateField []) {
  521. VMSTATE_BUFFER(rregs, ESPState),
  522. VMSTATE_BUFFER(wregs, ESPState),
  523. VMSTATE_INT32(ti_size, ESPState),
  524. VMSTATE_UINT32(ti_rptr, ESPState),
  525. VMSTATE_UINT32(ti_wptr, ESPState),
  526. VMSTATE_BUFFER(ti_buf, ESPState),
  527. VMSTATE_UINT32(status, ESPState),
  528. VMSTATE_UINT32(dma, ESPState),
  529. VMSTATE_BUFFER(cmdbuf, ESPState),
  530. VMSTATE_UINT32(cmdlen, ESPState),
  531. VMSTATE_UINT32(do_cmd, ESPState),
  532. VMSTATE_UINT32(dma_left, ESPState),
  533. VMSTATE_END_OF_LIST()
  534. }
  535. };
  536. typedef struct {
  537. SysBusDevice busdev;
  538. MemoryRegion iomem;
  539. uint32_t it_shift;
  540. ESPState esp;
  541. } SysBusESPState;
  542. static void sysbus_esp_mem_write(void *opaque, hwaddr addr,
  543. uint64_t val, unsigned int size)
  544. {
  545. SysBusESPState *sysbus = opaque;
  546. uint32_t saddr;
  547. saddr = addr >> sysbus->it_shift;
  548. esp_reg_write(&sysbus->esp, saddr, val);
  549. }
  550. static uint64_t sysbus_esp_mem_read(void *opaque, hwaddr addr,
  551. unsigned int size)
  552. {
  553. SysBusESPState *sysbus = opaque;
  554. uint32_t saddr;
  555. saddr = addr >> sysbus->it_shift;
  556. return esp_reg_read(&sysbus->esp, saddr);
  557. }
  558. static const MemoryRegionOps sysbus_esp_mem_ops = {
  559. .read = sysbus_esp_mem_read,
  560. .write = sysbus_esp_mem_write,
  561. .endianness = DEVICE_NATIVE_ENDIAN,
  562. .valid.accepts = esp_mem_accepts,
  563. };
  564. void esp_init(hwaddr espaddr, int it_shift,
  565. ESPDMAMemoryReadWriteFunc dma_memory_read,
  566. ESPDMAMemoryReadWriteFunc dma_memory_write,
  567. void *dma_opaque, qemu_irq irq, qemu_irq *reset,
  568. qemu_irq *dma_enable)
  569. {
  570. DeviceState *dev;
  571. SysBusDevice *s;
  572. SysBusESPState *sysbus;
  573. ESPState *esp;
  574. dev = qdev_create(NULL, "esp");
  575. sysbus = DO_UPCAST(SysBusESPState, busdev.qdev, dev);
  576. esp = &sysbus->esp;
  577. esp->dma_memory_read = dma_memory_read;
  578. esp->dma_memory_write = dma_memory_write;
  579. esp->dma_opaque = dma_opaque;
  580. sysbus->it_shift = it_shift;
  581. /* XXX for now until rc4030 has been changed to use DMA enable signal */
  582. esp->dma_enabled = 1;
  583. qdev_init_nofail(dev);
  584. s = SYS_BUS_DEVICE(dev);
  585. sysbus_connect_irq(s, 0, irq);
  586. sysbus_mmio_map(s, 0, espaddr);
  587. *reset = qdev_get_gpio_in(dev, 0);
  588. *dma_enable = qdev_get_gpio_in(dev, 1);
  589. }
  590. static const struct SCSIBusInfo esp_scsi_info = {
  591. .tcq = false,
  592. .max_target = ESP_MAX_DEVS,
  593. .max_lun = 7,
  594. .transfer_data = esp_transfer_data,
  595. .complete = esp_command_complete,
  596. .cancel = esp_request_cancelled
  597. };
  598. static void sysbus_esp_gpio_demux(void *opaque, int irq, int level)
  599. {
  600. DeviceState *d = opaque;
  601. SysBusESPState *sysbus = container_of(d, SysBusESPState, busdev.qdev);
  602. ESPState *s = &sysbus->esp;
  603. switch (irq) {
  604. case 0:
  605. parent_esp_reset(s, irq, level);
  606. break;
  607. case 1:
  608. esp_dma_enable(opaque, irq, level);
  609. break;
  610. }
  611. }
  612. static int sysbus_esp_init(SysBusDevice *dev)
  613. {
  614. SysBusESPState *sysbus = FROM_SYSBUS(SysBusESPState, dev);
  615. ESPState *s = &sysbus->esp;
  616. sysbus_init_irq(dev, &s->irq);
  617. assert(sysbus->it_shift != -1);
  618. s->chip_id = TCHI_FAS100A;
  619. memory_region_init_io(&sysbus->iomem, &sysbus_esp_mem_ops, sysbus,
  620. "esp", ESP_REGS << sysbus->it_shift);
  621. sysbus_init_mmio(dev, &sysbus->iomem);
  622. qdev_init_gpio_in(&dev->qdev, sysbus_esp_gpio_demux, 2);
  623. scsi_bus_new(&s->bus, &dev->qdev, &esp_scsi_info);
  624. return scsi_bus_legacy_handle_cmdline(&s->bus);
  625. }
  626. static void sysbus_esp_hard_reset(DeviceState *dev)
  627. {
  628. SysBusESPState *sysbus = DO_UPCAST(SysBusESPState, busdev.qdev, dev);
  629. esp_hard_reset(&sysbus->esp);
  630. }
  631. static const VMStateDescription vmstate_sysbus_esp_scsi = {
  632. .name = "sysbusespscsi",
  633. .version_id = 0,
  634. .minimum_version_id = 0,
  635. .minimum_version_id_old = 0,
  636. .fields = (VMStateField[]) {
  637. VMSTATE_STRUCT(esp, SysBusESPState, 0, vmstate_esp, ESPState),
  638. VMSTATE_END_OF_LIST()
  639. }
  640. };
  641. static void sysbus_esp_class_init(ObjectClass *klass, void *data)
  642. {
  643. DeviceClass *dc = DEVICE_CLASS(klass);
  644. SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
  645. k->init = sysbus_esp_init;
  646. dc->reset = sysbus_esp_hard_reset;
  647. dc->vmsd = &vmstate_sysbus_esp_scsi;
  648. }
  649. static const TypeInfo sysbus_esp_info = {
  650. .name = "esp",
  651. .parent = TYPE_SYS_BUS_DEVICE,
  652. .instance_size = sizeof(SysBusESPState),
  653. .class_init = sysbus_esp_class_init,
  654. };
  655. static void esp_register_types(void)
  656. {
  657. type_register_static(&sysbus_esp_info);
  658. }
  659. type_init(esp_register_types)