1 /*
2  * QEMU LSI53C895A SCSI Host Bus Adapter emulation
3  *
4  * Copyright (c) 2006 CodeSourcery.
5  * Written by Paul Brook
6  *
7  * This code is licensed under the LGPL.
8  */
9 
10 /* Note:
11  * LSI53C810 emulation is incorrect, in the sense that it supports
12  * features added in later evolutions. This should not be a problem,
13  * as well-behaved operating systems will not try to use them.
14  */
15 
16 #include "qemu/osdep.h"
17 
18 #include "hw/irq.h"
19 #include "hw/pci/pci.h"
20 #include "hw/scsi/scsi.h"
21 #include "migration/vmstate.h"
22 #include "sysemu/dma.h"
23 #include "qemu/log.h"
24 #include "qemu/module.h"
25 #include "trace.h"
26 
27 static const char *names[] = {
28     "SCNTL0", "SCNTL1", "SCNTL2", "SCNTL3", "SCID", "SXFER", "SDID", "GPREG",
29     "SFBR", "SOCL", "SSID", "SBCL", "DSTAT", "SSTAT0", "SSTAT1", "SSTAT2",
30     "DSA0", "DSA1", "DSA2", "DSA3", "ISTAT", "0x15", "0x16", "0x17",
31     "CTEST0", "CTEST1", "CTEST2", "CTEST3", "TEMP0", "TEMP1", "TEMP2", "TEMP3",
32     "DFIFO", "CTEST4", "CTEST5", "CTEST6", "DBC0", "DBC1", "DBC2", "DCMD",
33     "DNAD0", "DNAD1", "DNAD2", "DNAD3", "DSP0", "DSP1", "DSP2", "DSP3",
34     "DSPS0", "DSPS1", "DSPS2", "DSPS3", "SCRATCHA0", "SCRATCHA1", "SCRATCHA2", "SCRATCHA3",
35     "DMODE", "DIEN", "SBR", "DCNTL", "ADDER0", "ADDER1", "ADDER2", "ADDER3",
36     "SIEN0", "SIEN1", "SIST0", "SIST1", "SLPAR", "0x45", "MACNTL", "GPCNTL",
37     "STIME0", "STIME1", "RESPID", "0x4b", "STEST0", "STEST1", "STEST2", "STEST3",
38     "SIDL", "0x51", "0x52", "0x53", "SODL", "0x55", "0x56", "0x57",
39     "SBDL", "0x59", "0x5a", "0x5b", "SCRATCHB0", "SCRATCHB1", "SCRATCHB2", "SCRATCHB3",
40 };
41 
42 #define LSI_MAX_DEVS 7
43 
44 #define LSI_SCNTL0_TRG    0x01
45 #define LSI_SCNTL0_AAP    0x02
46 #define LSI_SCNTL0_EPC    0x08
47 #define LSI_SCNTL0_WATN   0x10
48 #define LSI_SCNTL0_START  0x20
49 
50 #define LSI_SCNTL1_SST    0x01
51 #define LSI_SCNTL1_IARB   0x02
52 #define LSI_SCNTL1_AESP   0x04
53 #define LSI_SCNTL1_RST    0x08
54 #define LSI_SCNTL1_CON    0x10
55 #define LSI_SCNTL1_DHP    0x20
56 #define LSI_SCNTL1_ADB    0x40
57 #define LSI_SCNTL1_EXC    0x80
58 
59 #define LSI_SCNTL2_WSR    0x01
60 #define LSI_SCNTL2_VUE0   0x02
61 #define LSI_SCNTL2_VUE1   0x04
62 #define LSI_SCNTL2_WSS    0x08
63 #define LSI_SCNTL2_SLPHBEN 0x10
64 #define LSI_SCNTL2_SLPMD  0x20
65 #define LSI_SCNTL2_CHM    0x40
66 #define LSI_SCNTL2_SDU    0x80
67 
68 #define LSI_ISTAT0_DIP    0x01
69 #define LSI_ISTAT0_SIP    0x02
70 #define LSI_ISTAT0_INTF   0x04
71 #define LSI_ISTAT0_CON    0x08
72 #define LSI_ISTAT0_SEM    0x10
73 #define LSI_ISTAT0_SIGP   0x20
74 #define LSI_ISTAT0_SRST   0x40
75 #define LSI_ISTAT0_ABRT   0x80
76 
77 #define LSI_ISTAT1_SI     0x01
78 #define LSI_ISTAT1_SRUN   0x02
79 #define LSI_ISTAT1_FLSH   0x04
80 
81 #define LSI_SSTAT0_SDP0   0x01
82 #define LSI_SSTAT0_RST    0x02
83 #define LSI_SSTAT0_WOA    0x04
84 #define LSI_SSTAT0_LOA    0x08
85 #define LSI_SSTAT0_AIP    0x10
86 #define LSI_SSTAT0_OLF    0x20
87 #define LSI_SSTAT0_ORF    0x40
88 #define LSI_SSTAT0_ILF    0x80
89 
90 #define LSI_SIST0_PAR     0x01
91 #define LSI_SIST0_RST     0x02
92 #define LSI_SIST0_UDC     0x04
93 #define LSI_SIST0_SGE     0x08
94 #define LSI_SIST0_RSL     0x10
95 #define LSI_SIST0_SEL     0x20
96 #define LSI_SIST0_CMP     0x40
97 #define LSI_SIST0_MA      0x80
98 
99 #define LSI_SIST1_HTH     0x01
100 #define LSI_SIST1_GEN     0x02
101 #define LSI_SIST1_STO     0x04
102 #define LSI_SIST1_SBMC    0x10
103 
104 #define LSI_SOCL_IO       0x01
105 #define LSI_SOCL_CD       0x02
106 #define LSI_SOCL_MSG      0x04
107 #define LSI_SOCL_ATN      0x08
108 #define LSI_SOCL_SEL      0x10
109 #define LSI_SOCL_BSY      0x20
110 #define LSI_SOCL_ACK      0x40
111 #define LSI_SOCL_REQ      0x80
112 
113 #define LSI_DSTAT_IID     0x01
114 #define LSI_DSTAT_SIR     0x04
115 #define LSI_DSTAT_SSI     0x08
116 #define LSI_DSTAT_ABRT    0x10
117 #define LSI_DSTAT_BF      0x20
118 #define LSI_DSTAT_MDPE    0x40
119 #define LSI_DSTAT_DFE     0x80
120 
121 #define LSI_DCNTL_COM     0x01
122 #define LSI_DCNTL_IRQD    0x02
123 #define LSI_DCNTL_STD     0x04
124 #define LSI_DCNTL_IRQM    0x08
125 #define LSI_DCNTL_SSM     0x10
126 #define LSI_DCNTL_PFEN    0x20
127 #define LSI_DCNTL_PFF     0x40
128 #define LSI_DCNTL_CLSE    0x80
129 
130 #define LSI_DMODE_MAN     0x01
131 #define LSI_DMODE_BOF     0x02
132 #define LSI_DMODE_ERMP    0x04
133 #define LSI_DMODE_ERL     0x08
134 #define LSI_DMODE_DIOM    0x10
135 #define LSI_DMODE_SIOM    0x20
136 
137 #define LSI_CTEST2_DACK   0x01
138 #define LSI_CTEST2_DREQ   0x02
139 #define LSI_CTEST2_TEOP   0x04
140 #define LSI_CTEST2_PCICIE 0x08
141 #define LSI_CTEST2_CM     0x10
142 #define LSI_CTEST2_CIO    0x20
143 #define LSI_CTEST2_SIGP   0x40
144 #define LSI_CTEST2_DDIR   0x80
145 
146 #define LSI_CTEST5_BL2    0x04
147 #define LSI_CTEST5_DDIR   0x08
148 #define LSI_CTEST5_MASR   0x10
149 #define LSI_CTEST5_DFSN   0x20
150 #define LSI_CTEST5_BBCK   0x40
151 #define LSI_CTEST5_ADCK   0x80
152 
153 #define LSI_CCNTL0_DILS   0x01
154 #define LSI_CCNTL0_DISFC  0x10
155 #define LSI_CCNTL0_ENNDJ  0x20
156 #define LSI_CCNTL0_PMJCTL 0x40
157 #define LSI_CCNTL0_ENPMJ  0x80
158 
159 #define LSI_CCNTL1_EN64DBMV  0x01
160 #define LSI_CCNTL1_EN64TIBMV 0x02
161 #define LSI_CCNTL1_64TIMOD   0x04
162 #define LSI_CCNTL1_DDAC      0x08
163 #define LSI_CCNTL1_ZMOD      0x80
164 
165 #define LSI_SBCL_ATN         0x08
166 #define LSI_SBCL_BSY         0x20
167 #define LSI_SBCL_ACK         0x40
168 #define LSI_SBCL_REQ         0x80
169 
170 /* Enable Response to Reselection */
171 #define LSI_SCID_RRE      0x60
172 
173 #define LSI_CCNTL1_40BIT (LSI_CCNTL1_EN64TIBMV|LSI_CCNTL1_64TIMOD)
174 
175 #define PHASE_DO          0
176 #define PHASE_DI          1
177 #define PHASE_CMD         2
178 #define PHASE_ST          3
179 #define PHASE_MO          6
180 #define PHASE_MI          7
181 #define PHASE_MASK        7
182 
183 /* Maximum length of MSG IN data.  */
184 #define LSI_MAX_MSGIN_LEN 8
185 
186 /* Flag set if this is a tagged command.  */
187 #define LSI_TAG_VALID     (1 << 16)
188 
189 /* Maximum instructions to process. */
190 #define LSI_MAX_INSN    10000
191 
192 typedef struct lsi_request {
193     SCSIRequest *req;
194     uint32_t tag;
195     uint32_t dma_len;
196     uint8_t *dma_buf;
197     uint32_t pending;
198     int out;
199     QTAILQ_ENTRY(lsi_request) next;
200 } lsi_request;
201 
202 enum {
203     LSI_NOWAIT, /* SCRIPTS are running or stopped */
204     LSI_WAIT_RESELECT, /* Wait Reselect instruction has been issued */
205     LSI_DMA_SCRIPTS, /* processing DMA from lsi_execute_script */
206     LSI_DMA_IN_PROGRESS, /* DMA operation is in progress */
207 };
208 
209 enum {
210     LSI_MSG_ACTION_COMMAND = 0,
211     LSI_MSG_ACTION_DISCONNECT = 1,
212     LSI_MSG_ACTION_DOUT = 2,
213     LSI_MSG_ACTION_DIN = 3,
214 };
215 
216 typedef struct {
217     /*< private >*/
218     PCIDevice parent_obj;
219     /*< public >*/
220 
221     qemu_irq ext_irq;
222     MemoryRegion mmio_io;
223     MemoryRegion ram_io;
224     MemoryRegion io_io;
225     AddressSpace pci_io_as;
226 
227     int carry; /* ??? Should this be an a visible register somewhere?  */
228     int status;
229     int msg_action;
230     int msg_len;
231     uint8_t msg[LSI_MAX_MSGIN_LEN];
232     int waiting;
233     SCSIBus bus;
234     int current_lun;
235     /* The tag is a combination of the device ID and the SCSI tag.  */
236     uint32_t select_tag;
237     int command_complete;
238     QTAILQ_HEAD(, lsi_request) queue;
239     lsi_request *current;
240 
241     uint32_t dsa;
242     uint32_t temp;
243     uint32_t dnad;
244     uint32_t dbc;
245     uint8_t istat0;
246     uint8_t istat1;
247     uint8_t dcmd;
248     uint8_t dstat;
249     uint8_t dien;
250     uint8_t sist0;
251     uint8_t sist1;
252     uint8_t sien0;
253     uint8_t sien1;
254     uint8_t mbox0;
255     uint8_t mbox1;
256     uint8_t dfifo;
257     uint8_t ctest2;
258     uint8_t ctest3;
259     uint8_t ctest4;
260     uint8_t ctest5;
261     uint8_t ccntl0;
262     uint8_t ccntl1;
263     uint32_t dsp;
264     uint32_t dsps;
265     uint8_t dmode;
266     uint8_t dcntl;
267     uint8_t scntl0;
268     uint8_t scntl1;
269     uint8_t scntl2;
270     uint8_t scntl3;
271     uint8_t sstat0;
272     uint8_t sstat1;
273     uint8_t scid;
274     uint8_t sxfer;
275     uint8_t socl;
276     uint8_t sdid;
277     uint8_t ssid;
278     uint8_t sfbr;
279     uint8_t sbcl;
280     uint8_t stest1;
281     uint8_t stest2;
282     uint8_t stest3;
283     uint8_t sidl;
284     uint8_t stime0;
285     uint8_t respid0;
286     uint8_t respid1;
287     uint32_t mmrs;
288     uint32_t mmws;
289     uint32_t sfs;
290     uint32_t drs;
291     uint32_t sbms;
292     uint32_t dbms;
293     uint32_t dnad64;
294     uint32_t pmjad1;
295     uint32_t pmjad2;
296     uint32_t rbc;
297     uint32_t ua;
298     uint32_t ia;
299     uint32_t sbc;
300     uint32_t csbc;
301     uint32_t scratch[18]; /* SCRATCHA-SCRATCHR */
302     uint8_t sbr;
303     uint32_t adder;
304 
305     uint8_t script_ram[2048 * sizeof(uint32_t)];
306 } LSIState;
307 
308 #define TYPE_LSI53C810  "lsi53c810"
309 #define TYPE_LSI53C895A "lsi53c895a"
310 
311 #define LSI53C895A(obj) \
312     OBJECT_CHECK(LSIState, (obj), TYPE_LSI53C895A)
313 
314 static const char *scsi_phases[] = {
315     "DOUT",
316     "DIN",
317     "CMD",
318     "STATUS",
319     "RSVOUT",
320     "RSVIN",
321     "MSGOUT",
322     "MSGIN"
323 };
324 
scsi_phase_name(int phase)325 static const char *scsi_phase_name(int phase)
326 {
327     return scsi_phases[phase & PHASE_MASK];
328 }
329 
lsi_irq_on_rsl(LSIState * s)330 static inline int lsi_irq_on_rsl(LSIState *s)
331 {
332     return (s->sien0 & LSI_SIST0_RSL) && (s->scid & LSI_SCID_RRE);
333 }
334 
get_pending_req(LSIState * s)335 static lsi_request *get_pending_req(LSIState *s)
336 {
337     lsi_request *p;
338 
339     QTAILQ_FOREACH(p, &s->queue, next) {
340         if (p->pending) {
341             return p;
342         }
343     }
344     return NULL;
345 }
346 
lsi_soft_reset(LSIState * s)347 static void lsi_soft_reset(LSIState *s)
348 {
349     trace_lsi_reset();
350     s->carry = 0;
351 
352     s->msg_action = LSI_MSG_ACTION_COMMAND;
353     s->msg_len = 0;
354     s->waiting = LSI_NOWAIT;
355     s->dsa = 0;
356     s->dnad = 0;
357     s->dbc = 0;
358     s->temp = 0;
359     memset(s->scratch, 0, sizeof(s->scratch));
360     s->istat0 = 0;
361     s->istat1 = 0;
362     s->dcmd = 0x40;
363     s->dstat = 0;
364     s->dien = 0;
365     s->sist0 = 0;
366     s->sist1 = 0;
367     s->sien0 = 0;
368     s->sien1 = 0;
369     s->mbox0 = 0;
370     s->mbox1 = 0;
371     s->dfifo = 0;
372     s->ctest2 = LSI_CTEST2_DACK;
373     s->ctest3 = 0;
374     s->ctest4 = 0;
375     s->ctest5 = 0;
376     s->ccntl0 = 0;
377     s->ccntl1 = 0;
378     s->dsp = 0;
379     s->dsps = 0;
380     s->dmode = 0;
381     s->dcntl = 0;
382     s->scntl0 = 0xc0;
383     s->scntl1 = 0;
384     s->scntl2 = 0;
385     s->scntl3 = 0;
386     s->sstat0 = 0;
387     s->sstat1 = 0;
388     s->scid = 7;
389     s->sxfer = 0;
390     s->socl = 0;
391     s->sdid = 0;
392     s->ssid = 0;
393     s->sbcl = 0;
394     s->stest1 = 0;
395     s->stest2 = 0;
396     s->stest3 = 0;
397     s->sidl = 0;
398     s->stime0 = 0;
399     s->respid0 = 0x80;
400     s->respid1 = 0;
401     s->mmrs = 0;
402     s->mmws = 0;
403     s->sfs = 0;
404     s->drs = 0;
405     s->sbms = 0;
406     s->dbms = 0;
407     s->dnad64 = 0;
408     s->pmjad1 = 0;
409     s->pmjad2 = 0;
410     s->rbc = 0;
411     s->ua = 0;
412     s->ia = 0;
413     s->sbc = 0;
414     s->csbc = 0;
415     s->sbr = 0;
416     assert(QTAILQ_EMPTY(&s->queue));
417     assert(!s->current);
418 }
419 
lsi_dma_40bit(LSIState * s)420 static int lsi_dma_40bit(LSIState *s)
421 {
422     if ((s->ccntl1 & LSI_CCNTL1_40BIT) == LSI_CCNTL1_40BIT)
423         return 1;
424     return 0;
425 }
426 
lsi_dma_ti64bit(LSIState * s)427 static int lsi_dma_ti64bit(LSIState *s)
428 {
429     if ((s->ccntl1 & LSI_CCNTL1_EN64TIBMV) == LSI_CCNTL1_EN64TIBMV)
430         return 1;
431     return 0;
432 }
433 
lsi_dma_64bit(LSIState * s)434 static int lsi_dma_64bit(LSIState *s)
435 {
436     if ((s->ccntl1 & LSI_CCNTL1_EN64DBMV) == LSI_CCNTL1_EN64DBMV)
437         return 1;
438     return 0;
439 }
440 
441 static uint8_t lsi_reg_readb(LSIState *s, int offset);
442 static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val);
443 static void lsi_execute_script(LSIState *s);
444 static void lsi_reselect(LSIState *s, lsi_request *p);
445 
lsi_mem_read(LSIState * s,dma_addr_t addr,void * buf,dma_addr_t len)446 static inline void lsi_mem_read(LSIState *s, dma_addr_t addr,
447                                void *buf, dma_addr_t len)
448 {
449     if (s->dmode & LSI_DMODE_SIOM) {
450         address_space_read(&s->pci_io_as, addr, MEMTXATTRS_UNSPECIFIED,
451                            buf, len);
452     } else {
453         pci_dma_read(PCI_DEVICE(s), addr, buf, len);
454     }
455 }
456 
lsi_mem_write(LSIState * s,dma_addr_t addr,const void * buf,dma_addr_t len)457 static inline void lsi_mem_write(LSIState *s, dma_addr_t addr,
458                                 const void *buf, dma_addr_t len)
459 {
460     if (s->dmode & LSI_DMODE_DIOM) {
461         address_space_write(&s->pci_io_as, addr, MEMTXATTRS_UNSPECIFIED,
462                             buf, len);
463     } else {
464         pci_dma_write(PCI_DEVICE(s), addr, buf, len);
465     }
466 }
467 
read_dword(LSIState * s,uint32_t addr)468 static inline uint32_t read_dword(LSIState *s, uint32_t addr)
469 {
470     uint32_t buf;
471 
472     pci_dma_read(PCI_DEVICE(s), addr, &buf, 4);
473     return cpu_to_le32(buf);
474 }
475 
lsi_stop_script(LSIState * s)476 static void lsi_stop_script(LSIState *s)
477 {
478     s->istat1 &= ~LSI_ISTAT1_SRUN;
479 }
480 
lsi_set_irq(LSIState * s,int level)481 static void lsi_set_irq(LSIState *s, int level)
482 {
483     PCIDevice *d = PCI_DEVICE(s);
484 
485     if (s->ext_irq) {
486         qemu_set_irq(s->ext_irq, level);
487     } else {
488         pci_set_irq(d, level);
489     }
490 }
491 
lsi_update_irq(LSIState * s)492 static void lsi_update_irq(LSIState *s)
493 {
494     int level;
495     static int last_level;
496 
497     /* It's unclear whether the DIP/SIP bits should be cleared when the
498        Interrupt Status Registers are cleared or when istat0 is read.
499        We currently do the formwer, which seems to work.  */
500     level = 0;
501     if (s->dstat) {
502         if (s->dstat & s->dien)
503             level = 1;
504         s->istat0 |= LSI_ISTAT0_DIP;
505     } else {
506         s->istat0 &= ~LSI_ISTAT0_DIP;
507     }
508 
509     if (s->sist0 || s->sist1) {
510         if ((s->sist0 & s->sien0) || (s->sist1 & s->sien1))
511             level = 1;
512         s->istat0 |= LSI_ISTAT0_SIP;
513     } else {
514         s->istat0 &= ~LSI_ISTAT0_SIP;
515     }
516     if (s->istat0 & LSI_ISTAT0_INTF)
517         level = 1;
518 
519     if (level != last_level) {
520         trace_lsi_update_irq(level, s->dstat, s->sist1, s->sist0);
521         last_level = level;
522     }
523     lsi_set_irq(s, level);
524 
525     if (!s->current && !level && lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON)) {
526         lsi_request *p;
527 
528         trace_lsi_update_irq_disconnected();
529         p = get_pending_req(s);
530         if (p) {
531             lsi_reselect(s, p);
532         }
533     }
534 }
535 
536 /* Stop SCRIPTS execution and raise a SCSI interrupt.  */
lsi_script_scsi_interrupt(LSIState * s,int stat0,int stat1)537 static void lsi_script_scsi_interrupt(LSIState *s, int stat0, int stat1)
538 {
539     uint32_t mask0;
540     uint32_t mask1;
541 
542     trace_lsi_script_scsi_interrupt(stat1, stat0, s->sist1, s->sist0);
543     s->sist0 |= stat0;
544     s->sist1 |= stat1;
545     /* Stop processor on fatal or unmasked interrupt.  As a special hack
546        we don't stop processing when raising STO.  Instead continue
547        execution and stop at the next insn that accesses the SCSI bus.  */
548     mask0 = s->sien0 | ~(LSI_SIST0_CMP | LSI_SIST0_SEL | LSI_SIST0_RSL);
549     mask1 = s->sien1 | ~(LSI_SIST1_GEN | LSI_SIST1_HTH);
550     mask1 &= ~LSI_SIST1_STO;
551     if (s->sist0 & mask0 || s->sist1 & mask1) {
552         lsi_stop_script(s);
553     }
554     lsi_update_irq(s);
555 }
556 
557 /* Stop SCRIPTS execution and raise a DMA interrupt.  */
lsi_script_dma_interrupt(LSIState * s,int stat)558 static void lsi_script_dma_interrupt(LSIState *s, int stat)
559 {
560     trace_lsi_script_dma_interrupt(stat, s->dstat);
561     s->dstat |= stat;
562     lsi_update_irq(s);
563     lsi_stop_script(s);
564 }
565 
lsi_set_phase(LSIState * s,int phase)566 static inline void lsi_set_phase(LSIState *s, int phase)
567 {
568     s->sbcl &= ~PHASE_MASK;
569     s->sbcl |= phase | LSI_SBCL_REQ;
570     s->sstat1 = (s->sstat1 & ~PHASE_MASK) | phase;
571 }
572 
lsi_bad_phase(LSIState * s,int out,int new_phase)573 static void lsi_bad_phase(LSIState *s, int out, int new_phase)
574 {
575     /* Trigger a phase mismatch.  */
576     if (s->ccntl0 & LSI_CCNTL0_ENPMJ) {
577         if ((s->ccntl0 & LSI_CCNTL0_PMJCTL)) {
578             s->dsp = out ? s->pmjad1 : s->pmjad2;
579         } else {
580             s->dsp = (s->scntl2 & LSI_SCNTL2_WSR ? s->pmjad2 : s->pmjad1);
581         }
582         trace_lsi_bad_phase_jump(s->dsp);
583     } else {
584         trace_lsi_bad_phase_interrupt();
585         lsi_script_scsi_interrupt(s, LSI_SIST0_MA, 0);
586         lsi_stop_script(s);
587     }
588     lsi_set_phase(s, new_phase);
589 }
590 
591 
592 /* Resume SCRIPTS execution after a DMA operation.  */
lsi_resume_script(LSIState * s)593 static void lsi_resume_script(LSIState *s)
594 {
595     if (s->waiting != 2) {
596         s->waiting = LSI_NOWAIT;
597         lsi_execute_script(s);
598     } else {
599         s->waiting = LSI_NOWAIT;
600     }
601 }
602 
lsi_disconnect(LSIState * s)603 static void lsi_disconnect(LSIState *s)
604 {
605     s->scntl1 &= ~LSI_SCNTL1_CON;
606     s->sstat1 &= ~PHASE_MASK;
607     s->sbcl = 0;
608 }
609 
lsi_bad_selection(LSIState * s,uint32_t id)610 static void lsi_bad_selection(LSIState *s, uint32_t id)
611 {
612     trace_lsi_bad_selection(id);
613     lsi_script_scsi_interrupt(s, 0, LSI_SIST1_STO);
614     lsi_disconnect(s);
615 }
616 
617 /* Initiate a SCSI layer data transfer.  */
lsi_do_dma(LSIState * s,int out)618 static void lsi_do_dma(LSIState *s, int out)
619 {
620     uint32_t count;
621     dma_addr_t addr;
622     SCSIDevice *dev;
623 
624     assert(s->current);
625     if (!s->current->dma_len) {
626         /* Wait until data is available.  */
627         trace_lsi_do_dma_unavailable();
628         return;
629     }
630 
631     dev = s->current->req->dev;
632     assert(dev);
633 
634     count = s->dbc;
635     if (count > s->current->dma_len)
636         count = s->current->dma_len;
637 
638     addr = s->dnad;
639     /* both 40 and Table Indirect 64-bit DMAs store upper bits in dnad64 */
640     if (lsi_dma_40bit(s) || lsi_dma_ti64bit(s))
641         addr |= ((uint64_t)s->dnad64 << 32);
642     else if (s->dbms)
643         addr |= ((uint64_t)s->dbms << 32);
644     else if (s->sbms)
645         addr |= ((uint64_t)s->sbms << 32);
646 
647     trace_lsi_do_dma(addr, count);
648     s->csbc += count;
649     s->dnad += count;
650     s->dbc -= count;
651      if (s->current->dma_buf == NULL) {
652         s->current->dma_buf = scsi_req_get_buf(s->current->req);
653     }
654     /* ??? Set SFBR to first data byte.  */
655     if (out) {
656         lsi_mem_read(s, addr, s->current->dma_buf, count);
657     } else {
658         lsi_mem_write(s, addr, s->current->dma_buf, count);
659     }
660     s->current->dma_len -= count;
661     if (s->current->dma_len == 0) {
662         s->current->dma_buf = NULL;
663         scsi_req_continue(s->current->req);
664     } else {
665         s->current->dma_buf += count;
666         lsi_resume_script(s);
667     }
668 }
669 
670 
671 /* Add a command to the queue.  */
lsi_queue_command(LSIState * s)672 static void lsi_queue_command(LSIState *s)
673 {
674     lsi_request *p = s->current;
675 
676     trace_lsi_queue_command(p->tag);
677     assert(s->current != NULL);
678     assert(s->current->dma_len == 0);
679     QTAILQ_INSERT_TAIL(&s->queue, s->current, next);
680     s->current = NULL;
681 
682     p->pending = 0;
683     p->out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
684 }
685 
686 /* Queue a byte for a MSG IN phase.  */
lsi_add_msg_byte(LSIState * s,uint8_t data)687 static void lsi_add_msg_byte(LSIState *s, uint8_t data)
688 {
689     if (s->msg_len >= LSI_MAX_MSGIN_LEN) {
690         trace_lsi_add_msg_byte_error();
691     } else {
692         trace_lsi_add_msg_byte(data);
693         s->msg[s->msg_len++] = data;
694     }
695 }
696 
697 /* Perform reselection to continue a command.  */
lsi_reselect(LSIState * s,lsi_request * p)698 static void lsi_reselect(LSIState *s, lsi_request *p)
699 {
700     int id;
701 
702     assert(s->current == NULL);
703     QTAILQ_REMOVE(&s->queue, p, next);
704     s->current = p;
705 
706     id = (p->tag >> 8) & 0xf;
707     s->ssid = id | 0x80;
708     /* LSI53C700 Family Compatibility, see LSI53C895A 4-73 */
709     if (!(s->dcntl & LSI_DCNTL_COM)) {
710         s->sfbr = 1 << (id & 0x7);
711     }
712     trace_lsi_reselect(id);
713     s->scntl1 |= LSI_SCNTL1_CON;
714     lsi_set_phase(s, PHASE_MI);
715     s->msg_action = p->out ? LSI_MSG_ACTION_DOUT : LSI_MSG_ACTION_DIN;
716     s->current->dma_len = p->pending;
717     lsi_add_msg_byte(s, 0x80);
718     if (s->current->tag & LSI_TAG_VALID) {
719         lsi_add_msg_byte(s, 0x20);
720         lsi_add_msg_byte(s, p->tag & 0xff);
721     }
722 
723     if (lsi_irq_on_rsl(s)) {
724         lsi_script_scsi_interrupt(s, LSI_SIST0_RSL, 0);
725     }
726 }
727 
lsi_find_by_tag(LSIState * s,uint32_t tag)728 static lsi_request *lsi_find_by_tag(LSIState *s, uint32_t tag)
729 {
730     lsi_request *p;
731 
732     QTAILQ_FOREACH(p, &s->queue, next) {
733         if (p->tag == tag) {
734             return p;
735         }
736     }
737 
738     return NULL;
739 }
740 
lsi_request_free(LSIState * s,lsi_request * p)741 static void lsi_request_free(LSIState *s, lsi_request *p)
742 {
743     if (p == s->current) {
744         s->current = NULL;
745     } else {
746         QTAILQ_REMOVE(&s->queue, p, next);
747     }
748     g_free(p);
749 }
750 
lsi_request_cancelled(SCSIRequest * req)751 static void lsi_request_cancelled(SCSIRequest *req)
752 {
753     LSIState *s = LSI53C895A(req->bus->qbus.parent);
754     lsi_request *p = req->hba_private;
755 
756     req->hba_private = NULL;
757     lsi_request_free(s, p);
758     scsi_req_unref(req);
759 }
760 
761 /* Record that data is available for a queued command.  Returns zero if
762    the device was reselected, nonzero if the IO is deferred.  */
lsi_queue_req(LSIState * s,SCSIRequest * req,uint32_t len)763 static int lsi_queue_req(LSIState *s, SCSIRequest *req, uint32_t len)
764 {
765     lsi_request *p = req->hba_private;
766 
767     if (p->pending) {
768         trace_lsi_queue_req_error(p);
769     }
770     p->pending = len;
771     /* Reselect if waiting for it, or if reselection triggers an IRQ
772        and the bus is free.
773        Since no interrupt stacking is implemented in the emulation, it
774        is also required that there are no pending interrupts waiting
775        for service from the device driver. */
776     if (s->waiting == LSI_WAIT_RESELECT ||
777         (lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON) &&
778          !(s->istat0 & (LSI_ISTAT0_SIP | LSI_ISTAT0_DIP)))) {
779         /* Reselect device.  */
780         lsi_reselect(s, p);
781         return 0;
782     } else {
783         trace_lsi_queue_req(p->tag);
784         p->pending = len;
785         return 1;
786     }
787 }
788 
789  /* Callback to indicate that the SCSI layer has completed a command.  */
lsi_command_complete(SCSIRequest * req,uint32_t status,size_t resid)790 static void lsi_command_complete(SCSIRequest *req, uint32_t status, size_t resid)
791 {
792     LSIState *s = LSI53C895A(req->bus->qbus.parent);
793     int out;
794 
795     out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
796     trace_lsi_command_complete(status);
797     s->status = status;
798     s->command_complete = 2;
799     if (s->waiting && s->dbc != 0) {
800         /* Raise phase mismatch for short transfers.  */
801         lsi_bad_phase(s, out, PHASE_ST);
802     } else {
803         lsi_set_phase(s, PHASE_ST);
804     }
805 
806     if (req->hba_private == s->current) {
807         req->hba_private = NULL;
808         lsi_request_free(s, s->current);
809         scsi_req_unref(req);
810     }
811     lsi_resume_script(s);
812 }
813 
814  /* Callback to indicate that the SCSI layer has completed a transfer.  */
lsi_transfer_data(SCSIRequest * req,uint32_t len)815 static void lsi_transfer_data(SCSIRequest *req, uint32_t len)
816 {
817     LSIState *s = LSI53C895A(req->bus->qbus.parent);
818     int out;
819 
820     assert(req->hba_private);
821     if (s->waiting == LSI_WAIT_RESELECT || req->hba_private != s->current ||
822         (lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON))) {
823         if (lsi_queue_req(s, req, len)) {
824             return;
825         }
826     }
827 
828     out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
829 
830     /* host adapter (re)connected */
831     trace_lsi_transfer_data(req->tag, len);
832     s->current->dma_len = len;
833     s->command_complete = 1;
834     if (s->waiting) {
835         if (s->waiting == LSI_WAIT_RESELECT || s->dbc == 0) {
836             lsi_resume_script(s);
837         } else {
838             lsi_do_dma(s, out);
839         }
840     }
841 }
842 
lsi_do_command(LSIState * s)843 static void lsi_do_command(LSIState *s)
844 {
845     SCSIDevice *dev;
846     uint8_t buf[16];
847     uint32_t id;
848     int n;
849 
850     trace_lsi_do_command(s->dbc);
851     if (s->dbc > 16)
852         s->dbc = 16;
853     pci_dma_read(PCI_DEVICE(s), s->dnad, buf, s->dbc);
854     s->sfbr = buf[0];
855     s->command_complete = 0;
856 
857     id = (s->select_tag >> 8) & 0xf;
858     dev = scsi_device_find(&s->bus, 0, id, s->current_lun);
859     if (!dev) {
860         lsi_bad_selection(s, id);
861         return;
862     }
863 
864     assert(s->current == NULL);
865     s->current = g_new0(lsi_request, 1);
866     s->current->tag = s->select_tag;
867     s->current->req = scsi_req_new(dev, s->current->tag, s->current_lun, buf,
868                                    s->current);
869 
870     n = scsi_req_enqueue(s->current->req);
871     if (n) {
872         if (n > 0) {
873             lsi_set_phase(s, PHASE_DI);
874         } else if (n < 0) {
875             lsi_set_phase(s, PHASE_DO);
876         }
877         scsi_req_continue(s->current->req);
878     }
879     if (!s->command_complete) {
880         if (n) {
881             /* Command did not complete immediately so disconnect.  */
882             lsi_add_msg_byte(s, 2); /* SAVE DATA POINTER */
883             lsi_add_msg_byte(s, 4); /* DISCONNECT */
884             /* wait data */
885             lsi_set_phase(s, PHASE_MI);
886             s->msg_action = LSI_MSG_ACTION_DISCONNECT;
887             lsi_queue_command(s);
888         } else {
889             /* wait command complete */
890             lsi_set_phase(s, PHASE_DI);
891         }
892     }
893 }
894 
lsi_do_status(LSIState * s)895 static void lsi_do_status(LSIState *s)
896 {
897     uint8_t status;
898     trace_lsi_do_status(s->dbc, s->status);
899     if (s->dbc != 1) {
900         trace_lsi_do_status_error();
901     }
902     s->dbc = 1;
903     status = s->status;
904     s->sfbr = status;
905     pci_dma_write(PCI_DEVICE(s), s->dnad, &status, 1);
906     lsi_set_phase(s, PHASE_MI);
907     s->msg_action = LSI_MSG_ACTION_DISCONNECT;
908     lsi_add_msg_byte(s, 0); /* COMMAND COMPLETE */
909 }
910 
lsi_do_msgin(LSIState * s)911 static void lsi_do_msgin(LSIState *s)
912 {
913     uint8_t len;
914     trace_lsi_do_msgin(s->dbc, s->msg_len);
915     s->sfbr = s->msg[0];
916     len = s->msg_len;
917     assert(len > 0 && len <= LSI_MAX_MSGIN_LEN);
918     if (len > s->dbc)
919         len = s->dbc;
920     pci_dma_write(PCI_DEVICE(s), s->dnad, s->msg, len);
921     /* Linux drivers rely on the last byte being in the SIDL.  */
922     s->sidl = s->msg[len - 1];
923     s->msg_len -= len;
924     if (s->msg_len) {
925         memmove(s->msg, s->msg + len, s->msg_len);
926     } else {
927         /* ??? Check if ATN (not yet implemented) is asserted and maybe
928            switch to PHASE_MO.  */
929         switch (s->msg_action) {
930         case LSI_MSG_ACTION_COMMAND:
931             lsi_set_phase(s, PHASE_CMD);
932             break;
933         case LSI_MSG_ACTION_DISCONNECT:
934             lsi_disconnect(s);
935             break;
936         case LSI_MSG_ACTION_DOUT:
937             lsi_set_phase(s, PHASE_DO);
938             break;
939         case LSI_MSG_ACTION_DIN:
940             lsi_set_phase(s, PHASE_DI);
941             break;
942         default:
943             abort();
944         }
945     }
946 }
947 
948 /* Read the next byte during a MSGOUT phase.  */
lsi_get_msgbyte(LSIState * s)949 static uint8_t lsi_get_msgbyte(LSIState *s)
950 {
951     uint8_t data;
952     pci_dma_read(PCI_DEVICE(s), s->dnad, &data, 1);
953     s->dnad++;
954     s->dbc--;
955     return data;
956 }
957 
958 /* Skip the next n bytes during a MSGOUT phase. */
lsi_skip_msgbytes(LSIState * s,unsigned int n)959 static void lsi_skip_msgbytes(LSIState *s, unsigned int n)
960 {
961     s->dnad += n;
962     s->dbc  -= n;
963 }
964 
lsi_do_msgout(LSIState * s)965 static void lsi_do_msgout(LSIState *s)
966 {
967     uint8_t msg;
968     int len;
969     uint32_t current_tag;
970     lsi_request *current_req, *p, *p_next;
971 
972     if (s->current) {
973         current_tag = s->current->tag;
974         current_req = s->current;
975     } else {
976         current_tag = s->select_tag;
977         current_req = lsi_find_by_tag(s, current_tag);
978     }
979 
980     trace_lsi_do_msgout(s->dbc);
981     while (s->dbc) {
982         msg = lsi_get_msgbyte(s);
983         s->sfbr = msg;
984 
985         switch (msg) {
986         case 0x04:
987             trace_lsi_do_msgout_disconnect();
988             lsi_disconnect(s);
989             break;
990         case 0x08:
991             trace_lsi_do_msgout_noop();
992             lsi_set_phase(s, PHASE_CMD);
993             break;
994         case 0x01:
995             len = lsi_get_msgbyte(s);
996             msg = lsi_get_msgbyte(s);
997             (void)len; /* avoid a warning about unused variable*/
998             trace_lsi_do_msgout_extended(msg, len);
999             switch (msg) {
1000             case 1:
1001                 trace_lsi_do_msgout_ignored("SDTR");
1002                 lsi_skip_msgbytes(s, 2);
1003                 break;
1004             case 3:
1005                 trace_lsi_do_msgout_ignored("WDTR");
1006                 lsi_skip_msgbytes(s, 1);
1007                 break;
1008             case 4:
1009                 trace_lsi_do_msgout_ignored("PPR");
1010                 lsi_skip_msgbytes(s, 5);
1011                 break;
1012             default:
1013                 goto bad;
1014             }
1015             break;
1016         case 0x20: /* SIMPLE queue */
1017             s->select_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
1018             trace_lsi_do_msgout_simplequeue(s->select_tag & 0xff);
1019             break;
1020         case 0x21: /* HEAD of queue */
1021             qemu_log_mask(LOG_UNIMP, "lsi_scsi: HEAD queue not implemented\n");
1022             s->select_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
1023             break;
1024         case 0x22: /* ORDERED queue */
1025             qemu_log_mask(LOG_UNIMP,
1026                           "lsi_scsi: ORDERED queue not implemented\n");
1027             s->select_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
1028             break;
1029         case 0x0d:
1030             /* The ABORT TAG message clears the current I/O process only. */
1031             trace_lsi_do_msgout_abort(current_tag);
1032             if (current_req) {
1033                 scsi_req_cancel(current_req->req);
1034             }
1035             lsi_disconnect(s);
1036             break;
1037         case 0x06:
1038         case 0x0e:
1039         case 0x0c:
1040             /* The ABORT message clears all I/O processes for the selecting
1041                initiator on the specified logical unit of the target. */
1042             if (msg == 0x06) {
1043                 trace_lsi_do_msgout_abort(current_tag);
1044             }
1045             /* The CLEAR QUEUE message clears all I/O processes for all
1046                initiators on the specified logical unit of the target. */
1047             if (msg == 0x0e) {
1048                 trace_lsi_do_msgout_clearqueue(current_tag);
1049             }
1050             /* The BUS DEVICE RESET message clears all I/O processes for all
1051                initiators on all logical units of the target. */
1052             if (msg == 0x0c) {
1053                 trace_lsi_do_msgout_busdevicereset(current_tag);
1054             }
1055 
1056             /* clear the current I/O process */
1057             if (s->current) {
1058                 scsi_req_cancel(s->current->req);
1059             }
1060 
1061             /* As the current implemented devices scsi_disk and scsi_generic
1062                only support one LUN, we don't need to keep track of LUNs.
1063                Clearing I/O processes for other initiators could be possible
1064                for scsi_generic by sending a SG_SCSI_RESET to the /dev/sgX
1065                device, but this is currently not implemented (and seems not
1066                to be really necessary). So let's simply clear all queued
1067                commands for the current device: */
1068             QTAILQ_FOREACH_SAFE(p, &s->queue, next, p_next) {
1069                 if ((p->tag & 0x0000ff00) == (current_tag & 0x0000ff00)) {
1070                     scsi_req_cancel(p->req);
1071                 }
1072             }
1073 
1074             lsi_disconnect(s);
1075             break;
1076         default:
1077             if ((msg & 0x80) == 0) {
1078                 goto bad;
1079             }
1080             s->current_lun = msg & 7;
1081             trace_lsi_do_msgout_select(s->current_lun);
1082             lsi_set_phase(s, PHASE_CMD);
1083             break;
1084         }
1085     }
1086     return;
1087 bad:
1088     qemu_log_mask(LOG_UNIMP, "Unimplemented message 0x%02x\n", msg);
1089     lsi_set_phase(s, PHASE_MI);
1090     lsi_add_msg_byte(s, 7); /* MESSAGE REJECT */
1091     s->msg_action = LSI_MSG_ACTION_COMMAND;
1092 }
1093 
1094 #define LSI_BUF_SIZE 4096
lsi_memcpy(LSIState * s,uint32_t dest,uint32_t src,int count)1095 static void lsi_memcpy(LSIState *s, uint32_t dest, uint32_t src, int count)
1096 {
1097     int n;
1098     uint8_t buf[LSI_BUF_SIZE];
1099 
1100     trace_lsi_memcpy(dest, src, count);
1101     while (count) {
1102         n = (count > LSI_BUF_SIZE) ? LSI_BUF_SIZE : count;
1103         lsi_mem_read(s, src, buf, n);
1104         lsi_mem_write(s, dest, buf, n);
1105         src += n;
1106         dest += n;
1107         count -= n;
1108     }
1109 }
1110 
lsi_wait_reselect(LSIState * s)1111 static void lsi_wait_reselect(LSIState *s)
1112 {
1113     lsi_request *p;
1114 
1115     trace_lsi_wait_reselect();
1116 
1117     if (s->current) {
1118         return;
1119     }
1120     p = get_pending_req(s);
1121     if (p) {
1122         lsi_reselect(s, p);
1123     }
1124     if (s->current == NULL) {
1125         s->waiting = LSI_WAIT_RESELECT;
1126     }
1127 }
1128 
lsi_execute_script(LSIState * s)1129 static void lsi_execute_script(LSIState *s)
1130 {
1131     PCIDevice *pci_dev = PCI_DEVICE(s);
1132     uint32_t insn;
1133     uint32_t addr, addr_high;
1134     int opcode;
1135     int insn_processed = 0;
1136 
1137     s->istat1 |= LSI_ISTAT1_SRUN;
1138 again:
1139     if (++insn_processed > LSI_MAX_INSN) {
1140         /* Some windows drivers make the device spin waiting for a memory
1141            location to change.  If we have been executed a lot of code then
1142            assume this is the case and force an unexpected device disconnect.
1143            This is apparently sufficient to beat the drivers into submission.
1144          */
1145         if (!(s->sien0 & LSI_SIST0_UDC)) {
1146             qemu_log_mask(LOG_GUEST_ERROR,
1147                           "lsi_scsi: inf. loop with UDC masked");
1148         }
1149         lsi_script_scsi_interrupt(s, LSI_SIST0_UDC, 0);
1150         lsi_disconnect(s);
1151         trace_lsi_execute_script_stop();
1152         return;
1153     }
1154     insn = read_dword(s, s->dsp);
1155     if (!insn) {
1156         /* If we receive an empty opcode increment the DSP by 4 bytes
1157            instead of 8 and execute the next opcode at that location */
1158         s->dsp += 4;
1159         goto again;
1160     }
1161     addr = read_dword(s, s->dsp + 4);
1162     addr_high = 0;
1163     trace_lsi_execute_script(s->dsp, insn, addr);
1164     s->dsps = addr;
1165     s->dcmd = insn >> 24;
1166     s->dsp += 8;
1167     switch (insn >> 30) {
1168     case 0: /* Block move.  */
1169         if (s->sist1 & LSI_SIST1_STO) {
1170             trace_lsi_execute_script_blockmove_delayed();
1171             lsi_stop_script(s);
1172             break;
1173         }
1174         s->dbc = insn & 0xffffff;
1175         s->rbc = s->dbc;
1176         /* ??? Set ESA.  */
1177         s->ia = s->dsp - 8;
1178         if (insn & (1 << 29)) {
1179             /* Indirect addressing.  */
1180             addr = read_dword(s, addr);
1181         } else if (insn & (1 << 28)) {
1182             uint32_t buf[2];
1183             int32_t offset;
1184             /* Table indirect addressing.  */
1185 
1186             /* 32-bit Table indirect */
1187             offset = sextract32(addr, 0, 24);
1188             pci_dma_read(pci_dev, s->dsa + offset, buf, 8);
1189             /* byte count is stored in bits 0:23 only */
1190             s->dbc = cpu_to_le32(buf[0]) & 0xffffff;
1191             s->rbc = s->dbc;
1192             addr = cpu_to_le32(buf[1]);
1193 
1194             /* 40-bit DMA, upper addr bits [39:32] stored in first DWORD of
1195              * table, bits [31:24] */
1196             if (lsi_dma_40bit(s))
1197                 addr_high = cpu_to_le32(buf[0]) >> 24;
1198             else if (lsi_dma_ti64bit(s)) {
1199                 int selector = (cpu_to_le32(buf[0]) >> 24) & 0x1f;
1200                 switch (selector) {
1201                 case 0 ... 0x0f:
1202                     /* offset index into scratch registers since
1203                      * TI64 mode can use registers C to R */
1204                     addr_high = s->scratch[2 + selector];
1205                     break;
1206                 case 0x10:
1207                     addr_high = s->mmrs;
1208                     break;
1209                 case 0x11:
1210                     addr_high = s->mmws;
1211                     break;
1212                 case 0x12:
1213                     addr_high = s->sfs;
1214                     break;
1215                 case 0x13:
1216                     addr_high = s->drs;
1217                     break;
1218                 case 0x14:
1219                     addr_high = s->sbms;
1220                     break;
1221                 case 0x15:
1222                     addr_high = s->dbms;
1223                     break;
1224                 default:
1225                     qemu_log_mask(LOG_GUEST_ERROR,
1226                           "lsi_scsi: Illegal selector specified (0x%x > 0x15) "
1227                           "for 64-bit DMA block move", selector);
1228                     break;
1229                 }
1230             }
1231         } else if (lsi_dma_64bit(s)) {
1232             /* fetch a 3rd dword if 64-bit direct move is enabled and
1233                only if we're not doing table indirect or indirect addressing */
1234             s->dbms = read_dword(s, s->dsp);
1235             s->dsp += 4;
1236             s->ia = s->dsp - 12;
1237         }
1238         if ((s->sstat1 & PHASE_MASK) != ((insn >> 24) & 7)) {
1239             trace_lsi_execute_script_blockmove_badphase(
1240                     scsi_phase_name(s->sstat1),
1241                     scsi_phase_name(insn >> 24));
1242             lsi_script_scsi_interrupt(s, LSI_SIST0_MA, 0);
1243             break;
1244         }
1245         s->dnad = addr;
1246         s->dnad64 = addr_high;
1247         switch (s->sstat1 & 0x7) {
1248         case PHASE_DO:
1249             s->waiting = LSI_DMA_SCRIPTS;
1250             lsi_do_dma(s, 1);
1251             if (s->waiting)
1252                 s->waiting = LSI_DMA_IN_PROGRESS;
1253             break;
1254         case PHASE_DI:
1255             s->waiting = LSI_DMA_SCRIPTS;
1256             lsi_do_dma(s, 0);
1257             if (s->waiting)
1258                 s->waiting = LSI_DMA_IN_PROGRESS;
1259             break;
1260         case PHASE_CMD:
1261             lsi_do_command(s);
1262             break;
1263         case PHASE_ST:
1264             lsi_do_status(s);
1265             break;
1266         case PHASE_MO:
1267             lsi_do_msgout(s);
1268             break;
1269         case PHASE_MI:
1270             lsi_do_msgin(s);
1271             break;
1272         default:
1273             qemu_log_mask(LOG_UNIMP, "lsi_scsi: Unimplemented phase %s\n",
1274                           scsi_phase_name(s->sstat1));
1275         }
1276         s->dfifo = s->dbc & 0xff;
1277         s->ctest5 = (s->ctest5 & 0xfc) | ((s->dbc >> 8) & 3);
1278         s->sbc = s->dbc;
1279         s->rbc -= s->dbc;
1280         s->ua = addr + s->dbc;
1281         break;
1282 
1283     case 1: /* IO or Read/Write instruction.  */
1284         opcode = (insn >> 27) & 7;
1285         if (opcode < 5) {
1286             uint32_t id;
1287 
1288             if (insn & (1 << 25)) {
1289                 id = read_dword(s, s->dsa + sextract32(insn, 0, 24));
1290             } else {
1291                 id = insn;
1292             }
1293             id = (id >> 16) & 0xf;
1294             if (insn & (1 << 26)) {
1295                 addr = s->dsp + sextract32(addr, 0, 24);
1296             }
1297             s->dnad = addr;
1298             switch (opcode) {
1299             case 0: /* Select */
1300                 s->sdid = id;
1301                 if (s->scntl1 & LSI_SCNTL1_CON) {
1302                     trace_lsi_execute_script_io_alreadyreselected();
1303                     s->dsp = s->dnad;
1304                     break;
1305                 }
1306                 s->sstat0 |= LSI_SSTAT0_WOA;
1307                 s->scntl1 &= ~LSI_SCNTL1_IARB;
1308                 if (!scsi_device_find(&s->bus, 0, id, 0)) {
1309                     lsi_bad_selection(s, id);
1310                     break;
1311                 }
1312                 trace_lsi_execute_script_io_selected(id,
1313                                              insn & (1 << 3) ? " ATN" : "");
1314                 /* ??? Linux drivers compain when this is set.  Maybe
1315                    it only applies in low-level mode (unimplemented).
1316                 lsi_script_scsi_interrupt(s, LSI_SIST0_CMP, 0); */
1317                 s->select_tag = id << 8;
1318                 s->scntl1 |= LSI_SCNTL1_CON;
1319                 if (insn & (1 << 3)) {
1320                     s->socl |= LSI_SOCL_ATN;
1321                     s->sbcl |= LSI_SBCL_ATN;
1322                 }
1323                 s->sbcl |= LSI_SBCL_BSY;
1324                 lsi_set_phase(s, PHASE_MO);
1325                 s->waiting = LSI_NOWAIT;
1326                 break;
1327             case 1: /* Disconnect */
1328                 trace_lsi_execute_script_io_disconnect();
1329                 s->scntl1 &= ~LSI_SCNTL1_CON;
1330                 /* FIXME: this is not entirely correct; the target need not ask
1331                  * for reselection until it has to send data, while here we force a
1332                  * reselection as soon as the bus is free.  The correct flow would
1333                  * reselect before lsi_transfer_data and disconnect as soon as
1334                  * DMA ends.
1335                  */
1336                 if (!s->current) {
1337                     lsi_request *p = get_pending_req(s);
1338                     if (p) {
1339                         lsi_reselect(s, p);
1340                     }
1341                 }
1342                 break;
1343             case 2: /* Wait Reselect */
1344                 if (s->istat0 & LSI_ISTAT0_SIGP) {
1345                     s->dsp = s->dnad;
1346                 } else if (!lsi_irq_on_rsl(s)) {
1347                         lsi_wait_reselect(s);
1348                 }
1349                 break;
1350             case 3: /* Set */
1351                 trace_lsi_execute_script_io_set(
1352                         insn & (1 << 3) ? " ATN" : "",
1353                         insn & (1 << 6) ? " ACK" : "",
1354                         insn & (1 << 9) ? " TM" : "",
1355                         insn & (1 << 10) ? " CC" : "");
1356                 if (insn & (1 << 3)) {
1357                     s->socl |= LSI_SOCL_ATN;
1358                     s->sbcl |= LSI_SBCL_ATN;
1359                     lsi_set_phase(s, PHASE_MO);
1360                 }
1361 
1362                 if (insn & (1 << 6)) {
1363                     s->sbcl |= LSI_SBCL_ACK;
1364                 }
1365 
1366                 if (insn & (1 << 9)) {
1367                     qemu_log_mask(LOG_UNIMP,
1368                         "lsi_scsi: Target mode not implemented\n");
1369                 }
1370                 if (insn & (1 << 10))
1371                     s->carry = 1;
1372                 break;
1373             case 4: /* Clear */
1374                 trace_lsi_execute_script_io_clear(
1375                         insn & (1 << 3) ? " ATN" : "",
1376                         insn & (1 << 6) ? " ACK" : "",
1377                         insn & (1 << 9) ? " TM" : "",
1378                         insn & (1 << 10) ? " CC" : "");
1379                 if (insn & (1 << 3)) {
1380                     s->socl &= ~LSI_SOCL_ATN;
1381                     s->sbcl &= ~LSI_SBCL_ATN;
1382                 }
1383 
1384                 if (insn & (1 << 6)) {
1385                     s->sbcl &= ~LSI_SBCL_ACK;
1386                 }
1387 
1388                 if (insn & (1 << 10))
1389                     s->carry = 0;
1390                 break;
1391             }
1392         } else {
1393             uint8_t op0;
1394             uint8_t op1;
1395             uint8_t data8;
1396             int reg;
1397             int operator;
1398 
1399             static const char *opcode_names[3] =
1400                 {"Write", "Read", "Read-Modify-Write"};
1401             static const char *operator_names[8] =
1402                 {"MOV", "SHL", "OR", "XOR", "AND", "SHR", "ADD", "ADC"};
1403 
1404             reg = ((insn >> 16) & 0x7f) | (insn & 0x80);
1405             data8 = (insn >> 8) & 0xff;
1406             opcode = (insn >> 27) & 7;
1407             operator = (insn >> 24) & 7;
1408             trace_lsi_execute_script_io_opcode(
1409                     opcode_names[opcode - 5], reg,
1410                     operator_names[operator], data8, s->sfbr,
1411                     (insn & (1 << 23)) ? " SFBR" : "");
1412             op0 = op1 = 0;
1413             switch (opcode) {
1414             case 5: /* From SFBR */
1415                 op0 = s->sfbr;
1416                 op1 = data8;
1417                 break;
1418             case 6: /* To SFBR */
1419                 if (operator)
1420                     op0 = lsi_reg_readb(s, reg);
1421                 op1 = data8;
1422                 break;
1423             case 7: /* Read-modify-write */
1424                 if (operator)
1425                     op0 = lsi_reg_readb(s, reg);
1426                 if (insn & (1 << 23)) {
1427                     op1 = s->sfbr;
1428                 } else {
1429                     op1 = data8;
1430                 }
1431                 break;
1432             }
1433 
1434             switch (operator) {
1435             case 0: /* move */
1436                 op0 = op1;
1437                 break;
1438             case 1: /* Shift left */
1439                 op1 = op0 >> 7;
1440                 op0 = (op0 << 1) | s->carry;
1441                 s->carry = op1;
1442                 break;
1443             case 2: /* OR */
1444                 op0 |= op1;
1445                 break;
1446             case 3: /* XOR */
1447                 op0 ^= op1;
1448                 break;
1449             case 4: /* AND */
1450                 op0 &= op1;
1451                 break;
1452             case 5: /* SHR */
1453                 op1 = op0 & 1;
1454                 op0 = (op0 >> 1) | (s->carry << 7);
1455                 s->carry = op1;
1456                 break;
1457             case 6: /* ADD */
1458                 op0 += op1;
1459                 s->carry = op0 < op1;
1460                 break;
1461             case 7: /* ADC */
1462                 op0 += op1 + s->carry;
1463                 if (s->carry)
1464                     s->carry = op0 <= op1;
1465                 else
1466                     s->carry = op0 < op1;
1467                 break;
1468             }
1469 
1470             switch (opcode) {
1471             case 5: /* From SFBR */
1472             case 7: /* Read-modify-write */
1473                 lsi_reg_writeb(s, reg, op0);
1474                 break;
1475             case 6: /* To SFBR */
1476                 s->sfbr = op0;
1477                 break;
1478             }
1479         }
1480         break;
1481 
1482     case 2: /* Transfer Control.  */
1483         {
1484             int cond;
1485             int jmp;
1486 
1487             if ((insn & 0x002e0000) == 0) {
1488                 trace_lsi_execute_script_tc_nop();
1489                 break;
1490             }
1491             if (s->sist1 & LSI_SIST1_STO) {
1492                 trace_lsi_execute_script_tc_delayedselect_timeout();
1493                 lsi_stop_script(s);
1494                 break;
1495             }
1496             cond = jmp = (insn & (1 << 19)) != 0;
1497             if (cond == jmp && (insn & (1 << 21))) {
1498                 trace_lsi_execute_script_tc_compc(s->carry == jmp);
1499                 cond = s->carry != 0;
1500             }
1501             if (cond == jmp && (insn & (1 << 17))) {
1502                 trace_lsi_execute_script_tc_compp(scsi_phase_name(s->sstat1),
1503                         jmp ? '=' : '!', scsi_phase_name(insn >> 24));
1504                 cond = (s->sstat1 & PHASE_MASK) == ((insn >> 24) & 7);
1505             }
1506             if (cond == jmp && (insn & (1 << 18))) {
1507                 uint8_t mask;
1508 
1509                 mask = (~insn >> 8) & 0xff;
1510                 trace_lsi_execute_script_tc_compd(
1511                         s->sfbr, mask, jmp ? '=' : '!', insn & mask);
1512                 cond = (s->sfbr & mask) == (insn & mask);
1513             }
1514             if (cond == jmp) {
1515                 if (insn & (1 << 23)) {
1516                     /* Relative address.  */
1517                     addr = s->dsp + sextract32(addr, 0, 24);
1518                 }
1519                 switch ((insn >> 27) & 7) {
1520                 case 0: /* Jump */
1521                     trace_lsi_execute_script_tc_jump(addr);
1522                     s->adder = addr;
1523                     s->dsp = addr;
1524                     break;
1525                 case 1: /* Call */
1526                     trace_lsi_execute_script_tc_call(addr);
1527                     s->temp = s->dsp;
1528                     s->dsp = addr;
1529                     break;
1530                 case 2: /* Return */
1531                     trace_lsi_execute_script_tc_return(s->temp);
1532                     s->dsp = s->temp;
1533                     break;
1534                 case 3: /* Interrupt */
1535                     trace_lsi_execute_script_tc_interrupt(s->dsps);
1536                     if ((insn & (1 << 20)) != 0) {
1537                         s->istat0 |= LSI_ISTAT0_INTF;
1538                         lsi_update_irq(s);
1539                     } else {
1540                         lsi_script_dma_interrupt(s, LSI_DSTAT_SIR);
1541                     }
1542                     break;
1543                 default:
1544                     trace_lsi_execute_script_tc_illegal();
1545                     lsi_script_dma_interrupt(s, LSI_DSTAT_IID);
1546                     break;
1547                 }
1548             } else {
1549                 trace_lsi_execute_script_tc_cc_failed();
1550             }
1551         }
1552         break;
1553 
1554     case 3:
1555         if ((insn & (1 << 29)) == 0) {
1556             /* Memory move.  */
1557             uint32_t dest;
1558             /* ??? The docs imply the destination address is loaded into
1559                the TEMP register.  However the Linux drivers rely on
1560                the value being presrved.  */
1561             dest = read_dword(s, s->dsp);
1562             s->dsp += 4;
1563             lsi_memcpy(s, dest, addr, insn & 0xffffff);
1564         } else {
1565             uint8_t data[7];
1566             int reg;
1567             int n;
1568             int i;
1569 
1570             if (insn & (1 << 28)) {
1571                 addr = s->dsa + sextract32(addr, 0, 24);
1572             }
1573             n = (insn & 7);
1574             reg = (insn >> 16) & 0xff;
1575             if (insn & (1 << 24)) {
1576                 pci_dma_read(pci_dev, addr, data, n);
1577                 trace_lsi_execute_script_mm_load(reg, n, addr, *(int *)data);
1578                 for (i = 0; i < n; i++) {
1579                     lsi_reg_writeb(s, reg + i, data[i]);
1580                 }
1581             } else {
1582                 trace_lsi_execute_script_mm_store(reg, n, addr);
1583                 for (i = 0; i < n; i++) {
1584                     data[i] = lsi_reg_readb(s, reg + i);
1585                 }
1586                 pci_dma_write(pci_dev, addr, data, n);
1587             }
1588         }
1589     }
1590     if (s->istat1 & LSI_ISTAT1_SRUN && s->waiting == LSI_NOWAIT) {
1591         if (s->dcntl & LSI_DCNTL_SSM) {
1592             lsi_script_dma_interrupt(s, LSI_DSTAT_SSI);
1593         } else {
1594             goto again;
1595         }
1596     }
1597     trace_lsi_execute_script_stop();
1598 }
1599 
lsi_reg_readb(LSIState * s,int offset)1600 static uint8_t lsi_reg_readb(LSIState *s, int offset)
1601 {
1602     uint8_t ret;
1603 
1604 #define CASE_GET_REG24(name, addr) \
1605     case addr: ret = s->name & 0xff; break; \
1606     case addr + 1: ret = (s->name >> 8) & 0xff; break; \
1607     case addr + 2: ret = (s->name >> 16) & 0xff; break;
1608 
1609 #define CASE_GET_REG32(name, addr) \
1610     case addr: ret = s->name & 0xff; break; \
1611     case addr + 1: ret = (s->name >> 8) & 0xff; break; \
1612     case addr + 2: ret = (s->name >> 16) & 0xff; break; \
1613     case addr + 3: ret = (s->name >> 24) & 0xff; break;
1614 
1615     switch (offset) {
1616     case 0x00: /* SCNTL0 */
1617         ret = s->scntl0;
1618         break;
1619     case 0x01: /* SCNTL1 */
1620         ret = s->scntl1;
1621         break;
1622     case 0x02: /* SCNTL2 */
1623         ret = s->scntl2;
1624         break;
1625     case 0x03: /* SCNTL3 */
1626         ret = s->scntl3;
1627         break;
1628     case 0x04: /* SCID */
1629         ret = s->scid;
1630         break;
1631     case 0x05: /* SXFER */
1632         ret = s->sxfer;
1633         break;
1634     case 0x06: /* SDID */
1635         ret = s->sdid;
1636         break;
1637     case 0x07: /* GPREG0 */
1638         ret = 0x7f;
1639         break;
1640     case 0x08: /* Revision ID */
1641         ret = 0x00;
1642         break;
1643     case 0x09: /* SOCL */
1644         ret = s->socl;
1645         break;
1646     case 0xa: /* SSID */
1647         ret = s->ssid;
1648         break;
1649     case 0xb: /* SBCL */
1650         ret = s->sbcl;
1651         break;
1652     case 0xc: /* DSTAT */
1653         ret = s->dstat | LSI_DSTAT_DFE;
1654         if ((s->istat0 & LSI_ISTAT0_INTF) == 0)
1655             s->dstat = 0;
1656         lsi_update_irq(s);
1657         break;
1658     case 0x0d: /* SSTAT0 */
1659         ret = s->sstat0;
1660         break;
1661     case 0x0e: /* SSTAT1 */
1662         ret = s->sstat1;
1663         break;
1664     case 0x0f: /* SSTAT2 */
1665         ret = s->scntl1 & LSI_SCNTL1_CON ? 0 : 2;
1666         break;
1667     CASE_GET_REG32(dsa, 0x10)
1668     case 0x14: /* ISTAT0 */
1669         ret = s->istat0;
1670         break;
1671     case 0x15: /* ISTAT1 */
1672         ret = s->istat1;
1673         break;
1674     case 0x16: /* MBOX0 */
1675         ret = s->mbox0;
1676         break;
1677     case 0x17: /* MBOX1 */
1678         ret = s->mbox1;
1679         break;
1680     case 0x18: /* CTEST0 */
1681         ret = 0xff;
1682         break;
1683     case 0x19: /* CTEST1 */
1684         ret = 0;
1685         break;
1686     case 0x1a: /* CTEST2 */
1687         ret = s->ctest2 | LSI_CTEST2_DACK | LSI_CTEST2_CM;
1688         if (s->istat0 & LSI_ISTAT0_SIGP) {
1689             s->istat0 &= ~LSI_ISTAT0_SIGP;
1690             ret |= LSI_CTEST2_SIGP;
1691         }
1692         break;
1693     case 0x1b: /* CTEST3 */
1694         ret = s->ctest3;
1695         break;
1696     CASE_GET_REG32(temp, 0x1c)
1697     case 0x20: /* DFIFO */
1698         ret = s->dfifo;
1699         break;
1700     case 0x21: /* CTEST4 */
1701         ret = s->ctest4;
1702         break;
1703     case 0x22: /* CTEST5 */
1704         ret = s->ctest5;
1705         break;
1706     case 0x23: /* CTEST6 */
1707         ret = 0;
1708         break;
1709     CASE_GET_REG24(dbc, 0x24)
1710     case 0x27: /* DCMD */
1711         ret = s->dcmd;
1712         break;
1713     CASE_GET_REG32(dnad, 0x28)
1714     CASE_GET_REG32(dsp, 0x2c)
1715     CASE_GET_REG32(dsps, 0x30)
1716     CASE_GET_REG32(scratch[0], 0x34)
1717     case 0x38: /* DMODE */
1718         ret = s->dmode;
1719         break;
1720     case 0x39: /* DIEN */
1721         ret = s->dien;
1722         break;
1723     case 0x3a: /* SBR */
1724         ret = s->sbr;
1725         break;
1726     case 0x3b: /* DCNTL */
1727         ret = s->dcntl;
1728         break;
1729     /* ADDER Output (Debug of relative jump address) */
1730     CASE_GET_REG32(adder, 0x3c)
1731     case 0x40: /* SIEN0 */
1732         ret = s->sien0;
1733         break;
1734     case 0x41: /* SIEN1 */
1735         ret = s->sien1;
1736         break;
1737     case 0x42: /* SIST0 */
1738         ret = s->sist0;
1739         s->sist0 = 0;
1740         lsi_update_irq(s);
1741         break;
1742     case 0x43: /* SIST1 */
1743         ret = s->sist1;
1744         s->sist1 = 0;
1745         lsi_update_irq(s);
1746         break;
1747     case 0x46: /* MACNTL */
1748         ret = 0x0f;
1749         break;
1750     case 0x47: /* GPCNTL0 */
1751         ret = 0x0f;
1752         break;
1753     case 0x48: /* STIME0 */
1754         ret = s->stime0;
1755         break;
1756     case 0x4a: /* RESPID0 */
1757         ret = s->respid0;
1758         break;
1759     case 0x4b: /* RESPID1 */
1760         ret = s->respid1;
1761         break;
1762     case 0x4d: /* STEST1 */
1763         ret = s->stest1;
1764         break;
1765     case 0x4e: /* STEST2 */
1766         ret = s->stest2;
1767         break;
1768     case 0x4f: /* STEST3 */
1769         ret = s->stest3;
1770         break;
1771     case 0x50: /* SIDL */
1772         /* This is needed by the linux drivers.  We currently only update it
1773            during the MSG IN phase.  */
1774         ret = s->sidl;
1775         break;
1776     case 0x52: /* STEST4 */
1777         ret = 0xe0;
1778         break;
1779     case 0x56: /* CCNTL0 */
1780         ret = s->ccntl0;
1781         break;
1782     case 0x57: /* CCNTL1 */
1783         ret = s->ccntl1;
1784         break;
1785     case 0x58: /* SBDL */
1786         /* Some drivers peek at the data bus during the MSG IN phase.  */
1787         if ((s->sstat1 & PHASE_MASK) == PHASE_MI) {
1788             assert(s->msg_len > 0);
1789             return s->msg[0];
1790         }
1791         ret = 0;
1792         break;
1793     case 0x59: /* SBDL high */
1794         ret = 0;
1795         break;
1796     CASE_GET_REG32(mmrs, 0xa0)
1797     CASE_GET_REG32(mmws, 0xa4)
1798     CASE_GET_REG32(sfs, 0xa8)
1799     CASE_GET_REG32(drs, 0xac)
1800     CASE_GET_REG32(sbms, 0xb0)
1801     CASE_GET_REG32(dbms, 0xb4)
1802     CASE_GET_REG32(dnad64, 0xb8)
1803     CASE_GET_REG32(pmjad1, 0xc0)
1804     CASE_GET_REG32(pmjad2, 0xc4)
1805     CASE_GET_REG32(rbc, 0xc8)
1806     CASE_GET_REG32(ua, 0xcc)
1807     CASE_GET_REG32(ia, 0xd4)
1808     CASE_GET_REG32(sbc, 0xd8)
1809     CASE_GET_REG32(csbc, 0xdc)
1810     case 0x5c ... 0x9f:
1811     {
1812         int n;
1813         int shift;
1814         n = (offset - 0x58) >> 2;
1815         shift = (offset & 3) * 8;
1816         ret = (s->scratch[n] >> shift) & 0xff;
1817         break;
1818     }
1819     default:
1820     {
1821         qemu_log_mask(LOG_GUEST_ERROR,
1822                       "lsi_scsi: invalid read from reg %s %x\n",
1823                       offset < ARRAY_SIZE(names) ? names[offset] : "???",
1824                       offset);
1825         ret = 0xff;
1826         break;
1827     }
1828     }
1829 #undef CASE_GET_REG24
1830 #undef CASE_GET_REG32
1831 
1832     trace_lsi_reg_read(offset < ARRAY_SIZE(names) ? names[offset] : "???",
1833                        offset, ret);
1834 
1835     return ret;
1836 }
1837 
lsi_reg_writeb(LSIState * s,int offset,uint8_t val)1838 static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val)
1839 {
1840 #define CASE_SET_REG24(name, addr) \
1841     case addr    : s->name &= 0xffffff00; s->name |= val;       break; \
1842     case addr + 1: s->name &= 0xffff00ff; s->name |= val << 8;  break; \
1843     case addr + 2: s->name &= 0xff00ffff; s->name |= val << 16; break;
1844 
1845 #define CASE_SET_REG32(name, addr) \
1846     case addr    : s->name &= 0xffffff00; s->name |= val;       break; \
1847     case addr + 1: s->name &= 0xffff00ff; s->name |= val << 8;  break; \
1848     case addr + 2: s->name &= 0xff00ffff; s->name |= val << 16; break; \
1849     case addr + 3: s->name &= 0x00ffffff; s->name |= val << 24; break;
1850 
1851     trace_lsi_reg_write(offset < ARRAY_SIZE(names) ? names[offset] : "???",
1852                         offset, val);
1853 
1854     switch (offset) {
1855     case 0x00: /* SCNTL0 */
1856         s->scntl0 = val;
1857         if (val & LSI_SCNTL0_START) {
1858             qemu_log_mask(LOG_UNIMP,
1859                           "lsi_scsi: Start sequence not implemented\n");
1860         }
1861         break;
1862     case 0x01: /* SCNTL1 */
1863         s->scntl1 = val & ~LSI_SCNTL1_SST;
1864         if (val & LSI_SCNTL1_IARB) {
1865             qemu_log_mask(LOG_UNIMP,
1866                       "lsi_scsi: Immediate Arbritration not implemented\n");
1867         }
1868         if (val & LSI_SCNTL1_RST) {
1869             if (!(s->sstat0 & LSI_SSTAT0_RST)) {
1870                 qbus_reset_all(BUS(&s->bus));
1871                 s->sstat0 |= LSI_SSTAT0_RST;
1872                 lsi_script_scsi_interrupt(s, LSI_SIST0_RST, 0);
1873             }
1874         } else {
1875             s->sstat0 &= ~LSI_SSTAT0_RST;
1876         }
1877         break;
1878     case 0x02: /* SCNTL2 */
1879         val &= ~(LSI_SCNTL2_WSR | LSI_SCNTL2_WSS);
1880         s->scntl2 = val;
1881         break;
1882     case 0x03: /* SCNTL3 */
1883         s->scntl3 = val;
1884         break;
1885     case 0x04: /* SCID */
1886         s->scid = val;
1887         break;
1888     case 0x05: /* SXFER */
1889         s->sxfer = val;
1890         break;
1891     case 0x06: /* SDID */
1892         if ((s->ssid & 0x80) && (val & 0xf) != (s->ssid & 0xf)) {
1893             qemu_log_mask(LOG_GUEST_ERROR,
1894                           "lsi_scsi: Destination ID does not match SSID\n");
1895         }
1896         s->sdid = val & 0xf;
1897         break;
1898     case 0x07: /* GPREG0 */
1899         break;
1900     case 0x08: /* SFBR */
1901         /* The CPU is not allowed to write to this register.  However the
1902            SCRIPTS register move instructions are.  */
1903         s->sfbr = val;
1904         break;
1905     case 0x0a: case 0x0b:
1906         /* Openserver writes to these readonly registers on startup */
1907         return;
1908     case 0x0c: case 0x0d: case 0x0e: case 0x0f:
1909         /* Linux writes to these readonly registers on startup.  */
1910         return;
1911     CASE_SET_REG32(dsa, 0x10)
1912     case 0x14: /* ISTAT0 */
1913         s->istat0 = (s->istat0 & 0x0f) | (val & 0xf0);
1914         if (val & LSI_ISTAT0_ABRT) {
1915             lsi_script_dma_interrupt(s, LSI_DSTAT_ABRT);
1916         }
1917         if (val & LSI_ISTAT0_INTF) {
1918             s->istat0 &= ~LSI_ISTAT0_INTF;
1919             lsi_update_irq(s);
1920         }
1921         if (s->waiting == LSI_WAIT_RESELECT && val & LSI_ISTAT0_SIGP) {
1922             trace_lsi_awoken();
1923             s->waiting = LSI_NOWAIT;
1924             s->dsp = s->dnad;
1925             lsi_execute_script(s);
1926         }
1927         if (val & LSI_ISTAT0_SRST) {
1928             qdev_reset_all(DEVICE(s));
1929         }
1930         break;
1931     case 0x16: /* MBOX0 */
1932         s->mbox0 = val;
1933         break;
1934     case 0x17: /* MBOX1 */
1935         s->mbox1 = val;
1936         break;
1937     case 0x18: /* CTEST0 */
1938         /* nothing to do */
1939         break;
1940     case 0x1a: /* CTEST2 */
1941         s->ctest2 = val & LSI_CTEST2_PCICIE;
1942         break;
1943     case 0x1b: /* CTEST3 */
1944         s->ctest3 = val & 0x0f;
1945         break;
1946     CASE_SET_REG32(temp, 0x1c)
1947     case 0x21: /* CTEST4 */
1948         if (val & 7) {
1949             qemu_log_mask(LOG_UNIMP,
1950                           "lsi_scsi: Unimplemented CTEST4-FBL 0x%x\n", val);
1951         }
1952         s->ctest4 = val;
1953         break;
1954     case 0x22: /* CTEST5 */
1955         if (val & (LSI_CTEST5_ADCK | LSI_CTEST5_BBCK)) {
1956             qemu_log_mask(LOG_UNIMP,
1957                           "lsi_scsi: CTEST5 DMA increment not implemented\n");
1958         }
1959         s->ctest5 = val;
1960         break;
1961     CASE_SET_REG24(dbc, 0x24)
1962     CASE_SET_REG32(dnad, 0x28)
1963     case 0x2c: /* DSP[0:7] */
1964         s->dsp &= 0xffffff00;
1965         s->dsp |= val;
1966         break;
1967     case 0x2d: /* DSP[8:15] */
1968         s->dsp &= 0xffff00ff;
1969         s->dsp |= val << 8;
1970         break;
1971     case 0x2e: /* DSP[16:23] */
1972         s->dsp &= 0xff00ffff;
1973         s->dsp |= val << 16;
1974         break;
1975     case 0x2f: /* DSP[24:31] */
1976         s->dsp &= 0x00ffffff;
1977         s->dsp |= val << 24;
1978         /*
1979          * FIXME: if s->waiting != LSI_NOWAIT, this will only execute one
1980          * instruction.  Is this correct?
1981          */
1982         if ((s->dmode & LSI_DMODE_MAN) == 0
1983             && (s->istat1 & LSI_ISTAT1_SRUN) == 0)
1984             lsi_execute_script(s);
1985         break;
1986     CASE_SET_REG32(dsps, 0x30)
1987     CASE_SET_REG32(scratch[0], 0x34)
1988     case 0x38: /* DMODE */
1989         s->dmode = val;
1990         break;
1991     case 0x39: /* DIEN */
1992         s->dien = val;
1993         lsi_update_irq(s);
1994         break;
1995     case 0x3a: /* SBR */
1996         s->sbr = val;
1997         break;
1998     case 0x3b: /* DCNTL */
1999         s->dcntl = val & ~(LSI_DCNTL_PFF | LSI_DCNTL_STD);
2000         /*
2001          * FIXME: if s->waiting != LSI_NOWAIT, this will only execute one
2002          * instruction.  Is this correct?
2003          */
2004         if ((val & LSI_DCNTL_STD) && (s->istat1 & LSI_ISTAT1_SRUN) == 0)
2005             lsi_execute_script(s);
2006         break;
2007     case 0x40: /* SIEN0 */
2008         s->sien0 = val;
2009         lsi_update_irq(s);
2010         break;
2011     case 0x41: /* SIEN1 */
2012         s->sien1 = val;
2013         lsi_update_irq(s);
2014         break;
2015     case 0x47: /* GPCNTL0 */
2016         break;
2017     case 0x48: /* STIME0 */
2018         s->stime0 = val;
2019         break;
2020     case 0x49: /* STIME1 */
2021         if (val & 0xf) {
2022             qemu_log_mask(LOG_UNIMP,
2023                           "lsi_scsi: General purpose timer not implemented\n");
2024             /* ??? Raising the interrupt immediately seems to be sufficient
2025                to keep the FreeBSD driver happy.  */
2026             lsi_script_scsi_interrupt(s, 0, LSI_SIST1_GEN);
2027         }
2028         break;
2029     case 0x4a: /* RESPID0 */
2030         s->respid0 = val;
2031         break;
2032     case 0x4b: /* RESPID1 */
2033         s->respid1 = val;
2034         break;
2035     case 0x4d: /* STEST1 */
2036         s->stest1 = val;
2037         break;
2038     case 0x4e: /* STEST2 */
2039         if (val & 1) {
2040             qemu_log_mask(LOG_UNIMP,
2041                           "lsi_scsi: Low level mode not implemented\n");
2042         }
2043         s->stest2 = val;
2044         break;
2045     case 0x4f: /* STEST3 */
2046         if (val & 0x41) {
2047             qemu_log_mask(LOG_UNIMP,
2048                           "lsi_scsi: SCSI FIFO test mode not implemented\n");
2049         }
2050         s->stest3 = val;
2051         break;
2052     case 0x56: /* CCNTL0 */
2053         s->ccntl0 = val;
2054         break;
2055     case 0x57: /* CCNTL1 */
2056         s->ccntl1 = val;
2057         break;
2058     CASE_SET_REG32(mmrs, 0xa0)
2059     CASE_SET_REG32(mmws, 0xa4)
2060     CASE_SET_REG32(sfs, 0xa8)
2061     CASE_SET_REG32(drs, 0xac)
2062     CASE_SET_REG32(sbms, 0xb0)
2063     CASE_SET_REG32(dbms, 0xb4)
2064     CASE_SET_REG32(dnad64, 0xb8)
2065     CASE_SET_REG32(pmjad1, 0xc0)
2066     CASE_SET_REG32(pmjad2, 0xc4)
2067     CASE_SET_REG32(rbc, 0xc8)
2068     CASE_SET_REG32(ua, 0xcc)
2069     CASE_SET_REG32(ia, 0xd4)
2070     CASE_SET_REG32(sbc, 0xd8)
2071     CASE_SET_REG32(csbc, 0xdc)
2072     default:
2073         if (offset >= 0x5c && offset < 0xa0) {
2074             int n;
2075             int shift;
2076             n = (offset - 0x58) >> 2;
2077             shift = (offset & 3) * 8;
2078             s->scratch[n] = deposit32(s->scratch[n], shift, 8, val);
2079         } else {
2080             qemu_log_mask(LOG_GUEST_ERROR,
2081                           "lsi_scsi: invalid write to reg %s %x (0x%02x)\n",
2082                           offset < ARRAY_SIZE(names) ? names[offset] : "???",
2083                           offset, val);
2084         }
2085     }
2086 #undef CASE_SET_REG24
2087 #undef CASE_SET_REG32
2088 }
2089 
lsi_mmio_write(void * opaque,hwaddr addr,uint64_t val,unsigned size)2090 static void lsi_mmio_write(void *opaque, hwaddr addr,
2091                            uint64_t val, unsigned size)
2092 {
2093     LSIState *s = opaque;
2094 
2095     lsi_reg_writeb(s, addr & 0xff, val);
2096 }
2097 
lsi_mmio_read(void * opaque,hwaddr addr,unsigned size)2098 static uint64_t lsi_mmio_read(void *opaque, hwaddr addr,
2099                               unsigned size)
2100 {
2101     LSIState *s = opaque;
2102     return lsi_reg_readb(s, addr & 0xff);
2103 }
2104 
2105 static const MemoryRegionOps lsi_mmio_ops = {
2106     .read = lsi_mmio_read,
2107     .write = lsi_mmio_write,
2108     .endianness = DEVICE_LITTLE_ENDIAN,
2109     .impl = {
2110         .min_access_size = 1,
2111         .max_access_size = 1,
2112     },
2113 };
2114 
lsi_ram_write(void * opaque,hwaddr addr,uint64_t val,unsigned size)2115 static void lsi_ram_write(void *opaque, hwaddr addr,
2116                           uint64_t val, unsigned size)
2117 {
2118     LSIState *s = opaque;
2119     stn_le_p(s->script_ram + addr, size, val);
2120 }
2121 
lsi_ram_read(void * opaque,hwaddr addr,unsigned size)2122 static uint64_t lsi_ram_read(void *opaque, hwaddr addr,
2123                              unsigned size)
2124 {
2125     LSIState *s = opaque;
2126     return ldn_le_p(s->script_ram + addr, size);
2127 }
2128 
2129 static const MemoryRegionOps lsi_ram_ops = {
2130     .read = lsi_ram_read,
2131     .write = lsi_ram_write,
2132     .endianness = DEVICE_LITTLE_ENDIAN,
2133 };
2134 
lsi_io_read(void * opaque,hwaddr addr,unsigned size)2135 static uint64_t lsi_io_read(void *opaque, hwaddr addr,
2136                             unsigned size)
2137 {
2138     LSIState *s = opaque;
2139     return lsi_reg_readb(s, addr & 0xff);
2140 }
2141 
lsi_io_write(void * opaque,hwaddr addr,uint64_t val,unsigned size)2142 static void lsi_io_write(void *opaque, hwaddr addr,
2143                          uint64_t val, unsigned size)
2144 {
2145     LSIState *s = opaque;
2146     lsi_reg_writeb(s, addr & 0xff, val);
2147 }
2148 
2149 static const MemoryRegionOps lsi_io_ops = {
2150     .read = lsi_io_read,
2151     .write = lsi_io_write,
2152     .endianness = DEVICE_LITTLE_ENDIAN,
2153     .impl = {
2154         .min_access_size = 1,
2155         .max_access_size = 1,
2156     },
2157 };
2158 
lsi_scsi_reset(DeviceState * dev)2159 static void lsi_scsi_reset(DeviceState *dev)
2160 {
2161     LSIState *s = LSI53C895A(dev);
2162 
2163     lsi_soft_reset(s);
2164 }
2165 
lsi_pre_save(void * opaque)2166 static int lsi_pre_save(void *opaque)
2167 {
2168     LSIState *s = opaque;
2169 
2170     if (s->current) {
2171         assert(s->current->dma_buf == NULL);
2172         assert(s->current->dma_len == 0);
2173     }
2174     assert(QTAILQ_EMPTY(&s->queue));
2175 
2176     return 0;
2177 }
2178 
lsi_post_load(void * opaque,int version_id)2179 static int lsi_post_load(void *opaque, int version_id)
2180 {
2181     LSIState *s = opaque;
2182 
2183     if (s->msg_len < 0 || s->msg_len > LSI_MAX_MSGIN_LEN) {
2184         return -EINVAL;
2185     }
2186 
2187     return 0;
2188 }
2189 
2190 static const VMStateDescription vmstate_lsi_scsi = {
2191     .name = "lsiscsi",
2192     .version_id = 1,
2193     .minimum_version_id = 0,
2194     .pre_save = lsi_pre_save,
2195     .post_load = lsi_post_load,
2196     .fields = (VMStateField[]) {
2197         VMSTATE_PCI_DEVICE(parent_obj, LSIState),
2198 
2199         VMSTATE_INT32(carry, LSIState),
2200         VMSTATE_INT32(status, LSIState),
2201         VMSTATE_INT32(msg_action, LSIState),
2202         VMSTATE_INT32(msg_len, LSIState),
2203         VMSTATE_BUFFER(msg, LSIState),
2204         VMSTATE_INT32(waiting, LSIState),
2205 
2206         VMSTATE_UINT32(dsa, LSIState),
2207         VMSTATE_UINT32(temp, LSIState),
2208         VMSTATE_UINT32(dnad, LSIState),
2209         VMSTATE_UINT32(dbc, LSIState),
2210         VMSTATE_UINT8(istat0, LSIState),
2211         VMSTATE_UINT8(istat1, LSIState),
2212         VMSTATE_UINT8(dcmd, LSIState),
2213         VMSTATE_UINT8(dstat, LSIState),
2214         VMSTATE_UINT8(dien, LSIState),
2215         VMSTATE_UINT8(sist0, LSIState),
2216         VMSTATE_UINT8(sist1, LSIState),
2217         VMSTATE_UINT8(sien0, LSIState),
2218         VMSTATE_UINT8(sien1, LSIState),
2219         VMSTATE_UINT8(mbox0, LSIState),
2220         VMSTATE_UINT8(mbox1, LSIState),
2221         VMSTATE_UINT8(dfifo, LSIState),
2222         VMSTATE_UINT8(ctest2, LSIState),
2223         VMSTATE_UINT8(ctest3, LSIState),
2224         VMSTATE_UINT8(ctest4, LSIState),
2225         VMSTATE_UINT8(ctest5, LSIState),
2226         VMSTATE_UINT8(ccntl0, LSIState),
2227         VMSTATE_UINT8(ccntl1, LSIState),
2228         VMSTATE_UINT32(dsp, LSIState),
2229         VMSTATE_UINT32(dsps, LSIState),
2230         VMSTATE_UINT8(dmode, LSIState),
2231         VMSTATE_UINT8(dcntl, LSIState),
2232         VMSTATE_UINT8(scntl0, LSIState),
2233         VMSTATE_UINT8(scntl1, LSIState),
2234         VMSTATE_UINT8(scntl2, LSIState),
2235         VMSTATE_UINT8(scntl3, LSIState),
2236         VMSTATE_UINT8(sstat0, LSIState),
2237         VMSTATE_UINT8(sstat1, LSIState),
2238         VMSTATE_UINT8(scid, LSIState),
2239         VMSTATE_UINT8(sxfer, LSIState),
2240         VMSTATE_UINT8(socl, LSIState),
2241         VMSTATE_UINT8(sdid, LSIState),
2242         VMSTATE_UINT8(ssid, LSIState),
2243         VMSTATE_UINT8(sfbr, LSIState),
2244         VMSTATE_UINT8(stest1, LSIState),
2245         VMSTATE_UINT8(stest2, LSIState),
2246         VMSTATE_UINT8(stest3, LSIState),
2247         VMSTATE_UINT8(sidl, LSIState),
2248         VMSTATE_UINT8(stime0, LSIState),
2249         VMSTATE_UINT8(respid0, LSIState),
2250         VMSTATE_UINT8(respid1, LSIState),
2251         VMSTATE_UINT8_V(sbcl, LSIState, 1),
2252         VMSTATE_UINT32(mmrs, LSIState),
2253         VMSTATE_UINT32(mmws, LSIState),
2254         VMSTATE_UINT32(sfs, LSIState),
2255         VMSTATE_UINT32(drs, LSIState),
2256         VMSTATE_UINT32(sbms, LSIState),
2257         VMSTATE_UINT32(dbms, LSIState),
2258         VMSTATE_UINT32(dnad64, LSIState),
2259         VMSTATE_UINT32(pmjad1, LSIState),
2260         VMSTATE_UINT32(pmjad2, LSIState),
2261         VMSTATE_UINT32(rbc, LSIState),
2262         VMSTATE_UINT32(ua, LSIState),
2263         VMSTATE_UINT32(ia, LSIState),
2264         VMSTATE_UINT32(sbc, LSIState),
2265         VMSTATE_UINT32(csbc, LSIState),
2266         VMSTATE_BUFFER_UNSAFE(scratch, LSIState, 0, 18 * sizeof(uint32_t)),
2267         VMSTATE_UINT8(sbr, LSIState),
2268 
2269         VMSTATE_BUFFER_UNSAFE(script_ram, LSIState, 0, 8192),
2270         VMSTATE_END_OF_LIST()
2271     }
2272 };
2273 
2274 static const struct SCSIBusInfo lsi_scsi_info = {
2275     .tcq = true,
2276     .max_target = LSI_MAX_DEVS,
2277     .max_lun = 0,  /* LUN support is buggy */
2278 
2279     .transfer_data = lsi_transfer_data,
2280     .complete = lsi_command_complete,
2281     .cancel = lsi_request_cancelled
2282 };
2283 
lsi_scsi_realize(PCIDevice * dev,Error ** errp)2284 static void lsi_scsi_realize(PCIDevice *dev, Error **errp)
2285 {
2286     LSIState *s = LSI53C895A(dev);
2287     DeviceState *d = DEVICE(dev);
2288     uint8_t *pci_conf;
2289 
2290     pci_conf = dev->config;
2291 
2292     /* PCI latency timer = 255 */
2293     pci_conf[PCI_LATENCY_TIMER] = 0xff;
2294     /* Interrupt pin A */
2295     pci_conf[PCI_INTERRUPT_PIN] = 0x01;
2296 
2297     memory_region_init_io(&s->mmio_io, OBJECT(s), &lsi_mmio_ops, s,
2298                           "lsi-mmio", 0x400);
2299     memory_region_init_io(&s->ram_io, OBJECT(s), &lsi_ram_ops, s,
2300                           "lsi-ram", 0x2000);
2301     memory_region_init_io(&s->io_io, OBJECT(s), &lsi_io_ops, s,
2302                           "lsi-io", 256);
2303 
2304     address_space_init(&s->pci_io_as, pci_address_space_io(dev), "lsi-pci-io");
2305     qdev_init_gpio_out(d, &s->ext_irq, 1);
2306 
2307     pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io_io);
2308     pci_register_bar(dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->mmio_io);
2309     pci_register_bar(dev, 2, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->ram_io);
2310     QTAILQ_INIT(&s->queue);
2311 
2312     scsi_bus_new(&s->bus, sizeof(s->bus), d, &lsi_scsi_info, NULL);
2313 }
2314 
lsi_scsi_unrealize(DeviceState * dev,Error ** errp)2315 static void lsi_scsi_unrealize(DeviceState *dev, Error **errp)
2316 {
2317     LSIState *s = LSI53C895A(dev);
2318 
2319     address_space_destroy(&s->pci_io_as);
2320 }
2321 
lsi_class_init(ObjectClass * klass,void * data)2322 static void lsi_class_init(ObjectClass *klass, void *data)
2323 {
2324     DeviceClass *dc = DEVICE_CLASS(klass);
2325     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
2326 
2327     k->realize = lsi_scsi_realize;
2328     k->vendor_id = PCI_VENDOR_ID_LSI_LOGIC;
2329     k->device_id = PCI_DEVICE_ID_LSI_53C895A;
2330     k->class_id = PCI_CLASS_STORAGE_SCSI;
2331     k->subsystem_id = 0x1000;
2332     dc->unrealize = lsi_scsi_unrealize;
2333     dc->reset = lsi_scsi_reset;
2334     dc->vmsd = &vmstate_lsi_scsi;
2335     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
2336 }
2337 
2338 static const TypeInfo lsi_info = {
2339     .name          = TYPE_LSI53C895A,
2340     .parent        = TYPE_PCI_DEVICE,
2341     .instance_size = sizeof(LSIState),
2342     .class_init    = lsi_class_init,
2343     .interfaces = (InterfaceInfo[]) {
2344         { INTERFACE_CONVENTIONAL_PCI_DEVICE },
2345         { },
2346     },
2347 };
2348 
lsi53c810_class_init(ObjectClass * klass,void * data)2349 static void lsi53c810_class_init(ObjectClass *klass, void *data)
2350 {
2351     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
2352 
2353     k->device_id = PCI_DEVICE_ID_LSI_53C810;
2354 }
2355 
2356 static TypeInfo lsi53c810_info = {
2357     .name          = TYPE_LSI53C810,
2358     .parent        = TYPE_LSI53C895A,
2359     .class_init    = lsi53c810_class_init,
2360 };
2361 
lsi53c895a_register_types(void)2362 static void lsi53c895a_register_types(void)
2363 {
2364     type_register_static(&lsi_info);
2365     type_register_static(&lsi53c810_info);
2366 }
2367 
type_init(lsi53c895a_register_types)2368 type_init(lsi53c895a_register_types)
2369 
2370 void lsi53c8xx_handle_legacy_cmdline(DeviceState *lsi_dev)
2371 {
2372     LSIState *s = LSI53C895A(lsi_dev);
2373 
2374     scsi_bus_legacy_handle_cmdline(&s->bus);
2375 }
2376