esp.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772
  1. /*
  2. * QEMU ESP/NCR53C9x emulation
  3. *
  4. * Copyright (c) 2005-2006 Fabrice Bellard
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * of this software and associated documentation files (the "Software"), to deal
  8. * in the Software without restriction, including without limitation the rights
  9. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. * copies of the Software, and to permit persons to whom the Software is
  11. * furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. * THE SOFTWARE.
  23. */
  24. #include "sysbus.h"
  25. #include "scsi.h"
  26. #include "esp.h"
  27. /* debug ESP card */
  28. //#define DEBUG_ESP
  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. #ifdef DEBUG_ESP
  37. #define DPRINTF(fmt, ...) \
  38. do { printf("ESP: " fmt , ## __VA_ARGS__); } while (0)
  39. #else
  40. #define DPRINTF(fmt, ...) do {} while (0)
  41. #endif
  42. #define ESP_ERROR(fmt, ...) \
  43. do { printf("ESP ERROR: %s: " fmt, __func__ , ## __VA_ARGS__); } while (0)
  44. #define ESP_REGS 16
  45. #define TI_BUFSZ 16
  46. typedef struct ESPState ESPState;
  47. struct ESPState {
  48. SysBusDevice busdev;
  49. uint32_t it_shift;
  50. qemu_irq irq;
  51. uint8_t rregs[ESP_REGS];
  52. uint8_t wregs[ESP_REGS];
  53. int32_t ti_size;
  54. uint32_t ti_rptr, ti_wptr;
  55. uint8_t ti_buf[TI_BUFSZ];
  56. uint32_t status;
  57. uint32_t dma;
  58. SCSIBus bus;
  59. SCSIDevice *current_dev;
  60. SCSIRequest *current_req;
  61. uint8_t cmdbuf[TI_BUFSZ];
  62. uint32_t cmdlen;
  63. uint32_t do_cmd;
  64. /* The amount of data left in the current DMA transfer. */
  65. uint32_t dma_left;
  66. /* The size of the current DMA transfer. Zero if no transfer is in
  67. progress. */
  68. uint32_t dma_counter;
  69. uint8_t *async_buf;
  70. uint32_t async_len;
  71. ESPDMAMemoryReadWriteFunc dma_memory_read;
  72. ESPDMAMemoryReadWriteFunc dma_memory_write;
  73. void *dma_opaque;
  74. int dma_enabled;
  75. void (*dma_cb)(ESPState *s);
  76. };
  77. #define ESP_TCLO 0x0
  78. #define ESP_TCMID 0x1
  79. #define ESP_FIFO 0x2
  80. #define ESP_CMD 0x3
  81. #define ESP_RSTAT 0x4
  82. #define ESP_WBUSID 0x4
  83. #define ESP_RINTR 0x5
  84. #define ESP_WSEL 0x5
  85. #define ESP_RSEQ 0x6
  86. #define ESP_WSYNTP 0x6
  87. #define ESP_RFLAGS 0x7
  88. #define ESP_WSYNO 0x7
  89. #define ESP_CFG1 0x8
  90. #define ESP_RRES1 0x9
  91. #define ESP_WCCF 0x9
  92. #define ESP_RRES2 0xa
  93. #define ESP_WTEST 0xa
  94. #define ESP_CFG2 0xb
  95. #define ESP_CFG3 0xc
  96. #define ESP_RES3 0xd
  97. #define ESP_TCHI 0xe
  98. #define ESP_RES4 0xf
  99. #define CMD_DMA 0x80
  100. #define CMD_CMD 0x7f
  101. #define CMD_NOP 0x00
  102. #define CMD_FLUSH 0x01
  103. #define CMD_RESET 0x02
  104. #define CMD_BUSRESET 0x03
  105. #define CMD_TI 0x10
  106. #define CMD_ICCS 0x11
  107. #define CMD_MSGACC 0x12
  108. #define CMD_PAD 0x18
  109. #define CMD_SATN 0x1a
  110. #define CMD_SEL 0x41
  111. #define CMD_SELATN 0x42
  112. #define CMD_SELATNS 0x43
  113. #define CMD_ENSEL 0x44
  114. #define STAT_DO 0x00
  115. #define STAT_DI 0x01
  116. #define STAT_CD 0x02
  117. #define STAT_ST 0x03
  118. #define STAT_MO 0x06
  119. #define STAT_MI 0x07
  120. #define STAT_PIO_MASK 0x06
  121. #define STAT_TC 0x10
  122. #define STAT_PE 0x20
  123. #define STAT_GE 0x40
  124. #define STAT_INT 0x80
  125. #define BUSID_DID 0x07
  126. #define INTR_FC 0x08
  127. #define INTR_BS 0x10
  128. #define INTR_DC 0x20
  129. #define INTR_RST 0x80
  130. #define SEQ_0 0x0
  131. #define SEQ_CD 0x4
  132. #define CFG1_RESREPT 0x40
  133. #define TCHI_FAS100A 0x4
  134. static void esp_raise_irq(ESPState *s)
  135. {
  136. if (!(s->rregs[ESP_RSTAT] & STAT_INT)) {
  137. s->rregs[ESP_RSTAT] |= STAT_INT;
  138. qemu_irq_raise(s->irq);
  139. DPRINTF("Raise IRQ\n");
  140. }
  141. }
  142. static void esp_lower_irq(ESPState *s)
  143. {
  144. if (s->rregs[ESP_RSTAT] & STAT_INT) {
  145. s->rregs[ESP_RSTAT] &= ~STAT_INT;
  146. qemu_irq_lower(s->irq);
  147. DPRINTF("Lower IRQ\n");
  148. }
  149. }
  150. static void esp_dma_enable(void *opaque, int irq, int level)
  151. {
  152. DeviceState *d = opaque;
  153. ESPState *s = container_of(d, ESPState, busdev.qdev);
  154. if (level) {
  155. s->dma_enabled = 1;
  156. DPRINTF("Raise enable\n");
  157. if (s->dma_cb) {
  158. s->dma_cb(s);
  159. s->dma_cb = NULL;
  160. }
  161. } else {
  162. DPRINTF("Lower enable\n");
  163. s->dma_enabled = 0;
  164. }
  165. }
  166. static void esp_request_cancelled(SCSIRequest *req)
  167. {
  168. ESPState *s = DO_UPCAST(ESPState, busdev.qdev, req->bus->qbus.parent);
  169. if (req == s->current_req) {
  170. scsi_req_unref(s->current_req);
  171. s->current_req = NULL;
  172. s->current_dev = NULL;
  173. }
  174. }
  175. static uint32_t get_cmd(ESPState *s, uint8_t *buf)
  176. {
  177. uint32_t dmalen;
  178. int target;
  179. target = s->wregs[ESP_WBUSID] & BUSID_DID;
  180. if (s->dma) {
  181. dmalen = s->rregs[ESP_TCLO] | (s->rregs[ESP_TCMID] << 8);
  182. s->dma_memory_read(s->dma_opaque, buf, dmalen);
  183. } else {
  184. dmalen = s->ti_size;
  185. memcpy(buf, s->ti_buf, dmalen);
  186. buf[0] = buf[2] >> 5;
  187. }
  188. DPRINTF("get_cmd: len %d target %d\n", dmalen, target);
  189. s->ti_size = 0;
  190. s->ti_rptr = 0;
  191. s->ti_wptr = 0;
  192. if (s->current_req) {
  193. /* Started a new command before the old one finished. Cancel it. */
  194. scsi_req_cancel(s->current_req);
  195. s->async_len = 0;
  196. }
  197. if (target >= ESP_MAX_DEVS || !s->bus.devs[target]) {
  198. // No such drive
  199. s->rregs[ESP_RSTAT] = 0;
  200. s->rregs[ESP_RINTR] = INTR_DC;
  201. s->rregs[ESP_RSEQ] = SEQ_0;
  202. esp_raise_irq(s);
  203. return 0;
  204. }
  205. s->current_dev = s->bus.devs[target];
  206. return dmalen;
  207. }
  208. static void do_busid_cmd(ESPState *s, uint8_t *buf, uint8_t busid)
  209. {
  210. int32_t datalen;
  211. int lun;
  212. DPRINTF("do_busid_cmd: busid 0x%x\n", busid);
  213. lun = busid & 7;
  214. s->current_req = scsi_req_new(s->current_dev, 0, lun, NULL);
  215. datalen = scsi_req_enqueue(s->current_req, buf);
  216. s->ti_size = datalen;
  217. if (datalen != 0) {
  218. s->rregs[ESP_RSTAT] = STAT_TC;
  219. s->dma_left = 0;
  220. s->dma_counter = 0;
  221. if (datalen > 0) {
  222. s->rregs[ESP_RSTAT] |= STAT_DI;
  223. } else {
  224. s->rregs[ESP_RSTAT] |= STAT_DO;
  225. }
  226. scsi_req_continue(s->current_req);
  227. }
  228. s->rregs[ESP_RINTR] = INTR_BS | INTR_FC;
  229. s->rregs[ESP_RSEQ] = SEQ_CD;
  230. esp_raise_irq(s);
  231. }
  232. static void do_cmd(ESPState *s, uint8_t *buf)
  233. {
  234. uint8_t busid = buf[0];
  235. do_busid_cmd(s, &buf[1], busid);
  236. }
  237. static void handle_satn(ESPState *s)
  238. {
  239. uint8_t buf[32];
  240. int len;
  241. if (!s->dma_enabled) {
  242. s->dma_cb = handle_satn;
  243. return;
  244. }
  245. len = get_cmd(s, buf);
  246. if (len)
  247. do_cmd(s, buf);
  248. }
  249. static void handle_s_without_atn(ESPState *s)
  250. {
  251. uint8_t buf[32];
  252. int len;
  253. if (!s->dma_enabled) {
  254. s->dma_cb = handle_s_without_atn;
  255. return;
  256. }
  257. len = get_cmd(s, buf);
  258. if (len) {
  259. do_busid_cmd(s, buf, 0);
  260. }
  261. }
  262. static void handle_satn_stop(ESPState *s)
  263. {
  264. if (!s->dma_enabled) {
  265. s->dma_cb = handle_satn_stop;
  266. return;
  267. }
  268. s->cmdlen = get_cmd(s, s->cmdbuf);
  269. if (s->cmdlen) {
  270. DPRINTF("Set ATN & Stop: cmdlen %d\n", s->cmdlen);
  271. s->do_cmd = 1;
  272. s->rregs[ESP_RSTAT] = STAT_TC | STAT_CD;
  273. s->rregs[ESP_RINTR] = INTR_BS | INTR_FC;
  274. s->rregs[ESP_RSEQ] = SEQ_CD;
  275. esp_raise_irq(s);
  276. }
  277. }
  278. static void write_response(ESPState *s)
  279. {
  280. DPRINTF("Transfer status (status=%d)\n", s->status);
  281. s->ti_buf[0] = s->status;
  282. s->ti_buf[1] = 0;
  283. if (s->dma) {
  284. s->dma_memory_write(s->dma_opaque, s->ti_buf, 2);
  285. s->rregs[ESP_RSTAT] = STAT_TC | STAT_ST;
  286. s->rregs[ESP_RINTR] = INTR_BS | INTR_FC;
  287. s->rregs[ESP_RSEQ] = SEQ_CD;
  288. } else {
  289. s->ti_size = 2;
  290. s->ti_rptr = 0;
  291. s->ti_wptr = 0;
  292. s->rregs[ESP_RFLAGS] = 2;
  293. }
  294. esp_raise_irq(s);
  295. }
  296. static void esp_dma_done(ESPState *s)
  297. {
  298. s->rregs[ESP_RSTAT] |= STAT_TC;
  299. s->rregs[ESP_RINTR] = INTR_BS;
  300. s->rregs[ESP_RSEQ] = 0;
  301. s->rregs[ESP_RFLAGS] = 0;
  302. s->rregs[ESP_TCLO] = 0;
  303. s->rregs[ESP_TCMID] = 0;
  304. esp_raise_irq(s);
  305. }
  306. static void esp_do_dma(ESPState *s)
  307. {
  308. uint32_t len;
  309. int to_device;
  310. to_device = (s->ti_size < 0);
  311. len = s->dma_left;
  312. if (s->do_cmd) {
  313. DPRINTF("command len %d + %d\n", s->cmdlen, len);
  314. s->dma_memory_read(s->dma_opaque, &s->cmdbuf[s->cmdlen], len);
  315. s->ti_size = 0;
  316. s->cmdlen = 0;
  317. s->do_cmd = 0;
  318. do_cmd(s, s->cmdbuf);
  319. return;
  320. }
  321. if (s->async_len == 0) {
  322. /* Defer until data is available. */
  323. return;
  324. }
  325. if (len > s->async_len) {
  326. len = s->async_len;
  327. }
  328. if (to_device) {
  329. s->dma_memory_read(s->dma_opaque, s->async_buf, len);
  330. } else {
  331. s->dma_memory_write(s->dma_opaque, s->async_buf, len);
  332. }
  333. s->dma_left -= len;
  334. s->async_buf += len;
  335. s->async_len -= len;
  336. if (to_device)
  337. s->ti_size += len;
  338. else
  339. s->ti_size -= len;
  340. if (s->async_len == 0) {
  341. scsi_req_continue(s->current_req);
  342. /* If there is still data to be read from the device then
  343. complete the DMA operation immediately. Otherwise defer
  344. until the scsi layer has completed. */
  345. if (to_device || s->dma_left != 0 || s->ti_size == 0) {
  346. return;
  347. }
  348. }
  349. /* Partially filled a scsi buffer. Complete immediately. */
  350. esp_dma_done(s);
  351. }
  352. static void esp_command_complete(SCSIRequest *req, uint32_t status)
  353. {
  354. ESPState *s = DO_UPCAST(ESPState, busdev.qdev, req->bus->qbus.parent);
  355. DPRINTF("SCSI Command complete\n");
  356. if (s->ti_size != 0) {
  357. DPRINTF("SCSI command completed unexpectedly\n");
  358. }
  359. s->ti_size = 0;
  360. s->dma_left = 0;
  361. s->async_len = 0;
  362. if (status) {
  363. DPRINTF("Command failed\n");
  364. }
  365. s->status = status;
  366. s->rregs[ESP_RSTAT] = STAT_ST;
  367. esp_dma_done(s);
  368. if (s->current_req) {
  369. scsi_req_unref(s->current_req);
  370. s->current_req = NULL;
  371. s->current_dev = NULL;
  372. }
  373. }
  374. static void esp_transfer_data(SCSIRequest *req, uint32_t len)
  375. {
  376. ESPState *s = DO_UPCAST(ESPState, busdev.qdev, req->bus->qbus.parent);
  377. DPRINTF("transfer %d/%d\n", s->dma_left, s->ti_size);
  378. s->async_len = len;
  379. s->async_buf = scsi_req_get_buf(req);
  380. if (s->dma_left) {
  381. esp_do_dma(s);
  382. } else if (s->dma_counter != 0 && s->ti_size <= 0) {
  383. /* If this was the last part of a DMA transfer then the
  384. completion interrupt is deferred to here. */
  385. esp_dma_done(s);
  386. }
  387. }
  388. static void handle_ti(ESPState *s)
  389. {
  390. uint32_t dmalen, minlen;
  391. dmalen = s->rregs[ESP_TCLO] | (s->rregs[ESP_TCMID] << 8);
  392. if (dmalen==0) {
  393. dmalen=0x10000;
  394. }
  395. s->dma_counter = dmalen;
  396. if (s->do_cmd)
  397. minlen = (dmalen < 32) ? dmalen : 32;
  398. else if (s->ti_size < 0)
  399. minlen = (dmalen < -s->ti_size) ? dmalen : -s->ti_size;
  400. else
  401. minlen = (dmalen < s->ti_size) ? dmalen : s->ti_size;
  402. DPRINTF("Transfer Information len %d\n", minlen);
  403. if (s->dma) {
  404. s->dma_left = minlen;
  405. s->rregs[ESP_RSTAT] &= ~STAT_TC;
  406. esp_do_dma(s);
  407. } else if (s->do_cmd) {
  408. DPRINTF("command len %d\n", s->cmdlen);
  409. s->ti_size = 0;
  410. s->cmdlen = 0;
  411. s->do_cmd = 0;
  412. do_cmd(s, s->cmdbuf);
  413. return;
  414. }
  415. }
  416. static void esp_hard_reset(DeviceState *d)
  417. {
  418. ESPState *s = container_of(d, ESPState, busdev.qdev);
  419. memset(s->rregs, 0, ESP_REGS);
  420. memset(s->wregs, 0, ESP_REGS);
  421. s->rregs[ESP_TCHI] = TCHI_FAS100A; // Indicate fas100a
  422. s->ti_size = 0;
  423. s->ti_rptr = 0;
  424. s->ti_wptr = 0;
  425. s->dma = 0;
  426. s->do_cmd = 0;
  427. s->dma_cb = NULL;
  428. s->rregs[ESP_CFG1] = 7;
  429. }
  430. static void esp_soft_reset(DeviceState *d)
  431. {
  432. ESPState *s = container_of(d, ESPState, busdev.qdev);
  433. qemu_irq_lower(s->irq);
  434. esp_hard_reset(d);
  435. }
  436. static void parent_esp_reset(void *opaque, int irq, int level)
  437. {
  438. if (level) {
  439. esp_soft_reset(opaque);
  440. }
  441. }
  442. static void esp_gpio_demux(void *opaque, int irq, int level)
  443. {
  444. switch (irq) {
  445. case 0:
  446. parent_esp_reset(opaque, irq, level);
  447. break;
  448. case 1:
  449. esp_dma_enable(opaque, irq, level);
  450. break;
  451. }
  452. }
  453. static uint32_t esp_mem_readb(void *opaque, target_phys_addr_t addr)
  454. {
  455. ESPState *s = opaque;
  456. uint32_t saddr, old_val;
  457. saddr = addr >> s->it_shift;
  458. DPRINTF("read reg[%d]: 0x%2.2x\n", saddr, s->rregs[saddr]);
  459. switch (saddr) {
  460. case ESP_FIFO:
  461. if (s->ti_size > 0) {
  462. s->ti_size--;
  463. if ((s->rregs[ESP_RSTAT] & STAT_PIO_MASK) == 0) {
  464. /* Data out. */
  465. ESP_ERROR("PIO data read not implemented\n");
  466. s->rregs[ESP_FIFO] = 0;
  467. } else {
  468. s->rregs[ESP_FIFO] = s->ti_buf[s->ti_rptr++];
  469. }
  470. esp_raise_irq(s);
  471. }
  472. if (s->ti_size == 0) {
  473. s->ti_rptr = 0;
  474. s->ti_wptr = 0;
  475. }
  476. break;
  477. case ESP_RINTR:
  478. /* Clear sequence step, interrupt register and all status bits
  479. except TC */
  480. old_val = s->rregs[ESP_RINTR];
  481. s->rregs[ESP_RINTR] = 0;
  482. s->rregs[ESP_RSTAT] &= ~STAT_TC;
  483. s->rregs[ESP_RSEQ] = SEQ_CD;
  484. esp_lower_irq(s);
  485. return old_val;
  486. default:
  487. break;
  488. }
  489. return s->rregs[saddr];
  490. }
  491. static void esp_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
  492. {
  493. ESPState *s = opaque;
  494. uint32_t saddr;
  495. saddr = addr >> s->it_shift;
  496. DPRINTF("write reg[%d]: 0x%2.2x -> 0x%2.2x\n", saddr, s->wregs[saddr],
  497. val);
  498. switch (saddr) {
  499. case ESP_TCLO:
  500. case ESP_TCMID:
  501. s->rregs[ESP_RSTAT] &= ~STAT_TC;
  502. break;
  503. case ESP_FIFO:
  504. if (s->do_cmd) {
  505. s->cmdbuf[s->cmdlen++] = val & 0xff;
  506. } else if (s->ti_size == TI_BUFSZ - 1) {
  507. ESP_ERROR("fifo overrun\n");
  508. } else {
  509. s->ti_size++;
  510. s->ti_buf[s->ti_wptr++] = val & 0xff;
  511. }
  512. break;
  513. case ESP_CMD:
  514. s->rregs[saddr] = val;
  515. if (val & CMD_DMA) {
  516. s->dma = 1;
  517. /* Reload DMA counter. */
  518. s->rregs[ESP_TCLO] = s->wregs[ESP_TCLO];
  519. s->rregs[ESP_TCMID] = s->wregs[ESP_TCMID];
  520. } else {
  521. s->dma = 0;
  522. }
  523. switch(val & CMD_CMD) {
  524. case CMD_NOP:
  525. DPRINTF("NOP (%2.2x)\n", val);
  526. break;
  527. case CMD_FLUSH:
  528. DPRINTF("Flush FIFO (%2.2x)\n", val);
  529. //s->ti_size = 0;
  530. s->rregs[ESP_RINTR] = INTR_FC;
  531. s->rregs[ESP_RSEQ] = 0;
  532. s->rregs[ESP_RFLAGS] = 0;
  533. break;
  534. case CMD_RESET:
  535. DPRINTF("Chip reset (%2.2x)\n", val);
  536. esp_soft_reset(&s->busdev.qdev);
  537. break;
  538. case CMD_BUSRESET:
  539. DPRINTF("Bus reset (%2.2x)\n", val);
  540. s->rregs[ESP_RINTR] = INTR_RST;
  541. if (!(s->wregs[ESP_CFG1] & CFG1_RESREPT)) {
  542. esp_raise_irq(s);
  543. }
  544. break;
  545. case CMD_TI:
  546. handle_ti(s);
  547. break;
  548. case CMD_ICCS:
  549. DPRINTF("Initiator Command Complete Sequence (%2.2x)\n", val);
  550. write_response(s);
  551. s->rregs[ESP_RINTR] = INTR_FC;
  552. s->rregs[ESP_RSTAT] |= STAT_MI;
  553. break;
  554. case CMD_MSGACC:
  555. DPRINTF("Message Accepted (%2.2x)\n", val);
  556. s->rregs[ESP_RINTR] = INTR_DC;
  557. s->rregs[ESP_RSEQ] = 0;
  558. s->rregs[ESP_RFLAGS] = 0;
  559. esp_raise_irq(s);
  560. break;
  561. case CMD_PAD:
  562. DPRINTF("Transfer padding (%2.2x)\n", val);
  563. s->rregs[ESP_RSTAT] = STAT_TC;
  564. s->rregs[ESP_RINTR] = INTR_FC;
  565. s->rregs[ESP_RSEQ] = 0;
  566. break;
  567. case CMD_SATN:
  568. DPRINTF("Set ATN (%2.2x)\n", val);
  569. break;
  570. case CMD_SEL:
  571. DPRINTF("Select without ATN (%2.2x)\n", val);
  572. handle_s_without_atn(s);
  573. break;
  574. case CMD_SELATN:
  575. DPRINTF("Select with ATN (%2.2x)\n", val);
  576. handle_satn(s);
  577. break;
  578. case CMD_SELATNS:
  579. DPRINTF("Select with ATN & stop (%2.2x)\n", val);
  580. handle_satn_stop(s);
  581. break;
  582. case CMD_ENSEL:
  583. DPRINTF("Enable selection (%2.2x)\n", val);
  584. s->rregs[ESP_RINTR] = 0;
  585. break;
  586. default:
  587. ESP_ERROR("Unhandled ESP command (%2.2x)\n", val);
  588. break;
  589. }
  590. break;
  591. case ESP_WBUSID ... ESP_WSYNO:
  592. break;
  593. case ESP_CFG1:
  594. s->rregs[saddr] = val;
  595. break;
  596. case ESP_WCCF ... ESP_WTEST:
  597. break;
  598. case ESP_CFG2 ... ESP_RES4:
  599. s->rregs[saddr] = val;
  600. break;
  601. default:
  602. ESP_ERROR("invalid write of 0x%02x at [0x%x]\n", val, saddr);
  603. return;
  604. }
  605. s->wregs[saddr] = val;
  606. }
  607. static CPUReadMemoryFunc * const esp_mem_read[3] = {
  608. esp_mem_readb,
  609. NULL,
  610. NULL,
  611. };
  612. static CPUWriteMemoryFunc * const esp_mem_write[3] = {
  613. esp_mem_writeb,
  614. NULL,
  615. esp_mem_writeb,
  616. };
  617. static const VMStateDescription vmstate_esp = {
  618. .name ="esp",
  619. .version_id = 3,
  620. .minimum_version_id = 3,
  621. .minimum_version_id_old = 3,
  622. .fields = (VMStateField []) {
  623. VMSTATE_BUFFER(rregs, ESPState),
  624. VMSTATE_BUFFER(wregs, ESPState),
  625. VMSTATE_INT32(ti_size, ESPState),
  626. VMSTATE_UINT32(ti_rptr, ESPState),
  627. VMSTATE_UINT32(ti_wptr, ESPState),
  628. VMSTATE_BUFFER(ti_buf, ESPState),
  629. VMSTATE_UINT32(status, ESPState),
  630. VMSTATE_UINT32(dma, ESPState),
  631. VMSTATE_BUFFER(cmdbuf, ESPState),
  632. VMSTATE_UINT32(cmdlen, ESPState),
  633. VMSTATE_UINT32(do_cmd, ESPState),
  634. VMSTATE_UINT32(dma_left, ESPState),
  635. VMSTATE_END_OF_LIST()
  636. }
  637. };
  638. void esp_init(target_phys_addr_t espaddr, int it_shift,
  639. ESPDMAMemoryReadWriteFunc dma_memory_read,
  640. ESPDMAMemoryReadWriteFunc dma_memory_write,
  641. void *dma_opaque, qemu_irq irq, qemu_irq *reset,
  642. qemu_irq *dma_enable)
  643. {
  644. DeviceState *dev;
  645. SysBusDevice *s;
  646. ESPState *esp;
  647. dev = qdev_create(NULL, "esp");
  648. esp = DO_UPCAST(ESPState, busdev.qdev, dev);
  649. esp->dma_memory_read = dma_memory_read;
  650. esp->dma_memory_write = dma_memory_write;
  651. esp->dma_opaque = dma_opaque;
  652. esp->it_shift = it_shift;
  653. /* XXX for now until rc4030 has been changed to use DMA enable signal */
  654. esp->dma_enabled = 1;
  655. qdev_init_nofail(dev);
  656. s = sysbus_from_qdev(dev);
  657. sysbus_connect_irq(s, 0, irq);
  658. sysbus_mmio_map(s, 0, espaddr);
  659. *reset = qdev_get_gpio_in(dev, 0);
  660. *dma_enable = qdev_get_gpio_in(dev, 1);
  661. }
  662. static const struct SCSIBusOps esp_scsi_ops = {
  663. .transfer_data = esp_transfer_data,
  664. .complete = esp_command_complete,
  665. .cancel = esp_request_cancelled
  666. };
  667. static int esp_init1(SysBusDevice *dev)
  668. {
  669. ESPState *s = FROM_SYSBUS(ESPState, dev);
  670. int esp_io_memory;
  671. sysbus_init_irq(dev, &s->irq);
  672. assert(s->it_shift != -1);
  673. esp_io_memory = cpu_register_io_memory(esp_mem_read, esp_mem_write, s,
  674. DEVICE_NATIVE_ENDIAN);
  675. sysbus_init_mmio(dev, ESP_REGS << s->it_shift, esp_io_memory);
  676. qdev_init_gpio_in(&dev->qdev, esp_gpio_demux, 2);
  677. scsi_bus_new(&s->bus, &dev->qdev, 0, ESP_MAX_DEVS, &esp_scsi_ops);
  678. return scsi_bus_legacy_handle_cmdline(&s->bus);
  679. }
  680. static SysBusDeviceInfo esp_info = {
  681. .init = esp_init1,
  682. .qdev.name = "esp",
  683. .qdev.size = sizeof(ESPState),
  684. .qdev.vmsd = &vmstate_esp,
  685. .qdev.reset = esp_hard_reset,
  686. .qdev.props = (Property[]) {
  687. {.name = NULL}
  688. }
  689. };
  690. static void esp_register_devices(void)
  691. {
  692. sysbus_register_withprop(&esp_info);
  693. }
  694. device_init(esp_register_devices)