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