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