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