Statistics
| Branch: | Revision:

root / hw / lsi53c895a.c @ 43a2b339

History | View | Annotate | Download (65.5 kB)

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 licenced under the LGPL.
8
 */
9

    
10
/* ??? Need to check if the {read,write}[wl] routines work properly on
11
   big-endian targets.  */
12

    
13
#include <assert.h>
14

    
15
#include "hw.h"
16
#include "pci.h"
17
#include "scsi.h"
18
#include "block_int.h"
19

    
20
//#define DEBUG_LSI
21
//#define DEBUG_LSI_REG
22

    
23
#ifdef DEBUG_LSI
24
#define DPRINTF(fmt, ...) \
25
do { printf("lsi_scsi: " fmt , ## __VA_ARGS__); } while (0)
26
#define BADF(fmt, ...) \
27
do { fprintf(stderr, "lsi_scsi: error: " fmt , ## __VA_ARGS__); exit(1);} while (0)
28
#else
29
#define DPRINTF(fmt, ...) do {} while(0)
30
#define BADF(fmt, ...) \
31
do { fprintf(stderr, "lsi_scsi: error: " fmt , ## __VA_ARGS__);} while (0)
32
#endif
33

    
34
#define LSI_MAX_DEVS 7
35

    
36
#define LSI_SCNTL0_TRG    0x01
37
#define LSI_SCNTL0_AAP    0x02
38
#define LSI_SCNTL0_EPC    0x08
39
#define LSI_SCNTL0_WATN   0x10
40
#define LSI_SCNTL0_START  0x20
41

    
42
#define LSI_SCNTL1_SST    0x01
43
#define LSI_SCNTL1_IARB   0x02
44
#define LSI_SCNTL1_AESP   0x04
45
#define LSI_SCNTL1_RST    0x08
46
#define LSI_SCNTL1_CON    0x10
47
#define LSI_SCNTL1_DHP    0x20
48
#define LSI_SCNTL1_ADB    0x40
49
#define LSI_SCNTL1_EXC    0x80
50

    
51
#define LSI_SCNTL2_WSR    0x01
52
#define LSI_SCNTL2_VUE0   0x02
53
#define LSI_SCNTL2_VUE1   0x04
54
#define LSI_SCNTL2_WSS    0x08
55
#define LSI_SCNTL2_SLPHBEN 0x10
56
#define LSI_SCNTL2_SLPMD  0x20
57
#define LSI_SCNTL2_CHM    0x40
58
#define LSI_SCNTL2_SDU    0x80
59

    
60
#define LSI_ISTAT0_DIP    0x01
61
#define LSI_ISTAT0_SIP    0x02
62
#define LSI_ISTAT0_INTF   0x04
63
#define LSI_ISTAT0_CON    0x08
64
#define LSI_ISTAT0_SEM    0x10
65
#define LSI_ISTAT0_SIGP   0x20
66
#define LSI_ISTAT0_SRST   0x40
67
#define LSI_ISTAT0_ABRT   0x80
68

    
69
#define LSI_ISTAT1_SI     0x01
70
#define LSI_ISTAT1_SRUN   0x02
71
#define LSI_ISTAT1_FLSH   0x04
72

    
73
#define LSI_SSTAT0_SDP0   0x01
74
#define LSI_SSTAT0_RST    0x02
75
#define LSI_SSTAT0_WOA    0x04
76
#define LSI_SSTAT0_LOA    0x08
77
#define LSI_SSTAT0_AIP    0x10
78
#define LSI_SSTAT0_OLF    0x20
79
#define LSI_SSTAT0_ORF    0x40
80
#define LSI_SSTAT0_ILF    0x80
81

    
82
#define LSI_SIST0_PAR     0x01
83
#define LSI_SIST0_RST     0x02
84
#define LSI_SIST0_UDC     0x04
85
#define LSI_SIST0_SGE     0x08
86
#define LSI_SIST0_RSL     0x10
87
#define LSI_SIST0_SEL     0x20
88
#define LSI_SIST0_CMP     0x40
89
#define LSI_SIST0_MA      0x80
90

    
91
#define LSI_SIST1_HTH     0x01
92
#define LSI_SIST1_GEN     0x02
93
#define LSI_SIST1_STO     0x04
94
#define LSI_SIST1_SBMC    0x10
95

    
96
#define LSI_SOCL_IO       0x01
97
#define LSI_SOCL_CD       0x02
98
#define LSI_SOCL_MSG      0x04
99
#define LSI_SOCL_ATN      0x08
100
#define LSI_SOCL_SEL      0x10
101
#define LSI_SOCL_BSY      0x20
102
#define LSI_SOCL_ACK      0x40
103
#define LSI_SOCL_REQ      0x80
104

    
105
#define LSI_DSTAT_IID     0x01
106
#define LSI_DSTAT_SIR     0x04
107
#define LSI_DSTAT_SSI     0x08
108
#define LSI_DSTAT_ABRT    0x10
109
#define LSI_DSTAT_BF      0x20
110
#define LSI_DSTAT_MDPE    0x40
111
#define LSI_DSTAT_DFE     0x80
112

    
113
#define LSI_DCNTL_COM     0x01
114
#define LSI_DCNTL_IRQD    0x02
115
#define LSI_DCNTL_STD     0x04
116
#define LSI_DCNTL_IRQM    0x08
117
#define LSI_DCNTL_SSM     0x10
118
#define LSI_DCNTL_PFEN    0x20
119
#define LSI_DCNTL_PFF     0x40
120
#define LSI_DCNTL_CLSE    0x80
121

    
122
#define LSI_DMODE_MAN     0x01
123
#define LSI_DMODE_BOF     0x02
124
#define LSI_DMODE_ERMP    0x04
125
#define LSI_DMODE_ERL     0x08
126
#define LSI_DMODE_DIOM    0x10
127
#define LSI_DMODE_SIOM    0x20
128

    
129
#define LSI_CTEST2_DACK   0x01
130
#define LSI_CTEST2_DREQ   0x02
131
#define LSI_CTEST2_TEOP   0x04
132
#define LSI_CTEST2_PCICIE 0x08
133
#define LSI_CTEST2_CM     0x10
134
#define LSI_CTEST2_CIO    0x20
135
#define LSI_CTEST2_SIGP   0x40
136
#define LSI_CTEST2_DDIR   0x80
137

    
138
#define LSI_CTEST5_BL2    0x04
139
#define LSI_CTEST5_DDIR   0x08
140
#define LSI_CTEST5_MASR   0x10
141
#define LSI_CTEST5_DFSN   0x20
142
#define LSI_CTEST5_BBCK   0x40
143
#define LSI_CTEST5_ADCK   0x80
144

    
145
#define LSI_CCNTL0_DILS   0x01
146
#define LSI_CCNTL0_DISFC  0x10
147
#define LSI_CCNTL0_ENNDJ  0x20
148
#define LSI_CCNTL0_PMJCTL 0x40
149
#define LSI_CCNTL0_ENPMJ  0x80
150

    
151
#define LSI_CCNTL1_EN64DBMV  0x01
152
#define LSI_CCNTL1_EN64TIBMV 0x02
153
#define LSI_CCNTL1_64TIMOD   0x04
154
#define LSI_CCNTL1_DDAC      0x08
155
#define LSI_CCNTL1_ZMOD      0x80
156

    
157
/* Enable Response to Reselection */
158
#define LSI_SCID_RRE      0x60
159

    
160
#define LSI_CCNTL1_40BIT (LSI_CCNTL1_EN64TIBMV|LSI_CCNTL1_64TIMOD)
161

    
162
#define PHASE_DO          0
163
#define PHASE_DI          1
164
#define PHASE_CMD         2
165
#define PHASE_ST          3
166
#define PHASE_MO          6
167
#define PHASE_MI          7
168
#define PHASE_MASK        7
169

    
170
/* Maximum length of MSG IN data.  */
171
#define LSI_MAX_MSGIN_LEN 8
172

    
173
/* Flag set if this is a tagged command.  */
174
#define LSI_TAG_VALID     (1 << 16)
175

    
176
typedef struct lsi_request {
177
    SCSIRequest *req;
178
    uint32_t tag;
179
    uint32_t dma_len;
180
    uint8_t *dma_buf;
181
    uint32_t pending;
182
    int out;
183
    QTAILQ_ENTRY(lsi_request) next;
184
} lsi_request;
185

    
186
typedef struct {
187
    PCIDevice dev;
188
    int mmio_io_addr;
189
    int ram_io_addr;
190
    uint32_t script_ram_base;
191

    
192
    int carry; /* ??? Should this be an a visible register somewhere?  */
193
    int status;
194
    /* Action to take at the end of a MSG IN phase.
195
       0 = COMMAND, 1 = disconnect, 2 = DATA OUT, 3 = DATA IN.  */
196
    int msg_action;
197
    int msg_len;
198
    uint8_t msg[LSI_MAX_MSGIN_LEN];
199
    /* 0 if SCRIPTS are running or stopped.
200
     * 1 if a Wait Reselect instruction has been issued.
201
     * 2 if processing DMA from lsi_execute_script.
202
     * 3 if a DMA operation is in progress.  */
203
    int waiting;
204
    SCSIBus bus;
205
    int current_lun;
206
    /* The tag is a combination of the device ID and the SCSI tag.  */
207
    uint32_t select_tag;
208
    int command_complete;
209
    QTAILQ_HEAD(, lsi_request) queue;
210
    lsi_request *current;
211

    
212
    uint32_t dsa;
213
    uint32_t temp;
214
    uint32_t dnad;
215
    uint32_t dbc;
216
    uint8_t istat0;
217
    uint8_t istat1;
218
    uint8_t dcmd;
219
    uint8_t dstat;
220
    uint8_t dien;
221
    uint8_t sist0;
222
    uint8_t sist1;
223
    uint8_t sien0;
224
    uint8_t sien1;
225
    uint8_t mbox0;
226
    uint8_t mbox1;
227
    uint8_t dfifo;
228
    uint8_t ctest2;
229
    uint8_t ctest3;
230
    uint8_t ctest4;
231
    uint8_t ctest5;
232
    uint8_t ccntl0;
233
    uint8_t ccntl1;
234
    uint32_t dsp;
235
    uint32_t dsps;
236
    uint8_t dmode;
237
    uint8_t dcntl;
238
    uint8_t scntl0;
239
    uint8_t scntl1;
240
    uint8_t scntl2;
241
    uint8_t scntl3;
242
    uint8_t sstat0;
243
    uint8_t sstat1;
244
    uint8_t scid;
245
    uint8_t sxfer;
246
    uint8_t socl;
247
    uint8_t sdid;
248
    uint8_t ssid;
249
    uint8_t sfbr;
250
    uint8_t stest1;
251
    uint8_t stest2;
252
    uint8_t stest3;
253
    uint8_t sidl;
254
    uint8_t stime0;
255
    uint8_t respid0;
256
    uint8_t respid1;
257
    uint32_t mmrs;
258
    uint32_t mmws;
259
    uint32_t sfs;
260
    uint32_t drs;
261
    uint32_t sbms;
262
    uint32_t dbms;
263
    uint32_t dnad64;
264
    uint32_t pmjad1;
265
    uint32_t pmjad2;
266
    uint32_t rbc;
267
    uint32_t ua;
268
    uint32_t ia;
269
    uint32_t sbc;
270
    uint32_t csbc;
271
    uint32_t scratch[18]; /* SCRATCHA-SCRATCHR */
272
    uint8_t sbr;
273

    
274
    /* Script ram is stored as 32-bit words in host byteorder.  */
275
    uint32_t script_ram[2048];
276
} LSIState;
277

    
278
static inline int lsi_irq_on_rsl(LSIState *s)
279
{
280
    return (s->sien0 & LSI_SIST0_RSL) && (s->scid & LSI_SCID_RRE);
281
}
282

    
283
static void lsi_soft_reset(LSIState *s)
284
{
285
    lsi_request *p;
286

    
287
    DPRINTF("Reset\n");
288
    s->carry = 0;
289

    
290
    s->msg_action = 0;
291
    s->msg_len = 0;
292
    s->waiting = 0;
293
    s->dsa = 0;
294
    s->dnad = 0;
295
    s->dbc = 0;
296
    s->temp = 0;
297
    memset(s->scratch, 0, sizeof(s->scratch));
298
    s->istat0 = 0;
299
    s->istat1 = 0;
300
    s->dcmd = 0x40;
301
    s->dstat = LSI_DSTAT_DFE;
302
    s->dien = 0;
303
    s->sist0 = 0;
304
    s->sist1 = 0;
305
    s->sien0 = 0;
306
    s->sien1 = 0;
307
    s->mbox0 = 0;
308
    s->mbox1 = 0;
309
    s->dfifo = 0;
310
    s->ctest2 = LSI_CTEST2_DACK;
311
    s->ctest3 = 0;
312
    s->ctest4 = 0;
313
    s->ctest5 = 0;
314
    s->ccntl0 = 0;
315
    s->ccntl1 = 0;
316
    s->dsp = 0;
317
    s->dsps = 0;
318
    s->dmode = 0;
319
    s->dcntl = 0;
320
    s->scntl0 = 0xc0;
321
    s->scntl1 = 0;
322
    s->scntl2 = 0;
323
    s->scntl3 = 0;
324
    s->sstat0 = 0;
325
    s->sstat1 = 0;
326
    s->scid = 7;
327
    s->sxfer = 0;
328
    s->socl = 0;
329
    s->sdid = 0;
330
    s->ssid = 0;
331
    s->stest1 = 0;
332
    s->stest2 = 0;
333
    s->stest3 = 0;
334
    s->sidl = 0;
335
    s->stime0 = 0;
336
    s->respid0 = 0x80;
337
    s->respid1 = 0;
338
    s->mmrs = 0;
339
    s->mmws = 0;
340
    s->sfs = 0;
341
    s->drs = 0;
342
    s->sbms = 0;
343
    s->dbms = 0;
344
    s->dnad64 = 0;
345
    s->pmjad1 = 0;
346
    s->pmjad2 = 0;
347
    s->rbc = 0;
348
    s->ua = 0;
349
    s->ia = 0;
350
    s->sbc = 0;
351
    s->csbc = 0;
352
    s->sbr = 0;
353
    while (!QTAILQ_EMPTY(&s->queue)) {
354
        p = QTAILQ_FIRST(&s->queue);
355
        QTAILQ_REMOVE(&s->queue, p, next);
356
        qemu_free(p);
357
    }
358
    if (s->current) {
359
        qemu_free(s->current);
360
        s->current = NULL;
361
    }
362
}
363

    
364
static int lsi_dma_40bit(LSIState *s)
365
{
366
    if ((s->ccntl1 & LSI_CCNTL1_40BIT) == LSI_CCNTL1_40BIT)
367
        return 1;
368
    return 0;
369
}
370

    
371
static int lsi_dma_ti64bit(LSIState *s)
372
{
373
    if ((s->ccntl1 & LSI_CCNTL1_EN64TIBMV) == LSI_CCNTL1_EN64TIBMV)
374
        return 1;
375
    return 0;
376
}
377

    
378
static int lsi_dma_64bit(LSIState *s)
379
{
380
    if ((s->ccntl1 & LSI_CCNTL1_EN64DBMV) == LSI_CCNTL1_EN64DBMV)
381
        return 1;
382
    return 0;
383
}
384

    
385
static uint8_t lsi_reg_readb(LSIState *s, int offset);
386
static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val);
387
static void lsi_execute_script(LSIState *s);
388
static void lsi_reselect(LSIState *s, lsi_request *p);
389

    
390
static inline uint32_t read_dword(LSIState *s, uint32_t addr)
391
{
392
    uint32_t buf;
393

    
394
    /* Optimize reading from SCRIPTS RAM.  */
395
    if ((addr & 0xffffe000) == s->script_ram_base) {
396
        return s->script_ram[(addr & 0x1fff) >> 2];
397
    }
398
    cpu_physical_memory_read(addr, (uint8_t *)&buf, 4);
399
    return cpu_to_le32(buf);
400
}
401

    
402
static void lsi_stop_script(LSIState *s)
403
{
404
    s->istat1 &= ~LSI_ISTAT1_SRUN;
405
}
406

    
407
static void lsi_update_irq(LSIState *s)
408
{
409
    int level;
410
    static int last_level;
411
    lsi_request *p;
412

    
413
    /* It's unclear whether the DIP/SIP bits should be cleared when the
414
       Interrupt Status Registers are cleared or when istat0 is read.
415
       We currently do the formwer, which seems to work.  */
416
    level = 0;
417
    if (s->dstat) {
418
        if (s->dstat & s->dien)
419
            level = 1;
420
        s->istat0 |= LSI_ISTAT0_DIP;
421
    } else {
422
        s->istat0 &= ~LSI_ISTAT0_DIP;
423
    }
424

    
425
    if (s->sist0 || s->sist1) {
426
        if ((s->sist0 & s->sien0) || (s->sist1 & s->sien1))
427
            level = 1;
428
        s->istat0 |= LSI_ISTAT0_SIP;
429
    } else {
430
        s->istat0 &= ~LSI_ISTAT0_SIP;
431
    }
432
    if (s->istat0 & LSI_ISTAT0_INTF)
433
        level = 1;
434

    
435
    if (level != last_level) {
436
        DPRINTF("Update IRQ level %d dstat %02x sist %02x%02x\n",
437
                level, s->dstat, s->sist1, s->sist0);
438
        last_level = level;
439
    }
440
    qemu_set_irq(s->dev.irq[0], level);
441

    
442
    if (!level && lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON)) {
443
        DPRINTF("Handled IRQs & disconnected, looking for pending "
444
                "processes\n");
445
        QTAILQ_FOREACH(p, &s->queue, next) {
446
            if (p->pending) {
447
                lsi_reselect(s, p);
448
                break;
449
            }
450
        }
451
    }
452
}
453

    
454
/* Stop SCRIPTS execution and raise a SCSI interrupt.  */
455
static void lsi_script_scsi_interrupt(LSIState *s, int stat0, int stat1)
456
{
457
    uint32_t mask0;
458
    uint32_t mask1;
459

    
460
    DPRINTF("SCSI Interrupt 0x%02x%02x prev 0x%02x%02x\n",
461
            stat1, stat0, s->sist1, s->sist0);
462
    s->sist0 |= stat0;
463
    s->sist1 |= stat1;
464
    /* Stop processor on fatal or unmasked interrupt.  As a special hack
465
       we don't stop processing when raising STO.  Instead continue
466
       execution and stop at the next insn that accesses the SCSI bus.  */
467
    mask0 = s->sien0 | ~(LSI_SIST0_CMP | LSI_SIST0_SEL | LSI_SIST0_RSL);
468
    mask1 = s->sien1 | ~(LSI_SIST1_GEN | LSI_SIST1_HTH);
469
    mask1 &= ~LSI_SIST1_STO;
470
    if (s->sist0 & mask0 || s->sist1 & mask1) {
471
        lsi_stop_script(s);
472
    }
473
    lsi_update_irq(s);
474
}
475

    
476
/* Stop SCRIPTS execution and raise a DMA interrupt.  */
477
static void lsi_script_dma_interrupt(LSIState *s, int stat)
478
{
479
    DPRINTF("DMA Interrupt 0x%x prev 0x%x\n", stat, s->dstat);
480
    s->dstat |= stat;
481
    lsi_update_irq(s);
482
    lsi_stop_script(s);
483
}
484

    
485
static inline void lsi_set_phase(LSIState *s, int phase)
486
{
487
    s->sstat1 = (s->sstat1 & ~PHASE_MASK) | phase;
488
}
489

    
490
static void lsi_bad_phase(LSIState *s, int out, int new_phase)
491
{
492
    /* Trigger a phase mismatch.  */
493
    if (s->ccntl0 & LSI_CCNTL0_ENPMJ) {
494
        if ((s->ccntl0 & LSI_CCNTL0_PMJCTL)) {
495
            s->dsp = out ? s->pmjad1 : s->pmjad2;
496
        } else {
497
            s->dsp = (s->scntl2 & LSI_SCNTL2_WSR ? s->pmjad2 : s->pmjad1);
498
        }
499
        DPRINTF("Data phase mismatch jump to %08x\n", s->dsp);
500
    } else {
501
        DPRINTF("Phase mismatch interrupt\n");
502
        lsi_script_scsi_interrupt(s, LSI_SIST0_MA, 0);
503
        lsi_stop_script(s);
504
    }
505
    lsi_set_phase(s, new_phase);
506
}
507

    
508

    
509
/* Resume SCRIPTS execution after a DMA operation.  */
510
static void lsi_resume_script(LSIState *s)
511
{
512
    if (s->waiting != 2) {
513
        s->waiting = 0;
514
        lsi_execute_script(s);
515
    } else {
516
        s->waiting = 0;
517
    }
518
}
519

    
520
static void lsi_disconnect(LSIState *s)
521
{
522
    s->scntl1 &= ~LSI_SCNTL1_CON;
523
    s->sstat1 &= ~PHASE_MASK;
524
}
525

    
526
static void lsi_bad_selection(LSIState *s, uint32_t id)
527
{
528
    DPRINTF("Selected absent target %d\n", id);
529
    lsi_script_scsi_interrupt(s, 0, LSI_SIST1_STO);
530
    lsi_disconnect(s);
531
}
532

    
533
/* Initiate a SCSI layer data transfer.  */
534
static void lsi_do_dma(LSIState *s, int out)
535
{
536
    uint32_t count, id;
537
    target_phys_addr_t addr;
538
    SCSIDevice *dev;
539

    
540
    assert(s->current);
541
    if (!s->current->dma_len) {
542
        /* Wait until data is available.  */
543
        DPRINTF("DMA no data available\n");
544
        return;
545
    }
546

    
547
    id = (s->current->tag >> 8) & 0xf;
548
    dev = s->bus.devs[id];
549
    if (!dev) {
550
        lsi_bad_selection(s, id);
551
        return;
552
    }
553

    
554
    count = s->dbc;
555
    if (count > s->current->dma_len)
556
        count = s->current->dma_len;
557

    
558
    addr = s->dnad;
559
    /* both 40 and Table Indirect 64-bit DMAs store upper bits in dnad64 */
560
    if (lsi_dma_40bit(s) || lsi_dma_ti64bit(s))
561
        addr |= ((uint64_t)s->dnad64 << 32);
562
    else if (s->dbms)
563
        addr |= ((uint64_t)s->dbms << 32);
564
    else if (s->sbms)
565
        addr |= ((uint64_t)s->sbms << 32);
566

    
567
    DPRINTF("DMA addr=0x" TARGET_FMT_plx " len=%d\n", addr, count);
568
    s->csbc += count;
569
    s->dnad += count;
570
    s->dbc -= count;
571
     if (s->current->dma_buf == NULL) {
572
        s->current->dma_buf = dev->info->get_buf(s->current->req);
573
    }
574
    /* ??? Set SFBR to first data byte.  */
575
    if (out) {
576
        cpu_physical_memory_read(addr, s->current->dma_buf, count);
577
    } else {
578
        cpu_physical_memory_write(addr, s->current->dma_buf, count);
579
    }
580
    s->current->dma_len -= count;
581
    if (s->current->dma_len == 0) {
582
        s->current->dma_buf = NULL;
583
        if (out) {
584
            /* Write the data.  */
585
            dev->info->write_data(s->current->req);
586
        } else {
587
            /* Request any remaining data.  */
588
            dev->info->read_data(s->current->req);
589
        }
590
    } else {
591
        s->current->dma_buf += count;
592
        lsi_resume_script(s);
593
    }
594
}
595

    
596

    
597
/* Add a command to the queue.  */
598
static void lsi_queue_command(LSIState *s)
599
{
600
    lsi_request *p = s->current;
601

    
602
    DPRINTF("Queueing tag=0x%x\n", p->tag);
603
    assert(s->current != NULL);
604
    assert(s->current->dma_len == 0);
605
    QTAILQ_INSERT_TAIL(&s->queue, s->current, next);
606
    s->current = NULL;
607

    
608
    p->pending = 0;
609
    p->out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
610
}
611

    
612
/* Queue a byte for a MSG IN phase.  */
613
static void lsi_add_msg_byte(LSIState *s, uint8_t data)
614
{
615
    if (s->msg_len >= LSI_MAX_MSGIN_LEN) {
616
        BADF("MSG IN data too long\n");
617
    } else {
618
        DPRINTF("MSG IN 0x%02x\n", data);
619
        s->msg[s->msg_len++] = data;
620
    }
621
}
622

    
623
/* Perform reselection to continue a command.  */
624
static void lsi_reselect(LSIState *s, lsi_request *p)
625
{
626
    int id;
627

    
628
    assert(s->current == NULL);
629
    QTAILQ_REMOVE(&s->queue, p, next);
630
    s->current = p;
631

    
632
    id = (p->tag >> 8) & 0xf;
633
    s->ssid = id | 0x80;
634
    /* LSI53C700 Family Compatibility, see LSI53C895A 4-73 */
635
    if (!(s->dcntl & LSI_DCNTL_COM)) {
636
        s->sfbr = 1 << (id & 0x7);
637
    }
638
    DPRINTF("Reselected target %d\n", id);
639
    s->scntl1 |= LSI_SCNTL1_CON;
640
    lsi_set_phase(s, PHASE_MI);
641
    s->msg_action = p->out ? 2 : 3;
642
    s->current->dma_len = p->pending;
643
    lsi_add_msg_byte(s, 0x80);
644
    if (s->current->tag & LSI_TAG_VALID) {
645
        lsi_add_msg_byte(s, 0x20);
646
        lsi_add_msg_byte(s, p->tag & 0xff);
647
    }
648

    
649
    if (lsi_irq_on_rsl(s)) {
650
        lsi_script_scsi_interrupt(s, LSI_SIST0_RSL, 0);
651
    }
652
}
653

    
654
static lsi_request *lsi_find_by_tag(LSIState *s, uint32_t tag)
655
{
656
    lsi_request *p;
657

    
658
    QTAILQ_FOREACH(p, &s->queue, next) {
659
        if (p->tag == tag) {
660
            return p;
661
        }
662
    }
663

    
664
    return NULL;
665
}
666

    
667
static void lsi_request_cancelled(SCSIRequest *req)
668
{
669
    LSIState *s = DO_UPCAST(LSIState, dev.qdev, req->bus->qbus.parent);
670
    lsi_request *p;
671

    
672
    if (s->current && req == s->current->req) {
673
        scsi_req_unref(req);
674
        qemu_free(s->current);
675
        s->current = NULL;
676
        return;
677
    }
678

    
679
    p = lsi_find_by_tag(s, req->tag);
680
    if (p) {
681
        QTAILQ_REMOVE(&s->queue, p, next);
682
        scsi_req_unref(req);
683
        qemu_free(p);
684
    }
685
}
686

    
687
/* Record that data is available for a queued command.  Returns zero if
688
   the device was reselected, nonzero if the IO is deferred.  */
689
static int lsi_queue_tag(LSIState *s, uint32_t tag, uint32_t arg)
690
{
691
    lsi_request *p;
692

    
693
    p = lsi_find_by_tag(s, tag);
694
    if (!p) {
695
        BADF("IO with unknown tag %d\n", tag);
696
        return 1;
697
    }
698

    
699
    if (p->pending) {
700
        BADF("Multiple IO pending for tag %d\n", tag);
701
    }
702
    p->pending = arg;
703
    /* Reselect if waiting for it, or if reselection triggers an IRQ
704
       and the bus is free.
705
       Since no interrupt stacking is implemented in the emulation, it
706
       is also required that there are no pending interrupts waiting
707
       for service from the device driver. */
708
    if (s->waiting == 1 ||
709
        (lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON) &&
710
         !(s->istat0 & (LSI_ISTAT0_SIP | LSI_ISTAT0_DIP)))) {
711
        /* Reselect device.  */
712
        lsi_reselect(s, p);
713
        return 0;
714
    } else {
715
        DPRINTF("Queueing IO tag=0x%x\n", tag);
716
        p->pending = arg;
717
        return 1;
718
    }
719
}
720
 /* Callback to indicate that the SCSI layer has completed a transfer.  */
721
static void lsi_command_complete(SCSIRequest *req, int reason, uint32_t arg)
722
{
723
    LSIState *s = DO_UPCAST(LSIState, dev.qdev, req->bus->qbus.parent);
724
    int out;
725

    
726
    out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
727
    if (reason == SCSI_REASON_DONE) {
728
        DPRINTF("Command complete status=%d\n", (int)arg);
729
        s->status = arg;
730
        s->command_complete = 2;
731
        if (s->waiting && s->dbc != 0) {
732
            /* Raise phase mismatch for short transfers.  */
733
            lsi_bad_phase(s, out, PHASE_ST);
734
        } else {
735
            lsi_set_phase(s, PHASE_ST);
736
        }
737

    
738
        if (s->current && req == s->current->req) {
739
            scsi_req_unref(s->current->req);
740
            qemu_free(s->current);
741
            s->current = NULL;
742
        }
743
        lsi_resume_script(s);
744
        return;
745
    }
746

    
747
    if (s->waiting == 1 || !s->current || req->tag != s->current->tag ||
748
        (lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON))) {
749
        if (lsi_queue_tag(s, req->tag, arg)) {
750
            return;
751
        }
752
    }
753

    
754
    /* host adapter (re)connected */
755
    DPRINTF("Data ready tag=0x%x len=%d\n", req->tag, arg);
756
    s->current->dma_len = arg;
757
    s->command_complete = 1;
758
    if (!s->waiting)
759
        return;
760
    if (s->waiting == 1 || s->dbc == 0) {
761
        lsi_resume_script(s);
762
    } else {
763
        lsi_do_dma(s, out);
764
    }
765
}
766

    
767
static void lsi_do_command(LSIState *s)
768
{
769
    SCSIDevice *dev;
770
    uint8_t buf[16];
771
    uint32_t id;
772
    int n;
773

    
774
    DPRINTF("Send command len=%d\n", s->dbc);
775
    if (s->dbc > 16)
776
        s->dbc = 16;
777
    cpu_physical_memory_read(s->dnad, buf, s->dbc);
778
    s->sfbr = buf[0];
779
    s->command_complete = 0;
780

    
781
    id = (s->select_tag >> 8) & 0xf;
782
    dev = s->bus.devs[id];
783
    if (!dev) {
784
        lsi_bad_selection(s, id);
785
        return;
786
    }
787

    
788
    assert(s->current == NULL);
789
    s->current = qemu_mallocz(sizeof(lsi_request));
790
    s->current->tag = s->select_tag;
791
    s->current->req = scsi_req_new(dev, s->current->tag, s->current_lun);
792

    
793
    n = scsi_req_enqueue(s->current->req, buf);
794
    if (n > 0) {
795
        lsi_set_phase(s, PHASE_DI);
796
        dev->info->read_data(s->current->req);
797
    } else if (n < 0) {
798
        lsi_set_phase(s, PHASE_DO);
799
        dev->info->write_data(s->current->req);
800
    }
801

    
802
    if (!s->command_complete) {
803
        if (n) {
804
            /* Command did not complete immediately so disconnect.  */
805
            lsi_add_msg_byte(s, 2); /* SAVE DATA POINTER */
806
            lsi_add_msg_byte(s, 4); /* DISCONNECT */
807
            /* wait data */
808
            lsi_set_phase(s, PHASE_MI);
809
            s->msg_action = 1;
810
            lsi_queue_command(s);
811
        } else {
812
            /* wait command complete */
813
            lsi_set_phase(s, PHASE_DI);
814
        }
815
    }
816
}
817

    
818
static void lsi_do_status(LSIState *s)
819
{
820
    uint8_t status;
821
    DPRINTF("Get status len=%d status=%d\n", s->dbc, s->status);
822
    if (s->dbc != 1)
823
        BADF("Bad Status move\n");
824
    s->dbc = 1;
825
    status = s->status;
826
    s->sfbr = status;
827
    cpu_physical_memory_write(s->dnad, &status, 1);
828
    lsi_set_phase(s, PHASE_MI);
829
    s->msg_action = 1;
830
    lsi_add_msg_byte(s, 0); /* COMMAND COMPLETE */
831
}
832

    
833
static void lsi_do_msgin(LSIState *s)
834
{
835
    int len;
836
    DPRINTF("Message in len=%d/%d\n", s->dbc, s->msg_len);
837
    s->sfbr = s->msg[0];
838
    len = s->msg_len;
839
    if (len > s->dbc)
840
        len = s->dbc;
841
    cpu_physical_memory_write(s->dnad, s->msg, len);
842
    /* Linux drivers rely on the last byte being in the SIDL.  */
843
    s->sidl = s->msg[len - 1];
844
    s->msg_len -= len;
845
    if (s->msg_len) {
846
        memmove(s->msg, s->msg + len, s->msg_len);
847
    } else {
848
        /* ??? Check if ATN (not yet implemented) is asserted and maybe
849
           switch to PHASE_MO.  */
850
        switch (s->msg_action) {
851
        case 0:
852
            lsi_set_phase(s, PHASE_CMD);
853
            break;
854
        case 1:
855
            lsi_disconnect(s);
856
            break;
857
        case 2:
858
            lsi_set_phase(s, PHASE_DO);
859
            break;
860
        case 3:
861
            lsi_set_phase(s, PHASE_DI);
862
            break;
863
        default:
864
            abort();
865
        }
866
    }
867
}
868

    
869
/* Read the next byte during a MSGOUT phase.  */
870
static uint8_t lsi_get_msgbyte(LSIState *s)
871
{
872
    uint8_t data;
873
    cpu_physical_memory_read(s->dnad, &data, 1);
874
    s->dnad++;
875
    s->dbc--;
876
    return data;
877
}
878

    
879
/* Skip the next n bytes during a MSGOUT phase. */
880
static void lsi_skip_msgbytes(LSIState *s, unsigned int n)
881
{
882
    s->dnad += n;
883
    s->dbc  -= n;
884
}
885

    
886
static void lsi_do_msgout(LSIState *s)
887
{
888
    uint8_t msg;
889
    int len;
890
    uint32_t current_tag;
891
    SCSIDevice *current_dev;
892
    lsi_request *current_req, *p, *p_next;
893
    int id;
894

    
895
    if (s->current) {
896
        current_tag = s->current->tag;
897
        current_req = s->current;
898
    } else {
899
        current_tag = s->select_tag;
900
        current_req = lsi_find_by_tag(s, current_tag);
901
    }
902
    id = (current_tag >> 8) & 0xf;
903
    current_dev = s->bus.devs[id];
904

    
905
    DPRINTF("MSG out len=%d\n", s->dbc);
906
    while (s->dbc) {
907
        msg = lsi_get_msgbyte(s);
908
        s->sfbr = msg;
909

    
910
        switch (msg) {
911
        case 0x04:
912
            DPRINTF("MSG: Disconnect\n");
913
            lsi_disconnect(s);
914
            break;
915
        case 0x08:
916
            DPRINTF("MSG: No Operation\n");
917
            lsi_set_phase(s, PHASE_CMD);
918
            break;
919
        case 0x01:
920
            len = lsi_get_msgbyte(s);
921
            msg = lsi_get_msgbyte(s);
922
            (void)len; /* avoid a warning about unused variable*/
923
            DPRINTF("Extended message 0x%x (len %d)\n", msg, len);
924
            switch (msg) {
925
            case 1:
926
                DPRINTF("SDTR (ignored)\n");
927
                lsi_skip_msgbytes(s, 2);
928
                break;
929
            case 3:
930
                DPRINTF("WDTR (ignored)\n");
931
                lsi_skip_msgbytes(s, 1);
932
                break;
933
            default:
934
                goto bad;
935
            }
936
            break;
937
        case 0x20: /* SIMPLE queue */
938
            s->select_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
939
            DPRINTF("SIMPLE queue tag=0x%x\n", s->select_tag & 0xff);
940
            break;
941
        case 0x21: /* HEAD of queue */
942
            BADF("HEAD queue not implemented\n");
943
            s->select_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
944
            break;
945
        case 0x22: /* ORDERED queue */
946
            BADF("ORDERED queue not implemented\n");
947
            s->select_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
948
            break;
949
        case 0x0d:
950
            /* The ABORT TAG message clears the current I/O process only. */
951
            DPRINTF("MSG: ABORT TAG tag=0x%x\n", current_tag);
952
            if (current_req) {
953
                scsi_req_cancel(current_req->req);
954
            }
955
            lsi_disconnect(s);
956
            break;
957
        case 0x06:
958
        case 0x0e:
959
        case 0x0c:
960
            /* The ABORT message clears all I/O processes for the selecting
961
               initiator on the specified logical unit of the target. */
962
            if (msg == 0x06) {
963
                DPRINTF("MSG: ABORT tag=0x%x\n", current_tag);
964
            }
965
            /* The CLEAR QUEUE message clears all I/O processes for all
966
               initiators on the specified logical unit of the target. */
967
            if (msg == 0x0e) {
968
                DPRINTF("MSG: CLEAR QUEUE tag=0x%x\n", current_tag);
969
            }
970
            /* The BUS DEVICE RESET message clears all I/O processes for all
971
               initiators on all logical units of the target. */
972
            if (msg == 0x0c) {
973
                DPRINTF("MSG: BUS DEVICE RESET tag=0x%x\n", current_tag);
974
            }
975

    
976
            /* clear the current I/O process */
977
            if (s->current) {
978
                scsi_req_cancel(s->current->req);
979
            }
980

    
981
            /* As the current implemented devices scsi_disk and scsi_generic
982
               only support one LUN, we don't need to keep track of LUNs.
983
               Clearing I/O processes for other initiators could be possible
984
               for scsi_generic by sending a SG_SCSI_RESET to the /dev/sgX
985
               device, but this is currently not implemented (and seems not
986
               to be really necessary). So let's simply clear all queued
987
               commands for the current device: */
988
            id = current_tag & 0x0000ff00;
989
            QTAILQ_FOREACH_SAFE(p, &s->queue, next, p_next) {
990
                if ((p->tag & 0x0000ff00) == id) {
991
                    scsi_req_cancel(p->req);
992
                }
993
            }
994

    
995
            lsi_disconnect(s);
996
            break;
997
        default:
998
            if ((msg & 0x80) == 0) {
999
                goto bad;
1000
            }
1001
            s->current_lun = msg & 7;
1002
            DPRINTF("Select LUN %d\n", s->current_lun);
1003
            lsi_set_phase(s, PHASE_CMD);
1004
            break;
1005
        }
1006
    }
1007
    return;
1008
bad:
1009
    BADF("Unimplemented message 0x%02x\n", msg);
1010
    lsi_set_phase(s, PHASE_MI);
1011
    lsi_add_msg_byte(s, 7); /* MESSAGE REJECT */
1012
    s->msg_action = 0;
1013
}
1014

    
1015
/* Sign extend a 24-bit value.  */
1016
static inline int32_t sxt24(int32_t n)
1017
{
1018
    return (n << 8) >> 8;
1019
}
1020

    
1021
#define LSI_BUF_SIZE 4096
1022
static void lsi_memcpy(LSIState *s, uint32_t dest, uint32_t src, int count)
1023
{
1024
    int n;
1025
    uint8_t buf[LSI_BUF_SIZE];
1026

    
1027
    DPRINTF("memcpy dest 0x%08x src 0x%08x count %d\n", dest, src, count);
1028
    while (count) {
1029
        n = (count > LSI_BUF_SIZE) ? LSI_BUF_SIZE : count;
1030
        cpu_physical_memory_read(src, buf, n);
1031
        cpu_physical_memory_write(dest, buf, n);
1032
        src += n;
1033
        dest += n;
1034
        count -= n;
1035
    }
1036
}
1037

    
1038
static void lsi_wait_reselect(LSIState *s)
1039
{
1040
    lsi_request *p;
1041

    
1042
    DPRINTF("Wait Reselect\n");
1043

    
1044
    QTAILQ_FOREACH(p, &s->queue, next) {
1045
        if (p->pending) {
1046
            lsi_reselect(s, p);
1047
            break;
1048
        }
1049
    }
1050
    if (s->current == NULL) {
1051
        s->waiting = 1;
1052
    }
1053
}
1054

    
1055
static void lsi_execute_script(LSIState *s)
1056
{
1057
    uint32_t insn;
1058
    uint32_t addr, addr_high;
1059
    int opcode;
1060
    int insn_processed = 0;
1061

    
1062
    s->istat1 |= LSI_ISTAT1_SRUN;
1063
again:
1064
    insn_processed++;
1065
    insn = read_dword(s, s->dsp);
1066
    if (!insn) {
1067
        /* If we receive an empty opcode increment the DSP by 4 bytes
1068
           instead of 8 and execute the next opcode at that location */
1069
        s->dsp += 4;
1070
        goto again;
1071
    }
1072
    addr = read_dword(s, s->dsp + 4);
1073
    addr_high = 0;
1074
    DPRINTF("SCRIPTS dsp=%08x opcode %08x arg %08x\n", s->dsp, insn, addr);
1075
    s->dsps = addr;
1076
    s->dcmd = insn >> 24;
1077
    s->dsp += 8;
1078
    switch (insn >> 30) {
1079
    case 0: /* Block move.  */
1080
        if (s->sist1 & LSI_SIST1_STO) {
1081
            DPRINTF("Delayed select timeout\n");
1082
            lsi_stop_script(s);
1083
            break;
1084
        }
1085
        s->dbc = insn & 0xffffff;
1086
        s->rbc = s->dbc;
1087
        /* ??? Set ESA.  */
1088
        s->ia = s->dsp - 8;
1089
        if (insn & (1 << 29)) {
1090
            /* Indirect addressing.  */
1091
            addr = read_dword(s, addr);
1092
        } else if (insn & (1 << 28)) {
1093
            uint32_t buf[2];
1094
            int32_t offset;
1095
            /* Table indirect addressing.  */
1096

    
1097
            /* 32-bit Table indirect */
1098
            offset = sxt24(addr);
1099
            cpu_physical_memory_read(s->dsa + offset, (uint8_t *)buf, 8);
1100
            /* byte count is stored in bits 0:23 only */
1101
            s->dbc = cpu_to_le32(buf[0]) & 0xffffff;
1102
            s->rbc = s->dbc;
1103
            addr = cpu_to_le32(buf[1]);
1104

    
1105
            /* 40-bit DMA, upper addr bits [39:32] stored in first DWORD of
1106
             * table, bits [31:24] */
1107
            if (lsi_dma_40bit(s))
1108
                addr_high = cpu_to_le32(buf[0]) >> 24;
1109
            else if (lsi_dma_ti64bit(s)) {
1110
                int selector = (cpu_to_le32(buf[0]) >> 24) & 0x1f;
1111
                switch (selector) {
1112
                case 0 ... 0x0f:
1113
                    /* offset index into scratch registers since
1114
                     * TI64 mode can use registers C to R */
1115
                    addr_high = s->scratch[2 + selector];
1116
                    break;
1117
                case 0x10:
1118
                    addr_high = s->mmrs;
1119
                    break;
1120
                case 0x11:
1121
                    addr_high = s->mmws;
1122
                    break;
1123
                case 0x12:
1124
                    addr_high = s->sfs;
1125
                    break;
1126
                case 0x13:
1127
                    addr_high = s->drs;
1128
                    break;
1129
                case 0x14:
1130
                    addr_high = s->sbms;
1131
                    break;
1132
                case 0x15:
1133
                    addr_high = s->dbms;
1134
                    break;
1135
                default:
1136
                    BADF("Illegal selector specified (0x%x > 0x15)"
1137
                         " for 64-bit DMA block move", selector);
1138
                    break;
1139
                }
1140
            }
1141
        } else if (lsi_dma_64bit(s)) {
1142
            /* fetch a 3rd dword if 64-bit direct move is enabled and
1143
               only if we're not doing table indirect or indirect addressing */
1144
            s->dbms = read_dword(s, s->dsp);
1145
            s->dsp += 4;
1146
            s->ia = s->dsp - 12;
1147
        }
1148
        if ((s->sstat1 & PHASE_MASK) != ((insn >> 24) & 7)) {
1149
            DPRINTF("Wrong phase got %d expected %d\n",
1150
                    s->sstat1 & PHASE_MASK, (insn >> 24) & 7);
1151
            lsi_script_scsi_interrupt(s, LSI_SIST0_MA, 0);
1152
            break;
1153
        }
1154
        s->dnad = addr;
1155
        s->dnad64 = addr_high;
1156
        switch (s->sstat1 & 0x7) {
1157
        case PHASE_DO:
1158
            s->waiting = 2;
1159
            lsi_do_dma(s, 1);
1160
            if (s->waiting)
1161
                s->waiting = 3;
1162
            break;
1163
        case PHASE_DI:
1164
            s->waiting = 2;
1165
            lsi_do_dma(s, 0);
1166
            if (s->waiting)
1167
                s->waiting = 3;
1168
            break;
1169
        case PHASE_CMD:
1170
            lsi_do_command(s);
1171
            break;
1172
        case PHASE_ST:
1173
            lsi_do_status(s);
1174
            break;
1175
        case PHASE_MO:
1176
            lsi_do_msgout(s);
1177
            break;
1178
        case PHASE_MI:
1179
            lsi_do_msgin(s);
1180
            break;
1181
        default:
1182
            BADF("Unimplemented phase %d\n", s->sstat1 & PHASE_MASK);
1183
            exit(1);
1184
        }
1185
        s->dfifo = s->dbc & 0xff;
1186
        s->ctest5 = (s->ctest5 & 0xfc) | ((s->dbc >> 8) & 3);
1187
        s->sbc = s->dbc;
1188
        s->rbc -= s->dbc;
1189
        s->ua = addr + s->dbc;
1190
        break;
1191

    
1192
    case 1: /* IO or Read/Write instruction.  */
1193
        opcode = (insn >> 27) & 7;
1194
        if (opcode < 5) {
1195
            uint32_t id;
1196

    
1197
            if (insn & (1 << 25)) {
1198
                id = read_dword(s, s->dsa + sxt24(insn));
1199
            } else {
1200
                id = insn;
1201
            }
1202
            id = (id >> 16) & 0xf;
1203
            if (insn & (1 << 26)) {
1204
                addr = s->dsp + sxt24(addr);
1205
            }
1206
            s->dnad = addr;
1207
            switch (opcode) {
1208
            case 0: /* Select */
1209
                s->sdid = id;
1210
                if (s->scntl1 & LSI_SCNTL1_CON) {
1211
                    DPRINTF("Already reselected, jumping to alternative address\n");
1212
                    s->dsp = s->dnad;
1213
                    break;
1214
                }
1215
                s->sstat0 |= LSI_SSTAT0_WOA;
1216
                s->scntl1 &= ~LSI_SCNTL1_IARB;
1217
                if (id >= LSI_MAX_DEVS || !s->bus.devs[id]) {
1218
                    lsi_bad_selection(s, id);
1219
                    break;
1220
                }
1221
                DPRINTF("Selected target %d%s\n",
1222
                        id, insn & (1 << 3) ? " ATN" : "");
1223
                /* ??? Linux drivers compain when this is set.  Maybe
1224
                   it only applies in low-level mode (unimplemented).
1225
                lsi_script_scsi_interrupt(s, LSI_SIST0_CMP, 0); */
1226
                s->select_tag = id << 8;
1227
                s->scntl1 |= LSI_SCNTL1_CON;
1228
                if (insn & (1 << 3)) {
1229
                    s->socl |= LSI_SOCL_ATN;
1230
                }
1231
                lsi_set_phase(s, PHASE_MO);
1232
                break;
1233
            case 1: /* Disconnect */
1234
                DPRINTF("Wait Disconnect\n");
1235
                s->scntl1 &= ~LSI_SCNTL1_CON;
1236
                break;
1237
            case 2: /* Wait Reselect */
1238
                if (!lsi_irq_on_rsl(s)) {
1239
                    lsi_wait_reselect(s);
1240
                }
1241
                break;
1242
            case 3: /* Set */
1243
                DPRINTF("Set%s%s%s%s\n",
1244
                        insn & (1 << 3) ? " ATN" : "",
1245
                        insn & (1 << 6) ? " ACK" : "",
1246
                        insn & (1 << 9) ? " TM" : "",
1247
                        insn & (1 << 10) ? " CC" : "");
1248
                if (insn & (1 << 3)) {
1249
                    s->socl |= LSI_SOCL_ATN;
1250
                    lsi_set_phase(s, PHASE_MO);
1251
                }
1252
                if (insn & (1 << 9)) {
1253
                    BADF("Target mode not implemented\n");
1254
                    exit(1);
1255
                }
1256
                if (insn & (1 << 10))
1257
                    s->carry = 1;
1258
                break;
1259
            case 4: /* Clear */
1260
                DPRINTF("Clear%s%s%s%s\n",
1261
                        insn & (1 << 3) ? " ATN" : "",
1262
                        insn & (1 << 6) ? " ACK" : "",
1263
                        insn & (1 << 9) ? " TM" : "",
1264
                        insn & (1 << 10) ? " CC" : "");
1265
                if (insn & (1 << 3)) {
1266
                    s->socl &= ~LSI_SOCL_ATN;
1267
                }
1268
                if (insn & (1 << 10))
1269
                    s->carry = 0;
1270
                break;
1271
            }
1272
        } else {
1273
            uint8_t op0;
1274
            uint8_t op1;
1275
            uint8_t data8;
1276
            int reg;
1277
            int operator;
1278
#ifdef DEBUG_LSI
1279
            static const char *opcode_names[3] =
1280
                {"Write", "Read", "Read-Modify-Write"};
1281
            static const char *operator_names[8] =
1282
                {"MOV", "SHL", "OR", "XOR", "AND", "SHR", "ADD", "ADC"};
1283
#endif
1284

    
1285
            reg = ((insn >> 16) & 0x7f) | (insn & 0x80);
1286
            data8 = (insn >> 8) & 0xff;
1287
            opcode = (insn >> 27) & 7;
1288
            operator = (insn >> 24) & 7;
1289
            DPRINTF("%s reg 0x%x %s data8=0x%02x sfbr=0x%02x%s\n",
1290
                    opcode_names[opcode - 5], reg,
1291
                    operator_names[operator], data8, s->sfbr,
1292
                    (insn & (1 << 23)) ? " SFBR" : "");
1293
            op0 = op1 = 0;
1294
            switch (opcode) {
1295
            case 5: /* From SFBR */
1296
                op0 = s->sfbr;
1297
                op1 = data8;
1298
                break;
1299
            case 6: /* To SFBR */
1300
                if (operator)
1301
                    op0 = lsi_reg_readb(s, reg);
1302
                op1 = data8;
1303
                break;
1304
            case 7: /* Read-modify-write */
1305
                if (operator)
1306
                    op0 = lsi_reg_readb(s, reg);
1307
                if (insn & (1 << 23)) {
1308
                    op1 = s->sfbr;
1309
                } else {
1310
                    op1 = data8;
1311
                }
1312
                break;
1313
            }
1314

    
1315
            switch (operator) {
1316
            case 0: /* move */
1317
                op0 = op1;
1318
                break;
1319
            case 1: /* Shift left */
1320
                op1 = op0 >> 7;
1321
                op0 = (op0 << 1) | s->carry;
1322
                s->carry = op1;
1323
                break;
1324
            case 2: /* OR */
1325
                op0 |= op1;
1326
                break;
1327
            case 3: /* XOR */
1328
                op0 ^= op1;
1329
                break;
1330
            case 4: /* AND */
1331
                op0 &= op1;
1332
                break;
1333
            case 5: /* SHR */
1334
                op1 = op0 & 1;
1335
                op0 = (op0 >> 1) | (s->carry << 7);
1336
                s->carry = op1;
1337
                break;
1338
            case 6: /* ADD */
1339
                op0 += op1;
1340
                s->carry = op0 < op1;
1341
                break;
1342
            case 7: /* ADC */
1343
                op0 += op1 + s->carry;
1344
                if (s->carry)
1345
                    s->carry = op0 <= op1;
1346
                else
1347
                    s->carry = op0 < op1;
1348
                break;
1349
            }
1350

    
1351
            switch (opcode) {
1352
            case 5: /* From SFBR */
1353
            case 7: /* Read-modify-write */
1354
                lsi_reg_writeb(s, reg, op0);
1355
                break;
1356
            case 6: /* To SFBR */
1357
                s->sfbr = op0;
1358
                break;
1359
            }
1360
        }
1361
        break;
1362

    
1363
    case 2: /* Transfer Control.  */
1364
        {
1365
            int cond;
1366
            int jmp;
1367

    
1368
            if ((insn & 0x002e0000) == 0) {
1369
                DPRINTF("NOP\n");
1370
                break;
1371
            }
1372
            if (s->sist1 & LSI_SIST1_STO) {
1373
                DPRINTF("Delayed select timeout\n");
1374
                lsi_stop_script(s);
1375
                break;
1376
            }
1377
            cond = jmp = (insn & (1 << 19)) != 0;
1378
            if (cond == jmp && (insn & (1 << 21))) {
1379
                DPRINTF("Compare carry %d\n", s->carry == jmp);
1380
                cond = s->carry != 0;
1381
            }
1382
            if (cond == jmp && (insn & (1 << 17))) {
1383
                DPRINTF("Compare phase %d %c= %d\n",
1384
                        (s->sstat1 & PHASE_MASK),
1385
                        jmp ? '=' : '!',
1386
                        ((insn >> 24) & 7));
1387
                cond = (s->sstat1 & PHASE_MASK) == ((insn >> 24) & 7);
1388
            }
1389
            if (cond == jmp && (insn & (1 << 18))) {
1390
                uint8_t mask;
1391

    
1392
                mask = (~insn >> 8) & 0xff;
1393
                DPRINTF("Compare data 0x%x & 0x%x %c= 0x%x\n",
1394
                        s->sfbr, mask, jmp ? '=' : '!', insn & mask);
1395
                cond = (s->sfbr & mask) == (insn & mask);
1396
            }
1397
            if (cond == jmp) {
1398
                if (insn & (1 << 23)) {
1399
                    /* Relative address.  */
1400
                    addr = s->dsp + sxt24(addr);
1401
                }
1402
                switch ((insn >> 27) & 7) {
1403
                case 0: /* Jump */
1404
                    DPRINTF("Jump to 0x%08x\n", addr);
1405
                    s->dsp = addr;
1406
                    break;
1407
                case 1: /* Call */
1408
                    DPRINTF("Call 0x%08x\n", addr);
1409
                    s->temp = s->dsp;
1410
                    s->dsp = addr;
1411
                    break;
1412
                case 2: /* Return */
1413
                    DPRINTF("Return to 0x%08x\n", s->temp);
1414
                    s->dsp = s->temp;
1415
                    break;
1416
                case 3: /* Interrupt */
1417
                    DPRINTF("Interrupt 0x%08x\n", s->dsps);
1418
                    if ((insn & (1 << 20)) != 0) {
1419
                        s->istat0 |= LSI_ISTAT0_INTF;
1420
                        lsi_update_irq(s);
1421
                    } else {
1422
                        lsi_script_dma_interrupt(s, LSI_DSTAT_SIR);
1423
                    }
1424
                    break;
1425
                default:
1426
                    DPRINTF("Illegal transfer control\n");
1427
                    lsi_script_dma_interrupt(s, LSI_DSTAT_IID);
1428
                    break;
1429
                }
1430
            } else {
1431
                DPRINTF("Control condition failed\n");
1432
            }
1433
        }
1434
        break;
1435

    
1436
    case 3:
1437
        if ((insn & (1 << 29)) == 0) {
1438
            /* Memory move.  */
1439
            uint32_t dest;
1440
            /* ??? The docs imply the destination address is loaded into
1441
               the TEMP register.  However the Linux drivers rely on
1442
               the value being presrved.  */
1443
            dest = read_dword(s, s->dsp);
1444
            s->dsp += 4;
1445
            lsi_memcpy(s, dest, addr, insn & 0xffffff);
1446
        } else {
1447
            uint8_t data[7];
1448
            int reg;
1449
            int n;
1450
            int i;
1451

    
1452
            if (insn & (1 << 28)) {
1453
                addr = s->dsa + sxt24(addr);
1454
            }
1455
            n = (insn & 7);
1456
            reg = (insn >> 16) & 0xff;
1457
            if (insn & (1 << 24)) {
1458
                cpu_physical_memory_read(addr, data, n);
1459
                DPRINTF("Load reg 0x%x size %d addr 0x%08x = %08x\n", reg, n,
1460
                        addr, *(int *)data);
1461
                for (i = 0; i < n; i++) {
1462
                    lsi_reg_writeb(s, reg + i, data[i]);
1463
                }
1464
            } else {
1465
                DPRINTF("Store reg 0x%x size %d addr 0x%08x\n", reg, n, addr);
1466
                for (i = 0; i < n; i++) {
1467
                    data[i] = lsi_reg_readb(s, reg + i);
1468
                }
1469
                cpu_physical_memory_write(addr, data, n);
1470
            }
1471
        }
1472
    }
1473
    if (insn_processed > 10000 && !s->waiting) {
1474
        /* Some windows drivers make the device spin waiting for a memory
1475
           location to change.  If we have been executed a lot of code then
1476
           assume this is the case and force an unexpected device disconnect.
1477
           This is apparently sufficient to beat the drivers into submission.
1478
         */
1479
        if (!(s->sien0 & LSI_SIST0_UDC))
1480
            fprintf(stderr, "inf. loop with UDC masked\n");
1481
        lsi_script_scsi_interrupt(s, LSI_SIST0_UDC, 0);
1482
        lsi_disconnect(s);
1483
    } else if (s->istat1 & LSI_ISTAT1_SRUN && !s->waiting) {
1484
        if (s->dcntl & LSI_DCNTL_SSM) {
1485
            lsi_script_dma_interrupt(s, LSI_DSTAT_SSI);
1486
        } else {
1487
            goto again;
1488
        }
1489
    }
1490
    DPRINTF("SCRIPTS execution stopped\n");
1491
}
1492

    
1493
static uint8_t lsi_reg_readb(LSIState *s, int offset)
1494
{
1495
    uint8_t tmp;
1496
#define CASE_GET_REG24(name, addr) \
1497
    case addr: return s->name & 0xff; \
1498
    case addr + 1: return (s->name >> 8) & 0xff; \
1499
    case addr + 2: return (s->name >> 16) & 0xff;
1500

    
1501
#define CASE_GET_REG32(name, addr) \
1502
    case addr: return s->name & 0xff; \
1503
    case addr + 1: return (s->name >> 8) & 0xff; \
1504
    case addr + 2: return (s->name >> 16) & 0xff; \
1505
    case addr + 3: return (s->name >> 24) & 0xff;
1506

    
1507
#ifdef DEBUG_LSI_REG
1508
    DPRINTF("Read reg %x\n", offset);
1509
#endif
1510
    switch (offset) {
1511
    case 0x00: /* SCNTL0 */
1512
        return s->scntl0;
1513
    case 0x01: /* SCNTL1 */
1514
        return s->scntl1;
1515
    case 0x02: /* SCNTL2 */
1516
        return s->scntl2;
1517
    case 0x03: /* SCNTL3 */
1518
        return s->scntl3;
1519
    case 0x04: /* SCID */
1520
        return s->scid;
1521
    case 0x05: /* SXFER */
1522
        return s->sxfer;
1523
    case 0x06: /* SDID */
1524
        return s->sdid;
1525
    case 0x07: /* GPREG0 */
1526
        return 0x7f;
1527
    case 0x08: /* Revision ID */
1528
        return 0x00;
1529
    case 0xa: /* SSID */
1530
        return s->ssid;
1531
    case 0xb: /* SBCL */
1532
        /* ??? This is not correct. However it's (hopefully) only
1533
           used for diagnostics, so should be ok.  */
1534
        return 0;
1535
    case 0xc: /* DSTAT */
1536
        tmp = s->dstat | 0x80;
1537
        if ((s->istat0 & LSI_ISTAT0_INTF) == 0)
1538
            s->dstat = 0;
1539
        lsi_update_irq(s);
1540
        return tmp;
1541
    case 0x0d: /* SSTAT0 */
1542
        return s->sstat0;
1543
    case 0x0e: /* SSTAT1 */
1544
        return s->sstat1;
1545
    case 0x0f: /* SSTAT2 */
1546
        return s->scntl1 & LSI_SCNTL1_CON ? 0 : 2;
1547
    CASE_GET_REG32(dsa, 0x10)
1548
    case 0x14: /* ISTAT0 */
1549
        return s->istat0;
1550
    case 0x15: /* ISTAT1 */
1551
        return s->istat1;
1552
    case 0x16: /* MBOX0 */
1553
        return s->mbox0;
1554
    case 0x17: /* MBOX1 */
1555
        return s->mbox1;
1556
    case 0x18: /* CTEST0 */
1557
        return 0xff;
1558
    case 0x19: /* CTEST1 */
1559
        return 0;
1560
    case 0x1a: /* CTEST2 */
1561
        tmp = s->ctest2 | LSI_CTEST2_DACK | LSI_CTEST2_CM;
1562
        if (s->istat0 & LSI_ISTAT0_SIGP) {
1563
            s->istat0 &= ~LSI_ISTAT0_SIGP;
1564
            tmp |= LSI_CTEST2_SIGP;
1565
        }
1566
        return tmp;
1567
    case 0x1b: /* CTEST3 */
1568
        return s->ctest3;
1569
    CASE_GET_REG32(temp, 0x1c)
1570
    case 0x20: /* DFIFO */
1571
        return 0;
1572
    case 0x21: /* CTEST4 */
1573
        return s->ctest4;
1574
    case 0x22: /* CTEST5 */
1575
        return s->ctest5;
1576
    case 0x23: /* CTEST6 */
1577
         return 0;
1578
    CASE_GET_REG24(dbc, 0x24)
1579
    case 0x27: /* DCMD */
1580
        return s->dcmd;
1581
    CASE_GET_REG32(dnad, 0x28)
1582
    CASE_GET_REG32(dsp, 0x2c)
1583
    CASE_GET_REG32(dsps, 0x30)
1584
    CASE_GET_REG32(scratch[0], 0x34)
1585
    case 0x38: /* DMODE */
1586
        return s->dmode;
1587
    case 0x39: /* DIEN */
1588
        return s->dien;
1589
    case 0x3a: /* SBR */
1590
        return s->sbr;
1591
    case 0x3b: /* DCNTL */
1592
        return s->dcntl;
1593
    case 0x40: /* SIEN0 */
1594
        return s->sien0;
1595
    case 0x41: /* SIEN1 */
1596
        return s->sien1;
1597
    case 0x42: /* SIST0 */
1598
        tmp = s->sist0;
1599
        s->sist0 = 0;
1600
        lsi_update_irq(s);
1601
        return tmp;
1602
    case 0x43: /* SIST1 */
1603
        tmp = s->sist1;
1604
        s->sist1 = 0;
1605
        lsi_update_irq(s);
1606
        return tmp;
1607
    case 0x46: /* MACNTL */
1608
        return 0x0f;
1609
    case 0x47: /* GPCNTL0 */
1610
        return 0x0f;
1611
    case 0x48: /* STIME0 */
1612
        return s->stime0;
1613
    case 0x4a: /* RESPID0 */
1614
        return s->respid0;
1615
    case 0x4b: /* RESPID1 */
1616
        return s->respid1;
1617
    case 0x4d: /* STEST1 */
1618
        return s->stest1;
1619
    case 0x4e: /* STEST2 */
1620
        return s->stest2;
1621
    case 0x4f: /* STEST3 */
1622
        return s->stest3;
1623
    case 0x50: /* SIDL */
1624
        /* This is needed by the linux drivers.  We currently only update it
1625
           during the MSG IN phase.  */
1626
        return s->sidl;
1627
    case 0x52: /* STEST4 */
1628
        return 0xe0;
1629
    case 0x56: /* CCNTL0 */
1630
        return s->ccntl0;
1631
    case 0x57: /* CCNTL1 */
1632
        return s->ccntl1;
1633
    case 0x58: /* SBDL */
1634
        /* Some drivers peek at the data bus during the MSG IN phase.  */
1635
        if ((s->sstat1 & PHASE_MASK) == PHASE_MI)
1636
            return s->msg[0];
1637
        return 0;
1638
    case 0x59: /* SBDL high */
1639
        return 0;
1640
    CASE_GET_REG32(mmrs, 0xa0)
1641
    CASE_GET_REG32(mmws, 0xa4)
1642
    CASE_GET_REG32(sfs, 0xa8)
1643
    CASE_GET_REG32(drs, 0xac)
1644
    CASE_GET_REG32(sbms, 0xb0)
1645
    CASE_GET_REG32(dbms, 0xb4)
1646
    CASE_GET_REG32(dnad64, 0xb8)
1647
    CASE_GET_REG32(pmjad1, 0xc0)
1648
    CASE_GET_REG32(pmjad2, 0xc4)
1649
    CASE_GET_REG32(rbc, 0xc8)
1650
    CASE_GET_REG32(ua, 0xcc)
1651
    CASE_GET_REG32(ia, 0xd4)
1652
    CASE_GET_REG32(sbc, 0xd8)
1653
    CASE_GET_REG32(csbc, 0xdc)
1654
    }
1655
    if (offset >= 0x5c && offset < 0xa0) {
1656
        int n;
1657
        int shift;
1658
        n = (offset - 0x58) >> 2;
1659
        shift = (offset & 3) * 8;
1660
        return (s->scratch[n] >> shift) & 0xff;
1661
    }
1662
    BADF("readb 0x%x\n", offset);
1663
    exit(1);
1664
#undef CASE_GET_REG24
1665
#undef CASE_GET_REG32
1666
}
1667

    
1668
static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val)
1669
{
1670
#define CASE_SET_REG24(name, addr) \
1671
    case addr    : s->name &= 0xffffff00; s->name |= val;       break; \
1672
    case addr + 1: s->name &= 0xffff00ff; s->name |= val << 8;  break; \
1673
    case addr + 2: s->name &= 0xff00ffff; s->name |= val << 16; break;
1674

    
1675
#define CASE_SET_REG32(name, addr) \
1676
    case addr    : s->name &= 0xffffff00; s->name |= val;       break; \
1677
    case addr + 1: s->name &= 0xffff00ff; s->name |= val << 8;  break; \
1678
    case addr + 2: s->name &= 0xff00ffff; s->name |= val << 16; break; \
1679
    case addr + 3: s->name &= 0x00ffffff; s->name |= val << 24; break;
1680

    
1681
#ifdef DEBUG_LSI_REG
1682
    DPRINTF("Write reg %x = %02x\n", offset, val);
1683
#endif
1684
    switch (offset) {
1685
    case 0x00: /* SCNTL0 */
1686
        s->scntl0 = val;
1687
        if (val & LSI_SCNTL0_START) {
1688
            BADF("Start sequence not implemented\n");
1689
        }
1690
        break;
1691
    case 0x01: /* SCNTL1 */
1692
        s->scntl1 = val & ~LSI_SCNTL1_SST;
1693
        if (val & LSI_SCNTL1_IARB) {
1694
            BADF("Immediate Arbritration not implemented\n");
1695
        }
1696
        if (val & LSI_SCNTL1_RST) {
1697
            if (!(s->sstat0 & LSI_SSTAT0_RST)) {
1698
                DeviceState *dev;
1699
                int id;
1700

    
1701
                for (id = 0; id < s->bus.ndev; id++) {
1702
                    if (s->bus.devs[id]) {
1703
                        dev = &s->bus.devs[id]->qdev;
1704
                        dev->info->reset(dev);
1705
                    }
1706
                }
1707
                s->sstat0 |= LSI_SSTAT0_RST;
1708
                lsi_script_scsi_interrupt(s, LSI_SIST0_RST, 0);
1709
            }
1710
        } else {
1711
            s->sstat0 &= ~LSI_SSTAT0_RST;
1712
        }
1713
        break;
1714
    case 0x02: /* SCNTL2 */
1715
        val &= ~(LSI_SCNTL2_WSR | LSI_SCNTL2_WSS);
1716
        s->scntl2 = val;
1717
        break;
1718
    case 0x03: /* SCNTL3 */
1719
        s->scntl3 = val;
1720
        break;
1721
    case 0x04: /* SCID */
1722
        s->scid = val;
1723
        break;
1724
    case 0x05: /* SXFER */
1725
        s->sxfer = val;
1726
        break;
1727
    case 0x06: /* SDID */
1728
        if ((val & 0xf) != (s->ssid & 0xf))
1729
            BADF("Destination ID does not match SSID\n");
1730
        s->sdid = val & 0xf;
1731
        break;
1732
    case 0x07: /* GPREG0 */
1733
        break;
1734
    case 0x08: /* SFBR */
1735
        /* The CPU is not allowed to write to this register.  However the
1736
           SCRIPTS register move instructions are.  */
1737
        s->sfbr = val;
1738
        break;
1739
    case 0x0a: case 0x0b:
1740
        /* Openserver writes to these readonly registers on startup */
1741
        return;
1742
    case 0x0c: case 0x0d: case 0x0e: case 0x0f:
1743
        /* Linux writes to these readonly registers on startup.  */
1744
        return;
1745
    CASE_SET_REG32(dsa, 0x10)
1746
    case 0x14: /* ISTAT0 */
1747
        s->istat0 = (s->istat0 & 0x0f) | (val & 0xf0);
1748
        if (val & LSI_ISTAT0_ABRT) {
1749
            lsi_script_dma_interrupt(s, LSI_DSTAT_ABRT);
1750
        }
1751
        if (val & LSI_ISTAT0_INTF) {
1752
            s->istat0 &= ~LSI_ISTAT0_INTF;
1753
            lsi_update_irq(s);
1754
        }
1755
        if (s->waiting == 1 && val & LSI_ISTAT0_SIGP) {
1756
            DPRINTF("Woken by SIGP\n");
1757
            s->waiting = 0;
1758
            s->dsp = s->dnad;
1759
            lsi_execute_script(s);
1760
        }
1761
        if (val & LSI_ISTAT0_SRST) {
1762
            lsi_soft_reset(s);
1763
        }
1764
        break;
1765
    case 0x16: /* MBOX0 */
1766
        s->mbox0 = val;
1767
        break;
1768
    case 0x17: /* MBOX1 */
1769
        s->mbox1 = val;
1770
        break;
1771
    case 0x1a: /* CTEST2 */
1772
        s->ctest2 = val & LSI_CTEST2_PCICIE;
1773
        break;
1774
    case 0x1b: /* CTEST3 */
1775
        s->ctest3 = val & 0x0f;
1776
        break;
1777
    CASE_SET_REG32(temp, 0x1c)
1778
    case 0x21: /* CTEST4 */
1779
        if (val & 7) {
1780
           BADF("Unimplemented CTEST4-FBL 0x%x\n", val);
1781
        }
1782
        s->ctest4 = val;
1783
        break;
1784
    case 0x22: /* CTEST5 */
1785
        if (val & (LSI_CTEST5_ADCK | LSI_CTEST5_BBCK)) {
1786
            BADF("CTEST5 DMA increment not implemented\n");
1787
        }
1788
        s->ctest5 = val;
1789
        break;
1790
    CASE_SET_REG24(dbc, 0x24)
1791
    CASE_SET_REG32(dnad, 0x28)
1792
    case 0x2c: /* DSP[0:7] */
1793
        s->dsp &= 0xffffff00;
1794
        s->dsp |= val;
1795
        break;
1796
    case 0x2d: /* DSP[8:15] */
1797
        s->dsp &= 0xffff00ff;
1798
        s->dsp |= val << 8;
1799
        break;
1800
    case 0x2e: /* DSP[16:23] */
1801
        s->dsp &= 0xff00ffff;
1802
        s->dsp |= val << 16;
1803
        break;
1804
    case 0x2f: /* DSP[24:31] */
1805
        s->dsp &= 0x00ffffff;
1806
        s->dsp |= val << 24;
1807
        if ((s->dmode & LSI_DMODE_MAN) == 0
1808
            && (s->istat1 & LSI_ISTAT1_SRUN) == 0)
1809
            lsi_execute_script(s);
1810
        break;
1811
    CASE_SET_REG32(dsps, 0x30)
1812
    CASE_SET_REG32(scratch[0], 0x34)
1813
    case 0x38: /* DMODE */
1814
        if (val & (LSI_DMODE_SIOM | LSI_DMODE_DIOM)) {
1815
            BADF("IO mappings not implemented\n");
1816
        }
1817
        s->dmode = val;
1818
        break;
1819
    case 0x39: /* DIEN */
1820
        s->dien = val;
1821
        lsi_update_irq(s);
1822
        break;
1823
    case 0x3a: /* SBR */
1824
        s->sbr = val;
1825
        break;
1826
    case 0x3b: /* DCNTL */
1827
        s->dcntl = val & ~(LSI_DCNTL_PFF | LSI_DCNTL_STD);
1828
        if ((val & LSI_DCNTL_STD) && (s->istat1 & LSI_ISTAT1_SRUN) == 0)
1829
            lsi_execute_script(s);
1830
        break;
1831
    case 0x40: /* SIEN0 */
1832
        s->sien0 = val;
1833
        lsi_update_irq(s);
1834
        break;
1835
    case 0x41: /* SIEN1 */
1836
        s->sien1 = val;
1837
        lsi_update_irq(s);
1838
        break;
1839
    case 0x47: /* GPCNTL0 */
1840
        break;
1841
    case 0x48: /* STIME0 */
1842
        s->stime0 = val;
1843
        break;
1844
    case 0x49: /* STIME1 */
1845
        if (val & 0xf) {
1846
            DPRINTF("General purpose timer not implemented\n");
1847
            /* ??? Raising the interrupt immediately seems to be sufficient
1848
               to keep the FreeBSD driver happy.  */
1849
            lsi_script_scsi_interrupt(s, 0, LSI_SIST1_GEN);
1850
        }
1851
        break;
1852
    case 0x4a: /* RESPID0 */
1853
        s->respid0 = val;
1854
        break;
1855
    case 0x4b: /* RESPID1 */
1856
        s->respid1 = val;
1857
        break;
1858
    case 0x4d: /* STEST1 */
1859
        s->stest1 = val;
1860
        break;
1861
    case 0x4e: /* STEST2 */
1862
        if (val & 1) {
1863
            BADF("Low level mode not implemented\n");
1864
        }
1865
        s->stest2 = val;
1866
        break;
1867
    case 0x4f: /* STEST3 */
1868
        if (val & 0x41) {
1869
            BADF("SCSI FIFO test mode not implemented\n");
1870
        }
1871
        s->stest3 = val;
1872
        break;
1873
    case 0x56: /* CCNTL0 */
1874
        s->ccntl0 = val;
1875
        break;
1876
    case 0x57: /* CCNTL1 */
1877
        s->ccntl1 = val;
1878
        break;
1879
    CASE_SET_REG32(mmrs, 0xa0)
1880
    CASE_SET_REG32(mmws, 0xa4)
1881
    CASE_SET_REG32(sfs, 0xa8)
1882
    CASE_SET_REG32(drs, 0xac)
1883
    CASE_SET_REG32(sbms, 0xb0)
1884
    CASE_SET_REG32(dbms, 0xb4)
1885
    CASE_SET_REG32(dnad64, 0xb8)
1886
    CASE_SET_REG32(pmjad1, 0xc0)
1887
    CASE_SET_REG32(pmjad2, 0xc4)
1888
    CASE_SET_REG32(rbc, 0xc8)
1889
    CASE_SET_REG32(ua, 0xcc)
1890
    CASE_SET_REG32(ia, 0xd4)
1891
    CASE_SET_REG32(sbc, 0xd8)
1892
    CASE_SET_REG32(csbc, 0xdc)
1893
    default:
1894
        if (offset >= 0x5c && offset < 0xa0) {
1895
            int n;
1896
            int shift;
1897
            n = (offset - 0x58) >> 2;
1898
            shift = (offset & 3) * 8;
1899
            s->scratch[n] &= ~(0xff << shift);
1900
            s->scratch[n] |= (val & 0xff) << shift;
1901
        } else {
1902
            BADF("Unhandled writeb 0x%x = 0x%x\n", offset, val);
1903
        }
1904
    }
1905
#undef CASE_SET_REG24
1906
#undef CASE_SET_REG32
1907
}
1908

    
1909
static void lsi_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
1910
{
1911
    LSIState *s = opaque;
1912

    
1913
    lsi_reg_writeb(s, addr & 0xff, val);
1914
}
1915

    
1916
static void lsi_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
1917
{
1918
    LSIState *s = opaque;
1919

    
1920
    addr &= 0xff;
1921
    lsi_reg_writeb(s, addr, val & 0xff);
1922
    lsi_reg_writeb(s, addr + 1, (val >> 8) & 0xff);
1923
}
1924

    
1925
static void lsi_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
1926
{
1927
    LSIState *s = opaque;
1928

    
1929
    addr &= 0xff;
1930
    lsi_reg_writeb(s, addr, val & 0xff);
1931
    lsi_reg_writeb(s, addr + 1, (val >> 8) & 0xff);
1932
    lsi_reg_writeb(s, addr + 2, (val >> 16) & 0xff);
1933
    lsi_reg_writeb(s, addr + 3, (val >> 24) & 0xff);
1934
}
1935

    
1936
static uint32_t lsi_mmio_readb(void *opaque, target_phys_addr_t addr)
1937
{
1938
    LSIState *s = opaque;
1939

    
1940
    return lsi_reg_readb(s, addr & 0xff);
1941
}
1942

    
1943
static uint32_t lsi_mmio_readw(void *opaque, target_phys_addr_t addr)
1944
{
1945
    LSIState *s = opaque;
1946
    uint32_t val;
1947

    
1948
    addr &= 0xff;
1949
    val = lsi_reg_readb(s, addr);
1950
    val |= lsi_reg_readb(s, addr + 1) << 8;
1951
    return val;
1952
}
1953

    
1954
static uint32_t lsi_mmio_readl(void *opaque, target_phys_addr_t addr)
1955
{
1956
    LSIState *s = opaque;
1957
    uint32_t val;
1958
    addr &= 0xff;
1959
    val = lsi_reg_readb(s, addr);
1960
    val |= lsi_reg_readb(s, addr + 1) << 8;
1961
    val |= lsi_reg_readb(s, addr + 2) << 16;
1962
    val |= lsi_reg_readb(s, addr + 3) << 24;
1963
    return val;
1964
}
1965

    
1966
static CPUReadMemoryFunc * const lsi_mmio_readfn[3] = {
1967
    lsi_mmio_readb,
1968
    lsi_mmio_readw,
1969
    lsi_mmio_readl,
1970
};
1971

    
1972
static CPUWriteMemoryFunc * const lsi_mmio_writefn[3] = {
1973
    lsi_mmio_writeb,
1974
    lsi_mmio_writew,
1975
    lsi_mmio_writel,
1976
};
1977

    
1978
static void lsi_ram_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
1979
{
1980
    LSIState *s = opaque;
1981
    uint32_t newval;
1982
    int shift;
1983

    
1984
    addr &= 0x1fff;
1985
    newval = s->script_ram[addr >> 2];
1986
    shift = (addr & 3) * 8;
1987
    newval &= ~(0xff << shift);
1988
    newval |= val << shift;
1989
    s->script_ram[addr >> 2] = newval;
1990
}
1991

    
1992
static void lsi_ram_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
1993
{
1994
    LSIState *s = opaque;
1995
    uint32_t newval;
1996

    
1997
    addr &= 0x1fff;
1998
    newval = s->script_ram[addr >> 2];
1999
    if (addr & 2) {
2000
        newval = (newval & 0xffff) | (val << 16);
2001
    } else {
2002
        newval = (newval & 0xffff0000) | val;
2003
    }
2004
    s->script_ram[addr >> 2] = newval;
2005
}
2006

    
2007

    
2008
static void lsi_ram_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
2009
{
2010
    LSIState *s = opaque;
2011

    
2012
    addr &= 0x1fff;
2013
    s->script_ram[addr >> 2] = val;
2014
}
2015

    
2016
static uint32_t lsi_ram_readb(void *opaque, target_phys_addr_t addr)
2017
{
2018
    LSIState *s = opaque;
2019
    uint32_t val;
2020

    
2021
    addr &= 0x1fff;
2022
    val = s->script_ram[addr >> 2];
2023
    val >>= (addr & 3) * 8;
2024
    return val & 0xff;
2025
}
2026

    
2027
static uint32_t lsi_ram_readw(void *opaque, target_phys_addr_t addr)
2028
{
2029
    LSIState *s = opaque;
2030
    uint32_t val;
2031

    
2032
    addr &= 0x1fff;
2033
    val = s->script_ram[addr >> 2];
2034
    if (addr & 2)
2035
        val >>= 16;
2036
    return val;
2037
}
2038

    
2039
static uint32_t lsi_ram_readl(void *opaque, target_phys_addr_t addr)
2040
{
2041
    LSIState *s = opaque;
2042

    
2043
    addr &= 0x1fff;
2044
    return s->script_ram[addr >> 2];
2045
}
2046

    
2047
static CPUReadMemoryFunc * const lsi_ram_readfn[3] = {
2048
    lsi_ram_readb,
2049
    lsi_ram_readw,
2050
    lsi_ram_readl,
2051
};
2052

    
2053
static CPUWriteMemoryFunc * const lsi_ram_writefn[3] = {
2054
    lsi_ram_writeb,
2055
    lsi_ram_writew,
2056
    lsi_ram_writel,
2057
};
2058

    
2059
static uint32_t lsi_io_readb(void *opaque, uint32_t addr)
2060
{
2061
    LSIState *s = opaque;
2062
    return lsi_reg_readb(s, addr & 0xff);
2063
}
2064

    
2065
static uint32_t lsi_io_readw(void *opaque, uint32_t addr)
2066
{
2067
    LSIState *s = opaque;
2068
    uint32_t val;
2069
    addr &= 0xff;
2070
    val = lsi_reg_readb(s, addr);
2071
    val |= lsi_reg_readb(s, addr + 1) << 8;
2072
    return val;
2073
}
2074

    
2075
static uint32_t lsi_io_readl(void *opaque, uint32_t addr)
2076
{
2077
    LSIState *s = opaque;
2078
    uint32_t val;
2079
    addr &= 0xff;
2080
    val = lsi_reg_readb(s, addr);
2081
    val |= lsi_reg_readb(s, addr + 1) << 8;
2082
    val |= lsi_reg_readb(s, addr + 2) << 16;
2083
    val |= lsi_reg_readb(s, addr + 3) << 24;
2084
    return val;
2085
}
2086

    
2087
static void lsi_io_writeb(void *opaque, uint32_t addr, uint32_t val)
2088
{
2089
    LSIState *s = opaque;
2090
    lsi_reg_writeb(s, addr & 0xff, val);
2091
}
2092

    
2093
static void lsi_io_writew(void *opaque, uint32_t addr, uint32_t val)
2094
{
2095
    LSIState *s = opaque;
2096
    addr &= 0xff;
2097
    lsi_reg_writeb(s, addr, val & 0xff);
2098
    lsi_reg_writeb(s, addr + 1, (val >> 8) & 0xff);
2099
}
2100

    
2101
static void lsi_io_writel(void *opaque, uint32_t addr, uint32_t val)
2102
{
2103
    LSIState *s = opaque;
2104
    addr &= 0xff;
2105
    lsi_reg_writeb(s, addr, val & 0xff);
2106
    lsi_reg_writeb(s, addr + 1, (val >> 8) & 0xff);
2107
    lsi_reg_writeb(s, addr + 2, (val >> 16) & 0xff);
2108
    lsi_reg_writeb(s, addr + 3, (val >> 24) & 0xff);
2109
}
2110

    
2111
static void lsi_io_mapfunc(PCIDevice *pci_dev, int region_num,
2112
                           pcibus_t addr, pcibus_t size, int type)
2113
{
2114
    LSIState *s = DO_UPCAST(LSIState, dev, pci_dev);
2115

    
2116
    DPRINTF("Mapping IO at %08"FMT_PCIBUS"\n", addr);
2117

    
2118
    register_ioport_write(addr, 256, 1, lsi_io_writeb, s);
2119
    register_ioport_read(addr, 256, 1, lsi_io_readb, s);
2120
    register_ioport_write(addr, 256, 2, lsi_io_writew, s);
2121
    register_ioport_read(addr, 256, 2, lsi_io_readw, s);
2122
    register_ioport_write(addr, 256, 4, lsi_io_writel, s);
2123
    register_ioport_read(addr, 256, 4, lsi_io_readl, s);
2124
}
2125

    
2126
static void lsi_ram_mapfunc(PCIDevice *pci_dev, int region_num,
2127
                            pcibus_t addr, pcibus_t size, int type)
2128
{
2129
    LSIState *s = DO_UPCAST(LSIState, dev, pci_dev);
2130

    
2131
    DPRINTF("Mapping ram at %08"FMT_PCIBUS"\n", addr);
2132
    s->script_ram_base = addr;
2133
    cpu_register_physical_memory(addr + 0, 0x2000, s->ram_io_addr);
2134
}
2135

    
2136
static void lsi_scsi_reset(DeviceState *dev)
2137
{
2138
    LSIState *s = DO_UPCAST(LSIState, dev.qdev, dev);
2139

    
2140
    lsi_soft_reset(s);
2141
}
2142

    
2143
static void lsi_pre_save(void *opaque)
2144
{
2145
    LSIState *s = opaque;
2146

    
2147
    if (s->current) {
2148
        assert(s->current->dma_buf == NULL);
2149
        assert(s->current->dma_len == 0);
2150
    }
2151
    assert(QTAILQ_EMPTY(&s->queue));
2152
}
2153

    
2154
static const VMStateDescription vmstate_lsi_scsi = {
2155
    .name = "lsiscsi",
2156
    .version_id = 0,
2157
    .minimum_version_id = 0,
2158
    .minimum_version_id_old = 0,
2159
    .pre_save = lsi_pre_save,
2160
    .fields      = (VMStateField []) {
2161
        VMSTATE_PCI_DEVICE(dev, LSIState),
2162

    
2163
        VMSTATE_INT32(carry, LSIState),
2164
        VMSTATE_INT32(status, LSIState),
2165
        VMSTATE_INT32(msg_action, LSIState),
2166
        VMSTATE_INT32(msg_len, LSIState),
2167
        VMSTATE_BUFFER(msg, LSIState),
2168
        VMSTATE_INT32(waiting, LSIState),
2169

    
2170
        VMSTATE_UINT32(dsa, LSIState),
2171
        VMSTATE_UINT32(temp, LSIState),
2172
        VMSTATE_UINT32(dnad, LSIState),
2173
        VMSTATE_UINT32(dbc, LSIState),
2174
        VMSTATE_UINT8(istat0, LSIState),
2175
        VMSTATE_UINT8(istat1, LSIState),
2176
        VMSTATE_UINT8(dcmd, LSIState),
2177
        VMSTATE_UINT8(dstat, LSIState),
2178
        VMSTATE_UINT8(dien, LSIState),
2179
        VMSTATE_UINT8(sist0, LSIState),
2180
        VMSTATE_UINT8(sist1, LSIState),
2181
        VMSTATE_UINT8(sien0, LSIState),
2182
        VMSTATE_UINT8(sien1, LSIState),
2183
        VMSTATE_UINT8(mbox0, LSIState),
2184
        VMSTATE_UINT8(mbox1, LSIState),
2185
        VMSTATE_UINT8(dfifo, LSIState),
2186
        VMSTATE_UINT8(ctest2, LSIState),
2187
        VMSTATE_UINT8(ctest3, LSIState),
2188
        VMSTATE_UINT8(ctest4, LSIState),
2189
        VMSTATE_UINT8(ctest5, LSIState),
2190
        VMSTATE_UINT8(ccntl0, LSIState),
2191
        VMSTATE_UINT8(ccntl1, LSIState),
2192
        VMSTATE_UINT32(dsp, LSIState),
2193
        VMSTATE_UINT32(dsps, LSIState),
2194
        VMSTATE_UINT8(dmode, LSIState),
2195
        VMSTATE_UINT8(dcntl, LSIState),
2196
        VMSTATE_UINT8(scntl0, LSIState),
2197
        VMSTATE_UINT8(scntl1, LSIState),
2198
        VMSTATE_UINT8(scntl2, LSIState),
2199
        VMSTATE_UINT8(scntl3, LSIState),
2200
        VMSTATE_UINT8(sstat0, LSIState),
2201
        VMSTATE_UINT8(sstat1, LSIState),
2202
        VMSTATE_UINT8(scid, LSIState),
2203
        VMSTATE_UINT8(sxfer, LSIState),
2204
        VMSTATE_UINT8(socl, LSIState),
2205
        VMSTATE_UINT8(sdid, LSIState),
2206
        VMSTATE_UINT8(ssid, LSIState),
2207
        VMSTATE_UINT8(sfbr, LSIState),
2208
        VMSTATE_UINT8(stest1, LSIState),
2209
        VMSTATE_UINT8(stest2, LSIState),
2210
        VMSTATE_UINT8(stest3, LSIState),
2211
        VMSTATE_UINT8(sidl, LSIState),
2212
        VMSTATE_UINT8(stime0, LSIState),
2213
        VMSTATE_UINT8(respid0, LSIState),
2214
        VMSTATE_UINT8(respid1, LSIState),
2215
        VMSTATE_UINT32(mmrs, LSIState),
2216
        VMSTATE_UINT32(mmws, LSIState),
2217
        VMSTATE_UINT32(sfs, LSIState),
2218
        VMSTATE_UINT32(drs, LSIState),
2219
        VMSTATE_UINT32(sbms, LSIState),
2220
        VMSTATE_UINT32(dbms, LSIState),
2221
        VMSTATE_UINT32(dnad64, LSIState),
2222
        VMSTATE_UINT32(pmjad1, LSIState),
2223
        VMSTATE_UINT32(pmjad2, LSIState),
2224
        VMSTATE_UINT32(rbc, LSIState),
2225
        VMSTATE_UINT32(ua, LSIState),
2226
        VMSTATE_UINT32(ia, LSIState),
2227
        VMSTATE_UINT32(sbc, LSIState),
2228
        VMSTATE_UINT32(csbc, LSIState),
2229
        VMSTATE_BUFFER_UNSAFE(scratch, LSIState, 0, 18 * sizeof(uint32_t)),
2230
        VMSTATE_UINT8(sbr, LSIState),
2231

    
2232
        VMSTATE_BUFFER_UNSAFE(script_ram, LSIState, 0, 2048 * sizeof(uint32_t)),
2233
        VMSTATE_END_OF_LIST()
2234
    }
2235
};
2236

    
2237
static int lsi_scsi_uninit(PCIDevice *d)
2238
{
2239
    LSIState *s = DO_UPCAST(LSIState, dev, d);
2240

    
2241
    cpu_unregister_io_memory(s->mmio_io_addr);
2242
    cpu_unregister_io_memory(s->ram_io_addr);
2243

    
2244
    return 0;
2245
}
2246

    
2247
static const struct SCSIBusOps lsi_scsi_ops = {
2248
    .complete = lsi_command_complete,
2249
    .cancel = lsi_request_cancelled
2250
};
2251

    
2252
static int lsi_scsi_init(PCIDevice *dev)
2253
{
2254
    LSIState *s = DO_UPCAST(LSIState, dev, dev);
2255
    uint8_t *pci_conf;
2256

    
2257
    pci_conf = s->dev.config;
2258

    
2259
    /* PCI Vendor ID (word) */
2260
    pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_LSI_LOGIC);
2261
    /* PCI device ID (word) */
2262
    pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_LSI_53C895A);
