1
2
3
4
5
6
7
8
9
10
11
12
13#include <assert.h>
14
15#include "hw.h"
16#include "pci/pci.h"
17#include "scsi.h"
18#include "sysemu/dma.h"
19
20
21
22
23#ifdef DEBUG_LSI
24#define DPRINTF(fmt, ...) \
25do { printf("lsi_scsi: " fmt , ## __VA_ARGS__); } while (0)
26#define BADF(fmt, ...) \
27do { fprintf(stderr, "lsi_scsi: error: " fmt , ## __VA_ARGS__); exit(1);} while (0)
28#else
29#define DPRINTF(fmt, ...) do {} while(0)
30#define BADF(fmt, ...) \
31do { fprintf(stderr, "lsi_scsi: error: " fmt , ## __VA_ARGS__);} while (0)
32#endif
33
34#define LSI_MAX_DEVS 7
35
36#define LSI_SCNTL0_TRG 0x01
37#define LSI_SCNTL0_AAP 0x02
38#define LSI_SCNTL0_EPC 0x08
39#define LSI_SCNTL0_WATN 0x10
40#define LSI_SCNTL0_START 0x20
41
42#define LSI_SCNTL1_SST 0x01
43#define LSI_SCNTL1_IARB 0x02
44#define LSI_SCNTL1_AESP 0x04
45#define LSI_SCNTL1_RST 0x08
46#define LSI_SCNTL1_CON 0x10
47#define LSI_SCNTL1_DHP 0x20
48#define LSI_SCNTL1_ADB 0x40
49#define LSI_SCNTL1_EXC 0x80
50
51#define LSI_SCNTL2_WSR 0x01
52#define LSI_SCNTL2_VUE0 0x02
53#define LSI_SCNTL2_VUE1 0x04
54#define LSI_SCNTL2_WSS 0x08
55#define LSI_SCNTL2_SLPHBEN 0x10
56#define LSI_SCNTL2_SLPMD 0x20
57#define LSI_SCNTL2_CHM 0x40
58#define LSI_SCNTL2_SDU 0x80
59
60#define LSI_ISTAT0_DIP 0x01
61#define LSI_ISTAT0_SIP 0x02
62#define LSI_ISTAT0_INTF 0x04
63#define LSI_ISTAT0_CON 0x08
64#define LSI_ISTAT0_SEM 0x10
65#define LSI_ISTAT0_SIGP 0x20
66#define LSI_ISTAT0_SRST 0x40
67#define LSI_ISTAT0_ABRT 0x80
68
69#define LSI_ISTAT1_SI 0x01
70#define LSI_ISTAT1_SRUN 0x02
71#define LSI_ISTAT1_FLSH 0x04
72
73#define LSI_SSTAT0_SDP0 0x01
74#define LSI_SSTAT0_RST 0x02
75#define LSI_SSTAT0_WOA 0x04
76#define LSI_SSTAT0_LOA 0x08
77#define LSI_SSTAT0_AIP 0x10
78#define LSI_SSTAT0_OLF 0x20
79#define LSI_SSTAT0_ORF 0x40
80#define LSI_SSTAT0_ILF 0x80
81
82#define LSI_SIST0_PAR 0x01
83#define LSI_SIST0_RST 0x02
84#define LSI_SIST0_UDC 0x04
85#define LSI_SIST0_SGE 0x08
86#define LSI_SIST0_RSL 0x10
87#define LSI_SIST0_SEL 0x20
88#define LSI_SIST0_CMP 0x40
89#define LSI_SIST0_MA 0x80
90
91#define LSI_SIST1_HTH 0x01
92#define LSI_SIST1_GEN 0x02
93#define LSI_SIST1_STO 0x04
94#define LSI_SIST1_SBMC 0x10
95
96#define LSI_SOCL_IO 0x01
97#define LSI_SOCL_CD 0x02
98#define LSI_SOCL_MSG 0x04
99#define LSI_SOCL_ATN 0x08
100#define LSI_SOCL_SEL 0x10
101#define LSI_SOCL_BSY 0x20
102#define LSI_SOCL_ACK 0x40
103#define LSI_SOCL_REQ 0x80
104
105#define LSI_DSTAT_IID 0x01
106#define LSI_DSTAT_SIR 0x04
107#define LSI_DSTAT_SSI 0x08
108#define LSI_DSTAT_ABRT 0x10
109#define LSI_DSTAT_BF 0x20
110#define LSI_DSTAT_MDPE 0x40
111#define LSI_DSTAT_DFE 0x80
112
113#define LSI_DCNTL_COM 0x01
114#define LSI_DCNTL_IRQD 0x02
115#define LSI_DCNTL_STD 0x04
116#define LSI_DCNTL_IRQM 0x08
117#define LSI_DCNTL_SSM 0x10
118#define LSI_DCNTL_PFEN 0x20
119#define LSI_DCNTL_PFF 0x40
120#define LSI_DCNTL_CLSE 0x80
121
122#define LSI_DMODE_MAN 0x01
123#define LSI_DMODE_BOF 0x02
124#define LSI_DMODE_ERMP 0x04
125#define LSI_DMODE_ERL 0x08
126#define LSI_DMODE_DIOM 0x10
127#define LSI_DMODE_SIOM 0x20
128
129#define LSI_CTEST2_DACK 0x01
130#define LSI_CTEST2_DREQ 0x02
131#define LSI_CTEST2_TEOP 0x04
132#define LSI_CTEST2_PCICIE 0x08
133#define LSI_CTEST2_CM 0x10
134#define LSI_CTEST2_CIO 0x20
135#define LSI_CTEST2_SIGP 0x40
136#define LSI_CTEST2_DDIR 0x80
137
138#define LSI_CTEST5_BL2 0x04
139#define LSI_CTEST5_DDIR 0x08
140#define LSI_CTEST5_MASR 0x10
141#define LSI_CTEST5_DFSN 0x20
142#define LSI_CTEST5_BBCK 0x40
143#define LSI_CTEST5_ADCK 0x80
144
145#define LSI_CCNTL0_DILS 0x01
146#define LSI_CCNTL0_DISFC 0x10
147#define LSI_CCNTL0_ENNDJ 0x20
148#define LSI_CCNTL0_PMJCTL 0x40
149#define LSI_CCNTL0_ENPMJ 0x80
150
151#define LSI_CCNTL1_EN64DBMV 0x01
152#define LSI_CCNTL1_EN64TIBMV 0x02
153#define LSI_CCNTL1_64TIMOD 0x04
154#define LSI_CCNTL1_DDAC 0x08
155#define LSI_CCNTL1_ZMOD 0x80
156
157
158#define LSI_SCID_RRE 0x60
159
160#define LSI_CCNTL1_40BIT (LSI_CCNTL1_EN64TIBMV|LSI_CCNTL1_64TIMOD)
161
162#define PHASE_DO 0
163#define PHASE_DI 1
164#define PHASE_CMD 2
165#define PHASE_ST 3
166#define PHASE_MO 6
167#define PHASE_MI 7
168#define PHASE_MASK 7
169
170
171#define LSI_MAX_MSGIN_LEN 8
172
173
174#define LSI_TAG_VALID (1 << 16)
175
176typedef struct lsi_request {
177 SCSIRequest *req;
178 uint32_t tag;
179 uint32_t dma_len;
180 uint8_t *dma_buf;
181 uint32_t pending;
182 int out;
183 QTAILQ_ENTRY(lsi_request) next;
184} lsi_request;
185
186typedef struct {
187 PCIDevice dev;
188 MemoryRegion mmio_io;
189 MemoryRegion ram_io;
190 MemoryRegion io_io;
191
192 int carry;
193 int status;
194
195
196 int msg_action;
197 int msg_len;
198 uint8_t msg[LSI_MAX_MSGIN_LEN];
199
200
201
202
203 int waiting;
204 SCSIBus bus;
205 int current_lun;
206
207 uint32_t select_tag;
208 int command_complete;
209 QTAILQ_HEAD(, lsi_request) queue;
210 lsi_request *current;
211
212 uint32_t dsa;
213 uint32_t temp;
214 uint32_t dnad;
215 uint32_t dbc;
216 uint8_t istat0;
217 uint8_t istat1;
218 uint8_t dcmd;
219 uint8_t dstat;
220 uint8_t dien;
221 uint8_t sist0;
222 uint8_t sist1;
223 uint8_t sien0;
224 uint8_t sien1;
225 uint8_t mbox0;
226 uint8_t mbox1;
227 uint8_t dfifo;
228 uint8_t ctest2;
229 uint8_t ctest3;
230 uint8_t ctest4;
231 uint8_t ctest5;
232 uint8_t ccntl0;
233 uint8_t ccntl1;
234 uint32_t dsp;
235 uint32_t dsps;
236 uint8_t dmode;
237 uint8_t dcntl;
238 uint8_t scntl0;
239 uint8_t scntl1;
240 uint8_t scntl2;
241 uint8_t scntl3;
242 uint8_t sstat0;
243 uint8_t sstat1;
244 uint8_t scid;
245 uint8_t sxfer;
246 uint8_t socl;
247 uint8_t sdid;
248 uint8_t ssid;
249 uint8_t sfbr;
250 uint8_t stest1;
251 uint8_t stest2;
252 uint8_t stest3;
253 uint8_t sidl;
254 uint8_t stime0;
255 uint8_t respid0;
256 uint8_t respid1;
257 uint32_t mmrs;
258 uint32_t mmws;
259 uint32_t sfs;
260 uint32_t drs;
261 uint32_t sbms;
262 uint32_t dbms;
263 uint32_t dnad64;
264 uint32_t pmjad1;
265 uint32_t pmjad2;
266 uint32_t rbc;
267 uint32_t ua;
268 uint32_t ia;
269 uint32_t sbc;
270 uint32_t csbc;
271 uint32_t scratch[18];
272 uint8_t sbr;
273
274
275 uint32_t script_ram[2048];
276} LSIState;
277
278static inline int lsi_irq_on_rsl(LSIState *s)
279{
280 return (s->sien0 & LSI_SIST0_RSL) && (s->scid & LSI_SCID_RRE);
281}
282
283static void lsi_soft_reset(LSIState *s)
284{
285 DPRINTF("Reset\n");
286 s->carry = 0;
287
288 s->msg_action = 0;
289 s->msg_len = 0;
290 s->waiting = 0;
291 s->dsa = 0;
292 s->dnad = 0;
293 s->dbc = 0;
294 s->temp = 0;
295 memset(s->scratch, 0, sizeof(s->scratch));
296 s->istat0 = 0;
297 s->istat1 = 0;
298 s->dcmd = 0x40;
299 s->dstat = LSI_DSTAT_DFE;
300 s->dien = 0;
301 s->sist0 = 0;
302 s->sist1 = 0;
303 s->sien0 = 0;
304 s->sien1 = 0;
305 s->mbox0 = 0;
306 s->mbox1 = 0;
307 s->dfifo = 0;
308 s->ctest2 = LSI_CTEST2_DACK;
309 s->ctest3 = 0;
310 s->ctest4 = 0;
311 s->ctest5 = 0;
312 s->ccntl0 = 0;
313 s->ccntl1 = 0;
314 s->dsp = 0;
315 s->dsps = 0;
316 s->dmode = 0;
317 s->dcntl = 0;
318 s->scntl0 = 0xc0;
319 s->scntl1 = 0;
320 s->scntl2 = 0;
321 s->scntl3 = 0;
322 s->sstat0 = 0;
323 s->sstat1 = 0;
324 s->scid = 7;
325 s->sxfer = 0;
326 s->socl = 0;
327 s->sdid = 0;
328 s->ssid = 0;
329 s->stest1 = 0;
330 s->stest2 = 0;
331 s->stest3 = 0;
332 s->sidl = 0;
333 s->stime0 = 0;
334 s->respid0 = 0x80;
335 s->respid1 = 0;
336 s->mmrs = 0;
337 s->mmws = 0;
338 s->sfs = 0;
339 s->drs = 0;
340 s->sbms = 0;
341 s->dbms = 0;
342 s->dnad64 = 0;
343 s->pmjad1 = 0;
344 s->pmjad2 = 0;
345 s->rbc = 0;
346 s->ua = 0;
347 s->ia = 0;
348 s->sbc = 0;
349 s->csbc = 0;
350 s->sbr = 0;
351 assert(QTAILQ_EMPTY(&s->queue));
352 assert(!s->current);
353}
354
355static int lsi_dma_40bit(LSIState *s)
356{
357 if ((s->ccntl1 & LSI_CCNTL1_40BIT) == LSI_CCNTL1_40BIT)
358 return 1;
359 return 0;
360}
361
362static int lsi_dma_ti64bit(LSIState *s)
363{
364 if ((s->ccntl1 & LSI_CCNTL1_EN64TIBMV) == LSI_CCNTL1_EN64TIBMV)
365 return 1;
366 return 0;
367}
368
369static int lsi_dma_64bit(LSIState *s)
370{
371 if ((s->ccntl1 & LSI_CCNTL1_EN64DBMV) == LSI_CCNTL1_EN64DBMV)
372 return 1;
373 return 0;
374}
375
376static uint8_t lsi_reg_readb(LSIState *s, int offset);
377static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val);
378static void lsi_execute_script(LSIState *s);
379static void lsi_reselect(LSIState *s, lsi_request *p);
380
381static inline uint32_t read_dword(LSIState *s, uint32_t addr)
382{
383 uint32_t buf;
384
385 pci_dma_read(&s->dev, addr, &buf, 4);
386 return cpu_to_le32(buf);
387}
388
389static void lsi_stop_script(LSIState *s)
390{
391 s->istat1 &= ~LSI_ISTAT1_SRUN;
392}
393
394static void lsi_update_irq(LSIState *s)
395{
396 int level;
397 static int last_level;
398 lsi_request *p;
399
400
401
402
403 level = 0;
404 if (s->dstat) {
405 if (s->dstat & s->dien)
406 level = 1;
407 s->istat0 |= LSI_ISTAT0_DIP;
408 } else {
409 s->istat0 &= ~LSI_ISTAT0_DIP;
410 }
411
412 if (s->sist0 || s->sist1) {
413 if ((s->sist0 & s->sien0) || (s->sist1 & s->sien1))
414 level = 1;
415 s->istat0 |= LSI_ISTAT0_SIP;
416 } else {
417 s->istat0 &= ~LSI_ISTAT0_SIP;
418 }
419 if (s->istat0 & LSI_ISTAT0_INTF)
420 level = 1;
421
422 if (level != last_level) {
423 DPRINTF("Update IRQ level %d dstat %02x sist %02x%02x\n",
424 level, s->dstat, s->sist1, s->sist0);
425 last_level = level;
426 }
427 qemu_set_irq(s->dev.irq[0], level);
428
429 if (!level && lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON)) {
430 DPRINTF("Handled IRQs & disconnected, looking for pending "
431 "processes\n");
432 QTAILQ_FOREACH(p, &s->queue, next) {
433 if (p->pending) {
434 lsi_reselect(s, p);
435 break;
436 }
437 }
438 }
439}
440
441
442static void lsi_script_scsi_interrupt(LSIState *s, int stat0, int stat1)
443{
444 uint32_t mask0;
445 uint32_t mask1;
446
447 DPRINTF("SCSI Interrupt 0x%02x%02x prev 0x%02x%02x\n",
448 stat1, stat0, s->sist1, s->sist0);
449 s->sist0 |= stat0;
450 s->sist1 |= stat1;
451
452
453
454 mask0 = s->sien0 | ~(LSI_SIST0_CMP | LSI_SIST0_SEL | LSI_SIST0_RSL);
455 mask1 = s->sien1 | ~(LSI_SIST1_GEN | LSI_SIST1_HTH);
456 mask1 &= ~LSI_SIST1_STO;
457 if (s->sist0 & mask0 || s->sist1 & mask1) {
458 lsi_stop_script(s);
459 }
460 lsi_update_irq(s);
461}
462
463
464static void lsi_script_dma_interrupt(LSIState *s, int stat)
465{
466 DPRINTF("DMA Interrupt 0x%x prev 0x%x\n", stat, s->dstat);
467 s->dstat |= stat;
468 lsi_update_irq(s);
469 lsi_stop_script(s);
470}
471
472static inline void lsi_set_phase(LSIState *s, int phase)
473{
474 s->sstat1 = (s->sstat1 & ~PHASE_MASK) | phase;
475}
476
477static void lsi_bad_phase(LSIState *s, int out, int new_phase)
478{
479
480 if (s->ccntl0 & LSI_CCNTL0_ENPMJ) {
481 if ((s->ccntl0 & LSI_CCNTL0_PMJCTL)) {
482 s->dsp = out ? s->pmjad1 : s->pmjad2;
483 } else {
484 s->dsp = (s->scntl2 & LSI_SCNTL2_WSR ? s->pmjad2 : s->pmjad1);
485 }
486 DPRINTF("Data phase mismatch jump to %08x\n", s->dsp);
487 } else {
488 DPRINTF("Phase mismatch interrupt\n");
489 lsi_script_scsi_interrupt(s, LSI_SIST0_MA, 0);
490 lsi_stop_script(s);
491 }
492 lsi_set_phase(s, new_phase);
493}
494
495
496
497static void lsi_resume_script(LSIState *s)
498{
499 if (s->waiting != 2) {
500 s->waiting = 0;
501 lsi_execute_script(s);
502 } else {
503 s->waiting = 0;
504 }
505}
506
507static void lsi_disconnect(LSIState *s)
508{
509 s->scntl1 &= ~LSI_SCNTL1_CON;
510 s->sstat1 &= ~PHASE_MASK;
511}
512
513static void lsi_bad_selection(LSIState *s, uint32_t id)
514{
515 DPRINTF("Selected absent target %d\n", id);
516 lsi_script_scsi_interrupt(s, 0, LSI_SIST1_STO);
517 lsi_disconnect(s);
518}
519
520
521static void lsi_do_dma(LSIState *s, int out)
522{
523 uint32_t count;
524 dma_addr_t addr;
525 SCSIDevice *dev;
526
527 assert(s->current);
528 if (!s->current->dma_len) {
529
530 DPRINTF("DMA no data available\n");
531 return;
532 }
533
534 dev = s->current->req->dev;
535 assert(dev);
536
537 count = s->dbc;
538 if (count > s->current->dma_len)
539 count = s->current->dma_len;
540
541 addr = s->dnad;
542
543 if (lsi_dma_40bit(s) || lsi_dma_ti64bit(s))
544 addr |= ((uint64_t)s->dnad64 << 32);
545 else if (s->dbms)
546 addr |= ((uint64_t)s->dbms << 32);
547 else if (s->sbms)
548 addr |= ((uint64_t)s->sbms << 32);
549
550 DPRINTF("DMA addr=0x" DMA_ADDR_FMT " len=%d\n", addr, count);
551 s->csbc += count;
552 s->dnad += count;
553 s->dbc -= count;
554 if (s->current->dma_buf == NULL) {
555 s->current->dma_buf = scsi_req_get_buf(s->current->req);
556 }
557
558 if (out) {
559 pci_dma_read(&s->dev, addr, s->current->dma_buf, count);
560 } else {
561 pci_dma_write(&s->dev, addr, s->current->dma_buf, count);
562 }
563 s->current->dma_len -= count;
564 if (s->current->dma_len == 0) {
565 s->current->dma_buf = NULL;
566 scsi_req_continue(s->current->req);
567 } else {
568 s->current->dma_buf += count;
569 lsi_resume_script(s);
570 }
571}
572
573
574
575static void lsi_queue_command(LSIState *s)
576{
577 lsi_request *p = s->current;
578
579 DPRINTF("Queueing tag=0x%x\n", p->tag);
580 assert(s->current != NULL);
581 assert(s->current->dma_len == 0);
582 QTAILQ_INSERT_TAIL(&s->queue, s->current, next);
583 s->current = NULL;
584
585 p->pending = 0;
586 p->out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
587}
588
589
590static void lsi_add_msg_byte(LSIState *s, uint8_t data)
591{
592 if (s->msg_len >= LSI_MAX_MSGIN_LEN) {
593 BADF("MSG IN data too long\n");
594 } else {
595 DPRINTF("MSG IN 0x%02x\n", data);
596 s->msg[s->msg_len++] = data;
597 }
598}
599
600
601static void lsi_reselect(LSIState *s, lsi_request *p)
602{
603 int id;
604
605 assert(s->current == NULL);
606 QTAILQ_REMOVE(&s->queue, p, next);
607 s->current = p;
608
609 id = (p->tag >> 8) & 0xf;
610 s->ssid = id | 0x80;
611
612 if (!(s->dcntl & LSI_DCNTL_COM)) {
613 s->sfbr = 1 << (id & 0x7);
614 }
615 DPRINTF("Reselected target %d\n", id);
616 s->scntl1 |= LSI_SCNTL1_CON;
617 lsi_set_phase(s, PHASE_MI);
618 s->msg_action = p->out ? 2 : 3;
619 s->current->dma_len = p->pending;
620 lsi_add_msg_byte(s, 0x80);
621 if (s->current->tag & LSI_TAG_VALID) {
622 lsi_add_msg_byte(s, 0x20);
623 lsi_add_msg_byte(s, p->tag & 0xff);
624 }
625
626 if (lsi_irq_on_rsl(s)) {
627 lsi_script_scsi_interrupt(s, LSI_SIST0_RSL, 0);
628 }
629}
630
631static lsi_request *lsi_find_by_tag(LSIState *s, uint32_t tag)
632{
633 lsi_request *p;
634
635 QTAILQ_FOREACH(p, &s->queue, next) {
636 if (p->tag == tag) {
637 return p;
638 }
639 }
640
641 return NULL;
642}
643
644static void lsi_request_free(LSIState *s, lsi_request *p)
645{
646 if (p == s->current) {
647 s->current = NULL;
648 } else {
649 QTAILQ_REMOVE(&s->queue, p, next);
650 }
651 g_free(p);
652}
653
654static void lsi_request_cancelled(SCSIRequest *req)
655{
656 LSIState *s = DO_UPCAST(LSIState, dev.qdev, req->bus->qbus.parent);
657 lsi_request *p = req->hba_private;
658
659 req->hba_private = NULL;
660 lsi_request_free(s, p);
661 scsi_req_unref(req);
662}
663
664
665
666static int lsi_queue_req(LSIState *s, SCSIRequest *req, uint32_t len)
667{
668 lsi_request *p = req->hba_private;
669
670 if (p->pending) {
671 BADF("Multiple IO pending for request %p\n", p);
672 }
673 p->pending = len;
674
675
676
677
678
679 if (s->waiting == 1 ||
680 (lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON) &&
681 !(s->istat0 & (LSI_ISTAT0_SIP | LSI_ISTAT0_DIP)))) {
682
683 lsi_reselect(s, p);
684 return 0;
685 } else {
686 DPRINTF("Queueing IO tag=0x%x\n", p->tag);
687 p->pending = len;
688 return 1;
689 }
690}
691
692
693static void lsi_command_complete(SCSIRequest *req, uint32_t status, size_t resid)
694{
695 LSIState *s = DO_UPCAST(LSIState, dev.qdev, req->bus->qbus.parent);
696 int out;
697
698 out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
699 DPRINTF("Command complete status=%d\n", (int)status);
700 s->status = status;
701 s->command_complete = 2;
702 if (s->waiting && s->dbc != 0) {
703
704 lsi_bad_phase(s, out, PHASE_ST);
705 } else {
706 lsi_set_phase(s, PHASE_ST);
707 }
708
709 if (req->hba_private == s->current) {
710 req->hba_private = NULL;
711 lsi_request_free(s, s->current);
712 scsi_req_unref(req);
713 }
714 lsi_resume_script(s);
715}
716
717
718static void lsi_transfer_data(SCSIRequest *req, uint32_t len)
719{
720 LSIState *s = DO_UPCAST(LSIState, dev.qdev, req->bus->qbus.parent);
721 int out;
722
723 assert(req->hba_private);
724 if (s->waiting == 1 || req->hba_private != s->current ||
725 (lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON))) {
726 if (lsi_queue_req(s, req, len)) {
727 return;
728 }
729 }
730
731 out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
732
733
734 DPRINTF("Data ready tag=0x%x len=%d\n", req->tag, len);
735 s->current->dma_len = len;
736 s->command_complete = 1;
737 if (s->waiting) {
738 if (s->waiting == 1 || s->dbc == 0) {
739 lsi_resume_script(s);
740 } else {
741 lsi_do_dma(s, out);
742 }
743 }
744}
745
746static void lsi_do_command(LSIState *s)
747{
748 SCSIDevice *dev;
749 uint8_t buf[16];
750 uint32_t id;
751 int n;
752
753 DPRINTF("Send command len=%d\n", s->dbc);
754 if (s->dbc > 16)
755 s->dbc = 16;
756 pci_dma_read(&s->dev, s->dnad, buf, s->dbc);
757 s->sfbr = buf[0];
758 s->command_complete = 0;
759
760 id = (s->select_tag >> 8) & 0xf;
761 dev = scsi_device_find(&s->bus, 0, id, s->current_lun);
762 if (!dev) {
763 lsi_bad_selection(s, id);
764 return;
765 }
766
767 assert(s->current == NULL);
768 s->current = g_malloc0(sizeof(lsi_request));
769 s->current->tag = s->select_tag;
770 s->current->req = scsi_req_new(dev, s->current->tag, s->current_lun, buf,
771 s->current);
772
773 n = scsi_req_enqueue(s->current->req);
774 if (n) {
775 if (n > 0) {
776 lsi_set_phase(s, PHASE_DI);
777 } else if (n < 0) {
778 lsi_set_phase(s, PHASE_DO);
779 }
780 scsi_req_continue(s->current->req);
781 }
782 if (!s->command_complete) {
783 if (n) {
784
785 lsi_add_msg_byte(s, 2);
786 lsi_add_msg_byte(s, 4);
787
788 lsi_set_phase(s, PHASE_MI);
789 s->msg_action = 1;
790 lsi_queue_command(s);
791 } else {
792
793 lsi_set_phase(s, PHASE_DI);
794 }
795 }
796}
797
798static void lsi_do_status(LSIState *s)
799{
800 uint8_t status;
801 DPRINTF("Get status len=%d status=%d\n", s->dbc, s->status);
802 if (s->dbc != 1)
803 BADF("Bad Status move\n");
804 s->dbc = 1;
805 status = s->status;
806 s->sfbr = status;
807 pci_dma_write(&s->dev, s->dnad, &status, 1);
808 lsi_set_phase(s, PHASE_MI);
809 s->msg_action = 1;
810 lsi_add_msg_byte(s, 0);
811}
812
813static void lsi_do_msgin(LSIState *s)
814{
815 int len;
816 DPRINTF("Message in len=%d/%d\n", s->dbc, s->msg_len);
817 s->sfbr = s->msg[0];
818 len = s->msg_len;
819 if (len > s->dbc)
820 len = s->dbc;
821 pci_dma_write(&s->dev, s->dnad, s->msg, len);
822
823 s->sidl = s->msg[len - 1];
824 s->msg_len -= len;
825 if (s->msg_len) {
826 memmove(s->msg, s->msg + len, s->msg_len);
827 } else {
828
829
830 switch (s->msg_action) {
831 case 0:
832 lsi_set_phase(s, PHASE_CMD);
833 break;
834 case 1:
835 lsi_disconnect(s);
836 break;
837 case 2:
838 lsi_set_phase(s, PHASE_DO);
839 break;
840 case 3:
841 lsi_set_phase(s, PHASE_DI);
842 break;
843 default:
844 abort();
845 }
846 }
847}
848
849
850static uint8_t lsi_get_msgbyte(LSIState *s)
851{
852 uint8_t data;
853 pci_dma_read(&s->dev, s->dnad, &data, 1);
854 s->dnad++;
855 s->dbc--;
856 return data;
857}
858
859
860static void lsi_skip_msgbytes(LSIState *s, unsigned int n)
861{
862 s->dnad += n;
863 s->dbc -= n;
864}
865
866static void lsi_do_msgout(LSIState *s)
867{
868 uint8_t msg;
869 int len;
870 uint32_t current_tag;
871 lsi_request *current_req, *p, *p_next;
872
873 if (s->current) {
874 current_tag = s->current->tag;
875 current_req = s->current;
876 } else {
877 current_tag = s->select_tag;
878 current_req = lsi_find_by_tag(s, current_tag);
879 }
880
881 DPRINTF("MSG out len=%d\n", s->dbc);
882 while (s->dbc) {
883 msg = lsi_get_msgbyte(s);
884 s->sfbr = msg;
885
886 switch (msg) {
887 case 0x04:
888 DPRINTF("MSG: Disconnect\n");
889 lsi_disconnect(s);
890 break;
891 case 0x08:
892 DPRINTF("MSG: No Operation\n");
893 lsi_set_phase(s, PHASE_CMD);
894 break;
895 case 0x01:
896 len = lsi_get_msgbyte(s);
897 msg = lsi_get_msgbyte(s);
898 (void)len;
899 DPRINTF("Extended message 0x%x (len %d)\n", msg, len);
900 switch (msg) {
901 case 1:
902 DPRINTF("SDTR (ignored)\n");
903 lsi_skip_msgbytes(s, 2);
904 break;
905 case 3:
906 DPRINTF("WDTR (ignored)\n");
907 lsi_skip_msgbytes(s, 1);
908 break;
909 default:
910 goto bad;
911 }
912 break;
913 case 0x20:
914 s->select_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
915 DPRINTF("SIMPLE queue tag=0x%x\n", s->select_tag & 0xff);
916 break;
917 case 0x21:
918 BADF("HEAD queue not implemented\n");
919 s->select_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
920 break;
921 case 0x22:
922 BADF("ORDERED queue not implemented\n");
923 s->select_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
924 break;
925 case 0x0d:
926
927 DPRINTF("MSG: ABORT TAG tag=0x%x\n", current_tag);
928 if (current_req) {
929 scsi_req_cancel(current_req->req);
930 }
931 lsi_disconnect(s);
932 break;
933 case 0x06:
934 case 0x0e:
935 case 0x0c:
936
937
938 if (msg == 0x06) {
939 DPRINTF("MSG: ABORT tag=0x%x\n", current_tag);
940 }
941
942
943 if (msg == 0x0e) {
944 DPRINTF("MSG: CLEAR QUEUE tag=0x%x\n", current_tag);
945 }
946
947
948 if (msg == 0x0c) {
949 DPRINTF("MSG: BUS DEVICE RESET tag=0x%x\n", current_tag);
950 }
951
952
953 if (s->current) {
954 scsi_req_cancel(s->current->req);
955 }
956
957
958
959
960
961
962
963
964 QTAILQ_FOREACH_SAFE(p, &s->queue, next, p_next) {
965 if ((p->tag & 0x0000ff00) == (current_tag & 0x0000ff00)) {
966 scsi_req_cancel(p->req);
967 }
968 }
969
970 lsi_disconnect(s);
971 break;
972 default:
973 if ((msg & 0x80) == 0) {
974 goto bad;
975 }
976 s->current_lun = msg & 7;
977 DPRINTF("Select LUN %d\n", s->current_lun);
978 lsi_set_phase(s, PHASE_CMD);
979 break;
980 }
981 }
982 return;
983bad:
984 BADF("Unimplemented message 0x%02x\n", msg);
985 lsi_set_phase(s, PHASE_MI);
986 lsi_add_msg_byte(s, 7);
987 s->msg_action = 0;
988}
989
990
991static inline int32_t sxt24(int32_t n)
992{
993 return (n << 8) >> 8;
994}
995
996#define LSI_BUF_SIZE 4096
997static void lsi_memcpy(LSIState *s, uint32_t dest, uint32_t src, int count)
998{
999 int n;
1000 uint8_t buf[LSI_BUF_SIZE];
1001
1002 DPRINTF("memcpy dest 0x%08x src 0x%08x count %d\n", dest, src, count);
1003 while (count) {
1004 n = (count > LSI_BUF_SIZE) ? LSI_BUF_SIZE : count;
1005 pci_dma_read(&s->dev, src, buf, n);
1006 pci_dma_write(&s->dev, dest, buf, n);
1007 src += n;
1008 dest += n;
1009 count -= n;
1010 }
1011}
1012
1013static void lsi_wait_reselect(LSIState *s)
1014{
1015 lsi_request *p;
1016
1017 DPRINTF("Wait Reselect\n");
1018
1019 QTAILQ_FOREACH(p, &s->queue, next) {
1020 if (p->pending) {
1021 lsi_reselect(s, p);
1022 break;
1023 }
1024 }
1025 if (s->current == NULL) {
1026 s->waiting = 1;
1027 }
1028}
1029
1030static void lsi_execute_script(LSIState *s)
1031{
1032 uint32_t insn;
1033 uint32_t addr, addr_high;
1034 int opcode;
1035 int insn_processed = 0;
1036
1037 s->istat1 |= LSI_ISTAT1_SRUN;
1038again:
1039 insn_processed++;
1040 insn = read_dword(s, s->dsp);
1041 if (!insn) {
1042
1043
1044 s->dsp += 4;
1045 goto again;
1046 }
1047 addr = read_dword(s, s->dsp + 4);
1048 addr_high = 0;
1049 DPRINTF("SCRIPTS dsp=%08x opcode %08x arg %08x\n", s->dsp, insn, addr);
1050 s->dsps = addr;
1051 s->dcmd = insn >> 24;
1052 s->dsp += 8;
1053 switch (insn >> 30) {
1054 case 0:
1055 if (s->sist1 & LSI_SIST1_STO) {
1056 DPRINTF("Delayed select timeout\n");
1057 lsi_stop_script(s);
1058 break;
1059 }
1060 s->dbc = insn & 0xffffff;
1061 s->rbc = s->dbc;
1062
1063 s->ia = s->dsp - 8;
1064 if (insn & (1 << 29)) {
1065
1066 addr = read_dword(s, addr);
1067 } else if (insn & (1 << 28)) {
1068 uint32_t buf[2];
1069 int32_t offset;
1070
1071
1072
1073 offset = sxt24(addr);
1074 pci_dma_read(&s->dev, s->dsa + offset, buf, 8);
1075
1076 s->dbc = cpu_to_le32(buf[0]) & 0xffffff;
1077 s->rbc = s->dbc;
1078 addr = cpu_to_le32(buf[1]);
1079
1080
1081
1082 if (lsi_dma_40bit(s))
1083 addr_high = cpu_to_le32(buf[0]) >> 24;
1084 else if (lsi_dma_ti64bit(s)) {
1085 int selector = (cpu_to_le32(buf[0]) >> 24) & 0x1f;
1086 switch (selector) {
1087 case 0 ... 0x0f:
1088
1089
1090 addr_high = s->scratch[2 + selector];
1091 break;
1092 case 0x10:
1093 addr_high = s->mmrs;
1094 break;
1095 case 0x11:
1096 addr_high = s->mmws;
1097 break;
1098 case 0x12:
1099 addr_high = s->sfs;
1100 break;
1101 case 0x13:
1102 addr_high = s->drs;
1103 break;
1104 case 0x14:
1105 addr_high = s->sbms;
1106 break;
1107 case 0x15:
1108 addr_high = s->dbms;
1109 break;
1110 default:
1111 BADF("Illegal selector specified (0x%x > 0x15)"
1112 " for 64-bit DMA block move", selector);
1113 break;
1114 }
1115 }
1116 } else if (lsi_dma_64bit(s)) {
1117
1118
1119 s->dbms = read_dword(s, s->dsp);
1120 s->dsp += 4;
1121 s->ia = s->dsp - 12;
1122 }
1123 if ((s->sstat1 & PHASE_MASK) != ((insn >> 24) & 7)) {
1124 DPRINTF("Wrong phase got %d expected %d\n",
1125 s->sstat1 & PHASE_MASK, (insn >> 24) & 7);
1126 lsi_script_scsi_interrupt(s, LSI_SIST0_MA, 0);
1127 break;
1128 }
1129 s->dnad = addr;
1130 s->dnad64 = addr_high;
1131 switch (s->sstat1 & 0x7) {
1132 case PHASE_DO:
1133 s->waiting = 2;
1134 lsi_do_dma(s, 1);
1135 if (s->waiting)
1136 s->waiting = 3;
1137 break;
1138 case PHASE_DI:
1139 s->waiting = 2;
1140 lsi_do_dma(s, 0);
1141 if (s->waiting)
1142 s->waiting = 3;
1143 break;
1144 case PHASE_CMD:
1145 lsi_do_command(s);
1146 break;
1147 case PHASE_ST:
1148 lsi_do_status(s);
1149 break;
1150 case PHASE_MO:
1151 lsi_do_msgout(s);
1152 break;
1153 case PHASE_MI:
1154 lsi_do_msgin(s);
1155 break;
1156 default:
1157 BADF("Unimplemented phase %d\n", s->sstat1 & PHASE_MASK);
1158 exit(1);
1159 }
1160 s->dfifo = s->dbc & 0xff;
1161 s->ctest5 = (s->ctest5 & 0xfc) | ((s->dbc >> 8) & 3);
1162 s->sbc = s->dbc;
1163 s->rbc -= s->dbc;
1164 s->ua = addr + s->dbc;
1165 break;
1166
1167 case 1:
1168 opcode = (insn >> 27) & 7;
1169 if (opcode < 5) {
1170 uint32_t id;
1171
1172 if (insn & (1 << 25)) {
1173 id = read_dword(s, s->dsa + sxt24(insn));
1174 } else {
1175 id = insn;
1176 }
1177 id = (id >> 16) & 0xf;
1178 if (insn & (1 << 26)) {
1179 addr = s->dsp + sxt24(addr);
1180 }
1181 s->dnad = addr;
1182 switch (opcode) {
1183 case 0:
1184 s->sdid = id;
1185 if (s->scntl1 & LSI_SCNTL1_CON) {
1186 DPRINTF("Already reselected, jumping to alternative address\n");
1187 s->dsp = s->dnad;
1188 break;
1189 }
1190 s->sstat0 |= LSI_SSTAT0_WOA;
1191 s->scntl1 &= ~LSI_SCNTL1_IARB;
1192 if (!scsi_device_find(&s->bus, 0, id, 0)) {
1193 lsi_bad_selection(s, id);
1194 break;
1195 }
1196 DPRINTF("Selected target %d%s\n",
1197 id, insn & (1 << 3) ? " ATN" : "");
1198
1199
1200
1201 s->select_tag = id << 8;
1202 s->scntl1 |= LSI_SCNTL1_CON;
1203 if (insn & (1 << 3)) {
1204 s->socl |= LSI_SOCL_ATN;
1205 }
1206 lsi_set_phase(s, PHASE_MO);
1207 break;
1208 case 1:
1209 DPRINTF("Wait Disconnect\n");
1210 s->scntl1 &= ~LSI_SCNTL1_CON;
1211 break;
1212 case 2:
1213 if (!lsi_irq_on_rsl(s)) {
1214 lsi_wait_reselect(s);
1215 }
1216 break;
1217 case 3:
1218 DPRINTF("Set%s%s%s%s\n",
1219 insn & (1 << 3) ? " ATN" : "",
1220 insn & (1 << 6) ? " ACK" : "",
1221 insn & (1 << 9) ? " TM" : "",
1222 insn & (1 << 10) ? " CC" : "");
1223 if (insn & (1 << 3)) {
1224 s->socl |= LSI_SOCL_ATN;
1225 lsi_set_phase(s, PHASE_MO);
1226 }
1227 if (insn & (1 << 9)) {
1228 BADF("Target mode not implemented\n");
1229 exit(1);
1230 }
1231 if (insn & (1 << 10))
1232 s->carry = 1;
1233 break;
1234 case 4:
1235 DPRINTF("Clear%s%s%s%s\n",
1236 insn & (1 << 3) ? " ATN" : "",
1237 insn & (1 << 6) ? " ACK" : "",
1238 insn & (1 << 9) ? " TM" : "",
1239 insn & (1 << 10) ? " CC" : "");
1240 if (insn & (1 << 3)) {
1241 s->socl &= ~LSI_SOCL_ATN;
1242 }
1243 if (insn & (1 << 10))
1244 s->carry = 0;
1245 break;
1246 }
1247 } else {
1248 uint8_t op0;
1249 uint8_t op1;
1250 uint8_t data8;
1251 int reg;
1252 int operator;
1253#ifdef DEBUG_LSI
1254 static const char *opcode_names[3] =
1255 {"Write", "Read", "Read-Modify-Write"};
1256 static const char *operator_names[8] =
1257 {"MOV", "SHL", "OR", "XOR", "AND", "SHR", "ADD", "ADC"};
1258#endif
1259
1260 reg = ((insn >> 16) & 0x7f) | (insn & 0x80);
1261 data8 = (insn >> 8) & 0xff;
1262 opcode = (insn >> 27) & 7;
1263 operator = (insn >> 24) & 7;
1264 DPRINTF("%s reg 0x%x %s data8=0x%02x sfbr=0x%02x%s\n",
1265 opcode_names[opcode - 5], reg,
1266 operator_names[operator], data8, s->sfbr,
1267 (insn & (1 << 23)) ? " SFBR" : "");
1268 op0 = op1 = 0;
1269 switch (opcode) {
1270 case 5:
1271 op0 = s->sfbr;
1272 op1 = data8;
1273 break;
1274 case 6:
1275 if (operator)
1276 op0 = lsi_reg_readb(s, reg);
1277 op1 = data8;
1278 break;
1279 case 7:
1280 if (operator)
1281 op0 = lsi_reg_readb(s, reg);
1282 if (insn & (1 << 23)) {
1283 op1 = s->sfbr;
1284 } else {
1285 op1 = data8;
1286 }
1287 break;
1288 }
1289
1290 switch (operator) {
1291 case 0:
1292 op0 = op1;
1293 break;
1294 case 1:
1295 op1 = op0 >> 7;
1296 op0 = (op0 << 1) | s->carry;
1297 s->carry = op1;
1298 break;
1299 case 2:
1300 op0 |= op1;
1301 break;
1302 case 3:
1303 op0 ^= op1;
1304 break;
1305 case 4:
1306 op0 &= op1;
1307 break;
1308 case 5:
1309 op1 = op0 & 1;
1310 op0 = (op0 >> 1) | (s->carry << 7);
1311 s->carry = op1;
1312 break;
1313 case 6:
1314 op0 += op1;
1315 s->carry = op0 < op1;
1316 break;
1317 case 7:
1318 op0 += op1 + s->carry;
1319 if (s->carry)
1320 s->carry = op0 <= op1;
1321 else
1322 s->carry = op0 < op1;
1323 break;
1324 }
1325
1326 switch (opcode) {
1327 case 5:
1328 case 7:
1329 lsi_reg_writeb(s, reg, op0);
1330 break;
1331 case 6:
1332 s->sfbr = op0;
1333 break;
1334 }
1335 }
1336 break;
1337
1338 case 2:
1339 {
1340 int cond;
1341 int jmp;
1342
1343 if ((insn & 0x002e0000) == 0) {
1344 DPRINTF("NOP\n");
1345 break;
1346 }
1347 if (s->sist1 & LSI_SIST1_STO) {
1348 DPRINTF("Delayed select timeout\n");
1349 lsi_stop_script(s);
1350 break;
1351 }
1352 cond = jmp = (insn & (1 << 19)) != 0;
1353 if (cond == jmp && (insn & (1 << 21))) {
1354 DPRINTF("Compare carry %d\n", s->carry == jmp);
1355 cond = s->carry != 0;
1356 }
1357 if (cond == jmp && (insn & (1 << 17))) {
1358 DPRINTF("Compare phase %d %c= %d\n",
1359 (s->sstat1 & PHASE_MASK),
1360 jmp ? '=' : '!',
1361 ((insn >> 24) & 7));
1362 cond = (s->sstat1 & PHASE_MASK) == ((insn >> 24) & 7);
1363 }
1364 if (cond == jmp && (insn & (1 << 18))) {
1365 uint8_t mask;
1366
1367 mask = (~insn >> 8) & 0xff;
1368 DPRINTF("Compare data 0x%x & 0x%x %c= 0x%x\n",
1369 s->sfbr, mask, jmp ? '=' : '!', insn & mask);
1370 cond = (s->sfbr & mask) == (insn & mask);
1371 }
1372 if (cond == jmp) {
1373 if (insn & (1 << 23)) {
1374
1375 addr = s->dsp + sxt24(addr);
1376 }
1377 switch ((insn >> 27) & 7) {
1378 case 0:
1379 DPRINTF("Jump to 0x%08x\n", addr);
1380 s->dsp = addr;
1381 break;
1382 case 1:
1383 DPRINTF("Call 0x%08x\n", addr);
1384 s->temp = s->dsp;
1385 s->dsp = addr;
1386 break;
1387 case 2:
1388 DPRINTF("Return to 0x%08x\n", s->temp);
1389 s->dsp = s->temp;
1390 break;
1391 case 3:
1392 DPRINTF("Interrupt 0x%08x\n", s->dsps);
1393 if ((insn & (1 << 20)) != 0) {
1394 s->istat0 |= LSI_ISTAT0_INTF;
1395 lsi_update_irq(s);
1396 } else {
1397 lsi_script_dma_interrupt(s, LSI_DSTAT_SIR);
1398 }
1399 break;
1400 default:
1401 DPRINTF("Illegal transfer control\n");
1402 lsi_script_dma_interrupt(s, LSI_DSTAT_IID);
1403 break;
1404 }
1405 } else {
1406 DPRINTF("Control condition failed\n");
1407 }
1408 }
1409 break;
1410
1411 case 3:
1412 if ((insn & (1 << 29)) == 0) {
1413
1414 uint32_t dest;
1415
1416
1417
1418 dest = read_dword(s, s->dsp);
1419 s->dsp += 4;
1420 lsi_memcpy(s, dest, addr, insn & 0xffffff);
1421 } else {
1422 uint8_t data[7];
1423 int reg;
1424 int n;
1425 int i;
1426
1427 if (insn & (1 << 28)) {
1428 addr = s->dsa + sxt24(addr);
1429 }
1430 n = (insn & 7);
1431 reg = (insn >> 16) & 0xff;
1432 if (insn & (1 << 24)) {
1433 pci_dma_read(&s->dev, addr, data, n);
1434 DPRINTF("Load reg 0x%x size %d addr 0x%08x = %08x\n", reg, n,
1435 addr, *(int *)data);
1436 for (i = 0; i < n; i++) {
1437 lsi_reg_writeb(s, reg + i, data[i]);
1438 }
1439 } else {
1440 DPRINTF("Store reg 0x%x size %d addr 0x%08x\n", reg, n, addr);
1441 for (i = 0; i < n; i++) {
1442 data[i] = lsi_reg_readb(s, reg + i);
1443 }
1444 pci_dma_write(&s->dev, addr, data, n);
1445 }
1446 }
1447 }
1448 if (insn_processed > 10000 && !s->waiting) {
1449
1450
1451
1452
1453
1454 if (!(s->sien0 & LSI_SIST0_UDC))
1455 fprintf(stderr, "inf. loop with UDC masked\n");
1456 lsi_script_scsi_interrupt(s, LSI_SIST0_UDC, 0);
1457 lsi_disconnect(s);
1458 } else if (s->istat1 & LSI_ISTAT1_SRUN && !s->waiting) {
1459 if (s->dcntl & LSI_DCNTL_SSM) {
1460 lsi_script_dma_interrupt(s, LSI_DSTAT_SSI);
1461 } else {
1462 goto again;
1463 }
1464 }
1465 DPRINTF("SCRIPTS execution stopped\n");
1466}
1467
1468static uint8_t lsi_reg_readb(LSIState *s, int offset)
1469{
1470 uint8_t tmp;
1471#define CASE_GET_REG24(name, addr) \
1472 case addr: return s->name & 0xff; \
1473 case addr + 1: return (s->name >> 8) & 0xff; \
1474 case addr + 2: return (s->name >> 16) & 0xff;
1475
1476#define CASE_GET_REG32(name, addr) \
1477 case addr: return s->name & 0xff; \
1478 case addr + 1: return (s->name >> 8) & 0xff; \
1479 case addr + 2: return (s->name >> 16) & 0xff; \
1480 case addr + 3: return (s->name >> 24) & 0xff;
1481
1482#ifdef DEBUG_LSI_REG
1483 DPRINTF("Read reg %x\n", offset);
1484#endif
1485 switch (offset) {
1486 case 0x00:
1487 return s->scntl0;
1488 case 0x01:
1489 return s->scntl1;
1490 case 0x02:
1491 return s->scntl2;
1492 case 0x03:
1493 return s->scntl3;
1494 case 0x04:
1495 return s->scid;
1496 case 0x05:
1497 return s->sxfer;
1498 case 0x06:
1499 return s->sdid;
1500 case 0x07:
1501 return 0x7f;
1502 case 0x08:
1503 return 0x00;
1504 case 0xa:
1505 return s->ssid;
1506 case 0xb:
1507
1508
1509 return 0;
1510 case 0xc:
1511 tmp = s->dstat | 0x80;
1512 if ((s->istat0 & LSI_ISTAT0_INTF) == 0)
1513 s->dstat = 0;
1514 lsi_update_irq(s);
1515 return tmp;
1516 case 0x0d:
1517 return s->sstat0;
1518 case 0x0e:
1519 return s->sstat1;
1520 case 0x0f:
1521 return s->scntl1 & LSI_SCNTL1_CON ? 0 : 2;
1522 CASE_GET_REG32(dsa, 0x10)
1523 case 0x14:
1524 return s->istat0;
1525 case 0x15:
1526 return s->istat1;
1527 case 0x16:
1528 return s->mbox0;
1529 case 0x17:
1530 return s->mbox1;
1531 case 0x18:
1532 return 0xff;
1533 case 0x19:
1534 return 0;
1535 case 0x1a:
1536 tmp = s->ctest2 | LSI_CTEST2_DACK | LSI_CTEST2_CM;
1537 if (s->istat0 & LSI_ISTAT0_SIGP) {
1538 s->istat0 &= ~LSI_ISTAT0_SIGP;
1539 tmp |= LSI_CTEST2_SIGP;
1540 }
1541 return tmp;
1542 case 0x1b:
1543 return s->ctest3;
1544 CASE_GET_REG32(temp, 0x1c)
1545 case 0x20:
1546 return 0;
1547 case 0x21:
1548 return s->ctest4;
1549 case 0x22:
1550 return s->ctest5;
1551 case 0x23:
1552 return 0;
1553 CASE_GET_REG24(dbc, 0x24)
1554 case 0x27:
1555 return s->dcmd;
1556 CASE_GET_REG32(dnad, 0x28)
1557 CASE_GET_REG32(dsp, 0x2c)
1558 CASE_GET_REG32(dsps, 0x30)
1559 CASE_GET_REG32(scratch[0], 0x34)
1560 case 0x38:
1561 return s->dmode;
1562 case 0x39:
1563 return s->dien;
1564 case 0x3a:
1565 return s->sbr;
1566 case 0x3b:
1567 return s->dcntl;
1568 case 0x40:
1569 return s->sien0;
1570 case 0x41:
1571 return s->sien1;
1572 case 0x42:
1573 tmp = s->sist0;
1574 s->sist0 = 0;
1575 lsi_update_irq(s);
1576 return tmp;
1577 case 0x43:
1578 tmp = s->sist1;
1579 s->sist1 = 0;
1580 lsi_update_irq(s);
1581 return tmp;
1582 case 0x46:
1583 return 0x0f;
1584 case 0x47:
1585 return 0x0f;
1586 case 0x48:
1587 return s->stime0;
1588 case 0x4a:
1589 return s->respid0;
1590 case 0x4b:
1591 return s->respid1;
1592 case 0x4d:
1593 return s->stest1;
1594 case 0x4e:
1595 return s->stest2;
1596 case 0x4f:
1597 return s->stest3;
1598 case 0x50:
1599
1600
1601 return s->sidl;
1602 case 0x52:
1603 return 0xe0;
1604 case 0x56:
1605 return s->ccntl0;
1606 case 0x57:
1607 return s->ccntl1;
1608 case 0x58:
1609
1610 if ((s->sstat1 & PHASE_MASK) == PHASE_MI)
1611 return s->msg[0];
1612 return 0;
1613 case 0x59:
1614 return 0;
1615 CASE_GET_REG32(mmrs, 0xa0)
1616 CASE_GET_REG32(mmws, 0xa4)
1617 CASE_GET_REG32(sfs, 0xa8)
1618 CASE_GET_REG32(drs, 0xac)
1619 CASE_GET_REG32(sbms, 0xb0)
1620 CASE_GET_REG32(dbms, 0xb4)
1621 CASE_GET_REG32(dnad64, 0xb8)
1622 CASE_GET_REG32(pmjad1, 0xc0)
1623 CASE_GET_REG32(pmjad2, 0xc4)
1624 CASE_GET_REG32(rbc, 0xc8)
1625 CASE_GET_REG32(ua, 0xcc)
1626 CASE_GET_REG32(ia, 0xd4)
1627 CASE_GET_REG32(sbc, 0xd8)
1628 CASE_GET_REG32(csbc, 0xdc)
1629 }
1630 if (offset >= 0x5c && offset < 0xa0) {
1631 int n;
1632 int shift;
1633 n = (offset - 0x58) >> 2;
1634 shift = (offset & 3) * 8;
1635 return (s->scratch[n] >> shift) & 0xff;
1636 }
1637 BADF("readb 0x%x\n", offset);
1638 exit(1);
1639#undef CASE_GET_REG24
1640#undef CASE_GET_REG32
1641}
1642
1643static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val)
1644{
1645#define CASE_SET_REG24(name, addr) \
1646 case addr : s->name &= 0xffffff00; s->name |= val; break; \
1647 case addr + 1: s->name &= 0xffff00ff; s->name |= val << 8; break; \
1648 case addr + 2: s->name &= 0xff00ffff; s->name |= val << 16; break;
1649
1650#define CASE_SET_REG32(name, addr) \
1651 case addr : s->name &= 0xffffff00; s->name |= val; break; \
1652 case addr + 1: s->name &= 0xffff00ff; s->name |= val << 8; break; \
1653 case addr + 2: s->name &= 0xff00ffff; s->name |= val << 16; break; \
1654 case addr + 3: s->name &= 0x00ffffff; s->name |= val << 24; break;
1655
1656#ifdef DEBUG_LSI_REG
1657 DPRINTF("Write reg %x = %02x\n", offset, val);
1658#endif
1659 switch (offset) {
1660 case 0x00:
1661 s->scntl0 = val;
1662 if (val & LSI_SCNTL0_START) {
1663 BADF("Start sequence not implemented\n");
1664 }
1665 break;
1666 case 0x01:
1667 s->scntl1 = val & ~LSI_SCNTL1_SST;
1668 if (val & LSI_SCNTL1_IARB) {
1669 BADF("Immediate Arbritration not implemented\n");
1670 }
1671 if (val & LSI_SCNTL1_RST) {
1672 if (!(s->sstat0 & LSI_SSTAT0_RST)) {
1673 qbus_reset_all(&s->bus.qbus);
1674 s->sstat0 |= LSI_SSTAT0_RST;
1675 lsi_script_scsi_interrupt(s, LSI_SIST0_RST, 0);
1676 }
1677 } else {
1678 s->sstat0 &= ~LSI_SSTAT0_RST;
1679 }
1680 break;
1681 case 0x02:
1682 val &= ~(LSI_SCNTL2_WSR | LSI_SCNTL2_WSS);
1683 s->scntl2 = val;
1684 break;
1685 case 0x03:
1686 s->scntl3 = val;
1687 break;
1688 case 0x04:
1689 s->scid = val;
1690 break;
1691 case 0x05:
1692 s->sxfer = val;
1693 break;
1694 case 0x06:
1695 if ((val & 0xf) != (s->ssid & 0xf))
1696 BADF("Destination ID does not match SSID\n");
1697 s->sdid = val & 0xf;
1698 break;
1699 case 0x07:
1700 break;
1701 case 0x08:
1702
1703
1704 s->sfbr = val;
1705 break;
1706 case 0x0a: case 0x0b:
1707
1708 return;
1709 case 0x0c: case 0x0d: case 0x0e: case 0x0f:
1710
1711 return;
1712 CASE_SET_REG32(dsa, 0x10)
1713 case 0x14:
1714 s->istat0 = (s->istat0 & 0x0f) | (val & 0xf0);
1715 if (val & LSI_ISTAT0_ABRT) {
1716 lsi_script_dma_interrupt(s, LSI_DSTAT_ABRT);
1717 }
1718 if (val & LSI_ISTAT0_INTF) {
1719 s->istat0 &= ~LSI_ISTAT0_INTF;
1720 lsi_update_irq(s);
1721 }
1722 if (s->waiting == 1 && val & LSI_ISTAT0_SIGP) {
1723 DPRINTF("Woken by SIGP\n");
1724 s->waiting = 0;
1725 s->dsp = s->dnad;
1726 lsi_execute_script(s);
1727 }
1728 if (val & LSI_ISTAT0_SRST) {
1729 qdev_reset_all(&s->dev.qdev);
1730 }
1731 break;
1732 case 0x16:
1733 s->mbox0 = val;
1734 break;
1735 case 0x17:
1736 s->mbox1 = val;
1737 break;
1738 case 0x1a:
1739 s->ctest2 = val & LSI_CTEST2_PCICIE;
1740 break;
1741 case 0x1b:
1742 s->ctest3 = val & 0x0f;
1743 break;
1744 CASE_SET_REG32(temp, 0x1c)
1745 case 0x21:
1746 if (val & 7) {
1747 BADF("Unimplemented CTEST4-FBL 0x%x\n", val);
1748 }
1749 s->ctest4 = val;
1750 break;
1751 case 0x22:
1752 if (val & (LSI_CTEST5_ADCK | LSI_CTEST5_BBCK)) {
1753 BADF("CTEST5 DMA increment not implemented\n");
1754 }
1755 s->ctest5 = val;
1756 break;
1757 CASE_SET_REG24(dbc, 0x24)
1758 CASE_SET_REG32(dnad, 0x28)
1759 case 0x2c:
1760 s->dsp &= 0xffffff00;
1761 s->dsp |= val;
1762 break;
1763 case 0x2d:
1764 s->dsp &= 0xffff00ff;
1765 s->dsp |= val << 8;
1766 break;
1767 case 0x2e:
1768 s->dsp &= 0xff00ffff;
1769 s->dsp |= val << 16;
1770 break;
1771 case 0x2f:
1772 s->dsp &= 0x00ffffff;
1773 s->dsp |= val << 24;
1774 if ((s->dmode & LSI_DMODE_MAN) == 0
1775 && (s->istat1 & LSI_ISTAT1_SRUN) == 0)
1776 lsi_execute_script(s);
1777 break;
1778 CASE_SET_REG32(dsps, 0x30)
1779 CASE_SET_REG32(scratch[0], 0x34)
1780 case 0x38:
1781 if (val & (LSI_DMODE_SIOM | LSI_DMODE_DIOM)) {
1782 BADF("IO mappings not implemented\n");
1783 }
1784 s->dmode = val;
1785 break;
1786 case 0x39:
1787 s->dien = val;
1788 lsi_update_irq(s);
1789 break;
1790 case 0x3a:
1791 s->sbr = val;
1792 break;
1793 case 0x3b:
1794 s->dcntl = val & ~(LSI_DCNTL_PFF | LSI_DCNTL_STD);
1795 if ((val & LSI_DCNTL_STD) && (s->istat1 & LSI_ISTAT1_SRUN) == 0)
1796 lsi_execute_script(s);
1797 break;
1798 case 0x40:
1799 s->sien0 = val;
1800 lsi_update_irq(s);
1801 break;
1802 case 0x41:
1803 s->sien1 = val;
1804 lsi_update_irq(s);
1805 break;
1806 case 0x47:
1807 break;
1808 case 0x48:
1809 s->stime0 = val;
1810 break;
1811 case 0x49:
1812 if (val & 0xf) {
1813 DPRINTF("General purpose timer not implemented\n");
1814
1815
1816 lsi_script_scsi_interrupt(s, 0, LSI_SIST1_GEN);
1817 }
1818 break;
1819 case 0x4a:
1820 s->respid0 = val;
1821 break;
1822 case 0x4b:
1823 s->respid1 = val;
1824 break;
1825 case 0x4d:
1826 s->stest1 = val;
1827 break;
1828 case 0x4e:
1829 if (val & 1) {
1830 BADF("Low level mode not implemented\n");
1831 }
1832 s->stest2 = val;
1833 break;
1834 case 0x4f:
1835 if (val & 0x41) {
1836 BADF("SCSI FIFO test mode not implemented\n");
1837 }
1838 s->stest3 = val;
1839 break;
1840 case 0x56:
1841 s->ccntl0 = val;
1842 break;
1843 case 0x57:
1844 s->ccntl1 = val;
1845 break;
1846 CASE_SET_REG32(mmrs, 0xa0)
1847 CASE_SET_REG32(mmws, 0xa4)
1848 CASE_SET_REG32(sfs, 0xa8)
1849 CASE_SET_REG32(drs, 0xac)
1850 CASE_SET_REG32(sbms, 0xb0)
1851 CASE_SET_REG32(dbms, 0xb4)
1852 CASE_SET_REG32(dnad64, 0xb8)
1853 CASE_SET_REG32(pmjad1, 0xc0)
1854 CASE_SET_REG32(pmjad2, 0xc4)
1855 CASE_SET_REG32(rbc, 0xc8)
1856 CASE_SET_REG32(ua, 0xcc)
1857 CASE_SET_REG32(ia, 0xd4)
1858 CASE_SET_REG32(sbc, 0xd8)
1859 CASE_SET_REG32(csbc, 0xdc)
1860 default:
1861 if (offset >= 0x5c && offset < 0xa0) {
1862 int n;
1863 int shift;
1864 n = (offset - 0x58) >> 2;
1865 shift = (offset & 3) * 8;
1866 s->scratch[n] &= ~(0xff << shift);
1867 s->scratch[n] |= (val & 0xff) << shift;
1868 } else {
1869 BADF("Unhandled writeb 0x%x = 0x%x\n", offset, val);
1870 }
1871 }
1872#undef CASE_SET_REG24
1873#undef CASE_SET_REG32
1874}
1875
1876static void lsi_mmio_write(void *opaque, hwaddr addr,
1877 uint64_t val, unsigned size)
1878{
1879 LSIState *s = opaque;
1880
1881 lsi_reg_writeb(s, addr & 0xff, val);
1882}
1883
1884static uint64_t lsi_mmio_read(void *opaque, hwaddr addr,
1885 unsigned size)
1886{
1887 LSIState *s = opaque;
1888
1889 return lsi_reg_readb(s, addr & 0xff);
1890}
1891
1892static const MemoryRegionOps lsi_mmio_ops = {
1893 .read = lsi_mmio_read,
1894 .write = lsi_mmio_write,
1895 .endianness = DEVICE_NATIVE_ENDIAN,
1896 .impl = {
1897 .min_access_size = 1,
1898 .max_access_size = 1,
1899 },
1900};
1901
1902static void lsi_ram_write(void *opaque, hwaddr addr,
1903 uint64_t val, unsigned size)
1904{
1905 LSIState *s = opaque;
1906 uint32_t newval;
1907 uint32_t mask;
1908 int shift;
1909
1910 newval = s->script_ram[addr >> 2];
1911 shift = (addr & 3) * 8;
1912 mask = ((uint64_t)1 << (size * 8)) - 1;
1913 newval &= ~(mask << shift);
1914 newval |= val << shift;
1915 s->script_ram[addr >> 2] = newval;
1916}
1917
1918static uint64_t lsi_ram_read(void *opaque, hwaddr addr,
1919 unsigned size)
1920{
1921 LSIState *s = opaque;
1922 uint32_t val;
1923 uint32_t mask;
1924
1925 val = s->script_ram[addr >> 2];
1926 mask = ((uint64_t)1 << (size * 8)) - 1;
1927 val >>= (addr & 3) * 8;
1928 return val & mask;
1929}
1930
1931static const MemoryRegionOps lsi_ram_ops = {
1932 .read = lsi_ram_read,
1933 .write = lsi_ram_write,
1934 .endianness = DEVICE_NATIVE_ENDIAN,
1935};
1936
1937static uint64_t lsi_io_read(void *opaque, hwaddr addr,
1938 unsigned size)
1939{
1940 LSIState *s = opaque;
1941 return lsi_reg_readb(s, addr & 0xff);
1942}
1943
1944static void lsi_io_write(void *opaque, hwaddr addr,
1945 uint64_t val, unsigned size)
1946{
1947 LSIState *s = opaque;
1948 lsi_reg_writeb(s, addr & 0xff, val);
1949}
1950
1951static const MemoryRegionOps lsi_io_ops = {
1952 .read = lsi_io_read,
1953 .write = lsi_io_write,
1954 .endianness = DEVICE_NATIVE_ENDIAN,
1955 .impl = {
1956 .min_access_size = 1,
1957 .max_access_size = 1,
1958 },
1959};
1960
1961static void lsi_scsi_reset(DeviceState *dev)
1962{
1963 LSIState *s = DO_UPCAST(LSIState, dev.qdev, dev);
1964
1965 lsi_soft_reset(s);
1966}
1967
1968static void lsi_pre_save(void *opaque)
1969{
1970 LSIState *s = opaque;
1971
1972 if (s->current) {
1973 assert(s->current->dma_buf == NULL);
1974 assert(s->current->dma_len == 0);
1975 }
1976 assert(QTAILQ_EMPTY(&s->queue));
1977}
1978
1979static const VMStateDescription vmstate_lsi_scsi = {
1980 .name = "lsiscsi",
1981 .version_id = 0,
1982 .minimum_version_id = 0,
1983 .minimum_version_id_old = 0,
1984 .pre_save = lsi_pre_save,
1985 .fields = (VMStateField []) {
1986 VMSTATE_PCI_DEVICE(dev, LSIState),
1987
1988 VMSTATE_INT32(carry, LSIState),
1989 VMSTATE_INT32(status, LSIState),
1990 VMSTATE_INT32(msg_action, LSIState),
1991 VMSTATE_INT32(msg_len, LSIState),
1992 VMSTATE_BUFFER(msg, LSIState),
1993 VMSTATE_INT32(waiting, LSIState),
1994
1995 VMSTATE_UINT32(dsa, LSIState),
1996 VMSTATE_UINT32(temp, LSIState),
1997 VMSTATE_UINT32(dnad, LSIState),
1998 VMSTATE_UINT32(dbc, LSIState),
1999 VMSTATE_UINT8(istat0, LSIState),
2000 VMSTATE_UINT8(istat1, LSIState),
2001 VMSTATE_UINT8(dcmd, LSIState),
2002 VMSTATE_UINT8(dstat, LSIState),
2003 VMSTATE_UINT8(dien, LSIState),
2004 VMSTATE_UINT8(sist0, LSIState),
2005 VMSTATE_UINT8(sist1, LSIState),
2006 VMSTATE_UINT8(sien0, LSIState),
2007 VMSTATE_UINT8(sien1, LSIState),
2008 VMSTATE_UINT8(mbox0, LSIState),
2009 VMSTATE_UINT8(mbox1, LSIState),
2010 VMSTATE_UINT8(dfifo, LSIState),
2011 VMSTATE_UINT8(ctest2, LSIState),
2012 VMSTATE_UINT8(ctest3, LSIState),
2013 VMSTATE_UINT8(ctest4, LSIState),
2014 VMSTATE_UINT8(ctest5, LSIState),
2015 VMSTATE_UINT8(ccntl0, LSIState),
2016 VMSTATE_UINT8(ccntl1, LSIState),
2017 VMSTATE_UINT32(dsp, LSIState),
2018 VMSTATE_UINT32(dsps, LSIState),
2019 VMSTATE_UINT8(dmode, LSIState),
2020 VMSTATE_UINT8(dcntl, LSIState),
2021 VMSTATE_UINT8(scntl0, LSIState),
2022 VMSTATE_UINT8(scntl1, LSIState),
2023 VMSTATE_UINT8(scntl2, LSIState),
2024 VMSTATE_UINT8(scntl3, LSIState),
2025 VMSTATE_UINT8(sstat0, LSIState),
2026 VMSTATE_UINT8(sstat1, LSIState),
2027 VMSTATE_UINT8(scid, LSIState),
2028 VMSTATE_UINT8(sxfer, LSIState),
2029 VMSTATE_UINT8(socl, LSIState),
2030 VMSTATE_UINT8(sdid, LSIState),
2031 VMSTATE_UINT8(ssid, LSIState),
2032 VMSTATE_UINT8(sfbr, LSIState),
2033 VMSTATE_UINT8(stest1, LSIState),
2034 VMSTATE_UINT8(stest2, LSIState),
2035 VMSTATE_UINT8(stest3, LSIState),
2036 VMSTATE_UINT8(sidl, LSIState),
2037 VMSTATE_UINT8(stime0, LSIState),
2038 VMSTATE_UINT8(respid0, LSIState),
2039 VMSTATE_UINT8(respid1, LSIState),
2040 VMSTATE_UINT32(mmrs, LSIState),
2041 VMSTATE_UINT32(mmws, LSIState),
2042 VMSTATE_UINT32(sfs, LSIState),
2043 VMSTATE_UINT32(drs, LSIState),
2044 VMSTATE_UINT32(sbms, LSIState),
2045 VMSTATE_UINT32(dbms, LSIState),
2046 VMSTATE_UINT32(dnad64, LSIState),
2047 VMSTATE_UINT32(pmjad1, LSIState),
2048 VMSTATE_UINT32(pmjad2, LSIState),
2049 VMSTATE_UINT32(rbc, LSIState),
2050 VMSTATE_UINT32(ua, LSIState),
2051 VMSTATE_UINT32(ia, LSIState),
2052 VMSTATE_UINT32(sbc, LSIState),
2053 VMSTATE_UINT32(csbc, LSIState),
2054 VMSTATE_BUFFER_UNSAFE(scratch, LSIState, 0, 18 * sizeof(uint32_t)),
2055 VMSTATE_UINT8(sbr, LSIState),
2056
2057 VMSTATE_BUFFER_UNSAFE(script_ram, LSIState, 0, 2048 * sizeof(uint32_t)),
2058 VMSTATE_END_OF_LIST()
2059 }
2060};
2061
2062static void lsi_scsi_uninit(PCIDevice *d)
2063{
2064 LSIState *s = DO_UPCAST(LSIState, dev, d);
2065
2066 memory_region_destroy(&s->mmio_io);
2067 memory_region_destroy(&s->ram_io);
2068 memory_region_destroy(&s->io_io);
2069}
2070
2071static const struct SCSIBusInfo lsi_scsi_info = {
2072 .tcq = true,
2073 .max_target = LSI_MAX_DEVS,
2074 .max_lun = 0,
2075
2076 .transfer_data = lsi_transfer_data,
2077 .complete = lsi_command_complete,
2078 .cancel = lsi_request_cancelled
2079};
2080
2081static int lsi_scsi_init(PCIDevice *dev)
2082{
2083 LSIState *s = DO_UPCAST(LSIState, dev, dev);
2084 uint8_t *pci_conf;
2085
2086 pci_conf = s->dev.config;
2087
2088
2089 pci_conf[PCI_LATENCY_TIMER] = 0xff;
2090
2091 pci_conf[PCI_INTERRUPT_PIN] = 0x01;
2092
2093 memory_region_init_io(&s->mmio_io, &lsi_mmio_ops, s, "lsi-mmio", 0x400);
2094 memory_region_init_io(&s->ram_io, &lsi_ram_ops, s, "lsi-ram", 0x2000);
2095 memory_region_init_io(&s->io_io, &lsi_io_ops, s, "lsi-io", 256);
2096
2097 pci_register_bar(&s->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io_io);
2098 pci_register_bar(&s->dev, 1, 0, &s->mmio_io);
2099 pci_register_bar(&s->dev, 2, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->ram_io);
2100 QTAILQ_INIT(&s->queue);
2101
2102 scsi_bus_new(&s->bus, &dev->qdev, &lsi_scsi_info);
2103 if (!dev->qdev.hotplugged) {
2104 return scsi_bus_legacy_handle_cmdline(&s->bus);
2105 }
2106 return 0;
2107}
2108
2109static void lsi_class_init(ObjectClass *klass, void *data)
2110{
2111 DeviceClass *dc = DEVICE_CLASS(klass);
2112 PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
2113
2114 k->init = lsi_scsi_init;
2115 k->exit = lsi_scsi_uninit;
2116 k->vendor_id = PCI_VENDOR_ID_LSI_LOGIC;
2117 k->device_id = PCI_DEVICE_ID_LSI_53C895A;
2118 k->class_id = PCI_CLASS_STORAGE_SCSI;
2119 k->subsystem_id = 0x1000;
2120 dc->reset = lsi_scsi_reset;
2121 dc->vmsd = &vmstate_lsi_scsi;
2122}
2123
2124static const TypeInfo lsi_info = {
2125 .name = "lsi53c895a",
2126 .parent = TYPE_PCI_DEVICE,
2127 .instance_size = sizeof(LSIState),
2128 .class_init = lsi_class_init,
2129};
2130
2131static void lsi53c895a_register_types(void)
2132{
2133 type_register_static(&lsi_info);
2134}
2135
2136type_init(lsi53c895a_register_types)
2137