symbian-qemu-0.9.1-12/qemu-symbian-svp/hw/lsi53c895a.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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 "hw.h"
       
    14 #include "pci.h"
       
    15 #include "scsi-disk.h"
       
    16 
       
    17 //#define DEBUG_LSI
       
    18 //#define DEBUG_LSI_REG
       
    19 
       
    20 #ifdef DEBUG_LSI
       
    21 #define DPRINTF(fmt, args...) \
       
    22 do { printf("lsi_scsi: " fmt , ##args); } while (0)
       
    23 #define BADF(fmt, args...) \
       
    24 do { fprintf(stderr, "lsi_scsi: error: " fmt , ##args); exit(1);} while (0)
       
    25 #else
       
    26 #define DPRINTF(fmt, args...) do {} while(0)
       
    27 #define BADF(fmt, args...) \
       
    28 do { fprintf(stderr, "lsi_scsi: error: " fmt , ##args);} while (0)
       
    29 #endif
       
    30 
       
    31 #define LSI_SCNTL0_TRG    0x01
       
    32 #define LSI_SCNTL0_AAP    0x02
       
    33 #define LSI_SCNTL0_EPC    0x08
       
    34 #define LSI_SCNTL0_WATN   0x10
       
    35 #define LSI_SCNTL0_START  0x20
       
    36 
       
    37 #define LSI_SCNTL1_SST    0x01
       
    38 #define LSI_SCNTL1_IARB   0x02
       
    39 #define LSI_SCNTL1_AESP   0x04
       
    40 #define LSI_SCNTL1_RST    0x08
       
    41 #define LSI_SCNTL1_CON    0x10
       
    42 #define LSI_SCNTL1_DHP    0x20
       
    43 #define LSI_SCNTL1_ADB    0x40
       
    44 #define LSI_SCNTL1_EXC    0x80
       
    45 
       
    46 #define LSI_SCNTL2_WSR    0x01
       
    47 #define LSI_SCNTL2_VUE0   0x02
       
    48 #define LSI_SCNTL2_VUE1   0x04
       
    49 #define LSI_SCNTL2_WSS    0x08
       
    50 #define LSI_SCNTL2_SLPHBEN 0x10
       
    51 #define LSI_SCNTL2_SLPMD  0x20
       
    52 #define LSI_SCNTL2_CHM    0x40
       
    53 #define LSI_SCNTL2_SDU    0x80
       
    54 
       
    55 #define LSI_ISTAT0_DIP    0x01
       
    56 #define LSI_ISTAT0_SIP    0x02
       
    57 #define LSI_ISTAT0_INTF   0x04
       
    58 #define LSI_ISTAT0_CON    0x08
       
    59 #define LSI_ISTAT0_SEM    0x10
       
    60 #define LSI_ISTAT0_SIGP   0x20
       
    61 #define LSI_ISTAT0_SRST   0x40
       
    62 #define LSI_ISTAT0_ABRT   0x80
       
    63 
       
    64 #define LSI_ISTAT1_SI     0x01
       
    65 #define LSI_ISTAT1_SRUN   0x02
       
    66 #define LSI_ISTAT1_FLSH   0x04
       
    67 
       
    68 #define LSI_SSTAT0_SDP0   0x01
       
    69 #define LSI_SSTAT0_RST    0x02
       
    70 #define LSI_SSTAT0_WOA    0x04
       
    71 #define LSI_SSTAT0_LOA    0x08
       
    72 #define LSI_SSTAT0_AIP    0x10
       
    73 #define LSI_SSTAT0_OLF    0x20
       
    74 #define LSI_SSTAT0_ORF    0x40
       
    75 #define LSI_SSTAT0_ILF    0x80
       
    76 
       
    77 #define LSI_SIST0_PAR     0x01
       
    78 #define LSI_SIST0_RST     0x02
       
    79 #define LSI_SIST0_UDC     0x04
       
    80 #define LSI_SIST0_SGE     0x08
       
    81 #define LSI_SIST0_RSL     0x10
       
    82 #define LSI_SIST0_SEL     0x20
       
    83 #define LSI_SIST0_CMP     0x40
       
    84 #define LSI_SIST0_MA      0x80
       
    85 
       
    86 #define LSI_SIST1_HTH     0x01
       
    87 #define LSI_SIST1_GEN     0x02
       
    88 #define LSI_SIST1_STO     0x04
       
    89 #define LSI_SIST1_SBMC    0x10
       
    90 
       
    91 #define LSI_SOCL_IO       0x01
       
    92 #define LSI_SOCL_CD       0x02
       
    93 #define LSI_SOCL_MSG      0x04
       
    94 #define LSI_SOCL_ATN      0x08
       
    95 #define LSI_SOCL_SEL      0x10
       
    96 #define LSI_SOCL_BSY      0x20
       
    97 #define LSI_SOCL_ACK      0x40
       
    98 #define LSI_SOCL_REQ      0x80
       
    99 
       
   100 #define LSI_DSTAT_IID     0x01
       
   101 #define LSI_DSTAT_SIR     0x04
       
   102 #define LSI_DSTAT_SSI     0x08
       
   103 #define LSI_DSTAT_ABRT    0x10
       
   104 #define LSI_DSTAT_BF      0x20
       
   105 #define LSI_DSTAT_MDPE    0x40
       
   106 #define LSI_DSTAT_DFE     0x80
       
   107 
       
   108 #define LSI_DCNTL_COM     0x01
       
   109 #define LSI_DCNTL_IRQD    0x02
       
   110 #define LSI_DCNTL_STD     0x04
       
   111 #define LSI_DCNTL_IRQM    0x08
       
   112 #define LSI_DCNTL_SSM     0x10
       
   113 #define LSI_DCNTL_PFEN    0x20
       
   114 #define LSI_DCNTL_PFF     0x40
       
   115 #define LSI_DCNTL_CLSE    0x80
       
   116 
       
   117 #define LSI_DMODE_MAN     0x01
       
   118 #define LSI_DMODE_BOF     0x02
       
   119 #define LSI_DMODE_ERMP    0x04
       
   120 #define LSI_DMODE_ERL     0x08
       
   121 #define LSI_DMODE_DIOM    0x10
       
   122 #define LSI_DMODE_SIOM    0x20
       
   123 
       
   124 #define LSI_CTEST2_DACK   0x01
       
   125 #define LSI_CTEST2_DREQ   0x02
       
   126 #define LSI_CTEST2_TEOP   0x04
       
   127 #define LSI_CTEST2_PCICIE 0x08
       
   128 #define LSI_CTEST2_CM     0x10
       
   129 #define LSI_CTEST2_CIO    0x20
       
   130 #define LSI_CTEST2_SIGP   0x40
       
   131 #define LSI_CTEST2_DDIR   0x80
       
   132 
       
   133 #define LSI_CTEST5_BL2    0x04
       
   134 #define LSI_CTEST5_DDIR   0x08
       
   135 #define LSI_CTEST5_MASR   0x10
       
   136 #define LSI_CTEST5_DFSN   0x20
       
   137 #define LSI_CTEST5_BBCK   0x40
       
   138 #define LSI_CTEST5_ADCK   0x80
       
   139 
       
   140 #define LSI_CCNTL0_DILS   0x01
       
   141 #define LSI_CCNTL0_DISFC  0x10
       
   142 #define LSI_CCNTL0_ENNDJ  0x20
       
   143 #define LSI_CCNTL0_PMJCTL 0x40
       
   144 #define LSI_CCNTL0_ENPMJ  0x80
       
   145 
       
   146 #define LSI_CCNTL1_EN64DBMV  0x01
       
   147 #define LSI_CCNTL1_EN64TIBMV 0x02
       
   148 #define LSI_CCNTL1_64TIMOD   0x04
       
   149 #define LSI_CCNTL1_DDAC      0x08
       
   150 #define LSI_CCNTL1_ZMOD      0x80
       
   151 
       
   152 #define LSI_CCNTL1_40BIT (LSI_CCNTL1_EN64TIBMV|LSI_CCNTL1_64TIMOD)
       
   153 
       
   154 #define PHASE_DO          0
       
   155 #define PHASE_DI          1
       
   156 #define PHASE_CMD         2
       
   157 #define PHASE_ST          3
       
   158 #define PHASE_MO          6
       
   159 #define PHASE_MI          7
       
   160 #define PHASE_MASK        7
       
   161 
       
   162 /* Maximum length of MSG IN data.  */
       
   163 #define LSI_MAX_MSGIN_LEN 8
       
   164 
       
   165 /* Flag set if this is a tagged command.  */
       
   166 #define LSI_TAG_VALID     (1 << 16)
       
   167 
       
   168 typedef struct {
       
   169     uint32_t tag;
       
   170     uint32_t pending;
       
   171     int out;
       
   172 } lsi_queue;
       
   173 
       
   174 typedef struct {
       
   175     PCIDevice pci_dev;
       
   176     int mmio_io_addr;
       
   177     int ram_io_addr;
       
   178     uint32_t script_ram_base;
       
   179 
       
   180     int carry; /* ??? Should this be an a visible register somewhere?  */
       
   181     int sense;
       
   182     /* Action to take at the end of a MSG IN phase.
       
   183        0 = COMMAND, 1 = disconect, 2 = DATA OUT, 3 = DATA IN.  */
       
   184     int msg_action;
       
   185     int msg_len;
       
   186     uint8_t msg[LSI_MAX_MSGIN_LEN];
       
   187     /* 0 if SCRIPTS are running or stopped.
       
   188      * 1 if a Wait Reselect instruction has been issued.
       
   189      * 2 if processing DMA from lsi_execute_script.
       
   190      * 3 if a DMA operation is in progress.  */
       
   191     int waiting;
       
   192     SCSIDevice *scsi_dev[LSI_MAX_DEVS];
       
   193     SCSIDevice *current_dev;
       
   194     int current_lun;
       
   195     /* The tag is a combination of the device ID and the SCSI tag.  */
       
   196     uint32_t current_tag;
       
   197     uint32_t current_dma_len;
       
   198     int command_complete;
       
   199     uint8_t *dma_buf;
       
   200     lsi_queue *queue;
       
   201     int queue_len;
       
   202     int active_commands;
       
   203 
       
   204     uint32_t dsa;
       
   205     uint32_t temp;
       
   206     uint32_t dnad;
       
   207     uint32_t dbc;
       
   208     uint8_t istat0;
       
   209     uint8_t istat1;
       
   210     uint8_t dcmd;
       
   211     uint8_t dstat;
       
   212     uint8_t dien;
       
   213     uint8_t sist0;
       
   214     uint8_t sist1;
       
   215     uint8_t sien0;
       
   216     uint8_t sien1;
       
   217     uint8_t mbox0;
       
   218     uint8_t mbox1;
       
   219     uint8_t dfifo;
       
   220     uint8_t ctest2;
       
   221     uint8_t ctest3;
       
   222     uint8_t ctest4;
       
   223     uint8_t ctest5;
       
   224     uint8_t ccntl0;
       
   225     uint8_t ccntl1;
       
   226     uint32_t dsp;
       
   227     uint32_t dsps;
       
   228     uint8_t dmode;
       
   229     uint8_t dcntl;
       
   230     uint8_t scntl0;
       
   231     uint8_t scntl1;
       
   232     uint8_t scntl2;
       
   233     uint8_t scntl3;
       
   234     uint8_t sstat0;
       
   235     uint8_t sstat1;
       
   236     uint8_t scid;
       
   237     uint8_t sxfer;
       
   238     uint8_t socl;
       
   239     uint8_t sdid;
       
   240     uint8_t ssid;
       
   241     uint8_t sfbr;
       
   242     uint8_t stest1;
       
   243     uint8_t stest2;
       
   244     uint8_t stest3;
       
   245     uint8_t sidl;
       
   246     uint8_t stime0;
       
   247     uint8_t respid0;
       
   248     uint8_t respid1;
       
   249     uint32_t mmrs;
       
   250     uint32_t mmws;
       
   251     uint32_t sfs;
       
   252     uint32_t drs;
       
   253     uint32_t sbms;
       
   254     uint32_t dbms;
       
   255     uint32_t dnad64;
       
   256     uint32_t pmjad1;
       
   257     uint32_t pmjad2;
       
   258     uint32_t rbc;
       
   259     uint32_t ua;
       
   260     uint32_t ia;
       
   261     uint32_t sbc;
       
   262     uint32_t csbc;
       
   263     uint32_t scratch[18]; /* SCRATCHA-SCRATCHR */
       
   264 
       
   265     /* Script ram is stored as 32-bit words in host byteorder.  */
       
   266     uint32_t script_ram[2048];
       
   267 } LSIState;
       
   268 
       
   269 static void lsi_soft_reset(LSIState *s)
       
   270 {
       
   271     DPRINTF("Reset\n");
       
   272     s->carry = 0;
       
   273 
       
   274     s->waiting = 0;
       
   275     s->dsa = 0;
       
   276     s->dnad = 0;
       
   277     s->dbc = 0;
       
   278     s->temp = 0;
       
   279     memset(s->scratch, 0, sizeof(s->scratch));
       
   280     s->istat0 = 0;
       
   281     s->istat1 = 0;
       
   282     s->dcmd = 0;
       
   283     s->dstat = 0;
       
   284     s->dien = 0;
       
   285     s->sist0 = 0;
       
   286     s->sist1 = 0;
       
   287     s->sien0 = 0;
       
   288     s->sien1 = 0;
       
   289     s->mbox0 = 0;
       
   290     s->mbox1 = 0;
       
   291     s->dfifo = 0;
       
   292     s->ctest2 = 0;
       
   293     s->ctest3 = 0;
       
   294     s->ctest4 = 0;
       
   295     s->ctest5 = 0;
       
   296     s->ccntl0 = 0;
       
   297     s->ccntl1 = 0;
       
   298     s->dsp = 0;
       
   299     s->dsps = 0;
       
   300     s->dmode = 0;
       
   301     s->dcntl = 0;
       
   302     s->scntl0 = 0xc0;
       
   303     s->scntl1 = 0;
       
   304     s->scntl2 = 0;
       
   305     s->scntl3 = 0;
       
   306     s->sstat0 = 0;
       
   307     s->sstat1 = 0;
       
   308     s->scid = 7;
       
   309     s->sxfer = 0;
       
   310     s->socl = 0;
       
   311     s->stest1 = 0;
       
   312     s->stest2 = 0;
       
   313     s->stest3 = 0;
       
   314     s->sidl = 0;
       
   315     s->stime0 = 0;
       
   316     s->respid0 = 0x80;
       
   317     s->respid1 = 0;
       
   318     s->mmrs = 0;
       
   319     s->mmws = 0;
       
   320     s->sfs = 0;
       
   321     s->drs = 0;
       
   322     s->sbms = 0;
       
   323     s->dbms = 0;
       
   324     s->dnad64 = 0;
       
   325     s->pmjad1 = 0;
       
   326     s->pmjad2 = 0;
       
   327     s->rbc = 0;
       
   328     s->ua = 0;
       
   329     s->ia = 0;
       
   330     s->sbc = 0;
       
   331     s->csbc = 0;
       
   332 }
       
   333 
       
   334 static int lsi_dma_40bit(LSIState *s)
       
   335 {
       
   336     if ((s->ccntl1 & LSI_CCNTL1_40BIT) == LSI_CCNTL1_40BIT)
       
   337         return 1;
       
   338     return 0;
       
   339 }
       
   340 
       
   341 static int lsi_dma_ti64bit(LSIState *s)
       
   342 {
       
   343     if ((s->ccntl1 & LSI_CCNTL1_EN64TIBMV) == LSI_CCNTL1_EN64TIBMV)
       
   344         return 1;
       
   345     return 0;
       
   346 }
       
   347 
       
   348 static int lsi_dma_64bit(LSIState *s)
       
   349 {
       
   350     if ((s->ccntl1 & LSI_CCNTL1_EN64DBMV) == LSI_CCNTL1_EN64DBMV)
       
   351         return 1;
       
   352     return 0;
       
   353 }
       
   354 
       
   355 static uint8_t lsi_reg_readb(LSIState *s, int offset);
       
   356 static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val);
       
   357 static void lsi_execute_script(LSIState *s);
       
   358 
       
   359 static inline uint32_t read_dword(LSIState *s, uint32_t addr)
       
   360 {
       
   361     uint32_t buf;
       
   362 
       
   363     /* Optimize reading from SCRIPTS RAM.  */
       
   364     if ((addr & 0xffffe000) == s->script_ram_base) {
       
   365         return s->script_ram[(addr & 0x1fff) >> 2];
       
   366     }
       
   367     cpu_physical_memory_read(addr, (uint8_t *)&buf, 4);
       
   368     return cpu_to_le32(buf);
       
   369 }
       
   370 
       
   371 static void lsi_stop_script(LSIState *s)
       
   372 {
       
   373     s->istat1 &= ~LSI_ISTAT1_SRUN;
       
   374 }
       
   375 
       
   376 static void lsi_update_irq(LSIState *s)
       
   377 {
       
   378     int level;
       
   379     static int last_level;
       
   380 
       
   381     /* It's unclear whether the DIP/SIP bits should be cleared when the
       
   382        Interrupt Status Registers are cleared or when istat0 is read.
       
   383        We currently do the formwer, which seems to work.  */
       
   384     level = 0;
       
   385     if (s->dstat) {
       
   386         if (s->dstat & s->dien)
       
   387             level = 1;
       
   388         s->istat0 |= LSI_ISTAT0_DIP;
       
   389     } else {
       
   390         s->istat0 &= ~LSI_ISTAT0_DIP;
       
   391     }
       
   392 
       
   393     if (s->sist0 || s->sist1) {
       
   394         if ((s->sist0 & s->sien0) || (s->sist1 & s->sien1))
       
   395             level = 1;
       
   396         s->istat0 |= LSI_ISTAT0_SIP;
       
   397     } else {
       
   398         s->istat0 &= ~LSI_ISTAT0_SIP;
       
   399     }
       
   400     if (s->istat0 & LSI_ISTAT0_INTF)
       
   401         level = 1;
       
   402 
       
   403     if (level != last_level) {
       
   404         DPRINTF("Update IRQ level %d dstat %02x sist %02x%02x\n",
       
   405                 level, s->dstat, s->sist1, s->sist0);
       
   406         last_level = level;
       
   407     }
       
   408     qemu_set_irq(s->pci_dev.irq[0], level);
       
   409 }
       
   410 
       
   411 /* Stop SCRIPTS execution and raise a SCSI interrupt.  */
       
   412 static void lsi_script_scsi_interrupt(LSIState *s, int stat0, int stat1)
       
   413 {
       
   414     uint32_t mask0;
       
   415     uint32_t mask1;
       
   416 
       
   417     DPRINTF("SCSI Interrupt 0x%02x%02x prev 0x%02x%02x\n",
       
   418             stat1, stat0, s->sist1, s->sist0);
       
   419     s->sist0 |= stat0;
       
   420     s->sist1 |= stat1;
       
   421     /* Stop processor on fatal or unmasked interrupt.  As a special hack
       
   422        we don't stop processing when raising STO.  Instead continue
       
   423        execution and stop at the next insn that accesses the SCSI bus.  */
       
   424     mask0 = s->sien0 | ~(LSI_SIST0_CMP | LSI_SIST0_SEL | LSI_SIST0_RSL);
       
   425     mask1 = s->sien1 | ~(LSI_SIST1_GEN | LSI_SIST1_HTH);
       
   426     mask1 &= ~LSI_SIST1_STO;
       
   427     if (s->sist0 & mask0 || s->sist1 & mask1) {
       
   428         lsi_stop_script(s);
       
   429     }
       
   430     lsi_update_irq(s);
       
   431 }
       
   432 
       
   433 /* Stop SCRIPTS execution and raise a DMA interrupt.  */
       
   434 static void lsi_script_dma_interrupt(LSIState *s, int stat)
       
   435 {
       
   436     DPRINTF("DMA Interrupt 0x%x prev 0x%x\n", stat, s->dstat);
       
   437     s->dstat |= stat;
       
   438     lsi_update_irq(s);
       
   439     lsi_stop_script(s);
       
   440 }
       
   441 
       
   442 static inline void lsi_set_phase(LSIState *s, int phase)
       
   443 {
       
   444     s->sstat1 = (s->sstat1 & ~PHASE_MASK) | phase;
       
   445 }
       
   446 
       
   447 static void lsi_bad_phase(LSIState *s, int out, int new_phase)
       
   448 {
       
   449     /* Trigger a phase mismatch.  */
       
   450     if (s->ccntl0 & LSI_CCNTL0_ENPMJ) {
       
   451         if ((s->ccntl0 & LSI_CCNTL0_PMJCTL) || out) {
       
   452             s->dsp = s->pmjad1;
       
   453         } else {
       
   454             s->dsp = s->pmjad2;
       
   455         }
       
   456         DPRINTF("Data phase mismatch jump to %08x\n", s->dsp);
       
   457     } else {
       
   458         DPRINTF("Phase mismatch interrupt\n");
       
   459         lsi_script_scsi_interrupt(s, LSI_SIST0_MA, 0);
       
   460         lsi_stop_script(s);
       
   461     }
       
   462     lsi_set_phase(s, new_phase);
       
   463 }
       
   464 
       
   465 
       
   466 /* Resume SCRIPTS execution after a DMA operation.  */
       
   467 static void lsi_resume_script(LSIState *s)
       
   468 {
       
   469     if (s->waiting != 2) {
       
   470         s->waiting = 0;
       
   471         lsi_execute_script(s);
       
   472     } else {
       
   473         s->waiting = 0;
       
   474     }
       
   475 }
       
   476 
       
   477 /* Initiate a SCSI layer data transfer.  */
       
   478 static void lsi_do_dma(LSIState *s, int out)
       
   479 {
       
   480     uint32_t count;
       
   481     target_phys_addr_t addr;
       
   482 
       
   483     if (!s->current_dma_len) {
       
   484         /* Wait until data is available.  */
       
   485         DPRINTF("DMA no data available\n");
       
   486         return;
       
   487     }
       
   488 
       
   489     count = s->dbc;
       
   490     if (count > s->current_dma_len)
       
   491         count = s->current_dma_len;
       
   492 
       
   493     addr = s->dnad;
       
   494     /* both 40 and Table Indirect 64-bit DMAs store upper bits in dnad64 */
       
   495     if (lsi_dma_40bit(s) || lsi_dma_ti64bit(s))
       
   496         addr |= ((uint64_t)s->dnad64 << 32);
       
   497     else if (s->dbms)
       
   498         addr |= ((uint64_t)s->dbms << 32);
       
   499     else if (s->sbms)
       
   500         addr |= ((uint64_t)s->sbms << 32);
       
   501 
       
   502     DPRINTF("DMA addr=0x" TARGET_FMT_plx " len=%d\n", addr, count);
       
   503     s->csbc += count;
       
   504     s->dnad += count;
       
   505     s->dbc -= count;
       
   506 
       
   507     if (s->dma_buf == NULL) {
       
   508         s->dma_buf = s->current_dev->get_buf(s->current_dev,
       
   509                                              s->current_tag);
       
   510     }
       
   511 
       
   512     /* ??? Set SFBR to first data byte.  */
       
   513     if (out) {
       
   514         cpu_physical_memory_read(addr, s->dma_buf, count);
       
   515     } else {
       
   516         cpu_physical_memory_write(addr, s->dma_buf, count);
       
   517     }
       
   518     s->current_dma_len -= count;
       
   519     if (s->current_dma_len == 0) {
       
   520         s->dma_buf = NULL;
       
   521         if (out) {
       
   522             /* Write the data.  */
       
   523             s->current_dev->write_data(s->current_dev, s->current_tag);
       
   524         } else {
       
   525             /* Request any remaining data.  */
       
   526             s->current_dev->read_data(s->current_dev, s->current_tag);
       
   527         }
       
   528     } else {
       
   529         s->dma_buf += count;
       
   530         lsi_resume_script(s);
       
   531     }
       
   532 }
       
   533 
       
   534 
       
   535 /* Add a command to the queue.  */
       
   536 static void lsi_queue_command(LSIState *s)
       
   537 {
       
   538     lsi_queue *p;
       
   539 
       
   540     DPRINTF("Queueing tag=0x%x\n", s->current_tag);
       
   541     if (s->queue_len == s->active_commands) {
       
   542         s->queue_len++;
       
   543         s->queue = qemu_realloc(s->queue, s->queue_len * sizeof(lsi_queue));
       
   544     }
       
   545     p = &s->queue[s->active_commands++];
       
   546     p->tag = s->current_tag;
       
   547     p->pending = 0;
       
   548     p->out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
       
   549 }
       
   550 
       
   551 /* Queue a byte for a MSG IN phase.  */
       
   552 static void lsi_add_msg_byte(LSIState *s, uint8_t data)
       
   553 {
       
   554     if (s->msg_len >= LSI_MAX_MSGIN_LEN) {
       
   555         BADF("MSG IN data too long\n");
       
   556     } else {
       
   557         DPRINTF("MSG IN 0x%02x\n", data);
       
   558         s->msg[s->msg_len++] = data;
       
   559     }
       
   560 }
       
   561 
       
   562 /* Perform reselection to continue a command.  */
       
   563 static void lsi_reselect(LSIState *s, uint32_t tag)
       
   564 {
       
   565     lsi_queue *p;
       
   566     int n;
       
   567     int id;
       
   568 
       
   569     p = NULL;
       
   570     for (n = 0; n < s->active_commands; n++) {
       
   571         p = &s->queue[n];
       
   572         if (p->tag == tag)
       
   573             break;
       
   574     }
       
   575     if (n == s->active_commands) {
       
   576         BADF("Reselected non-existant command tag=0x%x\n", tag);
       
   577         return;
       
   578     }
       
   579     id = (tag >> 8) & 0xf;
       
   580     s->ssid = id | 0x80;
       
   581     DPRINTF("Reselected target %d\n", id);
       
   582     s->current_dev = s->scsi_dev[id];
       
   583     s->current_tag = tag;
       
   584     s->scntl1 |= LSI_SCNTL1_CON;
       
   585     lsi_set_phase(s, PHASE_MI);
       
   586     s->msg_action = p->out ? 2 : 3;
       
   587     s->current_dma_len = p->pending;
       
   588     s->dma_buf = NULL;
       
   589     lsi_add_msg_byte(s, 0x80);
       
   590     if (s->current_tag & LSI_TAG_VALID) {
       
   591         lsi_add_msg_byte(s, 0x20);
       
   592         lsi_add_msg_byte(s, tag & 0xff);
       
   593     }
       
   594 
       
   595     s->active_commands--;
       
   596     if (n != s->active_commands) {
       
   597         s->queue[n] = s->queue[s->active_commands];
       
   598     }
       
   599 }
       
   600 
       
   601 /* Record that data is available for a queued command.  Returns zero if
       
   602    the device was reselected, nonzero if the IO is deferred.  */
       
   603 static int lsi_queue_tag(LSIState *s, uint32_t tag, uint32_t arg)
       
   604 {
       
   605     lsi_queue *p;
       
   606     int i;
       
   607     for (i = 0; i < s->active_commands; i++) {
       
   608         p = &s->queue[i];
       
   609         if (p->tag == tag) {
       
   610             if (p->pending) {
       
   611                 BADF("Multiple IO pending for tag %d\n", tag);
       
   612             }
       
   613             p->pending = arg;
       
   614             if (s->waiting == 1) {
       
   615                 /* Reselect device.  */
       
   616                 lsi_reselect(s, tag);
       
   617                 return 0;
       
   618             } else {
       
   619                DPRINTF("Queueing IO tag=0x%x\n", tag);
       
   620                 p->pending = arg;
       
   621                 return 1;
       
   622             }
       
   623         }
       
   624     }
       
   625     BADF("IO with unknown tag %d\n", tag);
       
   626     return 1;
       
   627 }
       
   628 
       
   629 /* Callback to indicate that the SCSI layer has completed a transfer.  */
       
   630 static void lsi_command_complete(void *opaque, int reason, uint32_t tag,
       
   631                                  uint32_t arg)
       
   632 {
       
   633     LSIState *s = (LSIState *)opaque;
       
   634     int out;
       
   635 
       
   636     out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
       
   637     if (reason == SCSI_REASON_DONE) {
       
   638         DPRINTF("Command complete sense=%d\n", (int)arg);
       
   639         s->sense = arg;
       
   640         s->command_complete = 2;
       
   641         if (s->waiting && s->dbc != 0) {
       
   642             /* Raise phase mismatch for short transfers.  */
       
   643             lsi_bad_phase(s, out, PHASE_ST);
       
   644         } else {
       
   645             lsi_set_phase(s, PHASE_ST);
       
   646         }
       
   647         lsi_resume_script(s);
       
   648         return;
       
   649     }
       
   650 
       
   651     if (s->waiting == 1 || tag != s->current_tag) {
       
   652         if (lsi_queue_tag(s, tag, arg))
       
   653             return;
       
   654     }
       
   655     DPRINTF("Data ready tag=0x%x len=%d\n", tag, arg);
       
   656     s->current_dma_len = arg;
       
   657     s->command_complete = 1;
       
   658     if (!s->waiting)
       
   659         return;
       
   660     if (s->waiting == 1 || s->dbc == 0) {
       
   661         lsi_resume_script(s);
       
   662     } else {
       
   663         lsi_do_dma(s, out);
       
   664     }
       
   665 }
       
   666 
       
   667 static void lsi_do_command(LSIState *s)
       
   668 {
       
   669     uint8_t buf[16];
       
   670     int n;
       
   671 
       
   672     DPRINTF("Send command len=%d\n", s->dbc);
       
   673     if (s->dbc > 16)
       
   674         s->dbc = 16;
       
   675     cpu_physical_memory_read(s->dnad, buf, s->dbc);
       
   676     s->sfbr = buf[0];
       
   677     s->command_complete = 0;
       
   678     n = s->current_dev->send_command(s->current_dev, s->current_tag, buf,
       
   679                                      s->current_lun);
       
   680     if (n > 0) {
       
   681         lsi_set_phase(s, PHASE_DI);
       
   682         s->current_dev->read_data(s->current_dev, s->current_tag);
       
   683     } else if (n < 0) {
       
   684         lsi_set_phase(s, PHASE_DO);
       
   685         s->current_dev->write_data(s->current_dev, s->current_tag);
       
   686     }
       
   687 
       
   688     if (!s->command_complete) {
       
   689         if (n) {
       
   690             /* Command did not complete immediately so disconnect.  */
       
   691             lsi_add_msg_byte(s, 2); /* SAVE DATA POINTER */
       
   692             lsi_add_msg_byte(s, 4); /* DISCONNECT */
       
   693             /* wait data */
       
   694             lsi_set_phase(s, PHASE_MI);
       
   695             s->msg_action = 1;
       
   696             lsi_queue_command(s);
       
   697         } else {
       
   698             /* wait command complete */
       
   699             lsi_set_phase(s, PHASE_DI);
       
   700         }
       
   701     }
       
   702 }
       
   703 
       
   704 static void lsi_do_status(LSIState *s)
       
   705 {
       
   706     uint8_t sense;
       
   707     DPRINTF("Get status len=%d sense=%d\n", s->dbc, s->sense);
       
   708     if (s->dbc != 1)
       
   709         BADF("Bad Status move\n");
       
   710     s->dbc = 1;
       
   711     sense = s->sense;
       
   712     s->sfbr = sense;
       
   713     cpu_physical_memory_write(s->dnad, &sense, 1);
       
   714     lsi_set_phase(s, PHASE_MI);
       
   715     s->msg_action = 1;
       
   716     lsi_add_msg_byte(s, 0); /* COMMAND COMPLETE */
       
   717 }
       
   718 
       
   719 static void lsi_disconnect(LSIState *s)
       
   720 {
       
   721     s->scntl1 &= ~LSI_SCNTL1_CON;
       
   722     s->sstat1 &= ~PHASE_MASK;
       
   723 }
       
   724 
       
   725 static void lsi_do_msgin(LSIState *s)
       
   726 {
       
   727     int len;
       
   728     DPRINTF("Message in len=%d/%d\n", s->dbc, s->msg_len);
       
   729     s->sfbr = s->msg[0];
       
   730     len = s->msg_len;
       
   731     if (len > s->dbc)
       
   732         len = s->dbc;
       
   733     cpu_physical_memory_write(s->dnad, s->msg, len);
       
   734     /* Linux drivers rely on the last byte being in the SIDL.  */
       
   735     s->sidl = s->msg[len - 1];
       
   736     s->msg_len -= len;
       
   737     if (s->msg_len) {
       
   738         memmove(s->msg, s->msg + len, s->msg_len);
       
   739     } else {
       
   740         /* ??? Check if ATN (not yet implemented) is asserted and maybe
       
   741            switch to PHASE_MO.  */
       
   742         switch (s->msg_action) {
       
   743         case 0:
       
   744             lsi_set_phase(s, PHASE_CMD);
       
   745             break;
       
   746         case 1:
       
   747             lsi_disconnect(s);
       
   748             break;
       
   749         case 2:
       
   750             lsi_set_phase(s, PHASE_DO);
       
   751             break;
       
   752         case 3:
       
   753             lsi_set_phase(s, PHASE_DI);
       
   754             break;
       
   755         default:
       
   756             abort();
       
   757         }
       
   758     }
       
   759 }
       
   760 
       
   761 /* Read the next byte during a MSGOUT phase.  */
       
   762 static uint8_t lsi_get_msgbyte(LSIState *s)
       
   763 {
       
   764     uint8_t data;
       
   765     cpu_physical_memory_read(s->dnad, &data, 1);
       
   766     s->dnad++;
       
   767     s->dbc--;
       
   768     return data;
       
   769 }
       
   770 
       
   771 static void lsi_do_msgout(LSIState *s)
       
   772 {
       
   773     uint8_t msg;
       
   774     int len;
       
   775 
       
   776     DPRINTF("MSG out len=%d\n", s->dbc);
       
   777     while (s->dbc) {
       
   778         msg = lsi_get_msgbyte(s);
       
   779         s->sfbr = msg;
       
   780 
       
   781         switch (msg) {
       
   782         case 0x00:
       
   783             DPRINTF("MSG: Disconnect\n");
       
   784             lsi_disconnect(s);
       
   785             break;
       
   786         case 0x08:
       
   787             DPRINTF("MSG: No Operation\n");
       
   788             lsi_set_phase(s, PHASE_CMD);
       
   789             break;
       
   790         case 0x01:
       
   791             len = lsi_get_msgbyte(s);
       
   792             msg = lsi_get_msgbyte(s);
       
   793             DPRINTF("Extended message 0x%x (len %d)\n", msg, len);
       
   794             switch (msg) {
       
   795             case 1:
       
   796                 DPRINTF("SDTR (ignored)\n");
       
   797                 s->dbc -= 2;
       
   798                 break;
       
   799             case 3:
       
   800                 DPRINTF("WDTR (ignored)\n");
       
   801                 s->dbc -= 1;
       
   802                 break;
       
   803             default:
       
   804                 goto bad;
       
   805             }
       
   806             break;
       
   807         case 0x20: /* SIMPLE queue */
       
   808             s->current_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
       
   809             DPRINTF("SIMPLE queue tag=0x%x\n", s->current_tag & 0xff);
       
   810             break;
       
   811         case 0x21: /* HEAD of queue */
       
   812             BADF("HEAD queue not implemented\n");
       
   813             s->current_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
       
   814             break;
       
   815         case 0x22: /* ORDERED queue */
       
   816             BADF("ORDERED queue not implemented\n");
       
   817             s->current_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
       
   818             break;
       
   819         default:
       
   820             if ((msg & 0x80) == 0) {
       
   821                 goto bad;
       
   822             }
       
   823             s->current_lun = msg & 7;
       
   824             DPRINTF("Select LUN %d\n", s->current_lun);
       
   825             lsi_set_phase(s, PHASE_CMD);
       
   826             break;
       
   827         }
       
   828     }
       
   829     return;
       
   830 bad:
       
   831     BADF("Unimplemented message 0x%02x\n", msg);
       
   832     lsi_set_phase(s, PHASE_MI);
       
   833     lsi_add_msg_byte(s, 7); /* MESSAGE REJECT */
       
   834     s->msg_action = 0;
       
   835 }
       
   836 
       
   837 /* Sign extend a 24-bit value.  */
       
   838 static inline int32_t sxt24(int32_t n)
       
   839 {
       
   840     return (n << 8) >> 8;
       
   841 }
       
   842 
       
   843 static void lsi_memcpy(LSIState *s, uint32_t dest, uint32_t src, int count)
       
   844 {
       
   845     int n;
       
   846     uint8_t buf[TARGET_PAGE_SIZE];
       
   847 
       
   848     DPRINTF("memcpy dest 0x%08x src 0x%08x count %d\n", dest, src, count);
       
   849     while (count) {
       
   850         n = (count > TARGET_PAGE_SIZE) ? TARGET_PAGE_SIZE : count;
       
   851         cpu_physical_memory_read(src, buf, n);
       
   852         cpu_physical_memory_write(dest, buf, n);
       
   853         src += n;
       
   854         dest += n;
       
   855         count -= n;
       
   856     }
       
   857 }
       
   858 
       
   859 static void lsi_wait_reselect(LSIState *s)
       
   860 {
       
   861     int i;
       
   862     DPRINTF("Wait Reselect\n");
       
   863     if (s->current_dma_len)
       
   864         BADF("Reselect with pending DMA\n");
       
   865     for (i = 0; i < s->active_commands; i++) {
       
   866         if (s->queue[i].pending) {
       
   867             lsi_reselect(s, s->queue[i].tag);
       
   868             break;
       
   869         }
       
   870     }
       
   871     if (s->current_dma_len == 0) {
       
   872         s->waiting = 1;
       
   873     }
       
   874 }
       
   875 
       
   876 static void lsi_execute_script(LSIState *s)
       
   877 {
       
   878     uint32_t insn;
       
   879     uint32_t addr, addr_high;
       
   880     int opcode;
       
   881     int insn_processed = 0;
       
   882 
       
   883     s->istat1 |= LSI_ISTAT1_SRUN;
       
   884 again:
       
   885     insn_processed++;
       
   886     insn = read_dword(s, s->dsp);
       
   887     if (!insn) {
       
   888         /* If we receive an empty opcode increment the DSP by 4 bytes
       
   889            instead of 8 and execute the next opcode at that location */
       
   890         s->dsp += 4;
       
   891         goto again;
       
   892     }
       
   893     addr = read_dword(s, s->dsp + 4);
       
   894     addr_high = 0;
       
   895     DPRINTF("SCRIPTS dsp=%08x opcode %08x arg %08x\n", s->dsp, insn, addr);
       
   896     s->dsps = addr;
       
   897     s->dcmd = insn >> 24;
       
   898     s->dsp += 8;
       
   899     switch (insn >> 30) {
       
   900     case 0: /* Block move.  */
       
   901         if (s->sist1 & LSI_SIST1_STO) {
       
   902             DPRINTF("Delayed select timeout\n");
       
   903             lsi_stop_script(s);
       
   904             break;
       
   905         }
       
   906         s->dbc = insn & 0xffffff;
       
   907         s->rbc = s->dbc;
       
   908         /* ??? Set ESA.  */
       
   909         s->ia = s->dsp - 8;
       
   910         if (insn & (1 << 29)) {
       
   911             /* Indirect addressing.  */
       
   912             addr = read_dword(s, addr);
       
   913         } else if (insn & (1 << 28)) {
       
   914             uint32_t buf[2];
       
   915             int32_t offset;
       
   916             /* Table indirect addressing.  */
       
   917 
       
   918             /* 32-bit Table indirect */
       
   919             offset = sxt24(addr);
       
   920             cpu_physical_memory_read(s->dsa + offset, (uint8_t *)buf, 8);
       
   921             /* byte count is stored in bits 0:23 only */
       
   922             s->dbc = cpu_to_le32(buf[0]) & 0xffffff;
       
   923             s->rbc = s->dbc;
       
   924             addr = cpu_to_le32(buf[1]);
       
   925 
       
   926             /* 40-bit DMA, upper addr bits [39:32] stored in first DWORD of
       
   927              * table, bits [31:24] */
       
   928             if (lsi_dma_40bit(s))
       
   929                 addr_high = cpu_to_le32(buf[0]) >> 24;
       
   930             else if (lsi_dma_ti64bit(s)) {
       
   931                 int selector = (cpu_to_le32(buf[0]) >> 24) & 0x1f;
       
   932                 switch (selector) {
       
   933                 case 0 ... 0x0f:
       
   934                     /* offset index into scratch registers since
       
   935                      * TI64 mode can use registers C to R */
       
   936                     addr_high = s->scratch[2 + selector];
       
   937                     break;
       
   938                 case 0x10:
       
   939                     addr_high = s->mmrs;
       
   940                     break;
       
   941                 case 0x11:
       
   942                     addr_high = s->mmws;
       
   943                     break;
       
   944                 case 0x12:
       
   945                     addr_high = s->sfs;
       
   946                     break;
       
   947                 case 0x13:
       
   948                     addr_high = s->drs;
       
   949                     break;
       
   950                 case 0x14:
       
   951                     addr_high = s->sbms;
       
   952                     break;
       
   953                 case 0x15:
       
   954                     addr_high = s->dbms;
       
   955                     break;
       
   956                 default:
       
   957                     BADF("Illegal selector specified (0x%x > 0x15)"
       
   958                          " for 64-bit DMA block move", selector);
       
   959                     break;
       
   960                 }
       
   961             }
       
   962         } else if (lsi_dma_64bit(s)) {
       
   963             /* fetch a 3rd dword if 64-bit direct move is enabled and
       
   964                only if we're not doing table indirect or indirect addressing */
       
   965             s->dbms = read_dword(s, s->dsp);
       
   966             s->dsp += 4;
       
   967             s->ia = s->dsp - 12;
       
   968         }
       
   969         if ((s->sstat1 & PHASE_MASK) != ((insn >> 24) & 7)) {
       
   970             DPRINTF("Wrong phase got %d expected %d\n",
       
   971                     s->sstat1 & PHASE_MASK, (insn >> 24) & 7);
       
   972             lsi_script_scsi_interrupt(s, LSI_SIST0_MA, 0);
       
   973             break;
       
   974         }
       
   975         s->dnad = addr;
       
   976         s->dnad64 = addr_high;
       
   977         switch (s->sstat1 & 0x7) {
       
   978         case PHASE_DO:
       
   979             s->waiting = 2;
       
   980             lsi_do_dma(s, 1);
       
   981             if (s->waiting)
       
   982                 s->waiting = 3;
       
   983             break;
       
   984         case PHASE_DI:
       
   985             s->waiting = 2;
       
   986             lsi_do_dma(s, 0);
       
   987             if (s->waiting)
       
   988                 s->waiting = 3;
       
   989             break;
       
   990         case PHASE_CMD:
       
   991             lsi_do_command(s);
       
   992             break;
       
   993         case PHASE_ST:
       
   994             lsi_do_status(s);
       
   995             break;
       
   996         case PHASE_MO:
       
   997             lsi_do_msgout(s);
       
   998             break;
       
   999         case PHASE_MI:
       
  1000             lsi_do_msgin(s);
       
  1001             break;
       
  1002         default:
       
  1003             BADF("Unimplemented phase %d\n", s->sstat1 & PHASE_MASK);
       
  1004             exit(1);
       
  1005         }
       
  1006         s->dfifo = s->dbc & 0xff;
       
  1007         s->ctest5 = (s->ctest5 & 0xfc) | ((s->dbc >> 8) & 3);
       
  1008         s->sbc = s->dbc;
       
  1009         s->rbc -= s->dbc;
       
  1010         s->ua = addr + s->dbc;
       
  1011         break;
       
  1012 
       
  1013     case 1: /* IO or Read/Write instruction.  */
       
  1014         opcode = (insn >> 27) & 7;
       
  1015         if (opcode < 5) {
       
  1016             uint32_t id;
       
  1017 
       
  1018             if (insn & (1 << 25)) {
       
  1019                 id = read_dword(s, s->dsa + sxt24(insn));
       
  1020             } else {
       
  1021                 id = addr;
       
  1022             }
       
  1023             id = (id >> 16) & 0xf;
       
  1024             if (insn & (1 << 26)) {
       
  1025                 addr = s->dsp + sxt24(addr);
       
  1026             }
       
  1027             s->dnad = addr;
       
  1028             switch (opcode) {
       
  1029             case 0: /* Select */
       
  1030                 s->sdid = id;
       
  1031                 if (s->current_dma_len && (s->ssid & 0xf) == id) {
       
  1032                     DPRINTF("Already reselected by target %d\n", id);
       
  1033                     break;
       
  1034                 }
       
  1035                 s->sstat0 |= LSI_SSTAT0_WOA;
       
  1036                 s->scntl1 &= ~LSI_SCNTL1_IARB;
       
  1037                 if (id >= LSI_MAX_DEVS || !s->scsi_dev[id]) {
       
  1038                     DPRINTF("Selected absent target %d\n", id);
       
  1039                     lsi_script_scsi_interrupt(s, 0, LSI_SIST1_STO);
       
  1040                     lsi_disconnect(s);
       
  1041                     break;
       
  1042                 }
       
  1043                 DPRINTF("Selected target %d%s\n",
       
  1044                         id, insn & (1 << 3) ? " ATN" : "");
       
  1045                 /* ??? Linux drivers compain when this is set.  Maybe
       
  1046                    it only applies in low-level mode (unimplemented).
       
  1047                 lsi_script_scsi_interrupt(s, LSI_SIST0_CMP, 0); */
       
  1048                 s->current_dev = s->scsi_dev[id];
       
  1049                 s->current_tag = id << 8;
       
  1050                 s->scntl1 |= LSI_SCNTL1_CON;
       
  1051                 if (insn & (1 << 3)) {
       
  1052                     s->socl |= LSI_SOCL_ATN;
       
  1053                 }
       
  1054                 lsi_set_phase(s, PHASE_MO);
       
  1055                 break;
       
  1056             case 1: /* Disconnect */
       
  1057                 DPRINTF("Wait Disconect\n");
       
  1058                 s->scntl1 &= ~LSI_SCNTL1_CON;
       
  1059                 break;
       
  1060             case 2: /* Wait Reselect */
       
  1061                 lsi_wait_reselect(s);
       
  1062                 break;
       
  1063             case 3: /* Set */
       
  1064                 DPRINTF("Set%s%s%s%s\n",
       
  1065                         insn & (1 << 3) ? " ATN" : "",
       
  1066                         insn & (1 << 6) ? " ACK" : "",
       
  1067                         insn & (1 << 9) ? " TM" : "",
       
  1068                         insn & (1 << 10) ? " CC" : "");
       
  1069                 if (insn & (1 << 3)) {
       
  1070                     s->socl |= LSI_SOCL_ATN;
       
  1071                     lsi_set_phase(s, PHASE_MO);
       
  1072                 }
       
  1073                 if (insn & (1 << 9)) {
       
  1074                     BADF("Target mode not implemented\n");
       
  1075                     exit(1);
       
  1076                 }
       
  1077                 if (insn & (1 << 10))
       
  1078                     s->carry = 1;
       
  1079                 break;
       
  1080             case 4: /* Clear */
       
  1081                 DPRINTF("Clear%s%s%s%s\n",
       
  1082                         insn & (1 << 3) ? " ATN" : "",
       
  1083                         insn & (1 << 6) ? " ACK" : "",
       
  1084                         insn & (1 << 9) ? " TM" : "",
       
  1085                         insn & (1 << 10) ? " CC" : "");
       
  1086                 if (insn & (1 << 3)) {
       
  1087                     s->socl &= ~LSI_SOCL_ATN;
       
  1088                 }
       
  1089                 if (insn & (1 << 10))
       
  1090                     s->carry = 0;
       
  1091                 break;
       
  1092             }
       
  1093         } else {
       
  1094             uint8_t op0;
       
  1095             uint8_t op1;
       
  1096             uint8_t data8;
       
  1097             int reg;
       
  1098             int operator;
       
  1099 #ifdef DEBUG_LSI
       
  1100             static const char *opcode_names[3] =
       
  1101                 {"Write", "Read", "Read-Modify-Write"};
       
  1102             static const char *operator_names[8] =
       
  1103                 {"MOV", "SHL", "OR", "XOR", "AND", "SHR", "ADD", "ADC"};
       
  1104 #endif
       
  1105 
       
  1106             reg = ((insn >> 16) & 0x7f) | (insn & 0x80);
       
  1107             data8 = (insn >> 8) & 0xff;
       
  1108             opcode = (insn >> 27) & 7;
       
  1109             operator = (insn >> 24) & 7;
       
  1110             DPRINTF("%s reg 0x%x %s data8=0x%02x sfbr=0x%02x%s\n",
       
  1111                     opcode_names[opcode - 5], reg,
       
  1112                     operator_names[operator], data8, s->sfbr,
       
  1113                     (insn & (1 << 23)) ? " SFBR" : "");
       
  1114             op0 = op1 = 0;
       
  1115             switch (opcode) {
       
  1116             case 5: /* From SFBR */
       
  1117                 op0 = s->sfbr;
       
  1118                 op1 = data8;
       
  1119                 break;
       
  1120             case 6: /* To SFBR */
       
  1121                 if (operator)
       
  1122                     op0 = lsi_reg_readb(s, reg);
       
  1123                 op1 = data8;
       
  1124                 break;
       
  1125             case 7: /* Read-modify-write */
       
  1126                 if (operator)
       
  1127                     op0 = lsi_reg_readb(s, reg);
       
  1128                 if (insn & (1 << 23)) {
       
  1129                     op1 = s->sfbr;
       
  1130                 } else {
       
  1131                     op1 = data8;
       
  1132                 }
       
  1133                 break;
       
  1134             }
       
  1135 
       
  1136             switch (operator) {
       
  1137             case 0: /* move */
       
  1138                 op0 = op1;
       
  1139                 break;
       
  1140             case 1: /* Shift left */
       
  1141                 op1 = op0 >> 7;
       
  1142                 op0 = (op0 << 1) | s->carry;
       
  1143                 s->carry = op1;
       
  1144                 break;
       
  1145             case 2: /* OR */
       
  1146                 op0 |= op1;
       
  1147                 break;
       
  1148             case 3: /* XOR */
       
  1149                 op0 ^= op1;
       
  1150                 break;
       
  1151             case 4: /* AND */
       
  1152                 op0 &= op1;
       
  1153                 break;
       
  1154             case 5: /* SHR */
       
  1155                 op1 = op0 & 1;
       
  1156                 op0 = (op0 >> 1) | (s->carry << 7);
       
  1157                 s->carry = op1;
       
  1158                 break;
       
  1159             case 6: /* ADD */
       
  1160                 op0 += op1;
       
  1161                 s->carry = op0 < op1;
       
  1162                 break;
       
  1163             case 7: /* ADC */
       
  1164                 op0 += op1 + s->carry;
       
  1165                 if (s->carry)
       
  1166                     s->carry = op0 <= op1;
       
  1167                 else
       
  1168                     s->carry = op0 < op1;
       
  1169                 break;
       
  1170             }
       
  1171 
       
  1172             switch (opcode) {
       
  1173             case 5: /* From SFBR */
       
  1174             case 7: /* Read-modify-write */
       
  1175                 lsi_reg_writeb(s, reg, op0);
       
  1176                 break;
       
  1177             case 6: /* To SFBR */
       
  1178                 s->sfbr = op0;
       
  1179                 break;
       
  1180             }
       
  1181         }
       
  1182         break;
       
  1183 
       
  1184     case 2: /* Transfer Control.  */
       
  1185         {
       
  1186             int cond;
       
  1187             int jmp;
       
  1188 
       
  1189             if ((insn & 0x002e0000) == 0) {
       
  1190                 DPRINTF("NOP\n");
       
  1191                 break;
       
  1192             }
       
  1193             if (s->sist1 & LSI_SIST1_STO) {
       
  1194                 DPRINTF("Delayed select timeout\n");
       
  1195                 lsi_stop_script(s);
       
  1196                 break;
       
  1197             }
       
  1198             cond = jmp = (insn & (1 << 19)) != 0;
       
  1199             if (cond == jmp && (insn & (1 << 21))) {
       
  1200                 DPRINTF("Compare carry %d\n", s->carry == jmp);
       
  1201                 cond = s->carry != 0;
       
  1202             }
       
  1203             if (cond == jmp && (insn & (1 << 17))) {
       
  1204                 DPRINTF("Compare phase %d %c= %d\n",
       
  1205                         (s->sstat1 & PHASE_MASK),
       
  1206                         jmp ? '=' : '!',
       
  1207                         ((insn >> 24) & 7));
       
  1208                 cond = (s->sstat1 & PHASE_MASK) == ((insn >> 24) & 7);
       
  1209             }
       
  1210             if (cond == jmp && (insn & (1 << 18))) {
       
  1211                 uint8_t mask;
       
  1212 
       
  1213                 mask = (~insn >> 8) & 0xff;
       
  1214                 DPRINTF("Compare data 0x%x & 0x%x %c= 0x%x\n",
       
  1215                         s->sfbr, mask, jmp ? '=' : '!', insn & mask);
       
  1216                 cond = (s->sfbr & mask) == (insn & mask);
       
  1217             }
       
  1218             if (cond == jmp) {
       
  1219                 if (insn & (1 << 23)) {
       
  1220                     /* Relative address.  */
       
  1221                     addr = s->dsp + sxt24(addr);
       
  1222                 }
       
  1223                 switch ((insn >> 27) & 7) {
       
  1224                 case 0: /* Jump */
       
  1225                     DPRINTF("Jump to 0x%08x\n", addr);
       
  1226                     s->dsp = addr;
       
  1227                     break;
       
  1228                 case 1: /* Call */
       
  1229                     DPRINTF("Call 0x%08x\n", addr);
       
  1230                     s->temp = s->dsp;
       
  1231                     s->dsp = addr;
       
  1232                     break;
       
  1233                 case 2: /* Return */
       
  1234                     DPRINTF("Return to 0x%08x\n", s->temp);
       
  1235                     s->dsp = s->temp;
       
  1236                     break;
       
  1237                 case 3: /* Interrupt */
       
  1238                     DPRINTF("Interrupt 0x%08x\n", s->dsps);
       
  1239                     if ((insn & (1 << 20)) != 0) {
       
  1240                         s->istat0 |= LSI_ISTAT0_INTF;
       
  1241                         lsi_update_irq(s);
       
  1242                     } else {
       
  1243                         lsi_script_dma_interrupt(s, LSI_DSTAT_SIR);
       
  1244                     }
       
  1245                     break;
       
  1246                 default:
       
  1247                     DPRINTF("Illegal transfer control\n");
       
  1248                     lsi_script_dma_interrupt(s, LSI_DSTAT_IID);
       
  1249                     break;
       
  1250                 }
       
  1251             } else {
       
  1252                 DPRINTF("Control condition failed\n");
       
  1253             }
       
  1254         }
       
  1255         break;
       
  1256 
       
  1257     case 3:
       
  1258         if ((insn & (1 << 29)) == 0) {
       
  1259             /* Memory move.  */
       
  1260             uint32_t dest;
       
  1261             /* ??? The docs imply the destination address is loaded into
       
  1262                the TEMP register.  However the Linux drivers rely on
       
  1263                the value being presrved.  */
       
  1264             dest = read_dword(s, s->dsp);
       
  1265             s->dsp += 4;
       
  1266             lsi_memcpy(s, dest, addr, insn & 0xffffff);
       
  1267         } else {
       
  1268             uint8_t data[7];
       
  1269             int reg;
       
  1270             int n;
       
  1271             int i;
       
  1272 
       
  1273             if (insn & (1 << 28)) {
       
  1274                 addr = s->dsa + sxt24(addr);
       
  1275             }
       
  1276             n = (insn & 7);
       
  1277             reg = (insn >> 16) & 0xff;
       
  1278             if (insn & (1 << 24)) {
       
  1279                 cpu_physical_memory_read(addr, data, n);
       
  1280                 DPRINTF("Load reg 0x%x size %d addr 0x%08x = %08x\n", reg, n,
       
  1281                         addr, *(int *)data);
       
  1282                 for (i = 0; i < n; i++) {
       
  1283                     lsi_reg_writeb(s, reg + i, data[i]);
       
  1284                 }
       
  1285             } else {
       
  1286                 DPRINTF("Store reg 0x%x size %d addr 0x%08x\n", reg, n, addr);
       
  1287                 for (i = 0; i < n; i++) {
       
  1288                     data[i] = lsi_reg_readb(s, reg + i);
       
  1289                 }
       
  1290                 cpu_physical_memory_write(addr, data, n);
       
  1291             }
       
  1292         }
       
  1293     }
       
  1294     if (insn_processed > 10000 && !s->waiting) {
       
  1295         /* Some windows drivers make the device spin waiting for a memory
       
  1296            location to change.  If we have been executed a lot of code then
       
  1297            assume this is the case and force an unexpected device disconnect.
       
  1298            This is apparently sufficient to beat the drivers into submission.
       
  1299          */
       
  1300         if (!(s->sien0 & LSI_SIST0_UDC))
       
  1301             fprintf(stderr, "inf. loop with UDC masked\n");
       
  1302         lsi_script_scsi_interrupt(s, LSI_SIST0_UDC, 0);
       
  1303         lsi_disconnect(s);
       
  1304     } else if (s->istat1 & LSI_ISTAT1_SRUN && !s->waiting) {
       
  1305         if (s->dcntl & LSI_DCNTL_SSM) {
       
  1306             lsi_script_dma_interrupt(s, LSI_DSTAT_SSI);
       
  1307         } else {
       
  1308             goto again;
       
  1309         }
       
  1310     }
       
  1311     DPRINTF("SCRIPTS execution stopped\n");
       
  1312 }
       
  1313 
       
  1314 static uint8_t lsi_reg_readb(LSIState *s, int offset)
       
  1315 {
       
  1316     uint8_t tmp;
       
  1317 #define CASE_GET_REG32(name, addr) \
       
  1318     case addr: return s->name & 0xff; \
       
  1319     case addr + 1: return (s->name >> 8) & 0xff; \
       
  1320     case addr + 2: return (s->name >> 16) & 0xff; \
       
  1321     case addr + 3: return (s->name >> 24) & 0xff;
       
  1322 
       
  1323 #ifdef DEBUG_LSI_REG
       
  1324     DPRINTF("Read reg %x\n", offset);
       
  1325 #endif
       
  1326     switch (offset) {
       
  1327     case 0x00: /* SCNTL0 */
       
  1328         return s->scntl0;
       
  1329     case 0x01: /* SCNTL1 */
       
  1330         return s->scntl1;
       
  1331     case 0x02: /* SCNTL2 */
       
  1332         return s->scntl2;
       
  1333     case 0x03: /* SCNTL3 */
       
  1334         return s->scntl3;
       
  1335     case 0x04: /* SCID */
       
  1336         return s->scid;
       
  1337     case 0x05: /* SXFER */
       
  1338         return s->sxfer;
       
  1339     case 0x06: /* SDID */
       
  1340         return s->sdid;
       
  1341     case 0x07: /* GPREG0 */
       
  1342         return 0x7f;
       
  1343     case 0x08: /* Revision ID */
       
  1344         return 0x00;
       
  1345     case 0xa: /* SSID */
       
  1346         return s->ssid;
       
  1347     case 0xb: /* SBCL */
       
  1348         /* ??? This is not correct. However it's (hopefully) only
       
  1349            used for diagnostics, so should be ok.  */
       
  1350         return 0;
       
  1351     case 0xc: /* DSTAT */
       
  1352         tmp = s->dstat | 0x80;
       
  1353         if ((s->istat0 & LSI_ISTAT0_INTF) == 0)
       
  1354             s->dstat = 0;
       
  1355         lsi_update_irq(s);
       
  1356         return tmp;
       
  1357     case 0x0d: /* SSTAT0 */
       
  1358         return s->sstat0;
       
  1359     case 0x0e: /* SSTAT1 */
       
  1360         return s->sstat1;
       
  1361     case 0x0f: /* SSTAT2 */
       
  1362         return s->scntl1 & LSI_SCNTL1_CON ? 0 : 2;
       
  1363     CASE_GET_REG32(dsa, 0x10)
       
  1364     case 0x14: /* ISTAT0 */
       
  1365         return s->istat0;
       
  1366     case 0x16: /* MBOX0 */
       
  1367         return s->mbox0;
       
  1368     case 0x17: /* MBOX1 */
       
  1369         return s->mbox1;
       
  1370     case 0x18: /* CTEST0 */
       
  1371         return 0xff;
       
  1372     case 0x19: /* CTEST1 */
       
  1373         return 0;
       
  1374     case 0x1a: /* CTEST2 */
       
  1375         tmp = s->ctest2 | LSI_CTEST2_DACK | LSI_CTEST2_CM;
       
  1376         if (s->istat0 & LSI_ISTAT0_SIGP) {
       
  1377             s->istat0 &= ~LSI_ISTAT0_SIGP;
       
  1378             tmp |= LSI_CTEST2_SIGP;
       
  1379         }
       
  1380         return tmp;
       
  1381     case 0x1b: /* CTEST3 */
       
  1382         return s->ctest3;
       
  1383     CASE_GET_REG32(temp, 0x1c)
       
  1384     case 0x20: /* DFIFO */
       
  1385         return 0;
       
  1386     case 0x21: /* CTEST4 */
       
  1387         return s->ctest4;
       
  1388     case 0x22: /* CTEST5 */
       
  1389         return s->ctest5;
       
  1390     case 0x23: /* CTEST6 */
       
  1391          return 0;
       
  1392     case 0x24: /* DBC[0:7] */
       
  1393         return s->dbc & 0xff;
       
  1394     case 0x25: /* DBC[8:15] */
       
  1395         return (s->dbc >> 8) & 0xff;
       
  1396     case 0x26: /* DBC[16->23] */
       
  1397         return (s->dbc >> 16) & 0xff;
       
  1398     case 0x27: /* DCMD */
       
  1399         return s->dcmd;
       
  1400     CASE_GET_REG32(dsp, 0x2c)
       
  1401     CASE_GET_REG32(dsps, 0x30)
       
  1402     CASE_GET_REG32(scratch[0], 0x34)
       
  1403     case 0x38: /* DMODE */
       
  1404         return s->dmode;
       
  1405     case 0x39: /* DIEN */
       
  1406         return s->dien;
       
  1407     case 0x3b: /* DCNTL */
       
  1408         return s->dcntl;
       
  1409     case 0x40: /* SIEN0 */
       
  1410         return s->sien0;
       
  1411     case 0x41: /* SIEN1 */
       
  1412         return s->sien1;
       
  1413     case 0x42: /* SIST0 */
       
  1414         tmp = s->sist0;
       
  1415         s->sist0 = 0;
       
  1416         lsi_update_irq(s);
       
  1417         return tmp;
       
  1418     case 0x43: /* SIST1 */
       
  1419         tmp = s->sist1;
       
  1420         s->sist1 = 0;
       
  1421         lsi_update_irq(s);
       
  1422         return tmp;
       
  1423     case 0x46: /* MACNTL */
       
  1424         return 0x0f;
       
  1425     case 0x47: /* GPCNTL0 */
       
  1426         return 0x0f;
       
  1427     case 0x48: /* STIME0 */
       
  1428         return s->stime0;
       
  1429     case 0x4a: /* RESPID0 */
       
  1430         return s->respid0;
       
  1431     case 0x4b: /* RESPID1 */
       
  1432         return s->respid1;
       
  1433     case 0x4d: /* STEST1 */
       
  1434         return s->stest1;
       
  1435     case 0x4e: /* STEST2 */
       
  1436         return s->stest2;
       
  1437     case 0x4f: /* STEST3 */
       
  1438         return s->stest3;
       
  1439     case 0x50: /* SIDL */
       
  1440         /* This is needed by the linux drivers.  We currently only update it
       
  1441            during the MSG IN phase.  */
       
  1442         return s->sidl;
       
  1443     case 0x52: /* STEST4 */
       
  1444         return 0xe0;
       
  1445     case 0x56: /* CCNTL0 */
       
  1446         return s->ccntl0;
       
  1447     case 0x57: /* CCNTL1 */
       
  1448         return s->ccntl1;
       
  1449     case 0x58: /* SBDL */
       
  1450         /* Some drivers peek at the data bus during the MSG IN phase.  */
       
  1451         if ((s->sstat1 & PHASE_MASK) == PHASE_MI)
       
  1452             return s->msg[0];
       
  1453         return 0;
       
  1454     case 0x59: /* SBDL high */
       
  1455         return 0;
       
  1456     CASE_GET_REG32(mmrs, 0xa0)
       
  1457     CASE_GET_REG32(mmws, 0xa4)
       
  1458     CASE_GET_REG32(sfs, 0xa8)
       
  1459     CASE_GET_REG32(drs, 0xac)
       
  1460     CASE_GET_REG32(sbms, 0xb0)
       
  1461     CASE_GET_REG32(dbms, 0xb4)
       
  1462     CASE_GET_REG32(dnad64, 0xb8)
       
  1463     CASE_GET_REG32(pmjad1, 0xc0)
       
  1464     CASE_GET_REG32(pmjad2, 0xc4)
       
  1465     CASE_GET_REG32(rbc, 0xc8)
       
  1466     CASE_GET_REG32(ua, 0xcc)
       
  1467     CASE_GET_REG32(ia, 0xd4)
       
  1468     CASE_GET_REG32(sbc, 0xd8)
       
  1469     CASE_GET_REG32(csbc, 0xdc)
       
  1470     }
       
  1471     if (offset >= 0x5c && offset < 0xa0) {
       
  1472         int n;
       
  1473         int shift;
       
  1474         n = (offset - 0x58) >> 2;
       
  1475         shift = (offset & 3) * 8;
       
  1476         return (s->scratch[n] >> shift) & 0xff;
       
  1477     }
       
  1478     BADF("readb 0x%x\n", offset);
       
  1479     exit(1);
       
  1480 #undef CASE_GET_REG32
       
  1481 }
       
  1482 
       
  1483 static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val)
       
  1484 {
       
  1485 #define CASE_SET_REG32(name, addr) \
       
  1486     case addr    : s->name &= 0xffffff00; s->name |= val;       break; \
       
  1487     case addr + 1: s->name &= 0xffff00ff; s->name |= val << 8;  break; \
       
  1488     case addr + 2: s->name &= 0xff00ffff; s->name |= val << 16; break; \
       
  1489     case addr + 3: s->name &= 0x00ffffff; s->name |= val << 24; break;
       
  1490 
       
  1491 #ifdef DEBUG_LSI_REG
       
  1492     DPRINTF("Write reg %x = %02x\n", offset, val);
       
  1493 #endif
       
  1494     switch (offset) {
       
  1495     case 0x00: /* SCNTL0 */
       
  1496         s->scntl0 = val;
       
  1497         if (val & LSI_SCNTL0_START) {
       
  1498             BADF("Start sequence not implemented\n");
       
  1499         }
       
  1500         break;
       
  1501     case 0x01: /* SCNTL1 */
       
  1502         s->scntl1 = val & ~LSI_SCNTL1_SST;
       
  1503         if (val & LSI_SCNTL1_IARB) {
       
  1504             BADF("Immediate Arbritration not implemented\n");
       
  1505         }
       
  1506         if (val & LSI_SCNTL1_RST) {
       
  1507             s->sstat0 |= LSI_SSTAT0_RST;
       
  1508             lsi_script_scsi_interrupt(s, LSI_SIST0_RST, 0);
       
  1509         } else {
       
  1510             s->sstat0 &= ~LSI_SSTAT0_RST;
       
  1511         }
       
  1512         break;
       
  1513     case 0x02: /* SCNTL2 */
       
  1514         val &= ~(LSI_SCNTL2_WSR | LSI_SCNTL2_WSS);
       
  1515         s->scntl2 = val;
       
  1516         break;
       
  1517     case 0x03: /* SCNTL3 */
       
  1518         s->scntl3 = val;
       
  1519         break;
       
  1520     case 0x04: /* SCID */
       
  1521         s->scid = val;
       
  1522         break;
       
  1523     case 0x05: /* SXFER */
       
  1524         s->sxfer = val;
       
  1525         break;
       
  1526     case 0x06: /* SDID */
       
  1527         if ((val & 0xf) != (s->ssid & 0xf))
       
  1528             BADF("Destination ID does not match SSID\n");
       
  1529         s->sdid = val & 0xf;
       
  1530         break;
       
  1531     case 0x07: /* GPREG0 */
       
  1532         break;
       
  1533     case 0x08: /* SFBR */
       
  1534         /* The CPU is not allowed to write to this register.  However the
       
  1535            SCRIPTS register move instructions are.  */
       
  1536         s->sfbr = val;
       
  1537         break;
       
  1538     case 0x0a: case 0x0b: 
       
  1539         /* Openserver writes to these readonly registers on startup */
       
  1540 	return;    
       
  1541     case 0x0c: case 0x0d: case 0x0e: case 0x0f:
       
  1542         /* Linux writes to these readonly registers on startup.  */
       
  1543         return;
       
  1544     CASE_SET_REG32(dsa, 0x10)
       
  1545     case 0x14: /* ISTAT0 */
       
  1546         s->istat0 = (s->istat0 & 0x0f) | (val & 0xf0);
       
  1547         if (val & LSI_ISTAT0_ABRT) {
       
  1548             lsi_script_dma_interrupt(s, LSI_DSTAT_ABRT);
       
  1549         }
       
  1550         if (val & LSI_ISTAT0_INTF) {
       
  1551             s->istat0 &= ~LSI_ISTAT0_INTF;
       
  1552             lsi_update_irq(s);
       
  1553         }
       
  1554         if (s->waiting == 1 && val & LSI_ISTAT0_SIGP) {
       
  1555             DPRINTF("Woken by SIGP\n");
       
  1556             s->waiting = 0;
       
  1557             s->dsp = s->dnad;
       
  1558             lsi_execute_script(s);
       
  1559         }
       
  1560         if (val & LSI_ISTAT0_SRST) {
       
  1561             lsi_soft_reset(s);
       
  1562         }
       
  1563         break;
       
  1564     case 0x16: /* MBOX0 */
       
  1565         s->mbox0 = val;
       
  1566         break;
       
  1567     case 0x17: /* MBOX1 */
       
  1568         s->mbox1 = val;
       
  1569         break;
       
  1570     case 0x1a: /* CTEST2 */
       
  1571 	s->ctest2 = val & LSI_CTEST2_PCICIE;
       
  1572 	break;
       
  1573     case 0x1b: /* CTEST3 */
       
  1574         s->ctest3 = val & 0x0f;
       
  1575         break;
       
  1576     CASE_SET_REG32(temp, 0x1c)
       
  1577     case 0x21: /* CTEST4 */
       
  1578         if (val & 7) {
       
  1579            BADF("Unimplemented CTEST4-FBL 0x%x\n", val);
       
  1580         }
       
  1581         s->ctest4 = val;
       
  1582         break;
       
  1583     case 0x22: /* CTEST5 */
       
  1584         if (val & (LSI_CTEST5_ADCK | LSI_CTEST5_BBCK)) {
       
  1585             BADF("CTEST5 DMA increment not implemented\n");
       
  1586         }
       
  1587         s->ctest5 = val;
       
  1588         break;
       
  1589     case 0x2c: /* DSP[0:7] */
       
  1590         s->dsp &= 0xffffff00;
       
  1591         s->dsp |= val;
       
  1592         break;
       
  1593     case 0x2d: /* DSP[8:15] */
       
  1594         s->dsp &= 0xffff00ff;
       
  1595         s->dsp |= val << 8;
       
  1596         break;
       
  1597     case 0x2e: /* DSP[16:23] */
       
  1598         s->dsp &= 0xff00ffff;
       
  1599         s->dsp |= val << 16;
       
  1600         break;
       
  1601     case 0x2f: /* DSP[24:31] */
       
  1602         s->dsp &= 0x00ffffff;
       
  1603         s->dsp |= val << 24;
       
  1604         if ((s->dmode & LSI_DMODE_MAN) == 0
       
  1605             && (s->istat1 & LSI_ISTAT1_SRUN) == 0)
       
  1606             lsi_execute_script(s);
       
  1607         break;
       
  1608     CASE_SET_REG32(dsps, 0x30)
       
  1609     CASE_SET_REG32(scratch[0], 0x34)
       
  1610     case 0x38: /* DMODE */
       
  1611         if (val & (LSI_DMODE_SIOM | LSI_DMODE_DIOM)) {
       
  1612             BADF("IO mappings not implemented\n");
       
  1613         }
       
  1614         s->dmode = val;
       
  1615         break;
       
  1616     case 0x39: /* DIEN */
       
  1617         s->dien = val;
       
  1618         lsi_update_irq(s);
       
  1619         break;
       
  1620     case 0x3b: /* DCNTL */
       
  1621         s->dcntl = val & ~(LSI_DCNTL_PFF | LSI_DCNTL_STD);
       
  1622         if ((val & LSI_DCNTL_STD) && (s->istat1 & LSI_ISTAT1_SRUN) == 0)
       
  1623             lsi_execute_script(s);
       
  1624         break;
       
  1625     case 0x40: /* SIEN0 */
       
  1626         s->sien0 = val;
       
  1627         lsi_update_irq(s);
       
  1628         break;
       
  1629     case 0x41: /* SIEN1 */
       
  1630         s->sien1 = val;
       
  1631         lsi_update_irq(s);
       
  1632         break;
       
  1633     case 0x47: /* GPCNTL0 */
       
  1634         break;
       
  1635     case 0x48: /* STIME0 */
       
  1636         s->stime0 = val;
       
  1637         break;
       
  1638     case 0x49: /* STIME1 */
       
  1639         if (val & 0xf) {
       
  1640             DPRINTF("General purpose timer not implemented\n");
       
  1641             /* ??? Raising the interrupt immediately seems to be sufficient
       
  1642                to keep the FreeBSD driver happy.  */
       
  1643             lsi_script_scsi_interrupt(s, 0, LSI_SIST1_GEN);
       
  1644         }
       
  1645         break;
       
  1646     case 0x4a: /* RESPID0 */
       
  1647         s->respid0 = val;
       
  1648         break;
       
  1649     case 0x4b: /* RESPID1 */
       
  1650         s->respid1 = val;
       
  1651         break;
       
  1652     case 0x4d: /* STEST1 */
       
  1653         s->stest1 = val;
       
  1654         break;
       
  1655     case 0x4e: /* STEST2 */
       
  1656         if (val & 1) {
       
  1657             BADF("Low level mode not implemented\n");
       
  1658         }
       
  1659         s->stest2 = val;
       
  1660         break;
       
  1661     case 0x4f: /* STEST3 */
       
  1662         if (val & 0x41) {
       
  1663             BADF("SCSI FIFO test mode not implemented\n");
       
  1664         }
       
  1665         s->stest3 = val;
       
  1666         break;
       
  1667     case 0x56: /* CCNTL0 */
       
  1668         s->ccntl0 = val;
       
  1669         break;
       
  1670     case 0x57: /* CCNTL1 */
       
  1671         s->ccntl1 = val;
       
  1672         break;
       
  1673     CASE_SET_REG32(mmrs, 0xa0)
       
  1674     CASE_SET_REG32(mmws, 0xa4)
       
  1675     CASE_SET_REG32(sfs, 0xa8)
       
  1676     CASE_SET_REG32(drs, 0xac)
       
  1677     CASE_SET_REG32(sbms, 0xb0)
       
  1678     CASE_SET_REG32(dbms, 0xb4)
       
  1679     CASE_SET_REG32(dnad64, 0xb8)
       
  1680     CASE_SET_REG32(pmjad1, 0xc0)
       
  1681     CASE_SET_REG32(pmjad2, 0xc4)
       
  1682     CASE_SET_REG32(rbc, 0xc8)
       
  1683     CASE_SET_REG32(ua, 0xcc)
       
  1684     CASE_SET_REG32(ia, 0xd4)
       
  1685     CASE_SET_REG32(sbc, 0xd8)
       
  1686     CASE_SET_REG32(csbc, 0xdc)
       
  1687     default:
       
  1688         if (offset >= 0x5c && offset < 0xa0) {
       
  1689             int n;
       
  1690             int shift;
       
  1691             n = (offset - 0x58) >> 2;
       
  1692             shift = (offset & 3) * 8;
       
  1693             s->scratch[n] &= ~(0xff << shift);
       
  1694             s->scratch[n] |= (val & 0xff) << shift;
       
  1695         } else {
       
  1696             BADF("Unhandled writeb 0x%x = 0x%x\n", offset, val);
       
  1697         }
       
  1698     }
       
  1699 #undef CASE_SET_REG32
       
  1700 }
       
  1701 
       
  1702 static void lsi_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
       
  1703 {
       
  1704     LSIState *s = (LSIState *)opaque;
       
  1705 
       
  1706     lsi_reg_writeb(s, addr & 0xff, val);
       
  1707 }
       
  1708 
       
  1709 static void lsi_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
       
  1710 {
       
  1711     LSIState *s = (LSIState *)opaque;
       
  1712 
       
  1713     addr &= 0xff;
       
  1714     lsi_reg_writeb(s, addr, val & 0xff);
       
  1715     lsi_reg_writeb(s, addr + 1, (val >> 8) & 0xff);
       
  1716 }
       
  1717 
       
  1718 static void lsi_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
       
  1719 {
       
  1720     LSIState *s = (LSIState *)opaque;
       
  1721 
       
  1722     addr &= 0xff;
       
  1723     lsi_reg_writeb(s, addr, val & 0xff);
       
  1724     lsi_reg_writeb(s, addr + 1, (val >> 8) & 0xff);
       
  1725     lsi_reg_writeb(s, addr + 2, (val >> 16) & 0xff);
       
  1726     lsi_reg_writeb(s, addr + 3, (val >> 24) & 0xff);
       
  1727 }
       
  1728 
       
  1729 static uint32_t lsi_mmio_readb(void *opaque, target_phys_addr_t addr)
       
  1730 {
       
  1731     LSIState *s = (LSIState *)opaque;
       
  1732 
       
  1733     return lsi_reg_readb(s, addr & 0xff);
       
  1734 }
       
  1735 
       
  1736 static uint32_t lsi_mmio_readw(void *opaque, target_phys_addr_t addr)
       
  1737 {
       
  1738     LSIState *s = (LSIState *)opaque;
       
  1739     uint32_t val;
       
  1740 
       
  1741     addr &= 0xff;
       
  1742     val = lsi_reg_readb(s, addr);
       
  1743     val |= lsi_reg_readb(s, addr + 1) << 8;
       
  1744     return val;
       
  1745 }
       
  1746 
       
  1747 static uint32_t lsi_mmio_readl(void *opaque, target_phys_addr_t addr)
       
  1748 {
       
  1749     LSIState *s = (LSIState *)opaque;
       
  1750     uint32_t val;
       
  1751     addr &= 0xff;
       
  1752     val = lsi_reg_readb(s, addr);
       
  1753     val |= lsi_reg_readb(s, addr + 1) << 8;
       
  1754     val |= lsi_reg_readb(s, addr + 2) << 16;
       
  1755     val |= lsi_reg_readb(s, addr + 3) << 24;
       
  1756     return val;
       
  1757 }
       
  1758 
       
  1759 static CPUReadMemoryFunc *lsi_mmio_readfn[3] = {
       
  1760     lsi_mmio_readb,
       
  1761     lsi_mmio_readw,
       
  1762     lsi_mmio_readl,
       
  1763 };
       
  1764 
       
  1765 static CPUWriteMemoryFunc *lsi_mmio_writefn[3] = {
       
  1766     lsi_mmio_writeb,
       
  1767     lsi_mmio_writew,
       
  1768     lsi_mmio_writel,
       
  1769 };
       
  1770 
       
  1771 static void lsi_ram_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
       
  1772 {
       
  1773     LSIState *s = (LSIState *)opaque;
       
  1774     uint32_t newval;
       
  1775     int shift;
       
  1776 
       
  1777     addr &= 0x1fff;
       
  1778     newval = s->script_ram[addr >> 2];
       
  1779     shift = (addr & 3) * 8;
       
  1780     newval &= ~(0xff << shift);
       
  1781     newval |= val << shift;
       
  1782     s->script_ram[addr >> 2] = newval;
       
  1783 }
       
  1784 
       
  1785 static void lsi_ram_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
       
  1786 {
       
  1787     LSIState *s = (LSIState *)opaque;
       
  1788     uint32_t newval;
       
  1789 
       
  1790     addr &= 0x1fff;
       
  1791     newval = s->script_ram[addr >> 2];
       
  1792     if (addr & 2) {
       
  1793         newval = (newval & 0xffff) | (val << 16);
       
  1794     } else {
       
  1795         newval = (newval & 0xffff0000) | val;
       
  1796     }
       
  1797     s->script_ram[addr >> 2] = newval;
       
  1798 }
       
  1799 
       
  1800 
       
  1801 static void lsi_ram_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
       
  1802 {
       
  1803     LSIState *s = (LSIState *)opaque;
       
  1804 
       
  1805     addr &= 0x1fff;
       
  1806     s->script_ram[addr >> 2] = val;
       
  1807 }
       
  1808 
       
  1809 static uint32_t lsi_ram_readb(void *opaque, target_phys_addr_t addr)
       
  1810 {
       
  1811     LSIState *s = (LSIState *)opaque;
       
  1812     uint32_t val;
       
  1813 
       
  1814     addr &= 0x1fff;
       
  1815     val = s->script_ram[addr >> 2];
       
  1816     val >>= (addr & 3) * 8;
       
  1817     return val & 0xff;
       
  1818 }
       
  1819 
       
  1820 static uint32_t lsi_ram_readw(void *opaque, target_phys_addr_t addr)
       
  1821 {
       
  1822     LSIState *s = (LSIState *)opaque;
       
  1823     uint32_t val;
       
  1824 
       
  1825     addr &= 0x1fff;
       
  1826     val = s->script_ram[addr >> 2];
       
  1827     if (addr & 2)
       
  1828         val >>= 16;
       
  1829     return le16_to_cpu(val);
       
  1830 }
       
  1831 
       
  1832 static uint32_t lsi_ram_readl(void *opaque, target_phys_addr_t addr)
       
  1833 {
       
  1834     LSIState *s = (LSIState *)opaque;
       
  1835 
       
  1836     addr &= 0x1fff;
       
  1837     return le32_to_cpu(s->script_ram[addr >> 2]);
       
  1838 }
       
  1839 
       
  1840 static CPUReadMemoryFunc *lsi_ram_readfn[3] = {
       
  1841     lsi_ram_readb,
       
  1842     lsi_ram_readw,
       
  1843     lsi_ram_readl,
       
  1844 };
       
  1845 
       
  1846 static CPUWriteMemoryFunc *lsi_ram_writefn[3] = {
       
  1847     lsi_ram_writeb,
       
  1848     lsi_ram_writew,
       
  1849     lsi_ram_writel,
       
  1850 };
       
  1851 
       
  1852 static uint32_t lsi_io_readb(void *opaque, uint32_t addr)
       
  1853 {
       
  1854     LSIState *s = (LSIState *)opaque;
       
  1855     return lsi_reg_readb(s, addr & 0xff);
       
  1856 }
       
  1857 
       
  1858 static uint32_t lsi_io_readw(void *opaque, uint32_t addr)
       
  1859 {
       
  1860     LSIState *s = (LSIState *)opaque;
       
  1861     uint32_t val;
       
  1862     addr &= 0xff;
       
  1863     val = lsi_reg_readb(s, addr);
       
  1864     val |= lsi_reg_readb(s, addr + 1) << 8;
       
  1865     return val;
       
  1866 }
       
  1867 
       
  1868 static uint32_t lsi_io_readl(void *opaque, uint32_t addr)
       
  1869 {
       
  1870     LSIState *s = (LSIState *)opaque;
       
  1871     uint32_t val;
       
  1872     addr &= 0xff;
       
  1873     val = lsi_reg_readb(s, addr);
       
  1874     val |= lsi_reg_readb(s, addr + 1) << 8;
       
  1875     val |= lsi_reg_readb(s, addr + 2) << 16;
       
  1876     val |= lsi_reg_readb(s, addr + 3) << 24;
       
  1877     return val;
       
  1878 }
       
  1879 
       
  1880 static void lsi_io_writeb(void *opaque, uint32_t addr, uint32_t val)
       
  1881 {
       
  1882     LSIState *s = (LSIState *)opaque;
       
  1883     lsi_reg_writeb(s, addr & 0xff, val);
       
  1884 }
       
  1885 
       
  1886 static void lsi_io_writew(void *opaque, uint32_t addr, uint32_t val)
       
  1887 {
       
  1888     LSIState *s = (LSIState *)opaque;
       
  1889     addr &= 0xff;
       
  1890     lsi_reg_writeb(s, addr, val & 0xff);
       
  1891     lsi_reg_writeb(s, addr + 1, (val >> 8) & 0xff);
       
  1892 }
       
  1893 
       
  1894 static void lsi_io_writel(void *opaque, uint32_t addr, uint32_t val)
       
  1895 {
       
  1896     LSIState *s = (LSIState *)opaque;
       
  1897     addr &= 0xff;
       
  1898     lsi_reg_writeb(s, addr, val & 0xff);
       
  1899     lsi_reg_writeb(s, addr + 1, (val >> 8) & 0xff);
       
  1900     lsi_reg_writeb(s, addr + 2, (val >> 16) & 0xff);
       
  1901     lsi_reg_writeb(s, addr + 3, (val >> 24) & 0xff);
       
  1902 }
       
  1903 
       
  1904 static void lsi_io_mapfunc(PCIDevice *pci_dev, int region_num,
       
  1905                            uint32_t addr, uint32_t size, int type)
       
  1906 {
       
  1907     LSIState *s = (LSIState *)pci_dev;
       
  1908 
       
  1909     DPRINTF("Mapping IO at %08x\n", addr);
       
  1910 
       
  1911     register_ioport_write(addr, 256, 1, lsi_io_writeb, s);
       
  1912     register_ioport_read(addr, 256, 1, lsi_io_readb, s);
       
  1913     register_ioport_write(addr, 256, 2, lsi_io_writew, s);
       
  1914     register_ioport_read(addr, 256, 2, lsi_io_readw, s);
       
  1915     register_ioport_write(addr, 256, 4, lsi_io_writel, s);
       
  1916     register_ioport_read(addr, 256, 4, lsi_io_readl, s);
       
  1917 }
       
  1918 
       
  1919 static void lsi_ram_mapfunc(PCIDevice *pci_dev, int region_num,
       
  1920                             uint32_t addr, uint32_t size, int type)
       
  1921 {
       
  1922     LSIState *s = (LSIState *)pci_dev;
       
  1923 
       
  1924     DPRINTF("Mapping ram at %08x\n", addr);
       
  1925     s->script_ram_base = addr;
       
  1926     cpu_register_physical_memory(addr + 0, 0x2000, s->ram_io_addr);
       
  1927 }
       
  1928 
       
  1929 static void lsi_mmio_mapfunc(PCIDevice *pci_dev, int region_num,
       
  1930                              uint32_t addr, uint32_t size, int type)
       
  1931 {
       
  1932     LSIState *s = (LSIState *)pci_dev;
       
  1933 
       
  1934     DPRINTF("Mapping registers at %08x\n", addr);
       
  1935     cpu_register_physical_memory(addr + 0, 0x400, s->mmio_io_addr);
       
  1936 }
       
  1937 
       
  1938 void lsi_scsi_attach(void *opaque, BlockDriverState *bd, int id)
       
  1939 {
       
  1940     LSIState *s = (LSIState *)opaque;
       
  1941 
       
  1942     if (id < 0) {
       
  1943         for (id = 0; id < LSI_MAX_DEVS; id++) {
       
  1944             if (s->scsi_dev[id] == NULL)
       
  1945                 break;
       
  1946         }
       
  1947     }
       
  1948     if (id >= LSI_MAX_DEVS) {
       
  1949         BADF("Bad Device ID %d\n", id);
       
  1950         return;
       
  1951     }
       
  1952     if (s->scsi_dev[id]) {
       
  1953         DPRINTF("Destroying device %d\n", id);
       
  1954         s->scsi_dev[id]->destroy(s->scsi_dev[id]);
       
  1955     }
       
  1956     DPRINTF("Attaching block device %d\n", id);
       
  1957     s->scsi_dev[id] = scsi_generic_init(bd, 1, lsi_command_complete, s);
       
  1958     if (s->scsi_dev[id] == NULL)
       
  1959         s->scsi_dev[id] = scsi_disk_init(bd, 1, lsi_command_complete, s);
       
  1960 }
       
  1961 
       
  1962 void *lsi_scsi_init(PCIBus *bus, int devfn)
       
  1963 {
       
  1964     LSIState *s;
       
  1965 
       
  1966     s = (LSIState *)pci_register_device(bus, "LSI53C895A SCSI HBA",
       
  1967                                         sizeof(*s), devfn, NULL, NULL);
       
  1968     if (s == NULL) {
       
  1969         fprintf(stderr, "lsi-scsi: Failed to register PCI device\n");
       
  1970         return NULL;
       
  1971     }
       
  1972 
       
  1973     /* PCI Vendor ID (word) */
       
  1974     s->pci_dev.config[0x00] = 0x00;
       
  1975     s->pci_dev.config[0x01] = 0x10;
       
  1976     /* PCI device ID (word) */
       
  1977     s->pci_dev.config[0x02] = 0x12;
       
  1978     s->pci_dev.config[0x03] = 0x00;
       
  1979     /* PCI base class code */
       
  1980     s->pci_dev.config[0x0b] = 0x01;
       
  1981     /* PCI subsystem ID */
       
  1982     s->pci_dev.config[0x2e] = 0x00;
       
  1983     s->pci_dev.config[0x2f] = 0x10;
       
  1984     /* PCI latency timer = 255 */
       
  1985     s->pci_dev.config[0x0d] = 0xff;
       
  1986     /* Interrupt pin 1 */
       
  1987     s->pci_dev.config[0x3d] = 0x01;
       
  1988 
       
  1989     s->mmio_io_addr = cpu_register_io_memory(0, lsi_mmio_readfn,
       
  1990                                              lsi_mmio_writefn, s);
       
  1991     s->ram_io_addr = cpu_register_io_memory(0, lsi_ram_readfn,
       
  1992                                             lsi_ram_writefn, s);
       
  1993 
       
  1994     pci_register_io_region((struct PCIDevice *)s, 0, 256,
       
  1995                            PCI_ADDRESS_SPACE_IO, lsi_io_mapfunc);
       
  1996     pci_register_io_region((struct PCIDevice *)s, 1, 0x400,
       
  1997                            PCI_ADDRESS_SPACE_MEM, lsi_mmio_mapfunc);
       
  1998     pci_register_io_region((struct PCIDevice *)s, 2, 0x2000,
       
  1999                            PCI_ADDRESS_SPACE_MEM, lsi_ram_mapfunc);
       
  2000     s->queue = qemu_malloc(sizeof(lsi_queue));
       
  2001     s->queue_len = 1;
       
  2002     s->active_commands = 0;
       
  2003 
       
  2004     lsi_soft_reset(s);
       
  2005 
       
  2006     return s;
       
  2007 }