2263
    /* PCI base class code */
2264
    pci_config_set_class(pci_conf, PCI_CLASS_STORAGE_SCSI);
2265
    /* PCI subsystem ID */
2266
    pci_conf[PCI_SUBSYSTEM_ID] = 0x00;
2267
    pci_conf[PCI_SUBSYSTEM_ID + 1] = 0x10;
2268
    /* PCI latency timer = 255 */
2269
    pci_conf[PCI_LATENCY_TIMER] = 0xff;
2270
    /* TODO: RST# value should be 0 */
2271
    /* Interrupt pin 1 */
2272
    pci_conf[PCI_INTERRUPT_PIN] = 0x01;
2273

    
2274
    s->mmio_io_addr = cpu_register_io_memory(lsi_mmio_readfn,
2275
                                             lsi_mmio_writefn, s,
2276
                                             DEVICE_NATIVE_ENDIAN);
2277
    s->ram_io_addr = cpu_register_io_memory(lsi_ram_readfn,
2278
                                            lsi_ram_writefn, s,
2279
                                            DEVICE_NATIVE_ENDIAN);
2280

    
2281
    pci_register_bar(&s->dev, 0, 256,
2282
                           PCI_BASE_ADDRESS_SPACE_IO, lsi_io_mapfunc);
2283
    pci_register_bar_simple(&s->dev, 1, 0x400, 0, s->mmio_io_addr);
2284
    pci_register_bar(&s->dev, 2, 0x2000,
2285
                           PCI_BASE_ADDRESS_SPACE_MEMORY, lsi_ram_mapfunc);
2286
    QTAILQ_INIT(&s->queue);
2287

    
2288
    scsi_bus_new(&s->bus, &dev->qdev, 1, LSI_MAX_DEVS, &lsi_scsi_ops);
2289
    if (!dev->qdev.hotplugged) {
2290
        return scsi_bus_legacy_handle_cmdline(&s->bus);
2291
    }
2292
    return 0;
2293
}
2294

    
2295
static PCIDeviceInfo lsi_info = {
2296
    .qdev.name  = "lsi53c895a",
2297
    .qdev.alias = "lsi",
2298
    .qdev.size  = sizeof(LSIState),
2299
    .qdev.reset = lsi_scsi_reset,
2300
    .qdev.vmsd  = &vmstate_lsi_scsi,
2301
    .init       = lsi_scsi_init,
2302
    .exit       = lsi_scsi_uninit,
2303
};
2304

    
2305
static void lsi53c895a_register_devices(void)
2306
{
2307
    pci_qdev_register(&lsi_info);
2308
}
2309

    
2310
device_init(lsi53c895a_register_devices);