Statistics
| Branch: | Revision:

root / hw / lsi53c895a.c @ 11257187

History | View | Annotate | Download (64.8 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
    uint32_t tag;
178
    uint32_t dma_len;
179
    uint8_t *dma_buf;
180
    uint32_t pending;
181
    int out;
182
    QTAILQ_ENTRY(lsi_request) next;
183
} lsi_request;
184

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
507

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

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

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

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

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

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

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

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

    
566
    DPRINTF("DMA addr=0x" TARGET_FMT_plx " len=%d\n", addr, count);
567
    s->csbc += count;
568
    s->dnad += count;
569
    s->dbc -= count;
570

    
571
    if (s->current->dma_buf == NULL) {
572
        s->current->dma_buf = dev->info->get_buf(dev, s->current->tag);
573
    }
574

    
575
    /* ??? Set SFBR to first data byte.  */
576
    if (out) {
577
        cpu_physical_memory_read(addr, s->current->dma_buf, count);
578
    } else {
579
        cpu_physical_memory_write(addr, s->current->dma_buf, count);
580
    }
581
    s->current->dma_len -= count;
582
    if (s->current->dma_len == 0) {
583
        s->current->dma_buf = NULL;
584
        if (out) {
585
            /* Write the data.  */
586
            dev->info->write_data(dev, s->current->tag);
587
        } else {
588
            /* Request any remaining data.  */
589
            dev->info->read_data(dev, s->current->tag);
590
        }
591
    } else {
592
        s->current->dma_buf += count;
593
        lsi_resume_script(s);
594
    }
595
}
596

    
597

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

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

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

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

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

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

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

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

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

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

    
665
    return NULL;
666
}
667

    
668
/* Record that data is available for a queued command.  Returns zero if
669
   the device was reselected, nonzero if the IO is deferred.  */
670
static int lsi_queue_tag(LSIState *s, uint32_t tag, uint32_t arg)
671
{
672
    lsi_request *p;
673

    
674
    p = lsi_find_by_tag(s, tag);
675
    if (!p) {
676
        BADF("IO with unknown tag %d\n", tag);
677
        return 1;
678
    }
679

    
680
    if (p->pending) {
681
        BADF("Multiple IO pending for tag %d\n", tag);
682
    }
683
    p->pending = arg;
684
    /* Reselect if waiting for it, or if reselection triggers an IRQ
685
       and the bus is free.
686
       Since no interrupt stacking is implemented in the emulation, it
687
       is also required that there are no pending interrupts waiting
688
       for service from the device driver. */
689
    if (s->waiting == 1 ||
690
        (lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON) &&
691
         !(s->istat0 & (LSI_ISTAT0_SIP | LSI_ISTAT0_DIP)))) {
692
        /* Reselect device.  */
693
        lsi_reselect(s, p);
694
        return 0;
695
    } else {
696
        DPRINTF("Queueing IO tag=0x%x\n", tag);
697
        p->pending = arg;
698
        return 1;
699
    }
700
}
701

    
702
/* Callback to indicate that the SCSI layer has completed a transfer.  */
703
static void lsi_command_complete(SCSIBus *bus, int reason, uint32_t tag,
704
                                 uint32_t arg)
705
{
706
    LSIState *s = DO_UPCAST(LSIState, dev.qdev, bus->qbus.parent);
707
    int out;
708

    
709
    out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
710
    if (reason == SCSI_REASON_DONE) {
711
        DPRINTF("Command complete status=%d\n", (int)arg);
712
        s->status = arg;
713
        s->command_complete = 2;
714
        if (s->waiting && s->dbc != 0) {
715
            /* Raise phase mismatch for short transfers.  */
716
            lsi_bad_phase(s, out, PHASE_ST);
717
        } else {
718
            lsi_set_phase(s, PHASE_ST);
719
        }
720

    
721
        qemu_free(s->current);
722
        s->current = NULL;
723

    
724
        lsi_resume_script(s);
725
        return;
726
    }
727

    
728
    if (s->waiting == 1 || !s->current || tag != s->current->tag ||
729
        (lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON))) {
730
        if (lsi_queue_tag(s, tag, arg))
731
            return;
732
    }
733

    
734
    /* host adapter (re)connected */
735
    DPRINTF("Data ready tag=0x%x len=%d\n", tag, arg);
736
    s->current->dma_len = arg;
737
    s->command_complete = 1;
738
    if (!s->waiting)
739
        return;
740
    if (s->waiting == 1 || s->dbc == 0) {
741
        lsi_resume_script(s);
742
    } else {
743
        lsi_do_dma(s, out);
744
    }
745
}
746

    
747
static void lsi_do_command(LSIState *s)
748
{
749
    SCSIDevice *dev;
750
    uint8_t buf[16];
751
    uint32_t id;
752
    int n;
753

    
754
    DPRINTF("Send command len=%d\n", s->dbc);
755
    if (s->dbc > 16)
756
        s->dbc = 16;
757
    cpu_physical_memory_read(s->dnad, buf, s->dbc);
758
    s->sfbr = buf[0];
759
    s->command_complete = 0;
760

    
761
    id = (s->select_tag >> 8) & 0xf;
762
    dev = s->bus.devs[id];
763
    if (!dev) {
764
        lsi_bad_selection(s, id);
765
        return;
766
    }
767

    
768
    assert(s->current == NULL);
769
    s->current = qemu_mallocz(sizeof(lsi_request));
770
    s->current->tag = s->select_tag;
771

    
772
    n = dev->info->send_command(dev, s->current->tag, buf, s->current_lun);
773
    if (n > 0) {
774
        lsi_set_phase(s, PHASE_DI);
775
        dev->info->read_data(dev, s->current->tag);
776
    } else if (n < 0) {
777
        lsi_set_phase(s, PHASE_DO);
778
        dev->info->write_data(dev, s->current->tag);
779
    }
780

    
781
    if (!s->command_complete) {
782
        if (n) {
783
            /* Command did not complete immediately so disconnect.  */
784
            lsi_add_msg_byte(s, 2); /* SAVE DATA POINTER */
785
            lsi_add_msg_byte(s, 4); /* DISCONNECT */
786
            /* wait data */
787
            lsi_set_phase(s, PHASE_MI);
788
            s->msg_action = 1;
789
            lsi_queue_command(s);
790
        } else {
791
            /* wait command complete */
792
            lsi_set_phase(s, PHASE_DI);
793
        }
794
    }
795
}
796

    
797
static void lsi_do_status(LSIState *s)
798
{
799
    uint8_t status;
800
    DPRINTF("Get status len=%d status=%d\n", s->dbc, s->status);
801
    if (s->dbc != 1)
802
        BADF("Bad Status move\n");
803
    s->dbc = 1;
804
    status = s->status;
805
    s->sfbr = status;
806
    cpu_physical_memory_write(s->dnad, &status, 1);
807
    lsi_set_phase(s, PHASE_MI);
808
    s->msg_action = 1;
809
    lsi_add_msg_byte(s, 0); /* COMMAND COMPLETE */
810
}
811

    
812
static void lsi_do_msgin(LSIState *s)
813
{
814
    int len;
815
    DPRINTF("Message in len=%d/%d\n", s->dbc, s->msg_len);
816
    s->sfbr = s->msg[0];
817
    len = s->msg_len;
818
    if (len > s->dbc)
819
        len = s->dbc;
820
    cpu_physical_memory_write(s->dnad, s->msg, len);
821
    /* Linux drivers rely on the last byte being in the SIDL.  */
822
    s->sidl = s->msg[len - 1];
823
    s->msg_len -= len;
824
    if (s->msg_len) {
825
        memmove(s->msg, s->msg + len, s->msg_len);
826
    } else {
827
        /* ??? Check if ATN (not yet implemented) is asserted and maybe
828
           switch to PHASE_MO.  */
829
        switch (s->msg_action) {
830
        case 0:
831
            lsi_set_phase(s, PHASE_CMD);
832
            break;
833
        case 1:
834
            lsi_disconnect(s);
835
            break;
836
        case 2:
837
            lsi_set_phase(s, PHASE_DO);
838
            break;
839
        case 3:
840
            lsi_set_phase(s, PHASE_DI);
841
            break;
842
        default:
843
            abort();
844
        }
845
    }
846
}
847

    
848
/* Read the next byte during a MSGOUT phase.  */
849
static uint8_t lsi_get_msgbyte(LSIState *s)
850
{
851
    uint8_t data;
852
    cpu_physical_memory_read(s->dnad, &data, 1);
853
    s->dnad++;
854
    s->dbc--;
855
    return data;
856
}
857

    
858
/* Skip the next n bytes during a MSGOUT phase. */
859
static void lsi_skip_msgbytes(LSIState *s, unsigned int n)
860
{
861
    s->dnad += n;
862
    s->dbc  -= n;
863
}
864

    
865
static void lsi_do_msgout(LSIState *s)
866
{
867
    uint8_t msg;
868
    int len;
869
    uint32_t current_tag;
870
    SCSIDevice *current_dev;
871
    lsi_request *p, *p_next;
872
    int id;
873

    
874
    if (s->current) {
875
        current_tag = s->current->tag;
876
    } else {
877
        current_tag = s->select_tag;
878
    }
879
    id = (current_tag >> 8) & 0xf;
880
    current_dev = s->bus.devs[id];
881

    
882
    DPRINTF("MSG out len=%d\n", s->dbc);
883
    while (s->dbc) {
884
        msg = lsi_get_msgbyte(s);
885
        s->sfbr = msg;
886

    
887
        switch (msg) {
888
        case 0x04:
889
            DPRINTF("MSG: Disconnect\n");
890
            lsi_disconnect(s);
891
            break;
892
        case 0x08:
893
            DPRINTF("MSG: No Operation\n");
894
            lsi_set_phase(s, PHASE_CMD);
895
            break;
896
        case 0x01:
897
            len = lsi_get_msgbyte(s);
898
            msg = lsi_get_msgbyte(s);
899
            (void)len; /* avoid a warning about unused variable*/
900
            DPRINTF("Extended message 0x%x (len %d)\n", msg, len);
901
            switch (msg) {
902
            case 1:
903
                DPRINTF("SDTR (ignored)\n");
904
                lsi_skip_msgbytes(s, 2);
905
                break;
906
            case 3:
907
                DPRINTF("WDTR (ignored)\n");
908
                lsi_skip_msgbytes(s, 1);
909
                break;
910
            default:
911
                goto bad;
912
            }
913
            break;
914
        case 0x20: /* SIMPLE queue */
915
            s->select_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
916
            DPRINTF("SIMPLE queue tag=0x%x\n", s->select_tag & 0xff);
917
            break;
918
        case 0x21: /* HEAD of queue */
919
            BADF("HEAD queue not implemented\n");
920
            s->select_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
921
            break;
922
        case 0x22: /* ORDERED queue */
923
            BADF("ORDERED queue not implemented\n");
924
            s->select_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
925
            break;
926
        case 0x0d:
927
            /* The ABORT TAG message clears the current I/O process only. */
928
            DPRINTF("MSG: ABORT TAG tag=0x%x\n", current_tag);
929
            current_dev->info->cancel_io(current_dev, current_tag);
930
            lsi_disconnect(s);
931
            break;
932
        case 0x06:
933
        case 0x0e:
934
        case 0x0c:
935
            /* The ABORT message clears all I/O processes for the selecting
936
               initiator on the specified logical unit of the target. */
937
            if (msg == 0x06) {
938
                DPRINTF("MSG: ABORT tag=0x%x\n", current_tag);
939
            }
940
            /* The CLEAR QUEUE message clears all I/O processes for all
941
               initiators on the specified logical unit of the target. */
942
            if (msg == 0x0e) {
943
                DPRINTF("MSG: CLEAR QUEUE tag=0x%x\n", current_tag);
944
            }
945
            /* The BUS DEVICE RESET message clears all I/O processes for all
946
               initiators on all logical units of the target. */
947
            if (msg == 0x0c) {
948
                DPRINTF("MSG: BUS DEVICE RESET tag=0x%x\n", current_tag);
949
            }
950

    
951
            /* clear the current I/O process */
952
            current_dev->info->cancel_io(current_dev, current_tag);
953

    
954
            /* As the current implemented devices scsi_disk and scsi_generic
955
               only support one LUN, we don't need to keep track of LUNs.
956
               Clearing I/O processes for other initiators could be possible
957
               for scsi_generic by sending a SG_SCSI_RESET to the /dev/sgX
958
               device, but this is currently not implemented (and seems not
959
               to be really necessary). So let's simply clear all queued
960
               commands for the current device: */
961
            id = current_tag & 0x0000ff00;
962
            QTAILQ_FOREACH_SAFE(p, &s->queue, next, p_next) {
963
                if ((p->tag & 0x0000ff00) == id) {
964
                    current_dev->info->cancel_io(current_dev, p->tag);
965
                    QTAILQ_REMOVE(&s->queue, p, next);
966
                }
967
            }
968

    
969
            lsi_disconnect(s);
970
            break;
971
        default:
972
            if ((msg & 0x80) == 0) {
973
                goto bad;
974
            }
975
            s->current_lun = msg & 7;
976
            DPRINTF("Select LUN %d\n", s->current_lun);
977
            lsi_set_phase(s, PHASE_CMD);
978
            break;
979
        }
980
    }
981
    return;
982
bad:
983
    BADF("Unimplemented message 0x%02x\n", msg);
984
    lsi_set_phase(s, PHASE_MI);
985
    lsi_add_msg_byte(s, 7); /* MESSAGE REJECT */
986
    s->msg_action = 0;
987
}
988

    
989
/* Sign extend a 24-bit value.  */
990
static inline int32_t sxt24(int32_t n)
991
{
992
    return (n << 8) >> 8;
993
}
994

    
995
#define LSI_BUF_SIZE 4096
996
static void lsi_memcpy(LSIState *s, uint32_t dest, uint32_t src, int count)
997
{
998
    int n;
999
    uint8_t buf[LSI_BUF_SIZE];
1000

    
1001
    DPRINTF("memcpy dest 0x%08x src 0x%08x count %d\n", dest, src, count);
1002
    while (count) {
1003
        n = (count > LSI_BUF_SIZE) ? LSI_BUF_SIZE : count;
1004
        cpu_physical_memory_read(src, buf, n);
1005
        cpu_physical_memory_write(dest, buf, n);
1006
        src += n;
1007
        dest += n;
1008
        count -= n;
1009
    }
1010
}
1011

    
1012
static void lsi_wait_reselect(LSIState *s)
1013
{
1014
    lsi_request *p;
1015

    
1016
    DPRINTF("Wait Reselect\n");
1017

    
1018
    QTAILQ_FOREACH(p, &s->queue, next) {
1019
        if (p->pending) {
1020
            lsi_reselect(s, p);
1021
            break;
1022
        }
1023
    }
1024
    if (s->current == NULL) {
1025
        s->waiting = 1;
1026
    }
1027
}
1028

    
1029
static void lsi_execute_script(LSIState *s)
1030
{
1031
    uint32_t insn;
1032
    uint32_t addr, addr_high;
1033
    int opcode;
1034
    int insn_processed = 0;
1035

    
1036
    s->istat1 |= LSI_ISTAT1_SRUN;
1037
again:
1038
    insn_processed++;
1039
    insn = read_dword(s, s->dsp);
1040
    if (!insn) {
1041
        /* If we receive an empty opcode increment the DSP by 4 bytes
1042
           instead of 8 and execute the next opcode at that location */
1043
        s->dsp += 4;
1044
        goto again;
1045
    }
1046
    addr = read_dword(s, s->dsp + 4);
1047
    addr_high = 0;
1048
    DPRINTF("SCRIPTS dsp=%08x opcode %08x arg %08x\n", s->dsp, insn, addr);
1049
    s->dsps = addr;
1050
    s->dcmd = insn >> 24;
1051
    s->dsp += 8;
1052
    switch (insn >> 30) {
1053
    case 0: /* Block move.  */
1054
        if (s->sist1 & LSI_SIST1_STO) {
1055
            DPRINTF("Delayed select timeout\n");
1056
            lsi_stop_script(s);
1057
            break;
1058
        }
1059
        s->dbc = insn & 0xffffff;
1060
        s->rbc = s->dbc;
1061
        /* ??? Set ESA.  */
1062
        s->ia = s->dsp - 8;
1063
        if (insn & (1 << 29)) {
1064
            /* Indirect addressing.  */
1065
            addr = read_dword(s, addr);
1066
        } else if (insn & (1 << 28)) {
1067
            uint32_t buf[2];
1068
            int32_t offset;
1069
            /* Table indirect addressing.  */
1070

    
1071
            /* 32-bit Table indirect */
1072
            offset = sxt24(addr);
1073
            cpu_physical_memory_read(s->dsa + offset, (uint8_t *)buf, 8);
1074
            /* byte count is stored in bits 0:23 only */
1075
            s->dbc = cpu_to_le32(buf[0]) & 0xffffff;
1076
            s->rbc = s->dbc;
1077
            addr = cpu_to_le32(buf[1]);
1078

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

    
1166
    case 1: /* IO or Read/Write instruction.  */
1167
        opcode = (insn >> 27) & 7;
1168
        if (opcode < 5) {
1169
            uint32_t id;
1170

    
1171
            if (insn & (1 << 25)) {
1172
                id = read_dword(s, s->dsa + sxt24(insn));
1173
            } else {
1174
                id = insn;
1175
            }
1176
            id = (id >> 16) & 0xf;
1177
            if (insn & (1 << 26)) {
1178
                addr = s->dsp + sxt24(addr);
1179
            }
1180
            s->dnad = addr;
1181
            switch (opcode) {
1182
            case 0: /* Select */
1183
                s->sdid = id;
1184
                if (s->scntl1 & LSI_SCNTL1_CON) {
1185
                    DPRINTF("Already reselected, jumping to alternative address\n");
1186
                    s->dsp = s->dnad;
1187
                    break;
1188
                }
1189
                s->sstat0 |= LSI_SSTAT0_WOA;
1190
                s->scntl1 &= ~LSI_SCNTL1_IARB;
1191
                if (id >= LSI_MAX_DEVS || !s->bus.devs[id]) {
1192
                    lsi_bad_selection(s, id);
1193
                    break;
1194
                }
1195
                DPRINTF("Selected target %d%s\n",
1196
                        id, insn & (1 << 3) ? " ATN" : "");
1197
                /* ??? Linux drivers compain when this is set.  Maybe
1198
                   it only applies in low-level mode (unimplemented).
1199
                lsi_script_scsi_interrupt(s, LSI_SIST0_CMP, 0); */
1200
                s->select_tag = id << 8;
1201
                s->scntl1 |= LSI_SCNTL1_CON;
1202
                if (insn & (1 << 3)) {
1203
                    s->socl |= LSI_SOCL_ATN;
1204
                }
1205
                lsi_set_phase(s, PHASE_MO);
1206
                break;
1207
            case 1: /* Disconnect */
1208
                DPRINTF("Wait Disconnect\n");
1209
                s->scntl1 &= ~LSI_SCNTL1_CON;
1210
                break;
1211
            case 2: /* Wait Reselect */
1212
                if (!lsi_irq_on_rsl(s)) {
1213
                    lsi_wait_reselect(s);
1214
                }
1215
                break;
1216
            case 3: /* Set */
1217
                DPRINTF("Set%s%s%s%s\n",
1218
                        insn & (1 << 3) ? " ATN" : "",
1219
                        insn & (1 << 6) ? " ACK" : "",
1220
                        insn & (1 << 9) ? " TM" : "",
1221
                        insn & (1 << 10) ? " CC" : "");
1222
                if (insn & (1 << 3)) {
1223
                    s->socl |= LSI_SOCL_ATN;
1224
                    lsi_set_phase(s, PHASE_MO);
1225
                }
1226
                if (insn & (1 << 9)) {
1227
                    BADF("Target mode not implemented\n");
1228
                    exit(1);
1229
                }
1230
                if (insn & (1 << 10))
1231
                    s->carry = 1;
1232
                break;
1233
            case 4: /* Clear */
1234
                DPRINTF("Clear%s%s%s%s\n",
1235
                        insn & (1 << 3) ? " ATN" : "",
1236
                        insn & (1 << 6) ? " ACK" : "",
1237
                        insn & (1 << 9) ? " TM" : "",
1238
                        insn & (1 << 10) ? " CC" : "");
1239
                if (insn & (1 << 3)) {
1240
                    s->socl &= ~LSI_SOCL_ATN;
1241
                }
1242
                if (insn & (1 << 10))
1243
                    s->carry = 0;
1244
                break;
1245
            }
1246
        } else {
1247
            uint8_t op0;
1248
            uint8_t op1;
1249
            uint8_t data8;
1250
            int reg;
1251
            int operator;
1252
#ifdef DEBUG_LSI
1253
            static const char *opcode_names[3] =
1254
                {"Write", "Read", "Read-Modify-Write"};
1255
            static const char *operator_names[8] =
1256
                {"MOV", "SHL", "OR", "XOR", "AND", "SHR", "ADD", "ADC"};
1257
#endif
1258

    
1259
            reg = ((insn >> 16) & 0x7f) | (insn & 0x80);
1260
            data8 = (insn >> 8) & 0xff;
1261
            opcode = (insn >> 27) & 7;
1262
            operator = (insn >> 24) & 7;
1263
            DPRINTF("%s reg 0x%x %s data8=0x%02x sfbr=0x%02x%s\n",
1264
                    opcode_names[opcode - 5], reg,
1265
                    operator_names[operator], data8, s->sfbr,
1266
                    (insn & (1 << 23)) ? " SFBR" : "");
1267
            op0 = op1 = 0;
1268
            switch (opcode) {
1269
            case 5: /* From SFBR */
1270
                op0 = s->sfbr;
1271
                op1 = data8;
1272
                break;
1273
            case 6: /* To SFBR */
1274
                if (operator)
1275
                    op0 = lsi_reg_readb(s, reg);
1276
                op1 = data8;
1277
                break;
1278
            case 7: /* Read-modify-write */
1279
                if (operator)
1280
                    op0 = lsi_reg_readb(s, reg);
1281
                if (insn & (1 << 23)) {
1282
                    op1 = s->sfbr;
1283
                } else {
1284
                    op1 = data8;
1285
                }
1286
                break;
1287
            }
1288

    
1289
            switch (operator) {
1290
            case 0: /* move */
1291
                op0 = op1;
1292
                break;
1293
            case 1: /* Shift left */
1294
                op1 = op0 >> 7;
1295
                op0 = (op0 << 1) | s->carry;
1296
                s->carry = op1;
1297
                break;
1298
            case 2: /* OR */
1299
                op0 |= op1;
1300
                break;
1301
            case 3: /* XOR */
1302
                op0 ^= op1;
1303
                break;
1304
            case 4: /* AND */
1305
                op0 &= op1;
1306
                break;
1307
            case 5: /* SHR */
1308
                op1 = op0 & 1;
1309
                op0 = (op0 >> 1) | (s->carry << 7);
1310
                s->carry = op1;
1311
                break;
1312
            case 6: /* ADD */
1313
                op0 += op1;
1314
                s->carry = op0 < op1;
1315
                break;
1316
            case 7: /* ADC */
1317
                op0 += op1 + s->carry;
1318
                if (s->carry)
1319
                    s->carry = op0 <= op1;
1320
                else
1321
                    s->carry = op0 < op1;
1322
                break;
1323
            }
1324

    
1325
            switch (opcode) {
1326
            case 5: /* From SFBR */
1327
            case 7: /* Read-modify-write */
1328
                lsi_reg_writeb(s, reg, op0);
1329
                break;
1330
            case 6: /* To SFBR */
1331
                s->sfbr = op0;
1332
                break;
1333
            }
1334
        }
1335
        break;
1336

    
1337
    case 2: /* Transfer Control.  */
1338
        {
1339
            int cond;
1340
            int jmp;
1341

    
1342
            if ((insn & 0x002e0000) == 0) {
1343
                DPRINTF("NOP\n");
1344
                break;
1345
            }
1346
            if (s->sist1 & LSI_SIST1_STO) {
1347
                DPRINTF("Delayed select timeout\n");
1348
                lsi_stop_script(s);
1349
                break;
1350
            }
1351
            cond = jmp = (insn & (1 << 19)) != 0;
1352
            if (cond == jmp && (insn & (1 << 21))) {
1353
                DPRINTF("Compare carry %d\n", s->carry == jmp);
1354
                cond = s->carry != 0;
1355
            }
1356
            if (cond == jmp && (insn & (1 << 17))) {
1357
                DPRINTF("Compare phase %d %c= %d\n",
1358
                        (s->sstat1 & PHASE_MASK),
1359
                        jmp ? '=' : '!',
1360
                        ((insn >> 24) & 7));
1361
                cond = (s->sstat1 & PHASE_MASK) == ((insn >> 24) & 7);
1362
            }
1363
            if (cond == jmp && (insn & (1 << 18))) {
1364
                uint8_t mask;
1365

    
1366
                mask = (~insn >> 8) & 0xff;
1367
                DPRINTF("Compare data 0x%x & 0x%x %c= 0x%x\n",
1368
                        s->sfbr, mask, jmp ? '=' : '!', insn & mask);
1369
                cond = (s->sfbr & mask) == (insn & mask);
1370
            }
1371
            if (cond == jmp) {
1372
                if (insn & (1 << 23)) {
1373
                    /* Relative address.  */
1374
                    addr = s->dsp + sxt24(addr);
1375
                }
1376
                switch ((insn >> 27) & 7) {
1377
                case 0: /* Jump */
1378
                    DPRINTF("Jump to 0x%08x\n", addr);
1379
                    s->dsp = addr;
1380
                    break;
1381
                case 1: /* Call */
1382
                    DPRINTF("Call 0x%08x\n", addr);
1383
                    s->temp = s->dsp;
1384
                    s->dsp = addr;
1385
                    break;
1386
                case 2: /* Return */
1387
                    DPRINTF("Return to 0x%08x\n", s->temp);
1388
                    s->dsp = s->temp;
1389
                    break;
1390
                case 3: /* Interrupt */
1391
                    DPRINTF("Interrupt 0x%08x\n", s->dsps);
1392
                    if ((insn & (1 << 20)) != 0) {
1393
                        s->istat0 |= LSI_ISTAT0_INTF;
1394
                        lsi_update_irq(s);
1395
                    } else {
1396
                        lsi_script_dma_interrupt(s, LSI_DSTAT_SIR);
1397
                    }
1398
                    break;
1399
                default:
1400
                    DPRINTF("Illegal transfer control\n");
1401
                    lsi_script_dma_interrupt(s, LSI_DSTAT_IID);
1402
                    break;
1403
                }
1404
            } else {
1405
                DPRINTF("Control condition failed\n");
1406
            }
1407
        }
1408
        break;
1409

    
1410
    case 3:
1411
        if ((insn & (1 << 29)) == 0) {
1412
            /* Memory move.  */
1413
            uint32_t dest;
1414
            /* ??? The docs imply the destination address is loaded into
1415
               the TEMP register.  However the Linux drivers rely on
1416
               the value being presrved.  */
1417
            dest = read_dword(s, s->dsp);
1418
            s->dsp += 4;
1419
            lsi_memcpy(s, dest, addr, insn & 0xffffff);
1420
        } else {
1421
            uint8_t data[7];
1422
            int reg;
1423
            int n;
1424
            int i;
1425

    
1426
            if (insn & (1 << 28)) {
1427
                addr = s->dsa + sxt24(addr);
1428
            }
1429
            n = (insn & 7);
1430
            reg = (insn >> 16) & 0xff;
1431
            if (insn & (1 << 24)) {
1432
                cpu_physical_memory_read(addr, data, n);
1433
                DPRINTF("Load reg 0x%x size %d addr 0x%08x = %08x\n", reg, n,
1434
                        addr, *(int *)data);
1435
                for (i = 0; i < n; i++) {
1436
                    lsi_reg_writeb(s, reg + i, data[i]);
1437
                }
1438
            } else {
1439
                DPRINTF("Store reg 0x%x size %d addr 0x%08x\n", reg, n, addr);
1440
                for (i = 0; i < n; i++) {
1441
                    data[i] = lsi_reg_readb(s, reg + i);
1442
                }
1443
                cpu_physical_memory_write(addr, data, n);
1444
            }
1445
        }
1446
    }
1447
    if (insn_processed > 10000 && !s->waiting) {
1448
        /* Some windows drivers make the device spin waiting for a memory
1449
           location to change.  If we have been executed a lot of code then
1450
           assume this is the case and force an unexpected device disconnect.
1451
           This is apparently sufficient to beat the drivers into submission.
1452
         */
1453
        if (!(s->sien0 & LSI_SIST0_UDC))
1454
            fprintf(stderr, "inf. loop with UDC masked\n");
1455
        lsi_script_scsi_interrupt(s, LSI_SIST0_UDC, 0);
1456
        lsi_disconnect(s);
1457
    } else if (s->istat1 & LSI_ISTAT1_SRUN && !s->waiting) {
1458
        if (s->dcntl & LSI_DCNTL_SSM) {
1459
            lsi_script_dma_interrupt(s, LSI_DSTAT_SSI);
1460
        } else {
1461
            goto again;
1462
        }
1463
    }
1464
    DPRINTF("SCRIPTS execution stopped\n");
1465
}
1466

    
1467
static uint8_t lsi_reg_readb(LSIState *s, int offset)
1468
{
1469
    uint8_t tmp;
1470
#define CASE_GET_REG24(name, addr) \
1471
    case addr: return s->name & 0xff; \
1472
    case addr + 1: return (s->name >> 8) & 0xff; \
1473
    case addr + 2: return (s->name >> 16) & 0xff;
1474

    
1475
#define CASE_GET_REG32(name, addr) \
1476
    case addr: return s->name & 0xff; \
1477
    case addr + 1: return (s->name >> 8) & 0xff; \
1478
    case addr + 2: return (s->name >> 16) & 0xff; \
1479
    case addr + 3: return (s->name >> 24) & 0xff;
1480

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

    
1642
static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val)
1643
{
1644
#define CASE_SET_REG24(name, addr) \
1645
    case addr    : s->name &= 0xffffff00; s->name |= val;       break; \
1646
    case addr + 1: s->name &= 0xffff00ff; s->name |= val << 8;  break; \
1647
    case addr + 2: s->name &= 0xff00ffff; s->name |= val << 16; break;
1648

    
1649
#define CASE_SET_REG32(name, addr) \
1650
    case addr    : s->name &= 0xffffff00; s->name |= val;       break; \
1651
    case addr + 1: s->name &= 0xffff00ff; s->name |= val << 8;  break; \
1652
    case addr + 2: s->name &= 0xff00ffff; s->name |= val << 16; break; \
1653
    case addr + 3: s->name &= 0x00ffffff; s->name |= val << 24; break;
1654

    
1655
#ifdef DEBUG_LSI_REG
1656
    DPRINTF("Write reg %x = %02x\n", offset, val);
1657
#endif
1658
    switch (offset) {
1659
    case 0x00: /* SCNTL0 */
1660
        s->scntl0 = val;
1661
        if (val & LSI_SCNTL0_START) {
1662
            BADF("Start sequence not implemented\n");
1663
        }
1664
        break;
1665
    case 0x01: /* SCNTL1 */
1666
        s->scntl1 = val & ~LSI_SCNTL1_SST;
1667
        if (val & LSI_SCNTL1_IARB) {
1668
            BADF("Immediate Arbritration not implemented\n");
1669
        }
1670
        if (val & LSI_SCNTL1_RST) {
1671
            if (!(s->sstat0 & LSI_SSTAT0_RST)) {
1672
                DeviceState *dev;
1673
                int id;
1674

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

    
1883
static void lsi_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
1884
{
1885
    LSIState *s = opaque;
1886

    
1887
    lsi_reg_writeb(s, addr & 0xff, val);
1888
}
1889

    
1890
static void lsi_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
1891
{
1892
    LSIState *s = opaque;
1893

    
1894
    addr &= 0xff;
1895
    lsi_reg_writeb(s, addr, val & 0xff);
1896
    lsi_reg_writeb(s, addr + 1, (val >> 8) & 0xff);
1897
}
1898

    
1899
static void lsi_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
1900
{
1901
    LSIState *s = opaque;
1902

    
1903
    addr &= 0xff;
1904
    lsi_reg_writeb(s, addr, val & 0xff);
1905
    lsi_reg_writeb(s, addr + 1, (val >> 8) & 0xff);
1906
    lsi_reg_writeb(s, addr + 2, (val >> 16) & 0xff);
1907
    lsi_reg_writeb(s, addr + 3, (val >> 24) & 0xff);
1908
}
1909

    
1910
static uint32_t lsi_mmio_readb(void *opaque, target_phys_addr_t addr)
1911
{
1912
    LSIState *s = opaque;
1913

    
1914
    return lsi_reg_readb(s, addr & 0xff);
1915
}
1916

    
1917
static uint32_t lsi_mmio_readw(void *opaque, target_phys_addr_t addr)
1918
{
1919
    LSIState *s = opaque;
1920
    uint32_t val;
1921

    
1922
    addr &= 0xff;
1923
    val = lsi_reg_readb(s, addr);
1924
    val |= lsi_reg_readb(s, addr + 1) << 8;
1925
    return val;
1926
}
1927

    
1928
static uint32_t lsi_mmio_readl(void *opaque, target_phys_addr_t addr)
1929
{
1930
    LSIState *s = opaque;
1931
    uint32_t val;
1932
    addr &= 0xff;
1933
    val = lsi_reg_readb(s, addr);
1934
    val |= lsi_reg_readb(s, addr + 1) << 8;
1935
    val |= lsi_reg_readb(s, addr + 2) << 16;
1936
    val |= lsi_reg_readb(s, addr + 3) << 24;
1937
    return val;
1938
}
1939

    
1940
static CPUReadMemoryFunc * const lsi_mmio_readfn[3] = {
1941
    lsi_mmio_readb,
1942
    lsi_mmio_readw,
1943
    lsi_mmio_readl,
1944
};
1945

    
1946
static CPUWriteMemoryFunc * const lsi_mmio_writefn[3] = {
1947
    lsi_mmio_writeb,
1948
    lsi_mmio_writew,
1949
    lsi_mmio_writel,
1950
};
1951

    
1952
static void lsi_ram_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
1953
{
1954
    LSIState *s = opaque;
1955
    uint32_t newval;
1956
    int shift;
1957

    
1958
    addr &= 0x1fff;
1959
    newval = s->script_ram[addr >> 2];
1960
    shift = (addr & 3) * 8;
1961
    newval &= ~(0xff << shift);
1962
    newval |= val << shift;
1963
    s->script_ram[addr >> 2] = newval;
1964
}
1965

    
1966
static void lsi_ram_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
1967
{
1968
    LSIState *s = opaque;
1969
    uint32_t newval;
1970

    
1971
    addr &= 0x1fff;
1972
    newval = s->script_ram[addr >> 2];
1973
    if (addr & 2) {
1974
        newval = (newval & 0xffff) | (val << 16);
1975
    } else {
1976
        newval = (newval & 0xffff0000) | val;
1977
    }
1978
    s->script_ram[addr >> 2] = newval;
1979
}
1980

    
1981

    
1982
static void lsi_ram_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
1983
{
1984
    LSIState *s = opaque;
1985

    
1986
    addr &= 0x1fff;
1987
    s->script_ram[addr >> 2] = val;
1988
}
1989

    
1990
static uint32_t lsi_ram_readb(void *opaque, target_phys_addr_t addr)
1991
{
1992
    LSIState *s = opaque;
1993
    uint32_t val;
1994

    
1995
    addr &= 0x1fff;
1996
    val = s->script_ram[addr >> 2];
1997
    val >>= (addr & 3) * 8;
1998
    return val & 0xff;
1999
}
2000

    
2001
static uint32_t lsi_ram_readw(void *opaque, target_phys_addr_t addr)
2002
{
2003
    LSIState *s = opaque;
2004
    uint32_t val;
2005

    
2006
    addr &= 0x1fff;
2007
    val = s->script_ram[addr >> 2];
2008
    if (addr & 2)
2009
        val >>= 16;
2010
    return val;
2011
}
2012

    
2013
static uint32_t lsi_ram_readl(void *opaque, target_phys_addr_t addr)
2014
{
2015
    LSIState *s = opaque;
2016

    
2017
    addr &= 0x1fff;
2018
    return s->script_ram[addr >> 2];
2019
}
2020

    
2021
static CPUReadMemoryFunc * const lsi_ram_readfn[3] = {
2022
    lsi_ram_readb,
2023
    lsi_ram_readw,
2024
    lsi_ram_readl,
2025
};
2026

    
2027
static CPUWriteMemoryFunc * const lsi_ram_writefn[3] = {
2028
    lsi_ram_writeb,
2029
    lsi_ram_writew,
2030
    lsi_ram_writel,
2031
};
2032

    
2033
static uint32_t lsi_io_readb(void *opaque, uint32_t addr)
2034
{
2035
    LSIState *s = opaque;
2036
    return lsi_reg_readb(s, addr & 0xff);
2037
}
2038

    
2039
static uint32_t lsi_io_readw(void *opaque, uint32_t addr)
2040
{
2041
    LSIState *s = opaque;
2042
    uint32_t val;
2043
    addr &= 0xff;
2044
    val = lsi_reg_readb(s, addr);
2045
    val |= lsi_reg_readb(s, addr + 1) << 8;
2046
    return val;
2047
}
2048

    
2049
static uint32_t lsi_io_readl(void *opaque, uint32_t addr)
2050
{
2051
    LSIState *s = opaque;
2052
    uint32_t val;
2053
    addr &= 0xff;
2054
    val = lsi_reg_readb(s, addr);
2055
    val |= lsi_reg_readb(s, addr + 1) << 8;
2056
    val |= lsi_reg_readb(s, addr + 2) << 16;
2057
    val |= lsi_reg_readb(s, addr + 3) << 24;
2058
    return val;
2059
}
2060

    
2061
static void lsi_io_writeb(void *opaque, uint32_t addr, uint32_t val)
2062
{
2063
    LSIState *s = opaque;
2064
    lsi_reg_writeb(s, addr & 0xff, val);
2065
}
2066

    
2067
static void lsi_io_writew(void *opaque, uint32_t addr, uint32_t val)
2068
{
2069
    LSIState *s = opaque;
2070
    addr &= 0xff;
2071
    lsi_reg_writeb(s, addr, val & 0xff);
2072
    lsi_reg_writeb(s, addr + 1, (val >> 8) & 0xff);
2073
}
2074

    
2075
static void lsi_io_writel(void *opaque, uint32_t addr, uint32_t val)
2076
{
2077
    LSIState *s = opaque;
2078
    addr &= 0xff;
2079
    lsi_reg_writeb(s, addr, val & 0xff);
2080
    lsi_reg_writeb(s, addr + 1, (val >> 8) & 0xff);
2081
    lsi_reg_writeb(s, addr + 2, (val >> 16) & 0xff);
2082
    lsi_reg_writeb(s, addr + 3, (val >> 24) & 0xff);
2083
}
2084

    
2085
static void lsi_io_mapfunc(PCIDevice *pci_dev, int region_num,
2086
                           pcibus_t addr, pcibus_t size, int type)
2087
{
2088
    LSIState *s = DO_UPCAST(LSIState, dev, pci_dev);
2089

    
2090
    DPRINTF("Mapping IO at %08"FMT_PCIBUS"\n", addr);
2091

    
2092
    register_ioport_write(addr, 256, 1, lsi_io_writeb, s);
2093
    register_ioport_read(addr, 256, 1, lsi_io_readb, s);
2094
    register_ioport_write(addr, 256, 2, lsi_io_writew, s);
2095
    register_ioport_read(addr, 256, 2, lsi_io_readw, s);
2096
    register_ioport_write(addr, 256, 4, lsi_io_writel, s);
2097
    register_ioport_read(addr, 256, 4, lsi_io_readl, s);
2098
}
2099

    
2100
static void lsi_ram_mapfunc(PCIDevice *pci_dev, int region_num,
2101
                            pcibus_t addr, pcibus_t size, int type)
2102
{
2103
    LSIState *s = DO_UPCAST(LSIState, dev, pci_dev);
2104

    
2105
    DPRINTF("Mapping ram at %08"FMT_PCIBUS"\n", addr);
2106
    s->script_ram_base = addr;
2107
    cpu_register_physical_memory(addr + 0, 0x2000, s->ram_io_addr);
2108
}
2109

    
2110
static void lsi_scsi_reset(DeviceState *dev)
2111
{
2112
    LSIState *s = DO_UPCAST(LSIState, dev.qdev, dev);
2113

    
2114
    lsi_soft_reset(s);
2115
}
2116

    
2117
static void lsi_pre_save(void *opaque)
2118
{
2119
    LSIState *s = opaque;
2120

    
2121
    if (s->current) {
2122
        assert(s->current->dma_buf == NULL);
2123
        assert(s->current->dma_len == 0);
2124
    }
2125
    assert(QTAILQ_EMPTY(&s->queue));
2126
}
2127

    
2128
static const VMStateDescription vmstate_lsi_scsi = {
2129
    .name = "lsiscsi",
2130
    .version_id = 0,
2131
    .minimum_version_id = 0,
2132
    .minimum_version_id_old = 0,
2133
    .pre_save = lsi_pre_save,
2134
    .fields      = (VMStateField []) {
2135
        VMSTATE_PCI_DEVICE(dev, LSIState),
2136

    
2137
        VMSTATE_INT32(carry, LSIState),
2138
        VMSTATE_INT32(status, LSIState),
2139
        VMSTATE_INT32(msg_action, LSIState),
2140
        VMSTATE_INT32(msg_len, LSIState),
2141
        VMSTATE_BUFFER(msg, LSIState),
2142
        VMSTATE_INT32(waiting, LSIState),
2143

    
2144
        VMSTATE_UINT32(dsa, LSIState),
2145
        VMSTATE_UINT32(temp, LSIState),
2146
        VMSTATE_UINT32(dnad, LSIState),
2147
        VMSTATE_UINT32(dbc, LSIState),
2148
        VMSTATE_UINT8(istat0, LSIState),
2149
        VMSTATE_UINT8(istat1, LSIState),
2150
        VMSTATE_UINT8(dcmd, LSIState),
2151
        VMSTATE_UINT8(dstat, LSIState),
2152
        VMSTATE_UINT8(dien, LSIState),
2153
        VMSTATE_UINT8(sist0, LSIState),
2154
        VMSTATE_UINT8(sist1, LSIState),
2155
        VMSTATE_UINT8(sien0, LSIState),
2156
        VMSTATE_UINT8(sien1, LSIState),
2157
        VMSTATE_UINT8(mbox0, LSIState),
2158
        VMSTATE_UINT8(mbox1, LSIState),
2159
        VMSTATE_UINT8(dfifo, LSIState),
2160
        VMSTATE_UINT8(ctest2, LSIState),
2161
        VMSTATE_UINT8(ctest3, LSIState),
2162
        VMSTATE_UINT8(ctest4, LSIState),
2163
        VMSTATE_UINT8(ctest5, LSIState),
2164
        VMSTATE_UINT8(ccntl0, LSIState),
2165
        VMSTATE_UINT8(ccntl1, LSIState),
2166
        VMSTATE_UINT32(dsp, LSIState),
2167
        VMSTATE_UINT32(dsps, LSIState),
2168
        VMSTATE_UINT8(dmode, LSIState),
2169
        VMSTATE_UINT8(dcntl, LSIState),
2170
        VMSTATE_UINT8(scntl0, LSIState),
2171
        VMSTATE_UINT8(scntl1, LSIState),
2172
        VMSTATE_UINT8(scntl2, LSIState),
2173
        VMSTATE_UINT8(scntl3, LSIState),
2174
        VMSTATE_UINT8(sstat0, LSIState),
2175
        VMSTATE_UINT8(sstat1, LSIState),
2176
        VMSTATE_UINT8(scid, LSIState),
2177
        VMSTATE_UINT8(sxfer, LSIState),
2178
        VMSTATE_UINT8(socl, LSIState),
2179
        VMSTATE_UINT8(sdid, LSIState),
2180
        VMSTATE_UINT8(ssid, LSIState),
2181
        VMSTATE_UINT8(sfbr, LSIState),
2182
        VMSTATE_UINT8(stest1, LSIState),
2183
        VMSTATE_UINT8(stest2, LSIState),
2184
        VMSTATE_UINT8(stest3, LSIState),
2185
        VMSTATE_UINT8(sidl, LSIState),
2186
        VMSTATE_UINT8(stime0, LSIState),
2187
        VMSTATE_UINT8(respid0, LSIState),
2188
        VMSTATE_UINT8(respid1, LSIState),
2189
        VMSTATE_UINT32(mmrs, LSIState),
2190
        VMSTATE_UINT32(mmws, LSIState),
2191
        VMSTATE_UINT32(sfs, LSIState),
2192
        VMSTATE_UINT32(drs, LSIState),
2193
        VMSTATE_UINT32(sbms, LSIState),
2194
        VMSTATE_UINT32(dbms, LSIState),
2195
        VMSTATE_UINT32(dnad64, LSIState),
2196
        VMSTATE_UINT32(pmjad1, LSIState),
2197
        VMSTATE_UINT32(pmjad2, LSIState),
2198
        VMSTATE_UINT32(rbc, LSIState),
2199
        VMSTATE_UINT32(ua, LSIState),
2200
        VMSTATE_UINT32(ia, LSIState),
2201
        VMSTATE_UINT32(sbc, LSIState),
2202
        VMSTATE_UINT32(csbc, LSIState),
2203
        VMSTATE_BUFFER_UNSAFE(scratch, LSIState, 0, 18 * sizeof(uint32_t)),
2204
        VMSTATE_UINT8(sbr, LSIState),
2205

    
2206
        VMSTATE_BUFFER_UNSAFE(script_ram, LSIState, 0, 2048 * sizeof(uint32_t)),
2207
        VMSTATE_END_OF_LIST()
2208
    }
2209
};
2210

    
2211
static int lsi_scsi_uninit(PCIDevice *d)
2212
{
2213
    LSIState *s = DO_UPCAST(LSIState, dev, d);
2214

    
2215
    cpu_unregister_io_memory(s->mmio_io_addr);
2216
    cpu_unregister_io_memory(s->ram_io_addr);
2217

    
2218
    return 0;
2219
}
2220

    
2221
static const struct SCSIBusOps lsi_scsi_ops = {
2222
    .complete = lsi_command_complete
2223
};
2224

    
2225
static int lsi_scsi_init(PCIDevice *dev)
2226
{
2227
    LSIState *s = DO_UPCAST(LSIState, dev, dev);
2228
    uint8_t *pci_conf;
2229

    
2230
    pci_conf = s->dev.config;
2231

    
2232
    /* PCI Vendor ID (word) */
2233
    pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_LSI_LOGIC);
2234
    /* PCI device ID (word) */
2235
    pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_LSI_53C895A);
2236
    /* PCI base class code */
2237
    pci_config_set_class(pci_conf, PCI_CLASS_STORAGE_SCSI);
2238
    /* PCI subsystem ID */
2239
    pci_conf[PCI_SUBSYSTEM_ID] = 0x00;
2240
    pci_conf[PCI_SUBSYSTEM_ID + 1] = 0x10;
2241
    /* PCI latency timer = 255 */
2242
    pci_conf[PCI_LATENCY_TIMER] = 0xff;
2243
    /* TODO: RST# value should be 0 */
2244
    /* Interrupt pin 1 */
2245
    pci_conf[PCI_INTERRUPT_PIN] = 0x01;
2246

    
2247
    s->mmio_io_addr = cpu_register_io_memory(lsi_mmio_readfn,
2248
                                             lsi_mmio_writefn, s,
2249
                                             DEVICE_NATIVE_ENDIAN);
2250
    s->ram_io_addr = cpu_register_io_memory(lsi_ram_readfn,
2251
                                            lsi_ram_writefn, s,
2252
                                            DEVICE_NATIVE_ENDIAN);
2253

    
2254
    pci_register_bar(&s->dev, 0, 256,
2255
                           PCI_BASE_ADDRESS_SPACE_IO, lsi_io_mapfunc);
2256
    pci_register_bar_simple(&s->dev, 1, 0x400, 0, s->mmio_io_addr);
2257
    pci_register_bar(&s->dev, 2, 0x2000,
2258
                           PCI_BASE_ADDRESS_SPACE_MEMORY, lsi_ram_mapfunc);
2259
    QTAILQ_INIT(&s->queue);
2260

    
2261
    scsi_bus_new(&s->bus, &dev->qdev, 1, LSI_MAX_DEVS, &lsi_scsi_ops);
2262
    if (!dev->qdev.hotplugged) {
2263
        return scsi_bus_legacy_handle_cmdline(&s->bus);
2264
    }
2265
    return 0;
2266
}
2267

    
2268
static PCIDeviceInfo lsi_info = {
2269
    .qdev.name  = "lsi53c895a",
2270
    .qdev.alias = "lsi",
2271
    .qdev.size  = sizeof(LSIState),
2272
    .qdev.reset = lsi_scsi_reset,
2273
    .qdev.vmsd  = &vmstate_lsi_scsi,
2274
    .init       = lsi_scsi_init,
2275
    .exit       = lsi_scsi_uninit,
2276
};
2277

    
2278
static void lsi53c895a_register_devices(void)
2279
{
2280
    pci_qdev_register(&lsi_info);
2281
}
2282

    
2283
device_init(lsi53c895a_register_devices);